↑↑↑

↓↓↓
Flag of Russia Flag of UK
🏠 | 💻 PC | Coding |

C

C Python

Прежде чем начать программировать полезным будет найти и прочитать книгу об операционной системе в которой вы хотите это делать.

Например, полезно знать о системной переменной PATH.

Для новичков вроде меня очень удивительным может показаться преобразование чисел. Предположим вы ввели 9. И хотите чтобы её вам и напечатали. А получаете в ответ 57.

Чтобы разобраться в этом вопросе - нужно открыть таблицу символов ASCII - ссылка и найти в ней 9ку. Ей соответствует 16-тиричное число 39. Чтобы выдать вам результат компьютер преобразует 39 в десятичный вид по формуле x = 3*16 + 9*1 = 57

Читаю книгу Кернигана и Ричи.

Стр. 29

#include<stdio.h>
#define LOWER 0
#define UPPER 300
#define STEP 20
main()
/*Именованные константы*/
{
int fahr, fahr1;
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
printf("[5d %10f.1\n", fahr, 5.0/9.0*(fahr-32.0));
}

Если не поставить .0 после 32 мой антивирус avast пишет об угрозе.
Тоже самое происходит и со всеми предыдущими примерами, в которых
используется for

Страница 34, параграф 1.5.3 Подсчёт строк.

if (c == '\n')

а не какой-то загадочный V


Страница 35, упражнение 1.8. Нужно написать программу для подсчёта табуляций, пробелов и новых строк.

Я написал два варианта. Один работает правильно.

#include<stdio.h>
/*подсчет пробелов, табуляци и новых строк входного потока*/
main()
{
int c, nl;
nl = 0;
while ((c=getchar()) !=EOF)
if (c=='\n')
++nl;
else if (c=='\t')
++nl;
else if (c==' ')
++nl;
printf("[d\n", nl);
}


Второй считает всё подряд.



#include<stdio.h>
/*подсчет пробелов, табуляци и новых строк входного потока*/
main()
{
int c, nl;
nl = 0;
while ((c=getchar()) !=EOF)
if (c=='\n','\t',' ')
++nl;
printf("[d\n", nl);
}

Синий говорит, что условие if здесь всегда TRUE.
Последний символ в условии if (c=='\n','\t',' ') рассматривается компиллятором как логический.
В ASCII значение пробела это 20. 20 > 0, всё, что больше нуля считается за TRUE, т.е. любо символ даёт вклад в сумму.
Я проверил, если там поставить просто ноль, то ничего выводится не будет. Ноль это FALSE.

Решения упражнений из книги Б. Кернигана и Д. Ричи
"Язык программирования Си"

Это мои решения, на 99% поэтому они могут быть довольно кривыми.

Нашел сайт, где также выложены решения.

1.15

#include <stdio.h>
float ffahr(int c);

main()
{
int cel,i;

for (i =0;i<20; ++i){
cel = i*10;
printf("[d %f\n", cel, ffahr(cel));
}
return 0;
}

float ffahr(int c)
{
float fahr;

fahr = (9.0/5.0)*c + 32.0;

return fahr;
}

1.17

#include <stdio.h>
#define MAXLINE 1000 /* максимальная длина строки в потоке */

int fgetline(char line[],int maxline);
void copy(char to[], char from[]);
/*вывод самой длинной строки в потоке */
main()
{
int len;/* длина текущей строки */
int max;/* текущая максимальная длина */
char line[MAXLINE]; /* текущая максимальная длина */
char longest [MAXLINE]; /* самая длинная строка из введенных */
char more50 [MAXLINE];
char more51 [MAXLINE];
char more52 [MAXLINE];
char more53 [MAXLINE];
char more54 [MAXLINE];
char more55 [MAXLINE];
char more56 [MAXLINE];
int j,i;
j =0;
max = 0;
while ((len = fgetline(line, MAXLINE)) > 0 ){

/* if (len > max) {
max = len;
copy(longest, line); */

/*if (max > 0) /* была непустая строка */
/*printf("[s", longest);
return 0;*/

if (len >= 5 ) {

copy(more5j, line);
++j;
}
}
printf("[s", more5);

}

/* getline: считывает строку в s, возвращает её длину */
int fgetline(char s[], int lim)
{
int c,i;

for (i = 0; i<lim-1 && (c=getchar()) !=EOF && c!='\n';++i)
s[i] = c;
if (c =='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;

}

/* copy: копирует строку 'from' в 'to'; длина to считается достаточной */

void copy(char to[], char from[])
{
int i;
i=0;
while((to[i] = from[i]) !='\0')
++i;

}

1.18

#include <stdio.h>
#define MAXLINE 1000
int fgetline(char line[], int maxline);
void reverse(char to[], char from[]);

main()
{
int c,i,j,max,len,k;
i=0;
j=2;
char line [MAXLINE];

/*while ((len = fgetline(line, MAXLINE))>1){*/

len = fgetline(line, MAXLINE);
while (line[len-j] ==' ' || line[len-j]=='\t')
++j;
for (k=0;k<=len-j;++k)
printf("[c", line[k]);
printf("[c\n", '\t');
}
/*printf("[c\n", line[len-2]);*/
int fgetline(char s[], int lim)
{
int c, i;
for (i=0; i< lim-1 && (c = getchar()) !=EOF && c !='\n';++i )
s[i] =c;
if (c=='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

1.19

#include <stdio.h>
#define MAXLINE 1000

void reverse(char to[], char from[]);
main()
{
int c,i,j,max;
i=0;
char line [MAXLINE];
char revline [MAXLINE];
while ((c=getchar())!=EOF && c!='\n') {
line[i] = c;
++i;
}
max=i;
for (j=0;j<=max;++j){
revline[j]=line[i];
--i;
}
printf("[s\n",revline);
printf("[s\n",line);
return 0;
}

1.20

#include <stdio.h>
main()
{
int c,i,j;
i=0;
while((c=getchar())!=EOF){
if(c!='\t'&& c!='\n'){
++i;
//printf("[d",i);
if(i==8){
i=0;}
printf("[c",c);
}
if(c=='\t'){
for (j=0;j<8-i;++j){
printf("[c",' ');}
i=0;
}
else if(c=='\n'){
printf("\n","new line");
i=0;}
/*else
printf("[c",c);*/
}
printf("\n");
}

1.22

#include <stdio.h>
#define lim 10
#define maxline 50
main()
{
int c,i,j,start,start2,len,len2,len3;
int line[maxline];
int line2[maxline];
start=0;
len3=0;
for(i=0;i<maxline;++i){
line[i]=('A');
}
i=0;
while((c=getchar())!=EOF && i<maxline){
if(c!='\n'){
line[i]=c;
++i;}
else {;}
}
/* commentr
rii
1234
*/
len=i;
for(start=0;start<(maxline-9);start +=len3){

for(j=(start+9);j>(start+0);--j){
if (line[j]==' '){
len2=j;
j=0;
}
else {
len2= start + 9;
}}
for(i=start;i<=len2;++i)
{
printf("[c",line[i]);
}
printf("\n");
//printf("[d",start);
len3=(len2-start+1);
}

1.23

#include <stdio.h>
#define lim 10
#define maxline 5000
main()
{
int c,i,i1,j,j1,j2,len;
int line[maxline];
int line2[maxline];
len=0;
j=j1=j2=0;
while((c=getchar())!=EOF){
++i;
line[i]=c;
}
for(j=0;j<=i;++j){

if(line[j]=='/'){
j1=j+1;
if(line[j1]=='/'){
for(j=j;j < i && line[j]!='\n';++j)
++len;
}

else if(line[j1]=='*'){
j2=j;

for(j2=j;j2<i;++j2)
{
if(line[j2]!='*'){
++len;
++j;}
else if(line[j2]=='*'){
j1=j2+1;
if(line[j1]!='/'){
++len;
++j;
}
else {
++j;
j2=i;}
}
}
}
else
line2[j-len]=line[j];
}
else
line2[j-len]=line[j];
// dljkflkdjfl;kjsdlkf;klsdjfj;sdljf;klsdjfk;ljsdk;flj;sdlkjfkl;sjdfl;ksjdflk;js;dlkfj;klf9
}

printf("Old");
printf("\n");
for(i1=0;i1<=i;++i1){
printf("[c",line[i1]);
}
printf("\n");

printf("New");

printf("\n");
for(i1=0;i1<=i;++i1){
printf("[c",line2[i1]);
}
printf("\n");

/*
dflkdsjflkj
dsjklfjkd
lkjdlfjk
*/

return 0;
}
//printf("[c", line[j]);
printf("\n");
return 0;
}

1.24

#include<stdio.h>
#define maxline 5000
main()
{
int c,i,j,j1,j2;
int round; //проверка круглых скобок
int fig; //figure
int quad;
int line[maxline];
i=round=fig=quad=0;
while((c=getchar())!=EOF)
{
line[i]=c;
++i;
}

for(j=0;j < i;++j)
{
if(line[j]=='/'){
j1=j+1;
if(line[j1]=='/'){
for(j=j;j < i && line[j]!='\n';++j){
}
}
else if(line[j1]=='*'){
for(j2=j;j2 < i;++j2,++j){

if(line[j]=='*'){
j1=j+1;
if(line[j1]=='/'){
++j;
j2=i;
}
}
}
}
}

else if (line[j]=='('){
++round;
}
else if (line[j]==')'){
--round;
}
else if (line[j]=='{'){
++fig;
}
else if (line[j]=='}'){
--fig;
}
}

if(round == 0){
printf("round ok");
}
else if(round > 0){
printf("round mistake to many (");
}
else if(round < 0){
printf("round mistake not enought (");
}
printf("\n");
if(fig == 0){
printf("fig ok");
} else if(fig > 0){
printf("fig mistake to many {");
}
else if(fig < 0){
printf("fig mistake not enought {");
}
printf("\n");
return 0;
}

2.1

#include <stdio.h>
#include <limits.h>
#include <float.h>

/* Когда прочитал задания слегка выпал в осадок. Как имея знания на уровне первой главы К и Р
(из которой я сделал сам все упражнения) понять каким образом можно обратиться к файлам. Синий
сказал, что заголовочные файлы (на инопланетном - headers) лежат в папке /usr/includes */
int main()
{

return 0;
}




Долго мучался с примером 1.9. Нужно было написать программу, которая выводит то, что вводится с клавиатуры, при этом игнорируя все пробелы, кроме самых первых.

#include<stdio.h>
main()
{
int c, c1;
c1 == 0;
while ((c=getchar()) !=EOF){
if (c==' ')
++c1;
else
c1 = 0;
if (c1 <=1)
putchar(c) ;
else
{
;
c1 = 1;
}
}
}




Share in social media: