计算机程序设计员程序设计实例.docx

上传人:b****5 文档编号:6340488 上传时间:2023-01-05 格式:DOCX 页数:10 大小:210.50KB
下载 相关 举报
计算机程序设计员程序设计实例.docx_第1页
第1页 / 共10页
计算机程序设计员程序设计实例.docx_第2页
第2页 / 共10页
计算机程序设计员程序设计实例.docx_第3页
第3页 / 共10页
计算机程序设计员程序设计实例.docx_第4页
第4页 / 共10页
计算机程序设计员程序设计实例.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

计算机程序设计员程序设计实例.docx

《计算机程序设计员程序设计实例.docx》由会员分享,可在线阅读,更多相关《计算机程序设计员程序设计实例.docx(10页珍藏版)》请在冰豆网上搜索。

计算机程序设计员程序设计实例.docx

计算机程序设计员程序设计实例

程序设计实例

    本章介绍了循环程序设计方法,讲述了两种循环程序,三种循环语句。

包括前两章讲述的顺序程序结构、分支程序结构在内,这些控制结构内的语句部分都允许任意形式的语句。

这些控制结构之间可以互相嵌套,而且这种嵌套没有层次限制。

比如,if语句内可以包含循环语句,循环语句内又可以继续包含if语句,等等。

又比如,一个循环语句内可以含有循环语句,内层循环语句内还可以再包含循环语句,形成所谓的多重循环,等等。

    【例4.12】编程序,输出如下序列的前50项。

该序列的第一项为0;第二项为1;以后的奇数项为其前两项之和;偶数项为其前两项之差。

    解1:

该问题应该一项一项的生成,生成一项输出一项。

在生成一项时要考虑该项是偶数项还是奇数项;生成并输出一项后,为生成下一项做准备,应该把后边的项向前串。

得如下图4.30的PAD图。

程序如下。

    

    #include"stdio.h"

    voidmain(){

      intu,v,w,k;

      u=0;

      v=1;

      printf("%5d\n%5d\n",u,v);

      k=3;

      do{

        if(k%2==0)

          w=v-u;

        else

          w=v+u;

        printf("%12d\n",w);

        u=v;

        v=w;

        k=k+1;

      }while(k<=50);

    }

    解2:

该问题生成一项时,可以不用分支判断,而采用标志单元的方法,这种方法在程序设计中是经常使用的。

用这种方法PAD图如图4.31。

程序如下。

    

    #include"stdio.h"

    voidmain(){

      intu,v,w,k;

      intflag;

      u=0;

      v=1;

      printf("%5d\n%5d\n",u,v);

      k=3;

      flag=-1;

      do}

        w=v+flag*u;

        flag=-flag;

        printf("%5d\n",w);

      u=v;

      v=w;

      k=k+1;

      }while(k<=50);

    }

    【例4.13】编程序,输入两个正整数u、v,采用欧几里德辗转相除算法求它们的最大公因数并输出。

    解:

欧几里德辗转相除算法求u、v最大公因数的计算过程是:

        u%v→R1

        v%R1→R2

        R1%R2→R3

        R2%R3→R4

        …………

        …………

        Rn-1%Rn→Rn+1=0

到此余数Rn+1为"0",计算过程结束。

Rn为正整数u、v的最大公因数。

此计算过程用PAD描述成图4.32。

编出程序如下。

    

    #include"stdio.h"

    voidmain(){

      intu,v,r;

      printf("pleaceinputu、v:

");

      scanf("%d%d",&u,%v);

      r=v;

      while(r!

=0){

        r=u%v;

        u=v;

        v=r;

      }

      printf("gcd(u,v)=%5d\n"u);

    }

    【例4.14】编程序,输入正整数N,计算r1!

+r2!

+...+rn!

并输出。

其中,N=r1r2...rn。

    解:

该程序是一个计算若干数据项之和的程序。

本章已经编写过多个求和的程序,现在总结一下求和程序模式。

所有计算和的程序都使用一个和单元,有类似图4.33的模式。

这里用后判断条件的循环,当然也可以采用先判断条件的循环。

其中:

    S是和单元;

    开始进入循环之前和单元S必须清"0";

    在循环体内,每循环一次给和单元加上一项;

    最后循环结束,和单元中的值即为所求之和。

具体落实到本题,求和算法如图4.34的PAD所示。

    

    下边求精图4.32中的计算r!

阶乘是一个连乘积。

        r!

=1*2*3*…*r

    所有计算连乘积的程序都使用一个积单元,有类似图4.35的程序模式。

这里用后判断条件的

循环,当然也可以采用先判断条件的循环。

其中:

    P是积单元;

    开始进入循环之前积单元P必须置"1";

    在循环体内,每循环一次向积单元乘入一项;

    最后循环结束,积单元中的值即为所求之积。

具体落实到本问题计算r!

,得如图4.36的PAD。

    

综合图4.34和图4.36得图4.37的最终算法PAD。

程序如下:

    

    #include"stdio.h"

    voidmain(){

      intN,S,P,u,r;

      printf("pleaceinputN:

");

      scanf("%d",&N);

      S=0;

      while(N!

=0){

        r=N%10;

        N=N/10;

        P=1;

        u=1;

          while(u<=r){

          P=P*u;

          u=u+1;

        }

        S=S+P;

      }

      printf("r1!

+r2!

+...+rn!

=%5d\n"S);

    }

    【例4.15】我国古代有一道著名难题"百钱百鸡"问题:

"鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。

百钱买百鸡,问鸡翁、母、雏各几何。

"编程序,解该题。

    解:

这是一个著名的问题,也是一类典型的问题。

设买x只公鸡,买y只母鸡,买z只鸡雏,根据条件可以列出方程如下:

    5x+3y+z/3=100/*百钱*/

    x+y+z=100/*百鸡*/

只能列出这两个方程,原题目变成求该方程组的整数解问题。

三个未知数,两个方程,这是一个不定方程组。

解该类问

题的思路是枚举x、y、z的所有可能,选出满足条件的哪些x、y、z组合。

按这种思想,得到PAD如图4.38。

程序如下:

    

    #include"stdio.h"

    intx,y,z;

    voidmain(){

    for(x=1;x<=20;x++)

    for(y=1;y<=33;y++)

    for(z=3;z<=99;z=z+3)

    if(x+y+z==100&&5*x+3*y+z/3==100)

    printf("result=%5d%5d%5d\n",x,y,z);

    }

这是一个三重循环程序。

可以省掉最内层第三重循环,用x,y直接计算z。

程序如下:

    #include"stdio.h"

    intx,y,z;

    voidmain(){

      for(x=1;x<=20;x++)

      for(y=1;y<=33;y++){

        z=100-x-y;//求鸡雏数z,百鸡

        if(5*x+3*y+z/3==100&&z%3==0)//百钱

        printf("result=%5d%5d%5d\n",x,y,z);

      }

    }

    【例4.16】编程序,用循环语句控制打印图4.39的字符图形。

    

    解:

在本题目以下的分析中,以白方块"□"表示空格字符。

    分析该图形一共11行,上下相对于第6行对称。

应该先打印上半部分第一到第六行,它们的规律是一样的;再打印下半部分第七到第十一行,它们的规律也是一样的。

得图4.40的PAD。

    打印前六行,应该一行行的打印,用一个循环控制,得图4.41的PAD。

    打印第x行,每行都分三段,应该一段段的打印,得图4.42的PAD。

    

    打印第x行前段。

首先打印字母从x到'I',然后再打印字母从'A'到x-1。

每个字母的形式是:

一个空格,加字母本身。

得图4.43的PAD。

    打印第x行中段。

分析这段特性,应该首先打印(5-(x-'A'))*2个空格;再打印2*(x-'A')+1组"□x";再打印(5-(x-'A'))*2个空格。

得图4.44的PAD。

在图4.44的PAD中,每个框都是一个循环,不再求精。

    打印第x行后段。

首先打印字母从x+1到'I',然后再打印字母从'A'到x,最后换行。

每个字母的形式是:

一个空格,加字母本身。

得图4.45的PAD。

    

    

    至此,找到了打印前六行的算法。

下边求精打印后五行。

    打印后五行,也应该一行行的打印,用一个循环控制,得图4.46的PAD。

    打印后五行的第x行与打印前六行的第x行的算法是一样的,可以完全使用上述算法。

    

    至此,找到了打印图4.39字符图形的全部算法,综合上述图4.40到4.46得图4.47。

编出程序如下。

    

    #include"stdio.h"

    charx,y;

    inti;

    voidmain(){

    for(x='A';x<='F';x++){//前六行

    for(y=x;y<='I';y++)printf("□%c",y);//打印第x行前段

    for(y='A';y

    for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");//打印第x行中段

    for(i=1;i<=2*(x-'A')+1;i++)printf("□%c",x);

    for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");

    for(y=x+1;y<='I';y++)printf("□%c",y);//打印第x行后段

    for(y='A';y<=x;y++)printf("□%c",y);

    printf("\n");//回车换行

    }

    for(x='E';x>='A';x--){//后五行

    for(y=x;y<='I';y++)printf("□%c",y);//打印第x行前段

    for(y='A';y<=x-1;y++)printf("□%c",y);

    for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");//打印第x行中段

    for(i=1;i<=2*(x-'A')+1;i++)printf("□%c",x);

    for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");

    for(y=x+1;y<='I';y++)printf("□%c",y);//打印第x行后段

    for(y='A';y<=x;y++)printf("□%c",y);

    printf("\n");//回车换行

    }

    }

    在本例中,使用字符类型变量做循环控制变量,并且在字符类型数据上进行了若干算术运算,这是允许的。

前边第二章已经介绍过,在C中把字符类型作为整数类型看待,其整数值就是与字符相对应的代码值(ASCII码值)。

可施与整数类型上的一切运算都可在字符类型上进行。

事实上,在C中字符类型就是整数类型。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1