结构化程序设计_第1页
结构化程序设计_第2页
结构化程序设计_第3页
结构化程序设计_第4页
结构化程序设计_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

第3章

结构化程序设计第一节输入输出函数第二节顺序结构程序设计第三节选择结构程序设计第四节循环结构程序设计第五节结构化程序设计举例1/96《C语言程序设计》

龙昭华主编课件制作:刘达一节

输入输出函数(第三章结构化程序设计)2/96一、标准字符数据的输入输出●C语言无I/O语句,I/O操作由函数实现●I/O操作由函数在stdio.h中定义●使用I/O操作由函数时必须使用#include<stdio.h>或#include“stdio.h”1、标准字符输出函数

格式:putchar(c)、putch(c)

参数:参数c为字符常量、字符或整型变量、表达式

功能:把字符c输出到标准输出设备(即显示器)上

返回值:正常返回,为显示字符的代码值;若出错,返回为EOF(即-1)说明:

①此函数只能输出单个字符数据。②参数c可以是字符常量、转义字符、字符变量、整型常量、整型变量。③从功能角度来看,printf()函数使用%c完全可以代替putchar()函数和putch()函数。④putchar()函数和putch()函数的功能完全一样。课件制作:刘达3.1第一节

输入输出函数3/96(第三章结构化程序设计)#include<stdio.h>main(){intc;chara;c=65;a='B';putchar(c);putchar('\n');putchar(a);}运行结果:AB#include<stdio.h>main(){intc=65;chara=‘B’;printf(“%c\n%c”,c,a);}运行结果:AB等价于:课件制作:刘达明023-668341102、标准字符输入函数第一节

输入输出函数4/96(第三章结构化程序设计)

格式:getchar()、getch()、getche()

功能:从标准的输入设备(如键盘)读一个字符

返回值:正常,返回读取的字符代码值;若出错,返回为EOF(即-1)说明:

①getchar()函数、getch()函数、getche()函数,都只能接受一个字符。②getchar()函数在输入一个或若干个字符后,必须以回车键结束,否则字符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。③getch()和getche()函数在输入一个字符后,立即被函数接受,不用回车键。使用getch()接受字符时,屏幕上不回显原输入的字符。使用getche()接受字符时,要显示原输入的字符。

④利用回显和不回显的特点,getch()和getche()这两个函数经常用于交互输入的过程中完成暂停等功能。

⑤从功能角度来看,scanf()函数使用%c完全可以代替getchar()、getch()和getche()函数。课件制作:刘达3.2从键盘输入一小写字母,输出对应的大写字母。第一节

输入输出函数5/96(第三章结构化程序设计)#include<stdio.h>voidmain(){charch;printf("Pleaseinputasmallcharacter:");ch=getchar();/*输入1个字符并赋给ch*/ch=ch-32;putchar(ch);putchar('\n');}运行结果:Pleaseinputasmallcharacter:ac(回车)A#include<stdio.h>voidmain(){charch;printf(“Inputasmallcharacter:");ch=getch();/*输一字符给ch*/ch=ch-32;putchar(ch);putchar('\n');}运行结果:Inputasmallcharacter:(输入a)A课件制作:刘达3.3第一节

输入输出函数6/96(第三章结构化程序设计)#include<stdio.h>

main()

{

charc,s[20];

printf(“Name:”);

gets(s);/*从键盘读字符串(回车结束)*/

printf(“Pressanykeytocontinue...”);

getch();

/*等待输入任一键确认(不显示)*/

}运行结果:Name:VeryGood!(回车)Pressanykeytocontinue…#include<stdio.h>main(){intc;printf("Enteracharacter:");c=getchar();printf("%c--->hex%x\n",c,c);}运行结果:Enteracharacter:A(回车)A--->hex41例3.4课件制作:刘达3.5第一节

输入输出函数7/96(第三章结构化程序设计)#include<stdio.h>

voidmain(){charch1,ch2,ch3;printf("Pleaseinputtwocharacter:");ch1=getchar();/*输入一个字符并赋给ch*/putchar(ch1);putchar('\n');ch2=getchar();/*输入一个字符并输出*/putchar(ch2);putchar('\n');ch3=getchar();printf(“%d\n”,ch3);}运行结果:Pleasinputtwocharacter:ab(回车)ab10实际上第一个getchar()输入了ab两个字符,而第二个getchar()是直接读取原输入的第二个字符b。即将‘a’赋给了ch1,将‘b’赋给了ch2。ch3的值实际上是第一个getchar()所输入的,我们不需要的“垃圾”字符。也就是说,用getchar()输入字符时,其输入的字符个数比可见的字符多1个。课件制作:刘达3章

结构化程序设计----习题18/96《C语言程序设计》

龙昭华主编

习题(一)***复习本章已讲内容,预习本章剩余内容。课件制作:刘达、格式化输出函数第一节

输入输出函数9/96

格式:printf(“格式控制字符串”,输出项列表)

功能:按指定格式向显示器输出数据

返回值:正常,返回输出字节数;若出错,返回为EOF(即-1)括号内包括两部分:⑴格式控制字符串。是用双引号括起来的字符串,它包括两种信息:①格式说明:由%和格式字符组成,它的作用是将输出的数据转换为指定的格式输出。格式说明总是由一个%开始,以一个格式字符结束,中间可有若干个修饰符。如:%d、%f、%7d、%8.3f、%-04d、%08d、%6s、%#o、%#x等。②普通字符:按原样输出。如逗号、空格、换行符、提示信息等。⑵输出列表项。需要输出的一些数据(可以没有,多个时以“,”分隔),可以是常量、变量、表达式,其类型与个数必须与格式控制字符串中格式字符的类型、个数一致。printf函数的一般形式为:printf(参数1,参数2,参数3,……,参数n)1、printf函数的一般形式(第三章结构化程序设计)课件制作:刘达明023-668341102、printf函数的格式控制字符串第一节

输入输出函数10/96格式字符:d,ix,Xoucse,Efg,G%%十六进制无符号整数(无0x)不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数(无前0)小数形式浮点小数(有效6位)e和f中较短一种(不输出0)百分号本身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%p指针的值char*p;p=“12”;printf(“%p”,p);0194(第三章结构化程序设计)课件制作:刘达3.6第一节

输入输出函数11/96main(){inta=3,b=4;printf(“%d%d%%\n”,a,b);printf(“a=%d,b=%d\n”,a,b);}111111111111111165535或-1例3.7

main(){unsignedintu=65535;inti=-1,j=1234;printf(“u=%d,i=%u\n”,u,i);printf(“%d,%o,%x,%X”,j,j,j,j);}运行结果:4%a=3,b=4运行结果:u=-1,i=655351234,2322,4d2,4D2(第三章结构化程序设计)课件制作:刘达rintf函数的修饰符(附加格式说明符)及其含义第一节

输入输出函数12/96.n对实数,指定小数点后位数(四舍五入)对字符串,指定实际输出位数修饰符功能m输出数据域宽,数据长度<m,左补空格;否则按实际输出输出数据在域内左对齐(缺省右对齐)-指定在有符号数的正数前显示正号(+)+输出数值时指定左面不使用的空位置自动填00在八进制和十六进制数前显示前导0,0x#在d,o,x,u前,指定输出精度为long型在e,f,g前,指定输出精度为double型l以短整型格式输出数据h(第三章结构化程序设计)课件制作:刘达rintf函数说明:第一节

输入输出函数13/96

①修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等;用于产生更规范整齐的输出。当没有修饰符时,以上各项按系统缺省设定显示。

②修饰符的顺序为:[-][+][0][m.n][l|h]。

③格式字符除了E、G、X外,其余要用小写。

④可以在printf函数中的“格式控制字符串”内使用转义字符,如:\n、\t、\377等。

⑤输出转换:当格式字符与输出项类型不一致时,自动按指定格式输出。

⑥在实际应用中,还可以用常量或变量的值来控制输出数据的宽度,其方法是以一个“*”作为修饰符,插入到%之后。如:inti=123;printf(“%*d”,5,i);等价于:printf(“%5d”,i);又如:inti=123,k=5;printf(“%*d”,k,i);用k动态指定场宽。

⑦当指定宽度小于数据的实际宽度时,对字符串或整数,按该数据的实际场宽输出;对浮点数,整数部分按实际场宽输出,相应小数位的数四舍五入。

⑧对于修饰符数字0,当格式字符为d,o,x,e,f,g时,数据的前面补0。当格式字符为c,s时,数据的前面补空格(相当于修饰符0不起作用)。若修饰符0的前面有修饰符,则修饰符0不起作用。(第三章结构化程序设计)课件制作:刘达rintf函数格式控制符的主要组合说明:第一节

输入输出函数14/96

①d格式符:%d、%md、%ld、%mld、%hd、%+md、%-md、%0md等。

②o格式符:%o、%lo、%ho、%mo、%#o等。

③x格式符:%x、%lx、%mx、%#x、%hx等。

④u格式符:%u、%lu、%hu等。

⑤c格式符:%c、%mc等。

⑥s格式符:%s、%ms、%-ms、%m.ns、%-m.ns、%.ns(前m自动为n)等。

⑦f格式符:%f、%m.nf、%-m.nf、%lf等。

⑧e格式符:

%e、%m.ne、%-m.ne、%.ne(前m自动为n)等。(第三章结构化程序设计)课件制作:刘达3.8教材p43的例3.2第一节

输入输出函数15/96#include<stdio.h>{inta=15;floatb=138.3576278;doublec=35648456.3645687;chard=‘p’;printf(“a=%d,%5d,%o,%x\n”,a,a,a,a);printf(“b=%f,%lf,%5.4lf,%e\n”,b,b,b,b);printf(“c=%lf,%f,%8.4lf\n”,c,c,c);printf(“b=%g,c=%g\n”,b,c);printf(“d=%c,%8c\n”,d,d);}输出结果为:a=15,15,17,fb=138.357620,138.357620,138.3576,1.38358e+02c=35648456.364569,35648456.364569,35648456.3646b=138.358,c=3.56485e+07d=p,p(第三章结构化程序设计)课件制作:刘达、格式化输入函数第一节

输入输出函数16/96

格式:scanf("格式控制字符串",输入项地址表)

功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束

返回值:正常,返回输入数据个数;若出错,返回为EOF(即-1)或0括号内包括两部分:⑴格式控制字符串。其说明同printf函数。格式控制字符串必须用双引号括起,由格式转换说明符和须原样输入的非格式字符两部分组成。格式转换说明符必须以百分号“%”开始,格式字符结束,中间有若干个修饰符。⑵输入项地址表。是由若干个地址组成的列表,可以是变量的地址、或字符串的首地址、指针变量、数组名等。注意:地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间用","分开。scanf函数的一般形式为:

scanf(参数1,参数2,参数3,……,参数n)1、scanf函数的一般形式(第三章结构化程序设计)课件制作:刘达明023-668341102、scanf函数的格式控制字符串第一节

输入输出函数17/96格式字符:格式控制字符串的一般格式为:

%修饰符格式字符

例scanf(“%d”,&a);

输入:10

则a=10(十进制)例scanf(“%x”,&a);

输入:11

则a=17(十进制)d,ix,Xoucse,Ef用来输入一个十六进制整数

用来输入一个无符号整数

以指数形式输入一个实数

用来输入一个字符

用来输入一个字符串

用来输入一个八进制整数

用来输入一个实数

用来输入一个十进制整数

g,G作用与e和f相同(第三章结构化程序设计)课件制作:刘达canf函数的修饰符(附加格式说明符)及其含义第一节

输入输出函数18/96l修饰符功能hm*用于d,o,x前,指定输入为short型整数用于d,o,x前,指定输入为long型整数用于e,f前,指定输入为double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量修饰符的顺序为:[*][m][l|h](第三章结构化程序设计)课件制作:刘达canf函数说明:第一节

输入输出函数19/96

⑴修饰符是可选的,用于确定数据输出的宽度等。

⑵格式控制字符串中,可以包括格式转换字符说明之外的其它普通字符,这些普通字符在输入时要原样输入。

⑶scanf函数中没有精度控制,但用十进制整数指定输入的宽度(即字符数)。

⑷scanf中要求给出变量地址,即用&运算符,如给出变量名则会出错。但字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。

⑸在输入多个数值数据时,若格式控制字符串中没有非格式字符作输入数据之间的分隔,则可用空格、TAB键或回车键作分隔。C编译在遇到空格、TAB键、达到宽度要求、回车键或非法数据时即认为该数据结束。

⑹在输入字符数据时,若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符。

⑺如果格式控制字符串中有非格式字符则输入时也要输入该非格式字符。

⑻%后的“*”修饰符用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。

⑼用“%c”格式符时,空格和转义字符作为有效字符输入。

⑽空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。(第三章结构化程序设计)课件制作:刘达scanf输入函数留下的“垃圾”处理方法:第一节

输入输出函数20/96①用getchar()清除。②用函数fflush(stdin)清除全部剩余内容。③用格式串中空格或“%*c”来“吃掉”。例intx;charch;scanf(“%d”,&x);scanf(“%c”,&ch);printf(“x=%d,ch=%d\n”,x,ch);执行:123输出:x=123,ch=10例intx;charch;scanf(“%d”,&x);ch=getchar();printf(“x=%d,ch=%d\n”,x,ch);执行:123输出:x=123,ch=10⑿在使用scanf函数时,在格式控制字符串中不要使用‘\n’转义字符。(第三章结构化程序设计)课件制作:刘达3.9第一节

输入输出函数21/96#include<stdio.h>

main()

{

charc1,c2;

scanf("%c",&c1);

scanf("%c",&c2);

printf("c1is%c,c2is%c",c1,c2);

}执行:a(回车)输出结果为:c1isa,c2is#include<stdio.h>

main()

{

charc1,c2;

scanf("%c",&c1);

fflush(stdin);

scanf("%c",&c2);

printf("c1is%c,c2is%c",c1,c2);

}执行:a(回车)b(回车)输出结果为:c1isa,c2isb(第三章结构化程序设计)课件制作:刘达二节

顺序结构程序设计(第三章结构化程序设计)22/96例3.10

输入三角形三边,求三角形面积。解:其中:a、b、c分别是三角形三边的长,s=(a+b+c)/2。其算法和程序分别为:#include<stdio.h>#include<math.h>

main()

{

floata,b,c,s,area;

scanf(“a=%f,b=%f,c=%f",&a,&b,&c);

if((a>0)&&(b>0)&&(c>0)&&(a+b>c)&&(a+c>b)&&(b+c>a)){s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%f,b=%f,c=%f\n",a,b,c);printf(“area=%7.2f\n”,area);}elseprintf(“Datainputerror!”);}/*执行结果参见教材P49*/

输入三角形三边长a,b,ca+b>c且a+c>b且b+c>a且a>0且b>0且c>0

s=(a+b+c)/2

area=sqrt(s*(s-a)*(s-b)*(s-c))

打印三角形三边长a,b,c

打印三角形面积area是否打印三角形三边长输入错误已知三角形三边,求三角形面积的公式为:课件制作:刘达3.11第二节

顺序结构程序设计23/96(第三章结构化程序设计)输入一个华氏温度,要求输出摄氏温度。公式为:c=(5/9)*(F-32)。取2位小数。解:#include<stdio.h>main()

{

floatF,c;

scanf(“%f”,&F);/*输入华氏温度F*/

c=(5.0/9.0)*(F-32.0);/*计算摄氏温度c*/printf(“F=%f\n",F);printf(“c=%7.2f\n”,c);}执行:90(回车)输出结果为:F=90.000000c=32.22输入华氏温度Fc=(5.0/9.0)*(F-32.0)打印华氏温度F打印摄氏温度c课件制作:刘达堂作业:第二节

顺序结构程序设计24/96(第三章结构化程序设计)编写一程序,从输入键盘一个字符,输出其ASCII码。课件制作:刘达3章

结构化程序设计----习题225/96《C语言程序设计》

龙昭华主编

习题(二)***复习本章已讲内容,预习本章剩余内容。3.1教材P93~94的习题3.1选择题中的⑴、⑵、⑶、⑷小题。3.2教材P96的习题3.4编程题中的⑴、⑵小题。课件制作:刘达三节

选择结构程序设计(第三章结构化程序设计)26/96一、if语句1、“if(表达式)语句”形式语句格式的一般形式为:

if(表达式)语句;

语句功能:执行此语句时,先求表达式的值,若其值为“真”,则执行语句;若其值为“假”,则在if结构体内什么也不执行。而程序直接去执行if语句后面的语句。注意:①if后面的“表达式”一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。②格式中的“语句”,可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号{}将语句括起来。如果只有一条语句,则可不用{}括起来。语句表达式ab真(非0)假(0)语句真假表达式课件制作:刘达明023-668341102、“if(表达式)语句1else语句2”形式第三节

选择结构程序设计27/96(第三章结构化程序设计)语句格式的一般形式为:

if(表达式)语句1;else语句2;

语句功能:执行此语句时,先求表达式的值,若其值为“真”,则执行语句1;若其值为“假”,则执行语句2。最后程序跳出if语句执行后面的语句。注意:①if后面的“表达式”一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。②格式中的“语句”,可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号{}将语句括起来。如果只有一条语句,则可不用{}括起来。语句1语句2真假表达式语句1语句2表达式b真(非0)假(0)课件制作:刘达明023-668341103、“if……

elseif”形式第三节

选择结构程序设计28/96(第三章结构化程序设计)语句格式的一般形式为:

if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……elseif(表达式n)语句n;else语句n+1;表达式1表达式2表达式3表达式n语句1语句2语句3语句n语句n+1真(非0)假(0)真(非0)假(0)假(0)假(0)真(非0)真(非0)课件制作:刘达f……elseif语句功能:第三节

选择结构程序设计29/96(第三章结构化程序设计)先求表达式1的值,若其值为“真”,则执行语句1;否则求表达式2的值,若其值为“真”,则执行语句2;否则求表达式3的值,若其值为“真”,则执行语句3;……求表达式n的值,若其值为“真”,则执行语句n,否则执行语句n+1。注意:

①if后面的“表达式”一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等C语言允许的任意类型的表达式。

②只有当表达式1的值为“假”时,才去求表达式2的值;只有当表达式2的值为“假”时,才去求表达式3的值;……。

③格式中的“语句”,可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号{}将语句括起来。如果只有一条语句,则可不用{}括起来。

④在此种形式中,可以没有最后else子句。

⑤此种形式的语句主要用于多分支的处理。课件制作:刘达明023-668341104、if语句的嵌套第三节

选择结构程序设计30/96(第三章结构化程序设计)if(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌ifif(expr1)if(expr2)statement1elsestatement3

内嵌ifif(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌if课件制作:刘达f语句说明:第三节

选择结构程序设计31/96(第三章结构化程序设计)

①if(x)if(x!=0)、if(!x)if(x==0)。

②else子句不能单独使用,它必须是if语句的一部分,只能与if配对使用。在if…else配对时,如果缺省{},else总是和它上面离它最近的未配对的if配对。为了避免不必要的误会,在使用if…else时,最好使用花括号{}指明if与else的配对关系。

③在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。

④在if语句的几种形式中,所有的语句应为单个语句,如果要想在满足条件时执行多个语句,则必须组成复合语句的形式,用一对花括号{}括起来,并且在花括号“}”之后不能加分号。

⑤在C语言中,虽然允许if语句进行嵌套,但嵌套的层次一般不宜超过2—3层。if(……)if(……)if(……)else…...else…...else…...

⑥在“if(表达式)语句1else语句2”形式中,如果语句1与语句2都是单个语句,并且是对同一个变量赋值,则这种方式可使用条件运算符来代替:如:if(a>b)i=10;elsei=20;(注意:虽然这里在else前和整个语句结束处各有一个分号,但仍属于同一个if语句,而不是两个语句),可以使用:i=(a>b)?10:20;来代替。课件制作:刘达3.12

大写转小写,小写转大写,其余不变。第三节

选择结构程序设计32/96解:从键盘输入一个字符,如果是大写字母,则转换为小写字母;如果是小写字母,则转换为大写字母;如果为其它字符,则原样输出。#include<stdio.h>main(){charx;printf(“Enterachar:\n”);x=getchar();if((x>=’a’)&&(x<=‘z’))x-=‘a’-’A’;elseif((x>=’A’)&&(x<=‘Z’))x+=‘a’-’A’;putchar(x);}(第三章结构化程序设计)输入字符xx为小写字母x为大写字母将x转换为大写字母将x转换为小写字母输出字符x真真假假课件制作:刘达3.13

输入四个整数,要求按大小顺序输出。第三节

选择结构程序设计33/96解:此题按依次比较的方法排出其大小顺序。#include<stdio.h>main(){intt,a,b,c,d;printf(“Input4integer:”);scanf(“%d,%d,%d,%d”,&a,&b,&c,&d);printf(“S=%d,%d,%d,%d\n”,a,b,c,d);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(a>d){t=a;a=d;d=t;}if(b>c){t=b;b=c;c=t;}(第三章结构化程序设计)if(b>d){t=b;b=d;d=t;}if(c>d){t=c;c=d;d=t;}printf(“Indexorder:”);printf(“%d,%d,%d,%d\n”,a,b,c,d);}执行:Input4integer:6,8,1,4(回车)S=6,8,1,4Indexorder:1,4,6,8课件制作:刘达、switch语句第三节

选择结构程序设计34/96switch语句是多分支选择语句,也称为开关语句。其一般格式为:switch(表达式){case常量表达式1:语句组1;break;

case常量表达式2:语句组2;break;

……

case常量表达式n:语句组n;break;

default:语句组n+1;}根据表达式的值p进行选择ab语句1语句2语句n…p1p2pn语句n+1其它(第三章结构化程序设计)计算表达式常量表达式1常量表达式2常量表达式n语句组1语句组2语句组n语句组n+1…………其它课件制作:刘达witch语句功能:第三节

选择结构程序设计35/96(第三章结构化程序设计)执行switch语句时,先求表达式的值,然后依次与各常量表达式的值进行比较,若与某常量表达式的值相等,则执行其后的各语句,直至遇到break语句或switch语句的最后一条语句。即:当“表达式”=“常量表达式1”时,从“语句组1”开始执行;当“表达式”=“常量表达式2”时,从“语句组2”开始执行;当“表达式”与“常量表达式1”、“常量表达式2”、┄、“常量表达式n”都不相等时,从“语句组n+1”开始执行。

开始执行语句组后,遇到break或switch语句的最后一条语句,才结束switch语句的执行。课件制作:刘达witch语句的说明1:第三节

选择结构程序设计36/96(第三章结构化程序设计)①switch后面括号内的“表达式”,ANSI标准允许它为任何类型。使用最多的表达式的值为:字符型、整型或枚举型。

②case后面包含多个语句句时,不需要加大括号。

③当每一个case语句后均有break语句时,case出现的次序不影响执行结果。(最后一个分支default总是放在最后,这时,default后不需要break语句)。

④多个case可以共用一组执行语句。这时需要共用的前面的case语句实际上无语句组,并且不要用break。

⑤表达式和各常量表达式的类型应一致,并且各常量表达式的值应互不相同。

⑥switch允许嵌套、default子句可以没有。

⑦“case常量表达式:”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。如果该case后面没有break或switch语句没有结束,在执行完该case后的语句组后,接着执行下一个case语句,直到break或switch语句结束为止。课件制作:刘达witch语句的说明2:第三节

选择结构程序设计37/96(第三章结构化程序设计)

⑧用if的嵌套可以实现多分支选择,但若分支比较多,则嵌套的层次也比较多,使写出的程序变得繁长且可读性差;用if┄elseif也可以实现多分支选择。用switch语句也可以方便、简捷地实现多分支选择。在程序中究竟使用那种结构实现分支,依赖于问题的不同和个人的编程风格。总的来说,就是要求程序具有良好的可读性和正确性。

⑨if┄elseif应用于多条件并列测试,从中取一的情形;switch应用于单条件测试,从其多个结果取一种的情形。

⑩break是退出开关语句,它用来中途退出switch语句的执行,往往在一个case执行完成后使用break退出switch语句。而default后则可以不要break。break语句不能用于循环语句和switch语句之外的任何其它语句之中。课件制作:刘达、选择结构程序举例第三节

选择结构程序设计38/96(第三章结构化程序设计)例3.14

写一程序,从键盘上从键盘上输入年份year,判断其是否闰年。(教材P57例3.16)解:闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。(x能被y整除,则余数为0,即x%y=0)输入年份赋给yaeryear能被4整除真真假假year能被100整除year能被400整除真假leap=1leap=0leap=1leap=0leap真假输出year是闰年输出year是平年用流程图画的算法见教材P58~P59。用N-S图画的算法见右图。该例的程序见教材P58~P59。注:对闰年标志leap的判断也可使用switch语句来完成。课件制作:刘达3.15第三节

选择结构程序设计39/96(第三章结构化程序设计)解:分析:折扣点的变化都发生在距离为250的倍数上,如下表:运输公司费用的计算问题。距离s越远,每公里的运费越低。设每公里每吨货物的基本运费为p,货物重量为w(吨),折扣为d,则总运输费用f的计算公式为:f=p*w*s*(1-d)。其中折扣数d与距离s有关,具体标准如下:s<250km没有折扣250<=s<500折扣2%500<=s<1000折扣5%1000<=s<2000折扣8%2000<=s<3000折扣10%s>=3000折扣15%s/2500123456789101112d(%)02581015课件制作:刘达3.15的N-S图算法:第三节

选择结构程序设计40/96(第三章结构化程序设计)定义整型变量c,s,实型变量p,w,d,f输入p、w、ss>=3000真假c=12c=s/250d=0d=2d=15d=5d=8d=10c0123456789101112f=p*w*s*(1-d/100)打印f课件制作:刘达3.15的程序:第三节

选择结构程序设计41/96(第三章结构化程序设计)#include<stdio.h>main(){intc,s;/*c-s/250s-距离*/floatp,w,d,f;/*p-运费单价*//*w-重量d-折扣f-总运输费用*/printf(“pleaseinputp,w,s:\n”);scanf(“%f,%f,%d”,&p,&w,&s);c=(s>=3000)?12:(s/250);switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}/*endswitch*/f=p*w*s*(1-d/100);printf(“f=%10.2f\n”,f);}/*endmain*/运行结果:0.05,100,1200(回车)f=5520.00课件制作:刘达三节

选择结构程序设计42/96(第三章结构化程序设计)例3.16从键盘输入2个四位数之内的四则运算符(+、-、*、/),输出它们的运算结果;若输入的不是四则运算符,则输出出错信息。

(教材P64例3.20)定义整型变量a,b,d,字符型变量c输入a、c、bd=a+bd=a-bd=a*b真c‘+’‘-’‘*’‘/’其它打印a+b的结果b==0假d=a/b打印a-b的结果打印a*b的结果打印a/b的结果打印divisoriszero打印inputoperatorerror例3.17

见教材P67的例3.23。主要明白break的作用。课件制作:刘达三节

选择结构程序设计43/96(第三章结构化程序设计)例3.18main(){inta=2,b=7,c=5;clrscr();switch(a>0)/*a>0的值为:0或1*/{case1:switch(b<0)/*值:0,1*/{case1:printf("@");break;case2:printf("!");break;default:printf("&");}case0:switch(c==5){case0:printf("*");break;case1:printf("#");break;default:printf("$");break;}default:printf(">");}printf("\n");}运行结果:&#>若将b值初值改为:b=-7;则:运行结果:@#>课件制作:刘达三节

选择结构程序设计44/96(第三章结构化程序设计)例3.19给一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。如:321,输出:123。解:N-S图算法如右边所示:输入一正整数(0~99999)

位数=5位数=4位数=3位数=2位数=1>9999>999>99>9计算各位的数值真假假假假真真真位数54321输出个、十、百、千、万,五位输出个、十、百、千,四位输出个、十、百,三位输出个、十,两位输出个位课件制作:刘达三节

选择结构程序设计45/96(第三章结构化程序设计)例3.19的程序:#include<stdio.h>main(){longnum;intn1,n2,n3,n4,n5,n;printf(“Input0~99999:”);scanf(“%ld”,&num);if(num>9999)n=5;elseif(num>999)n=4;elseif(num>99)n=3;elseif(num>9)n=2;elsen=1;printf(“n=%d\n”,n);printf(“Everyfigure:”);n5=num/10000;n4=(num-n5*10000)/1000;n3=(num-n5*10000-n4*1000)/100;n2=(num-n5*10000-n4*1000-n3*100)/10;n1=(num-n5*10000-n4*1000-n3*100-n2*10;switch(n){case5:printf(“%d,%d,%d,%d,%d”,n5,n4,n3,n2,n1);printf(“\nAntitonefigure:”);printf(“%d%d%d%d%d”,n1,n2,n3,n4,n5);break;case4:printf(“%d,%d,%d,%d”,n4,n3,n2,n1);printf(“\nAntitonefigure:”);printf(“%d%d%d%d”,n1,n2,n3,n4);break;课件制作:刘达三节

选择结构程序设计46/96(第三章结构化程序设计)例3.19的程序(续):case3:printf(“%d,%d,%d”,n3,n2,n1);printf(“\nAntitonefigure:”);printf(“%d%d%d”,n1,n2,n3);break;case2:printf(“%d,%d”,n2,n1);printf(“\nAntitonefigure:”);printf(“%d%d”,n1,n2);break;case1:printf(“%d”,n1);printf(“\nAntitonefigure:”);printf(“%d”,n1);break;}}运行结果:Input0~99999:123(回车)n=3Everyfigure:1,2,3Antitonefigure:321注:输入数据123位数为:3每位数字为:1,2,3反序数字为:321课件制作:刘达3章

结构化程序设计----习题347/96《C语言程序设计》

龙昭华主编

习题(三)***复习本章已讲内容,预习本章剩余内容。3.3教材P96的习题3.4编程题中的⑶、⑸、⑹小题。课件制作:刘达四节

循环结构程序设计48/96(第三章结构化程序设计)概述C语言可实现循环的语句:用goto和if构成循环while语句用来实现当循环do~while语句用来实现直到型循环for语句用于次数型循环课件制作:刘达、goto语句及其与if语句构成的循环第四节

循环结构程序设计49/96

1、goto语句

goto语句称为“无条件转移语句”。实现程序的任意转移。goto语句通常使用在:①多重循环结构的内层循环体中,用来解决从内层循环体直接跳到外层循环之外的问题。②与if语句构成循环结构。goto语句是非结构化的语句,建议不用或少用goto语句。goto语句的一般格式为:

注意:①语句标号是标识符,它的定名规则与变量名相同,其后必须跟一个“:”才能放在本程序的某条语句之前,作为该语句的一个代号。带有语句标号的语句可以是C语言的任何语句。②goto语句中的“语句标号”必须是在本语句所在的函数中已存在的。不允许从某个函数跳转到其它函数中。③特别强调,不能用整数来做标号。goto语句标号;….…..语句标号:语句;(第三章结构化程序设计)课件制作:刘达明023-668341102、goto语句与if语句构成循环第四节

循环结构程序设计50/96在C语言中可以用goto语句与if语句一起构造循环。例3.20计算1+2+3+……+100。解:算法简单,直接写出程序即可。(详见教材P69的例3.24)实际上,这里用的是“当型”循环结构。当满足“i<=100”时,执行if语句的花括号{}内的循环体。#include<stdio.h>main(){inti,sum=0;i=1;A:if(i<=100){sum+=i; i++;

gotoA;}printf(“sum=%d",sum);}sum=0+1=1sum=1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050循环初值循环终值循环变量增值循环条件循环体(第三章结构化程序设计)课件制作:刘达、while语句构成循环第四节

循环结构程序设计51/96while语句实现当型循环结构。其一般形式为:while(表达式)

循环体语句;循环体表达式ab真(非0)假(0)当表达式为真(非0)循环体

功能:先计算表达式的值,若其值为“真”(非0),则执行循环体,否则退出循环。

(第三章结构化程序设计)课件制作:刘达hile语句说明:第四节

循环结构程序设计52/96(第三章结构化程序设计)

①格式中的表达式可以为算术表达式、关系表达式、逻辑表达式等。

②循环体可以是单独的一个语句,也可以是复合语句。复合语句必须用{}括起来,否则只执行到第一个分号处。

③不要构成死循环。循环体内应有使循环趋向于结束的语句。

④结构“while(1)循环体语句;”为无限循环。

⑤while循环是在满足条件时执行的。若表达式的值一开始就为0,则循环体一次也不被执行。

⑥当表达式值为0或循环体内遇break、return、goto则退出循环。

⑦在while循环体内也允许空语句。如:while((c=getche())!=‘\X0D’);例3.21:求1+2+……+100。详见教材P70的例3.25。课件制作:刘达、do-while语句构成循环第四节

循环结构程序设计53/96(第三章结构化程序设计)do-while语句实现直到型循环结构。其一般形式为:循环体表达式ab真(非0)假(0)当表达式为真(非0)循环体

功能:先执行循环体,然后计算表达式,如果表达式的值为“真”(非0),继续执行循环体,然后再计算表达式,如果表达式的值仍为“真”,再继续执行循环体;如此循环,直到表达式的值为“假”(0)时,结束循环体do-while语句的执行,执行do-while语句后面的语句。do

循环体语句;while(表达式);课件制作:刘达o-while语句说明:第四节

循环结构程序设计54/96(第三章结构化程序设计)①格式中的表达式可以为算术表达式、关系表达式、逻辑表达式等。②循环体可以是单独的一个语句,也可以是复合语句。复合语句必须用{}括起来,否则程序出错。

③在使用时,while(条件表达式)后必须有分号。④do…while循环是先执行循环体,再判断循环条件,因而循环体至少执行一次。

⑤当表达式值为0或循环体内遇break、return、goto则退出循环。

⑥在循环体内应有使条件表达式的值发生改变的语句。否则就要构成死循环。例3.22:求1+2+……+100。详见教材P73的例3.28。课件制作:刘达hile循环与do-while循环的比较与转换第四节

循环结构程序设计55/96(第三章结构化程序设计)do-while结构可以转化为while结构。如图:while与do-while的比较:循环体表达式ac真(非0)假(0)循环体bmain(){intsum=0,i;scanf(“%d”,&i);while(i<=10){sum+=i;i++;}printf(“sum=%d\n”,sum);}main(){intsum=0,i;scanf(“%d”,&i);do{sum+=i;i++;}while(i<=10);printf(“sum=%d\n”,sum);}结果:输入1时,为55输入11时,为0结果:输入1时,为55输入11时,为11课件制作:刘达、for语句构成循环第四节

循环结构程序设计56/96(第三章结构化程序设计)

for语句是循环控制结构中使用最广泛的最为灵活的一种循环控制语句。它不仅用于已知循环次数的情况,而且可以用于循环次数不确定的而只给出循环结束条件的情况。它完全可以代替while语句。for语句的一般形式为:for(<表达式1>;<表达式2>;<表达式3>)

循环体语句;语句功能:执行顺序如下:①计算表达式1;②求表达式2的值,若其值为“真”(非0),转③,否则,退出循环;③执行循环体;④计算表达式3;⑤转②。当表达式2为真(非0)循环体语句计算表达式1计算表达式3课件制作:刘达or语句可以转换成while语句第四节

循环结构程序设计57/96(第三章结构化程序设计)for语句可转换为下面的while语句:表达式1;while(表达式2){循环体语句;表达式3;}当表达式2为真(非0)循环体语句计算表达式1计算表达式3for语句最简单,也是最易于理解的形式为:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;课件制作:刘达or语句说明:第四节

循环结构程序设计58/96(第三章结构化程序设计)

⑴“表达式1”可以是任何类型的,一般为赋值表达式,用于给控制循环次数的变量赋初值。在“表达式1”中可以使用逗号运算符。“表达式1”既可以设置循环变量的初值,又可以是与循环变量无关的其他表达式。如:for(sum=0,i=1;i<=100;i++)。“表达式1”可以省略,但其后的分号“;”必须保留。如:for(;i<=100;i++)。

⑵“表达式2”可以是任何类型的,只要其结果为“真”(非0)或“假”(0)的表达式都可以。一般为关系或逻辑表达式,用于控制循环是否继续执行。“表达式2”可以省略,但其后的分号“;”必须保留。如:for(i=1;;i++)。再如:for(i=0;(c=getchar())!=‘\n’;i+=c)。

⑶“表达式3”可以是任何类型的,一般为赋值表达式,用于修改循环控制变量的值,以便使得某次循环后,表达式2的值为“假”(0),从而退出循环。“表达式3”可以省略。特别注意:表达式3后无分号。在“表达式3”中可以使用逗号运算符。如:for(i=1;i<=100;)。再如:for(i=1;i<=100;i++,i++)。

⑷“循环体”可以是任何语句,可以是单独的一条语句,也可以是复合语句。复合语句必须用一对花括号{}括起来。课件制作:刘达or语句说明(续):第四节

循环结构程序设计59/96(第三章结构化程序设计)

⑸“表达式1”、“表达式2”、“表达式3”三部分使用两个分号将其分开。这三个表达式中可以省略其中一个、两个或三个,但相应表达式后面的分号不能省略。①省略“表达式1”,此时应在for语句前面设置循环初始条件。

②省略“表达式2”,此时不判别循环条件,认为循环循环条件始终为“真”,循环将无终止地进行下去。此时在循环体内部应有退出循环的语句。③省略“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语

温馨提示

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

评论

0/150

提交评论