欢迎访问志愿传奇

高考倒计时23

立身以力学为先,力学以读书为本。——欧阳修

您所在的位置: 新考网(原中国大学在线)>>教学教育 > 正文内容

《C语言程序设计》顺序、选择、循环结构习题课教 案 2

作者:  时间: 2017-04-16

 

四、条件循环  五、规则数列  六、数学问题.

 

 

四、条件循环

这种题型历来为各种考试所偏爱,这也是考纲所强烈要求的。

例如:输入一批数,直到输入0为止,统计正数和负数的个数。

要求编写这样的程序,可以这样考虑:

输入一批数,这个动作重复多次,故最好使用循环来解决。但不知有多少个数

所以不好用FOR循环,可以考虑使用WHILE循环;那么这个输入0为止,事实上告诉我们这是循环结束的条件。哪个动作需要重复,就把哪个语句作为循环体,那么输入数据、统计个数这两个动作应放入循环体中。程序请同学们自己动手。

   

再例如:编程产生尾数为114位整数,并每行5个打印输出

因符合条件的整数只有90个,个数一定,可考虑使用循环嵌套来产生,程序如下:

    for I=1I<=9;i++

        for(j =0;j<=9;j++)

          { x = I*1000 + j*100 + 11;

  Printf(“%d”,x);n++; if(n%5==0)printf(“\n”);}

综上所述,对条件循环,我们要注重哪个是条件,哪个动作需要重复,则程序就易写。

   

 再例如:编写程序求满足以下条件的最大的N值。

         12+22+32+42+……+N2<=1000

         Main(){

       Int n,s;

            S=n=0;

              While (s<=1000)

               {++n; s+=n*n;}

            Printf(“n=%d\n”,n-1);}

             结果为:13

例如:根据π/4=1-1/3+1/5-1/7+…………公式计算π的近似值,在求精确到10-6为止;

 该程序的条件是直到某项小于10-6,并不知道有多少项求和。程序由同学自己动手完成。

   

课后练习:

    要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,以下正确的程序段是

Awhile((ch=getchar())!=N) 

       printf("c",ch)

Bwhile(ch=getchar()!=N)   

       printf("c",ch)

Cwhile(ch=getchar()==N)  

       printf("c",ch)

Dwhile((ch=getchar())==N) 

       printf("c",ch)

   

   

   

   

   

   

五、规则数列

就是有规律可循的一列数值,如果还知道其初值,就很容易计算出其中的任意项。

迭代法(iterate):是指重复执行一组指令,在每次执行这组指令时,都从变量的原值推出它的一个新值。

1:裴波那契序列数的递归表示如下:
  f0=0
  
f1=1
  fn=fn-2+fn-1(n
=2)
  对于任意给定的正整数x,判别其是否在裴波那契序列中。

   

现在要求判别一个给定的正整数x是否在裴波那契序列中,一个直观的判别方法是从f0f1出发,不停地求后面的裴波那契序列数。每得到一个裴波那契序列数,就同这个待判别数进行比较,直到相等时输出。或当得到一个裴波那契序列数大于这个待判别数时,输出
要实现这个算法,需用到循环结构。我们来分析一下这个循环结构的三个要素:
  (1) 初始状态:f0=0; f1=1x=?
  (2) 循环条件:当前求得的裴波那契序列数

             < 待判别数x
  (3) 循环体:计算一个新的裴波那契序列数。
  根据以上的分析,判别一个给定的正整数x是否在求裴波那契序列中的C函数如下:

   

main(){
   int  f0=0, f1=1 ,x;

Scanf(“%d”,x);
   while (f1
x)
  
{
  
t=f1+f0;
  
f0=f1;
  
f1=t;
  
}
  
return (x==f1|| x==f0);
  }

同样的问题有:递增的牛群,递增的兔群

   

2:如:求a + aa + aaa +  aaaa …… + aaaaaa……a 的值( n =20,  0<a<=9

要求出这N个数之和,只需先一个一个推导出第二个数、第三个数……

那么相邻的两个数的关系如何?

      X n+1  =  X n * 10  + a

 所以程序结构如下:

    略:由同学们自己动手

六、数学问题

1、整数的各位数字的分离与整合

由于高职教育考试的局限性,决定了在程序的编制考核中,常常出现求某一整数的某位数字的问题,或问题中需要求某位数字。所以这类问题也是同学们必须熟练掌握的内容,尤其是其中的分离和整合算法。

①一个二位整数X,它的个位数字的十位数字是:

        X  %   10    …………个位数

        X   /    10    …………十位数

②一个三位整数X,它的个位、十位、百位数字是:

        X  %   10     ………… 个位数字

        X  / 10  % 10 ………… 十位数字

        X  /  100       ………… 百位数字

   

③一个任意整数X,它的个位、十位、百位、千位……数字是怎样求出来的,显然不能象上面那样求。但象求最后一位数一样分别求出第二位、第三位……。即采用求余整除法把一个任意整数的各位数字分离出来。

  程序如下:

    Scanf(“%d”,&x);

   while (x!=0){

     n=x  % 10;

     x=x/10;

     printf(“该整数的各位数字是%d”,n);

   }

   

  例如:输入整数,求它的各位数字之和

       Scanf(“请输入一个整数%d”,&x);

       while  (x != 0){

           l=x %  10;

           s = s+ l;

           x = x /10;}

        printf(“该整数的各位数字之和为:%d”, S);

   

另一个问题与整数的分离相反,就是把某个数按某一规律整合出一个新数

  例如:求a + aa + aaa +  aaaa …… + aaaaaa……a 的值( n =20,  0<a<=9

要求出这N个数之和,只需先一个一个推导出第二个数、第三个数……

那么相邻的两个数的关系如何?

      X n+1  =  X n * 10  + a

 所以程序结构如下:

    Scanf(“%d%d”,&n , &a);

     for (I =1;i<=n;i++){

       x= x * 10 +a;

        s = s + x ;}

     printf (“其和为:%f” S)

   

2、求两个正整数的最大公约数。
  【欧几里德算法】
E1.[
求余数] nm并令r为所得余数(0=rn)
E2.[
余数为0?] r=0, 算法结束, n即为答案。
E3.[
互换] mn, nr, 并返回步骤E1
为了使计算过程更为紧凑,也考虑到当n=0时,算法仍然有效,可将以上算法稍作改动如下:
E'1.[n
0?] n=0, 算法结束, m即为答案。
E'2.[
求余数] nm并令r为所得余数(0=nn)
E'3.[
互换] mn, nr, 并返回步骤E'1


   

根据以上所描述的算法,我们可以用C语言写出相应的函数:
  main(){
  int r,m,n;

    Scanf(“%d%d”,&m,&n);

while (n!=0) {
  
r=m%n;
  
m=n;
  
n=r; }
  
return m;
  }

   

3、编程找出100~999之间的所有梅花数(也称作水仙花数:一个三位数等于它的每一位数字的立方和)

       For(i=100;i<=999;i++){

          N=I %10; m=i/10%10;k=i/100;

If (i= =n*n*n+m*m*m+k*k*k)printf(“%d”,i);

}

       请同学们补充完整!

   

4、输出100以内的所有完备数(其各因子之和等于其本身的正整数)

For (n=1;n<=100;n++)

{

A=1;s=0;

While(a<n){

If(n%a= =0)s+=a; a++;}

If(s= =a)printf(“%d”,n);

}

   

5、找出100以内的全部同构数(同构数指一个数出现在它的平方数的右端。如5的平方是25525右端的数,5是同构数。)

程序如下:

      int x,k,d;

    for (x=1;x<=100;x++){

        k=10;

        if (x>10) k=100;

          d=x*x;

         if (d-d/k*k==x) printf("%d    %d\n", x, d);}

   

6、从键盘输入两自然数x,y,判断它们是否互质

   基本算法是:设大数为X,小数是Y,如果X/Y为整数则两数不互质,如果XY能同时被2Y/2之间的任一整数整除,则XY也不互质,其它情况互为质数。

   Int x,y,n,t=1;

   Scanf(“请输入XY的值:%d%d”&x,&y);

   If(x<y){x=x+y;y=x-y;x=x-y;}

   If(x%y==0) t=0;

    Else  {n=y/2;

     For (i=2;i<=n;i++)if( x%i==0 )t=0;}

   If(t)printf(“yes”);

     Else printf(“no”);

 

 

教案PPT下载


加入家长群

QQ扫一扫,加入家长群

关注我们

关注微信公众号,了解最新精彩内容

关注抖音号

抖音扫一扫,立即关注我