【C程序设计语言】第一章-导言 | 练习

    xiaoxiao2025-04-15  5

    练习1-3 修改温度转换程序,使之能在转换表的顶部打印一个标题

    #include <stdio.h> main() { float c, h; h = 0; printf("摄氏度-华氏度 对比表\n"); for(c=100 ; c>=0 ; c=c-20){ h = 9.0 / 5.0 * c + 32; printf("%3.0f %6.1f\n", c, h); } }

    练习1-6 验证表达式getchar() != EOF 的值是0还是1

    #include <stdio.h> main(){ int c ; while(c = getchar() != EOF){ printf("%d\n", c); } printf("%d - at EOF\n", c); }

    练习1-7 编写一个打印EOF值的程序

    #include <stdio.h> main(){ printf("EOF is %d\n", EOF); }

    练习1-8 编写一个统计空格、制表符与换行符个数的程序

    #include <stdio.h> main() { int s, t, n, c; s= t= n= 0; while((c=getchar())!=EOF){ if(c==' ') s++; else if(c=='\t') t++; else if(c=='\n') n++; } printf("空格:%d\n制表符:%d\n换行符:%d\n", s, t, n); }

    练习1-9 编写一个将输入复制到输入的程序,并将其中连续的多个空格用一个空格代替

    #include <stdio.h> #define NONBLANK 'a' main() { int c, lastc; lastc = NONBLANK; while ((c = getchar()) != EOF){ if(c!=' ' || lastc!=' ') putchar(c); lastc = c; } } /* 原答案 #include <stdio.h> main() { int c ; bool flag = false; while((c=getchar())!=EOF){ if(c==' '&&flag) continue; if(c==' ') flag = true; else flag = false; putchar(c); } } */

    练习1-10 编写一个将输入复制到输入的程序,并将其中的制表符用\t,把回退符替换为\b,把反斜杠替换为\

    #include<stdio.h> main() { int c; while((c=getchar())!=EOF){ if(c=='\t') printf("\\t"); else if(c=='\n') printf("\\n"); else if(c=='\b')\\ printf("\\b"); else if(c=='\\'){ printf("\\\\"); }else putchar(c); } }

    练习1-12 编写一个程序,以每行一个单词的形式打印其输入

    #include <stdio.h> #define IN 1 #define OUT 0 main() { int c, state; state = OUT; while((c = getchar()) != EOF){ if(c == ' ' || c == '\t' || c == '\n'){ if(state == IN){ putchar('\n'); state = OUT; } }else{ state = IN; putchar(c); } } }

    练习1-13(1) 编写一个程序打印输入中单词长度的水平直方图

    #include <stdio.h> #define MAXHIST 15 //直方图(histogram)的最大长度 #define MAXWORD 11 //单个单词的最大长度 #define IN 1 #define OUT 0 // hrizontal print main() { int c, i, nc, state; int len; int maxvalue; int ovflow; //长度超过MAXWORD的单词数 int wl[MAXWORD]; //单词长度计数器 state = OUT; nc = 0; ovflow = 0; for(i=0 ; i<MAXWORD ; ++i) wl[i] = 0; while((c=getchar())!=EOF){ //nc是当前单词的长度 if(c==' ' || c=='\n' || c=='\t'){ state = OUT; if(nc>0) if(nc<MAXWORD) ++wl[nc]; else ++ovflow; nc = 0; }else if(state == OUT){ state = IN; nc = 1; }else ++nc; } maxvalue = 0; for(i=1 ; i<MAXWORD ; ++i) if(wl[i] > maxvalue) maxvalue = wl[i]; for(i=1 ; i<MAXWORD ; ++i){ //打印出各长度及其数量,显示在直方图的最左边 printf("%2d - %3d : ", i, wl[i]); if(wl[i] > 0){ if((len = wl[i] * MAXHIST / maxvalue) <= 0) len = 1; //注意if条件中包含了len的一种赋值情况 }else len = 0; while(len > 0){ //按公式求出的len即为每个长度的*数量 putchar('*'); --len; } putchar('\n'); } if(ovflow > 0) printf("There are %d words >= %d\n", ovflow, MAXWORD); }

    练习1-13(2) 编写一个程序打印输入中单词长度的垂直直方图

    #include <stdio.h> #define MAXHIST 15 #define MAXWORD 11 #define IN 1 #define OUT 0 //vertical print main() { int c, i, j, nc, state; int len; int maxvalue; int ovflow; int wl[MAXWORD]; char sp = ' '; char x = '*'; state = OUT; nc = 0; ovflow = 0; for(i=0 ; i<MAXWORD ; ++i) wl[i] = 0; while((c=getchar())!=EOF){ //参考(1) if(c==' ' || c=='\n' || c=='\t'){ state = OUT; if(nc>0) if(nc<MAXWORD) ++wl[nc]; else ++ovflow; nc = 0; }else if(state == OUT){ state = IN; nc = 1; }else ++nc; } maxvalue = 0; for(i=1 ; i<MAXWORD ; ++i) if(wl[i] > maxvalue) maxvalue = wl[i]; printf("\n"); for(i=MAXHIST ; i>0 ; --i){ //两个for循环打印直方图,从上到下 for(j=1 ; j<MAXWORD ; ++j){ if(wl[j] * MAXHIST / maxvalue >= i) printf("%4c", x); else printf("%4c", sp); } putchar('\n'); } for(i=1 ; i<MAXWORD ; ++i) //打印1至MAXWORD printf("%4d", i); putchar('\n'); for(i=1 ; i<MAXWORD ; ++i) //打印各长度的数量 printf("%4d", wl[i]); printf("\n\n"); if(ovflow > 0) printf("There are %d words >= %d\n", ovflow, MAXWORD); }

    练习1-14 编写一个程序打印输入中各个字符出现频度的直方图

    #include <stdio.h> #include <ctype.h> #define MAXHIST 15 #define MAXWORD 128 //打印128个字符出现频度的水平直方图 main() { int c, i; int len; int maxvalue; int wl[MAXWORD]; for(i=0 ; i<MAXWORD ; ++i) wl[i] = 0; while((c=getchar())!=EOF){ if(c < MAXWORD) ++wl[c]; } maxvalue = 0; for(i=0 ; i<MAXWORD ; ++i) if(wl[i] > maxvalue) maxvalue = wl[i]; for(i=0 ; i<MAXWORD ; ++i){ if(isprint(i)) printf("%5d - %c - %5d : ", i, i, wl[i]); else printf("%5d - - %5d : ", i, wl[i]); if(wl[i] > 0){ if((len = wl[i] * MAXHIST / maxvalue) <= 0) len = 1; }else len = 0; while(len > 0){ putchar('*'); --len; } putchar('\n'); } } /*原答案 -------------------------- #include <stdio.h> #define MAXHIST 15 #define MAXWORD 26 main() { int c, i, nc; int len; int maxvalue; int wl[MAXWORD]; nc = 0; for(i=0 ; i<MAXWORD ; ++i) wl[i] = 0; while((c=getchar())!=EOF){ if(26 > (c-'a') >= 0) ++wl[(c-'a')]; else ++nc; } maxvalue = 0; for(i=0 ; i<MAXWORD ; ++i) if(wl[i] > maxvalue) maxvalue = wl[i]; for(i=0 ; i<MAXWORD ; ++i){ char sc = 'a' + i; printf("%2c - %3d : ", sc, wl[i]); if(wl[i] > 0){ if((len = wl[i] * MAXHIST / maxvalue) <= 0) len = 1; }else len = 0; while(len > 0){ putchar('*'); --len; } putchar('\n'); } if(nc > 0) printf("There are %d words outside", nc); } */

    练习1-15 重新编写1.2节中的温度转换程序,使用新式的函数原型声明方式

    #include <stdio.h> float celsius(float fahr); main() { float fahr; int lower, upper, step; lower = 0; upper = 300; step = 10; fahr = lower; while(fahr <= upper){ printf("%5.0f %6.1f\n", fahr, celsius(fahr)); fahr = fahr + step; } } float celsius(float fahr) { return (5.0/9.0) * (fahr-32.0); } /* 原答案 int change(int low, int up, int step); main(){ change(0, 300, 20); return 0; } int change(int low, int up, int step){ for(int i = low; i <= up; i = i + step){ printf("%d\t%6.1f\n", i, (i-32)*5.0/9.0); } } */

    练习1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的的输入行的长度,并尽可能多地打印文本 // 注意题目描述,是任意长度的输入行的长度和尽可能多地打印文本

    #include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE)) > 0){ if(len > max){ max = len; copy(longest, line); } } if(max > 0) printf("longest: %s", longest); return 0; } int getline(char s[], int lim) { int c, i, j; //i代表最长输入行的长度 j代表记录着的字符的数量 j = 0; for(i=0; (c=getchar())!=EOF && c!='\n' ; ++i) if(i < lim-2){ s[j] = c; ++j; } if(c == '\n'){ s[j] = c; ++i; ++j; } s[j] = '\0'; return i; } void copy(char to[], char from[]) { int i; i = 0; while((to[i] = from[i]) != '\0') ++i; }

    练习1-17 编写一个程序,打印长度大于80个字符的所有输入行

    #include <stdio.h> #define MAXLINE 1000 #define MINLINE 80 int getline(char line[], int maxline); main() { int len; int max; char line[MAXLINE]; max = 0; while((len = getline(line, MAXLINE)) > 0) if(len > MINLINE) printf("%s", line); return 0; } int getline(char s[], int lim) { int c, i, j; j = 0; for(i=0 ; (c=getchar())!=EOF && c!='\n' ; ++i) if(i < lim-2){ s[j] = c; ++j; } if(c == '\n'){ s[j] = c; ++i; ++j; } s[j] = '\0'; return i; }

    练习1-18 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行

    #include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); int remove(char s[]); main() { char line[MAXLINE]; while(getline(line, MAXLINE) > 0) if(remove(line) > 0) printf("%s", line); return 0; } int getline(char line[], int maxline) { int c, i, j; j = 0; for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) if(i < maxline-2){ line[j] = c; ++j; } if(c == '\n'){ line[j] = c; ++j; ++i; } line[j] = '\0'; return i; } int remove(char s[]) { int i; i = 0; while(s[i] != '\n') //先找到'\n', 再往前找空格和制表符 ++i; --i; while(i>=0 && (s[i]==' ' || s[i] == '\t')) --i; if(i >= 0){ ++i; s[i] = '\n'; ++i; s[i] = '\0'; } return i; }

    练习1-19 编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序

    #include <stdio.h> #define MAXLINE 1000 #define AWORD 'a' int getline(char line[], int maxline); void reverse(char s[]); main() { char line[MAXLINE]; while(getline(line, MAXLINE) > 0){ reverse(line); printf("%s", line); } return 0; } int getline(char line[], int maxline) { int c, i, j; j = 0; for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) if(i < maxline-2){ line[j] = c; ++j; } if(c == '\n'){ line[j] = c; ++j; ++i; } line[j] = '\0'; return i; } void reverse(char s[]) { int i, j; char temp = AWORD; i = j = 0; while(s[i] != '\n') ++i; --i; if(i >= 0){ while(i > j){ temp = s[i]; s[i] = s[j]; s[j] = temp; --i; ++j; } } }
    转载请注明原文地址: https://ju.6miu.com/read-1298081.html
    最新回复(0)