C语言程序设计教程课件:程序控制结构_第1页
C语言程序设计教程课件:程序控制结构_第2页
C语言程序设计教程课件:程序控制结构_第3页
C语言程序设计教程课件:程序控制结构_第4页
C语言程序设计教程课件:程序控制结构_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

程序控制结构3.1顺序结构3.2选择结构3.3循环结构3.4其他控制语句本章小结

3.1顺序结构

顺序结构就是程序按照语句出现的先后顺序依次执行。顺序结构流程图如图3-1所示,它有一个入口、一个出口,依次执行语句1和语句2。图3-1顺序结构流程图

3.1.1表达式语句

C语言程序由若干条语句组成,每条语句以分号结束。表达式语句是C语言语句中最基本的语句,在表达式后面加一个分号,就构成了表达式语句。其形式为:

表达式;

最典型的例子是由赋值表达式构成的赋值语句。如:

x=3 /*赋值表达式*/

x=3; /*一个赋值语句*/

3.1.2空语句

空语句是一个只由分号组成的语句。其形式为:

;

空语句什么都不做,当程序中某个位置在语法上需要一条语句,但在语义上又不要求执行任何操作时,可在此处使用一条空语句。空语句常用于循环语句中的循环体,表示循环体什么都不做。如:

for(i=1;i<=1000;i++); /*表示循环空转1000次,可用来延时*/

3.1.3复合语句

复合语句是用花括号括起来的、由若干条语句组成的语句块,又称为分程序,在语法上等价于一条语句。花括号内的语句组可以由任何合法的C语言语句组成,可以是说明语句、表达式语句,也可以是复合语句,若有说明语句,应该写在可执行语句的前面。复合语句的形式为:

{

[说明语句]

语句组;

}

3.2选择结构

3.2.1if语句 C语言的if语句有三种形式:单分支if语句、双分支if-else语句和多分支if-elseif语句。1.单分支if语句 单分支if语句的基本形式为: if(条件表达式) 语句

其中:

(1)条件表达式可以是任意的数值、字符、关系表达式或逻辑表达式,非0表示真,0表示假。条件表达式必须用圆括号括起来。

(2)语句可以是一条简单语句或一条复合语句。

单分支if语句的执行流程是:先计算条件表达式,若表达式结果为真(非0),则执行语句;否则,不执行语句,而执行if语句后面的下一条语句。其流程图如图3-2所示。图3-2单分支if语句流程图

【例3-1】从键盘上输入两个整数,将它们从小到大排列,即若第一个数大于第二个数,则交换顺序。

分析:由于计算机内存有易覆盖的特点,因此计算机中交换两个变量的值只能采取通过第三个变量间接交换的方法来实现,如图3-3所示。图3-3两个数交换的过程

2.双分支if语句

双分支if语句的基本形式为:

if(条件表达式)

语句1

else

语句2

双分支if语句的执行流程是:先计算条件表达式,若表达式结果为真(非0),则执行语句1;否则,执行语句2。其流程图如图3-4所示。图3-4双分支if语句流程图

【例3-2】从键盘上输入两个整数,求最大值。

程序代码如下:

【例3-3】计算分段函数:

3.多分支if语句

多分支if语句的基本形式为:

if(条件表达式1)

语句1

elseif(条件表达式2)

语句2

elseif(条件表达式n)

语句n

else

语句n+1

多分支if语句的执行流程是:先计算条件表达式1的值,若该值为真(非0),则执行语句1;否则,计算条件表达式2的值,若该值为真(非0),就执行语句2;依此类推,若各条件表达式的值都为假(0),则执行语句n+1。其流程图如图3-5所示。图3-5多分支if语句流程图

【例3-4】根据百分制成绩score,决定对应的五级制评定:大于等于90分为A级,80分及以上且90分以下为B级,70分及以上且80分以下为C级,60分及以上且70分以下为D级,60分以下为E级。

4.if语句的嵌套

【例3-5】计算分段函数:

思考:下面三个程序段,是否能实现上述题目要求?为什么?

3.2.2switch语句

除了多分支if语句,C语言还提供了另外一种多分支选择结构switch语句,又称为开关语句。

switch语句的基本形式为:

switch(表达式)

{

case常量表达式1:语句组1;[break;]

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

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

[default:语句组n+1;]

}

switch语句的执行流程是:首先计算switch后面表达式的值,逐个和case子句中的常量表达式相比较,当switch表达式的值与某个case后面的常量表达式的值相等时,即执行其后的语句组。如果该语句组中有break子句,则退出switch语句,若没有,则不再判断其他常量表达式的值是否匹配,继续执行后面其他case语句组。若switch表达式的值与所有case后面的常量表达式的值均不相等,且有default子句,则执行default后的语句组。其流程图如图3-6所示。图3-6switch语句流程图

【例3-6】某商场采用购物打折的优惠办法促销,每位顾客一次购物:1000元以下不优惠;1000元以上,按九五折优惠;2000元以上,按九折优惠;3000元以上,按八五折优惠;5000元以上,按八折优惠。编写程序,输入顾客的购物款,计算并显示出顾客的实际应付款。

分析:设顾客的购物款为x,打折后的货款为y,优惠公式为:

因为case后面的常量表达式不能写成一个表示范围的逻辑表达式,因此可以将switch表达式设为(int)x/1000,结果正好是一个整数;当x在3000≤x<5000范围内时,表达式(int)x/1000的值可能为3,也可能为4,这时两个case子句可以共用同一个语句组。

思考:若省去程序中的所有break,程序运行结果正确吗?

3.3循环结构

3.3.1while语句 while循环又称为当型循环,先判断循环条件再决定是否执行循环体,当事先未知循环的次数而根据条件来决定是否循环时,一般用while语句。while语句的基本形式为: while(条件表达式) 循环体语句

其中:

(1)“条件表达式”称为循环条件,可以是任意的数值、字符、关系表达式或逻辑表达式,非0表示真,0表示假。“条件表达式”必须用圆括号括起来。

(2)“循环体语句”可以是一条简单语句或一条复合语句。

while语句的执行流程是:先计算表达式的值,判断其是否为真(非0),若为真(非0),表示循环条件满足,则执行循环体,如此重复,直至表达式的值为假(0),表示循环条件不满足,退出循环执行后继语句。其流程图如图3-7所示。图3-7while语句流程图

【例3-7】编写程序,求1+2+3+…+100的值。

分析:这是一个求累加和的问题。加数从1开始有规律地变化到100,每次递增1,可以设置一个整型变量i来表示加数,每循环一次将当前加数累加后,该整型变量增1,表示下一个加数,用变量sum存放每次累加的和,初始令sum=0。

思考:

(1)若循环体内无语句i++;,则会出现什么情况?

(2)若将循环体内语句sum=sum+i; 与i++; 调换一下次序,结果会如何?

(3)若循环体不用复合语句(即去掉循环体的花括号),程序是否正确?

(4)循环执行结束后,循环变量i的值为多少?

【例3-8】输入两个自然数,求最大公约数。

分析:通常采用辗转相除法求两个自然数的最大公约数。方法如下:

(1)对于已知的两个数m、n,使得m>n;

(2) m除以n得余数r;

(3)若r=0,则n即为最大公约数,算法结束,否则令n->m,r->n,转到第(2)步继续执行。

【例3-9】编写程序将一正整数按逆序形式输出。

分析:逆序输出是指先输出个位数,再输出十位数、百位数……,可以先通过n%10求出个位,然后将n缩小10倍(n=n/10)后求出新的个位,即原来的十位数,再缩小10倍求得百位数,依此类推,直到n等于0时为止。

3.3.2do-while语句

do-while语句的基本形式为:

do

循环体语句

while(条件表达式);

do-while语句的执行流程是:先执行循环体语句一次,然后判断条件表达式是否成立,若为真(非 0),表示循环条件满足,继续执行循环体语句,如此重复,直至表达式的值为假(0),退出循环执行后继语句。其流程图如3-8所示。图3-8do-while语句流程图

【例3-10】编写程序,求1+3+5+…+99的值。

【例3-11】用公式 /4≈1-1/3+1/5-1/7+…求  的近似值,直到最后一项的绝对值小于10-6为止。

分析:本题也是求累加和的问题,因此循环体中可用sum=sum+t这样的求和表达式,其中sum表示累加的和,t是公式的某一项。关键问题是如何求出每一项t?首先考虑1+1/3+1/5+1/7+…相邻两项之间的关系,不难看出它们的分子都是1,分母是1,3,5,7,9…的奇数序列。若用变量i来存放分母的值,则每求和一次后i应增加2;另外,每次累加项不是整数,而是实数,因此t=1.0/i,其中i=i+2。

下面再考虑每加一项后下一项符号的变化,可用单独一个变量表示符号,每次求下一项时,原来项的符号乘 -1来实现符号变化。

最后确定循环条件:从上面求 的公式来看,根据题目要求可用每一项t的绝对值大于10-6来作为循环的条件。

3.3.3for语句

C语言中通常用for语句来实现已知循环次数的循环结构,当然它也可以替代while语句或do-while语句实现循环次数不确定的情况。

for语句的基本形式为:

for(表达式1;表达式2;表达式3)

循环体语句

for语句的执行流程是:

(1)先计算“表达式1”的值。

(2)再计算“表达式2”的值,并判断其是否为真,若为真(非0),则执行循环体语句;若为假(0),则跳出循环,执行for语句的后续语句。

(3)循环体语句执行后,计算“表达式3”的值,然后转到步骤(2)重复执行。

其流程图如图3-9所示。图3-9for语句流程图

【例3-12】求n!,即计算1*2*3*…*n的值。

分析:求多个数累积与累加和的算法思想类似,只是要注意存放累积数的变量初值应该为1。

【例3-13】输出所有的水仙花数。水仙花数是指一个三位数,其各位数字的立方和等于该数本身,如153是一个水仙花数,153=13+53+33。

分析:从100到999每个三位数依次判断是否为水仙花数,用一个循环变量表示该三位数,每个三位数都拆分为个位、十位和百位三个数字,再比较三个数字的立方和是否等于该数本身。

3.3.4循环语句的嵌套

循环语句的嵌套是指在一个循环体语句内又包含了一个完整的循环语句,内嵌的循环体还可以再嵌套循环,形成多重循环。在实际应用中,三种循环语句可以自身嵌套,也可相互嵌套。但无论哪种嵌套形式,都要层次清楚,不能出现交叉。在编程或阅读程序时,要注意各层的循环变量的变化。

【例3-14】编写程序,打印如图3-10所示的图形。图3-10例3-14运行结果图

分析:这是一个按照规则变化的字符图形,一共有4行,每行由空格和星号构成,空格和星号的个数与行有关:每行前面的空格数按行减少,每行后面的星号按行增加。

思考:如何输出如图3-11所示的菱形?图3-11菱形的字符图形

打印字符图形的一般方法是:

(1)先分割图形,将有共同规律的图形或上下对称的图形作为一个两重循环可打印的部分,从上到下依次打印各部分图形。其中外循环变量代表行,内循环变量代表列。

(2)图形的每行都是由一组或若干组空格字符、非空格字符和一个回车组成,重要的是找到字符数与行号之间的关系。

【例3-15】百元买百鸡问题。现有100元,要求买100只鸡。假定母鸡每只3元,公鸡每只2元,小鸡每只5角。编程列出所有可能的购鸡方案。

分析:设母鸡、公鸡、小鸡的数量分别为x、y、z,根据题目要求,列出方程组:

其中包括3个未知数,2个方程。此题有若干个解,可采用试凑法(也称为穷举法)来实现,将可能出现的各种情况一一罗列测试,判断是否满足条件。

可用如下两种方法实现:

方法一利用了三重循环分别表示三只鸡的数量,考虑了所有的购鸡情况,最内层的循环体一共执行了1000000次;而方法二进行了优化,因为三只鸡总数为100只,若已知母鸡和公鸡的数量就可以通过100-x-y获得小鸡的数量,同时根据总共价格只有100元,可以得到母鸡的数量不会超过33只,公鸡的数量也不会超过50只,这样最内层循环体只需执行1734次。运行结果如图3-12所示。图3-12例3-15运行结果图

3.4其他控制语句

3.4.1goto语句 goto语句的基本形式为: goto标号; … 标号:语句其中:“标号”的命名规则同标识符,表示goto语句的转向入口;“标号:”后的语句是任意C语言语句。goto语句通常与if语句一起配合使用,表示满足条件时将程序的执行流程转到标号所指定的语句处。

【例3-16】用goto语句实现1+2+3+…+n,n的值从键盘输入。

3.4.2break语句和continue语句

程序中有时需要在满足某种条件时改变循环的正常流程,因此,C语言提供了break和continue两种循环转移语句。

1.break语句

break语句有两个作用:一是用于switch语句中,出现在case子句后,强制终止switch语句的执行,退出switch结构,保证多分支情况的正确执行;二是用于循环语句中,强制终止本层循环,转到循环的后续语句执行。其流程图如图3-13所示。图3-13break语句流程图

【例3-17】从键盘输入一个正整数,判断它是否为素数。

分析:素数是指大于1,且除了1和它本身以外,不能被其他任何数整除的数。为了判断某数m是否为素数,最简单的方法是用2~m-1中的数逐个去除m,看是否能整除,只要能被其中某个数整除,m就

温馨提示

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

评论

0/150

提交评论