第3章 程序控制结构_第1页
第3章 程序控制结构_第2页
第3章 程序控制结构_第3页
第3章 程序控制结构_第4页
第3章 程序控制结构_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

3.1程序的基本结构3.2语句3.3顺序结构3.4选择结构3.5循环结构3.6转向语句3.7结构化程序设计的方法3.8案例应用第3章程序控制结构1一个良好的程序由以下三种基本结构组成:(1)顺序结构——按语句的先后顺序逐条执行

。(2)选择结构

——按照条件逻辑是否成立有选择的执行不同的语句。(3)循环结构——根据某项条件重复地执行某项任务若干次直到满足或不满足某条件为止。循环结构有两种形式分别为:

当型循环直到型循环3.1程序的基本结构23.1程序的基本结构顺序结构选择结构循环结构33.2语句C程序源程序文件1源程序文件2源程序文件n预处理命令函数n函数1数据声明函数首部函数体数据声明执行语句C程序的结构:43.2语句一个c程序可以有若干个源程序文件组成一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成一个函数有函数首部和函数体组成函数体由数据声明和执行语句组成C语句分为6类声明语句表达式语句复合语句控制语句空语句函数调用语句53.2.1声明语句声明语句主要用来说明合法标识符,以便能在程序中合法使用它们。

“先声明,后使用”的原则。语法格式:数据类型符用户标识符;{charc;/*声明字符变量,遵循先声明后使用原则*/scanf(“%c”,&c);/*输入字符,对字符变量c赋值*}63.2.2表达式语句

由一个表达式加一个分号构成。x=5;分号赋值表达式表达式语句+=注意:x=5和x=5;是不同的。前者是一个赋值表达式,后者一个赋值表达式语句。73.2.3复合语句复合语句:用一对{}括起来的语句,又称分程序或语句块。{ z=x+y; t=z/100; printf(“%f”,t); }注意:复合语句中最后一个语句的分号不能忽略不写。在语法上将复合语句看成是单条语句。83.2.4控制语句控制语句:控制语句是用于控制程序流程的语句,一般指那些可改变顺序结构的语句。

C语言的流程控制语句可分为三类:

条件判断语句:if、switch循环执行语句:while、do-while、for流程转向语句:break、continue、return93.2.5空语句空语句:仅由一个分号“;”组成的语句。

;(什么也不做)空语句的作用如下:(1)在循环语句中提供一个不执行任何操作的空循环体。(2)为有关语句提供标号,用以说明程序执行的位置。即,用来做流程的转向点。103.2.6函数调用语句函数调用语句:由一个函数调用加一个分号构成。例:Printf(“ThisisaCprogram.”);

11在顺序结构中,从第一条语句到最后一条语句完全按先后次序顺序执行。3.3顺序结构【例3.2】从键盘输入圆半径,输出圆面积(圆周率取3.14,计算结果保留小数点后两位)。分析:(1)声明两个实型变量r和s。变量r用于存放从键盘输入的圆半径,变量s用于保存圆面积。(2)从键盘输入圆半径数值,赋给变量r。(3)利用圆面积公式s=3.14*r*r求圆面积。(4)输出s的值。123.3顺序结构流程图如下所示:#include<stdio.h>voidmain(){

doubler,s;//声明实型变量r,sprintf("Pleaseinputr\n");scanf("%lf",&r);//通过键盘输入r值s=3.14*r*r;

//通过圆面积公式计算圆面积,并将计算结果赋给变量sprintf("s=%.2lf\n",s);//输出s的值}133.3顺序结构【例3.3】输入整型变量a和b的值,交换它们的值并输出。分析:(1)声明两个整型变量a、b用于存放输入的两个数。(2)从键盘上输入两个整数,保存到变量a、b中。(3)利用一个临时存储单元temp,达到交换变量a、b的值目的。(4)输出交换后变量a、b的值。a2b8temp28214#include<stdio.h>voidmain(){inta,b,temp;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);temp=a;a=b;b=temp;printf(“a=%d,b=%d\n”,a,b);

}实现a,b值的交换3.4选择结构选择结构:

在现实生活中,需要进行判断和选择的情况很多。如果你在家,我去拜访你如果考试不及格,要补考如果遇到红灯,要停车等待周末我们去郊游70岁以上的老年人,入公园免票选择结构用if语句和switch语句来实现。163.4选择结构3.4.1if语句3.4.2switch语句3.4.3程序应用举例173.4.1if语句1.if(表达式)语句if(x>y)printf(”%d”,x);语句0(假)表达式非0(真)单分支结构183.4.1if语句双分支结构2.if(表达式)语句1else语句2if(x>y)printf(”%d”,x);elseprintf(”%d”,y);语句2非0(真)表达式0(假)语句1193.4.1if语句☆使用说明1)if(表达式)语句2)if(表达式)语句1else语句2关系表达式逻辑表达式if(a==b&&x==y)printf(”a=b,x=y”);203.4.1if语句☆使用说明1)if(表达式)语句2)if(表达式)语句1else语句2数值表达式if(0)printf(”OK.”);213.4.1if语句☆使用说明1)if(表达式)语句2)if(表达式)语句1else语句2关系表达式逻辑表达式if(x>0)printf(”%f”,x);elseprintf(”%f”,-x);数值表达式配对不能丢223.4.1if语句☆使用说明1)if(表达式)语句2)if(表达式)语句1else语句2可以是:简单的语句复合语句另一个if语句等圆括号不能省略

233.4.1if语句多分支结构3.if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式n)语句nelse语句n+1243.4.1if语句【例3.4】用单分支选择语句形式,实现从键盘输入两个整数,按从小到大次序输出这两个数。分析:(1)定义2个整型变量a、b用于存放输入的两个数。(2)从键盘上输入2个整型变量a、b的值。(3)比较a和b大小。如果a>b,则交换a、b中数值。(4)输出变量a、b的值。25#include<stdio.h>voidmain(){

inta,b,temp;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);if(a>b){temp=a;a=b;b=temp;}printf("%d,%d\n",a,b);}实现a,b值的交换“{”和“}”必须成对出现,构成复合语句。如果复合语句中只有一条语句,则可省略;否则,不能省略。if(a>b)条件判断Inputa=9↙Inputb=

3↙3,93.4.1if语句【例3.5】利用if-else双分支结构语句形式,实现输入整型变量a和b的值,输出它们中较大的值。分析:(1)声明所需的整型变量a、b。(2)从键盘上输入两个整型变量a、b的值。(3)用关系表达式判断a>b是否为真,如果为真,则执行(4);否则,执行(5)。(4)输出a的值。(5)输出b的值。27#include<stdio.h>voidmain(){

inta,b;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);if(a>b)printf("较大数是%d\n",a);elseprintf("较大数是%d\n",b);}双分支结构不能省略Inputa=4↙Inputb=13↙较大数是133.4.1if语句【例3.6】学校按总评分数(设定为0到100分范围)把学生学期成绩分成五等,90分及以上为A,80到89分为B,70到79分为C,60到69分为D,分数低于60分为E。编程实现从键盘输入一个学生总评分数,输出其对应等级。(用elseif多分支结构实现)分析:(1)声明一个整型变量m,用于存放学生总评分数。(2)从键盘输入一个学生总评分数赋予m。(3)用elseif语句依次判断m是否属于等级A、B、C、D中的一种,如果是,输出对应等级,退出选择控制结构;否则,执行(3)。(4)如果m都不在等级A、B、C、D对应分数范围内,则输出为E等,退出选择控制结构。293.4.1if语句#include<stdio.h>voidmain(){intm;printf("Pleaseinputmark:");scanf("%d",&m);

if(m>=90)printf("A\n");

else

if(m>=80)printf("B\n");

else

if(m>=70)printf("C\n");

else

if(m>=60)printf("D\n");

elseprintf("E\n");}Pleaseinputmark:83↙B

if(m>=90)printf("A\n");

else

if(m>=80)printf("B\n");

else

if(m>=70)printf("C\n");

else

if(m>=60)printf("D\n");

elseprintf("E\n");应将处于同一层的if和其对应的else缩进对齐以增强程序可读性。303.4.1if语句4.if语句的嵌套有的选择结构中又包含一个或多个选择结构,这称为选择结构的嵌套。if语句中可以又包括另一个if语句,这就是if语句的嵌套。可以用if语句的嵌套实现嵌套的选择结构。313.4.1if语句4.if语句的嵌套一般形式:if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4内嵌if323.4.1if语句【例3.7】从键盘输入三个整数,输出最大的那个数。分析:(1)声明所需的整型变量a、b、c,以及变量max。max用于保存最大的数。(2)从键盘上输入3个整数,分别保存在整型变量a、b和c中。(3)找出a、b、c中最大的数,赋给max。(4)输出max的值。333.4.1if语句34voidmain(){inta,b,c,max;printf("Pleaseinput3integernumber:");scanf("%d%d%d",&a,&b,&c);if(b>a){ if(c>b)max=c;elsemax=b;}else{if(c>a)max=c; elsemax=a;}printf("max=%d\n",max);}此处的{}可以省略应将处于同一层的if和其对应的else缩进对齐以增强程序可读性。3.4.1if语句例:if()

if()语句1else

if()语句2else语句3例:if()

{if()语句1}else

if()语句2else语句3当if和else数目不同时,可以加花括号来确定配对关系。else总是与它上面最近的未配对的if配对363.4.1if语句373.4.1if语句#include<stdio.h>voidmain(){

inta,b,c,max;printf("Pleaseinput3integernumber:");scanf("%d%d%d",&a,&b,&c);

max=a>b?a:b;max=max>c?max:c;printf("max=%d\n",max);}

max=(a>b?a:b)>c?(a>b?a:b):c;

383.4.1if语句【例3.8】任意输入一个年号(如2011),判断是否是闰年。(闰年满足的条件是能被4整除但不能被100整除或者能被400整除)分析:(1)声明一个整型变量year,用于存放年号。(2)从键盘输入一个年号,赋给变量year。(3)判断year是否满足闰年的条件,如果满足输出“是闰年”,否则输出“不是闰年”。393.4.1if语句方法一:40#include<stdio.h>voidmain(){

intyear;printf("Pleaseinputyear=:");scanf("%d",&year);

if(year%400==0)printf("是闰年\n");else{if(year%4==0&&year%100!=0)printf("是闰年\n"); elseprintf("不是闰年\n");}}if(year%400==0||(year%4==0&&year%100!=0))printf("是闰年\n");elseprintf("不是闰年\n");闰年满足的条件:(1)能被4整除但不能被100整除;(year%4==0&&year%100!=0))(2)能被400整除。year%400==0

3.4.1if语句方法二:用变量leap代表是否闰年的信息若闰年,令leap=1;非闰年,leap=0最后判断leap是否为1(真),若是,则输出“闰年”信息42#include<stdio.h>voidmain() {intyear,leap;printf("enteryear:");scanf("%d",&year);if(year%4==0)if(year%100==0) if(year%400==0)leap=1;elseleap=0; elseleap=1;elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}标志变量与if(leap!=0)含义相同那if(leap==0)相当于什么呢?if(leap==0)等价于if(!leap)if(leap!=0)等价于if(leap)#include<stdio.h>voidmain() {intyear,leap;printf("enteryear:");scanf("%d",&year);if(year%4==0)if(year%100==0) if(year%400==0)leap=1;elseleap=0; elseleap=1;elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}if(year%4!=0)leap=0;elseif(year%100!=0)leap=1;elseif(year%400!=0)leap=0;elseleap=1;if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;3.4.2switch语句switch语句用来实现多分支选择结构学生成绩分类85分以上为’A’等70~84分为’B’等60~69分为’C’等……人口统计分类

按年龄分为老、中、青、少、儿童453.4.2switch语句switch语句的一般形式:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2

┇case常量表达式n:语句ndefault:语句n+1}不能相同463.4.2switch语句switch(grade){case’A’:printf(”85~100\n”);case’B’:printf(”70~84\n”);case’C’:printf(”60~69\n”);case’D’:printf(”<60\n”);default:printf(”error\n”);}若grade的值为“A”85~10070~8460~69<60errorbreak;break;break;break;85~100473.4.2switch语句grade输出85~100‘A’‘B’输出70~84输出60~69‘C’输出<60输出error‘D’其他483.4.2switch语句说明:(1)switch是关键字,其后的表达式必须用“()”括起来。(2)表达式的数据类型可以是整数类型、字符类型或枚举类型。(3)“()”中表达式结果类型必须与switch语句体中case后常量表达式数据类型一致。(4)case是关键字,其后每个常量表达式的值必须不相同,否则会出现二义性。(5)各个case和default的出现次序不影响执行结果。例如,可以先出现“default:…”。493.4.2switch语句(6)当表达式的值与某一个case后面的常量表达式值相等时,就执行此case后面的语句;否则,就执行default后面的语句。(7)关键字default并不是必须的,如果没有default,当所有case后面的常量表达式值都没有与switch后圆括号表达式值相等时,则什么也不执行,直接退出swtich语句。(8)多个可以共用一组执行语句。(9)关键字break一般不能省略。它的作用是使程序执行某一个case分支后,使流程跳出switch结构,终止switch语句的执行;若break省略,程序向下一行继续执行,不跳出switch语句体。503.4.2switch语句switch语句的一般使用形式:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2

┇case常量表达式n:语句ndefault:语句n+1}break;break;break;513.4.2switch语句switch语句的一般使用形式:如果没有break,流程图又是什么样呢?523.4.2switch语句【例3.9】学校按总评分数(设定为0到100分范围)把学生学期成绩分成五等,90分及以上为A,80到89分为B,70到79分为C,60到69分为D,分数低于60分为E。编程实现从键盘输入一个学生总评分数,输出其对应等级。编程实现从键盘输入一个学生总评分数,输出其对应等级(用switch语句实现)。53voidmain(){intm;printf("Pleaseinputmark:");scanf("%d",&m);switch(m/10){case10:printf("A\n");break;case9:printf("A\n");break;case8:printf("B\n");break;case7:printf("C\n");break;case6:printf("D\n");break;default:printf("E\n");}}case10:case9:printf("A\n");break;Pleaseinputmark:100↙A3.4.2switch语句【例3.10】键盘输入年号和月份,输出该月的天数。

分析:(1)根据公历,每年的1、3、5、7、8、10和12月份每月都有31天;4、6、9和11月份每月都有30天。2月平年有28天,闰年有29天。可以看出这是一个多分支选择问题,可以利用switch语句来解决。(2)可以设置变量year,month,days来分别表示年、月、当月天数。还可以设置一个标记flag,判断当年是否为闰年。(3)先判断年号是否为闰年,可参见例题3.8。再利用swtich语句,进入多分支选择。55voidmain(){intyear,month,days,flag;printf("Pleaseinputyear:");scanf("%d",&year);printf("Pleaseinputmonth:");scanf("%d",&month);if(year%400==0)flag=1;//flag为1表示是闰年else{if(year%4==0&&year%100!=0) flag=1; else flag=0;//flag为0表示非闰年}

判断是否为闰年。switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2: {if(flag==1)days=29; elsedays=28;}break;default:printf("monthinputerror\n");}printf("%d年%d月份有%d\n",year,month,days);}

根据具体月份,给当月天数赋值根据闰年还是平年,来判断2月份的天数3.4.3程序应用举例【例3.11】某城市为鼓励节约用水,对居民用水量作如下规定:若一户居民每月用水量不超过30吨(含30吨),则按每吨0.6元收费;若大于30吨但不超过50吨(含50吨),则其中30吨按0.6元收费,剩余部分按每吨0.9元收费;若超过50吨,则不超过50吨的部分按前面方法收费,剩余部分按每吨1.5元收费。程序实现输入一户居民的月用水量,输出应缴纳的水费。分析:(1)声明d,用于存放用水量;声明m,用于计算水费。(2)根据不同的用水量,确定出不同的水费计算公式。(3)计算出相对应的水费。583.4.3程序应用举例59#include<stdio.h>voidmain(){

doubled,m;scanf("%lf",&d);

if(d<=30) m=d*0.6;

else

if(d<=50) m=30*0.6+(d-30)*0.9;

else

m=30*0.6+20*0.9+(d-50)*1.5;printf("水费为%.2lf元",m);}

有没有必要写成这样呢?

else

if(d>30&&d<=50)没有!3.4.3程序应用举例【例3.12】某销售公司员工月收入为底薪加当月销售业绩(设为整数元)提成。底薪900元,具体提成如下表:销售业绩(元)提成比例<500005000~999910%10000~1999913%20000~3999915%>=4000018%除以5000的商012,34,5,6,7>=8613.4.3程序应用举例62voidmain(){

intprofit,p;doublesalary;salary=900;printf("请输入当月销售业绩:");scanf("%d",&profit);p=profit/5000;switch(p){case0:break; case1:salary+=profit*0.1;break; case2: case3:salary+=profit*0.13;break; case4:case5:case6: case7:salary+=profit*0.15;break;

default:salary+=profit*0.18;}printf("本月收入为%.2lf元\n",salary);}3.5循环结构什么是循环?为什么要使用循环?问题:如果以前所学的知识,怎么解呢?步骤1:先求1加2,得到结果3步骤2:将步骤1得到的和3再加3,得到结果6步骤3:将6再加4,得10步骤4:将10再加5,得15

…步骤99:将步骤98得到的和4950再加100,得到结果5050

那有没有更简便的方法呢?643.5循环结构步骤1:使y=1;步骤2:使i=2;步骤3:使y+i,和仍放在变量y中,可表示为:y=y+i;步骤4:使i的值加1,即i=i+1。步骤5:如果i不大于(小于等于)100,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。算法改进如下:如果要计算1000653.5循环结构循环的概念现实生活中许多问题是需要重复处理计算一个班50学生每人的平均成绩工厂各车间的生产日报表全国各省市的人口统计分析各大学招生情况统计全校教职工工资报表绝大多数的应用程序都包含重复处理663.5循环结构循环结构又称为重复结构循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元要构成一个有效的循环,应指定两个条件:(1)需要重复执行的操作,这称为循环体(2)循环结束的条件,即在什么情况下停止重复的操作实现循环结构的语句:while、do…while、for语句

673.5循环结构3.5.1while语句3.5.2do_while语句3.5.3for语句3.5.4几种循环的比较3.5.5循环的嵌套3.5.6程序举例683.5.1while语句一、一般形式:

while(表达式)

语句

二、执行过程:

先计算表达式的值,如果为真,执行循环体,然后继续计算表达式的值,如果为真,再执行循环体,如此重复。当表达式的值为假时,退出该循环语句。循环体循环条件不能省略关键字693.5.1while语句三、流程图:四、特点:

先判断,后执行。

请看一个例子Y表达式语句N70【例3.11】求1+2+…+100的,即。Nsum=0;i=1;Yi<=100sum=sum+i;i++;#include<stdio.h>voidmain(){inti,sum;i=1,sum=0;

while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);}运行结果:sum=5050循环条件循环体不能省略3.5.1while语句五、注意事项:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。(2)循环体可能一次也不执行。(3)在循环体中应有使循环趋向于结束的语句。

在上例中,循环结束的条件是i>100,使循环趋于结束的语句是i++;

723.5.1while语句【例3.14】输入两个正整数a、b,求它们的最大公约数。方法一:最大公约数定义法。分析:根据最大公约数的定义,a、b两个数的最大公约数s一定是介于1到a之间的一个数,不会大于a;且能同时被a和b整除。(1)先假设a、b的最大公约数为a,即s=a。(2)如果a或b中有一个数不能被s整除,即a%s!=0或b%s!=0,说明s不是公约数,执行(3);否则,执行(4)。(3)判断比s小1的数是否是a和b的公约数。即执行s=s-1后再返回(2)。(4)退出while循环,输出s。73#include<stdio.h>voidmain(){

inta,b,s;printf("Pleaseinputtwopositivenumber:");scanf("%d%d",&a,&b);s=a;while(a%s!=0||b%s!=0){s=s-1;}printf("最大公约数是%d\n",s);

}此处可以省略循环条件循环体Pleaseinputtwopositivenumber:1227↙最大公约数是33.5.1while语句方法二:辗转相除法。分析:当b不等于0时,重复执行运算c=a%b,a=b,b=c消除相同的因子,直到b为0时,a即为所求的解。例如:a=18,b=27(1)首先b不为0,执行c=a%b;a=b;b=c;之后,a=27,b=18,c=9。(2)b=9不为0,执行c=a%b;a=b;b=c;之后,a=18,b=9,c=9。(3)b=9不为0,继续执行c=a%b;a=b;b=c;之后,a=9,b=0,c=0。(4)b=0,结束。此时,a=9即为18和27的最大公约数。76#include<stdio.h>voidmain(){inta,b,c;printf("Pleaseinputtwopositivenumber:");scanf("%d%d",&a,&b);while(b!=0){ c=a%b; a=b; b=c;}printf("最大公约数是%d\n",a);}此处不能省略循环条件循环体Pleaseinputtwopositivenumber:1624↙最大公约数是83.5.2do-while语句do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式为:

do{

循环体语句

}while(表达式);循环体,“{”和“}”一般不能省略,只有循环体语句只有一个语句时可省略,建议都不省略。循环条件不能省略不能省略783.5.2do-while语句执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。do-while与while语句的区别:do-while循环语句先执行循环体一次,再判断循环条件。因而do-while语句的循环体至少执行一次;而while循环语句不一定会执行循环体。表达式非0(真)0(假)循环体语句793.5.2do-while语句【例3.15】求1+2+…+100的和(用do-while语句实现)。i≤100非0(真)0(假)sum=sum+ii=i+1sum=0i=180#include<stdio.h>voidmain(){

inti,sum;i=1;sum=0;do{ sum=sum+i; i++;}while(i<=100);printf("sum=%d\n",sum);}运行结果:sum=50503.5.2do-while语句while和do-while循环的比较:凡是能用while循环处理,都能用do…while循环处理。do…while循环结构可以转换成while循环结构。do-while语句可以看成是由一个复合语句加上一个while结构构成的。

在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。82【例3.16】分别用while和do-while实现求n+(n+1)+…10的和。键盘输入不同的n,观察输出结果。/*while语句实现*/#include<stdio.h>voidmain(){intn,sum=0;printf("n=");scanf("%d",&n);while(n<=10){ sum=sum+n; n++;}printf("sum=%d\n",sum);}/*do-while语句实现*/#include<stdio.h>voidmain(){ intn,sum=0; printf("n="); scanf("%d",&n); do { sum=sum+n; n++; }while(n<=10); printf("sum=%d\n",sum);}/*while语句实现*/运行结果:1↙sum=55再运行一次:11↙sum=0/*do-while语句实现*/运行结果:1↙sum=55再运行一次:11↙sum=11说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,结果不相同。3.5.3for语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式:

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

{循环体}设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值。循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环。对循环变量进行修改,使循环趋于结束,它是在执行完循环体后才进行的。843.5.3for语句for语句的执行过程:(1)先求解表达式1。(2)计算表达式2。若表达式2的值为真(非0),则执行(3);若表达式2的值为假(值为0),则执行(5)。(3)执行循环体语句。(4)执行表达式3,然后返回(2)。(5)for循环结束,执行循环结构后面的语句。853.5.3for语句for语句最简单的形式:for(循环变量赋初值;循环条件;循环变量增值)

for(i=1;i<=100;i++)sum=sum+i;等价于i=1;while(i<=100){sum=sum+i;i++; }用for语句更简单、方便863.5.4几种循环的比较循环结构语句都由循环变量赋初值、循环条件、循环体、循环变量改变语句这四个要素组成。

(1)for语句的一般形式中的“表达式1”可以省略,但此时一般应在for语句之前给循环变量赋初值。注意,省略表达式1时,其后的分号不能省略。例如:i=1;

for(;i<=100;i++)sum=sum+i;

执行时,跳过“求解表达式1”这一步,其他不变。873.5.4几种循环的比较

(2)for语句的一般形式中“表达式3”也可以省略,但此时要设法保证循环能正常结束。例如:

i=1;for(;i<=100;){sum=sum+i;i++;}执行时,跳过“求解表达式1”和“求解表达式3”这一步,其它不变。跳过“求解表达式3”,不是说每次循环中改变循环变量的值这一步可以省略;而是在这里的for循环体中,已经用“i++;”语句改变了循环变量的值。相当于i=1;while(i<=100){sum=sum+i;i++; }883.5.4几种循环的比较(3)在用while和do-while循环之前,一般要先对循环变量先赋初值。也就是说,循环变量的初始化操作一般是在while和do-while语句之前完成;而for循环的循环变量初始化一般是用表达式1实现。(4)while和for属于“当型”循环,即先判断循环条件,后执行循环体;do-while属于“直到型”循环,即先执行循环体一次,再判断循环条件。893.5.5循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套内嵌的循环中还可以嵌套循环,这就是多层循环3种循环(while循环、do…while循环和for循环)可以互相嵌套内循环必须完整地嵌套在外循环内,两者不允许交叉。一般情况下,嵌套循环变量不允许同名,即各层循环的循环变量名称不能相同。903.5.5循环的嵌套下面几种都是合法的形式:(1)

while()(2)do(3)for(;;){…{…{…

while()dofor(;;){…}{…{…}…}while();…}}while();}(4)

while()(5)for(;;)(6)do{…{…{…

dowhile()for(;;){…{…}{…}}while();……}}}while();913.5.5循环的嵌套【例3.18】输出5行,每行都输出1,2,3,4,5五个数字。分析:可以用一个循环语句,实现输出5个数字。然后再把这个工作重复5次,即在这个循环外面加一个循环即可。用循环语句,实现输出5个数字:for(j=1;j<=5;j++) {printf("%d",j); }然后让这段代码重复执行5次就可以了。92#include<stdio.h>voidmain(){

inti,j;

for(i=1;i<=5;i++)

{

for(j=1;j<=5;j++)

{printf("%d",j);

}printf("\n");

}

}

外循环内循环每输出完5个数后换一行循环体语句重复执行5次也可用while语句现,但用for语句更简洁。3.5.6程序举例【例3.19】打印输出九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81123456789

123456789最多9列9行943.5.6程序举例分析:(1)打印九九乘法表的格式:要求打印九行,可用for循环结构语句实现,循环变量设为i。主要程序段如下:inti;for(i=1;i<=9;i++){/*打印第i行*//*打印换行*/}printf("\n");

重点是这个如何实现?953.5.6程序举例(2)打印第i行:每行打印的个数不同,第i行打印i个,用for循环结构语句实现每行打印的个数,设循环变量为j。主要程序段如下:intj;for(j=1;j<=i;j++){/*打印第i行的第j个乘法运算表达式*/}第i行有i列

printf("%d*%d=%d",j,i,j*i);

963.5.6程序举例(3)将打印第i行嵌入到打印九行中,结果如下:inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++) {/*打印第i行的第j个乘法运算表达式*/ } /*打印换行*/}97#include<stdio.h>voidmain(){

inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d",j,i,j*i);} printf("\n");}}循环打印九行循环打印i列3.5.6程序举例【例3.20】为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。程序实现将输入的一个小写字母单词转换成密文输出。例如,将字母b变成字母f,即变成其后的第4个字母,u变成y,z变成d,如,“hello”经过加密就变成“lipps”。abcdefg……wxyz993.5.6程序举例分析:(1)判断输入的字符是否为小写字母(2)从字母a到v,只需将字母加上4就行例如,’a’+4就是’e’(3)从字母w到z,将字母加4,再减去26’w’+4-26就是’a’100#include<stdio.h>voidmain(){

charc;while((c=getchar())!='\n'){if(c>='a'&&c<='z') {c=c+4; if(c>'z')c=c-26; }printf("%c",c);}printf("\n");}不断输入字符,直到输入一个“换行”为止加密处理if(c>='a'&&c<=‘v')c=c+4;elsec=c+4-26;3.5.6程序举例分析:设变量n用来存入人数,它的可能取值应该是1—99,所以令初值为1。什么样的n才符合条件呢?

条件:n%3==2&&n%5==3&&n%7==5

【古典问题之:韩信点兵】

有一队不足百人的队伍,三三数之余2,五五数之余3,七七数之余5,问人有几何?♀

♀♀♀♀

♀♀♀♀

♀♀

♀♀♀♀♀♀

♀♀♀♀♀♀

♀♀♀102Yn=1;n<100NY输出nN符合条件?n=n+1;流程图如下所示:#include<stdio.h>voidmain(){intn;n=1;

while(n<100){

if(n%3==2&&n%5==3&&n%7==5)

printf("N=%d\n",n);n=n+1;}}

运行结果:N=68循环体循环条件队伍人数条件3.5.6程序举例分析:定义一个变量n——100…999,令初值为100;什么样的n才符合条件呢?

条件:百位:a=n/100;十位:b=n/10%10;个位:c=n%10;【古典问题之:水仙花数问题】

输出所有的水仙花数,所谓“水仙花数”,是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为153=。a*a*a+b*b*b+c*c*c==n

104流程图如下所示:Yn=100;a=n/100;b=n/10%10;c=n%10;a*a*a+b*b*b+c*c*c==n输出nn=n+1;n<1000YNN#include<stdio.h>voidmain(){intn,a,b,c;for(n=100;n<1000;n++){a=n/100;b=n/10%10;c=n%10;

if(a*a*a+b*b*b+c*c*c==n)printf("%5d",n);}}运行结果:

153370371407

循环体循环条件水仙花数条件3.5.6程序举例分析:设公鸡、母鸡和小鸡分别购买x、y、z只。则有方程:x+y+z=100和5x+3y+z/3=100,其中发现有3个未知数两个方程,按照通常解法是无法求解的。但是知道,x、y、z都是不大于100的正整数,因此它们的组合是有限的。不妨用计算机来穷举出所有的组合,输出满足条件要求的组合就可以得到结果了。【古典问题之:百钱百鸡问题】

公元前5世纪,我国数学家张丘建在《算经》一书中提出了一个“百钱买百鸡问题”,问题如下:公鸡5钱一只,母鸡3钱

温馨提示

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

评论

0/150

提交评论