精华内容
下载资源
问答
  • 苏小红主编C语言程序设计配套资源,题目来自http://sse.hit.edu.cn/ 常见错误总结 不该写的分号:define,while循环; 少写的分号和引号; 错误的判断条件:判断时少写一个等号,或者大于小于弄反; scanf没加“&...

    苏小红主编C语言程序设计配套资源,题目来自http://sse.hit.edu.cn/ :edoc26265144541703426777m1 部分容易题目不再记录

    常见错误总结

    1. 宏定义变量冲突;
    2. 未定义的变量;
    3. 不该写的分号:define,while循环,for循环,函数开头;
    4. 少写的括号、分号、逗号和引号:语句块,结构体结尾printfdo while 语句后
    5. 分号和引号写成中文标点符号,减号写成破折号,头文件尖括号写成圆括号,语句结束分号写成逗号;
    6. 错误的判断条件:判断时少写一个等号,或者大于小于弄反,或者和、或条件弄反,或者写成位运算,或者将指针与数值比较,或者取余使用除号;
    7. 分支关系复杂时没有使用标志变量;
    8. scanf参数没加“&”,或写错数组首地址;
    9. 没有在scanf中用"\n"或使用getchar吸收回车;
    10. 输入有空格的字符串错误地使用了scanf而不是gets
    11. 使用getchar错误地把输入字符当做参数而不是返回值;
    12. 忘了把循环变量或者标志变量或者临时变量声明或初始化为0或-1,或者初始化错误;
    13. 忘了循环变量自增,或者累加,或者累加步长错误
    14. continue和break搞混;
    15. 逻辑错误,如使用了错误的数组名或变量,或者执行顺序错误;
    16. 数组定义没用中括号,或使用未初始化变量;
    17. 忘记数组下标是0-based;
    18. 二维数组行列弄反,如矩阵相乘时;
    19. 调用数组多写了中括号,调用指针时错误地进行了解引用或者没有取地址
    20. 数组指针解引用错误,没加括号或者括号不对;
    21. 使用行乘以总列数加列来获取数组元素时,注意总列数是不是提前宏定义的;
    22. 交换两个数要通过指针,交换指针指向的内容不能交换指针本身;
    23. 链表头指针、前指针与当前指针赋值关系混乱;
    24. 使用malloc, free等函数时没有引用头文件stdlib.h,使用sqrt等函数时没有引用math.h
    25. 数据类型错误,如整数和浮点数计算,输入字符或浮点数用了"%d",输出整数用了"%3f",输出字符用了"%s",返回浮点数但函数定义为int型,结构体指针赋值给了整型指针,数据赋值给了指针,计算浮点数绝对值使用abs而不是fabs
    26. 浮点数比较相等直接使用==而不是fabs(a-b)<1e-3
    27. sizeof使用出错;
    28. 非void函数忘记返回;
    29. 函数参数数量或类型不正确;
    30. 折半查找法下标弄错;
    31. 字符串常量没有加引号;
    32. 比较字符串相等没有使用string.h中的strcmp函数;
    33. 忽略字符串中空格和结束符都需要占用空间,初始化大小不够;
    34. 结构体定义缺少struct关键字

    题目集

    分支和循环

    1. 以下程序功能是实现求10000 以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果。该程序中有8处错误,请调试并改正。不允许改变程序结构和大量地增删语句。只有全部正确才能得分。
    #include <stdio.h>
    #define LEN=10000;            //      #define LEN 10000
    int main(void)
    {
        int i,k,m,n,s,p;                        // int i,k,m,n,s,p=0;  
        int a(100);                     //int a[100]; 
        printf("Number as follows:");       //答案的follows改成了follew,答案错了    
        for (i=2; i<= LEN; i++)          
        {
            s=0;
            m=0;
            k=1;
            while(k<=i/2);                   //while(k<=i/2)
            {
                if (i%k==0)
                {
                    s=s+k;
                    a[m]=k;
                    m=m+1;
                }
     									//k++;
            }
            if (s=i)                    // if (s==i) 
            {
                p=p+1;
                printf("\n%d=%d",s,a[0]);
                n=1;
                while (n > m)            //  while (n < m) 
                {
                    printf("+%d,a[n]);          //printf("+%d",a[n]); 
                    n=n+1;
                }
            }
        }
        printf("\nTotal Num: %d",p);
        return 0;
    }
    
    1. 求100~200间的全部素数(即质数),要求每行输出10个素数。
    #include <stdio.h> 
    						//#include <math.h>
    main() 
    { 
      int m,k,i,n; //int m,k,i,n=0;
      for(m=101;m<=200;m+=2) 
      { 
          if(n%10==0) 
              printf("\n"); //实际上这个if应该移到下面的if里面,答案没有考虑
          k=sqrt(m); 
          for(i= 1;i<=k;i++) 
             if(m%i==0)  
                 continue; //break;
          if(i==m%10) //if(i>k)
          { 
               printf("%d ",m)//printf("%d ",m); 分号
               n++;
          } 
      } 
    }
    
    1. ※利用泰勒级数sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! … 计算sin(x) 的值。
      要求最后一项的绝对值小于10^(-5),并统计出此时累加了多少项。
    #include  <math.h>
    #include  <stdio.h>
     
    main()
    {
        int n = 1,count = 1;
        float x;
        double sum , term;          
     
        printf("Input x: ");
        scanf("%d", &x);     		//scanf("%f", &x);
     
        sum = x;
        term = x;                   
        do
        {
             
            term = -term*x*x/(n+1)*(n+2);		//term = -term*x*x/(n+1)/(n+2);
            sum = sum + term;           
            n++;								//n+=2;
            count++;							
        }while (fabs(term) <= 1e-5);			//}while (fabs(term) > 1e-5);
     
        printf("sin(x) = %f, count = %d\n", sum, count);
    }
    
    1. 下面程序用于输入三角形的三条边a,b,c,判断它们能否构成三角形,若能,则指出是何种三角形:等腰三角形、直角三角形、等腰直角三角形,一般三角形。若不能,则输出“不是三角形\n”。允许的浮点数计算误差在0.1范围内。
      请修改下面程序,使其运行结果完全正确。只有全部错误都修改正确才给分,部分错误修改正确不给分。允许修改和增加语句,但是不允许删除语句,也不要修改变量的类型。
    #include <stdio.h>
    #define LIMIT = 1e-1;			//#define LIMIT  1e-1
    int main()
    {
        float   a, b, c;
        											//int flag=1;
        scanf("%d, %d, %d", a, b , c);			//  scanf("%f, %f, %f", &a, &b , &c);
        if (a + b > c || b + c > a || a + c > b) //    if (a + b > c && b + c > a && a + c > b)
        {
            if (fabs(a - b) <= LIMIT | fabs(b - c) <= LIMIT | fabs(c - a) <= LIMIT)//if (fabs(a - b) <= LIMIT || fabs(b - c) <= LIMIT || fabs(c - a) <= LIMIT) 有相似题目的错误是此处直接写成了相等
            {
                printf("等腰");     
                				//flag=0;      
            }
            else if (fabs(a * a + b * b - c * c) <= LIMIT		//if (fabs(a * a + b * b - c * c) <= LIMIT  有相似题目的错误是此处直接写成了相等
                     && fabs(a * a + c * c - b * b) <= LIMIT		//|| fabs(a * a + c * c - b * b) <= LIMIT
                     && fabs(c * c + b * b - a * a) <= LIMIT)		//|| fabs(c * c + b * b - a * a) <= LIMIT)
            {
                printf("直角");     
                				//flag=0;      
            }
           else				//if(flag)
            {
                printf("一般");
            }
            printf("三角形\n");
        }
        else
        {
            printf("不是三角形\n");
        }
       return 0;
    }
    

    算术表达式、数据类型和输入输出

    1. 有关输入输出问题。
      输入为:
      1↙
      2↙
      a↙
      b↙
      运行结果为:1,2,a,b,123.300000,65535
      请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    
    main()
    {
        int b;		//double b; 注意改成float精度不够
        unsigned short a = 65535;
        short k = a;
        char c, d;
        int f, g;
    
        b = (1234.0 - 1) / 10;
        scanf("%c", &c);
        scanf("%c", &d);	//scanf("\n%c", &d);
        scanf("%d", &f);	//scanf("\n%c", &f);
        scanf("%d", &g);	//scanf("\n%c", &g);
        printf("%c,%c,%c,%c,%f,%d", c, d, f, g, b, a); //原题写了一半,手动补全
        }
    
    1. 马克思手稿中有一道趣味数学题:有30个人,其中可能有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
      假设男人为x人,女人为y人,小孩为z人,则有以下方程组:
      {x+y+z=303x+2y+z=50\begin{cases}x+y+z=30\\3x+2y+z=50\end{cases}
    								//#include <stdio.h>
    main()
    { 
        int x,y,z;
        printf("Man \t Women \t Childern\n");
        for (x=0; x<16; x++) //for (x=1; x<16; x++)
            for (y=0; y<25; y++) //for (y=1; y<25; y++)
            {
                z = 30 – x - y;	//z = 30 - x - y; 魔鬼吧!
                if (3 * x + 2 * y + z = 50)  //if (3 * x + 2 * y + z == 50)
                    printf("%3f\t %5f\t %8f\n",x,y,z);    //   printf("%3d\t %5d\t %8d\n",x,y,z);  
            }
    }
    
    1. 比较两个字符的大小,按由小到大输出。运行时输入数据:34↙
      请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    
    main()
    {
        char t, c1, c2;
    
        getchar(c1), getchar(c2);		//c1=getchar();c2=getchar();
        if (c1 > c2)				//if (c1 > c2){
            t = c1;
        c1 = c2;
        c2 = t;
        				//}
        printf("%c,%c", c1, c2);
    }
    
    1. 利用pi/2=2/1 *2/3 *4/3 *4/5 *6/5 6/7…的前100项之积,编程计算pi的值。
    #include  <stdio.h>
    main()
    {
        double term, result;  //double term, result=1;
        int n;
     
        for (n=2, n<=100, n++)	//for (n=2; n<=100; n+=2)
        {
            term = (n * n) / ( n - 1) * ( n + 1);   //term = (n * n) / ( n - 1.0) / ( n + 1);
            result = result * term;
        }
        printf("result=%f\n", 2 * result);
    }
    
    1. 求输入两个数的和、差、积、商和余数(如果是浮点数,则需将其强转为整型后计算余数)。请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    
    main()
    {
        float a, b;
        float sum, minus, product, quotient;
        int remainder;
    
        printf("\n请输入两个数:\n");
        scanf("%f\n%f", a, &b);				// scanf("%f\n%f", &a, &b);
        sum = a + b;
        minus = a - b;
        product = a * b;
        quotient = a / b;
        remainder = a % b;					// remainder = (int)a % (int)b; 注意强制转换,数据类型要加括号
        printf("和为:%.2f\n", sum);
        printf("差为:%.2f\n", minus);
        printf("积为:%.2f\n", product);
        printf("商为:%.2f\n", quotient);
        printf("余数为:%d\n", remainder);
    }
    

    函数

    1. 求1+2+…+n之和。请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    
    unsigned long fun(int n);
    
    main()
    {
        int n;
        unsigned long  sum = 0;
        printf("Input n:");
        scanf("%d", &n);
        while (n)
        {
            sum = fun(n--);       //sum += fun(n--);
        }
        printf("The sum is :%u", sum);
    }
    
    unsigned long fun(int n)  //这个函数什么意思至今不懂
    {
        unsigned long  m_sum = 0;
        m_sum += n;
        return m_sum;
    }
    
    #include <stdio.h> 
    unsigned long Factorial(unsigned int n); //unsigned long Factorial(unsigned int n)
    {	
    	if (n < 0)
    	{
    		printf("data error!");
    		return 0;
    	}
    	else if (n==0 && n==1)		//else if (n==0 || n==1)	
    	{
    		return 1;
    	}
    	else 
    	{
    		return n * Factorial(n-1); 
    	}
    } 
    main()
    {
            int n;
    	unsigned long x;
    	printf("Input n:\n");
    	scanf("%d", n);					//scanf("%d", &n);
    	x = Factorial(n);
    	printf("%d!=%ld\n", n, x);
    }
    
    1. 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):
      输入某年某月某日,计算并输出它是这一年的第几天。
      /* 函数功能: 对给定的某年某月某日,计算它是这一年的第几天
      函数参数: 整型变量year、month、day,分别代表年、月、日
      函数返回值:这一年的第几天 */
      int DayofYear(int year, int month, int day);
      下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
    #include <stdio.h>
    int DayofYear(int year, int month, int day);
    int dayTab[2][13] =
    {
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
     
    main()
    {
        int year, month, day;
        printf("Please enter year, month, day:");
        scanf("%d,%d,%d", year, month, day);	// scanf("%d,%d,%d", &year, &month, &day);//
        printf("yearDay = %d\n" DayofYear(year, month, day));    //printf("yearDay = %d\n" ,DayofYear(year, month, day));//
    }
    int DayofYear(int year, int month, int day);
    {
        int i, leap;
        leap = year / 4 = 0 & year / 100 != 0 | year / 400 = 0;	//leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
        for (i = 0, i < month, i++);		//for (i = 0, i < month, i++)
        {
            day = day - dayTab[leap][i];		//day = day + dayTab[1-leap][i];
        }
        										//return day;
    }
    
    1. 函数fun()功能是:将所有大于1小于整数m的素数存入xx所指向的数组中,素数的个数通过k传回。
      例如输入25,则应输出 :
      There are 9 prime numbers less than 25:
      2 3 5 7 11 13 17 19 23
    #include <stdio.h>
    
    void fun(int m, int *k, int xx[])
    {
        int i,j,t;
        int n;  		//int n=0;
        for(i=2;i<m;i++)
        {
            t=1;
            for(j=2;j<i;j++)
            {
                if(i/j==0) 	//if(i%j==0)
                {
                    t=0;
                       ;  //break;
                }
            }
            if(t=1); 	//if(t==1)
            xx[n++]=j; 	//xx[n++]=i;
        }
        k=n;  		//*k=n; 
    }
    main()
    {
        int m,n,zz[100];
        printf("Please enter an integer number between 10 and 100:\n");
        scanf("%d",&n);
        fun(n,m,zz);   	//fun(n,&m,zz);
        printf("There are %d prime numbers less than %d:\n",m,n);
        for(n=0;n<m;n++)
        {
            printf("%4d",zz[i]); //printf("%4d",zz[n]); 
        }
    }
    
    1. Fibonacci数定义如下:当n=0时,fib(n)=0;当n=1时,fib(n)=1;当n>1时,fib(n)=fib(n-1)+fib(n-2)。以下程序计算Fibonacci数列并打印出计算Fibonacci数列每一项时所需的递归调用次数,请改正程序中的错误。
      运行示例:
      Input n:5
      Fib(0)=0, count=1
      Fib(1)=1, count=1
      Fib(2)=1, count=3
      Fib(3)=2, count=5
      Fib(4)=3, count=9
      Fib(5)=5, count=15
    #include <stdio.h>
    long Fib(int a);
    						//int count = 0;
    int main()
    {
        int count = 0;		//移到上面
        int n, i, x;
        printf("Input n:");
        scanf("%d", &n);
        for (i = 1; i <= n; i++)//for (i = 0; i <= n; i++)
        {
        						//count=0;
            x = Fib(i);
            printf("Fib(%d)=%d, count=%d\n", i, x, count);
        }
        return 0;
    }
     
    long Fib(int n)
    {
        								//count++;
        if (n == 0)   return 0;
        if (n == 1)   return 1;
        count++;					//移到上面
        return (Fib(n - 1) + Fib(n - 2));
    }
    
    1. 编程计算矩阵相乘之积。找出下列程序中的错误并改正之。
    #include<stdio.h>
    #define  ROW = 2;		//#define  ROW  2
    #define  COL = 3;		//#define  COL  3
    						//void MultiplyMatrix(int a[ROW][COL],int b[COL][ROW], int c[ROW][ROW]) ;
    main()
    {
        int a[ROW][COL], b[COL][ROW], c[ROW][ROW], i, j;
        printf("Input array a:\n");
        for (i=0; i<ROW; i++)
        {
            for (j=0; j<COL; j++)
            {
                scanf("%d", a[i][j]);	// scanf("%d", &a[i][j]);
            }
        }
        printf("Input array b:\n");
        for (i=0; i<COL; i++)
        {
            for (j=0; j<ROW; j++) 
            {
                scanf("%d", b[i][j]);	//scanf("%d", &b[i][j]);
            }
        }
        MultiplyMatrix(a, b, c);
        printf("Results:\n");
        for (i=0; i<ROW; i++)
        {
            for (j=0; j<ROW; j++) 
            {
                printf("%6d", c[i][j]);
            }        
        }
        				//printf("\n"); 否则本题不通过
    }
    void MultiplyMatrix(int a[ROW][COL],int b[COL][ROW], int c[ROW][ROW]) 
    {
        int i, j, k;
        for (i=0; i<ROW; i++)
        {
            for (j=0; j<ROW; j++)
            { 
                 							//c[i][j]=0;
                for (k=0; k<COL; k++)
                {
                    c[i][j] = c[i][j] + a[i][k] * b[j][k];//c[i][j] = c[i][j] + a[i][k] * b[k][j];
                }
            }
        }
    }
    
    1. ※下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
    #include <stdio.h>
    #include <math.h>
    void fun(int a, int *b, int *c);
    main()
    {
        int a, b, c;
        do
        {
            printf("Input a:\n");
            scanf("%d", &a);
        }
        while (a % 2)				//while (a % 2); 注意判断条件无误
            fun(a, b, c);			//fun(a, &b, &c);
        printf("%d = %d + %d\n", a, b, c);
    }
     
    void fun(int a, int *b, int *c);	//void fun(int a, int *b, int *c)
    {
        int i, j, d, y;
        for (i = 3; i <= a / 2; i = i + 2)
        {
            y = 1;
            for (j = 2; j <= sqrt((double)i); j++)
            {
                if (i % j != 0)		//if (i % j == 0)
                {
                    y = 0;
                }
            }
            if (y = 1)
            {
                d = i - a;			//d = a - i;
                for (j = 2; j <= sqrt((double)d); j++)
                {
                    if (d % j == 0)
                        y = 1;		//y = 0;
                }
                if (y == 1)
                {
                    b = i;			//*b = i;
                    c = d; 			//*c = d;
                }
            }
        }
     
    }
    
    1. ※下列给定程序中,函数fun的功能是:用下面的公式求pi的近似值,直到最后一项的绝对值小于指定的数(参数 num)为止。 pi/4≈1-1/3+1/5-1/7+…
    #include <stdio.h>
    #include <math.h>
    int fun(float num)		//float fun(float num)
    {
        int s;
        float n,t,pi;
        t=0;			//t=1;
        pi=0;			//pi=1;
        n=0;			//n=1;
        s=-1;			//s=1;
        while(t>=num);
        {
            pi=pi+t;			//n=n+2;
            n=n+1;				//s=-s;
            s=+s;				//t=s/n;
            t=s%n;				//pi=pi+t;
        }
        pi=pi*4;
        return pi;
    }
    main()
    {
        float n1,n2;
        printf("Enter a float number: ");
        scanf(" %d",&n1);		// scanf(" %f",&n1);
        n2=fun(n1);
        printf( "%6.4f\n ",n2);
    
    }
    
    1. 根据如下性质,设计函数MaxCommonFactor(),计算两个正整数的最大公约数。
      性质1:当a>b时,计算a与b的公约数等价于计算a-b与b的公约数。
      性质2:当a<b时,计算a与b的公约数等价于计算a与b-a的公约数。
      性质3:当a=b时,a与b的公约数等于a或b。
      请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    int MaxCommonFactor(int a, int b);
    main()
    {
        int a, b, x;
        printf("Input a,b:");
        scanf("%d,%d", a, b);			//scanf("%d,%d",&a, &b);
        x = MaxCommonFactor(int a, int b);	// x = MaxCommonFactor(a, b);
        if (x < 0)  printf("Input Error!\n");
        printf("%d\n", x);
    }
    int MaxCommonFactor(int a, int b)
    {
        if (a <= 0 || b <= 0)	
            return -1;
        while if (a != b);			//while(1)
        {
            if (a > b)	
                 return a - b;		//a= a - b;
            else if (b > a)
                 return  b - a;		//b=  b - a;
            else return a;
        }
    }
    
    1. 以下程序的功能是求如下表达式的值。
      s=1+1/(1+2)+1/(1+2+3)+1/(1+2+3+4)……+1/(1+2+3+……+n)
      其中:n的值由键盘输入。请改正程序中的错误,使之能够得到正确的运行结果。
    #include <stdio.h>
    					//float fun(int n);
    main()
    {
        int n;
        printf("please input a number:");
        scanf("%d",n);			//scanf("%d",&n);
        printf("%10.6f\n",fun(n));
    }
    float fun(int n)
    {
        int i,j,t;
        float s;			// float s=0;
        for(i=1;i<=n;i++)	
        {
             t=0;
             for(j=1;j<=n;j++)			//for(j=1;j<=i;j++)
             {    
                 t=t+j;
             }
             s=s+1/t;			//s=s+1.0/t;
             					//}
        return s;
    }
    
    1. 在下面这个程序中,要求其实现的功能是对用户输入的任意整数计算其阶乘,输入小于等于-1的数时退出程序。下面给出的是一个有错误的程序,请找出其中的错误,并改正之。
    #include <stdio.h> 
    #define END  -1;       			//#define END  -1
    long Factorial(int x); 			//int Factorial(int x);
    main() 
    { 
        int x; 
        while (1);           		// while (1)
        { 
            printf("input x:);  	//printf("input x:");
            scanf("%d", x);       	//scanf("%d", &x);
            if (x <= END) 
                break            	//break;    
            else
                printf("%d! = %d\n", x, Factorial(x));  
        } 
    } 
      
    long Factorial(int x) 			//  int Factorial(int x)
    { 
        int i; 
        int result;             	//int result=1;  
      
        for (i=1, i<=x, i++) 		//for (i=1; i<=x; i++)
            result *= i; 
          							// return result;                              
    }
    
    1. 函数fun功能:由大到小输出两实数。请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    						//fun(float a, float b);
    main()
    {						
    							//float a,b;
        fun();					//fun(a,b);
    }
    fun(float a, float b)
    {
        float t;
        scanf("%f%f", &a, &b);		//这里"%f%f"没有错,两个数之间只要有任意非数字隔开就可以
        if (a < b)
        {
            t = a;
            a = b;
            b = t;
        }
        printf("%5.2,%5.2f\n", &a, &b);			//printf("%5.2f,%5.2f\n", a, b);
    }
    

    字符串

    1. 下面的程序将数字进行加密,其中的每一个数字转化为另一个不同的数字。请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    
    main()
    {
        char s[] = "24635", c, i;		//char s[] = "24635", c=s[0], i;
    
        for (i = 0; c = s[i]; i++)
        {
            switch ((c - '0')	// switch (c - '0')
            {
            case 2:
            case 3:
                putchar(c + 4);
                continue;	//break;
            case 4:
                putchar(c + 4);
                break;
            case 5:
                putchar(c + 3);
                					//break;
            default:
                putchar(c + 2);
            }
            putchar('\n');
        }
    }
    //本题答案是一行一个字母输出(而且default还会额外输出一行),显然不够标准,如果想要效果更好,完全可以吧break全换成continue,在一行内输出字符串(continue对应for,而break对应switch)
    
    1. 任意输入英文的星期几,通过查找星期表,输出其对应的数字,若查到表尾,仍未找到,则输出错误提示信息。
    #include  <stdio.h>
    						//#include <string.h>
    #define   WEEKDAYS  7
    #define   MAX_STR_LEN  10
    main()
    {
        int i, pos;
        int findFlag; //int findFlag=0;
        char x[MAX_STR_LEN];
        char weekDay[][MAX_STR_LEN] = {"Sunday", "Monday", "Tuesday",
                                       "Wednesday", "Thursday", "Friday", "Saturday"
                                      };
        printf("Please enter a string:\n");
        scanf("%s", &x[i]);		//scanf("%s", x);
        for (i = 0; i < WEEKDAYS || !findFlag; i++)//for (i = 0; i < WEEKDAYS && !findFlag; i++)
        {
            if (x[i] == weekDay[i])		//if (strcmp(x,weekDay[i])==0)
            {
                pos = i;
                findFlag = 1;
            }
        }
        if (findFlag)
        {
            printf("%s is %d\n", x, pos);
        }
        else
        {
            printf("Not found!\n");
        }
    }
    
    1. 将字符串“Hello World”读入字符数组中去。请改正程序中的错误,使它能得出正确的结果。
    #include <stdio.h>
    #include <string.h>
    
    main()
    {
        char ch[10];		//char ch[12];
    
        scanf("%s", ch);	//gets(ch); 注意gets将回车读走,但不作为字符串一部分,11个字符加一个'\0'正好12个字符
        if (!strcmp(ch, "Hello World"))
            printf("OK!");
        else
            printf("Error!");
    }
    
    1. 改错题:用户从键盘任意输入一个数字表示月份值n,程序显示该月份对应的英文表示,若n不在1~12之间,则输出“Illegal month”。
    #include <stdio.h>
    main()
    {
        int n;
        char monthName[][20] = {Illegal month, January, February, March, April, May, June, July, August, September, October, November, December};//char monthName[][20] = {"Illegal month", "January", "February", "March","April", "May", "June", "July", "August", "September", "October", "November", "December"};
     
        printf("Input month number:");
        scanf("%d", n);
        if ((n < 12) || (n > 1))		//if ((n <= 12) && (n >= 1))
        {
            printf("month %d is %c\n", n, monthName[n][n]);		// printf("month %d is %s\n", n, monthName[n]);
     
        }
        else
        {
            printf("%s\n", monthName[0][0]);		//printf("%s\n", monthName[0]);
        }
    }
    

    数组 - 查找与排序

    1. 从键盘输入某单位职工的月收入(人数最多不超过40人),当输入负值时,表示输入结束,编程从键盘任意输入一个职工号,查找该职工的月收入。
    #include <stdio.h>
    #define N 40
    int ReadScore(int income[], long num[]);         
    int LinSearch(long num[], long x, int n);         
    int main()
    {
    	int income[N], n, pos;
    	long num[N], x;
    	n = ReadScore(income, num);  
    	printf("Total number is %d\n", n);
    	printf("Input the searching ID:");
    	scanf("%d", &x);          	 
    	pos = LinSearch(num, x, n); 
    	if (pos != -1)              	 
    	{  
    		printf("income = %d\n", income[pos]); 
    	}
    	else                      			
            {   
    		printf("Not found!\n");    
    	}
    	return 0;
    }
    
    int ReadScore(int income[], long num[]) 
    {
    	int i          //int i=-1;
    	do{
    		i++;
    		printf("Input person's ID and income:");
    		scanf("%d%d", num[i], income[i]); //scanf("%d%d", num[i], income[i]);
    	} while (num[i] >0 && score[i] >= 0); //} while (num[i] >0 && income[i] >= 0);
    	return i;                                   
    }
    
    int LinSearch(long num[], long x, int n) 
    {
    	int  i;  
    	for (i=0; i<=n; i++)                 
    	{	
    		if (num[i] = x)  return (i); //if (num[i] == x)  return (i);
    	}
    	return (-1);                           
    }
    
    1. 程序改错,实现从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
    #include  <stdio.h>
    #define ARRSIZE 10;  //#define ARRSIZE 10
     
    void  MaxMinExchang(int a[], int n)
    {
        int  maxValue=a[0], minValue=a[0], maxPos, minPos;//int  maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;
        int  i, temp;
     
        for (i=1; i<n; i++)  //for (i=0; i<n; i++)
        {
            if (a[i] > maxValue)
            {
                    maxValue = a[i];
                    maxPos = i;
            }
            else if (a[i] < minValue)
            {
                    minValue = a[i];
                    minPos = i;
            }
        }
        temp = a[maxPos];
        a[maxPos] = a[minPos];
        a[minPos] = temp;
    }
     
    int main()
    {
        int a[n], i, n; //int a[ARRAYSIZE], i, n;
     
        printf("Input n(n<=10):");
        scanf("%d", &n) ;
        printf("Input %d Numbers:\n", n);
        for (i=0; i<n; i++)
        {
            scanf("%d", &a[i]);
        }
     
        MaxMinExchang(a[], n);  //MaxMinExchang(a, n);
     
        printf("After MaxMinExchange:\n");
        for (i=0; i<n; i++)
        {
                printf("%4d", a[i]);
        }
        printf("\n");
           return 0;
    }
    
    1. 下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。该程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
    #include  <stdio.h>
    #define n = 10;		//#define N 10 注意改了三处,n与下面定义的n冲突
    					//void  MaxMinExchang(int *a, int n);
    int main()
    {
        int a[n], i, n;				//int a[N], i, n;
     
        printf("Input n(n<=10):\n");
        scanf("%d", n) ;		//scanf("%d", &n) ;
     
        printf("Input %d Numbers:\n", n);
        for (i = 0; i < n; i++)
        {
            scanf("%d", a[i]);	//scanf("%d", &a[i]);
        }
     
        MaxMinExchang(a, n);
     
        printf("After MaxMinExchange:\n");
        for (i = 0; i < n; i++)
        {
            printf("%d ", a[i]);
        }  
        return 0;
    }
    void  MaxMinExchang(int *a, int n)
    {
        int  maxValue = *a, minValue = *a, maxPos, minPos;	//int  maxValue = *a, minValue = *a, maxPos=0, minPos=0;
        int  i, temp;
        for (i = 0; i < n; i++)
        {
            if (*a + i > maxValue)	//if *(a + i) > maxValue
            {
                maxValue = *a + i;	//maxValue = *(a + i);
                maxPos = i;
            }
            if (*a + i < minValue)	//if (*(a + i) < minValue)
            {
                minValue = *a + i;	//minValue = *(a + i);
                minPos = i;
            }
        }
        temp = *a + maxPos;	//temp = *(a + maxPos);
        *a + maxPos = *a + minPos;	//*(a + maxPos) = *(a + minPos);
        *a + minPos = temp;	//*(a + minPos) = temp;
    }
    
    
    1. 给下面程序改错。程序功能是输入10个数,按从小到大顺序排序。
    #include  <stdio.h>
    #define SIZE 10; //#define SIZE 10
    main( )
    { int  i, j, t, a[SIZE];
       printf("input  10  numbers: \n");
       for(i = 1;i <= SIZE;i++) 
             scanf("%d", a[i]); //scanf("%d", a[i-1]);
       printf("\n");
       for (i = 0; i< SIZE; i++) 
           for (j = SIZE - 1; j >= i + 1; j--)
               if (a[j] > a[j-1])  //if (a[j] < a[j-1]) 
               {
            t=a[j];  //t=a[j-1];  
            a[j-1]=a[j]; 
            a[j]=t;    
            }
       for (i = 0; i < SIZE; i++)
          printf("%d\n", a[i]);
    }
    
    1. 在数组元素中找最大值及其所在下标位置。
    #include <stdio.h>
    #define n=10;	//这道题的n比较混乱,下面使用的n但是宏定义只能定义大N不然会与函数中的形参重复。改为#define N 10
    int FindMax(int num[], int n, int *pMaxPos);
    main()
    {
    	int num[n], maxValue, maxPos, minValue, minPos, i;	//int num[N], maxValue, maxPos=0, minValue, minPos, i, n=N;
    	printf("Input %d numbers:\n",n);
    	for (i=0; i<n; i++)
    	{
    		scanf("%d", &num[i]);                  
    	}                        
    	maxValue = FindMax(num, n, &maxPos);  
    	printf("Max=%d, Position=%d\n",	 maxValue, maxPos);    
    }
    int FindMax(int num[], int n, int *pMaxPos)  
    {
    	int i, max = num[0];
    	for (i=1; i<n; i++)
    	{
    		if (num[i] > max)
    		{
    			max = num[i];
    			*pMaxPos = i;
    		}
    	} 	
    	return max;
    }
    
    1. 下面程序采用折半查找法在10个有序数中寻找某个数,如果找到,输出其所在数组中下标的位置,否则,输出没找到。
    #include <stdio.h>
    main( )
    {
        int  up=10, low=1, mid,found, find;      //int  up=9, low=0, mid,found=0, find;
        int  a[10]={1, 5, 6, 9, 11, 17, 25, 34, 38, 41};
        scanf("%d", find);      //scanf("%d", &find);
        printf("\n");
        while (up>=low  ||  !found)	// while (up>=low  &&  !found)
        {
            mid=(up+low)/2;
            if(a[mid]=find)			 //if(a[mid]==find)
            {
                found=1;  
                break;
            }
            else  if(a[mid]>find)
                    up=mid+1;		// up=mid-1;
                  else   
                    low=mid-1;		//low=mid+1;
        }
        if(found) 
            printf("found number is %dth.\n",mid);
        else 
            printf("no  found.\n");
    }
    
    1. 下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a[0]中的数对调,次最小数和a[1]中的数对调。
    #include <stdio.h>
    #define N 20
    void fun(int *a,int n)
    {
        int i, m, t, k;
        for(i=0; i<n; i++)	//for(i=0; i<2; i++)
        {
            m=i;
            for(k=i; k<n; k++)
               if(a[k]<a[m])
                k=m;		//m=k;
            t=a[k]			//t=a[m];
            a[k]=a[i];		//a[m]=a[i];
            a[i]=t;			
        }
    }
    int main()
    {
        int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
        for(i=0; i<n; i++)
            printf("%d ",b[i]);
        printf("\n");
        fun(b,n);
        for(i=0; i<n; i++)
            printf("%d ", b[i]);
        printf("\n");
        return 0;
    }
    
    
    1. 下面程序使用选择排序算法,对从键盘输入的学生成绩按降序排序,请找出其中的错误,并改正之。
    #include<stdio.h>
    #define N 40
    void ReadScore(int score[], int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d", score[i]); //scanf("%d", &score[i]); 
        }
    }
    void WriteScore(int score[], int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            printf("%d ", score[i]);
        }
    }
    void Swap(int x, int y)	//void Swap(int *x, int *y)
    {
        int temp;
         
        temp = x;	// temp = *x;
        x = y;		//*x = *y;
        y = temp;	//*y = temp;
    }
    void DataSort(int score[], int n) 
    {
        int i, j, k;
        for (i=0; i<n-1; i++)
        {
            k = i;
            for (j=i+1; j<n; j++)      
            {
                if (score[j] > score[k]) 
                {
                    k = j;    
                }
            }
            if (k != j)    //  if (k != i) 
            {    
              Swap(score[k],score[j]); 		//Swap(&score[k],&score[i]);
            }  
        }
    }
    int  main()
    {
        int score[N],aver,n;
        printf("Input n:\n");
        scanf("%d",&n);
        ReadScore(score, n );
        DataSort(score,n);
        WriteScore(score,n);
        return 0;
    }
    
    
    1. 下面程序用于从键盘输入34矩阵的元素,通过调用函数FindMax,求出这34矩阵元素中的最大值及其所在行列位置,然后输出这个最大值及其所在行列下标位置(注意下标从0开始)。(找出其中的4处错误,并改正之)
    #include <stdio.h>
    int FindMax(int x[3][4],int *pRow,int *pCol);
    main()
    { 
        int a[3][4], max, i, j, row, col; //int a[3][4], max, i, j, row=0, col=0; 这句可能算两处错误吧
         
        for (i=0; i<3; i++)
        {
            for (j=0; j<4; j++)  
            {
                scanf("%d",a[i][j]); //scanf("%d",&a[i][j]); 
            }
        }
        max = FindMax(a,&row,&col);
        printf("max=%d,row=%d,col=%d\n",max,row,col);
    }    
    int FindMax(int x[3][4],int *pRow,int *pCol)
    { 
        int max, i, j;
        max = x[0][0]; 
        for (i=0; i<3; i++)
        {
            for (j=0; j<4; j++)
            {
                if (x[i][j] > max); //if (x[i][j] > max)
                { 
                    max = x[i][j]; 
                    *pRow = i; 
                    *pCol = j; 
                }
            }
        }   
        return max;
    }
    
    1. 程序改错。在一个3x4矩阵中找出最大数及最大数所在元素的下标。
    #include <stdio.h>
    #define M 3
    #define N 4
    int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol) //int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol);
    main()
    {
        int score[M][N], i, j, maxScore, row, col;
        for ( i=0; i<M; i++ )
        {
              for ( j=0; j<N; j++ )
              {
                   scanf("%d", &score[i][j]);
              }
        }
        maxScore = FindMax(*score, M, N, &row, &col);// maxScore = FindMax(score, M, N, &row, &col);
        printf("%d %d %d\n", maxScore, row+1, col+1);
    }
     
    int FindMax( int (*p)[N], int m, int n, 
    int *pRow, int *pCol )
    {
        int  i, j, max;
        max = *(p);			//max = *(*(p));
        pRow = 0; 			//*pRow = 0;
        pCol = 0; 			//*pCol = 0;
        for (i=0; i<m; i++)
        {
            for (j = 0; j<n; j++)
                    {
                if ( *(*(p+i)+j) > max )
                            {
                    max = *(*(p+i)+j) ;
                    *pRow = i;
                    *pCol = j;
                            }
            }
        }
         							//return max;
    }
    
    
    1. 下面程序功能是在一个一维数组中找出其中最大的数及其下标。请改正程序中的错误,使之能得到正确的结果。
    #define N 10
    #include <stdio.h>
    float fun(int *a,int *b,int n)
    {
        int *c,max=*a;
        for(c=a+1;c<a+n;c++)
        {
            if(*c>max)
            {
                max=*c;
                b=c-a;		//*b=c-a;
            }
         }
         return max;
    }
    main()
    {
        int a[N],i,max,p=0;
        printf("please  input 10 intergers:\n");
        for(i=0;i<N;i++)
        {
            scanf("%d",a[i]);		//scanf("%d",&a[i]);
        }
        max=fun(a,p,N);				//max=fun(a,&p,N);
        printf("max=%d,position=%d\n",max,p);
    }
    
    1. 将5*5的矩阵A转置(即行变列,列变行),并将行列互换即转置前、后的矩阵分别打印出来。
    #include (stdio.h)			//#include <stdio.h>
    main()
    {
        int  a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21}, i, j;
     						//注意数组初始化时,后面的元素自动赋值为0
        printf(“before transposition\n”);		//printf("before transposition\n");
        for (i=0; i<=4; i++)
           for (j=0; j<=4; j++)
                 printf("%4d%s", a[i][j],j-4?' ':'\n' ); //printf("%4d%c", a[i][j],j-4?' ':'\n' );
        for (i=0; i<=4; i++)				//for (i=0; i<=2; i++)
           for (j=0; j<=4; j++)				//for (j=i; j<=4; j++)
           {
                t=a[i][j];			//int t=a[i][j];	
                a[i][j]=a[j][i];
                a[j][i]=t;
           }
        printf(“after transposition\n”);		//printf("after transposition\n");
        for (i=0; i<=4; i++);			//for (i=0; i<=4; i++)
           for (j=0; j<=4; j++)
                 printf("%4d%s", a[i][j],j-4?' ':'\n' );//printf("%4d%c", a[i][j],j-4?' ':'\n' );
    }
    
    1. ※输入m个学生(最多为30人)n门课程(最多为5门)的成绩,然后计算并打印每个学生各门课的总分和平均分。其中,m和n的值由用户从键盘输入。
    #include  <stdio.h>
    #define STUD   30           /* 最多可能的学生人数 */
    #define COURSE 5            /* 最多可能的考试科目数 */
    void  Total(int *pScore, int sum[], float aver[], int m, int n);
    void  Print(int *pScore, int sum[], float aver[], int m, int n);
    int main()
    {
        int     i, j, m, n, score[STUD][COURSE], sum[STUD];
        float   aver[STUD];
        printf("How many students?");
        scanf("%d", &m);
        printf("How many courses?");
        scanf("%d", &n);
        printf("Input scores:\n");
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
            {
                scanf("%d", &score[i][j]);
            }
        }
        Total(*score, sum, aver, m, n);
        Print(*score, sum, aver, m, n);
        return 0;
    }
    void  Total(int *pScore, int sum[], float aver[], int m, int n)
    {
        int  i, j;
        for (i = 0; i < m; i++)
        {
            sum[i] = 0;
            for (j = 0; j < n; j++)
            {
                sum[i] = sum[i] + pScore[i * n + j];	// sum[i] = sum[i] + pScore[i * COURSE + j];	注意不能使用*(*(&pScore+i)+j)来获得数组元素,因为&pScore并不是原二维数组的地址。函数所能操作的只有比参数浅层的东西,要想动深层的东西,只能把参数改为更深层的(如二级指针)
            }
            aver[i] = (float) sum[i] / n;
        }
    }
    void  Print(int *pScore, int sum[], float aver[], int m, int n)
    {
        int  i, j;
        printf("Result:\n");
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("%4d\t", pScore[i * n + j]);		//printf("%4d\t", pScore[i * COURSE + j]);
            }
            printf("%5d\t%6.1f\n", sum[i], aver[i]);
        }
    }
    
    
    1. 对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序。
    #include <stdio.h>
    #define N 4
    void swap(int *p1, int *p2)
    {
    	int p;
    	p=p1;p1=p2;p2=p;			//p=*p1;*p1=*p2;*p2=p;
    }
    
    void sort(int a[N][N]) 
    {
    	int i,j,k;
    	for(i=0;i<N;i++)
    		for(j=0;j<N-1;j++)		//for(j=0;j<N;j++)
    			for(k=j+1;k<N-1;k++)		//for(k=j+1;k<N;k++)
    				if(i%2==0?a[i][j]<a[i][k]:a[i][j]>a[i][k])//if(i%2!=0?a[i][j]<a[i][k]:a[i][j]>a[i][k])
    					swap(a[i]+j,a[i]+k);		
    }
    void main(){
    	int a[N][N]={{3,4,2,1},{8,7,5,6},{12,10,11,9},{15,14,16,13}};
    	int i,j;
    	sort(a[N][N]);			//sort(a);
    	for (i=0;i<N;i++)
    	{
    		for(j=0;j<N;j++)
    			printf("%3d",a[i][j]);
    		printf("\n");
    	}
    }
    
    1. 阅读程序,fun函数功能是:交换数组aa中最大和最小两个元素的位置,结果依然保存在原数组中,其他元素的位置不变。注:数组中没有相同元素。
    #include <stdio.h>
    #include <stdlib.h>
    #define N 10
    int main()
    {
        int i;
        int aa[N] = {44, 55, 62, 42, 35, 52, 78, 95, 66, 73};
        printf("\n***original list***\n");
        for (i = 0; i < N; i++)
            printf("%4d", aa[i]);
        Fun(aa);
        printf("\n***new list***\n");
        for (i = 0; i < N; i++)
        {
            printf("%4d", aa[i]);
        }
        return 0;
    }
    void Fun(int aa[])
    {
        int i, t;
        int max = aa[0];				// int max = 0;
        int min = aa[0];				// int min = 0;
        for (i = 1; i < N; i++)
        {
            if (aa[i] < aa[max])			//if (aa[i] > aa[max])
                max = i;
            else if (aa[i] > aa[min])			// else if (aa[i] < aa[min])
                min = i;
        }
        t = aa[max];
        aa[min] = aa[max];			//aa[max] = aa[min];
        aa[min] = t;
    }
    
    1. 下面程序的功能是将数组元素倒置 ,找出其中的4处错误并改正之。
    #include "stdio.h"		//可以这样写
    #define M 5; //#define M 5
    main()
    {   int a[M]={1,2,3,4,5};
        int i,j,*t; 		//t实际应为int,但不改结果不错
        i=0;j=M-1;
        while(i)			//while(i<M/2)
        {   
            t=*(a+i);			
            *(a+i)=*(a+j);
            *(a+j)=t;
            i++;j++ 		//i++;j--;
        }
        for(i=0;i<M;i++) printf("%d",(a+i));	//for(i=0;i<M;i++) printf("%d",*(a+i));
    }
    

    指针与结构体

    1. 创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的学生学号和成绩打印输出。
    #include <stdio.h>  
    								// #include <stdlib.h>
    #define SIZE sizeof(struct node)
    struct node
    {
        long num;
        float score;
        struct node *next;
    }		//};
    int main()
    {
        int n = 0;
        struct node *head = NULL, *p1, *p2;
        p1 = p2 = (struct node*)malloc(SIZE);
        printf("Input %d node data:\n", n + 1);
        scanf("%d%f", &p1->num, &p1->score);
        while (p1->num != 0)
        {
            if (++n == 1)
                head = p1;
            else
                p2->next = p1;
            p1 = p2;	//p2 = p1;
            p1 = (struct node*)malloc(SIZE);
            printf("Input %d node data:\n", n + 1);
            scanf("%d%f", &p1->num, &p1->score);
        }
        free(p1);
        printf("Prit list:\n");
        p2->next = NULL;
        if (head != NULL)
        {
             p2=head;     //p1=head;
             while (p1 != NULL)
            {   
                printf("num:%d\tscore:%.2f\n", p1->num, p1->score);
                p1 = p1->next;
            }
        }
        return 0;
    }
    
    1. 下面程序用于将6个数按输入时顺序的逆序进行排列。找出其中错误,并改正之。
    //本题主要是把指针、地址等概念全部搞混了
    #include<stdio.h>
    void Swap(int *x, int *y)
    {
        int *temp;     //int temp;
        temp = x;     //temp = *x;
        x = y;        //*x = *y;   
        y = temp;     //*y = temp; 
    }
    void Sort(char *p,int m)//void Sort(int *p,int m)
    {
      int i;
      char change,*p1,*p2;//int change,*p1,*p2;
      for(i=0;i<m/2;i++)
      {
        *p1=p+i;       //p1=p+i;
        *p2=p+(m-1-i); //p2=p+(m-1-i);
         Swap(*p1,*p2); //Swap(p1,p2);
      }
    }
    int main( )
    {
      int i;
      char  *p,num[6];		//int  *p,num[6];
      for(i=0;i<=6;i++)				//for(i=0;i<6;i++)
      scanf("%d",num[i]);			//scanf("%d",&num[i]);
      p=num[0];
      Sort(*p,6);                  //Sort(p,6);
      for(i=0;i<=6;i++)			//for(i=0;i<6;i++)
        printf("%d",num[i]); //答案在%d后面还要加一个空格
      return 0;
    }
    
    1. 在下面使用指针数组的程序中存在一个错误,试分析这个程序,并上机运行,观察运行结果,找到这个错误,并分析出错的原因。
    #include <stdio.h>
    void  Print(char *arr[], int len);  
    int main(void)
    {
        char  *pArray[] = {"Fred","Barrey","Wilma","Betty"};
        int    num = sizeof(pArray) / sizeof(char);  //int    num = sizeof(pArray) / sizeof(pArray[0]);
        printf("Total string numbers = %d\n", num); 
    Print(pArray, num);
    return 0;
    }
    void  Print(char *arr[], int len)
    {
        int  i;    
        for (i=0; i<len; i++)
        {
            printf("%s,", arr[i]);
    }
    printf("\n");
    }
    
    1. 程序改错。以下程序用于打印输出结构体数组的所有元素。
    struct s
    {
        char name[10];
        int age;
    }					//};
    main()
    {
        struct s a[3] = {”John”,19,”Paul”,17,”Marry”,18};//struct s a[3] = {"John",19,"Paul",17,"Marry",18};
        int *p; 			//struct s *p;
     
        for(p = a; p < 3; p++)	//for(p = a; p < a+3; p++)
        {
            printf("%s,%d\n", p->name, p->age );
        }
         
    }
    
    1. 编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。
      要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。
      选民投票结束后程序自动显示各候选人的得票结果。
    #include <string.h>
     
    struct person
    {
        char name[20];
        int count;
    }					//};
     
    person leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};//struct person leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
     
    int main()
    {
        int i, j;
        char leader_name[20];
     									//int n;
        scanf("%d\n", &n);
        for (i = 0; i < n; i++)
        {
            scanf("%s", leader_name);
            for (j = 0; j < 3; j++)
                if (leader_name == leader[j].name)//if (!strcmp(leader_name,leader[j].name))
            leader[j].count++;
        }
        printf("\n");
        for (i = 0; i < 3; i++)
            printf("%5s:%d\n", leader[i].name, leader[i].count);
        return 0;
    }
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 310
精华内容 124
关键字:

c语言程序设计改错题

c语言 订阅