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

下载本文档

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

文档简介

程序控制结构程序的基本结构3.1语句3.2顺序结构3.3选择结构3.4循环结构3.5结构化程序设计方法3.63.1程序的基本结构人们从程序设计实践中总结出程序的三种基本结构,即顺序结构、选择结构、循环结构。3.2语句程序的执行部分是由语句构成的。执行语句的过程就是实现程序功能的过程。语句是C语言的基本执行单位。C语言的语句主要有声明语句、表达式语句、赋值语句、复合语句、控制语句、空语句等。3.2.1声明语句声明语句主要用来说明合法标识符,以便能在程序中合法使用它们。在C语言程序设计中,任何用户自定义的函数、变量和符号常量都必须遵循先声明后使用的原则。声明语句的语法格式如下:数据类型符用户标识符;3.2.2表达式语句由表达式组成的语句称为表达式语句。表达式语句是最简单的可执行语句,由一个表达式后面加上分号“;”构成。表达式语句的语法格式如下:表达式;任何表达式都可以加上分号“;”构成表达式语句,应该注意分号是表达式语句中不可缺少的一部分。3.2.3复合语句复合语句是用一对{}把多个语句组成在一起构成的,又称分程序或语句块。复合语句的形式为:{语句1;

语句2; ...

语句n;}在语法上将复合语句看成是单条语句,即看作是一个语句。复合语句具有组合多个子语句的能力,使程序具有模块化结构。3.2.4控制语句控制语句是用于控制程序流程的语句,一般指那些可改变顺序结构的语句。C语言的流程控制语句可分为三类:条件判断语句:if、switch循环执行语句:while、do-while、for流程转向语句:break、continue、return3.2.5空语句仅由一个分号“;”组成的语句称为空语句。空语句不执行任何操作。空语句的作用如下:1.在循环语句中提供一个不执行任何操作的空循环体。2.为有关语句提供标号,用以说明程序执行的位置。3.3顺序结构顺序结构是结构化程序设计中最简单、最常见的一种程序结构。在顺序结构中,从第一条语句到最后一条语句完全按先后次序顺序执行。

3.3顺序结构【例3.1】从键盘输入圆半径,输出圆面积(圆周率3.14,计算结果保留小数点后两位)。#include<stdio.h>voidmain(){doubler,area;//声明实型变量r,areaprintf("Pleaseinputr\n");//提示输入变量r的值scanf("%lf",&r);//通过键盘输入r值area=3.14*r*r;//通过圆面积公式计算圆面积,//并将计算结果赋给变量areaprintf("area=%.2f\n",area);//输出area的值}【例3.2】交换两个数的值并输出#include<stdio.h>voidmain(){inta,b,temp;//声明整型变量a、b、tempprintf("Inputa=");//提示输入变量a的值scanf("%d",&a);//输入变量a的值printf("Inputb=");//提示输入变量b的值scanf("%d",&b);//通过键盘输入b值temp=a;//先把a的值放入temp中a=b;//把b的值放入a中b=temp;//把temp中的值放入b中printf("a=%d,b=%d\n",a,b);//输出交换后a和b中的值}3.4选择结构3.4.1if语句if语句是用来判定所给定的条件是否满足,根据对给定条件的判定结果(真或假)决定执行给出某种操作。在C语言中if语句有三种形式:if形式、if-else形式和else-if形式。1.单分支结构if语句单分支结构的语法格式为:if(表达式){语句;}

【例3.3】将a,b的值从小到大输出#include<stdio.h>voidmain(){inta,b,temp;//声明整型变量a、b、tempprintf("Inputa=");//提示输入变量a的值scanf("%d",&a);//输入变量a的值printf("Inputb=");//提示输入变量b的值scanf("%d",&b);//通过键盘输入b的值if(a>b)//判断条件是否成立{temp=a;//先把a的值放入temp中a=b;//把b的值放入a中b=temp;//把temp中的值放入b中}printf("%d,%d\n",a,b);//按值从小到大输出}2.双分支结构if-else语句单分支结构的语法格式为:if(表达式){语句(复合语句)1;}else{语句(复合语句)2;}【例3.4】输出a,b中的最大值#include<stdio.h>voidmain(){inta,b;//声明整型变量a、bprintf("Inputa=");//提示输入变量a的值scanf("%d",&a);//输入变量a的值printf("Inputb=");//提示输入变量b的值scanf("%d",&b);//通过键盘输入b值if(a>b)//判断条件a>b条件是否成立printf("较大数是%d\n",a);//这里只有一条语句,可省略{}elseprintf("较大数是%d\n",b);//a>b条件不成立,输出b的值}3.多分支结构在现实中遇到的情况可能有多个分支,当有多个分支时,可以用elseif语句,其语法格式为:if(表达式1){语句(复合语句)1;}elseif(表达式2){语句(复合语句)2;}elseif(表达式3){语句(复合语句)3;}……elseif(表达式n){语句(复合语句)n;}else{语句(复合语句)n+1;}多分支结构流程图【例3.5】输入百分制成绩,输出对应成绩等级#include<stdio.h>voidmain(){intscore;//声明整型变量scoreprintf("Pleaseinputscore:");//提示输入分数成绩scanf("%d",&score);//从键盘输入变量score的值if(score>=90)//判断score是否属于等级Aprintf("A\n");//只有一条语句,可省略{}elseif(score>=80)//判断score是否属于等级Bprintf("B\n");elseif(score>=70)//判断score是否属于等级Cprintf("C\n");elseif(score>=60)//判断score是否属于等级Dprintf("D\n");else//以上所有表达式的值均为假printf("E\n");//输出E}4.if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。if语句嵌套的目的是解决多路分支问题。if嵌套语句的一般形式如下:if(表达式1){if(表达式2)

语句1;else

语句2;}else{if(表达式3)

语句3;else

语句4;}if语句的嵌套流程图【例3.6】输入3个数,输出最大值#include<stdio.h>voidmain(){inta,b,c,max;//声明整型变量

printf("Pleaseinput3integernumber:");//提示输入3整数个数

scanf("%d%d%d",&a,&b,&c);//从键盘输入3个数

if(b>a){if(c>b)//不同层次的if要有缩进

max=c;else//else要与相匹配对应的if缩进对齐

max=b;}//“}”与对应的“{”对齐

else//else与相匹配对应的if对齐

{//复合语句,大括号不能省略

if(c>a) max=c; else max=a;}//“}”与对应的“{”对齐

printf("max=%d\n",max);//输出最大的数}3.4.2switch语句if嵌套语句也可以实现多分支的选择问题,但如果分支较多,程序代码行数也随之曾多,从而降低了程序的可读性,造成程序容易产生错误。C语言提供了switch语句可以解决这一问题,switch语句直接处理多分支选择,而且可读性较好。它的一般形式如下:switch(表达式){case常量表达式1:语句1;break;

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

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

default:语句n+1;}switch语句的流程图【例3.7】输入百分制成绩,输出对应成绩等级#include<stdio.h>voidmain(){intscore;//声明整型变量scoreprintf("Pleaseinputscore:");//提示输入分数成绩scanf("%d",&score);//从键盘输入变量score的值switch(score/10)//表达式score/10结果为整数类型{case10:printf("A\n");break;//输出对应等级后,退出switchcase9:printf("A\n");break;case8:printf("B\n");break;case7:printf("C\n");break;case6:printf("D\n");break;default:printf("E\n");//表达式与前面case值都不等//则执行default后语句,输出E等}}【例3.8】键盘输入年份和月份,输出该月的天数。分析:(1)根据公历,每年的1、3、5、7、8、10和12月份每月都有31天;4、6、9和11月份每月都有30天。2月平年有28天,闰年有29天。可以看出这是一个多分支选择问题,可以利用switch语句来解决。(2)可以设置变量year,month,days来分别表示年、月、当月天数。还可以设置一个标记flag,判断当年是否闰年。(3)先判断年份是否为闰年,再利用swtich语句,进入多分支选择。3.4.3程序应用举例例3.9某城市为鼓励节约用水,对居民用水量作如下规定:若一户居民每月用水量不超过30吨(含30吨),则按每吨0.6元收费;若大于30吨但不超过50吨(含50吨),则其中30吨按0.6元收费,剩余部分按每吨0.9元收费;若超过50吨,则不超过50吨的部分按前面方法收费,剩余部分按每吨1.5元收费。程序实现输入一户居民的月用水量,输出应缴纳的水费。分析:(1)声明实型变量d,用于存放用水量;声明实型变量m,用于计算水费。(2)根据不同的用水量,确定出不同的水费计算公式。(3)对实际用水量d,选择相应的计算公式,计算出相对应的水费。3.4.3程序应用举例例3.10某销售公司员工月收入为底薪加当月销售业绩(设为整数元)提成。底薪900元,具体提成如下表:销售业绩(元)提成比例<500005000~999910%10000~1999913%20000~3999915%>=4000018%3.5循环结构

循环结构在给定条件成立时,反复执行某段程序,直到条件不成立为止。所给定的条件称为循环条件,反复执行的程序段称为循环体。在C语言中实现循环结构有三种控制语句,即while语句、do-while语句、for语句。3.5.1while语句while语句一般形式如下:while(表达式){

循环体;}【例3.11】用while语句实现求1+2+…+100的和

#include<stdio.h>voidmain(){inti,sum;//声明整型变量i和sumi=1;//数列第一项为1sum=0;//使数列初始化和为0while(i<=100)//当表达式成立则执行循环体{ sum=sum+i;//累计求和 i++;//循环变量增1,使循环趋于结束}printf("sum=%d\n",sum);//输出数列求和结果}【例3.12】输入两个正整数a、b,求它们的最大公约数。方法一:最大公约数定义法。分析:根据最大公约数的定义,a、b两个数的最大公约数s一定是介于1到a之间的一个数,不会大于a且能同时被a和b整除。方法二:辗转相除法。分析:当b不等于0时,求a和b的最大公约数等价于求b和a%b的最大公约数,即重复执行运算(c=a%b,a=b,b=c),消除相同的因子,直到b为0时,a即为所求的解。3.5.2do-while语句do-while循环语句的特点是先执行循环体一次,然后再判断循环条件是否成立。do-while语句一般形式如下:do{

循环体;}while(表达式);

【例3.13】用do-while语句实现求1+2+…+100的和#include<stdio.h>voidmain(){inti,sum;//声明整型变量i和sumi=1;//数列第一项为1sum=0;//使数列初始化和为0do{ sum=sum+i;//累计求和 i++;//循环变量增1}while(i<=100);//当表达式成立则执行循环体printf("sum=%d\n",sum);//输出数列求和结果}

while语句和do-while语句的区别【例3.14】下面两段程序分别用while和dowhile实现求n(键盘输入)到10的和:用while语句实现的源程序:#include<stdio.h>voidmain(){intn,sum=0;//声明整型变量n和sumprintf("n=");//提示输入n的值scanf("%d",&n);while(n<=10)//当表达式成立执行循环体{sum=sum+n;//累计求和n++;//循环变量增1}printf("sum=%d\n",sum);}用dowhile语句实现的源程序:#include<stdio.h>voidmain(){intn,sum=0;//声明整型变量n和sumprintf("n=");//提示输入n的值scanf("%d",&n);do{sum=sum+n;//累计求和n++;//循环变量增1}while(n<=10);//当表达式成立执行循环体printf("sum=%d\n",sum);//输出数列求和结果}当输入n=1时,两段程序的运行结果部为sum=55。而当输入n=11时,第一段程序的结果为sum=0,第二段程序的结果为sum=11。结论:当while后面表达式的第一次值为“真”时,两种循环得到的结果相同;当while后面表达式的第一次值为“假”时,两种循环结果是不同的。所以do-while循环与while循环尽管十分相似,但它们的主要区别是:while循环先判断循环条件再执行循环体,循环体可能一次也不执行。do-while循环先执行循环体,再判断循环条件,循环体至少执行一次。3.5.3for语句for循环语句是C语言中使用最为灵活的循环语句。for循环语句一般形式如下:for([表达式1];[表达式2];[表达式3]){

循环体;}

【例3.15】用for语句实现求1+2+…+100的和#include<stdio.h>voidmain(){inti,sum;//声明整型变量i和sumsum=0;//使数列初始化和为0for(i=1;i<=100;i++){ sum=sum+i;//累计求和}printf("sum=%d\n",sum);//输出数列求和结果}3.5.4几种循环的比较for语句的一般形式中的“表达式1”可以省略,但此时一般应在for语句之前给循环变量赋初值。for语句的一般形式中“表达式3”也可以省略,但此时要设法保证循环能正常结束。在用while和do-while循环之前,一般要先对循环变量先赋初值。也就是说,循环变量的初始化操作一般是在while和do-while语句之前完成;而for循环的循环变量初始化一般是用表达式1实现。while和for属于“当型”循环,即先判断循环条件,后执行循环体;do-while属于“直到型”循环,即先执行循环体一次,再判断循环条件。1.break语句使用break语句的一般形式为:break;注意:break语句只能用于循环语句和switch语句之中。3.5.5改变循环执行的状态

【例3.16】输入一个大于2的正整数n,判断这个正整数是否为素数。3.5.5改变循环执行的状态

3.5.5改变循环执行的状态2.continue语句使用continue语句的一般形式为:continue;注意:continue作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

【例3.17】分析下面程序段的运行结果:3.5.5改变循环执行的状态#include<stdio.h>voidmain(){intcount=0,i;charch;for(i=0;i<30;i++){ch=getchar();if(ch<'0'||ch>'9')continue;count++;}printf("count=%d\n",count);}循环执行30次,每次循环都从键盘输入一个字符,当该字符不是数字字符时,ch<'0'||ch>'9'表达式成立,执行continue语句,这时程序流程直接转移到执行表达式3“i++”进入下一次循环,而当输入的字符是数字字符时,ch<'0'||ch>'9'表达式不成立,执行if语句其后的语句count++,数字字符个数增1,程序流程再转移到执行表达式3“i++”进入下一次循环,直到i等于30,表达式2“i<30”不成立,循环结束,输出count的值。所以本程序的功能是从键盘输入30个字符,统计其中数字字符的个数并输出。3.5.5改变循环执行的状态continue语句和break语句都可以中断某层循环的正常执行次序,两者的区别在于:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立,而直接跳出本层循环结构。3.5.6循环的嵌套在一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。其一般形式如下:循环结构语句1/*外循环*/{

循环结构语句2/*内循环*/}循环嵌套举例输出5行,每行都输出1,2,3,4,5五个数字。#include<stdio.h>voidmain(){inti,j;//i,j用作循环变量

for(i=1;i<=5;i++)//外循环开始

{ for(j=1;j<=5;j++)//内循环开始

{printf("%d",j);//输出数字

}//内循环结束

printf("\n");//每输出完5个数后换一行

}//外循环结束}3.5.7程序应用举例【例3.19】输出所有的“水仙花数”。分析:所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如153是个水仙花数,因为153=13+53+33。根据水仙花数的含义,可以采用数学中的穷举法来处理。这里对所有的3位数进行判断,是否满足“其各位数字的立方和等于该数”这个条件。因此,循环变量(

温馨提示

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

评论

0/150

提交评论