C语言 第三章 算法和控制语句 重点 典型题

时间:2024-12-09 18:06:16

一、概念

 

 

 

 

二、重点代码(书本)

1、输入年份,判断是否是闰年。

2、从键盘输入一元二次方程ax^2+bx+c=0的系数a、b、c,求它的根。

3、输入年份和月份,求该月天数

4、统计学生考试人数,并求出最高分,最低分和平均分

5、输入一个正整数,将它反位组成一个新的数输出(如输入12345,组成54321输出)

6、从键盘上输入两个整数,求它们的最大公约数

7、计算1!+2!+...+n!

8、从键盘上输入一个正整数,判断该数是否为素数

9、求所有水仙花数

10、输出九九乘法表

11、百钱买百鸡,100元买100只鸡,母鸡5元一只,公鸡3元一只,小鸡0.5元一只,问每一种鸡都必须要买的情况下,计算所有购买方法

12、输出100~200之间不能被3整除的数

13、输出半径为1~10的圆的面积,若面积超过100,则不输出

14、求斐波那契数列前40项,该数列的通项公式如下:

15、判断一个正整数是否是回文数。回文数是这样的数:一个正整数从左往右读和从右往左读都是一样的数(如121、123321)

16、求分数数列2/1,-3/2,5/3,-8/5,...前20项之和

17、求二元高次方程2x^3-4x^2+3x+6=0在1.5附近的跟

三、重点题目

1、逻辑运算符两侧运算对象的数据类型是()

      A . 只是0或1
      B . 只能是0或非0正数
      C . 只能是整型或字符型数据
      D . 可以是任何合法的类型数据

答案:D

解析:逻辑运算符两侧的运算对象可以是常量、变量、表达式。运算对象的值如果是非0值,表示条件为真;如果是0,表示条件为假,因此运算对象的值可以是任何数据类型。逻辑运算符两侧最终要转换成bool值运算,bool值只有非0(用1表示)和0两个值,所以只要不是0,就被转换为1,所以无论什么类型的值都可以参与运算。

2、有如下程序片段:

       int k=2;

       while(k=0){

             printf("%d",k);

             k--;

         }

      则下列说法正确的是(  )

      A. 循环执行10次

      B. 循环体执行无限次

      C. 循环体一次也不执行

      D. 循环体执行一次

答案:C

解析:while后面括号里的是赋值表达式k=0,即表达式值为0,循环体没有被执行,应选C

3、一下程序段的循环次数是(   )

      for(i=2;i==0)

           printf("%d",i--);

        A. 无限次

        B. 0次

        C. 1次

        D. 2次

答案:B

解析:i的初值为2,条件表达式是判断i与0是否相等,此处表达式的值为0(条件为假),跳出循环。

4、以下程序的输出结果是(   )

      #include<>
      int main()
      {
            int k=0,m=0,i,j;
            for(i=0;i<2;i++)
            {
                  for(j=0;j<3;j++)
                        k++;
                  k-=j;
         }
         m=i+j;
         printf("k=%d,m=%d",k,m);
         return 0;
    }

    A. k=0,m=3

    B. k=0,m=5

    C. k=1,m=3

    D. k=1,m=5

答案:B

解析:外循环执行1次,内循环执行3次,3次内循环执行完后k=3,j=3,执行k-=j;后k=0,即每次执行完内循环后k值都为0,而外循环完成后i=2,因此m=5,k=0。

5、复合语句是用一对大括号{}界定的语句块

6、一个表达式要构成一个C语句,必须用分号;表示结束

7、写出数学式 的C语言表达式:y=x<0?1:x==0?0:-1

8、C语言的语法规定:省略复合语句符号时,else语句总是与距离最近且未配对的if相结合,与书写格式无关。

9、switch语句中,如果没有表达式的值相等的标号,并且存在default标号,则从default标号开始执行,直到switch语句结束。

10、C语言的循环语句包括whiledo...whilefor三种。

11、至少执行一次循环体的循环语句是do...while语句。

12、continue语句的作用是结束本次循环。

13、break语句可以使程序流程跳出switch语句体,也可以中止本层循环体。

14、以下程序的运行结果是   1   

        #include<>
        int main()
        {
             int i=5;
             do
             {
                   switch(i%2)
                   {
                         case 0 : i--; break;
                         case 1 : i--; continue;
                    }
                    i--;i--;
                    printf("%d",i);
             }while(i>0);
             return 0;
         }

注意:do{...}while(i>0)中,如果while刚开始时i满足i>0,只要这轮里有一次i不满足i>0,就会立即停止。

15、以下程序的运行结果是3,1,-1,3,1,-1 

        #include<>
        int main()
       {
             int i,j;
             for(i=0;i<3;i++,i++)
             {
                   for(j=4;j>=0;j--)
                   {
                         if((j+i)%2)
                         {
                                j--;
                                printf("%d,",j);
                                continue;
                          }
                          --i;
                          j--;
                          printf("%d,",j);
                    }
              }
              return 0;
        }

解析:j+i为奇数时,执行if结构的语句序列,否则执行if语句的后续语句。i=0,j=4,i+j是4,为偶数,执行--i,j--后i=-1,j=3,输出j。j--后j=2,执行内循环,j+i是1,执行j--后j=1,输出j。执行continue语句,结束本次循环。(解析有待补充)。

16、以下程序的运行结果是   1,-2   (稍加注意就好)

       #include<>
       int main()
       {
           int y=2,a=1;
           while(y--!=-1)
              do
              {
                   a*=y;
                   a++;
               }while(y--);
           printf("%d,%d\n",a,y);
           return 0;
     }

17、以下程序的功能是输出1~100范围内各位数的乘积大于各位数的和的数,请填空使程序完整。

       #include<>
       int main ( )
       { 
             int n,k=1,s=0,m;
             for (n=1;n<=100;n++) 
             {
                   k=1;s=0;
                   m=n;
                   while (m!=0
                   {
                        k*=m%10;
                        s+=m%10;
                        m=m/10;
                    }
                    if (k>s) 
                        printf("%d",n);
             }
             return 0;
       }

解析:因为n为for语句的循环控制变量,而while语句中是对m进行除10取余,因此第一空应该填m=n。while语句进行数位分离(除10取余再整除10,直到该数为0),因此第二空应该填m或m>0。第三空填m=m/10。

18、已知如下公式:

以下程序的功能是根据上述公式输出满足精度要求的eps的pai值,请填空使程序完整。

         #include<>
         int main()
         {
               double s=1.0,eps,t=1.0;
               int n;
               for(n=1;t>=eps;n++)
               {
                     t=t*n/(2*n+1);
                     s+=t;
               }
               printf("%lf\n",2*s);
               return 0;
         }

19、以下程序段的功能是计算1000!的末尾有多少个0,请填空使程序完整。

答案:m%5==0

解析:在求阶乘中,只要有数字能被5整除,就会增加一个0,因此应填m%5==0

20、以下程序接受键盘上的输入,直到按回车键为止,这些字符被原样输出,但若有连续的一个以上的空格时只输入一个空格,请填空使程序完整。

答案: cx=getchar() cx!=front cx 

解析:从键盘上输入字符,直到回车键,并删除多余的空格字符。因此第一空应该填cx=getchar()。如果当前字符是空格,要判断前一个字符是否为空格,则第二空填cx!=front。如果前一个字符不是空格,说明没有两个连续的空格,直接输出cx。

21、(编程题)输入一个正整数,求它的所有素数因子。

解析:从最小的素数k=2开始,若能整除输入的正整数m,则用m被k整除后的商作为新的数,继续用k去除,若不能被k整除,则k加1继续前面的过程,直到k大于或等于m。程序流程图如图所示:

程序如下:

         #include<>
         int main()
         {
               int m,k=2;
               printf("输入一个正整数:\n");
               scanf("%d",&m);
               while(k<m)
                     if(m%k==0)
                     {
                            printf("%4d",k);
                            m=m/k;
                      }
                      else
                            k++;
                 printf("%4d\n",m);
                 return 0;
           }

22、键盘输入正整数n和a,求s=a+aa+aaa+...+aa...a(n个a)

           #include<>

           int main()

           {

                 int a,n,s=0,p=0,i;

                 scanf("%d %d",&n,&a);

                 for(i=0;i<=n;i++)

                 {

                       p=p*10+a;

                       s=s+p;

                 }

                 printf("%d\n",s);

                 return 0;

            }

23、用二分法求方程2X^3-4X^2+3X-6=0在区间(-10,10)内的根

         #include <>
         #include <>

         int main()
         {
                float a=-10,b=10,x,f1,f2,f;
                f1=(((2*a-4)*a+3)*a)-6;
                f2=(((2*b-4)*b+3)*b)-6;
                do
                {
                      x=(a+b)/2;
                      f=(((2*x-4)*x+3)*x)-6;
                      if(f*f1<0)
                      {
                           b=x;
                           f2=f;
                      }
                      else
                      {
                           a=x;
                           f1=f;
                      }
                }while(fabs(f)>=1e-6);
                printf("%6.2f\n",x);
                return 0;
         }

24、编写一个程序,计算的近似值。

 

25、取出一个无符号的十进制整数中的所有奇数数字,按原来的顺序组成一个新的数。

解析:利用数位分离(除以10取余,整除10),分离出来的数字进行奇数偶数判断,若为奇数,则组成新数的某一位。由于要按原来的顺序组成新数,即先分离出来的是低位,可以不断乘以10,再加上前面组成的数实现。程序流程图如图所示。

           #include <>
           int main()
           {
                  unsigned long s,t=0,p=1;
                  scanf("%u",&s);
                  while(s!=0)
                  {
                        if((s%10)%2!=0)
                        {
                              t=t+(s%10)*p;
                              p=p*10;
                        }
                        s=s/10;
                  }
                  printf("%u\n",t);
                  return 0;
           }