版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5
章程序的基本控制结构v程序设计基础——从问题到程序(第3版)本章基本内容选择结构
循环结构
其他控制语句顺序结构
任何程序都可以由顺序、选择和循环这三种基本控制结构组成,因此,灵活掌握基本控制结构是编写程序的重要基础!【引例5.1】四则运算【问题】计算两个整数的和、差、积、商。。【想法】依照四则运算的规则,将两个整数进行加、减、乘、除运算。【算法】设变量x和y表示两个整数,依次计算并输出x和y的和、差、积、商,算法如下:
1.计算并输出x+y;2.计算并输出x-y;3.计算并输出x*y;4.计算并输出x/y;伪代码【程序】算法需要顺序执行每一条指令,可以采用顺序结构实现。程序如下:#include<stdio.h>intmain(){intx,y;
printf("请输入两个整数:");
scanf("%d%d",&x,&y);
printf("%d与%d的和是%d\t",x,y,x+y);
printf("%d与%d的差是%d\n",x,y,x-y);
printf("%d与%d的积是%d\t",x,y,x*y);
printf("%d与%d的商是%5.2f\n",x,y,(double)x/y);
return0;}程序中涉及到新的语法?【引例5.1】四则运算
复合语句:由一对花括号括起来的若干条语句组成。从逻辑上讲,复合语句是一个整体,可以将它看成是一条语句,可以放在能够使用语句的任何地方。
【语法】复合语句的一般形式:
{
语句1
语句2
语句n}……没有分号可以是任何语句【语义】依次执行花括号中的每条语句。语句1语句2语句n5.1
顺序结构复合语句实现顺序结构例5.1设计复合语句实现交换两个变量的值。{temp=x;x=y;y=temp;}temp1020xy1020xy2020xytemp10temp10(a)第一步temp=x
(b)第二步x=y(c)第三步y=temp5.1
顺序结构复合语句实现顺序结构102010【问题】给定一个两位数,将这个两位数的个位和十位颠倒得到其逆值(也称逆向值),例如85的逆值是58。【想法】设两位数的个位数字是x,十位数字为y,则该数的逆值为x×10
+
y。需要分离出这个两位数的个位和十位,分离的方法是整除和求余,例如,通过对85除10取整数部分得到十位数字8,通过对85除10取余数部分得到个位数字5。【算法】设变量num表示一个两位数,变量x表示整数num的个位数字,变量y表示整数num的十位数字,变量numDevo表示整数num的逆值,算法如下:
step1:x=num%10;step2:y=num/10;step3:numDevo=x*10+y;step4:输出numDevo;伪代码程序设计实例——整数的逆值【程序】算法需要顺序执行每一条指令,可以采用顺序结构实现。程序如下:#include<stdio.h>
intmain(){intnum,x,y,numDevo;printf("请输入一个两位数:");scanf("%d",&num);
x=num%10;y=num/10;numDevo=x*10+y;printf("%2d的逆值为:%2d\n",num,numDevo);return0;}程序设计实例——整数的逆值【引例5.2】奇偶判定【问题】判断给定整数的奇偶性。【想法】将整数除以2,若余数等于0,则该整数是偶数,否则是奇数。【算法】设变量x表示一个整数,用求余运算判断其奇偶性。算法如下:
1.为变量x赋值;2.如果x%2的结果等于0,则x是偶数;否则x是奇数;伪代码【程序】首先用变量x接收用户从键盘输入的整数,然后根据求余运算的结果得出其奇偶性。程序如下:#include<stdio.h>intmain(){
intx;
printf("请输入一个整数:");
scanf("%d",&x);
if(x%2==0)printf("%d是偶数\n",x);
elseprintf("%d是奇数\n",x);
return0;}【引例5.2】奇偶判定程序中涉及到新的语法?逻辑值控制的选择结构1.单分支的选择结构,一般由if语句实现。【语法】if语句的一般形式如下:
if(表达式)语句判断条件必须有括号【语义】计算表达式的值;当表达式的值为真时执行语句;否则顺序执行if语句的下一条语句。表达式语句TF5.2选择结构2.双分支的选择结构,一般由if-else语句实现。【语义】计算表达式的值;当表达式的值为真时执行语句1;否则执行语句2。if(表达式)语句1else
语句2判断条件表达式成立执行表达式不成立执行必须有括号表达式语句1TF语句25.2选择结构逻辑值控制的选择结构【语法】if-else语句的一般形式如下:例5.4求两个整数中的较大者。解1:设整数x和y的较大值为max,可以先假定x较大,再判断max是否小于y,如果max小于y,则较大值为y,否则较大值仍为max。解1:
max=x;if(max<y)max=y;解2:
if(x>=y)
max=x;
else
max=y;5.2选择结构逻辑值控制的选择结构解2:设整数x和y的较大值为max,可以直接将x和y进行比较,若x≥y,则较大值为x,否则,较大值为y。条件表达式有括号!从语法上看,分支结构中的语句可以是任何语句,如果又是一个分支语句,则构成分支结构的嵌套。3.分支结构的嵌套if(x>y)if(y>z)x=0;elsex=1;if(x>y)if(y>z)x=0;elsex=1;5.2选择结构逻辑值控制的选择结构如果嵌套在if语句中的语句是if-else语句,或嵌套在if-else语句中的语句是if语句,则会出现多个if和多个else重叠并且个数不等的情况,这时要注意if和else的配对问题。else与其前面最近的尚未配对的if相配对。例5.5编写程序实现数学中的符号函数:sign(x)=1,当x>00,当x=0-1,当x<0解:设变量sign表示sign(x)的值,用嵌套的if-else语句实现比较。语句如下:if(x>0)sign=1;elseif(x<0)sign=-1;else/*注意嵌套if-else语句的缩进格式*/sign=0;5.2选择结构逻辑值控制的选择结构
多分支的选择结构,由switch语句实现,switch语句也称为开关语句或选择语句。【语法】switch语句的一般形式如下:
switch(表达式)
{
case常量表达式1:语句1[break;]
case常量表达式2:语句2[break;]
case常量表达式n:语句n[break;]
[default:语句n+1break;]
}算术表达式……相当于语句标号没有分号5.2选择结构算术值控制的选择结构【语义】当表达式的值与某一个常量表达式的值相等时,顺序执行该case后面的语句。
值=语句n值1语句1计算表达式的值值2语句2值n……breakbreakbreak……语句n+1defaultbreak5.2选择结构算术值控制的选择结构例5.6将百分制成绩转换为对应的等级制成绩,转换规则为:100~90:A;89~80:B;79~70:C;69~60:D;59~0:E
解:设百分制成绩为score,则score是[0,100]区间的一个实数,注意到十位数字决定转换等级,因此将score转换为整数再整除10。设字符型变量grade表示等级制成绩,语句如下:switch((int)score/10)/*switch语句表达式的运算结果通常为整型*/{case10:
/*case10和case9共用一个程序段*/case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;case6:grade='D';break;default:grade='E';break;}5.2选择结构算术值控制的选择结构
step1:x1=x%10;y=x/10;step2:x2=y%10;step3:x3=y/10;step4:如果x1*x1*x1+x2*x2*x2+x3*x3*x3等于x,则该数是水仙花数;否则该数不是水仙花数;伪代码【问题】所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,则153是一个水仙花数。要求从键盘上输入一个三位数,判断该数是否是一个水仙花数。程序设计实例1——水仙花数【算法】设变量x存储一个三位数,变量x1、x2和x3分别存储x的个位、十位和百位数字,算法如下:【想法】首先将这个三位数的个位、十位和百位分离出来,然后判断各位数字的立方和是否等于该数。【程序】首先用变量x接收从键盘输入的三位正整数,分离出个位、十位和百位数字,再用if语句实现判断,程序如下:#include<stdio.h>intmain(){
intx,x1,x2,x3,y;
printf("请输入一个三位整数:");scanf("%d",&x);x1=x%10;y=x/10;x2=y%10;x3=y/10;if(x1*x1*x1+x2*x2*x2+x3*x3*x3==x)printf("%d是水仙花数\n",x);elseprintf("%d不是水仙花数\n",x);return0;}程序设计实例1——水仙花数
1.为变量yy和mm赋值;2.根据mm确定天数,有下列三种情况:(1)mm是1、3、5、7、8、10、12,则days=31;(2)mm是4、6、9、11,则days=30;(3)mm是2,若yy年不是闰年,则days=28;否则days=29;3.输出days;伪代码【问题】输入某年某月,确定该月有多少天。【算法】设变量days表示某年某月的天数,算法如下:【想法】设变量yy、mm表示某年某月,根据月份确定天数,需要判断闰年的情况。程序设计实例2——某年某月的某一天【程序】用switch语句为某月的天数days赋值,注意多个case子句可以共用一段程序。程序如下:#include<stdio.h>intmain(){intyy,mm,days;printf("请输入日期(年月):");scanf("%d%d",&yy,&mm);switch(mm){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2:if((yy%4==0&&yy%100!=0)||(yy%400==0))days=29;elsedays=28;break;}printf("%d年%d月有%d天\n",yy,mm,days);return0;}程序设计实例2——某年某月的某一天【引例5.3】偶数和【问题】计算100以内所有偶数的和。【想法】设变量sum作为累加器,依次将2、4、…、100累加到sum中。【算法】将变量sum初始化为0,循环变量i的初值为2、终值为100、步长为2,重复执行加法操作,算法如下:
1.初始化累加器sum=0;2.循环变量i从2~100重复执行下述操作:2.1sum=sum+i;2.2i=i+2;3.输出sum;伪代码【程序】循环变量具有确定的初值、终值和循环步长,用for循环实现。程序如下:#include<stdio.h>
intmain(){intsum=0,i;/*sum存储累加和,i是循环变量*/for(i=2;i<=100;i=i+2){sum=sum+i;}printf("100之内所有偶数的和为:%d\n",sum);return0;}【引例5.3】偶数和程序中涉及到新的语法?
当型循环结构,一般由while语句实现,因此,也称while循环。
【语法】while语句的一般形式如下:【语义】计算表达式的值;当表达式的值为真时执行语句(循环体);重新计算表达式的值,决定是否再次执行循环体;当表达式的值为假时结束循环,执行while语句的下一条语句。
while(表达式)语句循环体循环条件必须有括号表达式语句TF5.3循环结构当型循环结构例5.7
计算n!。【想法】由数学知识可知,n!=n×n-1×……×2×1,设变量result保存计算结果,首先将变量result初始化为1,然后将result乘以1再存入变量result、将result乘以2再存入变量result、……,直至将result乘以n再存入变量result,则result的值即为n!。step1:初始化阶乘结果result=1;step2:循环变量i从1~n,重复执行下述操作:step2.1:result=result*i;step2.2:i++;step3:输出result;伪代码5.3循环结构当型循环结构【算法】设变量result保存阶乘结果,i
表示乘数。算法如下:两个注意:1.循环变量一定要初始化,否则程序的运行结果可能不确定;2.循环体中一定要有改变循环变量的语句(循环变量的修正),否则可能出现死循环。【程序】用while循环实现,语句如下:
result=1;i=1;/*result为阶乘结果,i为循环变量*/while(i<=n)/*当i小于等于n时执行循环*/{result=result*i;/*将result乘以i再存入变量result*/i++;/*循环变量增1*/}5.3循环结构例5.7
计算n!。当型循环结构
直到型循环结构由do-while语句实现,也称do-while循环。
【语法】do-while语句的一般形式如下:【语义】执行语句(即循环体);计算表达式的值,当表达式的值为真时再次执行语句,当表达式的值为假时结束循环,顺序执行do-while语句的下一条语句。do语句while(表达式);循环体循环条件,括号不能省略一定要有分号表达式语句TF5.3循环结构直到型循环结构例5.8
计算n!。【程序】用do-while循环实现,语句如下:
result=1;i=1;/*result为阶乘结果,i为循环变量1*/do/*至少执行一次循环体*/{result=result*i;i++;/*循环变量增1*/}while(i<=n);使用while和do-while循环需要考虑以下三个问题:(1)循环的条件是什么?(2)重复做什么操作?(3)循环体至少执行一次吗?5.3循环结构直到型循环结构
计数型循环结构由for语句实现,因此,也称for循环。
【语法】for语句的一般形式如下:【语义】计算表达式1的值;判断表达式2是否成立,如果成立则执行语句(即循环体),如果不成立则退出循环;计算表达式3的值;判断表达式2是否成立,以决定是否再次执行循环体。
for(表达式1;表达式2;表达式3)
语句循环体循环条件循环的初值循环变量的修正由括号括起,由分号分隔表达式2语句TF计算表达式1计算表达式35.3循环结构计数型循环结构例5.9
计算n!。【程序】用for循环实现,语句如下:
for(result=1,i=1;i<=n;i++)/*表达式1为逗号表达式*/result=result*i;使用for循环需要考虑以下四个问题:(1)循环的起点(从哪开始)是什么?(2)循环的终点(到哪结束)是什么?(3)每次循环的步长是多大?(4)重复做什么操作?5.3循环结构计数型循环结构i=0;for(;i<n;i++)//省略表达式1,可以在for循环外面为循环变量赋初值{……}for(i=0;;i++)//省略表达式2,可以在循环体测试循环条件{if(i<n)break;}for(i=0;i<n;)//省略表达式3,可以在循环体内改变循环变量{i++;}5.3循环结构计数型循环结构表达式1、表达式2和表达式3均可以省略,但是分号不能省略。同一个问题,往往既可以用当型循环,也可以用直到型循环或计数型循环,但在实际应用中,应根据具体情况选用不同的循环结构,选用的一般原则是:1.如果循环次数在执行循环体之前就已确定,一般选用计数型循环;如果循环次数由循环体的执行情况确定,一般选用当型循环或直到型循环。2.如果循环体至少执行一次,可以选用当型循环也可以选用直到型循环,如果循环体有可能一次也不执行,则选用当型循环。
5.3循环结构三种循环结构之间的比较熟练掌握至少一种循环结构!【问题】计算整数中所含数字的位数。step1:初始化位数digits=0;step2:重复执行下述操作,直到x等于0:step2.1:digits++;step2.2:x=x/10;step3:输出digits;伪代码程序设计实例1——整数的位数【算法】设变量x表示整数,digits存储整数x的位数,算法如下:【想法】将整数反复除以10,直到商为0,执行除法的次数就是该整数所含数字的位数。例如:285/10=28,28/10=2,2/10=0,共执行3次除法,则285包含3位数字。用while循环实现intx,digits=1;x=x/10;while(x!=0){digits++;x=x/10;}【程序】由于整数至少含有一位数字,显然选用直到型循环更合适。程序如下:#include<stdio.h>
intmain(){intx,digits=0;
/*digits存储整数x的位数*/printf("请输入一个整数:");scanf("%d",&x);
do{digits++;/*位数增加1位*/x=x/10;/*将x缩小10倍*/}while(x!=0);/*当x不等于0时执行循环*/printf("有%d位数字\n",digits);return0;}程序设计实例1——整数的位数【问题】辗转相除法求两个自然数
m和
n的最大公约数。除数m被除数n
余数r352510251051050
step1:r=m%n;
step2:当r!=0时,重复执行下述操作:
step2.1:m=n;step2.2:n=r;step2.3:r=m%n;step3:输出n;伪代码程序设计实例2——欧几里得算法【算法】算法如下:【想法】将m和n辗转相除直到余数为0。例如,m=35,n=25,m除以n的余数用
r表示,计算过程如下:【程序】首先用变量m和n接收从键盘输入的两个整数,然后用while循环实现辗转相除。程序如下:#include<stdio.h>
intmain(){intm,n,r;printf("请输入两个正整数:");scanf("%d%d",&m,&n);r=m%n;while(r!=0)
/*当余数r不等于0时执行循环*/{m=n;n=r;r=m%n;}printf("这两个整数的最大公约数是:%d\n",n);return0;}程序设计实例2——欧几里得算法如果循环结构中的语句又是一个循环语句,则构成循环结构的嵌套。合法的嵌套循环形式如下:内层循环…
内层循环外层循环5.3循环结构循环结构的嵌套例5.13打印九九乘法表。解:九九乘法表需要一行一行地打印,共打印9行,打印第i行时需要打印i列。程序需要两层嵌套的循环,外层循环变量为i,其变化范围为[1,9],内层循环变量为j,其变化范围为[1,i]。for(i=1;i<=9;i++)/*打印第i行*/{for(j=1;j<=i;j++)/*打印第j列*/printf("%d×%d=%2d",j,i,i*j);/*列号在前,占2个宽度*/printf("\n");/*第i行打印完毕,换行*/}5.3循环结构循环结构的嵌套for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf("%d×%d=%2d",j,i,i*j);printf("\n");}5.3循环结构【问题】已知公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?x+y+z=1005×x+3×y+z/3=1000≤x≤200≤y≤330≤z≤100程序设计实例3——百元买百鸡问题【想法】设公鸡、母鸡和小鸡的个数为x、y、z,则有如下方程组成立:
注意到方程组可能有多个解,则需要输出所有满足条件的解。【算法】设变量x表示公鸡的个数,y表示母鸡的个数,z表示小鸡的个数,count表示解的个数,算法如下:step1:初始化解的个数count=0;step2:循环变量x从0~20循环执行下述操作:
step2.1:循环变量y从0~33循环执行下述操作:
step2.1.1:z=100–x–y;
step2.1.2:如果5*x+3*y+z/3等于100,则count++;
输出x、y和z的值;
step2.1.3:y++;
step2.2:x++;step3:如果count等于0,则输出无解信息;伪代码程序设计实例3——百元买百鸡问题【问题】对给定的整数x,判定是否是素数。step1:循环变量i从2~x-1,循环执行下述操作:step1.1:如果x%i等于0,则说明x不是素数,跳出循环;step1.2:i++;
step2:如果提前跳出循环,则x不是素数;否则x是素数;伪代码【引例5.4】素数判定【算法】设变量x存储需要判定的整数,算法如下:
【想法】素数除了1和其自身外没有其他因子。将整数x除以2~x-1,如果能整除,则x不是素数。【程序】用变量x接收从键盘输入的整数,然后用for循环进行拭除,程序如下:#include<stdio.h>
intmain(){
intx,i;
printf("请输入一个整数:");
scanf("%d",&x);
for(i=2;i<x;i++)/*从2开始试除,一直试到x–1*/{if(x%i==0)/*能够整除,不是素数,跳出循环*/break;}if(i<x)/*如果是提前跳出循环*/
printf("%d不是素数\n",x);else
printf("%d是素数\n",x);return0;}【引例5.4】素数判定程序中涉及到新的语法?
break语句用于跳出switch语句和循环语句,【语法】break语句一般与if语句配合使用,其一般形式如下:【语义】如果条件表达式成立,则跳出循环语句,执行循环语句的下一条语句。循环语句{……if(条件表达式)break;……}5.4
其他控制语句break语句例5.14从键盘上输入10个整数,判断是否含有负数。for(flag=0,i=1;i<=10;i++)/*已知循环次数,用for循环*/{scanf("%d",&x);
if(x<0){/*接收到负数*/flag=1;break;/*没有必要接收其他数据,跳出循环*/}}if(flag==1)printf("输入的整数中有负数\n");elseprintf("输入的整数中没有负数\n");解:依次读取从键盘上输入的整数并进行判断,当输入负整数时,没有必要继续读入数据,执行break语句跳出循环。设变量flag表示中间退出循环的标志,语句如下:5.4
其他控制语句break语句
continue语句只是结束本次循环的执行,但没有跳出循环。【语法】continue语句一般与if语句配合使用,其一般形式如下:【语义】如果条件表达式成立,则结束本次循环,重新开始新一轮的循环。循环语句
{
……
if(条件表达式)continue;
……
}5.4
其他控制语句continue语句例5.15从键盘上输入10个整数,输出其中的负数并统计负数出现的次数。解:依次读取从键盘上输入的整数并进行判断,如果该数为正数,则执行continue语句,程序回到for语句执行i++,开始下一轮循环,否则输出该数并累计次数。设变量count表示负数出现的次数,语句如下:for(count=0,i=1;i<=10;i++){scanf("%d",&x);
if(x>=0)continue;/*接收非负数,跳过for循环余下语句*/printf("%4d",x);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出纳转岗运营方案模板
- 弱电公司和物业签订协议书
- 精卫镜头运营方案设计
- 硅pu篮球场地面施工流程方案
- 油罐安全清洗施工规范
- 幼儿园阅读环境创设标准实施效果研究-基于幼儿园早期阅读指导纲要落实数据分析
- 学校颁发奖金实施方案
- 食堂客户运营方案范文
- 幼儿园午睡起床环节幼儿情绪调节策略-基于起床后行为观察与教师干预记录
- 医美机构运营推广方案
- 会计师事务所保密制度
- 学庸论语白话文
- 2023年山东聊城市纪委监委机关所属事业单位选聘10人笔试参考题库(共500题)答案详解版
- 美学原理全套教学课件
- 妇科操作技能-后穹窿穿刺术
- 《生理学》各章节题库及答案
- 抑郁病诊断证明书
- 2022年广东省外语艺术职业学院招聘考试真题及答案
- 中小学生安全知识网络答题活动题库大全及答案
- 2021年新高考重庆历史高考真题文档版(原卷)含答案
- GB/T 42449-2023系统与软件工程功能规模测量IFPUG方法
评论
0/150
提交评论