




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章程序设计控制结构1
程序的结构:写文章有文章的结构建房子有房子的结构制造机械产品由机械产品的结构………
那么编写程序是否有程序的结构呢?学习的意义
程序结构顺序结构选择结构循环结构YES!第3章:程序设计的控制结构
23.1顺序结构程序设计3.2选择结构程序设计3.3循环结构程序设计学习目标
了解结构化程序设计的基本思想;掌握顺序结构的基本语句;掌握选择结构的语句并编程;掌握循环结构的语句并编程;综合使用三种程序结构编程解决实际问题。学习内容
3结构化程序设计思想C语言采用的是结构化程序设计思想。基本思想:任何程序都可以通过顺序结构、选择结构、循环结构表示。复杂程序是经过这3种基本结构反复嵌套使用而构成的。优点:程序模块结构清楚,层次分明,易于读写。4程序控制结构(1)顺序结构ABCA条件ABTF(2)分支结构条件TF(3)循环结构ATF条件A条件TF53.1顺序结构程序设计顺序结构是最简单的一种程序结构,流程按语句从上到下的顺序依次执行的。顺序结构中经常使用的是表达式语句、函数调用语句。程序中没有用于分支选择或循环的控制语句。
63.1.1赋值语句赋值语句由一个赋值表达式加上分号“;”组成,其一般形式为:
赋值表达式;赋值语句是程序中最基本的语句。例如:x=10 /*赋值表达式,非表达式语句*/x=10; /*赋值语句*/x=y=z=5; /*连续赋值语句*/73.1.2基本的输入、输出函数标准库函数中提供了一系列的输入输出函数:scanf格式输入函数printf格式输出函数
getchar字符输入函数putchar字符输出函数因为输入/输出由开发系统提供的库函数实现,函数的原型是在头文件stdio.h中定义,因此在使用库函数时,应在源程序的开头使用如下预编译命令语句:
#include<stdio.h> 或
#include"stdio.h"
8格式输出函数printf(P50,提到scanf前讲)一般格式printf("格式控制字符串",表达式1,表达式2,…,表达式n);功能按照“格式控制字符串”的要求,将表达式1,表达式2,…,表达式n的值显示在计算机屏幕上。
说明格式控制字符串用于指定输出格式。它包含两类字符:
常规字符:包括可显示字符和用转义字符表示的字符。
格式控制符:以%开头的一个或多个字符,以说明输出数据的类型、形式、长度、小数位数等。其格式为:%[修饰符]格式转换字符例:
longintx=0x8AB6;printf(“TheValueofxis%ld\n”,x);常规字符常规字符(转义符)格式控制符(修饰符)格式控制符(格式转换符)9printf使用时的注意事项(1)格式控制字符串可以不包含任何格式控制符。printf(“howareyou?\n”);//只有一个字符串参数,输出为:howareyou?printf(“howoldareyou?\n”,20);//带有两个参数,20没有意义,输出为:howoldareyou?已知:inta=2;函数调用:printf("a*a=%d,a+5=%d\n",a*a,a+5);实际输出:
a*a=4,a+5=7(2)当格式控制字符串中既含有常规字符,又包含有格式控制符时,则表达式的个数应与格式控制符的个数一致。此时,常规字符原样输出,而格式控制符的位置上输出对应的表达式的值,其对应的顺序是:从左到右的格式控制符对应从左到右的表达式。10printf使用时的注意事项(3)
如果格式控制字符串中格式控制符的个数多于表达式的个数,则余下的格式控制符的值将是不确定的。printf("5+3=%d,5-3=%d,5*3=%d",5+3,5-3);输出结果将是:5+3=8,5–3=2,5*3=-28710输出随机charch='A';printf("ch=%c",ch);//输出结果:ch=A(以字符形式输出)printf("ch=%d",ch);//输出结果:ch=65(以'A'字符的ASCII码形式输出)(4)不同类型的表达式要使用不同的格式转换符,同一表达式如果按照不同的格式转换符来输出,其结果可能是不一样的。
11#include<stdio.h>voidmain(){ intx=65,y=97;
printf("%d,%d\n",x,y); printf("x:%c,y:%c\n",x,y); }例3-3输出字符及其ASCII码。65,97x:A,y:a运行结果:
12类型格式字符含义d以十进制形式输出带符号整数(正数不输出符号)o以八进制形式输出无符号整数(不输出前缀0)x以十六进制形式输出无符号整数(不输出前缀Ox)u以十进制形式输出无符号整数f以小数形式输出单、双精度实数e以指数形式输出单、双精度实数g选%f或%e中较短的输出宽度输出单、双精度实数c输出单个字符s输出字符串格式字符串的一般形式为(带[]的项为可选项):
printf函数的格式控制符%[标志][输出最小宽度][.精度][长度]类型13字符含义l长度定义,输出长整形类型,可以加在字符d、o、x、u之前h长度定义,输出短整形类型m输出数据最小宽度;若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(小数点也算作一位).n对实数,表示输出n位小数;对字符串,表示截取n个字符-结果左对齐,右边填空格+输出符号(正号或负号)格式字符串的一般形式为(带[]的项为可选项):%[标志][输出最小宽度][.精度][长度]类型第4次课结束结合P51举例③,其它举例自学,④⑤⑥⑦上机演示讲解14格式输入函数scanf(P47)一般格式scanf(“格式控制字符串”,变量1的地址,变量2的地址,…,变量n的地址);功能在第一个参数格式控制字符串的控制下,接受用户的键盘输入,并将输入的数据依此存放在变量1、变量2、……、变量n中
。
inta;scanf("%d",&a);取地址运算符(与按位“与”同符号),只能作用于变量!格式字符串以%开头,在%后面跟有各种格式字符,以说明输入数据的类型、长度等。格式控制符与后续参数中的变量地址的原则上应有一一对应的关系。已知:
inta,b;函数调用:scanf("%d%d",&a,&b);假设输入:10□20↙变量的值:a的值是10,b的值是20第5次课15#include<stdio.h>voidmain(){ inta,b,c;
scanf("%d%d%d",&a,&b,&c);/*输入整型数据*/ printf(“a=%d,b=%d,c=%d”,a,b,c);/*输出数据*/}例3-1输入多个整数。a=10,b=20,c=30运行结果(假设输入为:102030↙):
16格式字符串的一般形式为(带[]的项为可选项):类型格式字符含义d输入十进制整数o输入八进制整数x输入十六进制整数f或e输入实数(用小数形式或指数形式)c输入单个字符s输入字符串
scanf函数的格式控制符
%[*][输入数据宽度][长度]类型17字符含义l指定长度:输入长整型数据(%ld,%lo,%lx)及双精度型浮点数(%lf,%le)h指定长度:输入短整型数据(%hd,%ho,%hx)输入数据宽度指定输入数据所占字符数(宽度)*表示该输入项,读入后不赋予相应的变量
格式字符串的一般形式为(带[]的项为可选项):%[*][输入数据宽度][长度]类型*?18使用scanf函数注意事项(结合P49举例,举例自学)
(1)如果相邻两个格式控制符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分隔,或者用Tab键分隔,或者输入一个数据后,按回车,然后再输入下一个数据。例如:
scanf("%d%d",&num1,&num2);假设给num1输入12,给num2输入36,则正确的输入操作为:
12□36↙(说明:□表示空格)或者
12↙36↙使用“↙”符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束。19例如:
scanf("%d:%d:%d",&h,&m,&s);假设给h输入12,给m输入30,给s输入10,正确的输入操作为:
12:30:10↙
(2)格式控制字符串中出现的常规字符(包括转义字符),务必原样输入。再例如:
scanf("num1=%d,num2=%d\n",&num1,&num2);
假设给num1输入12,给num2输入36,正确的输入操作为:num1=12,num2=36\n↙例如:
scanf("%3c%3c",&ch1,&ch2);假设输入abcdefg↙,则系统将读取的“abc”中的'a'赋给变量ch1;将读取的"def"中的'd'赋给变量ch2。(3)当格式控制字符串中指定了输入数据的域宽width时,将读取输入数据中相应的width位,但按需要的位数赋给相应的变量,多余部分被舍弃。20(4)当格式控制字符串中含有抑制符‘*’时,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。例如:
scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);假设输入123456789↙输出结果为:num1=12,num2=567。
例如:
scanf("%c%c%c",&ch1,&ch2,&ch3);假设输入:A□B□C↙,则系统将字母'A'赋值给ch1,空格'□'赋值给ch2,字母'B'赋值给ch3。(5)*
使用格式控制符%c输入单个字符时,空格和转义字符均作为有效字符被输入。21(6)输入数据时,遇到以下情况,系统认为该数据结束:
遇到空格,或者回车键,或者Tab键。
遇到输入域宽度结束。例如“%3d”,只取3列。
遇到非法输入。比方说,在输入数值数据时,遇到字母等非数值符号。例如:
scanf("%d",a);如果输入为:12a3↙,a的值将是12。例如:scanf("%d,%d",&a,&b);如果输入为:12a34↙,那么a的值将是12,b的值将无法预测。正确的输入是:12,34↙(7)当一次scanf调用需要输入多个数据项时,如果前面数据的输入遇到非法字符,并且输入的非法字符不是格式控制字符串中的常规字符,那么,这种非法输入将影响后面数据的输入,导致数据输入失败。(注意第19页)22(8)为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。例如:将scanf("num1=%d,num2=%d\n",&num1,&num2);改为:printf("num1=");scanf("%d",&num1);printf("num2=");scanf("%d",&num2);23#include<stdio.h>voidmain(){ chara,b;
scanf("a:%c,b:%c",&a,&b); printf("a=%c,b=%c\n",a,b);}例3-2输入字符。a=M,b=N运行结果(假设输入为:a:M,b:N↙):
24字符的输入getchar函数
功能:从键盘上输入一个字符一般形式:getchar();
例3-4输入单个字符。#include<stdio.h>voidmain(){ charc; c=getchar();/*取得用户键盘输入字符,赋给字符变量*/ putchar(c);/*将字符变量中的字符输出到屏幕*/}a运行结果(假设输入为:a↙):
25例3-5依次取回输入字符#include<stdio.h>voidmain(){ charc1,c2,c3; c1=getchar();
/*取第一个输入字符*/ c2=getchar();
/*取第二个输入字符*/ c3=getchar();
/*取第三个输入*/ putchar(c1); putchar(c2); putchar(c3); putchar(getchar()); /*直接作为表达式使用*/}abcd运行结果(假设输入为:abcdefg↙):
26字符输入的说明:如果程序执行到getchar函数,则会一直停留,直到收到键盘输入,再继续向下执行其后的语句。getchar函数只能接受单个字符,输入数字也按字符处理;即使输入多个字符,函数也只接收第一个字符。如果需要输入多个字符,可以连续使用多个getchar,依次取回输入字符。27字符的输出putchar函数
功能:在显示器上输出单个字符
一般形式:putchar(ch);
参数ch可以是:
字符变量 字符常量 整型数据常量(对应的ASCII字符) 特殊字符 转义字符28常用转义字符转义字符功能转义字符功能\n回车换行\r回车\t水平制表\f换页\a响铃\b退格29例3-6连续输出单个字符构成句子#include<stdio.h>voidmain(){ charc1='H',c2='E',c3='L',c4='O';/*定义字符变量并赋值*/
putchar(c1);
/*输出字符变量的值*/
putchar(c2); putchar(c3); putchar(c3); putchar(c4);
putchar('\t');
/*输出Tab制表键*/
putchar(87);
/*输出字符W*/
putchar(‘!');
/*输出字符!*/
putchar('\n');
/*输出回车换行符*/}HELLO W!运行结果:
303.4综合举例(顺序程序设计P78)例3-24输入圆的半径,求圆的周长和面积。
#include"stdio.h"
voidmain() { floatr; printf("Pleaseinputtheradius:\n"); scanf(“%f”,&r); //输入半径
printf(“circ=%.2f\n”,2*3.1415926*r);//周长 printf(“area=%.2f\n”,3.1415926*r*r);//面积
}教材此处有误,不应为dPleaseinputtheradius:30↙circ=188.50area=2827.43运行结果:
313.4综合举例(顺序程序设计P79)例3-25将输入的大写字母改成小写字母。#include"stdio.h"voidmain(){charc1,c2;printf(“Pleaseinputacapitalletter:”);//输入大写字母c1=getchar();c2=c1+32;printf("Thelowercaseletterof\"%c\"is\"%c\".\n",c1,c2);}Pleaseinputacaptialletter:A↙Thelowercaseletterof"A"is"a".运行结果:
323.2选择结构程序设计选择结构是根据给定的条件进行判断,由判断的结果决定执行两个或多个分支程序段的一支。通常采用if-else语法(教材有误,不是if-case)或switch-case语法。条件语句1
语句2TF33说明:
(1)
“}”后不加分号(2)语法上和单一语句相同(3)复合语句可嵌套(4)复合语句内定义的变量只能在复合语句内使用。
复合语句将多个语句用大括号“{}”括起来组成的一个语句。
{inta=2,b=3,c;c=a+b;printf("c=%d\n",c);}一般形式为:
{[数据说明部分;]执行语句部分;}
(补充)例:#include<stdio.h>voidmain(){intx=10,y=20,z;
z=x+y;
{intz;z=x*y;printf("z=%d\n",z);//输出复合语句中z的值}printf("z=%d\n",z);//输出复合语句外z的值}输出结果:z=200z=303.2.1复合语句和空语句34
while(getchar()!='\n')
;本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
空语句只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。353.2.2关系运算符、逻辑运算符与条件运算符选择结构中,经常采用结果为0或1的关系表达式、逻辑表达式来作为判断条件。条件语句1
语句2TF36关系运算是对两个值的大小等关系进行比较。关系运算的表达式称为关系表达式。C语言提供了6种关系运算符:关系运算符名称优先级<小于优先级相同(高于下面两种)<=(<和=之间没有空格)小于或等于>大于>=(>和=之间没有空格)大于或等于==(两个=之间没有空格)等于优先级相同(低于上面四种)!=
(!和=之间没有空格)不等于1.关系运算符和关系表达式
37关系表达式的结果是1或0。表达式关系成立,即为真,则结果是1;表达式不成立,即为假,结果为0。注意:C语言用0表示假,非0表示真。一个关系表达式的值不是0就是1,0表示假,1表示真。例如
关系表达式:a>b如果a=10,b=20,那么表达式不成立,结果为0。如果a=30,b=20,那么表达式成立,结果为1。38关系运算符的优先级
算术运算符高移位运算符关系运算符&、|、^赋值运算符低例如:
c>a+b等价于:a>b!=c等价于:a==b<c等价于:
a=b>c等价于:
a>>2<c+d等价于:a&4>b|c等价于:
c>(a+b)(a>b)!=ca==(b<c)a=(b>c)(a>>2)<(c+d)(a&(4>b))|c再例如:
a<=b+c 等价于:a<=(b+c)d=a==b>c 等价于:d=(a==(b>c))d=a>b>c
等价于:d=((a>b)>c)39已知:a=1;b=2;c=3;
问:d=a!=c==a<b<c;的值?
答:d的值为1。等价于:d=((a!=c)==((a<b)<c));例:求表达式的值inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表达式值1//表达式值1//表达式值0//d=1//f=040关系运算注意:例若a=0;b=0.5;x=0.3;
则a<=x<=b的值为
0例
5>2>7>8在C中是允许的,值为0例
inti=1,j=7,a;a=i+(j%4!=0);
则a=2例‘a’>0结果为‘A’>100结果为10例
应避免对实数作相等或不等的判断如1.0/3.0*3.0==1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)<1e-6041例3-7比较大小#include"stdio.h"voidmain(){ charc1='a',c2='b'; inti=10,j=20,k=30;
printf("c1=%c,c2=%c\n",c1,c2); printf("resultofc1>c2is:%d\n",c1>c2);printf("i=%d,j=%d,k=%d\n",i,j,k);printf("resultofk==i+jis:%d\n",k==i+j);printf(“resultofc1<iis:%d\n”,c1<i);/*比较字符变量c1和整型变量i的大小*/ }c1=a,c2=bresultofc1>c2is:0i=10,j=20,k=30resultofk==i+jis:1resultofc1<iis:0运行结果:422.逻辑运算符和逻辑表达式
逻辑运算符:对逻辑量进行与、或、非的运算。
逻辑运算符例子名称结合性优先级关系!!a逻辑非,单目运算符,表示相反右结合性
高低&&(两个&之间没有空格)a&&b逻辑与,双目运算符,表示并且左结合性||(两个|之间没有空格)a||b逻辑或,双目运算符,表示或者AB!A!BA&&BA||B假(0)假(0)1100假(0)真(非0)1001真(非0)假(0)0101真(非0)真(非0)0011逻辑运算真值表:运算结果是1或0,1表示真,0表示假。43!、~、++、--、sizeof高算术运算符移位运算符关系运算符&、|、^&&、||赋值运算符低例如:
a<=x&&x<=b等价于:a>b&&x>y等价于:a==b||x==y等价于:!a||a>b等价于:!a>b等价于:c=a||b等价于:a|7&&b&8等价于:a>>2&&b<<1等价于:2.逻辑运算符和逻辑表达式
逻辑表达式
用逻辑运算符连接逻辑量或关系表达式而成的表达式称为逻辑表达式。逻辑表达式的一般形式为:表达式逻辑运算符表达式例:a<b&&b<c、x>10||x<-10、!x&&!y逻辑运算符的优先级
(a<=x)&&(x<=b)(a>b)&&(x>y)(a==b)||(x==y)(!a)||(a>b)(!a)>bc=(a||b)(a|7)&&(b&8)(a>>2)&&(b<<1)表示“a小于等于x,且x小于等于b”。切勿写为a<=x<=b44已知:a=4;b=5;
问:c=b>3&&2||8<b-!a;的值?
答:c的值为1。等价于:c=(((b>3)&&2)||(8<(b–(!a))));
例:求表达式的值a=4;b=5;!aa&&ba||b!a||b4&&0||2‘c’&&‘d’//值为0//值为1//值为1//值为1//值为1//值为1第5次课结束45逻辑运算注意:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例a&&b&&c//只在a为真时,才判别b的值;
只在a、b都为真时,才判别c的值例
a||b||c//只在a为假时,才判别b的值;
只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//结果:m=0,n=1操作数可以是任何类型的数据。例如: ‘a’>=15 /*表达式结果为1*/ !10.0 /*表达式结果为0*/不做(n=c>d)第6次课463.条件运算符与条件表达式“?:”是C语言中唯一的三目运算符。一般形式:表达式1
?表达式2
:表达式3执行过程例如:max=(a>b)?a:b;该语句实现的是求a、b两个数中的大数。运算结果为:表达式2的值表达式1假真运算结果为:表达式3的值例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);例(a==b)?’Y’:’N’//若a等于b,表达式的值为‘Y’,否则为‘N’(x%2==1)?1:0//若x是奇数,表达式的值为1,是偶数则为0(x>=0)?x:-x//表达式的值是x的绝对值(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c//若c是小写字母,表达式的值为其大写字母;否则值为c。注意:c-‘a’+‘A’=c-(‘a’-’A’)=c-3247条件运算符?和:必须一起使用,不能分开。条件运算符的优先级别很低,仅仅高于赋值运算符和逗号运算符,而比其他运算符都低。所以max=(a>b)?a:b;也可以写成max=a>b?a:b;形式。条件运算符可嵌套
如x>0?1:(x<0?-1:0)结合方向:自右向左
如a>b?a:c>d?c:d
a>b?a:(c>d?c:d)表达式expr1、expr2、expr3类型可不同,表达式值取较高的类型。例x?‘a’:‘b’//x=0,表达式值为‘b’;x≠0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x<y,值为1.5(x%2==1)?"odd":"even"条件运算符和条件表达式注意48例3-8输入整数x,按右边的函数检验x的正负,并计算x的绝对值。
#include"stdio.h"
voidmain() { intx,y; scanf("%d",&x); y=x>0?1:(x<0?–1:0); printf("y=%d\n",y); printf("abs(x)=%d\n",x>=0?x:-x); }-21↙y=-1abs(x)=21运行结果:
49运算符总结:
总体上讲,单目运算符都是同等优先级的,具有右结合性,并且优先级比双目运算符和三目运算符都高。三目运算符的优先级比双目运算符要低,但高于赋值运算符和逗号运算符。逗号运算符的优先级最低,其次是赋值运算符。只有单目运算符、赋值运算符和条件运算符具有右结合性,其它运算符都是左结合性。双目运算符中,算术运算符的优先级最高,逻辑运算符的优先级最低。
单目运算符高算术运算符移位运算符关系运算符位运算符逻辑运算符条件运算符赋值运算符逗号运算符低到现在为止,我们已经学习了30多个运算符。掌握它们的优先级关系特别重要。优先级的记忆规则:503.2.3选择结构的程序设计选择结构有:使用if语句的条件选择结构使用switch语句的开关选择结构两种形式。if语句简单if形式if-else形式if-else-if形式嵌套的if语句513.2.3选择结构的程序设计1.if语句
简单if语句形式
if(表达式)语句;格式:执行流程:语句表达式TF含义:如果表达式的值为真,则执行其后的语句,否则不执行该语句而继续执行if语句之后的程序。例3-9判断学生成绩是否及格 #include"stdio.h"
voidmain() { intgrade; printf("Pleaseinputyourgrade:"); scanf("%d",&grade);
if(grade>=60) printf("Good!\n"); }Pleaseinputyourgrade:80↙Good!运行结果:
523.2.3选择结构的程序设计1.if语句
if_else形式
if(表达式)语句1;else语句2;格式:执行流程:表达式语句1语句2TF含义:如果表达式的值为真,则执行语句1,否则执行语句2。例3-10判断两个整数的是否相等 #include"stdio.h"
voidmain() { inta,b; printf("Pleaseinputtwointegernumbers:"); scanf("%d%d",&a,&b);
if(a==b) printf("Equal!"); else printf("Unequal!"); }Pleaseinputtwonumbers:80100↙Unequal!运行结果:
531.if语句
if_else_if形式
if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……[else语句n;]格式:执行流程:表达式1语句1语句2F表达式2表达式3F语句3语句nTFTT含义:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续向后执行程序。如果所有的表达式均为假,则执行语句n。54例3-11比较两个数的大小#include"stdio.h"voidmain(){ inta,b;
printf("Pleaseinputtwointegernumbers:"); scanf("%d%d",&a,&b);
if(a==b) printf(“Equal!”);//此处教材有误,去掉“max”
elseif(a<b) printf("%dislargerthan%d!\n",b,a);
else//注意与对应if对齐,教材排版不妥
printf("%dislargerthan%d!\n",a,b); }Pleaseinputtwonumbers:80100↙100islargerthan80!运行结果:
Pleaseinputtwonumbers:100100↙Equal!另一种运行结果:
55例3-12判断学生成绩的级别#include<stdio.h>voidmain(){ intgrade;
printf("Pleaseinputyourgrade(0-100):"); scanf("%d",&grade);
if(grade>100||grade<0) printf("%disaninvalidvalue.\n",grade); elseif(grade>=80) printf("%disGOOD!",grade);
elseif(grade>=60) printf("%disOK!",grade);
else
printf("%disNOTGOOD!",grade); }//注意if与对应else对齐,教材排版不妥Pleaseinputyourgrade(0-100):89↙89isGOOD!运行结果:
56if语句嵌套:
一般形式:if(expr1)
if(expr2)statement1;elsestatement2;else
if(expr3)statement3;elsestatement4;内嵌if内嵌ifif(expr1)
if(expr2)statement1;
内嵌ifif(expr1){
if(expr2)statement1;}elsestatement2;
内嵌ifif(expr1)if(expr2)statement1;else
statement2;else
statement3;内嵌if57例3-13比较两个数的大小
#include<stdio.h>
voidmain(){inta,b;printf(“Pleaseinputtwonumbers:");scanf("%d%d",&a,&b);printf(“a=%d,b=%d”,a,b);if(a!=b)if(a<b)printf(“a<b\n");elseprintf(“a>b\n");elseprintf(“a==b\n");}运行结果:Pleaseinputtwonumbers:80100↙a=100,b=80a>b58例3-14求三个数中的最大数#include<stdio.h>
voidmain(){ intx,y,z,max;
printf("Pleaseinputthreeintegernumber:"); scanf("%d%d%d",&x,&y,&z); max=x; /*初始设置变量max为x的值*/
if(x==y&&y==z) printf("x=y=z,max=%d\n",max);
else{
if(y>max) max=y;
if(z>max) max=z; printf("max=%d\n",max); }}运行结果:Pleaseinputtwonumbers:111133↙
max=3359if语句注意事项
(1)if语句后面的表达式必须用括号括起来。例:ifx>0printf(“x>0”);例:if(x>0)printf(“x>0”);
if(a=5)语句;
//表达式的值永远为非0,所以其后的语句总是要执行的if(b)语句;
//等价于if(b!=0)语句;(2)表达式通常是逻辑表达式或关系表达式,但也可以是其它任何表达式,如赋值表达式等,甚至也可以是一个变量。只要表达式非零时,表达式的值就为真,否则就是假。60if语句注意事项
(3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。例:if(a>b)a++;b++;else{a=0;b=1;}例:if(a>b){a++;b++;}else{a=0;b=1;}61if语句注意事项
(4)在if语句中,如果表达式是一个判断两个数是否相等的关系表达式,要当心不要将==写成了赋值运算符=。例:
#include<stdio.h>
voidmain(){intx=0;if(x==0)printf(“x=0\n”);elseprintf(“x!=0\n”);}例:
#include<stdio.h>
voidmain(){intx=0;if(x=0)printf(“x=0\n”);elseprintf(“x!=0\n”);}运行结果:x=0运行结果:x!=062
if(……)if(……)if(……)else……else……else……C语言规定,在缺省{}时,else总是和它上面离它最近的未配对的if配对例:
#include<stdio.h>voidmain(){
inta=1,b=-1;
if(a>0)
if(b>0)a++;
elsea--;printf("a=%d\n");}例:
#include<stdio.h>voidmain(){
inta=1,b=-1;
if(a>0)
{if(b>0)a++;}
elsea--;printf("a=%d\n");}运行结果:a=0运行结果:a=1if_else配对原则63例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b)
{if(b==c)printf(“a==b==c”);
}elseprintf(“a!=b”);实现if~else正确配对方法:加{}64例:考虑下面程序输出结果:
voidmain(){intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)
if(b!=15)
if(!v1)x=1;
else
if(!v2)x=10;printf(“%d”,x);}结果:10等价于if(v1==0)等价于if(v2==0)652.switch语句(开关分支语句)一般形式:switch(表达式){caseC1: 语句组1;caseC2: 语句组2;…….caseCn: 语句组n;[default: 语句组m;]}含义:计算表达式的值,如果表达式的值和case中某常量表达式值相等时,就执行该case下的语句组,然后对之后的所有case及default不再判断而直接执行。如果表达式的值与所有case后的常量表达式均不相同时,则仅执行default后的语句。
66执行过程:switch表达式语句组1语句组2语句组n语句组m…...C1C2Cndefaultcase
67例3-15输入1-7之间的一个数字,输出该数字在一个星期中所对应日期的英文名称#include"stdio.h"voidmain(){ intday; printf("Pleaseinputaintegernumberbetween1and7:"); scanf("%d",&day);
switch(day) { case1: printf("Monday\n"); case2: printf("Tuesday\n"); case3: printf("Wednesday\n"); case4: printf("Thursday\n"); case5: printf("Friday\n"); case6: printf("Saturday\n"); case7: printf("Sunday\n"); default: printf("Error\n");}}运行结果:Pleaseinputaintegernumberbetween1and7:5↙Friday SaturdaySundayError68case后面的“常量表达式”仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。
switch(day) { case1: printf("Monday\n"); break; case2: printf("Tuesday\n"); break; case3: printf("Wednesday\n"); break; case4: printf("Thursday\n"); break; case5: printf("Friday\n"); break; case6: printf("Saturday\n"); break; case7: printf("Sunday\n"); break; default: printf("Error\n");}修改后的运行结果:Pleaseinputaintegernumberbetween1and7:5↙Friday 69
#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;default:printf("Yes,NoorAll\n");}}运行结果:
No//假设输入为:N
#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");case'A':printf("All\n");break;default:printf("Yes,NoorAll\n");}}//假设输入为:N运行结果:
NoALL70
使用switch语句注意事项(1)switch后面的“表达式”,可以是int、char和枚举型中的一种,但不可为浮点型。floata,b=4.0;scanf("%f",&a);switch(a){case1:b=b+1;break;case2:b=b-1;break;}printf("b=%f\n",b);不可为浮点型表达式71
使用switch语句注意事项(2)每个case后面必须是“常量表达式”,表达式中不能包含变量。例:按成绩分成A、B、C、D、E、F几个等级。charscore;printf("EnterScore:");scanf("%d",&score);switch(score){casescore>=90:printf("A");break;casescore>=80&&score<90:printf(“B");break;casescore>=70&&score<80:printf(“C");break;casescore>=60&&score<70:printf(“E");break;default:printf(“F");break;}case后面包含变量72inta,b=4;scanf("%d",&a);switch(a){case1:b=b+2;break;case2:b=b*2;break;case1:b=b+2;break;}printf("b=%d\n",b);
使用switch语句注意事项(3)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象。case1在前面已使用73
使用switch语句注意事项(4)case后面语句(组)可加{}也可以不加{},但一般不加{}。switch(i){case1:{b=b+1;break;}//{}可加可不加case2:b=b-1;break;}74
使用switch语句注意事项(5-1)case子句和default子句如果都带有break子句,那么它们之间顺序的变化不会影响switch语句的功能。#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;
default:printf("Yes,NoorAll\n");break;}}#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;
default:printf("Yes,NoorAll\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;}}75
使用switch语句注意事项(5-2)case子句和default子句如果有的带有break子句,而有的没有带break子句,那么它们之间顺序的变化可能会影响输出的结果。
#include<stdio.h>voidmain(){charch;ch=getchar();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;
default:printf("Yes,NoorAll\n");}}#include<stdio.h>voidmain(){charch;ch=getchar();switch(ch){case'Y':printf("Yes\n");break;
default:printf("Yes,NoorAll\n");case'N':printf("No\n");break;case'A':printf("All\n");break;}}//假设输入为:B运行结果:Yes,NoorAll运行结果:Yes,NoorAllNo//假设输入为:B76
使用switch语句注意事项 (6)switch语句可以嵌套。
voidmain(){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("\na=%d,b=%d",a,b);}运行结果:a=2,b=1
77重叠表达方式:switch语句中,如果不同的case分支下执行的是相同的语句组,那么可以简化程序为重叠表达方式,语句组不需要重复编写。
一般形式switch(表达式){ caseC1: caseC2: caseC3: 语句组1;break;
caseC4: 语句组2;break; ……. caseCn: 语句组n;break;[default: 语句组m;]}78例3-16判断用户输入字符是数字还是空格或其他符号。#include<stdio.h>voidmain(){charc;printf("Pleaseinputacharacter:");scanf("%c",&c);
switch(c)
{
case
'0':
case'1':
case'2':
case
'3':
case
'4':
case
'5':
case
'6':
case
'7':
case
'8':
case
'9': printf("%cisanumericalcharacter!\n",c); break;
case
'': printf("%cisablankspace!\n",c); break;
default: printf("%cisothercharacter!\n",c);}}运行结果:PleaseInputacharacter:5↙5isanumericalcharacter!程序用if语句也可以实现,下面的程序段完成了相同的功能。c=getchar();if(c>='0'&&c<='9') printf("%cisanumericalcharacter!\n",c);elseif(c=='') printf("Inputisablankspace!\n");else printf("%cisothercharacter!\n",c);79
例:当a的值是1、2、3时,将b的值加2,当a的值是4、5、6时,将b的值减2。
inta,b=4;scanf("%d",&a);switch(a){case1:case2:case3:b+=2;break;case4:case5:case6:b-=2;break;default:b*=2;break;}printf("b=%d\n",b);80例3-26
判断输入的年份是否是闰年。闰年是能被4整除但不能被100整除的年份,或可以被400整除的年份。P79的程序自学(条理不够清楚)。(补充)程序应该这样来设计:如果X能被Y整除,则余数为0,即如果X%Y的值等于0,则表示X能被Y整除!首先将是否闰年的标志leap预置为0(非闰年),这样仅当year为闰年时,将leap置为1即可。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请读者仔细体会。3.4选择结构程序设计举例(P79)81#include<stdio.h>voidmain(){intyear,leap=0; //leap=0:预置为非闰年printf("Pleaseinputtheyear:");//提示输入年份scanf(“%d”,&year);//输入年份if(year%4==0)//如果被4整除
if(year%100!=0)//如果不被100整除leap=1;//置为闰年if(year%400==0)//如果被400整除
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024江西吉安市吉水县旅游开发投资有限公司编外人员招聘2人笔试参考题库附带答案详解
- 火星尘暴对太阳能无人机续航的影响建模论文
- 2025年中学教师资格考试《综合素质》考前押题密卷五十六(含答案)
- 2025年小学语文毕业升学考试全真模拟卷(语文综合素养拓展)作文素材积累
- 2025年房地产经纪人考试模拟试卷:房地产经纪行业发展趋势
- 2025年育婴师职业技能测评试卷:育婴师婴幼儿早期教育试题
- 2025年平面设计师专业能力测试卷:平面设计作品设计理念国际化试题
- 2025年大数据分析师职业技能测试卷:数据挖掘与机器学习算法试题
- 2025年挖掘机司机劳务承包合同示范文本
- 2025钢筋混凝土结构施工合同范本
- 公司安全事故隐患内部举报、报告奖励制度
- 抛光机毕业设计
- 幼儿园军事教育课新版ppt
- 奎因企业文化因导向诊断模型详解
- 北京市森林火警、火情、火灾信息报告管理规定
- 浅谈岩溶隧道设计、施工与管理
- 学校中层干部民主测评表(一)
- 飞秒激光 近视手术(课堂PPT)
- 焊接质量计划书
- 中建股份《项目管理手册》印刷版
- 外立面改造施工组织设计
评论
0/150
提交评论