流程控制课件_第1页
流程控制课件_第2页
流程控制课件_第3页
流程控制课件_第4页
流程控制课件_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计(TheCProgrammingLanguage)耿小庆第四章流程控制

§4-1结构化程序设计§4-2C语句概述§4-3选择语句§4-4循环语句§4-5辅助控制语句§4-6习题第四章流程控制

结构化程序设计思想算法传统流程图表示的三种结构N/S方框图表示的三种结构小结§4-1结构化程序设计结构化程序设计思想§4-1结构化程序设计4.1.1结构化程序设计思想任何程序都可以用三种基本结构表示,即用顺序(Composition)、选择(Alternation)和循环(Iteration)结构来表示。这三种结构反复组合、嵌套构成的程序称为结构化程序。顺序结构的程序流程是按照语句的顺序依次执行;选择结构是根据给定的条件进行判断,由判断结构决定执行两支或多支程序段中的一支;循环结构是在给定条件成立的情况下,反复执行某个程序段。优点结构化程序层次分明、结构清晰、有效地改善了程序的可靠性,从而大大地提高了程序设计的质量和效率。§4-1概述4.1.1结构化程序设计§4-1概述员工工资管理系统…………税率计算员工福利员工出勤记录保险费退休金§4-1结构化程序设计自顶向下,逐步求精员工工资管理系统…………税率计算员工福利员工出勤记录保险费退4.1.2算法“算法”是为解决一个具体问题而采取的确定的有限的操作步骤。(数据结构)+(算法)=程序 N·Wirth算法的表示方法:传统的流程图N/S方框图自然语言伪码问题求解图(PAD)明确问题利用某种语言描述算法设计算法§4-1结构化程序设计4.1.2算法明确问题利用某种语言描述算法设计算法§4-14.1.3传统流程图表示的三种结构开始/结束框一般处理框判断框输入/输出框流程线连接符§4-1结构化程序设计4.1.3传统流程图表示的三种结构开始/结束框一般处理框4.1.3传统流程图表示的三种结构顺序结构(Composition)AB§4-1结构化程序设计4.1.3传统流程图表示的三种结构AB§4-1结构化程4.1.3传统流程图表示的三种结构选择结构(Alternation)AB条件P成立不成立§4-1结构化程序设计4.1.3传统流程图表示的三种结构AB条件P成立不成立§4.1.3传统流程图表示的三种结构循环结构(Iteration)不成立条件PA成立成立A条件P不成立(1)当型(2)直到型§4-1结构化程序设计4.1.3传统流程图表示的三种结构不成立条件PA成立成立A实例1:计算1+2+3+……+100的值i=i+1s=s+i开始NY循环变量i置1累加器s置0i<=100?结束输出s§4-1结构化程序设计实例1:计算1+2+3+……+100的值i=i+1s=这是一款意大利生产的多功能厨具|……请猜价格!600答案是:720低了!800750700高了!高了!正确!这是一款瑞士生产的多功能刀具|……请猜价格!600高了!500高了!时间到!1个商标720低了!答案是:428§4-1结构化程序设计实例2:幸运52这是一款意大利生产的多功能厨具|……6“幸运52”的传统流程图否是是是否否否是时间到?输出产品特点新产品?开始计时商标数清0猜对了?猜高了?输入猜想价格输出“高了!”输出“正确!”输出“低了!”累计商标数结束输出商标数输出“时间到!”“幸运52”的传统流程图否是是是否否否是时间到?输出产品特点传统流程图的优缺点优点:形象直观,各种操作一目了然,不会产生“歧义性”,便于理解,算法出错时容易发现,并可直接转化为程序。缺点:所占篇幅较大,由于使用流程线,过于灵活,不受约束,使用者可使流程线任意转移,从而造成程序阅读和修改的困难,不利于结构化程序的设计。§4-1结构化程序设计传统流程图的优缺点§4-1结构化程序设计4.1.4N/S方框图N/S方框图是由美国学者I·Nassi和B·Schneiderman于1973年提出的。N/S方框图的重要特点就是完全取消了流程线,这样,算法被迫只能顺序执行,从而避免了流程的任意转向,保证了程序的质量。尤其适合结构化程序的设计。N/S方框图的另一个优点是既形象直观,又节省篇幅。§4-1结构化程序设计4.1.4N/S方框图§4-1结构化程序设计§4-1结构化程序设计4.1.4N/S方框图顺序结构(Composition)AB§4-1结构化程序设计4.1.4N/S方框图AB§4-1结构化程序设计4.1.4N/S方框图选择结构(Alternation)AB条件P成立不成立§4-1结构化程序设计4.1.4N/S方框图AB条件P§4-1结构化程序设计4.1.4N/S方框图循环结构(Iteration)A当P成立A直到P成立(1)当型(2)直到型§4-1结构化程序设计4.1.4N/S方框图A当P成立实例1的N/S方框图累加器s置0循环变量i置1i=i+1s=s+ii<=100?输出s§4-1结构化程序设计实例1的N/S方框图累加器s置0循环变量i置1i=i+表达式语句表达式;赋值语句i=10;函数调用语句printf("Hello!\n");流程控制语句

选择if~else,else~if,switch~case循环for,while,do~while辅助控制break,continue,goto,return空语句;什么也不干

for(i=1;i<5000;i++);延时for(i=0;i<100;a[i++]=0);语法要求复合语句{多个简单句}语法上等同于一个简单语句可以嵌套使用

分程序,数据说明一定要在所有执行语句之前。§4-2C语句概述表达式语句表达式;赋值语句i=10;§4-2§4-3选择语句输入三个数,按从小到大输出main(){floata,b,c,t;scanf("%f%f%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%5.2f<=%5.2f<=%5.2f\n",a,b,c);}

4.3.1if语句格式:if(表达式)语句;说明:一般语言,if后是关系或逻辑表达式,而C无要求if只是测试表达式的值,当表达式的值为非0时,执行语句if(表达式)if(表达式!=0)if(!表达式)if(表达式==0)“语句”为一条语句或复合语句§4-3选择语句输入三个数,按从小到大输出4.3.1§4-3选择语句4.3.2if~else语句格式:if(表达式)语句1;else语句2;说明:

表达式仍为一般表达式,当表达式非0时,执行语句1,否则,执行语句2“语句1”、“语句2”均为一条语句或复合语句§4-3选择语句4.3.2if~else语句§4-3选择语句根据需要交换两个变量的值#include<stdio.h>main(){inta,b,x,ch;printf("Entertwointegers:");scanf("%d%d",&a,&b);printf("Swap?(y/n):");ch=getchar();if(ch=='y'||ch=='Y'){x=a;a=b;b=x;printf("a=%d,b=%d",a,b);}elseprintf("Noswap!\n");}§4-3选择语句根据需要交换两个变量的值加上{}就行了!if(n>0){if(a>b)z=a;}elsez=b;§4-3选择语句要想在n<=0时执行z=b;怎么办呢?给你出个难题?现有程序段if(n>0)if(a>b)z=a;elsez=b;什么时候执行z=b;?太简单了!else总是与其上最近的且未与其他else配对的if配对,因此n>0并且a<=b时执行z=b;4.3.3分支嵌套else总与其上最近的且未与其他else配对的if配对要想与其他if匹配加{}书写形式不能代替逻辑关系加上{}就行了!§4-3选择语句要想在n<=0时执行z=§4-3选择语句4.3.4else-if语句格式:if(表达式1)语句1;elseif(表达式2)语句2;.....elseif(表达式n)语句n;else语句n+1;功能:逐个判断表达式的值,对首次为真者执行其后的语句,然后继续执行n+1条语句后的语句,全不为真时执行else后的语句。§4-3选择语句4.3.4else-if语句main(){intmagic=200,guess;printf(“Pleaseguessamagicnumber:”);scanf("%d",&guess);if(guess==magic)printf(“Right!\n”);else{printf(“Wrong!”);if(guess>magic)printf(“Toohigh!\n”);elseprintf("Toolow!\n”);}}§4-3选择语句main(){intmagic=200,guess;printf(“Pleaseguessamagicnumber:”);scanf("%d",&guess);if(guess==magic)printf(“Right!\n”);elseif(guess>magic)printf(“Wrong!Toobig!\n”);elseprintf("Wrong!Toosmall!\n”);}猜数数游戏:由计算机“想”一个数请人猜,若猜对了则给出提示“Right”,否则提示“Wrong”,并告诉人是大还是小了?main()§4-3选择语句main()猜数数游戏:由计§4-3选择语句输入学号及成绩,并根据成绩定等级main(){intscore,snum;chargrade;scanf("%d%d",&snum,&score);if(snum>0&&snum<35&&score>=0&&score<=100){if(score>=90)grade='A';elseif(score>=80)grade='B';elseif(score>=70)grade='C';elseif(score>=60)grade='D';elsegrade='E';printf("number:%disgrade%c\n",snum,grade);}elseprintf("TheNo.isinvalid!\n);}§4-3选择语句输入学号及成绩,并根据成绩定等级§4-3选择语句4.3.5开关分支switch~case格式:switch(表达式){case值1:语句组1;[break;]case值2:语句组2;[break;]......case值n:语句组n;[break;][default:语句组n+1;[break;]]}功能:根据表达式的值与各个case判断值的比较情况决定执行哪个语句组。§4-3选择语句4.3.5开关分支switch~ca§4-3选择语句4.3.5开关分支switch~case注意:表达式的值可为任意类型,但一般为整型或字符型数据,判断值的类型与其要一致case判断值必须为常量或常量表达式,且判断值必须互不相同default缺省时,当所有case判断不符时,则直接自动退出switch当break语句不缺省时,case和default的顺序可以任意break语句缺省时,系统将继续执行下一条case语句组,可以使用case重叠共用一个语句组§4-3选择语句4.3.5开关分支switch~cas§4-3选择语句运输公司计算运费的原则是距离越远,每公里收费越低s<250无折扣;250<=s<5002%折扣;500<=s<10005%;1000<=s<20008%;2000<=s<300010%;s>=300015%p-单价w-重量d-折扣f运费p*W*S*(1-d)main(){ints;floatp,w,d,f;scanf("%f%f%d",&p,&w,&s);switch(s/250){case0:d=0;break;case1:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;break;}f=p*w*s*(1-d);printf("freight=%.2f\n",f);}§4-3选择语句运输公司计算运费的原则是距离越远,每公里§4-3选择语句统计输入的一行字符中的英文各元音字母的个数(不区分大小写)#include<stdio.h>main(){intna,ne,ni,no,nu;charc;na=ne=ni=no=nu=0;while((c=getchar())!='\n'){switch(c){case'A':case'a':na++;break;case'E':case'e':ne++;break;case'I':case'i':ni++;break;case'O':case'o':no++;break;case'U':case'u':nu++;break;}}printf("na=%d,ne=%d,ni=%d,no=%d,nu=%d\n",na,ne,ni,no,nu);}§4-3选择语句统计输入的一行字符中的英文各元音字母的个§4-3选择语句输入学号及成绩,并根据成绩定等级main(){intscore,snum;chargrade;scanf("%d%d",&snum,&score);if(snum>0&&snum<35&&score>=0&&score<=100){switch(score/10){case10:case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;case6:grade='D';break;default:grade='E';break;}printf("number:%disgrade%c\n",snum,grade);}elseprintf("TheNo.orScoreisinvalid!\n);}§4-3选择语句输入学号及成绩,并根据成绩定等级§4-4循环语句循环就是反复执行一段程序,被反复执行的程序段称为循环体。循环必须能结束,通常需要循环变量来控制循环。§4-4循环语句循环就是反复执行一段程序,被反复执行的4.4.1while语句当型格式:

while(表达式)循环体语句;说明:进入循环前要作初始化工作循环体中应有使条件向假方向变化的语句表达式为常数(非O)是无限循环,需配合其他语句加以控制循环体可以是空语句§4-4循环语句0非0表达式?循环体4.4.1while语句当型§4-4循环语句0非§4-4循环语句计算1+2+3+……+100的值main(){intsum=0,i=1;while(i<=100)sum+=i++;/*{sum+=i;i++;}*/printf(“sumof1-100is:%d\n”,sum);}求个位数为6且能被3整除的5位数共有多少个?main(){inti=0;longm=10006;while(m<=99996l){if(m%3==0)/*if((m/3)*3==m)*/i++;m+=10;}printf(“Itis%d\n”,i);}§4-4循环语句计算1+2+3+……+100的值§4-4循环语句求出200~800之间所有既能被7又能被11整除的整数main(){inti=0,m=200;while(m<=800){if(m%7==0&&m%11==0){printf(“%5d”,m);i++;if(i%10==0)printf(“\n”);}m++;}}§4-4循环语句求出200~800之间所有既能被7又能被4.4.2dowhile语句格式:do{循环体}while(表达式);说明:先执行一次循环体,再判表达式在不知道循环次数,且又必须执行一次循环体时§4-4循环语句0非0表达式?循环体4.4.2dowhile语句§4-4循环语句0非0表§4-4循环语句计算1+2+3+……+100的值main(){intsum=0,i=1;do{sum+=i;i++;}while(i<=100);printf(“sumof1-100is:%d\n”,sum);}某数用3除余2,用5余3,用7余2)main(){inti=0;do{i++;}while(!(i%3==2&&i%5==3&&i%7==2));/*}while(i%3!=2||i%5!=3||i%7!=2));*/printf(“%d\n”,i);}§4-4循环语句计算1+2+3+……+100的值

4.4.3for语句

格式:for(表达式1;表达式2;表达式3)循环体;执行顺序:(1)执行表达式1(2)判断表达式2,如果表达式2成立,则执行循环体,如果表达式2不成立,则执行(4)(3)再执行表达式3,然后回到(2)(4)………说明:表达式均可省略,分号不能省略for(;;)表达式1和3可为逗号表达式for(i=0,j=100;i<j;i++,j--);表达式2多为关系或逻辑表达式for(;low<=high&&found==0;)§4-4循环语句0非0表达式1表达式2?循环体表达式34.4.3for语句§4-4循环语句0非0表达式1§4-4循环语句计算1+2+3+……+100的值eg.main(){intsum=0,i;for(i=1;i<=100;i++)sum+=i;printf(“sumof1-100is:%d\n”,sum);}§4-4循环语句计算1+2+3+……+100的值§4-4循环语句4.4.4循环的嵌套多重循环在C语言中,当一个循环结构的循环体内有另一个循环结构时,称为多重循环或循环嵌套,前面介绍的三种循环结构可以相互嵌套。当一个循环的循环体仅是另一个单一的循环结构时,外层循环不需要使用大括号包围它的循环体。打印乘法口诀表for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf(“%5d”,i*j);printf(“\n”);}12345678924681012141618369121518212427481216202428323651015202530354045612182430364248547142128354249566381624324048566472918273645546372811243694812165101520256121824303671421283542498162432404856649182736455463728112345678946810121416189121518212427162024283236253035404536424854495663647281§4-4循环语句4.4.4循环的嵌套多重循环打印乘§4-5辅助控制语句4.5.1break语句功能:中断循环过程,退出循环体从包含它的switch退出说明:强行退出仅退出一层循环或一层switch4.5.2continue语句功能:使本次循环短路,继续执行下一次循环§4-5辅助控制语句4.5.1break语句§4-5辅助控制语句跳过负元素,求为正元素之和main(){intn,sum=0;while(1){scanf(“%d”,&n);if(n==0)break;if(n<0)continue;sum+=n;}printf("sum=%d\n",sum)}§4-5辅助控制语句跳过负元素,求为正元素之和§4-5辅助控制语句4.5.3转向语句goto格式:goto标号;error:......for(){if()gotoerror;}.......goto破坏结构化,不用!4.5.4返回语句return格式:return值;return(值);§4-5辅助控制语句4.5.3转向语句goto§4-6习题简单应用见书(谭)例题枚举法求最小公倍数找出100~999之间的所有水仙花数,各位立方和=本身(153等)百钱买百鸡、百马运百货

求素数

编程序找出1000之内的所有完数,一个数恰好等于其因子之和如6=1+2+3§4-6习题简单应用见书(谭)例题§4-6习题递推法公式类1!+2!+3!+……+20!1+1/1!+1/2!+……+1/10!Π/4=1-1/3+1/5-1/7+1/9+……10-6

求Πa+aa+aaa+……+aa……aaa=2,n=72+22+222+2222+22222+222222+2222222其它猴子吃桃珠穆朗玛峰皮球落地§4-6习题递推法最小公倍、最大公约main(){inta,b,bei;printf("Pleaseentertwointegers:");scanf("%d%d",&a,&b);if(a<b){bei=a;a=b;b=bei;}bei=a;while(bei%b!=0)bei+=a;printf(“\n最小公倍数为:%d\n",bei);}main(){inta,b,bei,chu,yu;printf("Pleaseentertwointegers:");scanf("%d%d",&a,&b);if(a>b){bei=a;chu=b;}else{bei=b;chu=a;}while((yu=bei%chu)!=0){bei=chu;chu=yu;}printf(“\n最大公约数为:%d\n",chu);}最小公倍、最大公约main()main()水仙花数main(){inti,j,k,m,n;for(i=1;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++){m=i*100+j*10+k;n=i*i*i+j*j*j+k*k*k;if(m==n)printf("%5d",m);}}main(){intm,i,j,k;for(m=100;m<=999;m++){i=m/100;

j=(m-i*100)/10;/*j=m%100/10;*/k=m%10;if(i*i*i+j*j*j+k*k*k==m)printf("%5d",m);}}水仙花数main()main()百钱买百鸡、百马拉百货main(){inti,j,k;for(i=1;i<20;i++)for(j=1;j<=33;j++){k=100-i-j;if(5*i+3*j+k/3==100&&k%3==0)printf("cock:%d,hen:%d,chick:%d\n",i,j,k);}}main(){inti,j,k;for(i=1;i<34;i++)for(j=1;j<50;j++)for(k=2;k<100;k+=2)if(i*3+j*2+k/2==100&&i+j+k=100)printf("big=%3d\tmiddle=%3d\tsmall=%3d\n",i,j,k);}百钱买百鸡、百马拉百货main()main()素数判断一个数是否为素数#include<math.h>main(){longm;inti,sqrtm;printf("Pleaseenteranumbers:");scanf("%ld",&m);sqrtm=sqrt(m);for(i=2;i<=sqrtm;i++)if(m%i==0)break;if(i>sqrtm)printf("%ldisaprime.\n",m);else printf("%ldisnotaprime.\n",m);}素数判断一个数是否为素数素数求一个区间中所有的素数#include<math.h>voidmain(void){longa,b,m;inti,sqrtm,count=0;printf("Pleaseentertwonumbers:");scanf("%ld%ld",&a,&b);printf("Primesfrom%dto%dis:\n",a,b);for(m=(a%2==0)?a+1:a;m<=b;m+=2){sqrtm=sqrt(m);for(i=2;i<=sqrtm;i++)if(m%i==0)break;if(i>sqrtm){if(count++%10==0)printf("\n"); printf("%8ld",m); }}}素数求一个区间中所有的素数完数main(){inti,j,s,n=0;printf(“1000之内的完数:”);for(i=1;i<=1000;i++){s=0;for(j=1;j<i;j++)if(i%j==0)s+=j;if(s==i){printf("%5d",i);n++;if(n%10==0)printf("\n");}}}完数main()Π/4=1-1/3+1/5-1/7+1/9+……求Π#include<math.h>main(){ints=1;longn=1;doublepi=0,t=1;/*doublepi=0,s=1,t=1,n=1;*/while(fabs(t)>=1e-6){pi+=t;n+=2;s=-s;t=(double)s/n;/*t=s/n;*/}pi*=4;printf(“PI=%f\n",pi);}Π/4=1-1/3+1/5-1/7+1/9+……求Π#1!+2!+3!+……+20!main(){inti;floats=0,t=1;for(i=1;i<=20;i++){t*=i;s+=t;}printf(“Result:%f\n",s);}1!+2!+3!+……+20!main()1+1/2!+1/3!+……+1/10!main(){inti;longt=1;floats=0;for(i=1;i<=10;i++){t*=i;s+=1.0/t;}printf(“Result:%f\n",s);}1+1/2!+1/3!+……+1/10!main()a+aa+aaa+……+aa……aamain(){inti,a,n;doublet=0,s=0;printf(“%d%d”,&a,&n);for(i=1;i<=n;i++){t=t*10+a;s+=t;}printf(“Result:%f\n",s);}a+aa+aaa+……+aa……aamain()猴子吃桃main(){inti,n;for(i=9,n=1;i>=1;i--)n=(n+1)*2;printf(“Thefirstdayhave%d.\n",n);}猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天又将剩下的桃子吃了一半,并多吃了一个,以后每天早上都这样,第十天想再吃时,只剩一个桃子,求第一天共摘多少桃子猴子吃桃main()猴子第一天摘下若干个桃子,当即吃了一半珠穆朗玛峰main(){doublehigh=0.00009;intn=0;while(high<8848){n++;high*=2;}printf(“对折%d次。\n",n);}假设有一张足够大的纸,厚度为0.09毫米,将纸不断对折。编制程序,求将纸对折多少次后,可以达到珠穆朗玛峰的高度(8848米)。珠穆朗玛峰main()假设有一张足够大的纸,厚度为0.09皮球落地main(){floathigh=100,s=0;inti;for(i=1;i<=10;i++){s+=high;high/=2;s+=high;}s-=high;printf(“第10次落地共经过%f米,第10次反弹%f米\n”,s,high);}一球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?皮球落地main()一球从100米高度自由落下,每次落地后作业编程设计一个简单的计数器程序,要求根据用户从键盘输入的表达式:操作数1运算符操作数2,计算表达式的值。指定运算为+,-,*,/。例如输入:2.5+3输出为:2.500000+3.000000=5.500000例如输入:5/2输出为:5.000000/2.000000=2.500000书第120页6.2、6.5求1-1/2+1/3-1/4+1/5……+1/99-1/100编程输出以下图形,行数及每行个数由用户输入决定************************************************************作业编程设计一个简单的计数器程序,要求根据用户从键盘作业编写猜数程序,程序中预先给定某个整数,从键盘反复输入整数进行猜数,每次输入数未猜中时,提示输入数过大或过小。猜中时显示猜的次数,最多允许猜20次。编写程序,从键盘输入一个正整数,计算该数的各个位数字之和,并显示结果。例如输入3257,结果为17。思考题:水手分椰子。五个水手在一个岛上发现了一堆椰子,现由第一个水手把椰子分为等量的5堆,剩下的1个给猴子,并自己藏起1堆,然后由第二个水手把剩下的4堆混合后重新分为等量的5堆,剩下的1个给猴子,并自己藏起一堆。以后第三、四个水手同样处理。最后第五个水手把剩下的椰子混合后分为等量的5堆,同样剩下1各给猴子。问原来这堆椰子至少有多少个。作业编写猜数程序,程序中预先给定某个整数,从键盘反复演讲完毕,谢谢观看!演讲完毕,谢谢观看!

C语言程序设计(TheCProgrammingLanguage)耿小庆第四章流程控制

§4-1结构化程序设计§4-2C语句概述§4-3选择语句§4-4循环语句§4-5辅助控制语句§4-6习题第四章流程控制

结构化程序设计思想算法传统流程图表示的三种结构N/S方框图表示的三种结构小结§4-1结构化程序设计结构化程序设计思想§4-1结构化程序设计4.1.1结构化程序设计思想任何程序都可以用三种基本结构表示,即用顺序(Composition)、选择(Alternation)和循环(Iteration)结构来表示。这三种结构反复组合、嵌套构成的程序称为结构化程序。顺序结构的程序流程是按照语句的顺序依次执行;选择结构是根据给定的条件进行判断,由判断结构决定执行两支或多支程序段中的一支;循环结构是在给定条件成立的情况下,反复执行某个程序段。优点结构化程序层次分明、结构清晰、有效地改善了程序的可靠性,从而大大地提高了程序设计的质量和效率。§4-1概述4.1.1结构化程序设计§4-1概述员工工资管理系统…………税率计算员工福利员工出勤记录保险费退休金§4-1结构化程序设计自顶向下,逐步求精员工工资管理系统…………税率计算员工福利员工出勤记录保险费退4.1.2算法“算法”是为解决一个具体问题而采取的确定的有限的操作步骤。(数据结构)+(算法)=程序 N·Wirth算法的表示方法:传统的流程图N/S方框图自然语言伪码问题求解图(PAD)明确问题利用某种语言描述算法设计算法§4-1结构化程序设计4.1.2算法明确问题利用某种语言描述算法设计算法§4-14.1.3传统流程图表示的三种结构开始/结束框一般处理框判断框输入/输出框流程线连接符§4-1结构化程序设计4.1.3传统流程图表示的三种结构开始/结束框一般处理框4.1.3传统流程图表示的三种结构顺序结构(Composition)AB§4-1结构化程序设计4.1.3传统流程图表示的三种结构AB§4-1结构化程4.1.3传统流程图表示的三种结构选择结构(Alternation)AB条件P成立不成立§4-1结构化程序设计4.1.3传统流程图表示的三种结构AB条件P成立不成立§4.1.3传统流程图表示的三种结构循环结构(Iteration)不成立条件PA成立成立A条件P不成立(1)当型(2)直到型§4-1结构化程序设计4.1.3传统流程图表示的三种结构不成立条件PA成立成立A实例1:计算1+2+3+……+100的值i=i+1s=s+i开始NY循环变量i置1累加器s置0i<=100?结束输出s§4-1结构化程序设计实例1:计算1+2+3+……+100的值i=i+1s=这是一款意大利生产的多功能厨具|……请猜价格!600答案是:720低了!800750700高了!高了!正确!这是一款瑞士生产的多功能刀具|……请猜价格!600高了!500高了!时间到!1个商标720低了!答案是:428§4-1结构化程序设计实例2:幸运52这是一款意大利生产的多功能厨具|……6“幸运52”的传统流程图否是是是否否否是时间到?输出产品特点新产品?开始计时商标数清0猜对了?猜高了?输入猜想价格输出“高了!”输出“正确!”输出“低了!”累计商标数结束输出商标数输出“时间到!”“幸运52”的传统流程图否是是是否否否是时间到?输出产品特点传统流程图的优缺点优点:形象直观,各种操作一目了然,不会产生“歧义性”,便于理解,算法出错时容易发现,并可直接转化为程序。缺点:所占篇幅较大,由于使用流程线,过于灵活,不受约束,使用者可使流程线任意转移,从而造成程序阅读和修改的困难,不利于结构化程序的设计。§4-1结构化程序设计传统流程图的优缺点§4-1结构化程序设计4.1.4N/S方框图N/S方框图是由美国学者I·Nassi和B·Schneiderman于1973年提出的。N/S方框图的重要特点就是完全取消了流程线,这样,算法被迫只能顺序执行,从而避免了流程的任意转向,保证了程序的质量。尤其适合结构化程序的设计。N/S方框图的另一个优点是既形象直观,又节省篇幅。§4-1结构化程序设计4.1.4N/S方框图§4-1结构化程序设计§4-1结构化程序设计4.1.4N/S方框图顺序结构(Composition)AB§4-1结构化程序设计4.1.4N/S方框图AB§4-1结构化程序设计4.1.4N/S方框图选择结构(Alternation)AB条件P成立不成立§4-1结构化程序设计4.1.4N/S方框图AB条件P§4-1结构化程序设计4.1.4N/S方框图循环结构(Iteration)A当P成立A直到P成立(1)当型(2)直到型§4-1结构化程序设计4.1.4N/S方框图A当P成立实例1的N/S方框图累加器s置0循环变量i置1i=i+1s=s+ii<=100?输出s§4-1结构化程序设计实例1的N/S方框图累加器s置0循环变量i置1i=i+表达式语句表达式;赋值语句i=10;函数调用语句printf("Hello!\n");流程控制语句

选择if~else,else~if,switch~case循环for,while,do~while辅助控制break,continue,goto,return空语句;什么也不干

for(i=1;i<5000;i++);延时for(i=0;i<100;a[i++]=0);语法要求复合语句{多个简单句}语法上等同于一个简单语句可以嵌套使用

分程序,数据说明一定要在所有执行语句之前。§4-2C语句概述表达式语句表达式;赋值语句i=10;§4-2§4-3选择语句输入三个数,按从小到大输出main(){floata,b,c,t;scanf("%f%f%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%5.2f<=%5.2f<=%5.2f\n",a,b,c);}

4.3.1if语句格式:if(表达式)语句;说明:一般语言,if后是关系或逻辑表达式,而C无要求if只是测试表达式的值,当表达式的值为非0时,执行语句if(表达式)if(表达式!=0)if(!表达式)if(表达式==0)“语句”为一条语句或复合语句§4-3选择语句输入三个数,按从小到大输出4.3.1§4-3选择语句4.3.2if~else语句格式:if(表达式)语句1;else语句2;说明:

表达式仍为一般表达式,当表达式非0时,执行语句1,否则,执行语句2“语句1”、“语句2”均为一条语句或复合语句§4-3选择语句4.3.2if~else语句§4-3选择语句根据需要交换两个变量的值#include<stdio.h>main(){inta,b,x,ch;printf("Entertwointegers:");scanf("%d%d",&a,&b);printf("Swap?(y/n):");ch=getchar();if(ch=='y'||ch=='Y'){x=a;a=b;b=x;printf("a=%d,b=%d",a,b);}elseprintf("Noswap!\n");}§4-3选择语句根据需要交换两个变量的值加上{}就行了!if(n>0){if(a>b)z=a;}elsez=b;§4-3选择语句要想在n<=0时执行z=b;怎么办呢?给你出个难题?现有程序段if(n>0)if(a>b)z=a;elsez=b;什么时候执行z=b;?太简单了!else总是与其上最近的且未与其他else配对的if配对,因此n>0并且a<=b时执行z=b;4.3.3分支嵌套else总与其上最近的且未与其他else配对的if配对要想与其他if匹配加{}书写形式不能代替逻辑关系加上{}就行了!§4-3选择语句要想在n<=0时执行z=§4-3选择语句4.3.4else-if语句格式:if(表达式1)语句1;elseif(表达式2)语句2;.....elseif(表达式n)语句n;else语句n+1;功能:逐个判断表达式的值,对首次为真者执行其后的语句,然后继续执行n+1条语句后的语句,全不为真时执行else后的语句。§4-3选择语句4.3.4else-if语句main(){intmagic=200,guess;printf(“Pleaseguessamagicnumber:”);scanf("%d",&guess);if(guess==magic)printf(“Right!\n”);else{printf(“Wrong!”);if(guess>magic)printf(“Toohigh!\n”);elseprintf("Toolow!\n”);}}§4-3选择语句main(){intmagic=200,guess;printf(“Pleaseguessamagicnumber:”);scanf("%d",&guess);if(guess==magic)printf(“Right!\n”);elseif(guess>magic)printf(“Wrong!Toobig!\n”);elseprintf("Wrong!Toosmall!\n”);}猜数数游戏:由计算机“想”一个数请人猜,若猜对了则给出提示“Right”,否则提示“Wrong”,并告诉人是大还是小了?main()§4-3选择语句main()猜数数游戏:由计§4-3选择语句输入学号及成绩,并根据成绩定等级main(){intscore,snum;chargrade;scanf("%d%d",&snum,&score);if(snum>0&&snum<35&&score>=0&&score<=100){if(score>=90)grade='A';elseif(score>=80)grade='B';elseif(score>=70)grade='C';elseif(score>=60)grade='D';elsegrade='E';printf("number:%disgrade%c\n",snum,grade);}elseprintf("TheNo.isinvalid!\n);}§4-3选择语句输入学号及成绩,并根据成绩定等级§4-3选择语句4.3.5开关分支switch~case格式:switch(表达式){case值1:语句组1;[break;]case值2:语句组2;[break;]......case值n:语句组n;[break;][default:语句组n+1;[break;]]}功能:根据表达式的值与各个case判断值的比较情况决定执行哪个语句组。§4-3选择语句4.3.5开关分支switch~ca§4-3选择语句4.3.5开关分支switch~case注意:表达式的值可为任意类型,但一般为整型或字符型数据,判断值的类型与其要一致case判断值必须为常量或常量表达式,且判断值必须互不相同default缺省时,当所有case判断不符时,则直接自动退出switch当break语句不缺省时,case和default的顺序可以任意break语句缺省时,系统将继续执行下一条case语句组,可以使用case重叠共用一个语句组§4-3选择语句4.3.5开关分支switch~cas§4-3选择语句运输公司计算运费的原则是距离越远,每公里收费越低s<250无折扣;250<=s<5002%折扣;500<=s<10005%;1000<=s<20008%;2000<=s<300010%;s>=300015%p-单价w-重量d-折扣f运费p*W*S*(1-d)main(){ints;floatp,w,d,f;scanf("%f%f%d",&p,&w,&s);switch(s/250){case0:d=0;break;case1:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;break;}f=p*w*s*(1-d);printf("freight=%.2f\n",f);}§4-3选择语句运输公司计算运费的原则是距离越远,每公里§4-3选择语句统计输入的一行字符中的英文各元音字母的个数(不区分大小写)#include<stdio.h>main(){intna,ne,ni,no,nu;charc;na=ne=ni=no=nu=0;while((c=getchar())!='\n'){switch(c){case'A':case'a':na++;break;case'E':case'e':ne++;break;case'I':case'i':ni++;break;case'O':case'o':no++;break;case'U':case'u':nu++;break;}}printf("na=%d,ne=%d,ni=%d,no=%d,nu=%d\n",na,ne,ni,no,nu);}§4-3选择语句统计输入的一行字符中的英文各元音字母的个§4-3选择语句输入学号及成绩,并根据成绩定等级main(){intscore,snum;chargrade;scanf("%d%d",&snum,&score);if(snum>0&&snum<35&&score>=0&&score<=100){switch(score/10){case10:case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;case6:grade='D';break;default:grade='E';break;}printf("number:%disgrade%c\n",snum,grade);}elseprintf("TheNo.orScoreisinvalid!\n);}§4-3选择语句输入学号及成绩,并根据成绩定等级§4-4循环语句循环就是反复执行一段程序,被反复执行的程序段称为循环体。循环必须能结束,通常需要循环变量来控制循环。§4-4循环语句循环就是反复执行一段程序,被反复执行的4.4.1while语句当型格式:

while(表达式)循环体语句;说明:进入循环前要作初始化工作循环体中应有使条件向假方向变化的语句表达式为常数(非O)是无限循环,需配合其他语句加以控制循环体可以是空语句§4-4循环语句0非0表达式?循环体4.4.1while语句当型§4-4循环语句0非§4-4循环语句计算1+2+3+……+100的值main(){intsum=0,i=1;while(i<=100)sum+=i++;/*{sum+=i;i++;}*/printf(“sumof1-100is:%d\n”,sum);}求个位数为6且能被3整除的5位数共有多少个?main(){inti=0;longm=10006;while(m<=99996l){if(m%3==0)/*if((m/3)*3==m)*/i++;m+=10;}printf(“Itis%d\n”,i);}§4-4循环语句计算1+2+3+……+100的值§4-4循环语句求出200~800之间所有既能被7又能被11整除的整数main(){inti=0,m=200;while(m<=800){if(m%7==0&&m%11==0){printf(“%5d”,m);i++;if(i%10==0)printf(“\n”);}m++;}}§4-4循环语句求出200~800之间所有既能被7又能被4.4.2dowhile语句格式:do{循环体}while(表达式);说明:先执行一次循环体,再判表达式在不知道循环次数,且又必须执行一次循环体时§4-4循环语句0非0表达式?循环体4.4.2dowhile语句§4-4循环语句0非0表§4-4循环语句计算1+2+3+……+100的值main(){intsum=0,i=1;do{sum+=i;i++;}while(i<=100);printf(“sumof1-100is:%d\n”,sum);}某数用3除余2,用5余3,用7余2)main(){inti=0;do{i++;}while(!(i%3==2&&i%5==3&&i%7==2));/*}while(i%3!=2||i%5!=3||i%7!=2));*/printf(“%d\n”,i);}§4-4循环语句计算1+2+3+……+100的值

4.4.3for语句

格式:for(表达式1;表达式2;表达式3)循环体;执行顺序:(1)执行表达式1(2)判断表达式2,如果表达式2成立,则执行循环体,如果表达式2不成立,则执行(4)(3)再执行表达式3,然后回到(2)(4)………说明:表达式均可省略,分号不能省略for(;;)表达式1和3可为逗号表达式for(i=0,j=100;i<j;i++,j--);表达式2多为关系或逻辑表达式for(;low<=high&&found==0;)§4-4循环语句0非0表达式1表达式2?循环体表达式34.4.3for语句§4-4循环语句0非0表达式1§4-4循环语句计算1+2+3+……+100的值eg.main(){intsum=0,i;for(i=1;i<=100;i++)sum+=i;printf(“sumof1-100is:%d\n”,sum);}§4-4循环语句计算1+2+3+……+100的值§4-4循环语句4.4.4循环的嵌套多重循环在C语言中,当一个循环结构的循环体内有另一个循环结构时,称为多重循环或循环嵌套,前面介绍的三种循环结构可以相互嵌套。当一个循环的循环体仅是另一个单一的循环结构时,外层循环不需要使用大括号包围它的循环体。打印乘法口诀表for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf(“%5d”,i*j);printf(“\n”);}12345678924681012141618369121518212427481216202428323651015202530354045612182430364248547142128354249566381624324048566472918273645546372811243694812165101520256121824303671421283542498162432404856649182736455463728112345678946810121416189121518212427162024283236253035404536424854495663647281§4-4循环语句4.4.4循环的嵌套多重循环打印乘§4-5辅助控制语句4.5.1break语句功能:中断循环过程,退出循环体从包含它的switch退出说明:强行退出仅退出一层循环或一层switch4.5.2continue语句功能:使本次循环短路,继续执行下一次循环§4-5辅助控制语句4.5.1break语句§4-5辅助控制语句跳过负元素,求为正元素之和main(){intn,sum=0;while(1){scanf(“%d”,&n);if(n==0)break;if(n<0)continue;sum+=n;}printf("sum=%d\n",sum)}§4-5辅助控制语句跳过负元素,求为正元素之和§4-5辅助控制语句4.5.3转向语句goto格式:goto标号;error:......for(){if()gotoerror;}.......goto破坏结构化,不用!4.5.4返回语句return格式:return值;return(值);§4-5辅助控制语句4.5.3转向语句goto§4-6习题简单应用见书(谭)例题枚举法求最小公倍数找出100~999之间的所有水仙花数,各位立方和=本身(153等)百钱买百鸡、百马运百货

求素数

编程序找出1000之内的所有完数,一个数恰好等于其因子之和如6=1+2+3§4-6习题简单应用见书(谭)例题§4-6习题递推法公式类1!+2!+3!+……+20!1+1/1!+1/2!+……+1/10!Π/4=1-1/3+1/5-1/7+1/9+……10-6

求Πa+aa+aaa+……+aa……aaa=2,n=72+22+222+2222+22222+222222+2222222其它猴子吃桃珠穆朗玛峰皮球落地§4-6习题递推法最小公倍、最大公约main(){inta,b,bei;printf("Pleaseentertwointegers:");scanf("%d%d",&a,&b);if(a<b){bei=a;a=b;b=bei;}bei=a;while(bei%b!=0)bei+=a;printf(“\n最小公倍数为:%d\n",bei);}main(){inta,b,bei,chu,yu;printf("Pleaseentertwointegers:");scanf("%d%d",&a,&b);if(a>b){bei=a;chu=b;}else{bei=b;chu=a;}while((yu=b

温馨提示

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

评论

0/150

提交评论