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

Введение

Если после компиляции у Вас появляется файл 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 на Си
Оператор «стрелка» указатель на член структуры

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: