版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章程序控制结构1第3章程序控制结构3.1语句3.2输入与输出3.3程序顺序结构3.4程序选择结构3.5程序循环结构23.1语句语句(statement)是C程序的最小单位程序由一条一条语句组成语句执行的次序则称为流程C语言语句分为简单语句、复合语句和控制语句33.1.1简单语句1.表达式语句x=a+b;//赋值语句t=a,a=b,b=t;//a和b交换a+b+c;//运算但无实际意义表达式;//用分号结束43.1.1简单语句2.函数调用语句printf("a+b=%d",a+b);//输出函数调用语句函数调用(实参);//用分号结束53.1.1简单语句3.空语句4.声明部分printf(“a+b=%d”,a+b);;//第2个即为空语句;//单个分号声明部分......;执行语句......;63.1.2复合语句复合语句(compoundstatement),又称语句块,简称块(block)
{ [局部声明部分......;]
语句序列......;}73.1.2复合语句复合语句内的每条语句必须以分号(;)结尾,但复合语句右大括号(})已表示结尾,因此其后不需要分号。如果在后面添加分号,意思变为一个复合语句与一个空语句。{//复合语句
doubles,a=5,b=10,h=8;//局部声明
s=(a+b)*h/2.0;
printf("area=%lf\n",s);}//复合语句不需要分号结尾83.1.2复合语句复合语句内部可以进行变量定义或类型声明,这些定义或声明仅在复合语句内部可以使用,称为块的局部作用域
。{
int
t,a=10,b=7;//定义局部变量t、a、bt=a,a=b,b=t;//仅在这个复合语句里使用}93.1.2复合语句复合语句允许嵌套,即在复合语句里还可以包含复合语句。{//复合语句
doublev1,r=5;//局部声明
v1=4*3.1415926*r*r*r/3;{//嵌套的复合语句
doublev2,h=12;//嵌套的局部声明
v2=3.1415926*r*r*h;printf("%lf,%lf\n",v1,v2);}//嵌套的复合语句结尾}//复合语句结尾103.1.3注释可以在程序中编写注释(comments),有两种形式:①/*......*/块注释语法形式:
/*......注释内容*/113.1.3注释②//行注释语法形式:
说明:(1)注释仅是对源程序的说明文字,它不是程序代码,对程序运行没有任何影响。实际上,在编译程序时所有注释内容将被忽略。
//......注释内容
123.1.3注释(2)/*......*/块注释允许多行注释,以(/*)开头,以(*/)结尾,这中间的任何内容均是注释内容。注释可以是任何来自于字符集的字符组合,包括换行符,也允许中文等非ASCII字符。/*......*/不允许嵌套133.1.3注释(3)//行注释表示从(//)开始直到本行末尾的所有字符均是注释内容。//注释只能注释一行,如果要注释多行就要写多次。一般//注释适用于短小精简的注释,/*......*/注释适用于大段注释。(4)编译器将整个注释理解为一个空白字符,相当于一个空格的作用。
143.1.4语句的写法(1)多数情况下,在一个程序行里只写一个语句,这样的程序写法清晰,便于阅读、理解和调试。
(2)注意使用空格或TAB来作合理的间隔、缩进、对齐,使程序形成逻辑相关的块状结构,养成优美的程序编写风格。
(3)C语言允许在一行里写多个语句。(4)C语言允许将一个语句拆成多行来写。153.2输入与输出所谓输入是指从外部输入设备(如键盘、鼠标等)向计算机输入数据,输出是指从计算机向外部输出设备(如显示器、打印机等)输出数据。
163.2输入与输出C语言输入输出操作是通过函数实现的。不同的函数能够处理形式多样的输入输出操作,支持不同的输入输出设备。若在程序中调用标准输入输出函数,应该用文件包含命令将头文件stdio.h包含到程序中,命令形式为:
#include<stdio.h>173.2.1字符输入与输出1.字符输出putchar函数putchar函数的作用是向显示终端输出一个字符,一般形式为:putchar(c);183.2.1字符输入与输出例3.1
1#include<stdio.h>2int
main()3{4
chara='C',b=6;5
putchar(a);//字符型变量,输出C6putchar(b+'0');//整型表达式,输出67putchar('\110');//转义字符(八进制)输出H8
putchar('\n');//转义字符(换行),输出换行
9
return0;10}193.2.1字符输入与输出例3.1
1#include<stdio.h>2intmain()3{4chara='C',b=6;5
putchar(a);//字符型变量,输出C6putchar(b+'0');//整型表达式,输出67putchar('\110');//转义字符(八进制)输出H8
putchar('\n');//转义字符(换行),输出换行
9return0;10}C6H程序运行屏幕203.2.1字符输入与输出2.字符输入getchar函数getchar函数的作用是从键盘终端输入一个字符,一般形式为:getchar()213.2.1字符输入与输出例3.2
1#include<stdio.h>2int
main()3{4
charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7
return0;8}223.2.1字符输入与输出例3.2
1#include<stdio.h>2intmain()3{4charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7return0;8}abc程序运行屏幕abc↙233.2.1字符输入与输出例3.2
1#include<stdio.h>2intmain()3{4charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7return0;8}ab程序运行屏幕a↙bc↙243.2.2格式化输出1.printf函数printf函数的作用是向标准输出设备(显示终端)输出格式化的数据,一般形式为:(1)格式控制格式控制为字符串形式,称为格式控制串printf(格式控制,输出项列表......);25它主要有两种内容:①格式说明。格式说明总是以百分号(%)字符开始,后跟格式控制字符,例如%d、%f等。它的作用是将输出项转换为指定格式输出。②一般字符。除格式说明之外的其他字符,包含转义字符。一般字符根据从左向右的出现顺序直接输出到显示终端上,ASCII控制字符的输出有特殊的含义。
3.2.2格式化输出%[flags][width][.prec][h|l|L|F|N]type263.2.2格式化输出表3-1printf格式说明域含义域域选描述含义type必需类型字符决定输出项转换为字符、字符串还是数值flags可选标志字符控制输出的对齐、符号、空格及八进制和十六进制前缀。可以出现多个标志width可选宽度说明指定输出项的最小显示宽度.prec可选精度说明指定输出项的最大输出字符数或浮点数小数精度h/l/L/F/N可选大小修饰指明输出项类型大小或指针的远近273.2.2格式化输出表3-2printf类型字符含义字符类型输出格式dint带符号的十进制整数uint无符号十进制整数oint无符号八进制整数x或Xint无符号十六进制整数(若输出为字母,x用abcdef,X用ABCDEF)283.2.2格式化输出表3-2printf类型字符含义字符类型输出格式fdouble具有[-]dddd.dddd格式的带符号数值,dddd为一位或多位十进制数字。小数点前数字个数取决于数的量级;小数点后面数字个数取决于所要求的精度e或Edouble具有[-]d.dddde[+/-]ddd格式的带符号数值,其中d为单个十进制数字,dddd为一位或多位十进制数字,ddd为三位十进制数。用e或E表示指数g或Gdouble以f或e格式输出的带符号数值,对给出的值及其精度,f和e哪个简洁就用哪个。只有当值的指数小于-4或大于、等于精度说明时才使用e格式。尾部的0被截断,只有小数点后跟1位或多位数字时才出现小数点。用e或E表示指数293.2.2格式化输出表3-2printf类型字符含义字符类型输出格式cchar单个字符s字符串指针直到第一个非空字符('\0')或满足精度的字符串%输出百分号'%'303.2.2格式化输出表3-3printf标志字符含义标志意义默认-在给定域宽内左对齐输出结果(右边用空格填充)右对齐(左边用空格或0填充)+如果输出值是有符号数,则总是加上符号(+或-)只在负数前加(-)空格如果输出值是有符号数或为正数,则以空格作为前缀加到输出值前;如果空格和+标志同时出现,则忽略空格无313.2.2格式化输出表3-3printf标志字符含义标志意义默认#指明使用如下的“转换样式”转换输出参数若类型字符为对输出参数的影响x或X在任何非0输出值前加上0x或0Xe,E,f强制在所有情况下输出值总是包含小数点只有小数点后面有数字时才显示它g,G同e和E,强制在所有情况下输出值中总是包含小数点并阻止截断尾部的0只有小数点后面有数字时才显示它,截断尾部的0323.2.2格式化输出表3-4printf宽度说明宽度说明对输出域宽度的影响n至少有n个字符宽度输出,如果输出值中的宽度小于n个,则输出用空格填充直到最小宽度规定(如果flags为-,则填充在输出值的右边,否则在左边)0n至少有n个字符宽度输出,如果输出值中的字符宽度小于n个,则输出用0填充在输出值的左边(对于左对齐无效)*间接设置宽度,此时由输出项列表提供宽度值,且它必须在输出项的前面333.2.2格式化输出表3-5printf精度说明精度说明精度影响.n类型含义e,E,f精度值指定小数点后数字的个数。四舍五入g,G精度值指定可输出的有效数字的最大数目s精度值指定可输出字符的最大数目,超出精度值范围的字符不予输出343.2.2格式化输出表3-5printf精度说明精度说明精度影响(无)精度按默认值:类型默认值e,E,f6g,G打印6个有效数字,尾部的0串被截断s输出直到空字符('\0')为止.0或仅有.类型含义353.2.2格式化输出续表3-5printf精度说明精度说明精度影响e,E,f,g,G输出不打印小数点(及其后的小数)s无任何字符输出*间接设置精度,此时由输出项列表提供精度值,且它必须在输出项的前面。如果宽度说明和精度说明同时使用*,则先出现宽度值,接着是精度值,然后才是输出项。363.2.2格式化输出表3-6printf类型大小修饰含义大小修饰type类型字符输出参数被解释为hd,o,x,X短整型(short)u无符号短整型(unsignedshort)ld,o,x,X长整型(long)u无符号长整型(unsignedlong)e,E,f,g,G双精度浮点型(double)Le,E,f,g,G长双精度浮点型(longdouble)373.2.2格式化输出int
a=123,b=-1,c=12345;longh=-1;shorti=-1,j=32767;charc1=97;doublex=12.3456,y=12,z=12.123456789123;//①输出整型数据printf("%d,%u,%x,%X,%o\n",a,a,a,a,a);//十进制、无符号、十六进制和八进制//输出结果:123,123,7b,7B,173printf("%d,%u,%x,%X,%o\n",b,b,b,b,b);//十进制、无符号、十六进制和八进制,负数为补码//-1,4294967295,ffffffff,FFFFFFFF,37777777777383.2.2格式化输出printf("%ld,%lu,%lx,%lo\n",h,h,h,h,h);//长整型,负数为补码//输出结果:-1,4294967295,ffffffff,37777777777printf("%hd,%hu,%hx,%ho\n",i,i,i,i,i);//短整型,负数为补码//输出结果:-1,65535,ffff,177777printf("%hd,%hd\n",j,j+1);//短整型,数据溢出//输出结果:32767,-32768//②输出带格式的整型数据printf("[%d],[%4d],[%-4d],[%4d],[%-4d]\n",a,a,a,c,c);//宽度、右对齐、左对齐、实际宽度//输出结果:[123],[123],[123],[12345],[12345]393.2.2格式化输出printf("[%+d],[%+d],[%d],[%d]\n",a,-a,a,-a);//填充正负符号、填充空格//输出结果:[+123],[-123],[123],[-123]printf("[%04d],[%04d],[%04d],[%-04d]\n",a,b,c,a);//左边填充0、右边不影响//输出结果:[0123],[-001],[12345],[123]printf("%#d,%#x,%#X,%#o\n",a,a,a,a);//填充十六进制、八进制前缀//输出结果:123,0x7b,0X7B,0173printf("[%*d]\n",5,a);//由输出项指定宽度//输出结果:[123]403.2.2格式化输出printf("[%8.2d],[%-8.2d]\n",a,a);//精度对整型无作用//输出结果:[123],[123]//③输出字符型数据printf("%d,%c\n",c1,c1);//字符型数值、ASCII码//输出结果:97,a//④输出带格式的字符型数据printf("[%12c],[%012c],[%-012c]\n",c1,c1,c1);//宽度、右对齐、左对齐//[a],[00000000000a],[a]413.2.2格式化输出//⑤输出浮点型数据printf("%lf,%e,%g\n",x,x,x);//小数格式、指数格式、最简格式//输出结果:12.345600,1.234560e+001,12.3456printf("%lf,%e,%g\n",y,y,y);//小数格式、指数格式、最简格式//输出结果:12.000000,1.200000e+001,12//⑥输出指定精度的浮点型数据printf("[%lf],[%10lf],[%10.2lf],[%.2lf]\n",x,x,x,x);//默认精度、宽度、精度//[12.345600],[12.345600],[12.35],[12.35]423.2.2格式化输出//⑦输出带格式的浮点型数据printf("[%+lf],[%+lf],[%lf],[%lf]\n",y,-y,y,-y);//填充正负符号、填充空格//[+12.000000],[-12.000000],[12.000000],[-12.000000]printf("[%06.1lf],[%-06.1lf]\n",y,y);//左边填充0、右边不影响//输出结果:[0012.0],[12.0]printf("[%.*f],[%*.*f]\n",6,x,12,3,x);//由输出项指定宽度、宽度与精度//输出结果:[12.345600],[12.346]433.2.2格式化输出//⑧输出字符串printf("[%s],[%6s],[%-6s]\n","Java","Java","Java");//宽度对字符串的影响//输出结果:[Java],[Java],[Java]printf("[%s],[%.3s],[%6.3s]\n","Basic","Basic","Basic");//精度对字符串的影响//输出结果:[Basic],[Bas],[Bas]443.2.2格式化输出//⑨特殊输出printf("%%\n",c1);//两个%%表示输出一个%,输出项//输出结果:%printf("%d,%d\n",a,b,c);//格式数目小于输出项数,忽略多余输出项//输出结果:123,-1printf("%d,%d,%d\n",a,b);//格式数目大于输出项数,输出结果不确定//输出结果:123,-1,2367460printf("%d,%lf\n",x,a);//类型不对应,输出结果不确定//输出结果:2075328197,0.000000453.2.3格式化输入scanf(格式控制,输入项列表......);1.scanf函数scanf函数的作用是从标准输入设备(键盘终端)读取格式化的数据,一般形式为:%[*][width][h|l|L|F|N]type463.2.3格式化输入表3-7scanf类型字符含义类型字符期望读入(应输入)的类型d十进制整数o八进制整数x或X十六进制整数u无符号十进制整数473.2.3格式化输入表3-7scanf类型字符含义类型字符期望读入(应输入)的类型e,E,f,g,G由下列成分组成的浮点数:可选的符号+或-,包括小数点在内的一个或多个十进制数字序列,可选的指数符('e'或'E')其后的带符号整数。[+/-]ddddddddd[.]dddd[E|e][+/-]dddc字符。指定c后,通常被跳过的空白符将被读入,如果要读下一个非空白符,要使用%1ss字符串。默认情况下,输入字符串以空白符作为结束。483.2.3格式化输入(3)*禁止字符*禁止字符的含义是从输入数据中读取类型相当的数据,但跳过这个数据,即不将它保存到输入项中。(4)宽度说明宽度控制从输入数据中读出的最大字符数。转换并存放到相应输入项中。如果读width个字符前遇到空白符或不能根据指定格式进行转换的字符,则读入的字符个数将少于width个。493.2.3格式化输入(5)大小修饰大小修饰指明输入的类型大小,与printf的大小修饰含义相同。
503.2.3格式化输入int
a,b,c;longh;shorti;chark,m;doublex,y;scanf("%d%ld%hd%lf%le",&a,&h,&i,&x,&y);//输入整型、长整型、短整型、浮点型//输入:1231.233.25
结果a=1,h=2,i=3,x=1.23,y=3.25//输入:1-13276812.312e5
结果a=1,h=-1,i=-32768,x=12.3,y=1.2e6513.2.3格式化输入scanf("%d%d%d",&a,&b,&c);//连续输入用空格、TAB、回车间隔//输入:123结果a=1,b=2,c=3//输入:1,2,3结果a=1,b,c不确定(输入逗号不匹配空白符,scanf终止)scanf("%d,%d,%d",&a,&b,&c);//输入必须匹配一般字符//输入:1,2,3结果a=1,b=2,c=3//输入:123结果a=1,b,c不确定(输入空格不匹配逗号,scanf终止)523.2.3格式化输入scanf("a=%db=%dc=%d",&a,&b,&c);//输入必须匹配一般字符//输入:a=1b=2c=3结果a=1,b=2,c=3//输入:123结果a,b,c不确定(输入不匹配a=,scanf终止)scanf("%4d%4d",&a,&b);//指定宽度//输入:1212345结果a=12,b=1234//输入:123456789结果a=1234,b=5678scanf("%1d%*2d%3d",&a,&b);//禁止字符//输入:123456789结果a=1,b=456,23读取但不保存533.2.3格式化输入scanf("%d%c%d%c",&a,&k,&b,&m);//输入字符型//输入:12c34a结果a=12,k=c,b=34,m=a//输入:12c34a结果a=12,k=空格,b,m不确定(输入c不匹配%d,scanf终止)scanf("%d%d",&a,&b,&c);//格式数目小于输出项数,多余输入项未被输入scanf("%d%d%d",&a,&b);//格式数目大于输出项数,崩溃性错误scanf("%d%lf",&x,&a);//类型不对应,严重错误543.3程序顺序结构通常情况下,语句以其出现的顺序执行一个语句执行完会自动转到下一个语句开始执行,这样的执行称为顺序执行。顺序执行反映了程序“按部就班”的执行规律,多数情况下,程序的执行就是这样的。
553.3.1顺序执行图3.1求圆面积的执行次序顺序执行的次序是佷重要的
563.3.2跳转执行从问题求解的一般过程来看,还需要跳转执行。
①选择语句:if语句、switch语句;②循环语句:while语句、do语句、for语句;③跳转语句:goto语句、break语句、continue语句、return语句。
573.3.2跳转执行goto语句的作用是使程序无条件跳转到别的位置,语法形式为:这里的标号是一个自定义的标识符,标号语句形式为:标号:语句序列......goto
标号;583.3.2跳转执行
1goto
L1;
…//语句序列
10L1:x=a+b;
…//语句序列执行第1行时,程序跳转到L1标号语句所在的第10行继续运行:593.4程序选择结构1.if语句2.switch语句603.4.1if语句if语句的作用是计算给定的表达式,根据结果选择执行相应的语句,语句形式有两种:①if形式:②if-else形式:if(表达式)语句1;else
语句2;if(表达式)语句1;613.4.1if语句图3.2两种形式的if语句执行流程PT
F内嵌
语句623.4.1if语句图3.2两种形式的if语句执行流程633.4.1if语句当a﹥b时,执行t=a,a=b,b=t运算,即a和b相互交换,若a小于等于b则什么也不做;总而言之,无论a和b之前是什么数,执行这段程序后,a肯定小于等于b。
if(a>b)t=a,a=b,b=t;643.4.1if语句(1)if语句中的子语句既可以是简单语句,又可以是复合语句或控制语句,但必须是“一个语句”的语法形式
1if(a>b)2x=a+b;y=a-b;3else4x=a-b;y=a+b;653.4.1if语句(2)子语句往往会有多条语句,甚至更复杂的情形,这时可以使用复合语句
1if(a>b){2x=a+b;y=a-b;3}4else{5x=a-b;y=a+b;6}663.4.1if语句总是交换的代码(不好的code风格):
1if(a>b)2{3t=a;4a=b;5b=t;6};
1if(a>b){2t=a;3a=b;4b=t;5};673.4.1if语句一般地,if语句的表达式为关系、逻辑运算表达式也可以为其他表达式,但按逻辑值来理解:a=5,b=2;if(a)x=a*10;683.4.1if语句表3-8数值按逻辑值处理的结果数值逻辑值aaa!=0!aa==00假假真真非0真真假假6970例:将所给数学条件写成C的逻辑表达式1)1≤a≤8并且1≤b≤102)a和b都是正的或都是负的(a、b符号相同)3)a和b之一为0,但不能都为04)a能被5或7整除Leapyearcondition:(yearnum%4==0)&&(yearnum%100!=0)||(yearnum%400==0)&&(yearnum%100=0)(a>=1&&a<=8)&&(b>=1&&b<=10)(a>0&&b>0)||(a<0&&b<0)或:(a*b)>0(a*b==0)&&(a+b!=0)(a%5==0)||(a%7==0)70用形式逻辑变量表示润年条件:int
LeapisTrue;LeapisTrue=(yearnum%4==0)&&(yearnum%100!=0)||(yearnum%400==0)&&(yearnum%100==0);71713.4.1if语句例3.3
1#include<stdio.h>2#include<math.h>3int
main()4{5
doublea,b,c;6
printf("input
a,b,c:");7
scanf("%lf%lf%lf",&a,&b,&c);8
//判断三边长是否构成三角形
9
if(a+b>c&&a+c>b&&b+c>a){10
doubles,t;11t=(a+b+c)/2.0;12s=sqrt(t*(t-a)*(t-b)*(t-c));13
printf("area=%lf\n",s);14}
723.4.1if语句例3.3
15
elseprintf("error\n");16
return0;17}733.4.1if语句例3.3
15elseprintf("error\n");16return0;17}area=6.000000程序运行屏幕inputa,b,c:345↙743.4.2switch语句switch语句switch语句的作用是计算给定的表达式,根据结果选择从多个分支入口执行,语句形式为:switch(表达式){
case
常量表达式1:…语句序列1
case
常量表达式2:…语句序列2 ┇
case
常量表达式n:…语句序列n
default:…默认语句序列}753.4.2switch语句图3.3switch语句执行流程763.4.2switch语句(1)switch语句中case分支的语句序列可以是一个语句,也可以是任意多的语句序列,也可以没有语句;既可以是简单语句,又可以是复合语句和控制语句。如果没有语句,则一旦执行到这个case分支,什么也不做,继续往下执行。
773.4.2switch语句
1switch(n){2
case7:printf("step5\n");3
case6:4
case5:printf("step4\n");5
case4:6{7
printf("step3\n");printf("step2\n");8}9
case2:printf("step1\n");10
default:printf("step0\n");11}783.4.2switch语句(3)switch语法中default分支是可选的,若没有default分支且没有任何case标号的值相等时,switch语句将什么也不做,直接执行后续语句。(4)switch语句分支选择可以是C语言的任意表达式,但其值必须是整数(含字符类型)、枚举类型,或者包含能转换成这两种类型的类型。
793.4.2switch语句(5)switch语法中的case分支必须是常量表达式且互不相同,即为整型、字符型、枚举类型的常量值,但不能包含变量。例如若c是变量,则“casec>=‘a’&&c<=‘z’:”的写法是错的。case分支后面的冒号是必须的,即使没有后面的语句序列。
803.4.2switch语句在switch语句中任意位置上,只要执行到break语句,就结束switch语句的执行,转到switch结构后续语句。break;813.4.2switch语句更常见的switch结构应该如下,它提供了程序多分支选择执行流程。switch(表达式){
case
常量表达式1:…语句序列1;break;
case
常量表达式2:…语句序列2;break; ┇
case
常量表达式n:…语句序列n;break;
default:…默认语句序列}823.4.2switch语句图3.4结构化的switch流程833.4.3选择结构的嵌套1.if语句的嵌套(1)第一种形式,在else分支上嵌套if语句,语法形式为:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3......elseif(表达式n)语句nelse语句m843.4.3选择结构的嵌套图3.5嵌套if语句第一种形式的执行流程853.4.3选择结构的嵌套例3.4
1#include<stdio.h>2int
main()3{4
int
score;5
scanf("%d",&score);6
if(score>=90)printf("A\n");7
elseif(score>=80)printf("B\n");8
elseif(score>=70)printf("C\n");9
elseif(score>=60)printf("D\n");10
elseprintf("E\n");11
return0;12}863.4.3选择结构的嵌套1.if语句的嵌套(2)第二种形式,在if和else分支上嵌套if语句,语法形式为:
if(表达式1)
if(表达式2)语句1
else语句2else
if(表达式3)语句3
else语句4873.4.3选择结构的嵌套图3.6嵌套if语句第二种形式的执行流程883.4.3选择结构的嵌套例3.5
1#include<stdio.h>2int
main()3{4
int
a,b,c,d,t;5
scanf("%d%d%d%d",&a,&b,&c,&d);6
if(a>b)t=a,a=b,b=t;//结果a<=b7
if(a>c)t=a,a=c,c=t;//结果a<=c8
if(a>d)t=a,a=d,d=t;//结果a<=d9
//结果a<b,c,d10
if(b>c)t=b,b=c,c=t;//结果b<=c11
if(b>d)t=b,b=d,d=t;//结果b<=d12
//结果a<b<c,d13
if(c>d)t=c,c=d,d=t;//结果c<=d14
//结果a<b<c<d
893.4.3选择结构的嵌套例3.5
15
printf("%d,%d,%d,%d\n",a,b,c,d);16
return0;17}9091例:根据x求y值。
3x-11(0≤x<10)
y=2x+5(10≤x<20)
x(20≤x<30)输入
xx<10TF输出X无效3x-11→yT输入xx≥0&&x<30x<10x<202x+5→yx→y输出yFFFTTx≥0&&x<30TFx<20TFy=xy=3x-11y=2x+5输出x无效
输出yTx<10F9192
intmain(){floatx,y;
printf(”Enterx:”);
scanf(”%f”,&x);if(x>=0&&x<30){if(x<10)y=3*x-11;elseif(x<20)y=2*x+5;elsey=x;
printf(”x=%7.2f,y=%7.2f\n”,x,y);}elseprintf(”%7.2fisinvalid.\n”,x);return0;}54923.4.3选择结构的嵌套2.switch语句的嵌套switch语句是可以嵌套的:
1int
a=15,b=21,m=0;2switch(a%3){3
case0:m++;4
switch(b%2){5
default:m++;6
case0:m++;break;7}8
case1:m++;9}933.4.4选择结构程序举例例3.6
1#include<stdio.h>2int
main()3{4
int
y,m,d,Days;5
printf("input
y,m,d:");6
scanf("%d%d%d",&y,&m,&d);//输入日期
7
switch(m){//计算每月的天数
8
case2:9Days=28;10
if((y%4==0&&y%100!=0)||(y%400==0))Days++;11
break;12
case4:case6:13
case9:case11:Days=30;break;
943.4.4选择结构程序举例例3.6
14
default:Days=31;//其余月份为31天
15}16d++;17
if(d>Days)d=1,m++;//判断月末
18
if(m>12)m=1,y++;//判断年末
19
printf("%d-%d-%d\n",y,m,d);20
return0;21}953.4.4选择结构程序举例例3.7
1#include<stdio.h>2int
main()3{4
int
m,d,t;5
printf("input
m,d:");6
scanf("%d%d",&m,&d);//输入月份和日期
7t=m<7?21:23;//7月前为21,7月后为238
if(d>=t)m++;//在一个月的t号之后月份加一
9
switch(m){10
case2:printf("宝瓶\n");break;11
case3:printf("双鱼\n");break;12
case4:printf("白羊\n");break;13
case5:printf("金牛\n");break;14
case6:printf("双子\n");break;
963.4.4选择结构程序举例例3.7
15
case7:printf("巨蟹\n");break;16
case8:printf("狮子\n");break;17
case9:printf("室女\n");break;18
case10:printf("天秤\n");break;19
case11:printf("天蝎\n");break;20
case12:printf("射手\n");break;21
default:printf("摩羯\n");22}23
return0;24}973.4.4选择结构程序举例图3.7星座与日期规律9899例:设计一个简单的菜单选择程序,根据选择可实现a与b的四则运算。#include“stdio.h”intmain(){
inta,b;charc1;printf(”1.Add\n”);printf(”2.Subtract\n”);printf(”3.Multiply\n”);printf(”4.Divide\n”);
printf(”Enteryourchoice:”);c1=getchar();5599100
c1=getchar();if(c1>=’1’&&c1<=’4’){
printf(”Enter
a,b:”);
scanf(“%d,%d”,&a,&b);switch(c1){case’1’:printf(“%d\n”,a+b);break;case’2’:printf(“%d\n”,a-b);break;case’3’:printf(“%d\n”,a*b);break;case’4’:printf(“%f\n”,(float)a/b);}}elseprintf(“Invalidselection.”);return0;}1003.5程序循环结构1.while语句2.do语句3.for语句101C语言实验安排:周2晚19:00-21:4502011201、2、3、4曹光前4-16周
教室:3层北1023.5.1while语句while语句while语句的作用是计算给定的表达式,根据结果判定循环执行语句,语句形式为:其中的语句称为子语句,又称循环体,圆括号内的表达式称为循环条件。
while(表达式
)语句;1033.5.1while语句while语句的执行过程是:①计算表达式,无论表达式为何种类型均将这个值按逻辑值处理;②如果值为真,则执行子语句,然后重复①;③如果值为假,则while语句结束,执行后续语句。
1043.5.1while语句图3.8while语句执行流程ExpressionRepetitionbody1053.5.1while语句【例3.8】求即
1063.5.1while语句图3.8while语句执行流程1073.5.1while语句例3.8
1#include<stdio.h>2int
main()3{4
int
n=1,sum=0;5
while(n<=100){//循环直到n大于1006sum=sum+n;//累加和
7n=n+1;8}9
printf("sum=%d\n",sum);10
return0;11}1083.5.1while语句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循环直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第4行先做循环前的初始化,n为1,sum为0。第5行while语句时n<=100的结果为真,则执行循环体;循环体是复合语句,先计算sum累加,则sum变为0+1的结果,再让n累加1。1093.5.1while语句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循环直到n大于1006sum=sum+n;//累加和
7n=n+1;8}重复第5行的比较和执行过程,则n值越来越趋向100,n<=100也越来越趋向假,sum逐渐为累加和的结果;当n为100时,n<=100为真,sum为的结果,n值累加到101,则n<=100为假,while语句结束。1103.5.1while语句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循环直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第4行叫循环初始,即进入循环前的初始计算过程。如果不给n和sum赋初值可不可以?1113.5.1while语句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循环直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第5行叫循环条件,即判断是否继续循环的条件或循环终止的条件。第7行叫循环控制,即让循环条件趋向结束的计算过程。1123.5.1while语句循环结构三要素:循环初始、循环条件和循环控制。编写循环程序,就要精确设计三要素。循环初始发生在循环之前,使得循环“就绪”;循环条件是循环得以继续或终止的判定,而循环控制是在循环内部实现循环条件的关键过程。循环体可以直接或间接利用三要素来达到计算目的,也可以与三要素无关。
1133.5.1while语句while语句的说明。while语句的循环体既可以是简单语句,又可以是复合语句或控制语句,但必须是“一个语句”的语法形式。在实际编程中,当循环体有多条语句时使用复合语句。在循环中应该有使while表达式趋向假的操作,否则表达式恒为真,循环永不结束,成为死循环。1143.5.1while语句while语句的说明。由于while语句先计算表达式的值,再判断是否循环,所以如果表达式的值始终为假,则循环一次也不执行,失去了循环的意义。while语句循环条件可以是C语言的任意表达式。通常情况下,循环条件是关系表达式或逻辑表达式,应该谨慎出现别的表达式。从循环结构来看,while语句前应有循环初始,循环体内应有循环控制。
1153.5.2do语句do语句do语句的作用是先执行语句,然后计算给定的表达式,根据结果判定是否循环执行,语句形式为:其中的语句称为子语句,又称循环体,圆括号内的表达式称为循环条件。
do
语句while(表达式
);1163.5.2do语句do语句的执行过程是:①执行子语句;②计算表达式,无论表达式为何种类型均将这个值按逻辑值处理;③如果值为真,则再次执行①;如果值为假,则do语句结束,执行后续语句。
1173.5.2do语句图3.9do-while语句执行流程Repetitionexpressioncontinue1183.5.2do语句do语句的说明。(1)do语句与while语句的语法和含义类似。(2)do语句的最后必须用分号(;)作为语句结束,循环体的复合语句形式为:do{…//复合语句}while(表达式
);1193.5.2do语句do语句的说明。(3)do语句先执行后判定,while语句则是先判定后执行;do语句至少要执行循环体一次,而while语句可能一次也不执行。(4)do语句结构和while语句结构是可以相互替换的。图3.9(b)就是用while语句表示do语句的流程图,虚线框内为while语句结构。通常情况下,while语句比do语句用得多,而do语句使用的情形似乎就是如图3.9(b)的while语句结构。
1203.5.2do语句图3.9do-while语句执行流程121122例:输入一个最多5位的无符号正整数,以十、二、八、十六进制形式输出。intmain(){unsignednum,a;intn;
printf(”\nPleaseinputadata(1-65535):”);
scanf(”%u”,&num);printf(”\n\t10:%u\n\t2:”,num);a=num;do{n=a%2;a=a/2;/*除2取余法*/
printf(“%d\b\b”,n);}while(a!=0);
printf(”\n\t8:%o\n\t16:%x\n”,num,num);}631223.5.2do语句例3.9
1#include<stdio.h>2int
main()3{4
int
n=1,k=1;5
do{6k=k*n;7
scanf("%d",&n);8}while(n!=0);//输入0时结束循环
9
printf("%d\n",k);//输出乘积
10
return0;11}1233.5.3for语句for语句for语句的作用是计算给定的表达式,根据结果判定循环执行语句,for语句有循环初始和循环控制功能,语句形式为:for(表达式1;表达式2;表达式3)语句;1243.5.3for语句for语句的执行过程是:①计算表达式1;②计算表达式2,无论表达式2为何种类型均将这个值按逻辑值处理;③如果值为真,则执行循环体,然后计算表达式3,再重复②;④如果值为假,则for语句结束,执行后续语句。
1253.5.3for语句图3.10for语句执行流程1263.5.3for语句for语句的应用格式
for(循环初始;循环条件;循环控制)循环体;for(n=1,sum=0;n<=100;n++)sum=sum+n;1273.5.3for语句for语句内中三个表达式,用分号(;)作为间隔。三个表达式均可以省略,但中间的分号不能省略,下面分情形讨论。情形一。省略表达式1。省略表达式1就相当于将循环初始计算省略了,此时应在for语句之前有循环初始,如while语句那样。其执行流程如图3.11(a)所示。1283.5.3for语句图3.11for语句的多种形式1293.5.3for语句省略表达式1。n=1,sum=0;for(;n<=100;n++)sum=sum+n;//累加和1303.5.3for语句情形二,省略表达式2。C语言规定省略表达式2,则循环条件始终为真,循环永远执行下去。其执行流程如图3.11(b)所示。1313.5.3for语句图3.11for语句的多种形式1323.5.3for语句省略表达式2。for(n=1,sum=0;;n++)sum=sum+n;//无限循环1333.5.3for语句情形三,省略表达式3。省略表达式3相当于将循环控制计算省略了,此时应在for语句的循环体里有循环控制,如while语句那样。其执行流程如图3.11(c)所示。1343.5.3for语句图3.11for语句的多种形式1353.5.3for语句省略表达式3。for(n=1,sum=0;n<=100;)sum=sum+n,n++;for(n=1,sum=0;n<=100;)sum=sum+n;
n++;for(n=1,sum=0;n<=100;){sum=sum+n;
n++;}1363.5.3for语句情形四,省略表达式1和表达式3。此时,for语句只有充当循环条件的表达式2,完全等同于while语句,由此可见for语句比while语句功能强。例如:
n=1,sum=0;for(;n<=100;)sum=sum+n,n++;n=1,sum=0;while(n<=100)sum=sum+n,n++;137138例:for(i=10;i;i--)printf(“%d,”,i);
10,9,8,7,6,5,4,3,2,1,例:for(i=0;i<=10;i=i+2)printf(“%3d”,i);
printf(“\ni=%d”,i);
0246810i=12138139例:for(i=1,j=6;i<j;i++,j--)
printf(“%d*%d=%d\n”,i,j,i*j);
1*6=62*5=103*4=12例:空循环构成一个延时器
longt;
for(t=0;t<=83000000;++t);
139140例:计算1~5的阶乘
intmain(){
int
i,fact;
for(fact=1,i=1;i<=5;i++) {fact=fact*i;
printf("\t%d!=%d\n",i,fact);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业培训师授课技巧提升手册
- 二手木材粉碎削片机销售协议合同二篇
- 远程办公网络安全防护预案
- 消费者利益至上保障承诺书(9篇)
- 社区服务与管理指南手册
- 期中考试英语测题及答案
- 期中考试七科试卷及答案
- 2026鄂州市护士招聘面试题及答案
- 业务拓展快速报价模板方案
- 2026达州市专职消防员招聘笔试题及答案
- 2026年陕西有色冶矿集团第一批招聘(48人)笔试参考题库及答案解析
- 2026年乡镇粮食安全责任制规定知识测试题
- 2026太平保险校招面试题及答案
- 企业环保工作绩效考核方案
- 2026年航空航天基础知识模拟题库
- 肿瘤免疫治疗伦理审查的特殊考量
- 煤矿事故应急培训课件
- 胸痛CBL的课件教学课件
- 全国园林绿化养护概算定额(2018版)
- GA 802-2019道路交通管理机动车类型
- 金融反诈理论考试题库(浓缩500题)
评论
0/150
提交评论