C语言项目开发教程PPT第2章.ppt

上传人:tia****nde 文档编号:11495497 上传时间:2020-04-25 格式:PPT 页数:86 大小:328KB
返回 下载 相关 举报
C语言项目开发教程PPT第2章.ppt_第1页
第1页 / 共86页
C语言项目开发教程PPT第2章.ppt_第2页
第2页 / 共86页
C语言项目开发教程PPT第2章.ppt_第3页
第3页 / 共86页
点击查看更多>>
资源描述
第2章,程序控制结构,算法的实现过程是由一些列操作组成的,这些操作之间的执行次序就是程序的控制结构。结构化程序设计方法强调使用的基本结构是顺序、选择和循环3种控制流程,任何简单或复杂的算法都可以由它们组合而成。一般情况下,程序中的代码按其出现的顺序依次执行,这叫做“顺序执行”。顺序结构是程序设计中最简单、最常用的基本结构。选择结构程序不是按照语句的顺序依次执行,而是根据给定的条件成立与否,决定下一步选取哪条执行路径。选择结构的特点是:在各种可能的操作分支中,根据所给定的选择条件是否成立,来决定执行某一分支的相应操作,而且在任何情况下,无论分支多少,仅选其一。算法中有时需要反复执行某一特定操作,循环控制就是由特定的条件决定某些语句重复执行的控制方式。由于顺序结构比较常见,本章中着注重介绍选择控制结构和循环控制结构的语法规则、语句的使用和程序执行流程等知识。,任务2.1测身高,任务目标掌握关系运算符和关系表达式的概念和用法。掌握逻辑运算符和逻辑表达式的概念和用法。掌握条件运算符和条件表达式的概念和用法。掌握if分支语句的用法,包括单分支语句、双分支语句以及多分支语句。掌握switch分支语句的用法。完成测身高程序。,2.1.1控制语句中的运算符和表达式1关系运算符和关系表达式,关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断比较的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为“真”(即“条件满足”),用值1表示;如果a的值为2,不满足“a3”条件,则关系表达式的值为“假”,用数值0表示。C语言中提供6种不同的关系运算符,简单介绍如表2-1所示。表2-1关系运算符运算符名称运算规则运算对象运算结果举例表达式值大于a=2;b=3;ab;0=大于等于a=2;b=3;a=b;0=等于a=2;b=3;a=b;0!=不等于a=2;b=3;a!=b;1当多种运算符在一个表达式中同时使用时,要注意运算符的优先级,防止记错运算符优先级的最好方法是添加圆括号。关系运算符的优先级关系如下:,(1)前4种关系运算符(,=)的优先级别相同,后两种也相同。前4种高于后2种。例如,“”优先于“=”。而“”与“a+b等效于c(a+b)。ab!=c等效于(ab)!=c。a=bc等效于a=(bc)。,【案例2-1】关系表达式。#includevoidmain()inta,b,c,x,y;a=1,b=2,c=3;x=ab;y=a=c);printf(%dn,a=b!=2);printf(%dn,a+54);printf(%dn,a!=b!=c);程序运行结果如下:0,111011注意,要区分关系运算符“=”和赋值运算符“=”。,【案例2-2】运算符“=”和“=”的区分。#includevoidmain()inta=3,b=2,c1,c2;c1=(a=b);printf(a=%d,b=%d,c1=%dn,a,b,c1);c2=(a=b);printf(a=%d,b=%d,c2=%dn,a,b,c2);程序运行结果如下:a=2,b=2,c1=2a=2,b=2,c2=1“=”为赋值操作,其结果为将右边表达式的值赋给左边变量,会改变左边变量的值,而“=”为关系表达式,用来判断左右两边表达式的值是否相同,相同时表达式结果为1,不同时为0,不会改变左右两边表达式的值。,2逻辑运算符和逻辑表达式,当判断条件有多个时,只执行一个判断并不足以确定程序执行流程,而是需要同时执行多个比较并综合多个比较结果来进行判断,这时就需要用到逻辑运算和逻辑表达式。C语言提供三种逻辑运算符,这几种运算符的简单介绍如表2-2所示。表2-2逻辑运算符运算符名称运算规则运算对象运算结果举例表达式值!非逻辑非(NOT)数字、整型或实数型逻辑值1或0a=1;!a0a|b1“其执行结果为将a和b中较大的值赋值给max。条件运算符优先级高于赋值、逗号运算符,低于其他运算符。例如:m=10a=5;b=7;c=12;d=4;max=(ab?a:b);max=(maxc?max:c);max=(maxd?max:d);printf(Themaximalnumberis%d.n,max);程序运行结果如下:Themaximalnumberis12.,2.1.2if语句,if语句是C语言中最简单的流程控制语句,if语句的作用是判断多给定的条件是否满足,根据条件判定结果(真或假)来决定执行什么操作。其基本语法为:if(布尔表达式)代码段其含义是,如果布尔表达式的值为真,则继续执行下面的代码段,否则跳过这个代码段,执行后面的语句。布尔表达式可以为常量、变量、关系表达式或逻辑表达式。代码段可以是一条语句或多条语句,如果只有一条语句,则可以省略大括号。C语言的if语句有三种基本形式。,1单分支if语句,if(表达式)语句段这是if语句最简单的一种形式。它根据表达式的值进行判定,以决定是否执行某个程序片段。单分支if语句的执行流程如图2-1所示。图2-1单分支if语句执行流程图,【案例2-5】数字排序。#includevoidmain()inta,b,c,t;printf(请输入三个整数:);scanf(%d%d%d,该程序的运行结果如下:请输入三个整数:497a=4,b=3,c=7排序后结果为:a=3,b=4,c=7,2双分支if语句,双分支if语句的一般形式为:if(布尔表达式)代码段else代码段根据布尔表达式判定选择哪个分支执行。如果表达式值为真,则执行if分支语句组;如果为假,则执行else分支语句。if-else语句的执行流程如图2-2所示。图2-2双分支if语句执行流程图,【案例2-6】三角形判定。#includevoidmain()inta,b,c;printf(请输入三角形的三条边:);scanf(%d%d%d,分别输入正确的边和错误的边,程序运行结果如下:请输入三角形的三条边:023a=0,b=2,c=3两边之和小于第三边或有边为0,不构成三角形请输入三角形的三条边:123a=1,b=2,c=3两边之和小于第三边或有边为0,不构成三角形请输入三角形的三条边:234a=2,b=3,c=4可以构成三角形,3多分支if语句,多重分支if语句的一般形式为:if(布尔表达式1)代码段1elseif(布尔表达式2)代码段2elseif(布尔表达式n-1)代码段n-1else代码段n前面所给的两种形式的if语句一般适用于对判定结果做出两种选择的情况,即有两个分支。但是实际情况往往比较复杂,常常会出现多个分支的情况,此时就可以采用第三种形式的if分支语句。其执行过程为:依次判断表达式的值,当某个表达式的值为真时,则执行对应的语句,然后跳转到整个if语句之外的语句执行;如果所有的表达式都为假,则执行else语句对应的程序段,然后继续执行整个程序。,【案例2-7】编写C语言程序,从键盘上输入一个字符,识别输入的字符类型:大写字母、小写字母、数字或其他类型。#includevoidmain()charc;printf(请输入一个字符:);scanf(%c,依次输入一个数字、一个大写字母、一个小写字母和一个其他字符,程序运行结果如下:请输入一个字符:5您输入的字符为5,这是一个数字请输入一个字符:t您输入的字符为t,这是一个小写字母请输入一个字符:E您输入的字符为E,这是一个大写字母请输入一个字符:!您输入的字符为!,这是一个其他字符在多重if语句中,要注意各个表达式所表示的条件必须是互相排斥的。也就是说,只有表达式1不满足时才会判断表达式2,而当表达式2不满足时才会判断表达式3,其余依次类推,只有所有表达式均不满足时才执行最后的else语句。也就是说,在所有的条件表达式中,应该只有一个条件表达式是为真的,并执行器对应的代码段;其余表达式均为假,所对应的代码段均不执行。,【案例2-8】成绩等级判定。编写程序,让用户输入一个在0100以内的学生考试成绩(整数),要求计算机判定并输入成绩等级:90分以上为优秀;8089分为良好;7079分为中等;6069分为及格,60分以下为不合格。#includevoidmain()intscore;printf(请输入学生成绩(0100):);scanf(%d,程序运行结果如下:请输入学生成绩(0100):34您的成绩不合格请输入学生成绩(0100):87您的成绩为良好请输入学生成绩(0100):104输入数据不合法,2.1.3switch语句,用if嵌套的语句处理多层次的情况分支太多,程序冗长而且可读性低,C语言提供switch语句直接处理多分支选择。switch的一般形式如下:switch(表达式)case常量表达式1:代码段1;break;case常量表达式2:代码段2;break;case常量表达式n:代码段n;break;default:代码段n+1switch语句根据一个表达式的值选择要执行的代码片段,其流程图和if-else-if语句类似。其执行过程为:先计算表达式的值,然后逐个与case之后的常量比较,当表达式的值和某个常量的值相等时,执行对应常量后面的语句组。如果表达式的值和所有常量的值均不相等,则执行default之后的代码段,如果没有default,则什么也不执行,直接执行后续代码。,switch之后的表达式,可以是整形表达式、字符型表达式或枚举型表达式。每一个case之后的值都要相互不同。当表达式的值和一个case的值相等时,则执行该case后的代码段,后续其他case则不再进行比较,所以代码段之后一定要加一个break,表示跳转到switch之后的语句,如果不加,则会出现异常错误,最后一个分支可以不加break。多个case可以共用一组执行语句,如:switch(week)case1:case2:case3:case4:case5:printf(“工作日”);case6:case7:printf(“假期”);default:printf(“输入错误”);用switch语句,同样可以实现成绩等级判定程序。,【案例2-9】成绩等级判定2。#includevoidmain()intscore;printf(请输入学生成绩(0100):);scanf(%d,分别输入各个等级的数据,程序运行结果如下:请输入学生成绩(0100):62您的成绩为合格请输入学生成绩(0100):3您的成绩为不合格请输入学生成绩(0100):94您的成绩为优秀请输入学生成绩(0100):104您的成绩为优秀请输入学生成绩(0100):72您的成绩为中等,2.1.4任务实现,1问题描述每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。设faHeight为其父身高,moHeight为其母身高,身高预测公式为:男性成人时身高=(faHeight+moHeight)0.54cm女性成人时身高=(faHeight0.923+moHeight)/2cm此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。编程从键盘输入用户的性别、父母身高、是否喜爱体育锻炼、是否有良好的饮食习惯等条件,利用给定公式和身高预测方法对孩子的身高进行预测。,2要点解析,要计算孩子的身高,首先要确定计算表达式。而身高的计算公式是由父母身高、性别、饮食习惯和体育锻炼相关的,所以要根据特定的条件选择来确定身高表达式,这就要用到选择控制结构。最常用的选择控制语句为if语句,本案例中选择if语句来实现这一功能。程序具体流程为:输入父母身高;确定孩子性别;选择是否经常锻炼;选择是否有良好的饮食习惯;确定身高计算公式;计算身高并输出。程序中用到的变量有:faHeight和moHeightfloat类型,分别表示孩子父母的身高。sexchar类型,用来表示孩子的性别,输入字符M表示男性,F表示女性。sportchar类型,用来表示是否喜欢体育锻炼,输入字符Y表示经常体育锻炼,N表示不经常体育锻炼。dietchar类型,用来表示是否有良好的饮食习惯,输入字符Y表示有良好的饮食习惯,N则为没有。,3程序实现,程序具体实现过程如下:#includevoidmain()floatfaHeight,moHeight,height;charsex,sport,diet;printf(请分别输入父母的身高,以cm为单位:);scanf(%f%f,if(sport=Y|sport=y),height=height*(1+0.02);printf(是否有良好的饮食习惯,Y表示是,N表示否:);fflush(stdin);scanf(%c,程序运行结果如下:请分别输入父母的身高,以cm为单位:180163180.000000163.000000请输入孩子的性别,M表示男性,F表示女性:f是否经常进行体育锻炼,Y表示是,N表示否:y是否有良好的饮食习惯,Y表示是,N表示否:n预测的孩子的身高为:170.379,任务2.2学生信息管理系统之成绩统计,任务目标了解循环控制结构的概念。掌握for循环语句的用法。掌握while循环语句的用法。掌握do-while循环语句的用法。完成学生信息统计任务。,2.2.1for循环,for语句是C语言所提供的功能更强、使用更广泛的一种循环语句。for语句的一般形式为:for(表达式1;表达式2;表达式3)循环语句其中,表达式1:通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2:通常是循环条件,一般为关系表达式或逻辑表达式。表达式3:通常可用来修改循环变量的值,一般是赋值语句。这3个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。省略表达式时,表达式之间的逗号不能省略。循环语句在条件满足的时候重复执行。,for语句的执行过程如下:首先计算表达式1的值。再计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环。计算表达式3的值,然后转回到表达式2重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for语句的执行过程如图2-3所示。图2-3for循环流程图,【案例2-10】从键盘输入一个正整数n,求1,2,3,n之和并输出结果。该程序显然应该用的循环结构,读取n之后,求n个数之和,设置循环变量,计算循环次数,当计算次数小于等于n时执行循环体,大于n时结束。源程序如下:#includevoidmain()intn=0,sum=0;/初始时n为0,和sum为0printf(请输入整数n:);scanf(%d,程序运行结果如下:请输入整数n:51到5之和为15Pressanykeytocontinue该程序中for循环中首先执行表达式1,将i赋值为1,然后每次判断i的值决定是否继续循环,每次执行循环体之后i的值加1。当i的值超过n之后,循环结束。,【案例2-11】输出菲波那契(Fibonacci)数列的前40个数,每行5个。斐波那契数列的性质为:第一个数为1,第二个数为1,其余每个数为其前面两个数之和。即:f(1)=1n=1f(2)=1n=2f(n)=f(n-1)+f(n+1)n=3#include#defineN40voidmain()intf,f1,f2;f1=1;f2=1;inti;printf(Fibonacci的前%d项为:n,N);printf(%10d%10d,f1,f2);for(;i=N;i+)f=f1+f2;/生成新的Fibonacci数printf(%10d,f);if(i%5=0)printf(n);f1=f2;/重新设置f1和f2f2=f;,程序运行结果如下:Fibonacci的前40项为:1123581321345589144233377610987159725844181676510946177112865746368750251213931964183178115142298320401346269217830935245785702887922746514930352241578173908816963245986102334155本例的for语句中,表达式1已省去,循环变量的初值在for语句之前已经定义。for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式)省去了表达式1,for(表达式;表达式)省去了表达式2。for(表达式;表达式;)省去了表达式3,for(;)省去了全部表达式。,注意:上述程序中用“#defineN40”,即以常量的形式定义N的值而不是在main函数中声明,这是一个很好的编程习惯。如果要改变输出数字的个数,如改为输出斐波那契数列的前30项,则只要在define语句中修改即可,而不需要改变循环体中语句。这在程序规模很大、变量在多处都被使用时尤其重要。除了表达式以外,循环体也可以是空语句。如:intn=0;printf(inputastring:n);for(;getchar()!=n;n+);printf(%d,n);本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样,就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。,【案例2-12】分别输出1100之间的奇数和偶数。#include#defineN100voidmain()inti;printf(1100之间的奇数有:n);for(i=1;i=100;i=i+2)printf(%5dt,i);printf(n);printf(1100之间的偶数有:n);for(i=2;i=100;i=i+2)printf(%5dt,i);,程序运行结果如下:1100之间的奇数有:135791113151719212325272931333537394143454749515355575961636567697173757779818385878991939597991100之间的偶数有:2468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100,2.2.2while循环,while循环的一般形式如下:while(表达式)语句组其中,表达式描述循环的条件,语句组为循环体,描述要反复执行的操作。while语句的执行过程为:先计算表达式的值,如果表达式的值为真,则循环条件成立,执行循环体,直到表达式不成立为止。因此,while循环又称当型循环,表示当条件成立即循环执行,适用于循环次数不确定时。图2-4while循环流程图while语句的特点是:先判断,再执行。如果表达式一开始就不成立,则循环体一次也不执行。while语句的执行流程如图2-4所示。,注意循环条件的编辑问题,即循环的初值和终值有没有被多计算或少计算,如while(i10)和while(i=10)相比,循环体执行的次数不同。循环条件的设置非常重要,否则可能会导致死循环。例如,当循环条件为永真时,则循环体就会无休止地重复执行,出现死循环。例如:while(1),若执行该段程序,则循环条件永远满足,循环体不断重复执行,直到强制关闭程序为止。死循环会大量占用系统资源,在编程过程中一定要注意。循环体中必须有改变循环条件的语句,否则也会导致死循环。例如,i初始值为1,循环条件为while(i5),若循环体中并没有改变i值的操作,则该条件一直可以满足,同样会导致死循环。当然,也可以在循环体中添加其他语句来终止循环。读者可以尝试自己编写一个死循环程序,观察程序运行结果。,【案例2-13】用while语句实现输出1100以内的所有奇数和偶数。#include#defineN100voidmain()inti;printf(1100之间的奇数有:n);i=1;while(i=N)printf(%5dt,i);i=i+2;printf(n);printf(1100之间的偶数有:n);i=2;while(i=N)printf(%5dt,i);i=i+2;,程序运行结果如下:1100之间的奇数有:135791113151719212325272931333537394143454749515355575961636567697173757779818385878991939597991100之间的偶数有:2468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100通过案例2-13可以看出,for循环语句和while循环语句在大部分情况下可以互换使用,但是在某些情况下,比较适合用while语句而不适合用for。比如案例2-14。,【案例2-14】从键盘输入一系列数字,求其平均数。由于数字的个数是不确定的,所以无法设置for循环中的循环条件,因此也不能用for循环来实现这一功能。用户不断地输入数据,直到输入-999为止,表示没有新的数据。用while实现这一功能,源程序如下:#include#defineN100voidmain()floatnum=0,sum=0,average;/分别存储读入的数据、数据总和和平均值inti=0;/数据个数printf(请输入数据:);scanf(%f,程序执行结果如下:请输入数据:4请输入数据:5请输入数据:6请输入数据:-5请输入数据:-999输入结束,共输入4个数据,平均值为2.50,2.2.3do-while循环,do-while语句的一般形式为:do语句组while(表达式);do-while语句和while语句类型,其执行过程为:先执行循环体一次,然后计算表达式的值,如果表达式的值为真,则循环条件成立,重复执行循环体;若表达式的值为假,则退出循环,转而执行循环语句之后的语句。图2-5do-while语句流程图do-while的执行流程如图2-5所示。do-while为“直到型”,即重复执行循环体,直到条件不满足为止。do-while和while的区别如下:,(1)do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。(2)在while语句中,表达式之后不能加分号,而在do-while中表达式的后面必须加分号。与while类似,循环条件的设置很重要,否则会导致死循环。同样,循环体中必须有改变循环条件的语句。,【案例2-15】求一个正整数各位数字之和。#includevoidmain()intnum,i=0;printf(请输入一个正整数:);scanf(%d,该程序运行结果如下:请输入一个正整数:345各位数字之和为:12通过案例2-15,可以看出三种循环结构的区别和联系:,(1)for和while循环都是在执行循环体之前先判断循环条件,循环体中的语句可能执行也可能不执行;而do-while循环是先执行循环体再判断循环条件,循环体中的语句至少执行一次。(2)在选择循环结构时,如果循环次数已知,则选for循环;如果循环次数未知,则选while循环;若需要至少执行一次循环体,则选择do-while循环。(3)三种循环体可以相互替换。,【案例2-16】分别使用for、while、do-while语句实现同一功能:输出0100之间能被3整除的数。源程序如下:/for循环#include#defineN100voidmain()for(inti=1;i#defineN100voidmain(),inti=1;while(i#defineN100voidmain()inti=1;doif(i%3=0)printf(%5d,i);i+;while(imax)max=score;/计算学生最高成绩if(score=90)excellent+;/统计优秀学生人数,printf(请输入学生成绩:);/获取每一个学生成绩scanf(%f,输入学生成绩信息,执行结果如下:,请输入学生成绩:74请输入学生成绩:25请输入学生成绩:68请输入学生成绩:96请输入学生成绩:93请输入学生成绩:95请输入学生成绩:83请输入学生成绩:59请输入学生成绩:73请输入学生成绩:77请输入学生成绩:-1输入的学生人数为:10学生平均成绩为:74.3学生成绩最高分为:96.0学生成绩最低分为:25.0不及格学生数目为:2优秀的学生数目为:3,任务2.3猜价格游戏,任务目标掌握break语句的用法。掌握continue语句的用法。掌握循环嵌套语句和分析嵌套语句的用法。完成猜价格游戏程序。2.3.1break和continue语句在程序控制中,有时还需要在结构中改变程序的执行,比如在switch语句中,使用了break。为了能更灵活地控制循环结构,C语言提供了continue和break语句,用来实现程序的跳转执行。,1break语句,break语句通常用在循环语句和switch语句中,这里介绍break在循环结构中的使用方法。Break的一般形式为:break;当break语句用于for、while、do-while语句中时,可以使程序终止break所在层的循环,即跳出当前循环,转而执行当前循环之后的语句。通常break语句总是和if语句连在一起,即满足某一条件时跳出循环。例如:for(i=0;i=100;i+)if(i=1)break;/跳出for语句printf(%d,i);执行这段代码,输出结果为1。break语句对if-else的条件语句不起作用。在多层循环中,一个break语句只向外跳一层。break语句还可以用作循环结束的条件,如在while循环中,如果表达式为永真,如while(1),则可以在循环语句中用break来结束循环。,【案例2-17】读取一系列正整数,求其最大值。由于实现不知道正整数的个数,所以选择while循环来实现,当用户输入“-1”时表示输入结束。#includevoidmain()intnum,max=0;inti=1;printf(请输入数据,以-1结束:n);while(1)scanf(%d,程序运行结果如下:请输入数据,以-1结束:34562673522234-1最大值为:234,2continue语句,continue的一般形式为:continue;continue的作用为跳过循环体中剩余的语句而执行下一次循环,continue语句只能用在for、while和do-while循环体中,通常和if语句一起使用。注意break和continue的区别。break语句用于终止最近的循环或它所在的switch语句,控制传递给终止语句后面的语句(如果有的话)。而continue语句将控制权传递给它所在循环语句的下一次循环中。比如:for(i=0;i=100;i+)if(i=1)continue;/跳过i=1的循环,直接执行i=2的情况printf(%d,i);,【案例2-18】统计学生成绩及格人数。依次输入10个成绩,打印其中及格的成绩,并统计及格人数。#includevoidmain()intnum=0,score;printf(请输入10个学生成绩,以逗号隔开:n);for(inti=1;i=10;i+)scanf(%d,程序执行结果如下:请输入10个学生成绩,以逗号隔开:77,52,68,60,44,46,89,26,90,7477,68,60,89,90,74,及格人数为:6,2.3.2循环的嵌套,循环是允许嵌套的,当一个循环体内又包含另一个完整的循环结构时,成为多重循环或者循环的嵌套。下面介绍几种循环嵌套结构。if语句中又包含其他if语句,称为if语句的嵌套。在if嵌套语句中,一定要注意if和else的配对问题。当if和else出现比较多时,容易混淆,因此要注意if和else的配对规则:else总是与它上面的、最近的、同一复合语句中的、为配对的if语句配对。如if-if-else-if-else-if-if-if-else-else的语法结构为:ififelseifelseifififelseelse当if和else数目不同时,可以添加来确定配对关系。例如:Ififelseif对于很多结构复杂的程序来说,单纯的if语句或while语句不足以实现其功能,这时需要复杂的循环嵌套,即在if语句中包含while语句或在while语句中包含if语句。,【案例2-19】求两个数的最大公约数和最小公倍数。求最大公约数和最小公倍数的方法为辗转相除法:(1)以其中一个数作被除数,另一个数作除数,相除求余数。(2)若余数不为0,则以上一次的除数作为新的被除数,以上一次的余数作为新的除数,继续求余数。(3)直至余数为0时,对应的除数就是最大公约数。然后在根据最大公约数求最小公倍数。用while循环语句求最大公约数和最小公倍数,源程序如下:#includevoidmain()intm,n,r,g,h,p;printf(请输入两个正整数:);scanf(%d%d,也可以不用辗转相除法,而是用for循环语句来实现这一程序:#includevoidmain()intm,n,g,h,i;printf(请输入两个正整数:);scanf(%d%d,程序运行结果如下:请输入两个正整数:35最大公约数为1,最小公倍数为15请输入两个正整数:1218最大公约数为6,最小公倍数为36请输入两个正整数:945最大公约数为9,最小公倍数为45应注意循环嵌套时break的用法。break的作用为跳出当前循环,而继续执行该循环以外的代码。例如:inti,j,a=0;for(j=0;j=3;j+)for(i=0;i=2;i+)if(i=1)break;/跳出for语句a+;printf(%d,a);内层for循环中当i等于1时,跳出当前for语句,继续执行外层for循环。外层for循环语句共重复执行4次,每次都执行一遍内层for循环语句。而内层for循环语句每次重复3次,i=1的时候跳过执行a+。所以执行该程序段后输出a的值为8。,【案例2-20】输出0100以内的素数。#include#defineN100intmain()intnum=0;inti,j;printf(0100以内的素数有:n);for(i=2;i=i)printf(%5d,i);num+;if(num%5=0)printf(n);printf(n);printf(共有%d个素数n,num);return0;程序运行结果如下:,程序运行结果如下:0100以内的素数有:2357111317192329313741434753596167717379838997共有25个素数,【案例2-21】输出杨辉三角形的前10行。在输出杨辉三角形时通常用到两个性质:第一个就是杨辉三角形中除了最外层(不包括杨辉三角底边)的数为1外,其余的数都是它肩上两个数之和。用数组输出杨辉三角就用这个性质。第二个性质是杨辉三角形的第n行恰好是C(n,0)C(n,n)。这里的C表示组合。如杨辉三角形的第一行为1,第二行为11,第三行为121,第四行为1331。这里使用第二个性质输出杨辉三角形。,源程序如下:#include#defineN10voidmain()inti,j,k;intb,c;for(i=0;ii;j-)printf();for(j=0;j=1)for(k=i-j+1;kt_price)printf(猜测价格偏高);elseif(pricet_price)printf(猜测价格偏低);elseprintf(恭喜您猜对了,正确价格为%d!n,price);break;if(time-1=0)printf(n您已经猜了10次,游戏失败!n);elseprintf(,请再试一次n);time-;printf(是否再玩一次,Y表示是,N表示否:);fflush(stdin);scanf(%c,程序已经实现,并且可以直接参与游戏:-欢迎参与猜价格游戏!-请输入猜测价格(1001000):123猜测价格偏低,请再试一次请输入猜测价格(1001000):234猜测价格偏高,请再试一次请输入猜测价格(1001000):345猜测价格偏高,请再试一次请输入猜测价格(1001000):456猜测价格偏高,请再试一次请输入猜测价格(1001000):567猜测价格偏高,请再试一次请输入猜测价格(1001000):678猜测价格偏高,请再试一次请输入猜测价格(1001000):789猜测价格偏高,请再试一次请输入猜测价格(1001000):890猜测价格偏高,请再试一次请输入猜测价格(1001000):765猜测价格偏高,请再试一次请输入猜测价格(1001000):543猜测价格偏高您已经猜了10次,游戏失败!是否再玩一次,Y表示是,N表示否:y,-欢迎参与猜价格游戏!-请输入猜测价格(1001000):500猜测价格偏高,请再试一次请输入猜测价格(1001000):250猜测价格偏高,请再试一次请输入猜测价格(1001000):170猜测价格偏高,请再试一次请输入猜测价格(1001000):135猜测价格偏低,请再试一次请输入猜测价格(1001000):150猜测价格偏高,请再试一次请输入猜测价格(1001000):140猜测价格偏低,请再试一次请输入猜测价格(1001000):141恭喜您猜对了,正确价格为141!是否再玩一次,Y表示是,N表示否:n游戏结束,课后练习,1已有定义语句intx=3,y=0,z=0;,则值为0的表达式是。AxA*B$*C*D*,5有以下程序段,其中x为整型变量,以下选项中叙述正确的是。x=0;while(!x!=0)x=x+1;A退出while循环后,x的值为0B退出while循环后,x的值为1Cwhile的控制表达式是非法的Dwhile循环执行无限次6有以下程序段,其中x为整型变量,以下选项中叙述正确的是。x=-1;do;while(x=x+1);printf(“x=%d”,x);A该循环没有循环体,程序错误B输出x=1C输出x=0D输出x=-1,7有以下程序:main()intx=3;doprintf(“%d”,x=x-2);while(!(x=x-1);程序的输出结果是。A1B30C1-2D死循环8表示“整数x的绝对值大于5”时值为“真”的C语言表达式是。9有以下程序:main()floatx=2.0,y;if(xc?a:c):(b);11有以下程序:main()intx=0,y=0,i;for(i=1;i=i+1)if(i%2=0)x=x+1;continue;if(i%5=0)y=y+1;break;printf(“%d,%d”,x,y);程序的输出结果是:。12有以下程序:main()inti=0;for(i=i+3;i=5;i=i+2)switch(i%5)case0:printf(“*”);case1:printf(“#”);break;case2:printf(“程序的输出结果是:。,13下面程序的输出结果是。main()inti,j=2;for(i=1;i=2*j;i=i+1)switch(i/j)case0:printf(“*”);break;case1:printf(“*”);break;case2:printf(“#”);break;default:break;14计算1100之间的奇数之和以及偶数之和。15输出100以内能被3整除且个位数为9的所有整数。16找出21000之间的全部同构数。同构数是这样一组数:它出现在其平方数的右边,例如,5是25右边的数,25是625右边的数,5和25都是同构数。,17编程将1100之间能被2、3、5整除的数的和求出来并输出。注意,在判断时如果一个数能同时被多个数整除,则要算到多种情况里去。如6既能被2整除,又能被3整除,则要同时算到能被2整除的和能被3整除这两种情况里。18编程序输出11000内的所有素数。所谓素数是指除了能被1和它本身之外不能被其他数整除的数。19编程计算a+aa+aaa+aaaa+.+aa.a(n个a)的值,其中n和a的值由键盘输入。20题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?21编写程序实现,输出n以内的所有素数。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!