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

下载本文档

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

文档简介

程序控制结构第1页,课件共40页,创作于2023年2月3.1C语言结构化程序设计基础程序的控制结构(黑箱)单入口单出口的控制结构易于理解三种基本控制结构:顺序、分支、循环控制结构可以嵌套,以构成更复杂的控制结构程序的结构化三种基本控制结构可以构造任何复杂的结构化算法结构化程序设计原则:自顶向下,逐步求精结构化程序设计过程:首先对任务进行功能分解,然后使用结构化程序设计思想逐一解决各个子问题,最后构造原始问题的解好处:逻辑性强,可读性好,维护方便第2页,课件共40页,创作于2023年2月3.2顺序结构顺序结构的含义由一组顺序执行的处理块组成,每个处理块可能包含一条或一组语句,完成一项任务顺序结构是最基本的算法结构语句与复合语句(语句块)三种语句结构:单语句(表达式;)、空语句(;)、复合语句({语句序列})第3页,课件共40页,创作于2023年2月顺序结构程序示例分别输入两个复数的实部与虚部,计算两个复数的和、差、积、商并输出结果#include<stdio.h>intmain(){floata,b,c,d,real,imaginary;printf(“Inputrealsandimaginariesoftwocomplexes\n”);

scanf(“%f,%f,%f,%f”,&a,&b,&c,&d);printf(“Sum:%f+%fi\n”,a+c,b+d);printf(“Difference:%f+%fi\n”,a–c,b–d);

real=a*c–b*d;imaginary=a*d+b*c;printf(“Product:%f+%fi\n”,real,imaginary);

real=(a*c+b*d)/(c*c+d*d);imaginary=(b*c–a*d)/(c*c+d*d);printf(“Quotient:%f+%fi\n”,real,imaginary);return0;}实际需要输入4个实数第4页,课件共40页,创作于2023年2月3.3分支结构分支结构(选择结构)的含义根据某一条件的判断结果,确定程序的流程,即选择哪一个程序分支中的处理块去执行最基本的分支结构是二路分支结构以条件判断为起点,如果判断结果为真,则执行A处理块的操作,否则执行B处理块的操作第5页,课件共40页,创作于2023年2月if-else

语句语句格式:if(表达式)语句1else语句2表达式必须位于括号内,一般为关系或逻辑表达式先计算表达式值,若为真则执行语句1,否则执行语句2语句1与语句2可以为复合语句语句1与语句2只能有一个被执行如果仅仅用于确定某条语句是否执行,else分支可以省略第6页,课件共40页,创作于2023年2月if-else

语句示例一输入一个字符,判断它是否为0~9之间的数字#include<stdio.h>intmain(){charc;printf(“Inputacharacter:”);

c=getchar();

if(c>=48&&c<=57)printf(“Itisanumber.\n”);

elseprintf(“No,itisnotanumber.\n”);return0;}因:字符以ASCII码值存储且数字的ASCII码值48~57故:比较ASCII码值第7页,课件共40页,创作于2023年2月if-else

语句示例二输入一个整数,输出其绝对值#include<stdio.h>intmain(){intn,abs;printf(“Enterinteger:”);

scanf(“%d”,&n);

abs=n;

if(abs<0)abs=–abs;printf(“Originalinteger:%d,absolutevalue:%d\n”,n,abs);return0;}第8页,课件共40页,创作于2023年2月if-elseif-else

语句语句格式if(表达式1)语句1elseif(表达式2)语句2…else语句n第9页,课件共40页,创作于2023年2月if-elseif-else

示例根据百分制成绩给出优秀、通过或不通过成绩#include<stdio.h>intmain(){floatscore;

printf(“Inputscore:“);

scanf(“%f“,&score);

if(score>=85&&score<=100)printf(“Excellent.\n“);

elseif(score>=60&&score<85)printf(“Pass.\n“);

elseif(score>=0&&score<60)printf(“Nopass.\n“);

else

printf(“Errorscore.\n“);return0;}第10页,课件共40页,创作于2023年2月条件分支的嵌套条件语句的嵌套格式当年龄大于50岁时,若工资小于500,则长200,否则长300if(age>50)

if(sal<500)

sal+=200;else

sal+=300;若年龄大于50岁且工资小于500,长200;若年龄不大于50岁,则长300语法规定:else与离它最近的if配对嵌套的条件语句可以实现复杂的逻辑判断if(age>50)

if(sal<500)

sal+=200;else

sal+=300;if(age>50){

if(sal<500)

sal+=200;}else

sal+=300;第11页,课件共40页,创作于2023年2月条件分支嵌套示例求方程ax2+bx+c=0

的根#include<stdio.h>#include<math.h>//由于用到平方根函数,要用此头文件intmain(){floata,b,c,x1,x2,p,q,m;//定义实型变量

printf(“Enter3coefficients:“);

scanf(“%f,%f,%f“,&a,&b,&c);//从键盘读入方程的三个系数

if(a==0.0&&b==0&&c==0)//分支1:三个系数全为0

printf(“anyvalue\n“);

else

if(a==0&&b!=0)//分支2:系数a为0,解一元一次方程

printf(“x1=x2=%f\n",–c/b);

else

//分支3:解一元二次方程的两个根

{

m=b*b–4.0*a*c;…第12页,课件共40页,创作于2023年2月条件分支嵌套示例

if(m>=0){//解实根

x1=(–b+sqrt(m))/(2.0*a);

x2=(–b–sqrt(m))/(2.0*a);

printf(“x1=%f\n“,x1);//输出两个实根

printf(“x2=%f\n“,x2);}

else

{

//解虚根

p=–b/(2.0*a);

q=sqrt(–m)/(2.0*a);

printf(“x1=%f+%fi\n“,p,q);

printf(“x2=%f–%fi\n“,p,q);}}return0;}第13页,课件共40页,创作于2023年2月switch

分支语法计算过程先计算表达式的值依次与一组常量比较若相同则执行该分支否则转向default分支退出switch语句说明switch后面的表达式必须为整型、字符型或枚举型case后面必须为常量表达式,则各个case值必须不同如果没有default子句,且没有case子句匹配,则不执行case分支中的语句可以有多条,不需要花括号switch(表达式){

case常量表达式1:语句组1

case常量表达式2:语句组2┇

case常量表达式n:语句组ndefault:语句组}第14页,课件共40页,创作于2023年2月switch

分支流程图第15页,课件共40页,创作于2023年2月switch分支示例一根据输入的成绩等级,打印相应分数段#include<stdio.h>intmain(){chargrade;

printf(“Inputthegrade(A,B,C,D,E):“);scanf(“%c“,&grade);

switch(grade){case‘A‘:printf(“90-100\n“);break;case‘B‘:printf(“80-89\n“);break;case‘C‘:printf(“70-79\n“);break;case‘D‘:printf(“60-69\n“);break;case‘E‘:printf(“0-59\n“);break;default:printf(“Error\n“);}return0;}第16页,课件共40页,创作于2023年2月switch分支示例一根据输入的成绩等级,打印相应分数段#include<stdio.h>intmain(){chargrade;

printf(“Inputthegrade(A,B,C,D,E):“);scanf(“%c“,&grade);

switch(grade){case‘A‘:printf(“90-100\n“);case‘B‘:printf(“80-89\n“);case‘C‘:printf(“70-79\n“);case‘D‘:printf(“60-69\n“);case‘E‘:printf(“0-59\n“);default:printf(“Error\n“);}return0;}break的目的是终止switch语句的执行。如果没有break语句,则程序会从指定的case分支开始,并在该分支结束后继续执行下去。除非switch语句结束,后面的其他case分支或default分支中的语句都会得到执行第17页,课件共40页,创作于2023年2月switch分支示例二根据输入的成绩等级,打印是否通过信息#include<stdio.h>intmain(){chargrade;

printf(“Inputthegrade(A,B,C,D,E):“);scanf(“%c“,&grade);

switch(grade){case‘A‘:case‘B‘:case‘C‘:case‘D‘:printf(“Pass\n“);break;case‘E‘:printf(“Fail\n“);break;default:printf(“Error\n“);}return0;}如果逻辑上确实如此,则不同的case分支可以使用同一个语句组,这也许是特意不在某些case分支中使用break的唯一正当理由第18页,课件共40页,创作于2023年2月3.4循环结构循环结构的含义根据某一条件的判断结果,反复执行某一处理块的过程最基本的循环结构是当循环进入循环结构,判断循环条件,如果循环条件的结果为真,则执行A处理块的操作,即循环一次,然后再次判断循环条件,当循环条件为假时,循环结束第19页,课件共40页,创作于2023年2月while

循环while循环格式:while(表达式)循环体while循环流程先判断后执行:表达式为真时,执行一遍循环体(一次迭代),返回重新计算表达式的值以确定是否重复执行循环体;若表达式为假,则终止循环为保证循环终止,循环体内应有能改变表达式值的语句第20页,课件共40页,创作于2023年2月while循环示例使用while循环求两个正整数的最小公倍数#include<stdio.h>intmain(){intm,n,result;

printf(“Inputtwopositiveintegersm,n:“);

scanf(“%d,%d“,&m,&n);if(m>0&&n>0){

result=m<n?n:m;

while(result%m!=0||result%n!=0)result++;

printf(“Theleastcommonmultipleofmandnis%d.\n“,result);}else

printf(“thenumbermornisnotapositiveinteger.\n“);return0;}第21页,课件共40页,创作于2023年2月do-while

循环do-while循环格式:do{循环体}while(表达式);do-while循环流程先执行后判断:先执行一遍循环体(一次迭代),计算表达式的值,表达式为真时重复执行循环体,否则终止循环(循环体至少执行一次,这与while循环不同)为保证循环终止,循环体内应有能改变表达式值的语句第22页,课件共40页,创作于2023年2月do-while循环示例反复求两个正整数的最小公倍数,直到输入的两个数均为1时结束#include<stdio.h>intmain(){intm,n,result;

do{

printf(“Inputtwopositiveintegersm,n:“);scanf(“%d,%d“,&m,&n);if(m>0&&n>0){

result=m<n?n:m;while(result%m!=0||result%n!=0)result++;

printf(“Theleastcommonmultipleofmandnis%d.\n“,result);}else

printf(“thenumbermornisnotapositiveinteger.\n“);

}while(m!=1||n!=1);return0;}第23页,课件共40页,创作于2023年2月for

循环for循环格式for(表达式1;表达式2;表达式3)循环体for循环流程先判断后执行:先执行表达式1(循环初始化),再计算表达式2以根据其结果决定是否执行一遍循环体(为真时执行),计算表达式3的值(循环再次“初始化”),返回重新计算表达式2的值以确定循环是否终止第24页,课件共40页,创作于2023年2月for循环示例一计算#include<stdio.h>intmain(){intresult,k;

result=0;

//累加器变量,设置初始值(本例设为0)

for(k=1;k<=100;k++)//循环计算

result+=k*k;//累加

printf(“Theresult:%d\n“,result);

return0;}第25页,课件共40页,创作于2023年2月三种循环结构的比较三种循环结构可以互换使用for循环与while循环常见,do-while循环少见while循环常用于不需要或很少需要初始化的场合for循环常用于需要简单初始化和通过递增递减运算控制循环体执行的场合for循环将所有循环控制因素都放在循环头部,循环结构最清晰通过省略循环头部的一个或多个表达式,for循环也可能非常复杂第26页,课件共40页,创作于2023年2月for循环示例二程序读入一个字符串,然后反向打印输出#include<stdio.h>#include<string.h>intmain(){chars[50],c;inti,j;

printf(“Inputastring:“);scanf(“%s“,s);for(i=0,j=strlen(s)–1;i<j;i++,j––){

c=s[i];s[i]=s[j];s[j]=c;}

printf(“%s\n“,s);return0;}第27页,课件共40页,创作于2023年2月for循环示例三打印九九乘法表#include<stdio.h>intmain(){inti,j,k;for(i=1;i<=9;i++){

for(j=i;j<=9;j++){

k=i*j;

printf(“%d×%d=%d\t“,i,j,k);}

printf(“\n“);}return0;}如果一个循环体内包含另一个循环则称循环嵌套或多重循环三种循环都可以嵌套,但嵌套时内外层循环不能发生交叉发生嵌套时,内层循环经常需要使用外层循环的某些值作为控制条件第28页,课件共40页,创作于2023年2月循环控制转移:break

语句输出5行、每行10个随机数,若随机数大于20,000,本行输出结束#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(){inti,j,r;

srand(time(NULL));

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

for(j=1;j<=10;j++){

r=rand();printf(“%6d\t“,r);if(r>20000)break;}

printf(“\n“);}return0;}srand():设置随机数种子的函数time():获取时间的函数rand():产生随机数的函数break终止当前循环的执行,在存在循环嵌套的场合,它并不能终止外层循环的执行第29页,课件共40页,创作于2023年2月循环控制转移:continue

语句输入一串字符,以回车结束输入,程序统计并输出其中小写字母的个数#include<stdio.h>intmain(){charc;intnum=0;

printf(“Enterastring:\n“);

while((c=getchar())!=‘\n‘){if(c<97||c>122)continue;

//非小写字母,本次循环结束

num++;}

printf(“%d\n“,num);return0;}continue终止的是当前循环的当前一次迭代,而不是整个循环,当前循环的下一次迭代仍会执行第30页,课件共40页,创作于2023年2月结构化程序设计注意事项要保证结构的完整性不允许结构层次间的交叉!要保证操作的完整性一个基本结构就是一个完整的操作单元,程序只能从入口进出口出程序最好不要有多入口多出口,尤其不能从外部进入循环或条件分支内部第31页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例一打印小于n的所有个位不等于9的素数,n的具体值由用户输入,要求分行输出,每行输出10个数#include<stdio.h>intmain(){inti,j,n,line=0;

printf(“Pleaseinputn:“);scanf(“%d“,&n);if(n<=1){printf(“Nonumbertooutput!\n“);return1;}for(i=2;i<=n;i++){//逐一取出待查数据

for(j=2;j<i;j++)if(i%j==0)break;//该数非素数,终止内层循环

if(i==j&&i%10!=9){//若该数为素数且个位不等于9,打印输出

printf(“%d,“,i);line++;if(line==10){printf(“\n“);line=0;}}}

printf(“\n“);return0;}使用for循环第32页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例一#include<stdio.h>intmain(){inti,j,n,line=0;

printf(“Pleaseinputn:“);scanf(“%d“,&n);if(n<=1){printf(“Nonumbertooutput!\n“);return1;}

i=2;while(i<=n){//逐一取出待查数据

j=2;while(j<i&&i%j!=0)j++;//求该数的约数

if(i==j&&i%10!=9){//若该数为素数且个位不等于9,打印输出

printf(“%d,“,i);line++;if(line==10){printf(“\n“);line=0;}}

i++;}

printf(“\n“);return0;}使用while循环第33页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例二百元买百鸡(穷举):已知公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡几只#include<stdio.h>intmain(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++)if(x+y+z==100&&15*x+9*y+z==300)

printf(“x=%d,y=%d,z=%d\n“,x,y,z);}设x、y、z分别表示可买的公鸡、母鸡、小鸡的个数,有不定方程组:第34页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例二百元买百鸡(穷举):已知公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡几只#include<stdio.h>intmain(){intx,y,z;for(x=0;x<=

20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(x+y+z==100&&15*x+9*y+z==300)

printf(“x=%d,y=%d,z=%d\n“,x,y,z);}设x、y、z分别表示可买的公鸡、母鸡、小鸡的个数,有不定方程组:#include<stdio.h>intmain(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++)if(x+y+z==100&&15*x+9*y+z==300)

printf(“x=%d,y=%d,z=%d\n“,x,y,z);}第35页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例三输出裴波那契数列前30项值(递推)#include<stdio.h>intmain(){intn1,n2,n,count;

n1=0;n2=1;

printf(“%10d%10d“,n1,n2);for(count=3;count<=30;count++){

n=n1+n2;

printf(“%10d“,n);if(count%5==0)printf(“\n“);//控制每行输出5个数

n1=n2;n2=n;}

printf(“\n“);}第36页,课件共40页,创作于2023年2月3.5结构化程序设计应用示例四设计一个简单的菜单程序运行时,首先显示一个菜单画面用以提示输入操作选择操作员从菜单上选择一个操作

温馨提示

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

评论

0/150

提交评论