中职C语言程序设计模块五课件_第1页
中职C语言程序设计模块五课件_第2页
中职C语言程序设计模块五课件_第3页
中职C语言程序设计模块五课件_第4页
中职C语言程序设计模块五课件_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、(中职)C语言程序设计模块五课件C语言程序的三种结构模块55.1算 法 简 述算法是指对整个问题解决过程的描述。这个描述可以是自然语言,也可以是流程图等,其中流程图是算法描述中使用最为普遍的一种。例如:的士计费规则:起步价5元,含2公里范围,210公里(含)以内每公里以1.5元计,10公里以外(超出10公里的部分)每公里以2元计。程序图如图5-1所示。图5-1的士计费规则程序图1有穷性:算法必须能在执行有限个步骤之后终止。2确切性:算法的每一步骤必须有确切的定义。3输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。4输出项:一个算法有一个或多个

2、输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。5可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称为有效性)。一般来说,算法具备五个明显的特征:5.1算 法 简 述5.2顺序结构程序设计5.2.1顺序结构程序设计示例1.#include main()3. 4.char a,b,c;/*定义a,b,c三个字符变量*/5.char ch10;/*定义一个名为ch的一维字符数组,数组长度10*/6.printf(Please input T , o , m:n);/*提示输入T,o,m这3个字符*

3、/7.a=getchar();/*从键盘获取一个字符,赋给字符变量a*/8.b=getchar();/*从键盘获取一个字符,赋给字符变量b*/9.scanf(%c,&c);/*从键盘给字符变量c输入值*/10.putchar(a);/* 输出字符变量a的值*/5.2顺序结构程序设计5.2.1顺序结构程序设计示例11.putchar(b);/*输出字符变量b的值*/12.printf(%c,c);/*输出字符变量c的值*/13.putchar( ! );/*输出一个“!”号*/14.putchar( n );/*输出一个换行符,即换一行*/15.printf(Tom s ASCII is:%dn

4、,a+b+c);/*输出3个字符变量所存放字符的ASCII码之和*/16.printf(Please input Lucy :n);/*提示输入“Lucy”*/17.scanf(%s,ch);/*输入Lucy这个字符串*/18.printf(%sn,ch);/*输出Lucy这个字符串*/19.printf(Lucy s ASCII is:%dn, L + u + c + y );/*输出“Lucy”每个字符的ASCII码之和*/20.字符变量只能用来存放单个字符,在内存中占1个字节的内存空间。5.2顺序结构程序设计5.2.2程序详解1.char a,b,c;字符变量5.2顺序结构程序设计5.2

5、.2程序详解字符变量只能存放单个字符,那字符串怎么办呢?当然得用字符数组了。这里声明了一个名为ch的一维字符数组,长度为10,即字符个数(包括空格及结尾符0。C语言中空格也是字符)不能超过10个。这里要区分两个概念,一个是字符数组实际长度,另一个是字符数组内存长度。例如:char a10=good;字符数组a的实际长度为4(4个字符),内存长度为10。char b=good;字符数组b的实际长度为4,内存长度为5。上列表明,在给字符数组初始化赋字符串时,系统会自动在串后面加上结尾符0,但是不会计入数组的长度,即数组实际长度仍为4。如果没有定义数组长度而初始化了字符串,计算内存长度时要加上这个结

6、尾符(占1 B),如“char b=good;”,则sizeof(b)的结果就是5。2.char ch10;一维字符数组5.2顺序结构程序设计5.2.2程序详解(1)输入字符串:scanf(%s,ch)。(2)输出字符串:printf(%s,ch)。要注意的是:在用scanf输入字符串时,因为scanf以空格、回车和Tab键作为分隔符,因此,若输入了空格,系统将其默认为结尾符,表示输入到此结束,这点要特别注意。而且,数组名代表了数组首元素首地址,不用加地址与&运算符。 数组名代表了数组首元素首地址,只需数组名,便可输出整个串。关于数组,我们以后再进行详述,这里略微提及一下。字符数组因为存放的是

7、字符串,因而可以用%s这个字符串格式声明进行输入和输出。举例说明:5.2顺序结构程序设计5.2.2程序详解a=getchar();C语言的getchar()函数。从键盘获取一个字符给字符变量a。getchar()函数是C语言中用于从键盘获取单个字符的函数,不能用于获取字符串。括号中不能有任何参数。给字符变量从键盘输入值,除了用getchar()这个函数外,还可用scanf()函数。例如:a=getchar();/*等同于“scanf(%c,&a);”,第9行就是如此*/3.getchar()函数5.2顺序结构程序设计5.2.2程序详解putchar(a); C语言的putchar()函数。输出

8、变量a的值(字符)。putchar()函数是C语言中用于输出单个字符的函数。其括号中的参数可以是变量,也可以是字符常量,输出字符常量时,要加单引号。例如,第13行的“!”输出“putchar(!);”和第14行的换行符输出“putchar(n);”。除了用putchar()外,单个字符输出当然也可以用printf()函数,如第12行的“printf(%c,c);”。由此可见,若变量a中存放字符g,则输出g的方式:putchar(a);/*等同于“putchar(g);”,等同于“printf(%c,a);” */4.putchar()函数5.2顺序结构程序设计5.2.2程序详解printf(T

9、oms ASCII is:%dn,a+b+c);输出存放在a、b、c这3个变量里的字符的ASCII码值之和。要注意a、b、c是变量而不是常量字符,因而不能加单引号。第19行的“printf(Lucys ASCII is:%dn,L+u+c+y);”中,L、u、c、y是常量字符,因而需加单引号。5.字符变量与字符常量5.2顺序结构程序设计5.2.3顺序结构程序设计举例【例5-1】求直角三角形的斜边hypot()函数。输入两直角边的值,如果输入了负数,就取其绝对值,求第三边的长。#include #include int main()float x,y,z;printf(Input 2 sides

10、:n);scanf(%f,%f,&x,&y);z=hypot(fabs(x),fabs(y); /*调用数学库函数hypot()求第三边*/printf(The NO.3 side is:%.2fn,z);printf(The NO.3 integer is:%fn,sqrt(abs(z); /*输出整数部分绝对值的开平方值*/5.2顺序结构程序设计5.2.3顺序结构程序设计举例输入输出效果:Input 2 sides:-1,2The NO.3 side is:2.24The NO.3 integer is:1.414214(1)hypot()函数是求直角三角形斜边的长度,包含于数学头文件ma

11、th.h中。用法是:double hypot(double x,double y)。(2)函数fabs()是取浮点数的绝对值,这里是防止输入了负数,因为边长不能为负。用法是:fabs(double x)。(3)abs()是取整型数的绝对值。用法是:abs(int x)。(4)sqrt()是求算术平方根函数。sqrt(abs(z)意为:先取浮点数z的整数部分的绝对值,再对该绝对值开平方。5.3选择结构程序设计5.3.1程序示例if()简单的单分支选择结构使用方法:if(表达式) 语句序列; 如果if()括号里的表达式为真,就执行里的语句序列,否则不执行。 如果只有一条语句,则可以省略,如本例中就

12、是如此。5.3选择结构程序设计5.3.2程序示例 if()简单的双分支选择结构使用方法:if(表达式) 语句序列1; else 语句序列2; 如果if()括号里的表达式值为真,执行语句序列1,否则执行语句序列2。5.3选择结构程序设计5.3.2程序示例 if()简单的双分支选择结构【例5-3】输入一个年份,判断是否为闰年。闰年的断定方法是:能被4整除但不能被100整除或能被400整除的年份为闰年。#include int main()int year;scanf(%d,&year);if(year%4=0&year%100=0)|year%400=0)printf(%d 是闰年n,year);

13、elseprintf(%d 不是闰年,year);5.3选择结构程序设计5.3.3程序示例 if()多分支选择结构使用方法:if(表达式1) 语句序列1; else if(表达式2) 语句序列2; else if(表达式3) 语句序列3; else语句序列;哪个if表达式的值为真,就执行它的语句序列,如果都不为真,就执行最后一个else的语句序列。5.3选择结构程序设计5.3.3程序示例 if()多分支选择结构模块5.3.1的火车货运站计费程序我们用多分支结构编写如下:printf(Please input w:);scanf(%d,&w);if(s1000)money=M*s*w;else

14、if(s2000)money=M*0.95*s*w;else if(s3000)money=M*0.92*s*w;else if(s5000)money=M*0.90*s*w;elsemoney=M*0.88*s*w;printf(nmoney=%.2f,money); 模块5.3.1的火车货运站计费程序我们用多分支结构编写如下:#include #define M 5.0int main()int s,w;float money;printf(Please input s:);scanf(%d,&s);5.3选择结构程序设计5.3.4程序示例 if语句嵌套的多分支选择结构模块5.3.1的火车

15、货运站计费程序我们用嵌套的多分支结构编写如下:elseif(s3000)money=M*0.92*s*w;elseif(s=1000这个条件,执行这一句*/printf(nmoney=%.2f,money);#include #define M 5.0int main()int s,w;float money;printf(Please input s:);scanf(%d,&s);printf(Please input w:);scanf(%d,&w);if(s=1000)/*在满足这个条件的前提下,执行下面的语句*/if(s2000)money=M*0.95*s*w;5.3选择结构程序设计

16、5.3.4程序示例 if语句嵌套的多分支选择结构要注意一种情况,有多个if和else时,else总是和它最近的if进行配对。如下例,根据对输入的两个整型值进行比较判断,输出相应的结果:if(yy若为1,再判断此处xy为假,直接执行这个else,输出Jack*/#include int main()int x,y;scanf(%d%d,&x,&y); /*输入2个整型值*/if(xy)/*判断xy的逻辑值为1还是0,为1,执行下面的if语句,否则,执行和该if对应的最末尾else,输出Jack*/5.3选择结构程序设计5.3.5程序示例 switch()语句多分支选择结构结构如下:switch(

17、表达式)case 常量1:语句序列1;/*注意常量值后面用的是冒号,不可与分号混淆*/case 常量2:语句序列2;case 常量n:语句序列n;default:语句序列;5.3选择结构程序设计5.3.5程序示例 switch()语句多分支选择结构switch()括号里的表达式将是一个确定的值。如果“”中哪个case后面的常量等于这个值,就从它后面的语句序列开始执行,直到遇到break语句或switch语句结束的“”为止。如果没有和它相等的值,就直接执行default后面的语句序列,退出switch。模块5.3.1的火车货运站计费程序我们用switch语句多分支结构编写如下:分析:条件中里程数

18、都是1 000的倍数,根据题意有以下条件分段:s=1 000&s=2 000&s=3 000&s=5 000去除上述条件后,剩最后这个条件,可设为default5.3选择结构程序设计5.3.5程序示例 switch()语句多分支选择结构由此,我们便可确定switch()括号里的表达式为s/1 000,而case 后面常量则是04的数。case 0: money=M*s*w; break;/*注意:每个case的常量值不能相同*/case 1: money=M*0.95*s*w; break;case 2: money=M*0.92*s*w; break;case 3: /*如果执行相同的语句组

19、,则对应的case语句可以共用一个语句组,如此处3、4*/case 4: money=M*0.90*s*w; break;default: money=M*0.88*s*w; break; /*没有匹配的常量值,执行此句*/printf(nmoney=%.2f,money);#include #define M 5.0int main()int s,w;float money;printf(Please input s:);scanf(%d,&s);printf(Please input w:);scanf(%d,&w);switch(s/1000)5.3选择结构程序设计5.3.5程序示例 s

20、witch()语句多分支选择结构说明:(1)switch()括号里表达式的值须与常量值类型一致。(2)常量值后用冒号,语句用分号。(3)如果执行相同的语句组,则对应的case语句可以共用一个语句组,如程序中的case 3和case 4。(4)如果没有break语句,就会一直往下执行,直到遇到break或switch语句结束。(5)每个case的常量值不能相同。(6)case和default的出现次序不影响程序的执行结果。5.4循环结构程序设计5.4.1while语句先判断后执行结构如下:while(条件表达式)循环体语句;如果()里的条件表达式值为真(1),则执行循环体语句,否则不执行。【例5

21、4】求n的阶乘(n!)。分析:n!=123(n-1)n,即乘数依次递增1,直到乘数递增到n。(1)这个乘数我们用一个整型变量(如i)来表示,从1开始(i初始化为1),每乘1次,i便递增1次,即i+。(2)相乘的结果(积)保存在一个长整型变量(如j)中。(3)循环的条件是i=n。printf(%ld,s); #include int main() int i=2,n;long s=0;scanf(%d,&n);while(i=n)s+=i;i+=2; /*每加1次便递增2*/printf(%ld,s); /*求1+2+3+n的和*/*求2+4+6+8+n的和(n为偶数)*/#include in

22、t main() int i=1,n;long s=0;/*求和为什么要初始化为0?*/scanf(%d,&n);while(i=2时,f(n)=f(n-1)+f(n-2);(3)定义a,b,c三个整型变量,初始化a1,b2,c为第3项开始,则c=a+b;以第4项为例:第2项(b)变为了第1项(a),即a=b;第3项(c)变为了第2项(b),即b=c;第4项变为c,c=a+b。整个过程就这么交替变化,形式如下:5.4循环结构程序设计5.4.1while语句先判断后执行#include int main() int a=1,b=2,c,n=3; /*n=3,意即从第3项开始*/while(n=2

23、0) c=a+b;a=b;b=c;n+;printf(NO.20=%d,c);输出结果:NO.20=109465.4循环结构程序设计5.4.1while语句先判断后执行【例5-7】有一分数序列21,32,53,85,138,2113求出这个数列的前20项之和。分析:(1)从第2项开始,分子是前一项的分子分母之和,分母是前一项的分子。(2)依据【例5-6】的思路,设3个浮点型变量(a=2,b=1,c)和一个求和的变量(s=0)以及循环变量(i=1); 则在循环体内有以下变化:先求和:s+=a/b; 分子分母之和放在变量c中: c=a+b;前一项的分子变分母:b=a; 前一项的分子分母之和变分子:

24、a=c;#include int main()int i=1;/*表示第1项*/5.4循环结构程序设计5.4.1while语句先判断后执行float a=2,b=1,c,s=0; /*s用于求和,初始化为0*/while(i=20)s+=a/b;c=a+b; /*分子分母之和放在变量c中*/b=a;/*前一分子变分母*/a=c; /*前面的分子分母之和变分子*/i+; /*项数递增*/printf(s=%f,s);运行结果:s=32.6602595.4循环结构程序设计5.4.1while语句先判断后执行【例5-8】猴子吃桃问题。猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了1个。第2

25、天早上又将剩下的桃子吃掉了一半,又多吃了1个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下1个桃子。求第1天共摘了多少桃子。分析:数学分析就是:设第一天共摘了x个桃子。若用xn表示每天剩下的桃子,如x1,x2,则有:第1天剩: x1=x-(x/2+1)=x/2-1,则x=2x1+2第2天剩: x2=x1-(x1/2+1)=x1/2-1,则x1=2x2+2第10天剩:x10=x9-(x9/2+1)=x9/2-1,则x9=2x10+2,而第10天只剩下1个桃子,这样,就可以初始化变量值为1。通过倒循环9次,得到x的值。5.4循环结构程序设计5.4.1while语句先判断

26、后执行仅需设两个通用变化量x 和x1,最终求得x的值。#include int main()int i=9;/*循环变量,共循环9次*/int x,x1=1; while(i0) x=2*x1+2;/*注意不可写成21,这是数学表达式*/x1=x;i-;printf(x=%d,x);/*输出结果:x=1534*/5.4循环结构程序设计5.4.1while语句先判断后执行【例5-9】统计从键盘输入的字符数,输入的字符以换行符结束。#include int main()int i=0;/*统计变量,初始化为0*/char ch;ch=getchar();/*先输入一个字符,存入字符变量ch中*/w

27、hile(ch!; n )/*判断输入的是不是换行符*/i+;/*不是换行符,i自增1*/ch=getchar(); /*继续从键盘输入字符*/printf(i=%d,i);5.4循环结构程序设计5.4.2do while语句先执行后判断结构如下:do 循环体语句; while(条件表达式);/*注意这里是语句的结束,必须带分号*/先执行循环体语句,再判断while()括号里的条件表达式是否为真(1),如果为真(1),继续执行循环体语句;如果为假(0),则终止循环。因此,dowhile循环至少要循环1次。5.4循环结构程序设计5.4.2do while语句先执行后判断对于【例5-4】求n的阶乘

28、(n!),用dowhile改写如下:#include int main() int i=1,n;long j=1;scanf(%d,&n);do j*=i;i+; while(i=n);printf(%ld,j);5.4循环结构程序设计5.4.2do while语句先执行后判断【例5-5】用dowhile改写如下:/*求1+2+3+n 的和*/*求2+4+6+8+n的和*/#include int main() int i=1,n;long s=0;scanf(%d,&n);dos+=i;i+;while(i=n);printf(%ld,s);/*求1+2+3+n 的和*/*求2+4+6+8+

29、n的和*/#include int main() int i=1,n;long s=0;scanf(%d,&n);dos+=i;i+;while(i=n);printf(%ld,s);5.4循环结构程序设计5.4.2do while语句先执行后判断【例5-6】和【例5-7】用dowhile改写如下:/*1,2,3,5,8斐波那契数列第20项*/#include int main() int a=1,b=2,c,n=3;doc=a+b;a=b;b=c;n+;while(n=20);printf(NO.20=%d,c);/*21,32,53,85,138,2113前20项之和*/while(n=2

30、0);printf(NO.20=%d,c);#include int main()int i=1; float a=2,b=1,c,s=0;dos+=a/b;c=a+b;b=a;a=c;i+;while(i=20);printf(s=%f,s);5.4循环结构程序设计5.4.2do while语句先执行后判断【例5-8】和【例5-9】用dowhile改写如下-/*猴子吃桃问题*/#include int main()int i=9;int x,x1=1; dox=2*x1+2;x1=x;i-;while(i0);printf(x=%d,x);/*统计从键盘输入的字符数*/#include in

31、t main()int i=0;char ch;ch=getchar();doi+;ch=getchar();while(ch=n);printf(i=%d,i);5.4循环结构程序设计5.4.2do while语句先执行后判断从上面程序来看,while和dowhile在很多情况下似乎一样,但是,还是要细细斟酌。例如,在统计从键盘输入的字符数时,用dowhile写的程序其实有一个漏洞,因为它至少要执行1次,所以,当一开始输入换行符时,程序也要执行1次i+,结果把换行符也当成了一个字符。在这种情况下,用while就能避免这种漏洞。5.4循环结构程序设计5.4.3for语句最灵活的循环语句结构如下

32、:for(式1;式2;式3)循环体语句;说明(假设有循环变量i):(1)“式1”为循环变量设置初值,如i=1;若循环变量已初始化,可省略“式1”。(2)“式2”为循环控制判断条件,一般为关系表达式(如i=10)或逻辑表达式。若省略,则说明循环条件始终为真(1)。(3)“式3”用于修改循环变量的值,如i+等同于i+=1。若省略“式3”,则在循环体内应另设条件以保证循环能正常结束,如“for(i=1;i=10;i+)”将循环10次。具体算法是:计算式1计算式2式2值为真,执行循环体计算式3的值计算式2的值式2值为假,退出循环,停止式3计算,执行循环体下面的语句 具体算法是:对于【例5-4】求n的阶

33、乘(n!),用for改写如下:#include int main() int i=1,n;long j=1;scanf(%d,&n);for(;i=n;)/*循环变量已初始化,省略式1。没有式3,在循环体内设了i+*/ j*=i;i+;printf(%ld,j);5.4循环结构程序设计5.4.3for语句最灵活的循环语句对于【例5-5】,用for改写如下:/*求1+2+3+n 的和*/#include int main() int i,n;long s=0;scanf(%d,&n);for(i=1;i=n;i+)s+=i; /*只一句,省略 */printf(%ld,s);/*求2+4+6+8

34、+n的和*/#include int main() int i,n; long s=0;scanf(%d,&n);for(i=2;i=n;) s+=i;i+=2; printf(%ld,s);5.4循环结构程序设计5.4.3for语句最灵活的循环语句【例5-6】和【例5-7】用for改写如下:/*1,2,3,5,8斐波那契数列第20项*#include int main() int a=1,b=2,c,n;for(n=3;n=20;n+) c=a+b;a=b;b=c; printf(NO.20=%d,c);/*21,32,53,85,138,2113前20项之和*/#include int m

35、ain()int i=1;float a=2,b=1,c,s=0;for(;i=20;i+)s+=a/b;c=a+b;b=a;a=c;printf(s=%f,s);5.4循环结构程序设计5.4.3for语句最灵活的循环语句【例5-8】和【例5-9】用for改写如下:/*猴子吃桃问题*/#include int main()int i,x,x1=1; for(i=9;i0;i-)x=2*x1+2;x1=x;printf(x=%d,x);/*统计从键盘输入的字符数*/#include int main()int i=0;char ch;ch=getchar();for(;ch=n;)i+;ch=g

36、etchar();printf(i=%d,i);5.4循环结构程序设计5.4.3for语句最灵活的循环语句【例5-10】循环输入10个整型数值,找出最大数和最小数,并计算10个数的平均值。5.4循环结构程序设计5.4.3for语句最灵活的循环语句#include stdio.hint main()int i,n,max,min,sum;max=-32768; /*用于保存最大值*/min=32767;/*用于保存最小值*/sum=0;for(i=1;imax)max=n; /*每循环一次判断一次,最后保存的是最大的值*/if(nmin)min=n; /*每循环一次判断一次,最后保存的是最小的值

37、*/sum+=n;5.4循环结构程序设计5.4.3for语句最灵活的循环语句printf(Max=%d,Min=%d,Average=%.2f,max,min,(float)sum/10);输入:1,2,3,4,5,6,7,8,9,10。结果:Please input the NO.1 score:1Please input the NO.2 score:2Please input the NO.3 score:3Please input the NO.4 score:4Please input the NO.5 score:5Please input the NO.6 score:6Plea

38、se input the NO.7 score:7Please input the NO.8 score:8Please input the NO.9 score:9Please input the NO.10 score:10Max=10,Min=1,Average=5.50【例5-11】素数判断。素数只能被1和它本身整除。具体判断方法是:对一个整数开平方取整(或者取此数的1/2),在此范围中循环,若该数能在这个范围内被整除,则肯定不是素数,因为这说明其中含有其因子。5.4循环结构程序设计5.4.3for语句最灵活的循环语句#include #include int main() int n

39、umber,flag=1,k,i;printf(Input a number:);scanf(%d,&number);k=sqrt(number);/*可改为k=number/2*/for(i=2;i=k;i+)【例5-11】素数判断。素数只能被1和它本身整除。具体判断方法是:对一个整数开平方取整(或者取此数的1/2),在此范围中循环,若该数能在这个范围内被整除,则肯定不是素数,因为这说明其中含有其因子。5.4循环结构程序设计5.4.3for语句最灵活的循环语句if(number%i=0)/*有因子,说明不是素数,标记赋0,退出循环*/flag=0;break;if(flag=1&number

40、=1)/*1不是素数*/printf(n%d is prime,number);elseprintf(n%d isnt prime,number);功能:在循环语句中用于强制跳出循环,执行循环体外下面的语句。在switch语句中,用于强制跳出switch语句,执行switch下面的语句。5.5break和continue控制语句5.5.1break语句 仅用于循环语句和switch语句中【例5-12】程序功能:程序实现并输出122,236,3412的功能,最大输出到相乘结果大于或等于100为止,并按每行5个输出。#include stdio.hint main()int i,j;for(i=1

41、,j=2;i=100)/*如果相乘的结果大于或等于100*/break;/*强制退出for循环*/输出结果如下:1*2=22*3=63*4=124*5=205*6=306*7=427*8=568*9=729*10=9010*11=1105.5break和continue控制语句5.5.1break语句 仅用于循环语句和switch语句中5.5break和continue控制语句5.5.1break语句 仅用于循环语句和switch语句中【例5-13】统计输入的元音字母(包括大小写)个数。#include stdio.hint main()char ch;int total=0;while(ch

42、=getchar()!=n)/*注意括号(ch=getchar()*/switch(ch)/*输入一个字符便判断一次*/ case a: case a:case A:case e:case E:case i:case I:5.5break和continue控制语句5.5.1break语句 仅用于循环语句和switch语句中【例5-13】统计输入的元音字母(包括大小写)个数。case o:case O:case u:case U: totalt+;break; /*是元音,统计变量自增,退出switch*/default:break; /*不是元音,退出switch*/printf(Total=

43、%d,total);功能:在循环体中如果continue上面的条件为真,则停止执行continue 下面的语句,直接进行下一轮循环判断;如果continue上面的条件为假,则直接执行continue下面的语句,再进行下一轮循环判断。5.5break和continue控制语句5.5.2continue语句 仅用于循环的语句5.5break和continue控制语句5.5.2continue语句 仅用于循环的语句【例5-14】输出110不能被3整除的数。#include stdio.hint main()int i;for(i=1;i=10;i+) if(i%3=0)continue; /*如果i

44、除3的模运算等于0,跳过下面的语句继续i的判断;否则,执行下面的语句*/printf(%dt,i); /*输出不能被3整除的数*/输出结果:124578105.5break和continue控制语句5.5.2continue语句 仅用于循环的语句【例5-15】输入一个数,对该数分解质因数。分析:首先要清楚质因数的概念。数分质数和合数,如2,3,5,717等是质数,只可分成1和它本身,即只可以分成1和其本身的乘积的数是质数。4,6,8,9,10,12等是合数,如422,8222,12223。可见,分解质因数主要是针对合数而言的。进一步可知:质因数指的是一个合数可以分解成的不可再分解的最小因数,如

45、18的分解过程如下(取除数,除数范围只能是大于或等于2小于其本身):从2开始,18/2=9,说明2是18的第一个质因数;9/2,有余数,说明第二个质因数不再是2;9/3=3,说明3是18的第二个因数;3/31,说明3又是18的第三个质因数。故18233。在程序中,判断能否被整除,用模运算:5.5break和continue控制语句5.5.2continue语句 仅用于循环的语句【例5-15】输入一个数,对该数分解质因数。#include int main() int x,i=2;/*1不是质数,数只能从2开始*/printf(Input a figure:); /*提示输入要分解的数*/sca

46、nf(%d,&x);printf(%d=,x); /*输出式子的左边部分*/for(;ix;)/*式1已初始化,i必须小于其本身,式3在循环体中*/ if(x%i=0)/*如果x可以被i整除,则说明i是其因子*/5.5break和continue控制语句5.5.2continue语句 仅用于循环的语句【例5-15】输入一个数,对该数分解质因数。printf(%d*,i); /*输出右边的乘积模式*/x/=i;/*取x除以i的结果再从循环处开始执行*/continue;/*如果x不能被i整除,跳出if,执行continue下面的i+*/i+;printf(%d,i); /*输出最后一个i*/ 输

47、入18,输出182*3*3。5.6goto语句功能:无条件转移程序的执行位置,亦称跳转语句。使用方法:goto 语句标号。#includeint main() int i,sum=0;for(i=1;i=100;i+)sum+=i;if(i=5)goto loop; /*跳转执行标号loop后的语句*/【例5-16】5.6goto语句功能:无条件转移程序的执行位置,亦称跳转语句。使用方法:goto 语句标号。loop: printf(i=%d,Hello,goton,i); /*标号必须带冒号“:”*/printf(sum=%dn,sum);输出结果:i=5,Hello,go to!sum=1

48、5说明:(1)标号是一个有效的标识符,其后必须接冒号“:”。(2)goto和标号可以不在同一个循环中,但是必须在同一个函数中。(3)goto通常和if条件语句连用,当条件满足时,跳转到标号处运行。(4)goto语句通常不用,因为它容易导致程序层次不清,且不易读。它一般用于多层嵌套退出情形中。【例5-16】5.6goto语句【例5-17】/*下面的goto与if连用,实现类似循环的功能*/int main()int i=1,sum=0;flag:if(i=100) sum+=i;i+;goto flag;printf(sum=%dn,sum);/*输出:sum=5050*/*与for循环比较*/

49、#include int main()int i=1,sum=0;for(;i=100;i+)sum+=i;printf(sum=%dn,sum);/*输出:sum=5050*/5.7循环的嵌套5.7.1嵌套示例【例5-18】九九乘法表。分析如下:#include int main()int i,j;for(i=1;i=9;i+)for(j=1;j=9;j+)printf(%d*%d=%dt,i,j,i*j);if(j=9)printf(n);/*每行输出9个等式*/5.7循环的嵌套5.7.1嵌套示例输出结果如下:1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=8

50、1*9=92*1=22*2=4 2*3=62*4=82*5=102*6=122*7=142*8=162*9=183*1=33*2=63*3=9 3*4=123*5=153*6=183*7=213*8=243*9=274*1=44*2=84*3=124*4=16 4*5=204*6=244*7=284*8=324*9=365*1=55*2=105*3=155*4=205*5=25 5*6=305*7=355*8=405*9=456*1=66*2=126*3=186*4=246*5=306*6=36 6*7=426*8=486*9=547*1=77*2=147*3=217*4=287*5=357*

51、6=427*7=49 7*8=567*9=638*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64 8*9=729*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=815.7循环的嵌套5.7.1嵌套示例【例5-19】图形打印。*#include int main()int i,j;for(i=1;i=9;i+) for(j=i;j=9;j+)printf(*);printf(n);5.7循环的嵌套5.7.1嵌套示例【例5-20】求完全数。求出11 000以内的完全数。所谓完全数,指的是这样一个数:该数等

52、于其所有因子(并不一定是质因子且除去它本身)之和。例如,28=147,28=214,故28的因子有1,2,4,7,14,1+2+4+7+14=28,则28是完全数。#includeint main()int a,i,m;printf(There are following perfect numbers smaller than 1000:n);for(a=1;a1000;a+)/*循环控制选取11 000中的各数进行判断*/for(m=0,i=1;i=a/2;i+)/*计算a的因子,最大的因子只能是该数的1/2 */if(a%i)m+=i;/* (a%i)等同于a%i=0。如果a%i=0,则

53、i是因子,累加到m中*/if(m=a)/*如果m等于a,则a是完全数,输出a,继续下一个数的判断*/printf(%4d ,a);printf(n);输出结果:6284965.7循环的嵌套5.7.1嵌套示例【例5-20】求完全数。求出11 000以内的完全数。所谓完全数,指的是这样一个数:该数等于其所有因子(并不一定是质因子且除去它本身)之和。例如,28=147,28=214,故28的因子有1,2,4,7,14,1+2+4+7+14=28,则28是完全数。#includeint main()int a,i,m;printf(There are following perfect numbers

54、 smaller than 1000:n);for(a=1;a1000;a+)/*循环控制选取11 000中的各数进行判断*/for(m=0,i=1;i=a/2;i+)/*计算a的因子,最大的因子只能是该数的1/2 */5.7循环的嵌套5.7.1嵌套示例if(!(a%i)m+=i;/* !(a%i)等同于a%i=0。如果a%i=0,则i是因子,累加到m中*/if(m=a)/*如果m等于a,则a是完全数,输出a,继续下一个数的判断*/printf(%4d ,a);printf(n);输出结果:6284965.7循环的嵌套5.7.1嵌套示例【例5-21】求亲密数。所谓亲密数,就是整数A的全部因子(

55、不包括A本身)之和等于整数B,整数B的全部因子(不包括B本身)之和等于整数A,那么A、B就是亲密数。例如:220的全部因子之和为:1+2+4+5+10+11+20+22+44+55+110284。284的全部因子之和为:1+2+4+71+142220。故220和284是亲密数。#include int main() inti,j,k,sum1,sum2;for(i=1;i=10000;i+) sum1=0;sum2=0;for(j=1;ji;j+)if(i%j=0)sum1+=j; /*所有因子之和*/5.7循环的嵌套5.7.1嵌套示例for(k=1;ksum1;k+)if(sum1%k=0)

56、sum2+=k;/*所有因子之和*/if(sum2=i&i=sum1&isum1)printf(%d%dn,i,sum1); 输出结果:220284118412102620292450205564623263685.7循环的嵌套5.7.2穷举法【例5-22】换钞问题。打印出用100元钱换成面值为1元、2元、5元、10元钱面值(每种面值至少要有一种)的换法。分析:因为每种面值至少要有一种,在1元的所有换法中,把它的换法(用a表示,下同)和2元的换法(b)和5元的换法(c)以及10元的换法(d)一一去匹配,方法是:1*a+2*b+5*c+10*d=100。这样,就有四重循环。该题所用的方法,就是编

57、程中常用的方法之一,即穷举法。int a,b,c,d;int count=0; /*count用于统计总的方法数量*/for(a=1;a100;a+)/*每种面值至少要有一种,所以不能a=100,下同* /for(b=1;b50;b+)for(c=1;c20;c+)for(d=1;d10;d+)if(1*a+2*b+5*c+d*10=100)/*如果符合条件*/ 5.7循环的嵌套5.7.2穷举法printf(a=%d,b=%d,c=%d,d=%d,a,b,c,d);/*输出具体的方法*/count+; /*统计自增* /if(count%4=0)printf(n); /*控制一行输出4个*/p

58、rintf(There are %d ways,count);/*输出总的方法数*/总的方法输出结果:There are 1254 ways5.7循环的嵌套5.7.2穷举法【例5-23】车牌号问题。一辆卡车违反交通规则,撞人后逃逸。现场有3人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。根据线索求出车号(车牌不能以0开头,只有4位数)。#include #include math.hint main()int i,j,k,c;for(i=1;i=9;i+)/*设

59、i为前两位,车牌不以0开头,则范围为19*/for(j=0;j=9;j+)/*设j为后两位,可以为0,故范围为09*/if(i!=j)/*前后数字不同*/5.7循环的嵌套5.7.2穷举法k=i*1000+i*100+j*10+j;/*车牌的和*/for(c=31;c*ck;c+);/*4位车号(最小1 000)刚好是一个整数的平方,故C可从31起*/if(c*c=k)printf(is %dn,k);输出结果:is 77445.7循环的嵌套5.7.2穷举法【例5-24】结婚配对问题。3对情侣参加婚礼,3个新郎为A、B、C,3个新娘为x、y、z。有人不知道谁跟谁结婚,于是询问了6位新人中的3位,

60、但听到的回答是这样的:A说他将和x结婚;x说她的未婚夫是C;C说他将和z结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁跟谁结婚。5.7循环的嵌套5.7.2穷举法(1)穷举每一个新娘可能的全部配偶,均有三种。(2)新郎A、B、C分别用1、2、3代表,有x!=1,x!=3,z!=3。(3)新娘不能互相结婚,有x!=y,x!=z,y!=z。#include int main()int x,y,z;/*3位新娘*/for(x=1;x=3;x+)/*穷举新娘x的全部可能配偶情况*/for(y=1;y=3;y+)/*穷举新娘y的全部可能配偶情况*/ for(z=1;z=3;z+)/*穷举新娘z的全

温馨提示

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

评论

0/150

提交评论