Решение задач из учебника Керниган и Ричи
Введение
Если после компиляции у Вас появляется файл 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;
}
}
}