文档详情

第3章-程序的控制

艳***
实名认证
店铺
PPT
642KB
约64页
文档ID:177012728
第3章-程序的控制_第1页
1/64

第三章 程序的控制结构3.1 选择结构3.2 循环结构3.3 编译预处理问题提出:计算分段函数:y=3-x x02/x x0解题的步骤:输入xx0是 y=3-xy=2/x否 输出y的值 C语言提供的选择结构有两种:if语句、switch语句3.1 选择结构选择结构3.3.1 if 3.3.1 if 语句语句ifif语句:对所给条件进行判定,根据判定结果决定是语句:对所给条件进行判定,根据判定结果决定是 否执行程序段否执行程序段语句形式:语句形式:if(表达式)语句;语句执行流程:语句执行流程:表达式语句真(非0)假(0)例例3-1:读程序,理解数值作为读程序,理解数值作为if 表达式表达式#include void main()int i=10,m=3;if(i!=0)printf(“i is not 0n”);if(m)printf(“i is not 0n”);程序运行结果:i is not 0i is not 0例例3-2:读程序,理解读程序,理解”=”与与”=”的作用及区别的作用及区别#include void main()int m=10;if(m=100)printf(“m=%d”,m);if(m=100)printf(“m is assigned%dn”,m);程序运行结果:m is assigned 100if(表达式)语句1;else 语句2;表达式语句1真(非0)假(0)语句23.3.1 if-else 3.3.1 if-else 语句语句if-else 语句适合于解决双分支选择问题语句形式:语句形式:语句执行流程:语句执行流程:例例3-3:输入一个整数,判断该整数的奇偶性输入一个整数,判断该整数的奇偶性#include void main()int m;printf(“input m:”);scanf(“%d”,&m);if(m%2=0)printf(“%d 是偶数n”,m);else printf(“%d 是奇数n”,m);输入mm%2=0偶数结束真假奇数例例3-4:读程序,理解浮点数的运算与比较读程序,理解浮点数的运算与比较#include void main()float f;f=1.0;f=f/13.0;f=f*13.0;if(f=1.0)printf(“f is still 1.0n”);else printf(“f isnt still 1.0n”);程序运行结果:f isnt 1.0注意:注意:有的有的if-else语句可以用语句可以用条件运算符(?条件运算符(?:):)来实现来实现if(ab)max=aelse max=b;max=(ab)?a:b;例例3-5:输入一个英文字符,若为大写则改为小写,输输入一个英文字符,若为大写则改为小写,输出得到的字符。

出得到的字符include void main()char zm;scanf(“%c”,&zm);zm=(zm=A&zm=Z)?(zm+32):zm);printf(“%c”,zm);程序运行结果:程序运行结果:B Bb bif(表达式1)语句1;else if(表达式2)语句2;else if (表达式n)语句n;else 语句n+1;3.1.3 3.1.3 嵌套的嵌套的if-else if-else 语句语句语句形式:语句形式:表达式1语句1真(非0)假(0)语句2表达式2真(非0)表达式2语句n语句n+1假(0)假(0)语句执行流程:语句执行流程:例例3-6:将将0100分的百分制换算成分的百分制换算成AE的五级学分制的五级学分制include void main()int s;scanf(“%d”,&s);if(s=90)printf(“score is An”);else if(s=80)printf(“score is Bn”);程序运行结果:84Belse if(s=70)printf(“score is Cn”);else if(s=60)printf(“score is Dn”);else printf(“score is en”);例例3.7:计算分段函数计算分段函数:假输入xX0真X=0y=1y=0y=-1假真 y=-1 (x0)#include void main()int x,y;scanf(%f,&x);if (x0)y=-1;else if (x=0)y=0;else y=1;printf(x=%d,y=%dn,x,y);语句形式:语句形式:switch (表达式)case 常量1:语句 1;case 常量2:语句2;case 常量3:语句3;.case 常量n:语句n;default:语句n+1;。

数值型或字符型常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案千万不能接(;)号3.1.4 switch 3.1.4 switch 语句语句语句执行流程:语句执行流程:指语句的最指语句的最后一条是否后一条是否为为breakbreak简单语句或简单语句或复合语句复合语句breakbreakbreakbreak有有无breakbreak有无有计算表达式计算表达式常量常量1 1常量常量2 2常量常量n n=语句语句1 1=语句语句2 2语句语句n n其它其它=语句语句n+1n+1无值值casecase语句出语句出现的次序并现的次序并不影响执行不影响执行结果例例3-8:按照考试成绩等级打印出百分制分数段按照考试成绩等级打印出百分制分数段程序运行结果:B8089#include void main()char grade;scanf(%c,&grade);switch(grade)case A printf(”90100n”);break;case B printf(”8089n”);break;case C printf(”7079n”);break;case D printf(”6069n”);break;case E printf(”059n”);break;default printf(“errorn”);switch 的嵌套的嵌套:switch语句允许嵌套,即语句允许嵌套,即switch本本身可以作为另一个层身可以作为另一个层switch语句的一部分语句的一部分switch(i)case 0:switch(j)case 0:printf(“i=j”);break;case 1:printf(“ij”);break;case 1:.switch几个注意点几个注意点1、if语句能测试关系和逻辑表达式,而switch只能测试相等。

2、switch语句的每个case后面的常熟必须是整型或字符型,在使用字符常量时自动转换成整数3、switch语句中每个case常熟必须不同在C语言中有三种循环结构:while,do-while和for循环,利用 有关的运算符构造表达式,以控制循环的执行3.2 循环结构循环结构 循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体3.2.1 while3.2.1 while语句语句真(非零)表达式 循环体假(零)1、while 语句的形式:while(表达式)循环体;2、while 语句 常称为“当型”循环语句3、说明:先判断表达式,后执行语句表达式同if语句后的表达式一样,可以是任何类型的表达式循环体多于一句时,用一对 括起while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况例:分析下列程序段的循环次数例:分析下列程序段的循环次数i=1;while(i=100)putchar(*);i+;i=1;while(i=100)putchar(*);i+;例例3-9:用用while编程实现编程实现1100的和include void main()int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;printf(%dn,sum);程序运行结果:5050例例3-10:用用while语句语句 计算计算n!。

include void main()int n,m,temp;scanf(“%d”,&n);m=1;temp=n;while(n=1)m=m*n;n-;printf(“%d!=%dn”,temp,m);程序运行结果:55!=120注意表达式在判断前,必须要有明确的值循环体中一般有改变条件表达式的语句while(表达式)后面没有分号3.2.2 3.2.2 do-do-while-while语句语句1、do-while的形式:do 循环体;while(表达式);2、do-while语句 常称为“直到型”循环语句真(非零)表达式 循环体假(零)例例3-10:用用do-while编程实现编程实现1100的和include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%dn,sum);程序运行结果:5050例例3-11:用用while语句语句 计算计算5!include void main()int t=1,i=2;do t=t*i;i+;while(i=5);printf(“5!=%dn”,t);程序运行结果:55!=1203、说明:do-while语句先执行语句,后判断表达式。

第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同void main()int i,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10);printf(%d,sum);void main()int i,sum=0;scanf(%d,&i);while(i=10)sum+=i;i+;printf(%d,sum);在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号do-while和while语句相互替换时,要注意修改循环控制条件3.2.3 for语句1 1、forfor的形式:的形式:for(for(初始表达式初始表达式1 1;条件表达式;条件表达式2 2;循环表达式;循环表达式3 3)循环体循环体 ;表达式1:用于循环开始前为循环变量设置初始值表达式2:控制循环执行的条件,决定循环次数表达式3:循环控制变量修改表达式循环体语句:被重复执行的语句表达式3计算表达式1循环体判断表达式2零非零非零for的下一条语句2 2、执行过程、执行过程例例3-13:用用for语句编程实现语句编程实现1100的和。

的和include void main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“%dn”,sum);程序运行结果:5050例例3-14:用用for语句编程计算语句编程计算19的平方include void main()int i,j;for(i=1,j=1;i10;i+,j+)printf(“%d*%d=%4dn”,i,j,i*j);注意:三个表达式都可以是逗号表达式三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计累加器当前值=累加器原值+循环变量当前值;典型例题分析【例】求累加和1+2+3+1000基本方法:属于“累加器”类型问题累加器赋初值思考:求偶数和2+4+6+100参考程序:void main()long int k,s;s=0;for(k=1;k=1000;k+)s=s+k;printf(s=%ld,s);累加(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。

累乘器当前值=累乘器原值*循环变量当前值;例:求累乘积如:123.100基本方法:属于“累乘器”类型问题累乘器赋初值思考:求n!=1 2 3 n参考程序:void main()double s=1;int k;for(k=1;k=100;k+)s=s*k;printf(s=%lf,s);累乘 整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套如果内循环体中又有嵌套的循环语句,则构成多重循环3.2.4 3.2.4 循环的嵌套循环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环称为外循环while、do-while、for三种循环都可以互相嵌套下面几种都是合法的形式:(1)while()(2)do (3)for(;)while()do for(;)while();while();(4)while()(5)for(;)(6)do do while()for(;)while()while()循环语句之间的关系循环语句之间的关系for(.).for(.).内循环外循环for(.).for(.).并列循环嵌套循环真真外循环初始条件内循环初始条件内循环体外循环条件假内循环条件假内循环循环条件外循环循环条件循环结束二重循环嵌套结构执行流程 例例3-15 编程输出如下形式的九九乘法表编程输出如下形式的九九乘法表1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 92 4 6 810121416183 6 91215182124274 8121620242832365101520253035404561218243036424854714212835424956638162432404856647291827364554637281#include void main()int i,j;for(i=1;i=9;i+)printf(“%4d”,i);/*打印表头,第一行*/printf(n);for(i=1;i=36;i+)printf(%c,-);printf(n);for(i=1;i=9;i+)/*被乘数i从1变到9*/for(j=1;j=9;j+)/*乘数j从1变到9*/printf(“%4d”,i*j);/*输出第i行j列的值i*j*/printf(“n”);/*换行,打印下一行*/1.break1.break语句语句 break break语句和语句和continuecontinue语句语句(1)语句形式:break;(2)作用:结束break所在的 switch语句。

结束当前循环,跳出break所在的循环结构例例3-16:计算半径为计算半径为1,28的圆面积,但当面积大于的圆面积,但当面积大于100时结束计算时结束计算include void main()int r;float area;for(r=1;r100)break;printf(“%n”,area);程序运行结果:3.14000012.56000028.26000050.24000278.500000例例3-17:break语句用法示例语句用法示例#include void main()int i;for(i=0;i=6;i+)printf(“%dn”,i);if(i=5)break;程序运行结果:012345思考:为什么不输出6(1)语句形式:continue;(2)语句作用:结束本次循环2 2、continue continue 语句语句(3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行例例3-18:continue语句用法示例语句用法示例#include void main()int i;for(i=0;i=6;i+)if(i=5)continue;printf(“%dn”,i);程序运行结果:0123456例例3-193-19:输出输出150150之间不能被之间不能被3 3整除的数。

整除的数include stdio.hvoid main()int n;for(n=0;n=50;n+)if(n%3=0)continue;printf(“%d,n);while(条件)语句A;break;语句 B;真语句B条件语句Abreak假结束循环3、break语句与continue语句的区别至此位置while(条件)语句A;continue;语句 B;真语句B条件语句Acontinue假结束循环至此位置#include stdio.hvoid main()int a,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf(%dn,a);【例】【例】分析以下程序的运行结果分析以下程序的运行结果3.3 编译预处理编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类 宏替换#define 文件包含#include 条件编译#if-#else-#endif等格式:“#”开头 占单独书写行 语句尾不加分号不带参数宏定义 一般形式:#define 宏名 宏体 功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名-不作语法检查#include#define PI 3.1415926 void main()float l,s,r,v;printf(input radius:);scanf(%f,&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf(l=%10.4fns=%10.4fnv=%10.4fn,l,s,v);程序运行结果:l=25.1327s=50.2655v=150.7964带参数宏定义 一般形式:#define 宏名(参数表)宏体例#define S (r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号()例#define S(a,b)a*b .area=S(3,2);宏展开:area=3*2;不能加空格#include#define PI 3.1415926#define S(r)PI*r*rvoid main()float a,Area;scanf(“a=%f”,&a);Area=S(a);printf(Area=%fn,a,Area);运行情况如下:a=3.6Area=40.715038例例3-213-21 用带参数宏实现圆面积的计算用带参数宏实现圆面积的计算赋值语句“area=S(a);”经宏展开后为:area=3.1415926*;(1)带参的宏只是进行简单的字符替换;而函数调用是先求出实参值,然后代入形参。

2)宏展开则是在编译前进行的,展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念;而函数调用是在程序运行时处理的,为形参分配临时的内存单元3)宏不存在类型问题,宏名无类型,其参数也无类型,只是一个符号代表,展开时代入指定字符串即可宏定义时,字符串可以是任何类型的数据;而对函数中的实参和形参类型要求一致4)宏可以设法得到多个结果,而调用函数只可得到一个返回值5)宏展开后源程序变长,而函数调用不会使源程序变长6)宏替换不占运行时间,只占编译时间而函数调用则占运行时间(分配单元、保留现场、值传递、返回)include#define PI 3.1415926#define CIRCLE(R,L,S,V)L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*Rvoid main()float r,l,s,v;scanf(%f,&r);CIRCLE(r,l,s,v);s=PI*r*r;v=3.0/4*PI*r*r*r;printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);例例3-223-22 返回多个结果的宏返回多个结果的宏。

3.2.2“3.2.2“文件包含文件包含”处理处理功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include “文件名”或#include#include “file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译 直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径例例3-223-22 文件包含示例程序文件包含示例程序(1)将格式宏做成头文件format.h#include#define PR printf#define NL n#define R%d#define R1 D NL#define R2 D D NL#define R3 D D D NL#define S%s(2)主文件file1.c#include include format.hvoid main()int a,b,c;char str=“china;a=1;b=2;c=3;PR(R1,a);PR(R2,a,b);PR(R3,a,b,c);PR(S,str);程序运行结果:12123china。

下载提示
相关文档
正为您匹配相似的精品文档