资源描述:
《顺序和分支程序结构.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
C语言程序设计教程第3章:顺序程序结构和分支程序结构(2课时) 本章小结顺序程序结构分支程序结构 顺序结构程序是指在程序的每次执行过程中,程序中的各条语句按照在程序中的先后顺序依次执行。每个顺序结构程序中的可执行语句在每一次程序执行的过程中,执行且只执行一次。顺序程序是最简单的程序。设计一个程序,首先要将问题分析清楚,然后用适当的方法将问题描述出来,再根据问题的描述编成程序,最后调试运行。描述问题的方法很多,有各种流程图,层次图、伪代码等,更多的时候是多种手段混合使用。1顺序结构程序 /*exam31.c*//*最简单的C程序*/#includemain(){printf(“Hello,world!、n”);}例3.1最简单的C程序,这也是世界上第一个C程序。头文件主函数 例3.2已知圆的半径为10,求圆的面积和周长,用计算机求解,程序如下/*exam32.c*//*计算圆的面积和周长*/#include#definepi3.1415//定义符号常量main(){floatarea,s;area=pi*10.0*10.0;s=2*pi*10.0;printf(“面积=%f,周长=%f ”,area,s);}数值常量 例3.3已知圆的半径为R(R是一个可变的量),求圆的面积和周长,用计算机求解,完整程序如下/*exam33.c*//*计算圆的面积和周长*/#includemain(){floatr,area,s;scanf(“%f“,&r);area=3.14*r*r;s=2*3.14*r;printf(“面积=%f,周长=%f ”,area,s);}1、注释2、数据说明3、数据输入4、数据处理5、结果输出 例3.4从键盘输入两个数a、b,求a除b的余数。即整除后剩下的数。编写完整的程序。源程序代码如下://exam34.c//求两个数的余数#includemain(){inta,b,c;//说明整型变量scanf(“%d,%d”,&a,&b);c=a%b;printf(“c=%d ”,c);}整除运算符输出语句 例3.5以我国1992年工业产值为100,如果以9%的年增长率增长计算到2000年时的工业产值。1算法分析:对此问题,要找出问题的数学模型。设r为年增长率,n为年数,v为第n年的总产值。则有v=100*(1+r)n2数据结构根据算法分析,至少要用到这么几个量,年增长率、年数、第n年的总产值。而这几个量中,年增长率肯定是小数(浮点)型数据,年数是整数(整型),总产值不会是整数,应为浮点数。这些数据都要放在相应的变量中,并要进行相应的数据说明。 //exam35.c//计算到2000年的工业产值#include#includemain(){intn;floatrate,value;n=2000-1992;rate=0.09;value=100*pow((float)(1+r),(float)n);printf(“2000年的产值为%f:”,value);}pow为求幂的函数格式pow(底,指数)底,指数均为浮点数。强制类型转换3源程序代码注意头文件 此例中,只能算到2000年,且年增长率为9%时的工业产值。如果将工业产值改为10%,或者要算到其它年份,必须要修改源程序,使用不便。方法2:用scanf函数重新编写程序,注意开发环境的使用。//exam25a.c//计算到指定年和指定年增长率的工业产值#include#includemain(){intn,year;//说明整型变量floatvalue,rate;printf(“请输入年份和年增长率:”);scanf(“%d,%f”,&year,&rate);n=year-1992;value=100*pow((float)(1+rate),(float)n);printf(“按给定利率到指定年份的产值为%f ”,value);}强制类型转换改写后的程序使用更灵活。 例3.6鸡兔同笼,已知鸡兔总头数为H(Heads),总数为F(Feet),问鸡兔各有多少只?1算法分析:(1)建立数学模型设鸡为x只,兔为y只,由题意有:x+y=h......(1)2*x+4*y=f......(2)(2)求解方程,找出x,y的具体求解公式:以下用消元法找出方程的解 (2)式-2×(1)式注意:计算机不会自己建数学模型,也不会自己解方程!2×y=f-2×hy=(f-2×h)/24×(1)式-(2)式2×X=4×H-FX=(4×H-F)/22数据结构程序中要用到不同的数据,存放头、脚数量的变量,存放方程解(鸡、兔数量)的变量,存放方程判别式的变量等。对于头、脚的数量,肯定是整型变量,方程的解理论上讲是整型,但在求解方程时要进行运算,为了避免发生错误,最好是用浮点数据(实型)。 3伪代码(由于此问题比较简单,也可直接编写程序)。说明变量x,y,f,h输入数据f,h计算x,y打印结果伪代码是一种程序设计工具,介于程序语言与自然语言之间,伪代码不能被计算机编译,但它很容易翻译成高级语言. //exam36.c#includemain(){floatx,y;intf,h;printf(“InputthenumbersofHeadsandFeet:”);scanf(“%d,%d”,&f,&h);x=(4.0*h-f)/2.0;y=(f-2.0*h)/2.0;printf(“Heads=%d;Feet=%d ”,h,f);printf(“Chicken=%f,rabbits=%f ”,x,y);}4源程序代码说明输入数据的内容输出语句赋值语句 问题:1、从键盘输入一个数,如果该数为正,打印,否则不打印;2、将考试成绩不及格的学生名单打印出来;3、解一元二次方程,求出相应的实根或复根。对于上述或类似问题,需要进行某种判断,并根据不同情况进行不同的处理,怎样进行程序设计?2分支结构程序设计 解决办法:1、引入新的程序结构,分支结构,有时也称判断结构或选择结构。2、为了和分支结构相配合,同时还要引入逻辑表达式的概念。3、有三种形式可进行分支结构的程序设计A、if结构B、多重选择结构(switch语句)C、无条件转移结构(goto语句) 内容if语句关系表达式和逻辑表达式if语句的变形及嵌套多重选择语句(switch语句)无条件转移语句(goto语句)本章小结 例3.7求一元二次方程的根1、算法分析:2、数据结构:由于问题简单,只需用到一些单精度实数 3、伪代码输入方程系数a,b,c计算判别式d=b*b-4*a*cif判别式大于等于0then{计算两个实根定位输出光标打印结果}else{计算实部计算虚部定位输出光标打印结果}endprogram 4、源程序清单//exam37.c#include#includemain(){floata,b,d,c,x1,x2,p,q;printf(“输入方程系数:”);scanf(“%f,%f,%f”,&a,&b,&c);d=b*b-4*a*c;if(d>=0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf(“x1=%f,x2=%f ”,x1,x2);}else{p=-b/(2*a);q=sqrt(-d)/(2*a);printf(“x1=%f+i%f,x2=%f-i%f ”,p,q,p,q);}}求平方根的函数关系运算符 例3.8商店售货,按购买货物款的多少分别给予不同的优惠折扣,编程计算实际应付货款。购货不足250元,没有折扣;购货250元(含250元,下同),不足500元,减价5%;购货500元,不足1000元,减价7.5%;购货1000元,不足2000元,减价10%;购货2000元及以上,减价15%;1、算法分析:设购物款为M,折扣为D,则D可表示为:D=0(M〈250)D=0.05(250≦M<500)D=0.075(500≦M<1000)D=0.1(1000≦M<2000)D=0.15(2000≦M) 2、源程序清单//exam38.c#includemain(){floatm,d,t;printf(“请输入购物金额:”);scanf(“%f”,&m);if(m<250)d=0;if(m>=250&&m<500)d=0.05;if(m>=500&&m<1000)d=0.075;if(m>=1000&&m<2000)d=0.1;if(m>=2000)d=0.15;t=m*(1-d);//计算应付款printf(“实际应付款:%f”,t);}输入购物款:249实际应付款:249输入购物款:500实际应付款:462.5 例3.9购物折扣程序的另一个写法改写后,程序更清晰,执行时间更省。//exam39.c#includemain(){floatm,d,t;printf(“请输入购物金额:”);scanf(“%f”,&m);if(m<250)d=0;elseif(m>=250&&m<500)d=0.05;elseif(m>=500&&m<1000)d=0.075;elseif(m>=1000&&m<2000)d=0.1;elsed=0.15;t=m*(1-d);//应付款printf(“实际应付款:%f ”,t);} 例3.10从键盘输入一字符,如果为Y,则打印是,为N,打印否,其它字符,打印输入错误。//exam310.c#includemain(){chara;printf(“输入一个字符:”);a=getchar();if(a==‘Y’||a==‘N’){if(a==“Y”)printf(“是! ”);elseprintf(“否! ”);}elseprintf(“输入数据不合要求! ”);} #includemain(){intx,y,z;printf(“Iputx,y,z:”);scanf(“%d,%d,%d”,&x,&y,&z);if(x>0){if(y>0)if(z>0)printf(“所有数据大于零!”);elseprintf(“只有X,Y大于零!”);}elseif(x==0){if(y==0)if(z==0)printf(“所有数据都为零!”);elseprintf(“只有X,Y等于零!”);}elseprintf(“X小于零!”);}例3.11嵌套不能太深,一般以三层为限,嵌套太深,容易出错。嵌套演示程序 //exam311a.c#includemain(){intx,y,z;printf(“Iputx,y,x:”);scanf(“%d,%d,%d”,&x,&y,&z);if(x>0&&y>0&&z>0)printf(“所有数据大于零! ”);elseif(x>0&&y>0)printf(“只有X,Y大于零! ”);elseif(x==0&&y==0&&z==0)printf(“所有数据都为零! ”);elseif(x==0&&y==0)printf(“只有X,Y等于零! ”);elseif(x<0)printf(“X小于零! ”);}利用逻辑表达式将例3.5改写,改写后程序的结构要清晰得多。 例3.12将输入的字母转化为小写字母。1算法分析在计算机中,处理英文字母,其实是处理它的ASCII码值。将大写字母变成小写字母,就是将大写字母的ASCII码值变为相应的小写字母的ASCII码值。大写字母的ASCII值比小写字母的ASCII值小32,故将相应字母的ASCII值加32就变成了小写字母。程序设计时,要注意如果输入的不是大写的字母,则不用转换。 //exam312a.c//将输入的大写字母变成小写#includemain(){charch;printf(“请输入一个大写英文字母:”);scanf(“%c”,&ch);if(ch>=‘A’&&ch<=‘Z’)ch=ch+32;printf(“小写字母为:%c ”,ch);}2源程序代码之一 //exam312b.c#includemain(){charch;scanf(“%c”,&ch);ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;printf(“%c ”,ch);}注意:1条件运算符优先于赋值运算符,低于关系运算符;2条件运算符的结合方向为“自右至左”a>b?a:c>d?c:da>b?a:(c>d?c:d)此处使用了条件运算符3源程序代码之二 #includemain(){inti;printf(“输入数字1-7:”);scanf(“%d”,&i);if(i==1)printf(“TodayisMonday! ”);elseif(i==2)printf(“TodayisTuesday! ”);elseif(i==3)printf(“TodayisWednesday! ”);elseif(i==4)printf(“TodayisThursday! ”);elseif(i==5)printf(“TodayisFriday! ”);elseif(i==6)printf(“TodayisSaturday! ”);elseprintf(“TodayisSunday! ”);}例3.13入星期中的某一天,显示对应的英文此例似显复杂,是否有更好的办法? main(){inti;printf(“输入数字1-7:”);scanf(“%d”,&i);switch(i){case1:printf(“TodayisMonday!”);break;case2:printf(“TodayisTuesday!”);break;case3:printf(“TodayisWednesday!”);break;case4:printf(“TodayisThursday!”);break;case5:printf(“TodayisFriday!”);break;case6:printf(“TodayisSaturday!”);break;default:printf(“TodayisSunday!”);}}例3.14用switch语句重写打印星期程序。main(){intI;printf(“输入数字1-7:”);scanf(“%d”,&i);if(i==1)printf(“TodayisMonday!”);elseif(i==2)printf(“TodayisTuesday!”);elseif(i=3)printf(“TodayisWednesday!”);elseif(i==4)printf(“TodayisThursday!”);elseif(i==5)printf(“TodayisFriday!”);elseif(i==6)printf(“TodayisSaturday!”);elseprintf(“TodayisSunday!”);} 例3.15用switch语句重写例3.4的程序main(){chara;printf(“输入一个字符:”);a=getchar();if(a==“Y”||a==“N”)if(a==“Y”)printf(“是 ”);elseprintf(“否 ”);elseprintf(“字符不合要求! ”)}显然,改写后的程序更清晰,更简短。//exam315.c#includemain(){chara;printf(“输入字符:”);a=getchar();switch(a){case‘Y’:printf(“是 ”);break;case‘N’:printf(“否 ”);break;default:printf(“字符不合要求! ”);}} 例3.16在屏幕上显示菜单分析:程序首先在屏幕上将功能显示出来,用户根据需要选择相应的功能,程序根据用户的选择执行相应的程序段。对于这类程序,往往是用户输入一个英文字母,然后程序根据字母来断别程序该执行什么程序段,故一般用switch语句比较方便。 2源程序清单switch(a){case'i':printf(“调用输入模块! ”);break;case'o':printf(“调用输出模块! ”);break;case'l':printf(“调用查找模块! ”);break;case‘q':printf(“调用退出模块! ”);break;}}//exam316.c#includemain(){chara;printf(“请选择:”);printf(“输入i”);printf(“输出o”);printf(“找出最长的单词l”);printf(“退出q”);a=getchar();执行选项时,要调用相应的模块(程序段)。由于现在还没有相应的程序,暂用一条打印语句代替。以后会用相应程序代替 例3.17统计某班级中计算机课程中考试成绩高于80分的人数。假设学生人数为10(结束程序,按Ctrl+Break组合键)//exam317.c#includemain(){inti=0,fs,j=0;Loop:scanf(“%d”,&fs);j++;//统计已读入的数据个数if(fs>80){i++;printf(“%d,%d”,i,fs);}if(j<10)//当数据没读完时,继续gotoLoop;} 本章小结1、分支结构:改变程序的执行流程,或有选择地执行程序;2、if~else和switch是结构化语句,而goto语句不是;3、块if语句可以取代所有的分支结构,而多重分支结构不可;4、块if语句中的条件可以是复杂逻辑表达式,而多重分支中的条件只能是简单表达式;5、块if与goto语句结合,可以构造任何复杂的循环,但用专门的循环语句更方便。 作业编写程序,接受用户输入的整数,如果是奇数,则乘3加1后输出结果,是偶数,则除2后输出结果。已知2006年的12月1日是星期五,编写程序,接受用户输入的1-31间的整数,判断是星期几,打印出结果。将上题的结果按如下格式输出:Calendar2006-12-------------------------------------SuMoTuWuThFrSa-------------------------------------31------------------------------------- 作业(续)接受用户输入的年份和月份,判断是否是闰年,输出该月的天数(用switch语句实现)。