C语言程序设计活页式教程 课件 -03控制程序流程_第1页
C语言程序设计活页式教程 课件 -03控制程序流程_第2页
C语言程序设计活页式教程 课件 -03控制程序流程_第3页
C语言程序设计活页式教程 课件 -03控制程序流程_第4页
C语言程序设计活页式教程 课件 -03控制程序流程_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计活页式教程项目三:控制程序流程项目任务知识目标学习目标任务1:用if判断成绩区间任务2:用switch实现简单计算器任务3:用for找出100以内的素数任务4:用while求一个正整数的逆序数任务5:输出九九乘法表(1)了解C语言的三种程序结构。(2)了解break、continue语句的用法。(3)掌握if语句、switch语句的用法。(4)掌握for语句、while语句、do-while语句的用法。(5)能够设计算法解决问题。任务准备任务实施任务描述任务1用if判断成绩区间任务描述本任务要求用户输入一个百分制的整数成绩,根据成绩的数值判断成绩对应的等级是“不及格”、“及格”、“良好”还是“优秀”。本任务涉及数据的输入输出、逻辑运算符的使用、if语句的使用等。因此,本任务将重点讲解if语句和它的各种变形形式,让学生具备使用if语句处理各类判断的能力。任务准备任务实施Part

1Part

2Part

3任务描述任务准备1.流程图流程图是一个描述程序的控制流程和指令执行情况的有向图,它是程序的一种比较直观的表示形式。常用的流程图符号及其代表的意义如表3-1所示:以闰年的判断为例,如果年份能被4整除但不能被100整除,或者能被400整除,那么该年就是闰年。设计程序时先输入年份y,判断y能不能被4整除。如果y不能被4整除,则输出y不是闰年。如果y能被4整除,再判断y能不能被100整除。如果y能被4整除但不能被100整除,则输出y是闰年;如果y能被4和100同时整除,再判断y能不能被400整除。如果y能被400整除,则输出y是闰年,否则输出y不是闰年。任务准备很显然用文字描述流程会很繁琐,不便于理解和交流,而流程图却可以清晰明了地表达流程。输入年份并判断它是不是闰年的流程图如图3-1所示:图3-1闰年判断流程图开始输入年份y4整除y100整除y400整除y输出y是闰年输出y不是闰年结束是否否是是否任务准备再以求一个正整数的阶乘为例。要求输入一个正整数n,定义变量sum并赋初值为1,定义变量i并让它的值从1递增到n。在变量i递增的过程中,将每一个i的取值都乘到变量sum上,最后sum的值就是1*2*3*…*n,即n的阶乘。求正整数n的阶乘的流程图如图3-2所示:流程图是一种用于表示和理解动态过程的图形工具,它具有概括性和抽象性,有清晰的起点和终点,简单明了、形象直观,便于描述、理解、交流和记录。图3-2求n的阶乘流程图输出出错信息开始结束输入n的值n<0?是i=1,sum=1sum=sum*ii=i+1i>n?输出sum的值否否是任务准备2.if语句if语句用来判定所给定的条件是否满足,根据判定结果的真假决定是否执行给出的语句。C语言用int型数据1代表真,对应条件成立;用int型数据0代表假,对应条件不成立。if语句有单分支、双分支和多分支三种形式,适用于不同的场合。(1)单分支if语句单分支if语句的一般形式如下:if(表达式1){

语句1;}其作用是:当“表达式1”的值为真,即条件成立时,执行大括号中的“语句1”;否则什么都不做。单分支if语句表达的是“如果…就…”的逻辑。当“语句1”只有一句代码时,大括号可以省略不写。“表达式1”一般是一个关系表达式,如if(x>5)表达的是“如果x大于5”。也可以是一个逻辑表达式,如if(x>5&&x<10)表达的是“如果x大于5并且x小于10”。还可以是一些特殊的关系表达式,如if(!x)表达的是“如果x等于0”,而if(x)表达的是“如果x不等于0”。在判断变量x是否大于5且小于10的时候,初学者容易错误地写成“if(5<x<10)”,正确的写法是“if(x>5&&x<10)”。同理,判断变量x是否小于0或者大于100的写法是“if(x<0||x>100)”。任务准备【实例1】要求用户输入一个整数,输出该整数的绝对值。#include<stdio.h>intmain(){ intx; printf("请输入一个整数:"); scanf("%d",&x); if(x<0) x=(-1)*x; /*x乘以-1,变相反数*/ printf("绝对值是:%d",x); return0;}编译运行,分别输入-7、0、9的结果如图3-3所示:只需要用单分支if语句处理x是负数的情况。图3-3求绝对值任务准备(2)双分支if语句双分支if语句的一般形式如下:if(表达式1){

语句1;}else{

语句2;}其作用是:当“表达式1”的值为真,即条件成立时,执行“语句1”,否则执行“语句2”。双分支if语句表达的是“如果…就…,否则…”的逻辑,只会执行“语句1”与“语句2”中的一个。当“语句1”、“语句2”只有一句代码时,大括号可以省略不写。任务准备如果年份能被4整除但不能被100整除,或者能被400整除,那么该年就是闰年。【实例2】要求用户输入一个正整数的年份,判断它是不是闰年并输出结果。intmain(){ inty; printf("请输入正整数年份:"); scanf("%d",&y); if((y%4==0&&y%100!=0)||y%400==0) printf("%d是闰年",y); else printf("%d不是闰年",y); return0;}编译运行,分别输入2004、2010、2400的结果如图3-4所示:图3-4判断闰年任务准备(3)多分支if语句多分支if语句可以根据实际情况添加多组elseif,实现对更多条件的判断。它的一般形式如下,:if(表达式1){

语句1;}elseif(表达式2){

语句2;}…elseif(表达式n){

语句n;}else{

语句n+1;}其作用是:当“表达式1”的值为真,即条件成立时,执行“语句1”。当“表达式1”的值为假时,再判断“表达式2”的值是否为真,以此类推,直到判断“表达式n”的值是否为真。当“表达式1”、“表达式2”…“表达式n”都为假时,最后默认执行else分支下的“语句n+1”。当“语句1”、“语句2”…“语句n+1”只有一句代码时,大括号可以省略不写。对于多分支if语句来说,else分支不是必须的,可以不写。任务准备多分支if语句表达的是“如果…就…,又如果…就…,…,否则…”的逻辑,实现了对多种条件的判断。“语句1”、“语句2”…“语句n+1”只有其中一个会被执行。一般要求“表达式1”、“表达式2”…“表达式n”所表达的条件范围不能交叉,比如下面的代码在语法上并没有错误,但在逻辑上有错,不建议这样写。intx=8;if(x>0){ printf("x大于0");}elseif(x>5){ printf("x大于5");}…上述代码中,条件“x>0”与“x>5”的范围有交叉,满足“x>5”的变量x一定满足“x>0”的条件,可以说“x>0”完全覆盖了“x>5”的范围。因此,语句printf("x大于5")永远不会被执行,这样它所在的elseif分支就失去了意义。任务准备3.条件表达式条件表达式可以看作是双分支if语句的简捷形式,它的一般形式如下:

表达式1?表达式2:表达式3表达式1为关系表达式或逻辑表达式,结果为真或假。如果表达式1为真,则返回表达式2的值,否则返回表达式3的值。在条件表达式中,表达式2和表达式3必须是同种数据类型,否则编译器将会自动进行类型转换。条件表达式通常用在赋值语句的右侧,可以根据条件进行不同的赋值操作。如,求两个整数中的最大值,可以使用以下代码:intx=32;inty=17;intz=(x>y)?x:y;如果x大于y,条件表达式“(x>y)?x:y”返回x的值,否则返回y的值。不管x与y的是怎样的大小关系,该条件表达式都返回它们中的最大值。任务准备任务实施Part

1Part

2Part

3任务描述任务实施【任务1】要求用户输入0~100之间的一个整数成绩,用if判断成绩所对应的等级。成绩在[0,60)区间对应“不及格”,在[60,80)区间对应“及格”,在[80,90)区间对应“良好”,在[90,100]区间对应“优秀”,其它对应“无效的成绩”。1.任务分析本任务考查多分支if语句的和逻辑表达式运用。不同分段的成绩对应不同的等级,在判断成绩score是否位于[0,60)时,千万不要写成数学式子“0≤score<60”,而是用逻辑表达式“score>=0&&score<60”来表示。其它区间的成绩都是“无效的成绩”,可以用else分支来实现。任务实施2.任务实现本任务的实现代码如下,请将代码中空白处补充完整。#include<stdio.h>intmain(){ intscore; printf("请输入一个整数成绩:"); scanf("%d",&score); if(

) printf("不及格"); elseif(

) printf("及格"); elseif(

) printf("良好");图3-5成绩等级 elseif(

) printf("优秀"); else printf("无效的成绩"); return1;}编译运行,分别输入43、95、114的结果如图3-5所示:任务实施3.任务总结如果觉得每个分支的逻辑表达式(如“score>=0&&score<60”)太复杂,还可以采用另一种写法:if(score>100||score<0) printf("无效的成绩"); /*等价于if(score>=90&&score<=100)*/elseif(score>=90) printf("优秀");elseif(score>=80) printf("良好");elseif(score>=60) printf("及格");else printf("不及格");上述代码中,先将大于100或者小于0的成绩判定为“无效的成绩”,接下来再将大于等于90的成绩判定为“优秀”。判断成绩大于等于90的代码是“score>=90”而不用写成“score>=90&&score<=100”,因为“if(score>100||score<0)”已经将大于100或者小于0的成绩范围覆盖,剩下的elseif则是在[0,100]的范围中进行细致划分。所以,“elseif(score>=90)”暗含的意思就是“elseif(score>=90&&score<=100)”。任务准备任务实施任务描述任务2:用switch实现简单计算器任务描述本任务要求用户输入一个类似“3.14+5.23”的简单算式,根据两个操作数中的运算符来决定执行加、减、乘、除中的哪一种运算。本任务涉及数据的输入输出、switch语句的使用等,重点讲解switch语句的结构和语法,同时将switch语句与if语句作对比,让学生具备使用switch语句和if语句处理分支判断的能力。任务准备任务实施Part

1Part

2Part

3任务描述任务准备1.switch语句当程序的分支很多,且分支条件是等值判断而不是对范围的判断时,推荐使用switch语句。switch语句在执行的时候,先将“表达式”的值与“常量表达式1”的值比较,如果相等就执行“语句1”后退出switch,不相等就继续将“表达式”的值与“常量表达式2”的值比较,以此类推。如果“表达式”的值与所有常量表达式的值都不相等,则默认执行default下的“语句n+1”后退出switch。switch语句的一般形式如下:switch(表达式){ case常量表达式1:

语句1; break; case常量表达式2:

语句2; break; … case常量表达式n:

语句n; break; default:

语句n+1; break;}任务准备switch语句的执行流程图如图3-6所示:图3-6switch流程图开始结束表达式==常量表达式1?执行语句1表达式==常量表达式2?执行语句2……执行语句n+1否否是是否是任务准备使用switch语句时,要注意以下事项:①switch后的圆括号中的表达式的值只能是整型、字符型和枚举类型,每个case后的常量表达式的类型必须与switch后的表达式的类型一致。②switch语句会将其后的表达式的值依次与case后的常量表达式比较,两者相等就执行对应case中的语句,都不相等就执行default中的语句(假如有default部分)。③case后的常量表达式的值不能相同,只能是一个常量,不能是一个区间。④case出现的顺序不会影响程序的运行结果。⑤break语句可以跳出所在的switch语句、for语句、while语句,表示结束这些语句。建议每个case都以break结束,但不是必须的。如果某case下没有break语句,则在执行完该case下的语句后,会继续判断下一个case。⑥default部分不是必须的,可以没有。任务准备【实例1】要求用户输入一个整数,1~7分别对应星期几,其它数字则视为无效数字。intmain(){ intx; printf("请输入一个整数:"); scanf("%d",&x); switch(x) { case1: printf("星期一"); break; case2: printf("星期二"); break; case3: printf("星期三"); break; case4: printf("星期四"); break; case5: printf("星期五"); break; case6: printf("星期六"); break; case7: printf("星期日"); break; default: printf("无效的数字");break; } return1;}任务准备编译运行,分别输入4、7、10的结果如图3-7所示:从运行结果可以看出,输入整数4时只会执行“case4”中的代码,输入整数7时只会执行“case7”中的代码,输入整数10时则会执行“default”中的代码。图3-7求整数对应的星期任务准备【实例2】要求用户输入一个整数,如果是1~5之间的数字就输出“工作日”,如果是6或7就输出“周末”,其它数字则视为无效数字。intmain(){ intx; printf("请输入一个整数:"); scanf("%d",&x); switch(x) { case1: case2: case3: case4: case5: printf("工作日"); break; case6: case7: printf("周末"); break; default: printf("无效的数字"); break; } return1;}编译运行,分别输入4、7、10的结果如图3-8所示:任务准备编译运行,分别输入4、7、10的结果如图3-8所示:由于数字1~5都对应“工作日”,所以它们的case共用一个输出语句,除了“case5”外,其它的case不用以break结束。当用户输入数字4时,由于“case4”下没有代码,也没有break语句,程序会继续向下执行,来到“case5”这里。由于数字6、7对应“周末”,所以它们的case也可以共用一个输出语句。图3-8求整数对应的工作日任务准备2.

switch语句与if语句的比较与转换switch语句适用于多个分支的等值判断,代码更加精简,性能更高。而if语句可以处理多种条件,包括等值判断和范围判断,使用更加灵活。作为分支结构语句,switch适用于特定的情形,而if语句可用于任何情形。switch语句通常用于处理等值判断,如字符、整数等可以直接比较的值。如果判断条件涉及区间或范围,或者需要复杂的逻辑判断,则更适合使用if语句。所有switch语句都可以转换成if语句,而只有少部分if语句能转换成switch语句。任务准备下面在实例3中演示将实例2改成用if语句实现。【实例3】要求用户输入一个整数,如果是1~5之间的数字就输出“工作日”,如果是6或7就输出“周末”,其它数字则视为无效数字。要求用if语句实现。#include<stdio.h>intmain(){ intx; printf("请输入一个整数:"); scanf("%d",&x); if(x>=1&&x<=5) printf("工作日"); elseif(x==6||x==7) printf("周末"); else printf("无效的数字"); return1;}编译运行的结果与图3-8相同。任务准备任务实施Part

1Part

2Part

3任务描述任务实施【任务1】要求用户输入一个类似“3.14+5.23”的简单算式,根据两个操作数中的运算符来决定执行加、减、乘、除中的哪一种运算,然后输出运算结果。1.任务分析本任务考查数据的输入输出和switch语句的使用。用户输入的数据由一个double类型数据、一个运算符字符、一个double类型数据组成,其中运算符只能是+、-、*和/中的一个。switch语句通过对比输入的运算符来决定执行哪种运算。需要特别注意的是,用scanf()函数输入double类型数据时必须用“%lf”格式,而用printf()函数输出double类型数据时用“%f”格式。任务实施2.任务实现本任务的实现代码如下,请将代码中空白处补充完整。#include<stdio.h>intmain(){ doublex,y,z; charch; printf("请输入算式:"); scanf("%lf%c%lf",&x,&ch,&y); switch(ch) { case'+': z=

; printf("%f%c%f=%f",x,ch,y,z); break; case'-': z=

; printf("%f%c%f=%f",x,ch,y,z); break; case'*': z=

; printf("%f%c%f=%f",x,ch,y,z); break; case'/': z=

; printf("%f%c%f=%f",x,ch,y,z); break; default: printf("无效的算式"); break; } return0;}任务实施编译运行,分别输3.14+5.2、3.14*5、3.14%2.2后的结果如图3-9所示:图3-9简单计算器任务实施3.任务总结鉴于字符数据输入的特点,需要将操作数与运算符连续输入,scanf()函数的格式字符串“%lf%c%lf”会自动识别dobule类型数据和char类型数据,将它们分别存入对应的变量中。当输入“3.14+5.2”时,数据3.14会被识别成一个double数据,存入变量x;符号“+”会被识别成一个char数据,存入变量ch;而数据5.2会被识别成一个double数据,存入变量y。由于switch语句中的只有+、-、*、/的case分支,因此本任务只能进行对应的加、减、乘、除运算。输入其它符号时,会被当成无效的算式。任务准备任务实施任务描述任务3用for找出100以内的素数任务描述素数是只能把1和它本身除尽的、大于1的自然数,如2、3、5、7、11、13、17、19……等。本任务要求找出2~100内的所有素数。本任务涉及for语句和if语句的联合使用,锻炼学生通过灵活使用循环结构和选择结构来解决实际问题的能力,让学生具备初步的逻辑思维能力。任务准备任务实施Part

1Part

2Part

3任务描述任务准备编程中常有需要大量重复计算的情况出现,比如要计算1+2+3+…+100的值。如果通过写100个整数相加的语句来实现,那就太繁琐了,也不现实。因此,C语言设计了循环结构来专门处理这类需要重复计算的问题。循环结构用于完成有规律的、需要重复计算或处理的任务。循环结构一般由循环变量、循环条件、重复执行的语句组成。常见的一次循环的流程是这样的:先给循环变量赋初值,再判断循环条件是否成立,成立的话就执行一次语句(重复执行的语句),并修改循环变量的值,然后进入下一次循环,再去判断循环条件是否成立,如此循环往复;如果循环条件不成立,则循环结束。C语言提供了for语句、while语句和do…while语句共三种循环语句,本任务重点介绍for语句。任务准备1.for语句for语句是C语言中最常用的一种循环结构,它可以解决所有循环问题,但更适合于循环次数已知的循环问题。for语句的一般形式如下:for(表达式1;表达式2;表达式3){

循环体语句;}for语句的执行流程如图3-10所示:for开始表达式1表达式2成立?循环体语句否是表达式3for结束图3-10for语句流程图任务准备关于for语句的说明:①for语句最先执行的是“表达式1”,而且只执行一次。“表达式1”通常是给循环变量赋初值的语句,如“i=0”或“i=0,j=10”。②“表达式2”是循环条件。for语句的唯一出口是“表达式2”不成立,即当“表达式2”不成立时,for循环结束。“表达式2”通常是一个关系表达式或逻辑表达式,如“i<100”或“i<100&&j>50”。③“循环体语句”是每次循环都会执行的语句。“循环体语句”中还可以包含if语句、for语句等,构成嵌套结构。当“循环体语句”只有一条语句时,for语句的大括号可以省略。④“表达式3”通常是一个修改循环变量的增量语句,如“i++”、“i++,j--”或“i=i+2”等。它在“循环体语句”后执行,执行“表达式3”后再去判断“表达式2”是否成立。⑤“表达式1”、“表达式2”、“表达式3”和“循环体语句”均可省略。当省略“表达式2”时,for语句将会一直循环执行无法结束,俗称“死循环”。省略“循环体语句”代表for语句什么都不做,没有重复执行任何代码。任务准备以计算1+2+3+…+100为例,需要定义一个循环变量i和一个存储总和的变量sum,核心代码如下:inti,sum=0;for(i=1;i<=100;i++){ sum=sum+i;}上述代码中,for语句的第一个表达式“i=1”是给循环变量i赋初值;第二个表达式“i<=100”是循环能继续所必须满足的条件;第三个表达式“i++”是修改循环变量i的值,以便某次循环后变量i不再满足循环条件“i<=100”,从而结束循环;每次循环时,循环体语句“sum=sum+i”都会被执行一次,从而将1到100的所有整数都加到变量sum上。任务准备【实例1】计算1到100之间的所有奇数之和,然后输出。intmain(){ inti,sum=0; for(i=1;i<=100;i=i+2) sum=sum+i; printf("1到100的所有奇数和:%d\n",sum); return0;}编译运行,求出1到100的所有奇数的结果如图3-11所示:由于1到100之间的奇数最小值是1,然后以增量2递增就能遍历出100以内的所有奇数。所以将for语句的循环变量i的初值设为1,修改循环变量的表达式写为“i=i+2”(不是是默认的“i++”),这样循环变量i的取值依次为1、3、5、7…99。将每一个i的取值都加到初值为0的变量sum上,实际上就是计算1+3+5+7+…+99的值,即1到100的所有奇数的和。图3-111到100的所有奇数和任务准备也可以让循环变量i取1到100之间的每一个整数值,再判断i是不是奇数,如果是奇数则将i的值加到变量sum上。这种思路的实现代码如下:inti,sum=0;for(i=1;i<=100;i++){ if(i%2==1) /*i除以2余1,说明i是奇数*/ sum=sum+i;}由于要判断每一个i的取值是不是奇数,因此必须通过在for语句内部嵌套一个if语句来实现。任务准备【实例2】用for语句实现,将1~30之间所有是3的倍数的数输出。intmain(){ inti; for(i=1;i<=30;i++) { if(i%3==0) /*i是3的倍数*/ printf("%d,",i); } return0;}编译运行后的结果如图3-12所示:用for语句实现从1循环到30时,给循环变量赋初值的语句(即表达式1)是“i=1”,表示循环条件的语句(即表达式2)是“i<=30”,修改循环变量的语句(即表达式3)是“i++”,循环体语句则是一个嵌套的if语句。由于只需要将能把3除尽的数挑出来,所以只用一个if就行,不需要用到else部分。图3-12输出3的所有倍数任务准备2.break语句break语句除了用于退出switch语句外,还可能出现在for语句、while语句和do…while语句的循环体中,用于中止循环。break语句通常出现在循环体中的if语句下,表示当循环变量满足什么条件时,用break跳出循环。以判断素数为例,素数是只能把1和它本身除尽的、大于1的自然数。假设要判断x是不是素数,可以让循环变量i从2递增到x-1(从2递增到x的平方根更准确更高效),在每一次循环中都判断x是否能把i除尽。只要x能把i除尽,就说明x不是素数,这时候就可以使用break语句中止循环。但某次x没有把i除尽,并不能说明x就是素数。除非整个循环过程中x都没有把i除尽过,才能证明x是素数。因此,只要x把i除尽一次,就证明x不是素数。从这个思路出发,在实例3中演示判断用户输入的整数是不是素数。任务准备【实例3】要求用户输入一个大于1的整数,判断该整数是不是素数,并输出结果。intmain(){ /*先假设x是素数,用flag=1表示*/ inti,x,flag=1; printf("请输入一个大于1的整数:"); scanf("%d",&x); for(i=2;i<x;i++){ if(x%i==0)/*x把i除尽了*/ { /*x不是素数,将flag改为0*/ flag=0; break; } }图3-13判断素数 if(flag==1) printf("%d是素数",x); else printf("%d不是素数",x); return0;}编译运行后,分别输入17和25的结果如图3-13所示:任务准备实例3在判断整数x是不是素数时,先假定x就是素数,用变量flag=1表示。即如果flag=1就说明x是素数,否则x不是素数。在循环变量i的值从2递增到x-1的过程中,当x把i除尽时,将变量flag的值改为0,代表x不是素数,然后退出循环。在退出循环后,如果flag的值依然是1,就说明x是素数,如果flag的值是0(不是1),则说明x不是素数。定义一个变量flag来做标记,这是编程经常使用的一种做法。实例3实现判断整数x是不是素数的流程图3-14所示:图3-14第一种判断素数的流程开始输入整数xi=2,flag=1i<x?x%i==0?i++flag=0flag==1?结束输出x是素数输出x不是素数否是是否是否任务准备判断素数还有另一种实现思路:当变量x将循环变量i除尽时,输出x不是素数,然后退出程序;否则在循环结束后输出x是素数,程序结束。该思路的实现代码如下:intmain(){ inti,x; printf("请输入一个大于1的整数:"); scanf("%d",&x); for(i=2;i<x;i++) { /*x把i除尽了,x不是素数*/ if(x%i==0){ printf("%d不是素数",x); return; }/*退出main()函数,即退出程序*/ }/*整个循环都没有除尽后退出,证明x是素数*/ printf("%d是素数",x); return0;}在循环变量i从2递增到x-1的过程中,如果x把i除尽了,说明x不是素数,这时执行return语句退出main()函数,也就退出了程序。如果在整个for循环过程中都没有因为x把i除尽而退出,说明一直没有除尽过,就能充分证明x是素数。该思路对应的算法流程如图3-15所示。任务准备图3-15第二种判断素数的流程开始输入整数xi=2i<x?x%i==0?输出x不是素数结束输出x是素数i++否是是否任务准备3.continue语句continue语句出现在for语句、while语句和do…while语句的循环体中,用于跳过continue后面尚未执行的语句,开始下一次循环。与break语句终止整个循环不同,continue语句只结束本次循环,提前进入下一次循环。假如要输出1~10不能被3整除的所有整数,用continue实现的代码如下:inti;for(i=1;i<=10;i++){ if(i%3==0) continue;/*结束本次循环,提前进入下一次循环,不会执行后面的代码*/ printf("%d,",i);}上述代码中,当检测到是能被3整除的数后,直接用continue跳转到i++,不会执行后面的输出语句。上述代码也可以不用continue实现,例如:inti;for(i=1;i<=10;i++){ if(i%3!=0) printf("%d,",i);}很显然不用continue语句也能解决问题,但在一些特殊情况下用continue语句会使代码变得更简洁易懂,这一点在后续的综合实例中会有所体现。任务准备任务实施Part

1Part

2Part

3任务描述任务实施【任务1】找出100以内的所有素数,然后输出。1.任务分析本任务考查for语句和if语句的嵌套使用,以及设计算法、实现算法的能力。找出100以内的所有素数,需要用到两层for循环,外层的for循环实现循环变量i从2递增到100,内层的for循环则实现判断i的是不是素数。本任务采用实例3判断素数的思路,设置变量flag作为标记。在内层循环开始前用flag=1表示假定i是素数,在内层循环中发现i不是素数时将flag的值改为0。在内层循环结束后,根据flag的值就能知道i是不是素数。任务实施2.任务实现本任务的实现代码如下,请将代码中空白处补充完整。intmain(){ inti,j,flag; for(i=2;

;i++) { /*先假定i是素数,用flag=1表示*/ flag=1; for(j=2;

;j++) { /*i把j除尽了*/ if(

){ /*用flag=0代表i不是素数*/

;break; } }图3-16100以内的素数 if(

) printf("%d,",i); } return1;}编译运行的结果如图3-16所示:任务实施3.任务总结实例3是判断用户输入的整数是不是素数,而本任务是对2~100中的每一个整数进行素数判断。因此,本任务的实现代码,可以理解成在实例3判断素数的实现代码外加了一层从2到100的循环。需要注意的是,针对2~100中的每一个整数,在判断它是不是素数前需要先假定它是素数,因此flag=1应该放在内层循环语句开始之前。任务准备任务实施任务描述任务4用while求一个正整数的逆序数任务描述一个正整数的逆序数就是把它变成从右到左、顺序倒过来的数,如123456的逆序数是654321。这里要求得到这个逆序数,而不仅仅是把各位上的数字倒过来输出。本任务更适合使用while语句或do-while语句来实现。在任务的准备过程中,将while语句与for语句作对比,让学生理解两种循环的细微差别,能够在解决不同类型的问题时选择更适合的语句。同时能够实现for语句与while语句的互换,锻炼学生使用循环结构解决实际问题的能力,让学生具备初步的逻辑思维能力。任务准备任务实施Part

1Part

2Part

3任务描述任务准备除了for语句外,还可以使用while语句、do-while语句来实现循环结构,它们在使用形式上稍有区别。本任务重点介绍while语句、do-while语句以及三种循环语句的不同之处。任务准备1.while语句while语句也可以完成不确定次数的循环。当满足循环条件时反复执行循环体语句,当不满足循环条件时退出循环。while语句的一般形式如下:while(表达式){

循环体语句;}while语句在执行时会先判断“表达式”是否成立,如果成立就执行“循环体语句”,不成立就退出while循环。while语句的执行流程如图3-17所示。图3-17while语句的流程while开始循环体语句表达式成立?while结束否是任务准备while语句中的“表达式”可以是一个条件表达式,如“i<100”;也可以是一个逻辑表达式,如“i>1&&i<100”。当“循环体语句”只是一句代码时,大括号可以省略不写。以计算1+2+3+…+100为例,需要定义一个初值为1的循环变量i和一个初值为0的、存储总和的变量sum,核心代码如下:inti=1,sum=0;while(i<=100){ sum=sum+i; i++;}与for语句不同,while后的小括号中只能是循环条件,所以循环变量必须在while语句外面赋初值,修改循环变量的语句(i++)必须在while语句内部。需要特别注意的是,初学者很容易漏写i++,导致循环变量i的值始终为1,永远满足i<=100的条件。最终导致程序陷在while语句中出不来,即形成常说的“死循环”。任务准备【实例1】用while语句计算1到100之间的所有奇数之和,然后输出。intmain(){ inti=1,sum=0; while(i<=100) { if(i%2==1) /*i是奇数*/ sum+=i; /*sum=sum+i*/ i++; /*每次循环都修改循环变量的值*/ } printf("1到100的所有奇数和:%d\n",sum); return0;}编译运行,求出1到100的所有奇数的结果如图3-18所示:图3-181到100的所有奇数和任务准备2.do-while语句do-while语句也用于完成不确定次数的循环。与while语句会先判断循环条件不同,do-while语句会先执行一次循环体语句,然后再判断循环条件。如果满足循环条件,则执行循环体语句,再判断循环条件,如此反复;否则结束循环。do-while语句的一般形式如下:do{

循环体语句;}while(表达式);如果循环体语句只有一句代码,则可以省略大括号。do-while语句一定以分号结束,初学者很容易漏写。do-while语句在执行时会先执行“循环体语句”,再判断“表达式”是否成立,如果成立就再次执行“循环体语句”,不成立就退出循环。do-while语句的执行流程如图3-19所示。任务准备2.do-while语句do-while语句也用于完成不确定次数的循环。与while语句会先判断循环条件不同,do-while语句会先执行一次循环体语句,然后再判断循环条件。如果满足循环条件,则执行循环体语句,再判断循环条件,如此反复;否则结束循环。do-while语句的一般形式如下:do{

循环体语句;}while(表达式);如果循环体语句只有一句代码,则可以省略大括号。do-while语句一定以分号结束,初学者很容易漏写。do-while语句在执行时会先执行“循环体语句”,再判断“表达式”是否成立,如果成立就再次执行“循环体语句”,不成立就退出循环。do-while语句的执行流程如图3-19所示。图3-19do-while语句的流程do…while开始表达式成立?循环体语句do…while结束否是任务准备do-while循环与while循环的区别在于do-while循环先执行一次循环体语句,再进行表达式的判断,因此循环体中的语句至少要执行一次。在设计程序时,如果不知道循环重复执行的次数,且第一次必须执行,则常采用do-while语句。do-while循环与while循环的区别在于do-while循环先执行一次循环体语句,再进行表达式的判断,因此循环体中的语句至少要执行一次。在设计程序时,如果不知道循环重复执行的次数,且第一次必须执行,则常采用do-while语句。任务准备【实例2】重复让用户输入一个字母,在屏幕上输出对应的大写字母,直到用户输入大写的Q时退出。#include<stdio.h>intmain(){ charch; do { printf("请输入一个字母:"); ch=getchar(); if(ch>='a'&&ch<='z') printf("%c\n",ch-32); /*小写字母的ASCII码比大写字母大32*/ elseif(ch>='A'&&ch<='Z') printf("%c\n",ch);图3-20do-while实现连续输入 else printf("不是字母\n");/*接收回车符,以免影响后续输入*/ getchar(); }while(ch!='Q'); return0;}编译运行,输入d、D、7、q和Q后的结果如图所示:任务准备这是一个典型的do-while语句应用实例。因为要求用户重复输入,并且必须先输入一次,才能对输入的字母进行处理和判断,所以用do-while语句更合适。如果用while语句实现,代码就会显得有些冗余,改用while语句实现实例2的核心代码如下:charch;printf("请输入一个字母:");ch=getchar(); /*需要在while语句之前输入*/while(ch!='Q'){ if(ch>='a'&&ch<='z') printf("%c\n",ch-32); elseif(ch>='A'&&ch<='Z') printf("%c\n",ch); else printf("不是字母\n"); getchar(); /*接收回车符以免影响后续输入*/ printf("请输入一个字母:"); ch=getchar(); /*重复输入*/}由于必须先输入字母再判断,所以在while语句之前要有输入语句。又因为要求用户重复输入,所以在while语句内部也必须有输入语句,如此一来,同样的输入语句要写两遍。如果用户输入大写的Q,上述代码不会将Q输出,而是直接退出程序。对比发现,do-while语句更适合实例2。任务准备3.while语句和for语句的区别for语句与while语句可以相互转换,但它们也有细微的差别,选用适合当前问题的循环语句会使编程更加高效。for语句适用于循环次数已知的循环问题,而while语句更适用于循环次数未知的循环问题。例如,求1+2+3+…+100的和,需要循环100次,用for语句实现比较好。而在设计游戏时,游戏程序不断循环检查用户输入的按键,作出诸如前进、后退、跳跃之类的动作,直到按下“Esc”键时才退出游戏,这种情况用while语句更适用。任务准备以判断一个多位正整数是否包含某个数字为例,如多位正整数123456中包含了数字3,应该采用什么样的思路来实现呢?初学者最容易想到的做法就是,得到六位正整数abcdef各个位上的数字a、b、c、d、e、f,再将它们分别与数字x对比,如果有相等就说明多位整数abcdef包含数字x。但由于正整数的位数不确定,难以确定该定义几个变量来存储各个位上的数字。还有一种思路是:每次循环都将多位正整数abcdef拆分成个位数字与剩下的部分,将拆分出来的个位数字与数字x比较,相等就说明包含。以判断多位正整数123456是否包含数字8为例,每次循环的拆分过程如表3-2所示。表3-2正整数123456的拆分过程第几次循环剩下的部分个位数字是否等于8第1次123456不等第2次12345不等第3次1234不等第4次123不等第5次12不等第6次01不等结束循环

任务准备下面采用上述思路,在实例3中演示用户分别输入一个多位正整数和一个数字,判断该多位正整数是否包含那个数字。分别用while语句和for语句来实现,对比一下哪种语句更适合。【实例3】要求用户输入多位正整数和一个数字,判断正整数是否包含该数字,然后输出结果。用while语句实现:intmain(){/*多位正整数,数字,个位数字,剩余部分,标志变量*/ intzs,x,gw,sy,flag=0; printf("输入一个多位正整数和一个数字:"); scanf("%d,%d",&zs,&x); sy=zs; while(sy>0) { gw=sy%10;/*取出个位数字*/ /*去掉个位数字,得到剩余部分*/ sy=sy/10; if(gw==x) { flag=1; /*代表包含*/ break; } } if(flag==1) printf("%d包括数字%d\n",zs,x); else printf("%d不包括数字%d\n",zs,x); return0;}任务准备用for语句实现:intmain(){/*多位正整数,数字,个位数字,剩余部分,标志变量*/ intzs,x,gw,sy,flag=0; printf("输入一个多位正整数和一个数字:"); scanf("%d,%d",&zs,&x); for(sy=zs;sy>0;sy=sy/10) { gw=sy%10;/*取出个位数字*/ if(gw==x) { flag=1; break; } } if(flag==1) printf("%d包括数字%d\n",zs,x); else printf("%d不包括数字%d\n",zs,x); return0;}编译运行,分别输入“123456,3”和“123456,8”后的结果如图3-21所示:图3-21判断正整数是否包含数字任务准备无论用for语句还是while语句实现,程序运行后都能正确判断一个多位正整数是否包含某个数字。用while语句实现时,每次循环都将正整数拆分成个位数字和剩余部分,再判断个位数字是否与指定的数字相等。用for语句实现时,以输入的正整数作为循环变量的初值,以循环变量大于0为条件,以除以10来修改循环变量(而不是递增或递减),每次循环都取出循环变量的个位数字,再判断个位数字是否与指定的数字相等。在实现实例3时,用while语句实现的思路更简单,而用for语句实现的代码看起来更简洁。任务准备任务实施Part

1Part

2Part

3任务描述任务实施【任务1】要求用户输入一个正整数,然后输出该整数的逆序数。如输入12345,输出54321。1.任务分析本任务考查while语句的使用,以及用while实现简单算法的能力。与判断一个正整数是否包含某个数字的解法类似,求一个正整数的逆序数也需要将该整数拆分成个位数字和剩余部分,再将每次循环得到的个位数字按一定方式累加(上次的结果乘以10再加个位数字),就能得到逆序数。任务实施以求多位正整数123456的逆序数为例,每次循环拆分的个位数字和乘以10后累加的结果如表3-3所示。因此,需要定义变量存储输入的正整数、拆分的个位数字、拆分剩下的部分和累加的结果,它们分别对应下面代码中定义的变量zs、gw、sy和sum。表3-3求123456的逆序数的过程第几次循环剩下的部分个位数字乘以10后累加的结果

123456

0第1次1234560*10+6=6第2次123456*10+5=65第3次123465*10+4=654第4次123654*10+3=6543第5次126543*10+2=65432第6次0165432*10+1=654321结束循环

得逆序数654321任务实施2.任务实现本任务的实现代码如下,请将代码中空白处补充完整。#include<stdio.h>intmain(){/*多位正整数,个位数字,剩余部分,累加结果*/ intzs,gw,sy,sum=0; printf("请输入一个多位正整数:"); scanf("%d",&zs); sy=

; while(

) { gw=

; /*个位数字*/ sy=

; /*剩余部分*/图3-22求一个正整数的逆序数 /*乘以10后加上个位数字*/ sum=sum*10+gw; } printf("%d的逆序数是:%d\n",zs,sum); return0;}编译运行,输入“12345678”后的结果如图3-22所示:任务实施3.任务总结变量zs用来保存用户输入的正整数,它的值始终没有变化。存储总和的变量sum的初值为0,每次循环都将sum乘以10再加上个位数字,整个循环结束后,sum的值就刚好是输入的正整数的逆序数。任务准备任务实施任务描述任务5输出九九乘法表任务描述九九乘法表有九行,第i行有i个等式,输出格式如下:1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81输出九九乘法表需要用到两层循环,并要处理好每行输出多少个等式,每行结束后换行等细节问题。因为已知循环次数,所以本任务更适合使用for语句来实现。在任务中将穿插其它实例的讲解,以锻炼学生嵌套使用各种程序结构解决实际问题的能力,让学生具备解决常见问题的逻辑思维能力。任务准备任务实施Part

1Part

2Part

3任务描述任务准备一个面向过程的程序由两部分组成:数据结构和算法。数据结构指数据的描述和组织形式,简单地说就是怎样存储程序中用到的数据。算法是对操作或行为的描述,即为了解决问题而设计的操作步骤。合理地组织数据和设计算法是通过编程解决问题的关键。使用C语言解决某个问题时,首先要确定需要几个什么类型的变量来存储数据,再综合使用if、for、while等语句设计解决问题的流程。下面通过几个实例来讲解如何设计数据结构,如何设计算法,如何选用合适的语句来解决问题。任务准备1.输出从A到B的所有整数本实例要求用户输入两个整数A和B(均是0~100之间,且A<B),然后输出从A到B的所有整数以及这些数的和。这是一个典型的已知循环次数的问题,因此推荐使用for语句来实现。解决此问题需要定义两个变量A和B存储输入的数据,并判断它们是否满足要求。再定义一个循环变量i从A递增到B。此外,还要定义一个变量sum来存储从A到B的所有整数之和,它的初值设为0,执行循环时将循环变量i的值累加到sum上。任务准备【实例1】要求用户输入两个整数A和B(均是0~100之间,且A<B),输出从A到B的所有整数以及这些数的和。intmain(){ intA,B,i,sum=0; printf("请输入两个整数:"); scanf("%d,%d",&A,&B); if((A>=0&&A<=100)&&(B>=0&&B<=100)&&A<B){ printf("从%d到%d的所有整数:",A,B); for(i=A;i<=B;i++){ printf("%d,",i); sum+=i; /*sum=sum+i*/ }图3-23从A到B的所有整数和总和 printf("总和是:%d\n",sum); } else printf("A和B必须是0到100之间的整数,且A<B"); return0;}编译运行,输入“1,10”的结果如图3-23所示:从运行结果可以看出,程序输出了1~10之间的所有整数和它们的总和。如果输入“15,4”或“-5,10”,程序则会输出“A和B必须是0到100之间的整数,且A<B”。任务准备2.判断完全数本实例要求用户输入一个自然数,判断它是不是完全数。完全数又称完美数或完备数,是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,即完全数恰好等于除自身外的因子之和。例如6等于1+2+3,其中1、2、3为6的因子,因此6就是一个完全数。判断自然数x是不是完全数的思路是:让循环变量i从1递增到x-1,在循环过程中将能被x除尽的i都累加到初值为0的变量sum上,循环结束后如果sum等于x,就证明x是完全数。由于循环次数是确定的,所以适合用for语句来实现,当然用while或do…while实现也是可以的。任务准备【实例2】要求用户输入一个自然数,判断它是不是完全数,然后输出结果。#include<stdio.h>intmain(){ intx,i,sum=0; printf("请输入一个自然数:"); scanf("%d",&x); for(i=1;i<x;i++) { if(x%i==0)/*x把i除尽了*/ sum+=i;/*sum=sum+i*/ } if(x==sum) printf("%d是完全数\n",x);图3-24判断完全数 else printf("%d不是完全数\n",x); return0;}编译运行,输入28后的结果如图3-24所示:自然数28的真因子有1、2、4、7、14,1+2+4+7+14的和刚好与28相等,因此28就是一个完全数。只有求出所有真因子的和之后,才会去比较总和sum与原数x是否相等,因此,比较sum与x的代码应该写在for语句之后。有部分初学者习惯将比较代码写在for语句内部,这种做法是错误的。任务准备下面在实例3中演示输出两个正整数m和n(0<m≤n≤10000)之间的所有完数。实例3要求正整数m和n满足0<m≤n≤10000的要求,因此要用if语句实现判断。判断m到n之间的所有整数是不是完全数,需要用循环变量i实现从m到n的递增,这是外层循环。针对变量i的每一个取值,需要将循环变量j的值从1递增到i-1,用来判断i是不是完全数,这是内层循环。在内层循环中把能被i除尽的值(i的因子)挑出来,累加到初值为0的变量sum中,如果sum和i相等,就说明i是完全数,将它输出到屏幕。任务准备【实例3】要求用户输入两正整数m和n(0<m≤n≤10000),找出它们之间的所有完全数并输出。intmain(){ intm,n,i,j,sum; printf("请输入两个正整数:"); scanf("%d,%d",&m,&n); if((m>0&&m<=10000)&&(n>0&&n<=10000)&&m<=n){ printf("%d到%d之间的完全数有:",m,n); /*用i访问m到n的每一个整数*/ for(i=m;i<=n;i++) { /*判断前将sum赋值为0*/ sum=0; for(j=1;j<i;j++) {/*i把j除尽了*/ if(i%j==0) sum+=j; }

温馨提示

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

评论

0/150

提交评论