Решение задач из учебника Керниган и Ричи

Введение

Если после компиляции у Вас появляется файл a.out и Вы не знаете, что с ним делать попробуйте:

./a.out

Стр. 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;
}
}
}

Похожие статьи
Основы Си
Учебник по Си
Boolean в Си
Сокеты в Си
К и Р
Что такое argc, char * argv[]
Функция scanf()
Указатели
Структуры в Си
Запросы к REST API на Си
Оператор «стрелка» указатель на член структуры