003-流程控制与基本算法.ppt_第1页
003-流程控制与基本算法.ppt_第2页
003-流程控制与基本算法.ppt_第3页
003-流程控制与基本算法.ppt_第4页
003-流程控制与基本算法.ppt_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

第四章顺序结构的程序设计,一、数据输出,C中没有专门的输入输出语句,输入输出操作是通过输入、输出函数实现,两个基本的输出函数:字符输出函数putchar格式输出函数printf,4.3数据输出,字符输出函数格式:putchar(字符变量)功能:在标准输出设备上输出指定字符说明:一次调用只能输出一个字符加上分号成为字符输出语句使用时在程序开头用预编译指令,#include,4.3数据输出,格式输出函数格式:printf(格式字符串,输出项表)功能:从标准输出设备上,按指定的格式输出对应的输出项,%d:按十进制整数形式输出%u:按无符号十进制整数形式输出%o:按无符号八进制整数形式输出%x:按无符号十六进制整数形式输出,格式控制串,printf(“Outputx=%dn”,x);,4.3数据输出,%f:输出实数(6位小数)%e:按指数形式输出实数%c:输出单个字符%s:输出一个字符串%ld:按十进制整数形式输出长整型,格式控制串,注意区分:输出位数浮点数实际能表达的有效数字,4.3数据输出,对格式的修饰,%md输出整型数据至少占m个字符位,右对齐%-md输出整型数据至少占m个字符位,左对齐%m.nf输出实型数据至少占m个字符位,小数点后留n位,(对字符串,输出前n个字符),右对齐%-m.nf同上,左对齐,修饰符与数据实际宽度不符时如何处理?,4.3数据输出,例:inta=1234;printf(“%5d”,a);printf(“%3d”,a);floatb=123.45;printf(“%-8.3f”,b);printf(“%6.3f”,b),123.450,4.3数据输出,几点说明:,格式控制串的控制符号与变量表要一一对应,即:类型相同,个数相等格式控制符号之外的符号均照原样显示若需显示百分号,格式为:%如果实际数据所占字符位大于指定的域宽,按实际输出,但小数不会妥协,二、数据输入,字符输入函数,功能:从标准输入设备上读一个字符,getchar(),4.4数据输入,格式输入函数格式:scanf(格式字符串,输入项地址表)功能:按照格式要求,从终端上把数据送到地址参数所指定的内存空间中格式控制符号同printf,要求:类型相同,个数相等,inta,b;scanf(“%d,%d”,doublec;scanf(“%f%f%f”,4.4数据输入,输入时不允许规定精度,可以指定域宽,inta;scanf(“%3d”,floatx;scanf(“%8.2f”,4.4数据输入,遇下列3种情况结束当前数据的输入:,1.换行,Tab,空格2.宽度结束3.非法输入,inta,b;scanf(“%d%d”,输入:1234a为12,b为34,4.4数据输入,例:,main()inta;floatb,c;scanf(“%2d%3f%4f”,输入:12345678987654321,输出?,a=12,b=345.000000,c=6789.000000,注意:scanf、printf设置的格式要与变量类型一致;输入、输出longint要用%ld;输入double要用%lf或%le;(输出可以用%f)可以用%d输出char型,用%c输出int型;但输入,只能%c对char,%d对int;,选择结构的程序设计,第5章选择结构的程序设计,用if语句设计选择结构程序用switch语句设计多分支结构程序应用举例,5.1用if语句设计选择结构程序,if语句的两种基本形式单选择if语句,功能:判断条件为真时执行语句,否则跳过语句,语句格式:if(条件)语句组;,条件可以是关系表达式或逻辑表达式,例:if(ab)x=a;,单选择,5.1用if语句设计选择结构程序,双选择if语句,语句格式:if(条件)语句组1;else语句组2;,功能:判断条件为真时执行语句组1,否则执行语句组2,双选择,例:求a和b两数中较大的一个,main()inta,b,max;printf(Inputaandb=);scanf(“%d%d”,例:求a和b两数中较大的一个只用单选择,main()inta,b,max;printf(Inputaandb=);scanf(%d%d,5.1用if语句设计选择结构程序,if(ab)x=a;elsex=b;,复合语句的表示:if(ab)x=a;printf(“a=%dn”,x);elsex=b;printf(“b=%dn”,x);,if或else只能管辖“一条”语句!,复合语句被视为“一条”语句!,5.1用if语句设计选择结构程序,有关if语句的说明条件后面不加分号语句之后有分号else不是语句,不能单独使用当if后有多个执行语句时,必须用将多个语句括起来,构成一个复合语句,而之外不必有分号。,;是一条语句if();if();,if();else;,else;,5.1用if语句设计选择结构程序,例:从键盘输入被除数a和除数b,求商,intmain()inta,b;printf(Entertwonumbers:);scanf(%d%d,5.1用if语句设计选择结构程序,多选择的if结构,功能:从多组语句中选择满足条件的语句组执行。用elseif实现多选择。,语句格式:if(条件1)语句1;elseif(条件2)语句2;elseif(条件3)语句3;elseif(条件m)语句m;else语句n;,语句1,N,条件1,Y,条件2,条件n,Y,Y,语句2,语句3,语句n,N,N,多选择,例:按分数统计学分,将分数分为五个分数段,分别是:=90、80=90、70=80、60=80)xf=kc*1.2;elseif(fs=70)xf=kc*1.1;elseif(fs=60)xf=kc;elsexf=0.0;printf(“xf=%fn”,xf);,只做其一,5.1用if语句设计选择结构程序,说明在if-else语句中,一般采用“缩进”的书写形式来表示“语句1”或“语句2”所属的层次。注意:缩进仅是一种书写形式,不具有逻辑意义。例:银行存款本金计算:期满总金额=本钱+本钱月息月数,intmain()intyear;floatmoney,rate,total;/*本金月利率本利合计*/printf(Inputmoneyandyear=?);scanf(%f%d,if(year=1)rate=0.0063;elseif(year=2)rate=0.0066;elseif(year=3)rate=0.0069;elseif(year=5)rate=0.0075;elseif(year=8)rate=0.0084;elserate=0.0;,5.1用if语句设计选择结构程序,if语句的嵌套,格式:if(表达式)if(表达式1)语句11;else语句12;elseif(表达式2)语句21;else语句22;,功能:判断表达式的值,若为非0,再判断表达式1的值,非0执行语句11,否则执行语句12;若表达式的值为0,再判断表达式2的值,非0执行语句21,否则执行语句22。,例:下列程序段表示的数学式?y=-1;if(x!=0)if(x0)y=2*sin(x);elsey=0;,程序段表示的数学式1:0(x0),讨论:给第二个if行加后表示的数学式?,程序段表示的数学式2:-1(x0),数学式1程序可表示为:y=-1;if(x!=0)if(x0)y=2*sin(x);elsey=0;,例:比较两个整数之间的关系(大小、相等),intmain()intx,y;printf(EnterintegerXandY:);scanf(%d%d,5.1用if语句设计选择结构程序,嵌套if-else语句的配对关系例:if(ab)/*1*/if(ac)/*2*/if(ad)flag=1;/*3*/elseflag=2;/*4*/elseflag=3;/*5*/匹配规则:在嵌套的if-else语句中,else子句总是与上面的、离它最近的、且在同一复合语句中还没有配对的if子句配对。,例:a=3,b=2,c=4,d=1;flag=?,if(ab)if(ac)if(ad)flag=1;elseflag=2;elseflag=3;当ab)if(ac)if(ad)flag=1;elseflag=2;elseflag=3;当cab时flag=3,5.1用if语句设计选择结构程序,if(y0)x=-y;elsex=y;,(y0)?x=-y:x=y;,等价,等价,x=(y0)?-y:y;,说明:ifelse可以完成与条件运算符(?:)完全相同的任务,并且可以进行相应的转换。,5.1用if语句设计选择结构程序,if语句与条件运算的区别例:,if(s=100)printf(“Perfect!”);elseprintf(“Justsoso.”);,条件运算符的形式比较简单,有较强的灵活性,可以替代部分if语句。,转换:(s=100)?printf(“Perfect!”):printf(“Justsoso.”);,转换:printf(s=100?“Perfect!”:“Justsoso”);,第5章选择结构的程序设计,用if语句设计选择结构程序用switch语句设计多分支结构程序应用举例,switch语句格式,switch(表达式)case常量1:语句序列1break;case常量2:语句序列2break;default:语句序列n+1,5.2用switch语句设计多分支结构程序,switch(number)case1:statement1;break;case2:statement2;break;case3:statement3;break;default:statement4;statement5;,当number的值为2时,5.2用switch语句设计多分支结构程序,几点说明括号内可以是任何表达式,但“取整”;case后的每个常量表达式必须各不相同,而且必须是整型、字符型或枚举型;每个case之后的执行语句可多于一个,不必加;每一个case之后应有一个break(间断语句)以跳出switch()结构;default和case的相对位置是任意的;default子句可以省略。,5.2用switch语句设计多分支结构程序,intmain()intn0=0,n6=0,n7=0,n8=0,n9=0;floatfs;scanf(“%f”,例:统计成绩分布:60分以下,6070,7080,8089,90100。,intmain()intn0=0,n6=0,n7=0,n8=0,n9=0;floatfs;scanf(“%f”,例:统计成绩分布:60分以下,60以上,70以上,80以上,90以上。?,intmain()intn0=0,n6=0,n7=0,n8=0,n9=0;floatfs;scanf(“%f”,例:统计成绩分布:60分以下,60以上,70以上,80以上,90以上。,例:编写一个程序分别完成任意两个数的加减乘除运算。即求:d1opd2的值。,main()floatd1,d2;charop;/*定义操作数、操作符变量*/scanf(“%f%c%f”,第5章选择结构的程序设计,用if语句设计选择结构程序用switch语句设计多分支结构程序应用举例,例:输入年月,计算该月有多少天。,闰年:能够被4整除且不能被100整除的年份或能够被400整除的年份例如:1996年是闰年1900年是平年2000年是闰年判断闰年的C语言公式year%4=0printf(“Enteryear/*处理小月*/,5.5应用举例,case2:/*处理平月*/if(year%4=0)if(days!=0)printf(“%dn”,days);,第六章循环结构的程序设计,6.1循环的基本概念,循环反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。C语言中控制循环的语句:whilefordo_while,6.2while语句,while语句格式while(表达式)语句;说明:语句可是简单语句,也可是复合语句。while语句的执行流程,6.2while语句,执行语句,成立,不成立,执行while循环之后的语句,while(表达式)语句;,例:从键盘输入10个整数,求这10个整数之和程序主体:,输入num,成立,不成立,输出结果total,计数器count=0,累加器total=0,total+=num,count+,开始,结束,while(count10),count+;,scanf(%d,total+=num;,#includeintmain()intcount,num,total;/*count:计数器,num:输入的整数*/count=0;total=0;/*total:存放累加和*/,while(count10)/*循环控制条件*/printf(EntertheNo.%d=,count);/*循环体*/scanf(%d,printf(Total=%dn,total);,例:求n的阶乘n!(1=n=10)程序主体:while(i1时,6.2while语句,#includeintmain()longs=1;/*s:存放累积结果*/inti=1;/*i:计数器,同时是累积的对象*/,while(i=10)/*循环控制条件*/*循环体*/s*=i;/*计算累积和*/i+;,printf(“10!=%dn,s);,以求10!为例,6.2while语句,比较total=0;count=0;while(count10)total+=num;count+;,s=1;i=1;while(i=10)s*=i;i+;,10个数相加,10个数相乘,例:分析程序运行结果,#includeintmain()intn=0;while(n3)printf(“nis%dn”,n);n+;,结果:程序将不停的打印“nis0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:while语句循环体中,一定要有能够对循环控制条件产生影响的语句,避免出现“死循环”现象。,6.2while语句,循环嵌套在循环体中,又包含有循环语句。whilewhile,例:输出下三角形乘法九九表。123456789-12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为j则第i行中一共要输出i个乘积,每一项为i*j。,(1=i=9),(1=j=i),i=6j=5i*j,屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。,61,显示要求屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。伪代码(Pseudocode)while(控制显示n行)while(控制显示一行中的m个字符)输出一个需要的字符;列计数器j+;行数计数器i+;,#includeintmain()inti=1,j;/*i:行计数器j:列计数器*/while(i=9)/*控制打印表头*/printf(%4d,i+);printf(n-n);i=1;while(i=9)j=1;/*列计数器置1*/while(j=i)/*嵌套的二重循环,输出第i行*/printf(%4d,i*j);j+;/*列计数器+1*/printf(n);/*一行输出结束后,输出n*/i+;/*行计数器+1*/,外层循环体执行1次,内层循环要完整执行i次,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,6.3for语句,for语句格式for(表达式1;表达式2;表达式3)语句;说明:语句可是简单语句,也可是复合语句。for语句的执行流程,循环初始条件,循环控制条件,执行语句,成立,不成立,执行for循环之后的语句,执行表达式3,执行表达式1,循环体,for(表达式1;表达式2;表达式3)语句;,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,6.3for语句,#includeintmain()longn=1;inti;,i=1;while(i=10)n*=i;i+;,printf(“10!=%dn,n);,for(i=1;i=10;i+)n*=i;,for语句最常用的形式:for(初值;控制条件;增量)语句;,例:用for语句实现打印乘法九九表#includeintmain()inti,j;for(i=1;i=9;i+)printf(%4d,i);printf(n-n);for(i=1;i=9;i+)for(j=1;j=i;j+)printf(j=i?%4dn:%4d,i*j);,输出函数printf中使用了“?”操作,含义相当于:if(j=i)printf(%4dn,i*j);elseprintf(%4d,i*j);,for语句的变化形式for语句中的三个表达式中的任意一个都是可以省略的,但是分号不能省略。省略表达式2,则:for(表达式1;表达式3)省略表达式1和表达式3,则:for(;表达式2;)据此可得结论:所有用while语句实现的循环都可以用for语句实现。表达式1、2、3全省略,则:for(;),等同于:while(表达式),构成一个死循环,等同于:while(1),语句中的逗号(,)运算逗号(,)运算常见的三种用途是:在变量说明表中用来分隔变量,起分隔符的作用,如:inti,j,k,m3,*p;在函数的参数表中分隔参数。如:printf(n=%d,x=%dn,n,x);在语句中使用。其形式是:表达式n1,表达式n2;用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。,6.3for语句,例:输出下列字符串:azbycxdwevfugthsirjqkplomn分析:奇数位上的字符从a开始逐次递增,偶数位上的字符从z开始逐次递减。#includeintmain()chari,j;/*i:奇位字符j:偶位字符*/for(i=a,j=z;ij;i+,j-)printf(%c%c,i,j);/*输出两个字符*/printf(n);,azbycxdwevfugthsirjqkplomn,6.4do_while语句,do_while语句格式do语句;while(表达式);do_while语句的执行流程,6.4do_while语句,执行语句,成立,不成立,执行while子句之后的语句,循环控制条件,循环体,后判断,do语句;while(表达式);,6.4do_while语句,do_while语句的特点与while和for的区别:do_while语句先执行循环体然后再判断循环控制条件;使用do_while构成的循环,循环体部分至少要执行一次,使用while和for构成的循环,循环体部分有可能一次也不会执行。do_while语句条件表达式后面的分号不是空语句。,6.4do_while语句,#includeintmain()longn=1;inti;,i=1;while(i=10)n*=i;i+;,printf(“10!=%dn,n);,for(i=1;i0),公差为d(d0)。则该数列满足条件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880可以推出,首项a和公差d的取值范围为:1=a=51=d=3可以使用穷举的方法,在首项a和公差d的取值范围内进行判断。,6.5.3goto语句,intmain()inta,x,y,d,i;for(a=1;a=5;+a)/*在a的范围内穷举*/for(d=1;d=3;+d)/*在d的范围内穷举*/x=a+(a+d)+(a+2*d)+(a+3*d);/*前四项的和*/y=a*(a+d)*(a+2*d)*(a+3*d);/*前四项的积*/if(x=26,6.5.3goto语句,intmain()inta,x,y,d,i,flag=1;/*flag:标志变量*/for(a=1;a=3)为求出第N项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第N项的值。,递推法由初始的已知条件开始,先计算出第(N-1)步的结果,再利用已知的前(N-1)项结果,按递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。,程序主体f=f2=1;for(i=3;i=n;i+)f1=f2;f2=f;f=f1+f2;,向前传递前两项f1=f2f2=f,成立,不成立,初始化:f=f2=1,计算f=f1+f2,递推项:i=3,i+,数列对应关系:f1,f2,f,递推计算,f1=f2=1;for(i=3;i=n;i+)f=f1+f2;f1=f2;f2=f;,#includeintmain()longf1,f2,f;inti;for(;)printf(Inputn=?);scanf(%d,6.6循环应用,二、穷举法,例:百钱百鸡问题中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:x+y+z=1005x+3y+z/3=100取值范围:0=x,y,z=100,可以采用穷举法求解:将变量x、y、z的所有取值可能代入方程进行计算,intmain()intx,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100运行结果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=777:cock=12hen=4chicken=84,丢失重要条件:z应该能够被3整除。intmain()intx,y,z,j=0;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84,z+=3),优化程序:for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0,例:新娘和新郎问题:三对情侣参加婚礼,三个新郎为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了其中的三位,听到的回答是这样的:说他将和结婚;说她的未婚夫是;说他将和结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。问题分析与算法设计:设:A、B、C三人用1、2、3表示,将X和A结婚表示为x=1,将Y不与A结婚表示为y!=1。则:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚题意还隐含:x!=y且x!=z且y!=z,intmain()intx,y,z;for(x=1;x=3;x+)/*穷举X的全部可能配偶*/for(y=1;y=3;y+)/*穷举Y的全部可能配偶*/for(z=1;z=3;z+)/*穷举Z的全部可能配偶*/if(x!=1,6.6循环应用,穷举法的关键判断问题是否适合使用穷举法明确穷举的终止条件穷举的对象(变量)的范围注意效率减少尝试次数,求555555的约数中最大的三位数求不超过n的最大素数求首项大于0的等差数列:前四项和为26,前四项的积为880从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。百钱百鸡新娘和新郎其它排列组合问题,6.6循环应用,三、图形问题,例:在一行中输出n个*号。例如,输入n=4,输出的图形如下:*,基本语句:输出一个*号:printf(“*”);或putchar(*);基本算法:1.输入n2.重复输出n个*;3.输出一个n,scanf(“%d”,例:输出边长为n的正方型例如,输入n=4,输出如下图形:*算法分析与设计:1.输入n;2.重复输出n行,每行输出n个*;加细一:1.输入n;2.for(i=1;i=n;i+)输出一行中的n个*;,加细二:1.输入n;2.for(i=1;i=n;i+)输出n个*;换新行;加细三:1.输入n;2.for(i=1;i=n;i+)for(j=1;j=n;j+)printf(“*”);printf(“n”);,整理,得到程序如下:intmain()intm,i,j;scanf(“%d”,j+)/*输出一行中的n个*号*/printf(“*”);printf(“n”);分析方法逐步求精法对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。,例:输出边长为n的平行四边形例如,输入n=4,输出如下图形:*,算法分析与设计:在正方形每行*号的前面先多输出若干个空格。对于第i行,1=i=n,则应先输出个空格。,n-i,intmain()intn,i,j;scanf(“%d”,j+)/*输出一行中的n个*号*/printf(“*”);printf(“n”);,关键在于找出每行要输出的空格和*的个数,j=i,i+j=n+1,*,*,j控制输出i个*,j:i-1个空格,*,*,j:n-i+1个*,j

温馨提示

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

评论

0/150

提交评论