找出以下程序中的错误,并作出解释
输出hello, world并换行
打印华氏温度与摄氏温度的对照表,输出摄氏度保留一位小数
单词计数
1 #include <stdio.h> 2 enum STATUS{IN, OUT}; 3 main() { 4 int c, state; 5 int nl = nw = nc = 0; 6 while( c = getchar() != EOF) { 7 ++nc; 8 if(c == "\n") ; 9 ++nl; 10 if(c == ' ' && c == '\n' && c == '\t') 11 state = OUT; 12 else if(state = OUT) 13 state = IN; 14 ++nw; 15 } 16 printf("%d %d %d\n", nl, nw, nc); 17 }
求指数
读取字符串并求字符串长度
1 #include <stdio.h> 2 int strlen(char s) 3 { 4 int i = 0; 5 while(s[++i] != '0') ; 6 return i; 7 } 8 int getline(char s, int lim) 9 { 10 int c, i; 11 for (i = 0; i < lim-1; ++i) { 12 if( (c = getchar()) != EOF && c!='\n') 13 s[i] = c; 14 else 15 brake; 16 if (c == '\n') 17 s[++i] = c; 18 s[i] = '\0'; 19 return i; 20 } 21 main() 22 { 23 char s[]; 24 int len; 25 getline(s, 1000); 26 len = strlen(s); 27 printf("%d:%s", len, s); 28 }
栈的数据定义和操作
1 #define MAXVAL 100 2 extern int sp = 0; 3 double val[MAXVAL]; 4 void push(double f) { 5 if(sp < MAXVAL) 6 val[++sp] = f; 7 else 8 printf("error: stack full"); 9 } 10 double pop(void) { 11 if(sp >= 0) 12 return val[--sp]; 13 else { 14 printf("error: stack empty"); 15 return 0.0; 16 } 17 } 18 19 main() { 20 int i; 21 for(i = 0; i < 5; i++) 22 push(i); 23 for(i = 0; i < 5; i++) 24 printf("%f", pop(i)); 25 }
递归函数打印一个整数
读取整数的函数
1 #include <ctype.h> 2 #include <stdio.h> 3 char buf[BUFSIZE]; 4 int bufp = 0; 5 int getch(void); /*从输入流读取一个字符*/ 6 { 7 return (bufp>0)?buf[--bufp]:getchar(); 8 } 9 void ungetch(int c); /*将一个字符放回输入流*/ 10 { 11 if(bufp >= BUFSIZE) 12 printf("ungetch: too many char\n"); 13 else 14 buf[bufp++] = c; 15 } 16 int getint(int *pn) 17 { 18 int c, sign; 19 while(isspace( getch())); 20 if(!isdigit(c) && c != EOF && c!='+' && c!='-') { 21 ungetch(c); 22 return 0; 23 } 24 sign = c == '-' ? -1 : 1; 25 if( c == '+' || c == '-') 26 c = getch(); 27 for( pn = 0; isdigit(c); c = getch()) 28 pn = 10 * pn + c – '0'; 29 pn *= sign; 30 if(c != EOF) 31 ungetch(c); 32 return c; 33 }
读程序,写出程序运行的结果
1 #include <stdio.h> 2 void selectsort(int v[], int n) { 3 int i, j, min, temp; 4 for( i = 0; i < n-1; i++) { 5 min = i; 6 for( j = i + 1; j < n; j++) 7 if(v[j] < v[min]) 8 min = j; 9 temp = v[min]; 10 v[min] = v[i]; 11 v[i] = temp; 12 } 13 } 14 int main() { 15 int i; 16 int s[] = { 5, 4, 3, 2, 1}; 17 selectsort(s, 5); 18 for(i = 0; i < 5; i++) 19 printf("%3d", s[i]); 20 }
假定int, unsigned是32位的。
1 #include <stdio.h> 2 #define MAXVAL 10 3 int queue[MAXVAL]; 4 int front = 0; 5 int back = 0; 6 int empty() { 7 return front == back; 8 } 9 int full() { 10 return (back + 1)%MAXVAL == front; 11 } 12 int size() { 13 return (back - front + MAXVAL) % MAXVAL; 14 } 15 void enqueue(int v) { 16 if(full()) 17 return; 18 queue[back++] = v; 19 back = back % MAXVAL; 20 } 21 int dequeue() { 22 int v; 23 if( empty() ) 24 return 0; 25 v = queue[front++]; 26 front = front % MAXVAL; 27 return v; 28 } 29 main() { 30 int i; 31 for(i = 1; !full(); i++) 32 enqueue(i); 33 print("%d\n", size()); 34 while(!empty()) 35 printf("%d\n", dequeue()); 36 }
1 #include <stdio.h> 2 #include <ctype.h> 3 int stricmp(char s[], char t[]) { 4 int i; 5 for( i = 0; s[i] != '\0' && t[i] != '\0'; i++) 6 if(tolower(s[i]) != tolower(t[i])) 7 break; 8 return tolower(s[i]) - tolower(t[i]); 9 } 10 main() { 11 char s1[] = { 'a', 'b', 'c', 'd', '\0'}; 12 char s2[] = "ABCD"; 13 char s3[] = "abcde"; 14 int s1s2 = stricmp(s1, s2); 15 int s2s3 = stricmp(s2, s3); 16 printf("%s is %s %s\n", s1, s1s2==0 ? "equal to" : s1s2 > 0 ? "great than" : "less than" , s2); 17 printf("%s is %s %s\n", s2, s2s3==0 ? "equal to" : s2s3 > 0 ? "great than" : "less than" , s3); 18 }
编程题,按要求编写程序
- 分别编写递归方式和非递归方式的reverse(s)函数,用于将字符串s倒过来
- 分别编写递归方式和非递归方式的fact(n)函数,用于计算n的阶乘n!
- 分别编写递归方式和非递归方式的combination(m, n),用于计算组合数
- 写一个程序统计输入的空格数,tab数,和换行数。
- 编写一个程序,把输入拷贝到输出,把其中连续的多个空格替换成一个空格。
- 编写一个程序,把输入中长度超过80个字符的行输出。
- 编写一个程序,把输入中每一行末尾的空格或者tab删除。
- 编写一个程序,将输入中的水平制表符替换成适当数目的空格,使空格充满到下一个制表符终止位。假设制表符终止位的位置是固定的,每隔10列就会出现一个制表符终止位。
- 编写一个程序,把超过50个字符的输入行折成短一些的两行或多行,折行的位置在输入行的第50、100、150……列的位置。
- 编写一个程序,把输入拷贝到输出,并替换退格符为\b,替换其中的tab为\t,替换反斜杠为\\,使得原来不可见的字符变得可见。