




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章C语言程序的控制结构if语句及switch语句的使用3种循环结构break、continue和goto语句的作用常用算法:如递推法、穷举法等4.1算法4.1.1算法的概念4.1.2算法的表示方法4.1.1算法的概念著名的计算机科学家沃思(NikiklausWirth)曾经提出过:
数据结构+算法=程序数据结构(datastructure):即对数据的描述和组织形式。算法(algorithm):对操作或行为的描述,即操作步骤。广义地说,算法就是做某一件事的步骤或程序。计算机解题的算法大致包括这两大类算法:
非数值运算算法和数值运算算法。算法特性
:①有穷性。算法的步骤必须是有限的,每个步骤都在有限的时间内做完,执行有限个步骤后终止。②确定性。算法中每一步骤都必须有明确定义,不允许有模棱两可的解释,不允许有多义性。③有效性。算法的每一步操作都应该能有效执行。如一个数被0除就是无效不可行的,应避免。④没有输入或有多个输入。例如:求1+2+3+…+100时,不需要输入任何信息就能求出结果;而要求1+2+3+…+n时,必须从键盘输入n的值,才能求出结果。⑤有一个或多个输出。算法的目的是为了求解,“解”就是算法的输出。没有输出的算法是没有意义的。4.1.2算法的表示方法
常用方法有:自然语言、传统流程图、NS流程图、伪代码等
1.用自然语言表示算法自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。用自然语言表示算法,通俗易懂,但文字冗长,在表达上不够严格,引起理解上的歧义性,不易转化为程序,描述复杂的算法不很方便。因此,除了很简单的问题外,一般不用自然语言描述算法。
用自然语言表示的求1+2+3+…+6的算法如下:算法1:S1:计算1+2得到3;S2:将第一步中的运算结果3与3相加得到6;S3:将第二步中的运算结果6与4相加得到10;S4:将第三步中的运算结果10与5相加得到15;S5:将第四步中的运算结果15与6相加得到21。算法2:S1:定义循环变量i=1,用于保存和的变量s,并置初值为0;S2:判断i的值是否小于等于6,若是则执行S3,否则跳转到S4执行;S3:将i的值累加到s,然后变量i自身加1,转到S2执行;S4:输出s的值。算法1是最原始的方法,最为繁琐,步骤较多,当加数较大时,比如1+2+3+…,再用这种方法是行不通的;算法2是比较简单的算法,且易于在计算机上执行操作。
2.用传统流程图表示算法
流程图是一个描述程序的控制流程和指令执行情况的有向图,用流程图表示算法,直观形象,易于理解。美国国家标准化协会(ANSI)规定了一些常用符号如图所示用传统流程图描述计算1+2+3+…+6的算法
3.用NS结构化流程图表示算法1973年美国学者I.Nassi和B.Schneiderman提出了一种新型流程图—NS结构化流程图,这种流程图一方面取消了带箭头的流程线,这样算法被迫只能从上到下顺序执行,避免了算法流程的任意转向,适于结构化程序设计;另一方面,这种流程图节省篇幅,因而很受欢迎。用NS流程图描述的计算1+2+3+…+6的算法
4.用伪代码表示算法
伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法。它使用起来灵活,无固定格式和规范,无图形符号,只要写出来自己或别人能看懂就行,由于它与计算机语言比较接近,便于向计算机语言算法(即程序)过渡。用伪代码描述的1+2+3+…+6算法如下:begin/*算法开始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsend/*算法结束*/在程序设计中读者可根据需要和习惯任意选用。
4.2.4顺序程序控制结构
BAAB(a)传统流程图
(b)NS流程图程序自上而下执行,先执行A块,再执行B块。顺序结构的程序主要由4部分组成:①变量说明部分。②数据输入部分。③运算部分。④运算结果输出部分。例
:将任意小写字母转换为对应的大写字母并输出。#include<stdio.h>main(){ charc;
c=getchar(); c=c-32; putchar(c);}程序运行时,若输入:h↙则输出:H思考:如何判断输入的字符是否为小写字母?(将在3.5中讲解)例:从键盘任意输入一个三位数,要求输出这个数的逆序数。如:输入123,输出321。分析:要输出逆序数,则要将原数的个位、十位和百位数分离出来,再用“个位*100+十位*10+百位”求出逆序数。个位数字可用对10求余得到,如123%10=3;最高位百位数字可用对100整除得到,如123/100=1;中间位的数字既可通过将其变换为最高位再整除的方法得到,如(123-1*100)/10=2;也可通过将其变换为最低位再求余得到,如(123/10)%10=2。程序源代码如下:#include<stdio.h>main(){ intx,y,b0,b1,b2;/*变量声明*/ printf("Pleaseenteranintegerx:");/*提示用户输入一个整数*/ scanf("%d",&x);/*输入一个整数*/ b0=x%10;/*求最低位*/
b1=(x/10)%10;/*求中间位*/ b2=x/100;/*求最高位*/ y=b0*100+b1*10+b2;/*求逆序数*/ printf("y=%d\n",y);/*输出逆序数*/}程序的运行结果如下:Pleaseenteranintegerx:123↙y=321思考:是否还有其他方法分离个位、十位和百位数?4.3if语句和用if语句构成的选择结构4.3.1if语句C语言的if语言有两种形式:if(表达式)语句if(表达式)语句1else
语句2单分支if语句不含else子句双分支if语句含else子句关键字关键字(b)图表达式语句1语句2满足不满足(a)图表达式语句满足不满足例如:if(a<b){t=a;a=b;b=t;}例如:if(a!=0)printf(“a!=0\n”);elseprintf(“a==0\n”);4.3if语句和用if语句构成的选择结构4.3.1if语句例4.1输入两个数,分别放入x和y中,若两数不相等,则输出其中的最大数;若两数相等,则输出字符串x==y和x的值。程序分析:输入两个整数分别赋给变量x和y。比较两个数不相等相等x大于y(x>y)x小于y(x<y)x等于y(x==y)输出x输出y输出x==y和x开始输入x、y结束x>yx<yx==y满足不满足满足满足不满足不满足#include<stdio.h>main(){intx,y;printf("Enterx&y:\n");scanf("%d%d",&x,&y);if(x>y)printf("x=%d\n",x);if(x<y)printf("y=%d\n",y);if(x==y)printf("x==y%d\n",x);}printf("x,y:%d%d\n",x,y);输出x输出y输出x==y和x例:
写出以下程序执行后的输出结果#include<stdio.h>main(){inta=4,b=3,c=5,t=0;if(a<b)t=a;a=b;b=t;if(a<c)t=a;a=c;c=t;printf("%d%d%d\n",a,b,c);}输出结果为:5034.3if语句和用if语句构成的选择结构4.3.1if语句例4.2输入三个整数,分别放在变量a、b、c中,然后把输入数据重新按由小到大的顺序放在变量a、b、c中,最后输出a、b、c中的值。程序分析:输入三个整数分别放在变量a、b、c中。把三个整数由小到大进行排序。
a<b<c③
输出a、b、c。开始输入a、b、c结束输出a、b、c排序#include<stdio.h>main(){inta,b,c;
printf("inputa,b,c:");scanf("%d%d%d",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);/*输出原始数据*/
排序过程;
printf("%d,%d,%d\n",a,b,c);}abc302010a>ba>cb>c交换两个变量中的值交换两个变量中的值交换两个变量中的值302020102030if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}#include<stdio.h>main(){inta,b,c,t;printf("inputa,b,c:");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);}inputa,b,c:302010<CR>a=30,b=20,c=1010,20,304.3if语句和用if语句构成的选择结构4.3.1if语句例4.3输入两个数,分别赋给x和y,输出其中的大数。程序分析:1.输入两个数分别赋给变量x和y。2.输出其中的最大数:两数进行比较判断。如果x>y,则输出x;
否则,输出y。开始输入x、y结束x>y输出x输出y不满足满足#include<stdio.h>main(){intx,y;printf("Enterx&y:");scanf("%d%d",&x,&y);printf("x,y:%d%d\n",x,y);if(x>y) printf("max=x=%d\n",x);else printf("max=y=%d\n",y);printf("**end**\n");}Enterx&y:53<CR>x,y:53max=x=5**end**4.3if语句和用if语句构成的选择结构4.3.1if语句例4.4输入一个数,判别它是否能被3整除。若能被3整除,打印YES;不能被3整除,打印NO。程序分析:1.输入一个数赋给一个变量,比如n。2.判断它是否能被3整除。可以,则输出YES;
否则,输出NO。n%3==0(若能整除,则余数肯定为0)开始输入n结束n%3==0输出YES输出yNO不满足满足#include<stdio.h>main(){intn;printf("inputn:");scanf("%d",&n);if(n%3==0)/*判断n能否被3整除*/ printf("YES\n");else printf("NO\n");}inputn:9<CR>YESinputn:5<CR>NO问题描述:确定用户输入的数字是否可以被5整除,并输出相应的消息。#include<stdio.h>voidmain(){intnum;printf("\n请输入一个数:");scanf("%d",&num);
if(!(num%5)) printf("\n该数能被5整除
\n");else printf("\n该数不能被5整除
\n");}请输入一个数:90该数能被5整除示例(能否整除)问题描述:判定给定的年份是否为闰年。提示:闰年的判定规则为:能被4整除但不能被100整除的年份,或能被400整除的年份。
#include<stdio.h>voidmain(){intyear;printf("\n请输入年份:");scanf("%d",&year);
if((year%4==0&&year%100!=0)||(year%400==0)) printf("\n%d年是闰年
\n",year);else printf("\n%d年不是闰年
\n",year);}示例(判断闰年)请输入年份:20052005年不是闰年问题描述:输入一个5位数,判断它是不是回文数。例如:12321是回文数,个位与万位相同,十位与千位相同。
#include<stdio.h>voidmain(){ longge,shi,qian,wan,x; printf("\n请输入一个五位整数:"); scanf("%ld",&x);
wan=x/10000;//分解出万位数
qian=x%10000/1000;//分解出千位数
shi=x%100/10;//分解出十位数
ge=x%10;//分解出个位数
if(ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf("\n这个数是回文数\n"); else printf("\n这个数不是回文数\n");}示例(回文数)输出:请输入一个五位整数:45654这个数是回文数4.3if语句和用if语句构成的选择结构4.3.1if语句注意if后面圆括号中的表达式,可以是任意合法的C语言表达式(如:逻辑表达式、关系表达式、算术表达式、赋值表达式等),也可以是任意类型的数据(如:整型、实型、字符型、指针型等)。无论是否有else子句,if子句中如果只有一条语句,则此语句后的分号不能省略。如:if(x!=0)printf(“%f”,x);elseprintf(“%f”,y);此处的分号不能省略此处的分号也不能省略不能上菜有胡萝卜吗?有黄瓜吗?制作胡萝卜沙拉有多重条件判断有可以上菜制作黄瓜沙拉制作沙拉没有没有开始做黄瓜沙拉做胡萝卜沙拉有没有不能上菜可以上菜是否有胡萝卜有没有是否有黄瓜?结束多重if要处理多重条件判断的情况,需要使用多重条件结构多重条件结构嵌套ifswitch结构多重条件结构4.3if语句和用if语句构成的选择结构4.3.1.2嵌套的if语句第一种嵌套形式:if(表达式1)if(表达式2)语句1else语句2else
语句3图1表达式1语句3不满足表达式2语句1语句2满足满足不满足4.3if语句和用if语句构成的选择结构嵌套的if语句第二种嵌套形式:if(表达式1){if(表达式2)语句1}else
语句2图2表达式1语句2不满足满足表达式2语句1满足不满足注意在if子句中的一对花括号不可缺少。if(表达式1)if(表达式2)语句1else
语句2
应当注意if与else的配对关系。else总是与它上面的最近的if配对。例设变量a、b、c、d和y都已正确定义并赋值。若有以下if语句
if(a<b)if(c==d)y=0;elsey=1;该语句所表示的含义是()。A)B)C)D)
4.3if语句和用if语句构成的选择结构4.3.1嵌套的if语句第三种嵌套形式:if(表达式1)语句1elseif(表达式2)语句2else语句3表达式1不满足满足语句1表达式2语句2语句3满足不满足图3if(表达式2)语句2else语句3例从键盘输入x的值,并通过如下的数学关系式求出相应的y值。分析:该题的意图是根据输入的x值,判断x所属的区间,求出y值并输出。程序实现的步骤是:①从键盘输入一个数;②判断x所属的区间,求出y值;③输出结果。#include<stdio.h>main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;
elsey=1;printf("y=%d\n",y);}注意:在表示相等条件时,必须用“==”,不能用“=”
4.3if语句和用if语句构成的选择结构4.3.1嵌套的if语句第四种嵌套形式:if(表达式1)语句1elseif(表达式2)语句2表达式1不满足满足语句1表达式2语句2满足不满足图4if(表达式2)语句24.3if语句和用if语句构成的选择结构4.3.1嵌套的if语句第五种嵌套形式:if(表达式1)
语句1elseif(表达式2)
语句2elseif(表达式3)
语句3elseif(表达式4)
语句4:else
语句nif(表达式2)语句2else语句3if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3elseif(表达式4)语句4:else语句n表达式1语句1表达式2表达式3表达式4语句2语句3语句4语句n真真真真假假假假4.3if语句和用if语句构成的选择结构4.3.1嵌套的if语句例4.5编写程序,根据输入的学生成绩给出相应的等级,大于或等于90分以上的等级为A,60分以下的等级为E,其余每10分为一个等级。程序的意思为:成绩(g)大于等于90分以上(g>=90):A成绩(g)大于等于80分以上(g>=80):B成绩(g)大于等于70分以上(g>=70):C成绩(g)大于等于60分以上(g>=60):D成绩(g)不及格(g<60):Eg>=90g>=80g>=70g>=60真真真真假假假假输出A输出B输出C输出D输出E#include<stdio.h>main(){intg;printf("Enterg:");scanf("%d",&g);printf("g=%d:",g);if(g>=90)printf("A\n");elseif(g>=80)printf("B\n");elseif(g>=70)printf("C\n");elseif(g>=60)printf("D\n");elseprintf("E\n");}Enterg:72<CR>g=72:CEnterg:55<CR>g=55:E
4.3.2switch语句
当问题的分支较多(一般大于3个),用if-else-if结构解决时由于分支过多,结构冗长,程序逻辑关系不清晰,通常使用开关语句(switch语句)来简化程序设计。开关语句就像多路开关一样,使程序控制流程形成多个分支,根据一个表达式可能产生的不同结果值,选择其中的一个或几个分支语句去执行。因此,它常用于各种分类统计、菜单等程序设计。switch语句switch语句的形式如下:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2::case常量表达式n:语句ndefault:语句n+1}关键字注意在关键字case和常量表达式之间一定要有空格,例如:
case10(正确)case10(不正确)switch结构流程图执行过程:①计算switch后圆括号内表达式的值,然后用该值逐个与case后的常量表达式值进行比较。当找到相匹配的值时,就执行该case后面的语句。若所有case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。②执行完一个case后面的语句后,如果遇到break语句,则跳出switch语句;如果没有break语句,程序转到下一个case处继续执行,并不再进行判断。说明:①switch、case、default、break均是关键字。上述格式中花括号括起来的部分称为switch语句体。switch语句体中可以没有break语句和default部分。②switch后的表达式可以是整型或字符型,不能为实型。每一个case后面的常量表达式的值必须互不相同,常量表达式中不能有变量。③default最多只有一个,位置任意。各个case和default的出现次序不影响执行结果。④多个case可以共用一组执行语句。switch结构printf(“这是迈克尔,身高180cm,加利福尼亚第12大街”);printf(“这是丹尼尔,身高193cm,现居住地不明,1998年12月12日在佛罗里达被捕”);printf(“这是吉姆,身高175cm,墨西哥州海鸥路弗罗拉公寓,于2003年11月1日在新泽西因抢银行被捕”);default:printf(“未发现匹配项。对不起!”);停止搜索停止搜索停止搜索停止搜索警察记录嫌疑犯照片不是这是吉姆,身高175cm,墨西哥州海鸥路弗罗拉公寓,于2003年11月1日在新泽西因抢银行被捕不是是switch-case语句是多路判断语句switch语句计算条件表达式并对照多个常数值进行检查switch结构switch(表达式){case常量1:
语句; break;case常量
2:
语句; break;
default:
语句;}计算表达式的值如果等于常量1如果等于常量2如果没有找到匹配的值例若有定义:floatx=1.5;inta=1,b=3,c=2;则正确的switch语句是()。A)switch(x){case1.0:printf(“*\n”);case2.0:printf(“**\n”);}B)switch((int)x);{case1:printf(“*\n”);case2:printf(“**\n”);}C)switch(a+b){case1:printf(“*\n”);case2+1:printf(“**\n”);}D)switch(a+b){case1:printf(“*\n”);casec:printf(“**\n”);}switch语句例4.6用switch语句改写例4.5。#include<stdio.h>main(){intg;printf(“Enteramark:”);scanf(“%d”,&g);printf(“g=%d:”,g);switch(g/10){case10:case9:printf(“A\n”);case8:printf(“B\n”);case7:printf(“C\n”);case6:printf(“D\n”);default:printf(“E\n”);}}#include<stdio.h>main(){intg;printf("Enterg:");scanf("%d",&g);printf("g=%d:",g);if(g>=90)printf("A\n");elseif(g>=80)printf("B\n");elseif(g>=70)printf("C\n");elseif(g>=60)printf("D\n");elseprintf("E\n");}Enteramark:85<CR>g=85:BCDEbreak;break;break;break;break;/*最后一个也可以不要*/Enteramark:100<CR>g=100:AEnteramark:45<CR>g=45:EEnteramark:85<CR>g=85:B
语句标号和goto语句请看下面的程序例子:#include<stdio.h>main(){inti,sum=0;i=1;if(i<=100){sum=sum+i;i++;}printf(“%d\n”,sum);}loop:gotoloop;标识符建议同学们限制使用goto语句进行编程。但同学们一定要记住goto语句的一般形式和执行流程。选择结构习题4.1下列运算符中优先级最高的的算符是A!B%C-=D&&4.2下列运算符中优先级最低的的算符是A||B!=C<=D+4.3为表示关系:x≥y≥z,应使用C语言表达式是A(x>=y)&&(y>=z)B(x>=y)AND(y>=x)C(x>=y>=z)D(x>=y)&(y>=z)4.4设a,b和c都是int型变量,且a=3,b=4,c=5,则以下的表达式中值为0的表达式是Aa&&bBa<=bCa||b+c&&b-cD!((a<b)&&!c||1)4.5有以下程序:#include<stdio.h>main(){inta=2,b=-1,c=2;if(a<b)if(b<0)c=0;elsec+=1;printf("%d\n",c);}程序的输出结果是A0B1C2D3AAADC选择结构习题4.6有以下程序#include<stdio.h>main(){intw=4,x=3,y=2,z=1;printf("%d\n",(w<x?w:z<y?z:x));}程序的输出结果是A1B2C3D44.7有以下程序#include<stdio.h>main(){inta,b,s;scanf("%d%d",&a,&b);s=a;if(a<b)s=b;s*=s;printf("%d\n",s);}若执行以上程序时从键盘上输入3和4,则输出结果是A14B16C18D20AB选择结构习题4.8有以下程序段y=-1;if(x!=0)if(x>0)y=1;elsey=0;其能正确表示的数学函数关系是Ay=-1(x<0)0(x=0)1(x>0)By=1(x<0)-1(x=0)0(x>0)Cy=0(x<0)-1(x=0)1(x>0)Dy=-1(x<0)1(x=0)0(x>0)4.9有以下程序:#include<stdio.h>main(){intk=-3;if(k<=0)printf("****\n")elesprintf("&&&&\n");}程序的输出结果是A输出####B输出&&&&C输出####&&&&D有语法错不能通过编译CD选择结构习题4.10若a和b均是正整型变量,正确的switch语句是Aswitch(pow(a,2)+pow(b,2)){case1:case3:y=a+b;break;case0:case5:y=a-b;}Bswitch(a*a+b*b);{case3:case1:y=a+b;break;case0:y=a-b;break;}Cswitcha{default:x=a+b;case10:y=a-b;break;case11:x=a*b;break;}Dswitch(a+b){case10:x=a+b;break;case11:y=a-b;break;}A选择结构习题二.填空题4.11C语言中用______表示逻辑值”真”,用______表示逻辑值”假”.4.12C语言中的关系运算符”!=”的优先级比”<=”________.4.13C语言中的逻辑运算符”&&”比”||”的优先级________.4.14C语言中的关系运算符”==”比逻辑运算符”&&”的优先级________.4.15C语言中逻辑运算符______的优先级高于算术运算符.4.16将下列数学式改写成C语言的关系表达式或逻辑表达式A)_________B)________.A)a=b或a<cB)|x|>44.17请写出以下程序的输出结果__________.#include<stdio.h>main(){inta=100;if(a>100)printf("%d\n",a>100);elseprintf("%d\n",a<=100);}4.18请写出与以下表达式等价的表达式:A)__________B)_______!(x>0)B)!0非00低高高!a==b||a<cx<-4||x>41x<=01选择结构习题4.19当a=1,b=2,c=3时,以下if语句执行后,a,b,c中的值分别为_____,_____,______.if(a>c)b=a;a=c;c=b;4.20若变量已正确定义,以下语句段的输出结果是_________x=0;y=2;z=3;switch(x){case0:switch(y==2){case1:printf("*");break;case2:printf("%");break;}case1:switch(z){case1:printf("$");case2:printf("*");break;default:printf("#");}}322*#4.4循环结构while语句和用while语句构成的循环结构do-while语句和用do-while语句构成的循环结构for语句和用for语句构成的循环结构循环结构的嵌套break和continue语句在循环体中的作用程序举例4.4.1while语句和用while语句构成的循环结构while循环的一般形式while(表达式)循环体关键字当型循环图表达式循环体满足不满足例如:k=0;while(k<10){printf(“*”);k++;}**********4.4while语句和用while语句构成的循环结构4.4.1while循环的一般形式利用while循环编写程序,求1+2+3+…+100的值。分析:1+2+3+4+5ss=0s=s+1s=s+2s=s+3s=s+4s=s+5ss=1+2+3+4+5ns=s+n0保存到1361015初值#include<stdio.h>main(){ints=0,n;n=1;
while(n<=5){s=s+n;n++;}printf(“%d\n”,s);}15while(n<=100)问:循环体共执行了几次?4.4.2do-while语句和用do-while语句构成的循环结构do-while语句构成的循环结构do-while循环结构的一般形式:do
循环体
while(表达式);关键字直到循环不要忘了分号图循环体表达式不满足满足例如:s=0;i=0;do{i++;s+=i;}while(i<10);4.4.2do-while语句和用do-while语句构成的循环结构例:
计算Fibonacci(斐波那契)数列,直到某项大于1000为止,并输出该项的值。程序分析:f1f2f01①f=f1+f21②f1=f2③f2=f112直到f2大于1000为止#include<stdio.h>main(){intf1,f2,f;f1=0;f2=1;do{f=f1+f2;f1=f2;f2=f;}while(f2<=1000);printf("F=%d\n",f);}F=1597上机练习:请用while循环编写此程序。4.4.3for语句和用for语句构成的循环结for语句构成的循环结构for循环的一般形式如下:for(表达式1;表达式2;表达式3)循环体关键字for循环的执行过程:首先计算表达式1。然后计算机表达式2,进行条件判断。若条件为真,则执行循环体;否则,退出循环。当条件为真时,循环体执行一次后,转回执行表达式3。然后执行表达式2,继续进行条件判断…………例如:for(k=0;k<10;k++)printf(“*”);**********
说明1.for语句中的表达式可以部分或全部省略,但两个“;”不可省略。例如:for(;i<=10;i++)for(sum=0,i=1;i<=100;sum=sum+i,i++);2.for后一对圆括号中的表达式可以是任意有效的C语言表达式。例如:for(;;)printf(“*”);4.4.3for语句和用for语句构成的循环结构例:
用for语句编写程序,求1+2+3+…+100。#include<stdio.h>main(){ints=0,n;n=1;while(n<=100){s=s+n;n++;}printf(“%d\n”,s);}while结构#include<stdio.h>main(){ints,n;s=0;for(n=1;n<=100;n++)s+=n;printf("s=%d\n",s);}for结构s=5050思考与上机练习1.编写程序,求1*2*3*…*100
4.4.4循环结构的嵌套
循环结构中的循环体语句可以是任何合法的C语句,while、do…while、for语句是合法的C语句,当然也能出现在循环体中,这种循环体中又包含了另一个完整的循环结构,称为循环的嵌套。内嵌的循环还可以嵌套循环,这就是多层循环。while、do…while、for三种循环可以相互嵌套,层数不限。但最常用的是二重循环或三重循环,如果嵌套的层数更多,会增加程序阅读、理解的困难,给程序调试带来麻烦。嵌套循环时,外循环必须完整地包含内循环,不能相互交叉。嵌套循环的执行过程:首先执行外循环,然后执行内循环,外循环每执行一次,内循环就完整地执行一遍。若内循环中还存在嵌套的循环,则进入下一层嵌套循环结构中,顺序执行有关的循环结构。若在某层循环结构中嵌套了两个或多个并列的循环结构,则从外循环进入时,顺次执行这些并列的循环结构。例如:输出如下图所示图形,可以用单层循环实现:#include<stdio.h>main()*****{*****inti;*****for(i=1;i<=5;i++)*****printf(“*****\n”);*****}
语句“printf(“*****\n”);”的功能等价于以下的循环结构:for(j=1;j<=5;j++)printf(“*”);printf(“\n”);进行一个等价替换,就可以得到以下的嵌套循环:#include<stdio.h>main(){inti,j;for(i=1;i<=5;i++)
{for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}99表例:整元换零钱问题。把1元兑换成1分、2分和5分的硬币,共有多少种不同换法?(每种至少一个)分析:本题是一个穷举法问题。穷举是一种重复型算法。它的基本思想是,对问题的所有可能状态一一测试,直到找到解或者将全部可能状态都测试过为止。设5分硬币的可能个数为i,则i的取值范围应为1~19;设2分硬币的可能个数为j,则j的取值范围应为1~(100-i*5)/2-1;而1分的硬币个数应是100-5*i-2*j。设共有m种换法。为了方便阅读和计数,每10种换法中间空一行。#include<stdio.h>main(){ inti,j,m; m=0;
for(i=1;i<=19;i++) for(j=1;j<=(100-i*5)/2-1;j++)
{ printf("%d\t%d\t%d\n",i,j,100-5*i-2*j); m++; if(m%10==0)printf("\n");
} printf("\nm=%d\n",m);}4.5break和continue语句在循环体中的作用break语句在循环结构中起跳出循环体,即终止本层循环。图表达式语句1break语句2满足不满足例5.9计算s=1+2+3+…+i,直到累加到s大于5000为止,并给出s和i的值。#include<stdio.h>main(){inti,s;s=0;for(i=1;s<=5000;i++){s=s+i;}printf("s=%d,i=%d\n",s,i-1);}#include<stdio.h>main(){inti,s;s=0;for(i=1;;i++){s=s+i;
if(s>5000)break;
}printf("s=%d,i=%d\n",s,i);}s=5050,i=1004.5break和continue语句在循环体中的作用continue语句为结束本次循环,即跳过循环体中下面尚未执行的语句,接着转向循环条件进行判断。图表达式语句1continue语句2满足不满足例5.10在循环体中continue语句执行示例。#include<stdio.h>main(){intk=0,s=0,i;for(i=1;i<=5;i++){s=s+i;if(s>5){printf("****i=%d,s=%d,k=%d\n",i,s,k);continue;}k=k+s;printf("i=%d,s=%d,k=%d\n",i,s,k);}}问题描述:用“*”输出一个菱形图案,图案如下:
*************************嵌套循环示例1voidmain(){ inti,j,k;
for(i=1;i<=4;i++) {
for(j=1;j<=4-i;j++) printf("");
for(k=1;k<=2*i-1;k++)
printf("*"); printf("\n"); }
for(i=1;i<=3;i++){
for(j=1;j<=i;j++) printf("");
for(k=1;k<=7-2*i;k++) printf("*"); printf("\n");}}
输出:*************************控制打印的行数控制每行打印的空格数控制每行打印的*号数控制打印的行数控制每行打印的空格数控制每行打印的*号数问题描述:打印输出100至200之间的全部素数。分析:素数是指只能被1和它本身整除的数。算法比较简单,先将这个数被2除,如果能整除,且该数又不等于2,则该数不是素数。如果该数不能被2整除,再看则是否能被3整除。如果被3整除,并且该数不等于3,则该数不是素数,否则再判断是否被4整除,依此类推,该数只要是能被小于本身的某个数整除时,就不是素数。
嵌套循环示例2voidmain(){inti,j,n;n=0;
for(i=100;i<=200;i++){j=2;
while(i%j!=0)
j++;if(i==j){ printf("%4d",i); n++; if(n%8==0) printf("\n");}}printf("\n");}
输出:从100到200之间所有的素数为:
101103107109113127131137139149151157163167173179181191193197199控制每行输出8个素数如果第一个能被整除的数等于该数本身,则说明该数为素数从2到i之间寻找第一个能被整除的数嵌套循环示例3voidmain(){inti,num;charanswer;do{ printf("请输入一个数:"); scanf("%d",&num); printf("\n");
for(i=1;i<=10;i++)
{ printf("="); } printf("\n该数是
%d",num); printf("\n\n您是否还要输入其他的数(y/n)?"); fflush(stdin); answer=getchar(); }while(answer!='n');}输出:请输入一个数:58==========该数是58您是否还要输入其他的数(y/n)?y请输入一个数:64==========该数是64您是否还要输入其他的数(y/n)?nPressanykeytocontinue习题一.选择题5.1有以下程序段:intk,j,s;for(k=2;k<6;k++,k++){s=1;for(j=k;j<6;j++)s+=j;}printf("%d\n",s);程序段的输出结果是A9B1C11D105.2有以下程序段:inti,j,m=0;for(i=1;i<=15;i+=4)for(j=3;j<=19;j+=4)m++;printf("%d\n",m);程序段的输出结果是A12B15C20D25DC习题5.3有以下程序段:intn=10;while(n>7){n--;printf("%d\n",n);}程序段的输出结果是A10B9C10D998988787765.4有以下程序段:intx=3;do{printf("%3d",x-=2);}while(!(--x));程序段的输出结果是A1B30C1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人与公司投资合作合同范本2025
- 包装材料供应合同
- 证券交易合同格式规范
- 车辆过户合同协议书模板
- 商业综合体给排水工程清包合同范本
- 版临时电力施工合作合同
- 出口代理合同模板
- 旅行期间的紧急情况应对准备加强考核试卷
- 农村集体经济组织可持续发展能力评价与实践考核试卷
- 咖啡馆行业品牌延伸策略考核试卷
- 《烹饪美学》课件-项目二 烹饪色彩
- DZ∕T 0372-2021 固体矿产选冶试验样品配制规范(正式版)
- DZ∕T 0227-2010 地质岩心钻探规程(正式版)
- 细菌的分离培养与培养特性观察课件讲解
- 2024年江西省南昌市南昌县中考物理模拟试卷
- 国家电网公司输变电工程工艺标准库变电工程部分
- MOOC 数据库系统(中):建模与设计-哈尔滨工业大学 中国大学慕课答案
- 农贸市场消防整改报告
- 海上风电场工程结构安全监测建设规范
- 三会一课培训
- 压力管道焊接2020年压力管道检验师培训课件
评论
0/150
提交评论