CC++程序设计课件第3章 结构化程序设计_第1页
CC++程序设计课件第3章 结构化程序设计_第2页
CC++程序设计课件第3章 结构化程序设计_第3页
CC++程序设计课件第3章 结构化程序设计_第4页
CC++程序设计课件第3章 结构化程序设计_第5页
已阅读5页,还剩70页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章结构化程序设计问题原由由顺序结构、分支结构和循环结构构成的程序设计方法称为结构化程序设计。怎样实现这3种基本结构?如何提高结构化程序设计的效率和质量?这就是本章所要讨论的问题。本章围绕结构化程序设计,介绍顺序结构、选择结构、循环结构,以及结构化程序设计所涉及的相关知识与案例程序设计。教学重点能力要求掌握:结构化程序设计的基本方法步骤。了解:结构化程序设计方法,并能利用结构化设计实际应用程序。熟悉:结构化程序设计的基本思想。

§3.1

顺序结构

§3.4循环结构

§3.3分支结构

§3.2程序流程控制机制第3章结构化程序设计本章介绍的知识内容

§3.5算法案例程序设计§3.1

顺序结构[问题描述]

输入任意三角形三个边长的值,计算图3-1所示三角形的周长和面积。[问题分析]设三角形的三个边长分别为a、b、c,周长为s,面积为area。求三角形周长s和面积area的公式分别为:s=(a+b+c)/2,area=(s(s-a)(s-b)(s-c))1/2根据上述公式,则可按先计算出三角形周长s的值,然后求出三角形的面积area。3.1.1顺序结构的引出acb图3-1三角形[程序实现]#include<stdio.h>#include<math.h>main(void){floata,b,c,s,area;printf(“Pleaseinputfloatnumbers:a,b,c”);scanf(“%f,%f,%f”,&a,&b,&c);s=1.0/2*(a+b+c);

//不能写成:s=1/2*(a+b+c);因为l/2的值为0area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“a=%7.2f,b=%7.2f,c=%7.2f\n”,a,b,c);printf(“s=%7.2f,area=%7.2f\n",s,area);}[运行程序]Pleaseinputfloatnumbers:a,b,c3,4,5↙a=3.00,b=4.00,c=5.00s=6.00area=6.003.1.1

顺序结构的引出[问题点拨]

顺序结构程序从上到下顺序执行的,即从程序的开始按照程序语句的书写顺序一直执行到结束。在顺序结构程序中,一般包括以下几个部分。⑴程序开头的编译预处理命令:在程序中若要使用标准函数库,除printf()和scanf()函数外,使用其它标准函数时必须使用编译预处理命令,将相应的头文件包含进来。⑵顺序结构程序的函数体:C语言程序由各函数体“{}”组成,顺序结构程序的函数体由完成程序具体功能的语句组成。具体说,函数体通常由以下4部分组成:①变量类型说明部分:例如floata,b,c,s,area。

②数据处理部分:例如s=1.0/2*(a+b+c);

③数据输出部分:例如printf(“a=%7.2f,…④数据输入部分:例如scanf(“%f,%f,%f”,&a,&b,&c)。3.1.1

顺序结构的引出3.1.2

数据处理语句1、任意表达式末尾加一个分号,就构成了一个表达式语句。例:intx=5;表达式语句1、一般形式:{… }2、说明:“}”后不加分号,{}把若干语句括来构成一条复合语句。例:{x=x+1;y=y+1;}复合语句可嵌套复合语句空语句1、空语句的形式是:

;这条语句意味着什么都不做,可以在任何地方都出现空语句3.1.2

数据处理语句continuebreakgotoreturn分支循环辅助控制if()~

else~switch()for()~while()~

do~while()程序控制语句(3类)格式:putchar(c)参数:c为字符常量、变量或表达式功能:把字符c输出到显示器上C语言无I/O语句,I/O操作由库函数实现:

#include<stdio.h>3.1.3

数据的输出1、单个字符输出函数:putchar()#include<stdio.h>main(){intc;chara;c=65;a='B';putchar(c);putchar('\n');putchar(a);}AB运行结果:3.1.3

数据的输出格式:printf(“格式控制符串”,输出表)功能:按指定格式向显示器输出数据2、格式输出函数:printf()(1)输出表:要输出的数据(可以没有,多个时以“,”分隔)(2)格式控制符串:包含两种信息格式说明:%格式控制字符,用于指定输出格式普通字符或转义序列:原样输出3.1.3

数据的输出dx,Xoucse,Efg%%十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数e和f中较短一种百分号本身inta=567;printf(“%d”,a);inta=255;printf(“%x”,a);inta=65;printf(“%o”,a);inta=567;printf(“%u”,a);chara=65;printf(“%c”,a);printf(“%s”,“ABC”);floata=567.789;printf(“%e”,a);floata=567.789;printf(“%f”,a);floata=567.789;printf(“%g”,a);printf(“%%”);567ff101567AABC5.677890e+02567.789000567.789%说明: 格式字符与输出项个数应相同,按先后顺序一一对应格式字符与输出项类型应一致3.1.3

数据的输出例#include<stdio.h>main(){inta=3;doubleb=1.456;charr=‘A’;printf(“%d\n”,a);printf(“%f\n”,b);printf(“%d%f\n”,a,b);printf(“a=%d,b=%f\n”,a,b);printf(“%d\n”,10);printf(“%c\n”,r);printf(“%c,%d,%c”,r,r,97);printf(“%d”,b);}

31.4560003,1.456000a=3,b=410AA,65,a-1477468750运行结果:3.1.3

数据的输出printf函数的附加格式说明符(修饰符).n对实数,指定小数点后位数(四舍五入)对字符串,指定实际输出位数修饰符功能m输出数据域宽,数据长度<m,左补空格;否则按实际输出输出数据在域内左对齐(缺省右对齐)-指定在有符号数的正数前显示正号(+)+输出数值时指定左面不使用的空位置自动填00在八进制和十六进制数前显示前导0,0x#在d,o,x,u,e,f,g前,指定输出精度为long型或double型L或lH或h在d,o,x,u前,指定输出精度为short型3.1.3

数据的输出#include<stdio.h>main(){inta=1234;floatf=123.479;charch=‘a’;printf(“%8d,%2d\n”,a,a);printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f);printf(“%-12f,%-12.1f%-.2f\n”,f,f,f);printf(“%3c\n”,ch);}####1234,1234123.479000,123.479000,###123.5,123.48,1.23e+02123.456000##,123.5#######123.48########a注:此处以#代表空格3.1.3

数据的输出格式:getchar()功能:从键盘读单一字符1、字符输入函数:getchar()

#include<stdio.h>main(){intc;printf("Enteracharacter:");c=getchar();printf("%c--->hex%x\n",c,c);}Enteracharacter:AA--->hex41运行结果3.1.4

数据的输入2、格式输入函数:scanf()格式:scanf(“格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束地址表:变量的地址,常用取地址运算符&格式字符:d,i,o,x,u,c,s,f,e#include<stdio.h>main(){inta;scanf(“%d”,&a);}若改为:inta;scanf(“%x”,&a);

输入:11

则a=17结果:

输入:10

则a=103.1.4

数据的输入附加格式说明符(修饰符)l修饰符功能hm*用于d,o,x前,指定输入为short型整数用于d,o,x前,指定输入为long型整数用于e,f前,指定输入为double型实数指定输入数据宽度抑制符,指定输入项读入后不赋给变量注意:输入long型整数、double型实数时必须在相应的格式控制符前前缀:l3.1.4

数据的输入输入分隔符的指定一般以空格、TAB或回车键作为分隔符其它字符做分隔符:格式串中两个格式符间字符例scanf(“%d%o%x”,&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);

输入123123123输出a=123,b=83,c=291例scanf(“%d:%d:%d”,&h,&m,&s);

输入12:30:45则12h,30m,45s例scanf(“%d,%d”,&a,&b)

输入3,4则3a,4b例scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);

输入a=12,b=24,c=363.1.4

数据的输入说明:用“%c”格式符时,空格和转义字符(如回车‘\n’)作为有效字符输入如scanf(“%c%c%c”,&c1,&c2,&c3);

若输入abc

则ac1,c2,bc33.1.4

数据的输入#include<math.h>#include<stdio.h>main(){floata,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);printf("area=%7.2f\n",area);}输入三角形边长,求面积输入:3,4,6输出:a=3.00,b=4.00,c=6.00,s=6.50area=5.33文件包含预处理命令变量定义输入数据输出数据3.1.4

数据的输入从键盘输入大写字母,用小写字母输出#include"stdio.h"main(){charc1,c2;c1=getchar();printf("%c,%d\n",c1,c1);c2=c1+32;printf("%c,%d\n",c2,c2);}输入:A输出:A,65a,97输入大写字符3.1.4

数据的输入关系运算符:用于在程序中比较两个值的大小,关系运算的结果类型是布尔型,也就说,结果不是true就是false。符号意义运算结果类型实例>大于如果条件成立,结果为true,否则结果为false3>6,x>2,b>a<小于3.14<3,x<y>=大于等于3.26>=b<=小于等于PI<=3.1416==等于3==2,x==2!=不等于x!=y,3!=2§3.2程序流程控制机制

3.2.1关系运算逻辑运算符:用于表示两个布尔值之间的逻辑关系,运算结果是布尔类型。符号意义运算对象类型运算结果类型实例!逻辑非布尔类型布尔类型!(i>j)&&逻辑与x>y&&x>0||逻辑或x>y||x>0逻辑非:运算对象个数是1个。取反逻辑与:只有两个运算对象都为true,结果才为true逻辑或:只有两个运算对象都为false,结果才为false3.2.2

逻辑运算条件运算符一般形式:表达式1?表达式2:表达式3功能:相当于条件语句,但不能取代一般if语句例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);表达式1取表达式2值取表达式3值非0=0例(a==b)?’Y’:’N’(x%2==1)?1:0(x>=0)?x:-x(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c条件运算符可嵌套

如x>0?1:(x<0?-1:0)结合方向:自右向左

如a>b?a:c>d?c:da>b?a:(c>d?c:d)表达式1、表达式2、表达式3类型可不同,表达式值取较高的类型例x?‘a’:‘b’//x=0,表达式值为‘b’;x‡0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x<y,值为1.53.2.3

条件运算

分支结构是根据提供的条件进行判断,选择不同的分支进行操作的一种结构,因而也称为条件选择结构。实现分支结构的语句有两种:一种是条件语句,另一种是开关语句。它们都是根据给定的条件进行判断,然后依据条件成立与否来选择执行不同的分支操作。在C语言中,分支结构提供了四种结构形式:单分支结构双分支结构多分支结构嵌套结构§3.3分支结构

单分支if语句格式:if(表达式)语句;

以下程序的作用是什么?

main(){charc;printf(“Input:”);scanf(“%c”,&c);if(c>=’a’&&c<=’z’)c=c-32;elsec=c;printf(“%c”,c);}上面的程序的作用是:将小写字母转换为大写字母3.3.1

单分支结构3.3.2

双分支结构双分支if语句格式:if(表达式)语句1;

else语句2;以下程序的执行结果是什么?

main(){intx=2,y=-1,z=2;if(x<y)if(y<0)z=0;elsez+=1;printf(“%d\n”,z);}/*结果是2*/哦,原来是因为else总是与靠近它的if配套…

常见错误:

if(x>0);if(x=2)if(1<=x<=10)y=3x+2;printf(“y>0”);y=x-1;main(){ inta; printf("Pleaseinputthescore:"); scanf(“%d”,&a);

if(a>=90) printf(“Thegradeis:A\n”); elseif(a>=80) printf(“Thegradeis:B\n”); elseif(a>=70) printf(“Thegradeis:C\n”); elseif(a>=60) printf(“Thegradeis:D\n”); else printf(“Thegradeis:E\n”);}从键盘上输入一个百分制成绩score,按下列原则输出其等级:90≤score,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。输入:95运行结果:Thegradeis:A

输入:75运行结果:Thegradeis:C3.3.3

if语句的嵌套多分支结构格式:switch(表达式){ case常量表达式1: 语句组1[break;] case常量表达式2: 语句组2[break;]

… case常量表达式n: 语句组n[break;] [default:

语句组n+1]}注意:当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default后面的语句(组)。然后,再执行switch语句的下一条。(注:方括号表示可选项)3.3.4

多分支结构switch结构3.3.4

多分支结构说明switch后面的“表达式”,可以是整型、字符型和枚举型中的一种。每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。各case及default子句的先后次序,不影响程序执行结果。多个case子句,可共用同一语句(组)。用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。3.3.4

多分支结构main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);case‘B’:printf(“70~84\n”);case‘C’:printf(“60~69\n”);case‘D’:printf(“<60\n”);default:printf(“错误输入\n”);}}输入“C”,求输出结果3.3.4

多分支结构运行结果:

60~69<60

错误输入

?!main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);case‘B’:printf(“70~84\n”);case‘C’:printf(“60~69\n”);case‘D’:printf(“<60\n”);default:printf(“错误输入\n”);}}我的成绩应该是60~69!什么!“<60”?“错误输入”?怎么会这样?!不好意思,我属于C级!运行结果:

60~69<60

错误输入

3.3.4

多分支结构解决方法——break语句:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“错误输入\n”);}}这才差不多!运行结果:

60~693.3.4

多分支结构解决方法——break语句:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“错误输入\n”);}}讨论switch(s)语句中的s实际上并非真正的条件选择,而只是一种跳转指示(与if语句不同),表示下面应该跳转到什么位置继续执行。而各case实际上只是一个跳转处的标记。当程序跳转到某个case处时,并非只执行此case行的程序组,而是从此处开始一直向下执行各条语句,直到整个switch开关体结束(“}”)。如果要使每个case处相当于一种if(s)else的效果,必须在其语句组最后加上break语句。3.3.4

多分支结构main()

{intscore,grade;

printf(“Inputascore(0~100):”);

scanf(“%d”,&score);

grade=score/10;

switch(grade){case10:case9:printf(“grade=A\n”);break;case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf(“grade=E\n”);break;default:printf(“Thescoreisoutofrange!\n”);}}从键盘上输入一个百分制成绩score,按下列原则输出其等级:90≤score,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。输入:85运行结果:grade=B输入:45运行结果:grade=E3.3.4

多分支结构main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“a=%d,b=%d\n”,a,b);}说明1、每个case常量表达式的值必须互不相同,否则会出现互相矛盾的结果。2、允许多个case共用一个执行语句。

求程序运行结果。结果:a=2,b=1。如果x=2?

结果:a=1,b=1

如果x=3?结果:a=1,b=1

3.3.4

多分支结构

循环是在循环条件为真时计算机反复执行的一组指令(循环体)。循环控制通常有两种方式:计数控制事先能够准确知道循环次数时用之

用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。标记控制事先不知道准确的循环次数时用之

由专门的标记变量控制循环是否继续进行。当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。§3.4循环结构

3.4.1循环结构的引出

循环结构两大要素:循环条件p

结束循环的条件表达式循环体A

循环执行的语句或语句组设置循环条件要特别注意确定:循环变量的初值循环变量的终值循环变量的变化规律3.4.1

循环结构的引出3.4.1

循环结构的引出在C语言中可用以下语句构成循环:

if…gotowhiledo…whilefor其中if…goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。

其他三种语句是C语言提供的循环结构专用语句。while语句循环结构格式

while(表达式)

{循环体;

……}【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。3.4.2

While循环结构main(){intn=0,sum=0;while(sum<=20){sum+=n;++n;}printf(“n=%d\n”,n);}当型循环main()

{inti=1,sum=0;while(i<=100){sum+=i;i++;}printf(“sum=%d\n”,sum);

}用while语句求1~100的累计和3.4.2

While循环结构#include<stdio.h>main()

{intcounter=0;while(getchar()!=‘\n’)counter++; printf(“Thenumberis:%d\n”,counter);}用while语句统计从键盘上输入的字符个数,遇到回车键时输出统计结果,结束程序。3.4.2

While循环结构do-while语句循环结构格式

do{

循环语句(组)

}while(条件表达式);用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。main(){intn=0,sum=0;do{sum+=n;++n;}while(sum<=20);printf(“n=%d\n”,n);}3.4.3

do-While循环结构直到型循环分号不能省略用do-while语句求1~100的累计和main()

{inti=1,sum=0;do{sum+=i;

i++;

}while(i<=100);printf(“sum=%d\n”,sum);

}3.4.3

do-While循环结构从键盘输入一个整数12456,分析以下程序运行结果。例4:main(){intnum,c;printf(“inputnum:“);

scanf(“%d”,&num);do{c=num%10;printf(“%d”,c);num=num/10;}while((num/1)>0);printf(“\n”);}

/*取得num的个位数*/

/*输出num的个位数*/

/*直到num/1为0*/

结果:

65421将各位数字反序显示出来

/*给num重新赋值*/

3.4.3

do-While循环结构for语句循环结构格式

for(表达式1;条件表达式;表达式3)

循环语句(组);

用于构成计数型当型循环:先判断后执行,条件为真继续循环,直到条件为假时结束循环。表达式1:整个循环中只执行1次,常用来对循环变量设置初值。条件表达式(表达式2):其值为真(非0)时继续执行循环语句(组),否则结束循环。表达式3:常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次)。main(){inti,s=0;

for(i=1;i<=100;i++)

s=s+i;//循环语句printf(“Sum=%d\n”,s);}3.4.4

for循环结构求∑i=1+2+3+4…+99+100(i=1~100)当型循环main()

{ inti,sum=0; for(i=1;i<=100;i++){

if(i%2==0)sum+=i;} printf(“sum=%d\n”,sum);

}用for语句求:1~100中所有偶数的和3.4.4

for循环结构3.4.4

for循环结构main(){inti,n;longfact=1;printf("Inputn:");scanf("%d",&n);for(i=1;i<=n;i++)fact*=i;printf("%d!=%ld\n",n,fact);}用for语句求n的阶乘n!(n!=1×2×…×n)fact=1输入ni?<=

nfact=fact*ii=i+1真假i=13.4.5三种循环结构的比较1、循环变量初始化的区别在于:while和do…while循环的循环变量初始化应该在while和do…while语句之前完成;而for循环变量的初始化可以在表达式1中完成。2、循环条件的区别在于:while和do…while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。3、循环变量的改变使循环趋向结束:while和do…while循环要在循环体内包含使循环趋于结束的操作;在for循环中这一点可以在表达式3中完成。4、for循环可以省略循环体,将部分操作放到表达式3中,因而for语句功能比较强大。三种循结构的主要区别如下:3.4.5三种循环结构的比较5、while和for循环先判断表达式,后执行循环体,do…while是先执行循环体,然后再判断表达式。因此,while循环和for循环是典型的“当”型循环,而do…while循环可以看做是“直到”型循环。6、三种基本循环结构一般可以相互替代,具体使用哪一种结构,取决于程序的可读性和程序设计者个人程序设计的风格。对于计数型的循环或确切知道循环次数的循环,采用for语句实现比较合适,对其它不确定循环次数的循环通常采用while/do…while语句实现。

三种循结构的主要区别如下:break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。

【注意】goto语句只能从循环内向外跳转,反之不可!3.4.6循环结构中的辅助语句C语言循环结构中的辅助语句有以下3中类型:3.4.6循环结构中的辅助语句main(){inta,y;a=10,y=0;do{a+=2;y+=a;if(y>50)break;}while(a=14);printf("a=%d,y=%d\n",a,y);}

变量跟踪ay10012 1214+216+12=2814+216+28=4414+216+44=60变量跟踪分析法结果:a=16,y=60

判断m是否是素数#include<math.h>main(){intm,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)printf(“%disaprimenumber\n”,m);elseprintf(“%disnotaprimenumber\n”,m);}3.4.6循环结构中的辅助语句3.4.6循环结构中的辅助语句打印3到234之间的所有素数,每行打印10个main(){inti,j,k=0;for(i=3;i<234;i++){for(j=2;j<i;j++)if(i%j==0)break;if(i==j)printf(“%6d%c”,i,++k%10==0?’\n’:‘’);}printf(‘\n’);}以下程序段执行后x和i的值:inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;

continue;

}x-=3;}结果:x的值为10i的值为6

变量跟踪ix11→626→333→848→555→1063.4.6循环结构中的辅助语句把100~200之间不能被3整除的数输出:main(){intn;for(n=100;n<=200;n++){if(n%3==0)

continue;printf(“%d”,n);}}3.4.6循环结构中的辅助语句main(){inti,k=0;for(i=1;;i++){k++;while(k<i*i){k++;if(k%3==0)

gotoloop;

}}

loop:printf("%d,%d",i,k);}结果:2,33.4.6循环结构中的辅助语句一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,称为多重嵌套。

1)while(){…while(){…}…}3)do{…do{…}while();…}while();2)for(;;){…for(;;){…}…}4)for(;;){…for(;;){…}…}5)while(){…do{…}while();…}6)do{…for(;;){…}…}while();3.4.7

循环嵌套结构输出9*9口诀main(){inti,j,result;

printf("\n");for(i=1;i<10;i++){for(j=1;j<10;j++){result=i*j;printf(“%d*%d=%-3d”,i,j,result);

}

printf("\n");}注意内循环与外循环在屏幕上显示的位置3.4.7

循环嵌套结构1.案例描述公元前五世纪,我国古代数学家张邱建在《张邱建算经》一书中记有一个有趣的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。用百钱买百鸡,问鸡翁、母、雏各几何?后已成为世界数学史上著名的“百鸡问题”。2.案例分析设鸡翁、母、雏分别为chick、hen、cock,根据题意可得:chick/3十hen*3十cock*5=100(对应的钱数相等)chick十hen十cock=100(对应的鸡数相等)§3.5算法案例程序设计

3.5.1

百钱买百鸡3.算法描述设计程序求解这个三元一次方程组的正整数解,采用对变量做穷举,判断是否满足条件:chick/3十hen*3十cock*5==100&&chick十hen十cock==100对满足上述条件的解打印输出。3.5.1

百钱买百鸡[运行程序]截取输出结果的一部分如下:cock=0,hen=25,child=75cock=4,hen=18,child=78cock=8,hen=11,child=81cock=12,hen=4,child=844.程序实现#include<stdio.h>main(){intcock,hen,child;for(cock=0;cock<=20;cock++)for(hen=0;hen<=33;hen++)for(child=0;child<=100;child++)if(cock+hen+child==l00&&cock*5+hen*3+child/3.0==100)printf(“cock=%d,hen=%d,child=%d\n”,cock,hen,child);}

3.5.1

百钱买百鸡1.案例描述爱因斯坦出了这样一道数学题:设有一条长阶梯,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶,则最后剩5阶,只有每次跨7阶,最后才正好一阶不剩。问这条阶梯共有多少阶?

2.案例分析由已知条件:“每步跨2阶,最后余1阶”可知,阶梯数为奇数;由“每步跨7阶时,最后正好到达阶梯顶”可知,阶梯数为7的倍数。综合以上两个已知条件,阶梯数应为7的奇数倍数.这时可以用穷举法对所有可能的数:7,21,35,49,…一一进行测试,其中总有一个是我们要求得的结果。3.5.2

爱因斯坦的阶梯问题3.算法描述我们可把该问题抽象成一个如下数学表达式:xmod2=1xmod3=2xmod5=4xmod6=5xmod7=0从该表达式不难发现x一定是7的整数倍,因为xmod7=0,由此不难得到解决该问题一个简单而直观的方法:if(xmod2=1)and(xmod3=2)and(xmod5=4)and(xmod6=5)and(xmod7=0)最先得到的满足上述方程式的x值即为本题的答案。3.5.2

爱因斯坦的阶梯问题4.程序实现#include<stdio.h>main(){intn=7;while(n%3!=2||n%5!=4||n%6!=5)n=n+14;printf(“TheresultofEinstein’squestionis:%d\n”,n);}[运行程序]TheresultofEinstein’squestionis:1193.5.2

爱因斯坦的阶梯问题3.5.3

验证歌德巴求赫猜想1.案例描述德国数学家哥德巴赫(Goldbach)在1725年写给欧拉(Euler)的信中提出了以下猜想:任何大于2的偶数都是两个素数之和(俗称为1+1)。两个多世纪过去了,这一猜想既无法证明,也没有被推翻。试设计程序验证指定区间[c,d]上这—猜想是否成立。这是一道世界性的数学难题,至今未能完全解决。我国著名数学家陈景润为哥德巴赫猜想的证明作出过杰出的贡献。

2.案例分析设x是偶数,我们只要能够找到两个素数y,z,使其和等于x,即x=y+z。具体编程时,y首先取最小的素数2,然后测试z=x—y是否是素数。如果z是素数,验证成功,否则,y取下一个素数,再测试z=x—y是否是素数。据此一直进行下去,直到验证成功为止。

3.算法描述对于[c,d]上的所有偶数i,分解为奇数j与k=i-j(j=3,5,…,i/2)之和。用试商法对奇数j、k作检验判别,即用奇数x(3,5,…,sqrt(k))试商j与k(试商j*k即可)。

若存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论