C语言练习1

找出以下程序中的错误并作出解释

  1. 输出hello, world并换行
       1 include <stdio>
       2 main {
       3     printf(hello, world/n)
       4 }
    
  2. 打印华氏温度与摄氏温度的对照表,输出摄氏度保留一位小数
       1 #include "stdio.h"
       2 main()
       3 {
       4     lower = 0;
       5     upper = 300;
       6     fahr = lower;
       7     while( fahr <= upper ) {
       8         celsius = 5 * (fahr - 32)/9;
       9         printf("%3.0f %6.1f\n", fahr, celsius);
      10         fahr += step;
      11     }
      12 }
    
  3. 单词计数
       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 }
    
  4. 单词计数新版

       1 #include <stdio.h>
       2 /* 所有的输入分两类字符:
       3               一是分界符字符,用OUT表示;
       4               二是非分界符字符,用IN表示
       5    表示当前字符类别的state, 由OUT 变成 IN 时, 就有一个单词读入; */
       6 enum STATUS{IN, OUT};
       7 main() {
       8     int c, state;
       9     int nl,nw,nc;
      10     nl = nw = nc = 0;
      11     state = OUT;
      12     while( (c = getchar()) != EOF) {
      13         ++nc;
      14         if(c == '\n')
      15             ++nl;
      16         if(c == ' ' || c == '\n' || c == '\t')
      17             state = OUT;
      18         else if(state == OUT){
      19             state = IN;
      20             ++nw;
      21         }
      22     }
      23     printf("%d %d %d\n", nl, nw, nc);
      24 }
    
  5. 求指数

       1 #include <stdio.h>
       2 main() {
       3     int i;
       4     for(i = 0, i < 10, i++)
       5         printf("%d %f %f\n", i, power(2.0f, i), power(-3.0f, i));
       6     return 0;
       7 }
       8 float power(base, n)
       9 {
      10     int i;
      11     float p;
      12     for(i = 1; i < n; ++i)
      13         p *= base;
      14     return p;
      15 }
    
  6. 读取字符串并求字符串长度
       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 }
    
  7. 栈的数据定义和操作
       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 }
    
  8. 递归函数打印一个整数
       1 #include <stdio.h>
       2 void printd(int n) {
       3     printd(n / 10);
       4     putchar(n % 10 + '0');
       5 }
       6 
       7 main()
       8 {
       9     int i = 1234;
      10     printd(i);
      11 }
    
  9. 读取整数的函数
       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.    1 #include <stdio.h>
       2 int dec(int *a) {
       3     return (*a)--;
       4 }
       5 int inc(int a) {
       6     return a++;
       7 }
       8 main() {
       9     int x = 1, y;
      10     y = dec( &x );
      11     y = inc(x);
      12     printf("%d\n%d\n", x, y);
      13 
      14 }
    
  2.    1 #include <stdio.h>
       2 #define min(x,y) (((x)<(y))?(x):(y))
       3 #ifdef EOF
       4 #define square(x)  x*x
       5 #else
       6 #define square(x)  ((x)*(x))
       7 #endif
       8 int main() {
       9     int a = 1, b = 2;
      10     printf("%d\n", square(a+b));
      11     min(a++, b++);
      12     printf("%d\n ", min(a, b));
      13 }
    
  3.    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 }
    
  4. 假定int, unsigned是32位的。
       1 #include <stdio.h>
       2 int bitcount(unsigned x) {
       3     int b;
       4     x = ~x;
       5     for(b = 0; x != 0; x >>= 1)
       6         if(x & 1)
       7             b++;
       8     return b;
       9 }
      10 main() {
      11     printf("%d\n%d\n%d\n", bitcount( ~ 0xA), bitcount(017), bitcount(255) );
      12 }
    
  5.    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 }
    
  6.    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 }
    
  7.    1 #include <stdio.h>
       2 #define INITVAL 5
       3 int count() {
       4     static int c = INITVAL;
       5     return c--;
       6 }
       7 main() {
       8     int i;
       9     while(i = count() )
      10         printf("%d\n", i);
      11 }
    
  8.    1 #include <stdio.h>
       2 double mod(double x, double y) {
       3         return  x - (int)( x / y ) * y;
       4 }
       5 main() {
       6     printf("%6.1f\n%6.1f\n", mod(23, 3), mod(-36.5, 7.5) );
       7 }
    

编程题,按要求编写程序

  1. 分别编写递归方式和非递归方式的reverse(s)函数,用于将字符串s倒过来
  2. 分别编写递归方式和非递归方式的fact(n)函数,用于计算n的阶乘n!
  3. 分别编写递归方式和非递归方式的combination(m, n),用于计算组合数
  4. 写一个程序统计输入的空格数,tab数,和换行数。
  5. 编写一个程序,把输入拷贝到输出,把其中连续的多个空格替换成一个空格。
  6. 编写一个程序,把输入中长度超过80个字符的行输出。
  7. 编写一个程序,把输入中每一行末尾的空格或者tab删除。
  8. 编写一个程序,将输入中的水平制表符替换成适当数目的空格,使空格充满到下一个制表符终止位。假设制表符终止位的位置是固定的,每隔10列就会出现一个制表符终止位。
  9. 编写一个程序,把超过50个字符的输入行折成短一些的两行或多行,折行的位置在输入行的第50、100、150……列的位置。
  10. 编写一个程序,把输入拷贝到输出,并替换退格符为\b,替换其中的tab为\t,替换反斜杠为\\,使得原来不可见的字符变得可见。

读程序,写出程序运行的结果

  1.    1 #include <stdio.h>
       2 int min(int a, int b) {
       3     return a < b ? a : b;
       4 }
       5 main() {
       6     int x = -1, y = -2;
       7     printf("%d", min(x, y));
       8 }
    
  2.    1 #include <stdio.h>
       2 int inc(int a) {
       3     return ++a;
       4 }
       5 main() {
       6     int x = -1, y;
       7     y = inc(x);
       8     printf("%d\n%d", x, y);
       9 }
    
  3.    1 #include <stdio.h>
       2 #include <math.h>
       3 #define FALSE 0
       4 #define TRUE 1
       5 #define BOOL int
       6 
       7 BOOL prime(int a) {
       8     int i;
       9     for( i = 2; i <= sqrt((double)a); i++)
      10         if( a % i == 0)
      11             return FALSE;
      12     return TRUE;
      13 }
      14 main() {
      15     int x = 37, y = 91;
      16     printf("%d\n%d", prime(x), prime(y));
      17 }
    
  4.    1 #include <stdio.h>
       2 int fibonacci(int a) {
       3     int i, curr = 1, next = 1, temp;
       4     for( i = 1; i < a; i++) {
       5         temp = next + curr;
       6         curr = next;
       7         next = temp;
       8     }
       9     return curr;
      10 }
      11 main() {
      12     int i;
      13     for(i = 1; i < 10; i++)
      14         printf("%d\t", fibonacci(i));
      15 }
    
  5.    1 #include <stdio.h>
       2 main() {
       3     int x = 2, y = 1; /*assume int is 32-bit*/
       4     printf("%d", (~x | ~y) + (x ^ y) );
       5 }
    
  6.    1 #include <stdio.h>
       2 
       3 main() {
       4     int flag = 0;
       5     int count = 0;
       6     int c;
       7     while( (c = getchar()) != EOF ) {
       8         if(flag == 0) {
       9             if(c =='c')
      10                 flag ++;
      11         }
      12         else if( flag == 1) {
      13             if( c == 'z')
      14                 flag ++;
      15             else
      16                 flag = 0;
      17         }
      18         else if( flag == 2) {
      19             if( c == 'k')
      20                 count ++;
      21             flag = 0;
      22         }
      23     }
      24     printf("%d", count);
      25 }
    

    程序运行后输入czk loves c programming language! czk programs every day!

  7.    1 #include <stdio.h>
       2 
       3 main() {
       4     int x, y;
       5     x = 0!=4<=1+2*3/4<<1;
       6     y = (1 << 2 | 0xF0 ) ^ 071 & 8;
       7     printf("%d\n%d", x, y);
       8 }
    
  8.    1 #include <stdio.h>
       2 #define PI 3.14
       3 main() {
       4     double r;
       5     for( r  = 1.0; r <= 4.5; r += 1.0) {
       6         printf("%6.0f%6.2f%6.2f\n", r, PI*r*2, PI*r*r);
       7 }
       8 }
    
  9.    1 #include <stdio.h>
       2 enum months{JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
       3 main() {
       4     int days[12];
       5     int i;
       6     days[JAN] = 31;
       7     days[FEB] = 28;
       8     days[MAR] = 31;
       9     days[APR] = 30;
      10     days[MAY] = 31;
      11     days[JUN] = 30;
      12     days[JUL] = 31;
      13     days[AUG] = 31;
      14     days[SEP] = 30;
      15     days[OCT] = 31;
      16     days[NOV] = 30;
      17     days[DEC] = 31;
      18     for( i  = JAN; i <= DEC; ++i) {
      19         printf("month %6d has %6d days\n", i, days[i]);
      20     }
      21 }
    
  10.    1 #include <stdio.h>
       2 enum BOOL {FALSE, TRUE};
       3 int isdigit(int c) {
       4     return c >='0' && c<='9';
       5 }
       6 int islower(int c) {
       7     return c >='a' && c<='z';
       8 }
       9 int isupper(int c) {
      10     return c >='A' && c<='Z';
      11 }
      12 int isalpha(int c) {
      13     return isupper(c) || islower(c);
      14 }
      15 int isspace(int c) {
      16     return c=='\n' || c=='\t' || c==' ' || c=='\r' || c=='\v' || c=='\f';
      17 }
      18 int isxdigit(int c) {
      19     return isdigit(c) || (c>='a' && c <='f') || (c>='A' && c<='F');
      20 }
      21 int isalnum(int c) {
      22     return isalpha(c) || isdigit(c);
      23 }
      24 main() {
      25 int c;
      26     while( (c = getchar())!=EOF) {
      27         printf("%2d%2d%2d%2d%2d%2d%2d\n", isdigit(c), islower(c), isupper(c),
      28             isalpha(c), isspace(c), isxdigit(c), isalnum(c));
      29     }
      30 }
    

输入(共计7个字符):b =0XF;

按要求编写程序

  1. 写一个函数reverse(s),将字符串s反转。比如
    char s[]="hello";
    reverse(s);
    这时s变成"olleh"
  2. 写一个函数invert(x,p,n),这个函数将整数x从右数第p位开始的n位反转(0变1,1变0),并将这个值返回。比如:invert(0x72, 4, 3)将返回0x6E.
  3. 请写一个程序分别统计输入当中空格、水平制表符(tab)和换行符(newline)的个数,即程序运行后输入任意一些字符,以Ctrl+Z结束输入,程序输出这些字符中空格的个数、水平制表符的个数以及换行符的个数。

找出以下程序中的错误,并作出解释

  1. 输出hello, world并换行

   1 include <stdio.h>
   2 
   3 main() {
   4 
   5     printf("hello, world/n")
   6 
   7 }

第一行漏了#,应该是#include <stdio.h>

/n应该改成\n

printf语句后面漏了;

  1. 打印华氏温度与摄氏温度的对照表,输出摄氏度保留一位小数

   1 #include <stdio.h>
   2 
   3 main()
   4 
   5 {
   6 
   7     int fahr;
   8 
   9     int lower, upper, step;
  10 
  11     lower = 0;
  12 
  13     upper = 300;
  14 
  15     fahr = lower;
  16 
  17     while( fahr <= upper ) {
  18 
  19         double celsius = 5 * (fahr32)/9;
  20 
  21         printf("%3.0f %6.1f\n", fahr, celsius);
  22 
  23         fahr += step;
  24 
  25     }
  26 
  27 }

step没有赋初值

fahr是整数,格式化串应该对应的%3d而不是%3.0f

5*(fahr - 32)/9为整数,没有保留小数部分,应改为5.0*(fahr - 32.0) / 9.0

  1. 打印华氏温度与摄氏温度的对照表,输出摄氏度保留一位小数

   1 #include <stdio.h>
   2 
   3 #define LOWER 0;
   4 
   5 #define UPPER 300;
   6 
   7 #define STEP 20;
   8 
   9 main () {
  10 
  11     int fahr;
  12 
  13     for(fahr = LOWER, fahr <= UPPER, fahr += STEP)
  14 
  15         printf("%3d %6.1f\n", fahr, (5.0/9.0)(fahr-32));
  16 
  17 }

#define宏后面不要有分号

for的三个字句应该用;分开,而不能用,隔开

(5.0/9.0)和(fahr-32)之间应该有*

  1. 把输入字符复制到输出

   1 #include <stdio.h>
   2 
   3 main {
   4 
   5     while(c = getchar() != EOF)
   6 
   7         putchar(c);
   8 
   9 }

main函数后面应该有()

while条件应该为(c=getchar())!=EOF

变量c没有定义,应该定义为int c;

  1. 单词计数

   1 #include <stdio.h>
   2 
   3 #define OUT 1
   4 
   5 #define IN 0
   6 
   7 main() {
   8 
   9     int c, state = OUT;
  10 
  11     int nl = nw = nc = 0;
  12 
  13     while((c=getchar()) != EOF) {
  14 
  15         ++nc;
  16 
  17         if(c == '\n')
  18 
  19             ++nl;
  20 
  21         if(c == ' ' && c == '\n' && c == '\t')
  22 
  23             state = OUT;
  24 
  25         else if(state = OUT) {
  26 
  27             state = IN;
  28 
  29             ++nw;
  30 
  31         }
  32 
  33     }
  34 
  35     printf("%d %d %d\n", nl, nw, nc);
  36 
  37 }

int nl = nw = nc = 0;是错误的,应该写为int nl = 0, nw = 0, nc = 0;

c == ' ' && c == '\n' && c == '\t'应该改为c == ' ' || c == '\n' || c == '\t'

state = OUT应该改为state == OUT

  1. 求指数

   1 #include <stdio.h>
   2 
   3 main() {
   4 
   5     int i;
   6 
   7     for(i = 0; i < 10; i++)
   8 
   9         printf("%d %f %f\n",i, power(float 2.0f, int i), power(float -3.0f,int i));
  10 
  11     return 0;
  12 
  13 }
  14 
  15 float power(base, n)
  16 
  17 {
  18 
  19     int i;
  20 
  21     float p = 1.0f;
  22 
  23     for(i = 1; i <= n; ++i)
  24 
  25         p *= base;
  26 
  27     return p;
  28 
  29 }

函数power缺少声明

power函数调用的时候参数错误

power函数定义base和n缺少参数

  1. 求字符串长度的函数

   1 int strlen(char s[])
   2 
   3 {
   4 
   5     int i = 0;
   6 
   7     while(s[i] != '0')
   8 
   9         ++i;
  10 
  11     return i;
  12 
  13 }

'0'应该改为'\0'

  1. 栈的数据定义和操作

   1 #define MAXVAL 100
   2 
   3 extern int sp = 0;
   4 
   5 double val[MAXVAL];
   6 
   7 void push(double f) {
   8 
   9     if(sp < MAXVAL)
  10 
  11         val[++sp] = f;
  12 
  13     else
  14 
  15         printf("error: stack full");
  16 
  17 }
  18 
  19 double pop(void) {
  20 
  21     if(sp >= 0)
  22 
  23         return val[--sp];
  24 
  25     else {
  26 
  27         printf("error: stack empty");
  28 
  29         return 0.0;
  30 
  31     }
  32 
  33 }

extern声明变量sp的时候不能赋初值

push函数当中val[sp++] = f;

  1. 递归函数打印一个整数

   1 #include <stdio.h>
   2 
   3 void printd(int n) {
   4 
   5     if(n < 0) {
   6 
   7         putchar('-')
   8 
   9         n = -n;
  10 
  11     }
  12 
  13     printd(n / 10);
  14 
  15     putchar(n % 10 + '0');
  16 
  17 }

printd(n/10);语句前应该加上if(n/10)

  1. 读取整数的函数(getch函数和ungetch函数的定义省略)

   1 #include <ctype.h>
   2 
   3 int getch(void); /*从输入流读取一个字符*/
   4 
   5 void ungetch(int); /*将一个字符放回输入流*/
   6 
   7 int getint(int *pn)
   8 
   9 {
  10 
  11     int c, sign;
  12 
  13     while(isspace(c = getch()));
  14 
  15     if(!isdigit(c) && c != EOF && c!='+' && c!='-') {
  16 
  17          ungetch(c);
  18 
  19          return 0;
  20 
  21     }
  22 
  23     sign = c == '-' ? -1 : 1;
  24 
  25     if( c == '+' || c == '-')
  26 
  27         c = getch();
  28 
  29     for( *pn = 0; isdigit(c); c = getch())
  30 
  31         pn = 10 * pn + c'0';
  32 
  33     *pn *= sign;
  34 
  35     if(c != EOF)
  36 
  37         ungetch(c);
  38 
  39     return c;
  40 
  41 }

pn = 10 * pn + c – '0';应该改为*pn = 10 * *pn + c - '0';

读程序,写出程序运行的结果

  1. 程序

   1 #include <stdio.h>
   2 int inc(int *a) {
   3     return (*a)++;
   4 }
   5 
   6 main() {
   7     int x = 1, y;
   8     y = inc( &x );
   9     printf("%d\n%d\n", x, y);
  10 }

结果:

2
1
  1. 程序

   1 #include <stdio.h>
   2 double fmod(double x, double y) {
   3         return  x - (int)( x / y ) * y;
   4 }
   5 
   6 main() {
   7     printf("%6.1f\n%6.1f\n", fmod(5.0, 3.0), fmod(-21.0, 5.0) );
   8 }

结果

   2.0
  -1.0
  1. 程序

   1 #include <stdio.h>
   2 int leapyear(int y) {
   3     return y % 400 == 0 || y % 100 != 0 && y % 4 == 0;
   4 }
   5 
   6 main() {
   7     int low = 1995;
   8     int high = 2000;
   9     int i;
  10     for(i = low; i <= high; ++i)
  11         printf("Year %d is %s year\n", i, leapyear(i)?"leap":"nonleap");
  12 }

结果:

Year 1995 is nonleap year
Year 1996 is leap year
Year 1997 is nonleap year
Year 1998 is nonleap year
Year 1999 is nonleap year
Year 2000 is leap year
  1. 程序

   1 #include <stdio.h>
   2 int count() {
   3     static int c = 0;
   4     return ++c;
   5 }
   6 
   7 main() {
   8     int i;
   9     for(i = 5; i > 0; i--)
  10         printf("count called for %d times\n", count());
  11 }

结果:

count called for 1 times
count called for 2 times
count called for 3 times
count called for 4 times
count called for 5 times
  1. 程序

   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 
  11 main() {
  12     char s1[] = { 'a', 'b', 'c', 'd', '\0'};
  13     char s2[] = "ABCD";
  14     char s3[] = "abc";
  15     printf("%s and %s are %s equal\n", s1, s2, (stricmp(s1, s2)==0) ? "" : "not");
  16     printf("%s and %s are %s equal\n", s2, s3, (stricmp(s2, s3)==0) ? "" : "not");
  17 }

结果:

abcd and ABCD are  equal
ABCD and abc are not equal
  1. 程序

   1 #include <stdio.h>
   2 #define MAXVAL 10
   3 int queue[MAXVAL];
   4 int front = 0;
   5 int back = 0;
   6 
   7 void enqueue(int v) {
   8     queue[back++] = v;
   9     back = back % MAXVAL;
  10 }
  11 
  12 int dequeue() {
  13     int v = queue[front++];
  14     front = front % MAXVAL;
  15     return v;
  16 }
  17 
  18 main() {
  19     int i;
  20     for(i = 1; i <= 3; i++)
  21         enqueue(i);
  22     for(i = 0; i < 3; i++)
  23         printf("%d\n", dequeue());
  24 }

结果:

1
2
3
  1. 程序(此题中假定int和unsigned为32位)

   1 #include <stdio.h>
   2 int bitcount(unsigned x) {
   3     int b;
   4     x = ~x;
   5     for(b = 0; x != 0; x >>= 1)
   6         if(x & 1)
   7             b++;
   8     return b;
   9 }
  10 
  11 main() {
  12     printf("%d\n%d\n%d\n", bitcount( ~ 0xA), bitcount(017), bitcount(255) );
  13 }

结果

2
28
24
  1. 程序

   1 #include <stdio.h>
   2 
   3 int weekday(int year, int month, int day) {
   4         int y, c;
   5         if(month == 1 || month == 2) {
   6                 month += 12;
   7                 year--;
   8         }
   9         y = year % 100;
  10         c = year / 100;
  11         return (y + y/4 + c / 4  - 2 * c + 26*(month+1) / 10 + day -1) % 7;
  12 }
  13 
  14 int main() {
  15         int year = 2005;
  16         int month = 12;
  17         int day = 25;
  18         printf("%d\n", weekday(year, month, day));
  19         switch(weekday(year, month, day)) {
  20         case 1: case 2: case 3: case 4: case 5:
  21                 printf("this is a work day\n");
  22                 break;
  23         case 6: case 0:
  24                 printf("this is not a work day\n");
  25                         break;
  26         default:
  27                 printf("this day does not exist\n");
  28         }
  29 }

结果:

0
this is not a work day
  1. 程序

   1 #include <stdio.h>
   2 
   3 void bubblesort(int v[], int n) {
   4     int i, j;
   5     for( i = n-1; i >= 0; i--)
   6         for(j = 0; j < i; j++)
   7             if(v[j] > v[j+1]) {
   8                 int temp = v[j];
   9                 v[j] = v[j+1];
  10                 v[j+1] = temp;
  11             }
  12 }
  13 
  14 int main() {
  15     int i;
  16     int s[] = { 5, 4, 3, 2, 1};
  17     bubblesort(s, 5);
  18     for(i = 0; i < 5; i++)
  19         printf("%3d", s[i]);
  20 }

结果

  1  2  3  4  5
  1. 程序

   1 #include <stdio.h>
   2 #define max(x,y) (((x)>(y))?(x):(y))
   3 
   4 int main() {
   5     int a = 5, b = 6;
   6 
   7     printf("%d\n", max(5, 6));
   8     max(a++, b++);
   9     printf("%d\n ", max(a, b));
  10 }

结果

6
8

程序填空题,按要求填写程序

  1. 打印输入的单词长度的直方图

   1 #include <stdio.h>
   2 #define MAXLENGTH 20
   3 
   4 main() {
   5     int c, i, len, max, nlength[MAXLENGTH+1];
   6     for(i = 0; i <= MAXLENGTH; i++)
   7         ___________________
   8     max = 0;
   9     len = 0;
  10     while (__(c=getchar()) != EOF__) {
  11         if( c != ' ' && c!= '\n' && c != '\t') {
  12             ++len;
  13         } else if(len != 0) {
  14             if(len <= MAXLENGTH) {
  15                 __________________
  16                 if(len > max)
  17                     max = len;
  18             }
  19             len = 0;
  20         }
  21     }
  22     for(i = 1; ___________; i++) {
  23         int j = 0;
  24         printf("length:%4d count:%4d ", i, nlength[i]);
  25         for(j = 0; ________________; j++)
  26             putchar('=');
  27         putchar('\n');
  28     }
  29 }

程序输入:

Write a program to print a histogram of the lengths of words in its input

程序输出结果:

length:   1 count:   2 ==
length:   2 count:   4 ====
length:   3 count:   2 ==
length:   4 count:   0
length:   5 count:   4 ====
length:   6 count:   0
length:   7 count:   2 ==
length:   8 count:   0
length:   9 count:   1 =
  1. 快速排序

   1 #include <stdio.h>
   2 
   3 void swap(int v[], int i, int j);
   4 void qsort(int v[], int left, int right);
   5 
   6 int main() {
   7     int i;
   8     int v[] = {15, 12, 31, 21 ,45};
   9     qsort(_____________);
  10     for(i = 0; i < 5; i++)
  11          printf("%4d", v[i]);
  12 }
  13 
  14 void qsort(int v[], int left, int right) {
  15     int i, last;
  16     if(_______________)
  17         return;
  18     swap(v, left, (left+right)/2);
  19     last = left;
  20     for(i = left + 1; i <= right; i++)
  21         if(v[i] < v[left])
  22             swap(v, ++last, i);
  23     swap(v, left, last);
  24     qsort(_____________________);
  25     qsort(_____________________);
  26 }
  27 
  28 void swap(int v[], int i, int j) {
  29     ___________;
  30     v[i] = v[j];
  31     v[j] = temp;
  32 }

程序输出结果

  12  15  21  31  45

编程题,按要求编写程序

  1. 编写一个ackerman函数,这个函数用于计算如下数学公式。编写一个main函数计算并输出A(3, 4)的值

   1 #include <stdio.h.
   2 
   3 int ackerman(int m, int n) {
   4     if(m==0)
   5         return n+1;
   6     else if( n == 0)
   7         return ackerman(m-1, 1);
   8     else
   9         return ackerman(m-1, ackerman(m, n-1));
  10 }
  11 
  12 int main() {
  13     printf("%d", ackerman(3,4));
  14 }
  1. 编写一个程序,将输入中的水平制表符替换成适当数目的空格,使空格充满到下一个制表符终止位。假设制表符终止位的位置是固定的,每隔10列就会出现一个制表符终止位。

   1 #include<stdio.h>
   2 #include<stdlib.h>
   3 #define TABSIZE 10
   4 
   5 main()
   6 {
   7     int c, i;
   8     int count = 0;
   9     while((c=getchar())!=EOF) {
  10         if(c=='\t') {
  11             int space = TABSIZE - count % TABSIZE;
  12             for(i = 0; i < space; i++) {
  13                 putchar(' ');
  14                 count ++;
  15             }
  16         } else if (c == '\n'){
  17             putchar(c);
  18             count = 0;
  19         } else {
  20             putchar(c);
  21             count ++;
  22         }
  23     }
  24 }

C语言练习1 (2008-06-15 13:36:27由czk编辑)