第四章语句与程序控制结构.docx
- 文档编号:5406376
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:36
- 大小:113.64KB
第四章语句与程序控制结构.docx
《第四章语句与程序控制结构.docx》由会员分享,可在线阅读,更多相关《第四章语句与程序控制结构.docx(36页珍藏版)》请在冰豆网上搜索。
第四章语句与程序控制结构
第四章语句与程序控制结构
4.1语句总述
组成C语言的主要成分是函数,而函数主要由语句组成。
语句就象人们通常说的一句话一样,表达一个完整的思想。
和其他高级语言一样,C语言的语句用来向计算机系统发出操作指令。
C语言中有各种各样的语句以满足结构化程序设计的要求。
C语言提供的语句主要有说明语句和执行语句,其中执行语句包括空语句、表达式语句、控制语句、复合语句等,它们构成了程序的三种程序控制结构:
顺序结构、选择结构和循环结构。
4.1.1说明语句、表达式语句和空语句
C语言中语句是以分号“;”为结束标志的,因此只要有分号的地方就有一个语句,不管前面是否有内容。
分号前没有内容的语句称之为空语句,空语句不执行的任何操作。
空语句的作用一是在循环语句中使用空语句提供一个不执行操作的空循环体;二是为有关语句提供标号,用以说明程序执行的位置。
变量的定义和函数的说明后面也加分号,统称为说明语句(C中的说明语句只可出现在程序可操作语句的前面)。
任何表达式后面加分号就成为表达式语句,执行表达式语句就是计算表达式的值。
就像英文句子有动词和宾语一样,一条典型的C表达式语句也包含一个或多个表示动作的单词和一个或多个完成这些动作时使用的对象名称。
在C语句中,运算符的功能类似于单词,变量或常量是操作对象。
具体实例:
;/*空语句*/
inta,b;/*变量说明语句*/
intsum(int,int)/*函数说明语句*/
x=3;/*赋值表达式语句*/
a=1,b=2,c=3;/*逗号表达式语句*/
a&&b||c;/*逻辑表达式语句*/
i++;/*算术表达式语句*/
x>y;/*关系表达式语句*/
4.1.2控制语句
控制语句用于控制程序的流程,以实现程序的各种结构。
C语言有九种控制语句。
如表示条件选择的if语句、if-else语句、if-elseif-else语句,实现循环控制的while语句、do-while语句、for语句,实现程序跳转的continue语句、break语句和return语句。
除return语句外,其他语句都将在本章介绍。
4.1.3复合语句
用一对{}将两条或两条以上语句括起来可以组成一个复合语句,复合语句又被称为块语句或分程序。
在语句上它被看成一条语句而不是多条语句。
如
{
t=x;
x=y;
y=t;
}
在复合语句中不仅有执行语句,还可以说明变量。
复合语句组合多个子语句的能力及采用分程序定义局部变量的能力是C语言的重要特点,它增强了C语言的灵活性,同时还可以按层次使变量作用域局部化,使程序具有模块化结构。
4.2顺序结构
C语言中的顺序结构主要由说明语句、表达式语句、空语句以及复合语句组成。
在顺序结构程序中,各语句(或命令)是按照位置的先后次序顺序执行的,且每个语句都会被执行到。
可以用图4-1表示顺序结构流程图。
一般情况下,顺序结构的程序主体是完成具体功能的各个语句和运算,主要包括:
⑴提供数据语句。
⑵运算语句。
⑶输出语句。
【例4.1】输入两个整数,用两种方法完成两数的交换。
程序一:
main()
{
inta,b,t;
scanf("%d%d",&a,&b);/*提供数据*/
t=a;
a=b;
b=t;/*运算*/
printf("%d%d",a,b);/*输出*/
}
程序二:
main()
{
inta,b;
scanf("%d%d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d%d\n",a,b);
}
程序一和程序二都利用了三条顺序执行的赋值语句,其中程序一中用变量t作为交换媒介、程序二中利用加减法都实现了交换功能。
不管哪种方法,三条赋值语句的顺序都不可随意改变,否则不能达到目的。
4.3选择结构
选择结构是实现结构化程序设计的基本成分之一,它所要解决的问题是根据“条件”判断的结果决定程序执行的流向,因此该结构也被称为判断结构。
程序执行的流向是根据条件表达式的值是“0”还是非“0”来决定的。
非0代表条件为“真”,即条件成立;0代表条件为“假”,即条件不成立。
设计选择结构程序,需要考虑两个方面的问题:
一是在C语言中如何来表示条件,二是在C语言中实现选择结构用什么语句。
在C语言中表示条件,一般用关系表达式或逻辑表达式。
实现选择结构用if条件语句或switch分支语句。
下面我们将详细介绍这些语句。
4.3.1if语句
1.简单的if语句
在简单的if语句中,关键词if后跟随一个括号中的表达式,随后是花括号中的一条语句或多条语句。
语法形式如下:
if(表达式)语句
这里的“表达式”就是决定程序流向的“条件”,当表达式的值为非0时执行“语句”,否则就不执行。
此结构的执行过程如图4-2所示。
【例4.2】输入任意三个整数num1、num2、num3,求三个数中的最大值。
main()
{
intnum1,num2,num3,max;
printf("Pleaseinputthreenumbers:
");
scanf("%d,%d,%d",&num1,&num2,&num3);
max=num1;
if(num2>num1)max=num2;
if(num3>max)max=num3;
printf("Thethreenumbersare:
%d,%d,%d\n",num1,num2,num3);
printf("max=%d\n",max);
}
2.if…else语句
if-else语句的语法格式为:
if(表达式)
语句1
else
语句2
if后面的“表达式”,通常是能产生“真”、“假”结果的关系表达式或逻辑表达式,也允许是其他类型的数据,如整型、实型、字符型等。
它的执行流程是:
当if后表达式的值为真(非0)时,执行语句1,否则执行语句2。
这里的语句1和语句2可以是简单语句,也可以是复合语句。
该结构的执行过程如图4-3所示。
【例4.3】输入任意一个整数,输出该整数的绝对值。
main()
{
intn;
scanf("%d",&n);
if(n>=0)
printf("%d",n);
else
printf("%d",-n);
}
这种形式的if-else语句也可以用条件运算符改写,上例中程序可改写成:
main()
{
intn;
scanf("%d",&n);
printf("%d",n>=0?
n:
-n);
}
3.系列if…else语句
系列if…else语句是一种多分支选择结构,这种形式的if语句可以写成:
if(条件1)语句1
elseif(条件2)语句2
……
……
elseif(条件n)语句n
else语句n+1
此语句的执行过程如图4-4所示,表示在n个条件中,如果满足其中某一个条件,则执行相应的语句并跳出整个if结构执行该结构后面的语句,若n个条件一个也不满足时,执行语句n+1。
如果没有语句n+1,那么最后一个else可以省略,此时该if结构在n个条件都不满足时,将不执行任何操作。
同样这里的语句可以是用一对{}括起来的复合语句。
【例4.4】用elseif结构求解一元二次方程ax2+bx+c=0的根,系数a、b、c的值从键盘输入。
分析:
按照数学上的理论,此一元二次方程的根由三个系数a、b、c的值决定,不同的系数组合可能有不同的根,因此程序中要充分考虑到各种情况,代码如下:
#include"stdio.h"
#include"math.h"
main()
{
floata,b,c,p,x1,x2,real,imag;
scanf("%f%f%f",&a,&b,&c);
if(a==0&&b==0&&c==0)/*三者都为0,有无穷解*/
printf("Infiniteroosts!
\n");
elseif(a==0&&b==0&&c!
=0)/*a、b为0,c不为0,无解*/
printf("Noroots!
\n");
elseif(a==0&&b!
=0)/*a为0,b不为0,无论c值如何,一个根*/
printf("Singleroot:
%f\n",-c/b);
elseif(a!
=0)/**/
{
p=b*b-4*a*c;
real=-b/(2*a);
imag=sqrt(fabs(p))/(2*a);
if(p==0)/*b2-4ac==0,有两个相同解,一个实根*/
printf("Singleroot:
%f",real);
elseif(p<0)/*b2-4ac<0*,有两个虚数根*/
{
printf("Complexroots:
");
printf("%f+%fi,%f-%fi\n",real,imag,real,imag);
}
else/*b2-4ac>0,有两个不同的实数根*/
{
x1=real+imag;
x2=real-imag;
printf("Realroots:
%10fand%10f\n",x1,x2);
}
}
}
运行结果(程序分别执行5次):
000↓
Infiniteroots!
144↓
Singleroot:
-2.000000
421↓
Complexroots:
-0.250000+0.433013i,-0.250000-0.433013i
241↓
Realroots:
-0.292893and–1.707107
002↓
Noroots.
关于使用if条件语句,需要说明几点:
⑴if语句可以嵌套使用。
例如例4.4中关于一元二次方程求根问题,按数学上的理论,a!
=0是方程众多求根条件之一,但在此条件中又分两种情况:
当b2-4ac>=0时,方程有两个实数根,当b2-4ac<0时,方程有两个虚数根。
所以在elseif(a!
=0)条件语句下嵌套使用if-else语句。
⑵if结构中语句可以是简单语句也可以是复合语句,复合语句一定要加{}表示if或elseif的作用域范围,即当if后的条件表达式成立时应该执行的所有语句。
如:
if(x>y)x=y;y=z;z=x;/*不适当的写法*/
该程序段中,当x>y时执行x=y;然后依次执行y=z;z=x;两句,当x<=y时不执行x=y;语句,但后面两句仍然要执行,因为它们不在if条件表达式的作用域范围。
所以若希望满足条件x<=y时三个语句都不执行,那程序段应写成:
if(x>y){x=y;y=z;z=x;}/*使用复合语句*/
⑶当程序中有众多if和else时,else总是跟它上面最近的if语句配对,并且else必须和if配对使用。
分析以下代码段:
inta=1,b=3,c=5,d=4,x;
if(a
if(c else if(b elsex=3; elsex=6; 该程序段的运行结果应为2,流程图如图4-5所示。 4.3.2switch语句 分支语句即指switch语句,也称之为开关语句,它也是一种多分支选择结构,switch是关键字,后面跟一个表达式,这个表达式里包含的某些变量在具体的问题模型里通常可能有不同的常量值,switch结构能够根据表达式值的不同,使得程序转入不同的模块执行。 switch结构的一般形式是: switch(表达式) { case常量表达式1: 语句1 case常量表达式2: 语句2 …… case常量表达式n: 语句n default: 语句n+1 } 这种结构的语句,在其他高级语言中也称case语句。 它的执行流程是: 当表达式的值与某一个case后面的常量表达式的值相同时,程序就执行这个case后面的语句并接着执行这个case后面的后续语句,直到switch语句的最后。 其执行过程可以用图4-6来表示,其中e表示switch后面括号中的表达式值,e1、e2、……、en等分别表示常量表达式1、常量表达式2、……、常量表达式n。 但通常情况下程序员并不希望出现这种情况,一般各个case之间是相互排斥的,所以在每一组case语句后可以用break语句结尾,break语句的作用是使得程序执行匹配的case后直接跳出switch结构,接着执行switch结构后面的语句。 关于switch结构的几点说明: ⑴每个case后面的常量表达式的值必须互不相同,以免程序执行的流程产生矛盾。 ⑵switch后面括号内的表达式可以是整型表达式,字符表达式等。 ⑶多个case可以共用一组执行语句,如 …… case4: case5: case6: case7: d=8; 表示switch结构的表达式的值为4、5、6或7时,都执行同一组语句: d=8;。 ⑷若要在执行一个case分支语句后,使程序执行流程退出switch结构,那么可以加入break语句。 常用的带break语句的switch结构的语法格式如下: switch(表达式) { case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; …… case常量表达式n: 语句n;break; default语句n+1; } 【例4.5】编写程序输入一个五位或五位以下的正整数,逆序输出该数。 分析: 正整数余10后能得到其个位上的的数,如1234%10等于4,因此,如果某一个数第一次余10得到个位数后再除以10余10那么将得到原来的十位上的数,如1234/10%10等于3,依此类推,可得到整数各个位上的数。 本题是利用无break语句的switch语句的特点写成的程序,避免了用if-elseif-else结构写程序时的相对冗长的代码,读者可自行用if结构写出程序作个比较。 main() { longa; intn; scanf("%ld",&a); if(a>0&&a<=99999) { n=a<10? 1: a<100? 2: a<1000? 3: a<10000? 4: a<100000? 5: 0; printf("%ddigits,inversednumber: ",n); switch(n) { case5: printf("%ld",a%10);a=a/10; case4: printf("%ld",a%10);a=a/10; case3: printf("%ld",a%10);a=a/10; case2: printf("%ld",a%10);a=a/10; case1: printf("%ld\n",a%10); } } elseprintf("Thenumberisnotavalidnum! \n"); } 运行结果: 54321↓ 5digits,inversednumber: 12345 【例4.6】用switch结构编写一个可以处理四则运算的程序。 分析: 这个例子用了带break语句的switch结构。 通过对运算符的分析,我们希望对每种运算符的式子执行相匹配的运算,而不执行其他的多余运算,因此每种运算完成后用break语句跳出switch结构避免前述情况的发生。 #include"stdio.h" main() { floatv1,v2; charop; printf("Pleasetypeyourexpression: "); scanf("%f%c%f",&v1,&op,&v2); switch(op) { case'+': printf("%f+%f=%f\n",v1,v2,v1+v2);break; case'-': printf("%f-%f=%f\n",v1,v2,v1-v2);break; case'*': printf("%f*%f=%f\n",v1,v2,v1*v2);break; case'/': if(v2==0) printf("divisionbyzero! \n"); else printf("%f/%f=%f\n",v1,v2,v1/v2); break; default: printf("unkownoperator.\n"); } } 运行结果(程序分别执行4次): Pleasetypeyourexpression: 2.1+3↓ 2.100000+3.000000=5.100000 Pleasetypeyourexpression: 2.1-3↓ 2.100000+3.000000=-0.900000 Pleasetypeyourexpression: 2.1*3↓ 2.100000+3.000000=6.300000 Pleasetypeyourexpression: 2.1/3↓ 2.100000+3.000000=0.700000 例4.5和例4.6分别是不带break语句和带break语句的有关switch结构的例子,通过实例看出我们也可以利用switch结构不带break语句的特点编写一些程序特例。 另外带break语句的switch多分支选择结构跟if-elseif-else多分支选择结构可以处理相同的问题,它们都需要逐个判断分支条件,当分支条件为真时执行该条件作用域下的语句块。 但它们又有所不同,if多分支选择结构针对具体问题划分出具体的条件区间,写成C语言条件表达式,而switch结构则针对某个具体的表达式的值展开讨论,尽可能的列出所有可能出现的结果分别进行处理。 有些问题既可以用if-elseif结构来处理,也可以用switch结构处理,但在写程序时还是要多作考虑,才能写出更简单实用正确的程序。 举个例子,我们要根据学生的分数打印等级,90~100等级为A,80~89等级为B,70~79等级为C,60~69等级为D,<60等级为E,其他情况提示错误字样。 定义学生的分数变量为grade,用if-elseif多分支选择结构可写成如下程序段: if(grade>=90)printf("A"); elseif(grade>=80)printf("B"); elseif(grade>=70)printf("C"); elseif(grade>=60)printf("D"); elseif(grade>=0)printf("E"); elseprintf("Error"); 但这个问题如果要用switch结构来解决,switch后面的表达式显然不能简单的写成switch(grade),因为grade可能出现的值实在太多了。 如果分数只能是0到100之间的所有整数的话,根据grade的可能出现的常量值来判断,也需要101条case语句才能完成,这样会使程序显得太过冗长,观察上面提到的分数区间会发现每个区间除10后得到的结果就是有限的了,用switch结构改写的程序片段如下: switch((int)grade/10) { case10: case9: printf("A);break; case8: printf("B");break; case7: printf("C");break; case6: printf("D");break; case5: case4: case3: case2: case1: case0: printf("E");break; default: printf("Error"); } 可见,类似的情况我们可以采取某些运算让原来if结构中的区间表示方法中的变量得到一个或几个固定值,从而可以运用switch结构。 4.4循环结构 循环结构也是结构化程序设计的基本成分之一,它所要解决的问题是在某一条件下,要求程序重复执行某些语句或某一个模块,这里的“条件”实际上也是一个表达式,根据表达式的两个状态(非0或0)决定循环是否继续。 这些被重复执行的语句或模块,称为循环体。 为了使循环不至于变成无限循环(死循环),在执行循环体的过程中,一定要使循环条件表达式中的变量(循环控制变量)值有所变化。 一个合理的循环结构,最终会使循环条件由一个状态变为另一个状态,使循环正常终止。 循环条件所用的表达式,可以是算术表达式、关系表达式、逻辑表达式或最终能得到非0或0值的其他表达式。 在C语言中,主要有以下三种循环结构: ⑴while结构 ⑵do-while结构 ⑶for结构 另外,C语言还提供了两个无条件控制语句: break语句和continue语句,这两条辅助语句一般用来控制程序中的某一循环结构是继续执行还是跳出循环结构。 4.4.1while语句 用while语句写成的循环结构也被称作为“当型”循环,其语法格式表示如下: while(表达式) 语句 其中: 表达式的作用是进行条件判断,通常为关系表达式或逻辑表达式;语句是while语句的内嵌语句,称之为循环体,循环体可以是简单语句也可以是复合语句。 当执行while语句时,先判断表达式的值,若为非0(真),执行循环体,每执行一次循环体后,都要再判别一下表达式的值,如果仍然是非0,再一次执行循环体,如此循环一直到表达式的值为0(假)时循环终止而接着执行while语句后面的语句。 while语句的执行流程如图4-7所示。 【例4.7】用while循环写一个程序,求一个正整数的最高位。 main() { longn; scanf("%ld",&n); while(n/10)/*相当于n/10! =0*/ n=n/10; printf("Highestbit: %ld\n",n); } 运行结果: 654321↓ Highestbit: 6 【例4.8】用while循环写一个程序统计从键盘输入的数字字符出现的次数并把其中的数字字符依次输出。 #include"stdio.h" main() { charc; intct=0; while((c=getchar())! ='\n') { if(c>='0'&&c<='9') { ct++; printf("%c",c); } } printf("\nThereare%ddigits! \n",ct); } 运行结果: adfa12s;wer,de34sd87*&50↓ 12348750 Thereare8digits! 对while语句的几点说明:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 语句 程序控制 结构