




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第三章 程序设计基础,C/C+语言程序设计,龚尚福,贾澎涛主编 C/C+语言程序设计 西安电子科技大学出版社,第3章 程序设计基础,3.1 程序结构和语句 3.2 数据的输入和输出 3.3 顺序结构的程序设计 3.4 选择结构的程序设计 3.5 循环结构的程序设计 3.6 程序设计的风格 3.7 小结,3.1 程序结构和语句,顺序结构,3,N-S结构图,流程图,选择结构,3.1.1 三种程序结构,3.1 程序结构和语句,循环结构,4,直到型循环,当型循环,N-S结构图,流程图,3.1.1 三种程序结构,3.1.2 C语句概述,5,程序包括数据描述和数据操作。 数据描述主要定义数据结构(用数
2、据类型表示)和数据初值。 数据操作的任务是对已提供的数据进行加工。 C程序对数据的处理和加工是通过语句的执行来实现的。,3.1.2 C语句概述,6,说明性语句,对程序中使用的变量、数组、函数等操作对象进行定义、声明的描述语句 只起说明作用,不产生可执行的机器指令代码。 例如:int a,b; float function( int, int);,7,C程序由函数组成。函数的格式: 函数名(参数表) 说明部分; 执行部分; ,数据类型说明语句,可执行语句,简单语句,表达式后面加一个分号,构成表达式语句 x=3; y=y+5; x=a-b ,8,分号是语句必不可少的一部分,简单语句是程序中使用最频
3、繁的语句,来自于一个表达式或者函数调用,结尾用分号就构成一个语句。,简单语句,9,表达式语句中最常用的是赋值语句,有以下三种常用形式: 简单赋值:变量=表达式;例如: x=2*y+1;s=sqrt(5); 多重赋值:变量1=变量2=变量n=表达式;例如: a=b=c=2;i=j=k=m+1; 复合赋值:变量双目操作符=表达式;例如: sum+=i;等价于sum=sum+i;,特殊语句,空语句、复合语句都属于特殊语句。 (1)如果语句只有一个分号,就是空语句。 程序执行空语句时不产生任何动作。它可以作为循环语句中的空循环体;或代替模块化程序设计中还尚未实现的以及暂不加入的部分。程序中有时需要加上
4、一个空语句来表示存在一条语句,但是随意加上分号有时会造成逻辑上的错误,因此,用户应该慎用或去掉程序中不必要的空语句。,10,复合语句,用一对花括号“”括起来的若干条语句 花括号中可以是说明语句、表达式语句、控制语句,也可以是复合语句 例如: if (ab) max=a; min=b; for(n=1; n= 100 ) printf(“dn”, p); break; ,11,复合语句(续),复合语句中如果有说明性语句,应该写在可执行语句的前面。,12,例如: main( ) int a,b; a=b=100; float c=10.23; printf(%fn,c); printf(%d %d
5、n,a,b); ,要特别注意: 花括号的配对 花括号的位置,C语言学习的难点之一,控制语句,1选择分支控制语句 if ( ) else switch ( ) 2循环控制语句 for ( ) while ( ) do while ( ) 3其他控制语句 break、continue、goto return,13,3.1.3 程序设计的步骤,(1)分析问题。分析清楚输入、输出和处理要求。即确定要产生的数据(称为输出);确定要进行输入的数据(称为输入);要解决的问题等。 (2)确定算法。研究确定一种算法,从有限步的输入中获取输出。也就是拟定处理的方法和步骤,包括用什么公式或进行怎样的运算。 (3)编
6、写源程序。把解题的算法表示成C程序。 (4)调试运行。把C程序输入计算机,编辑成C源程序文件;然后进行编译、链接和运行,修改错误,直到输出正确结果。,14,3.2 数据的输入与输出,数据的输入输出是程序设计中使用最普遍的基本操作。程序运行所需的数据通常要从外部设备(如键盘、文件、扫描仪等)输入,程序的运行结果通常也要输出到外部设备(如打印机、显示器、绘图仪、文件等)。 因此,输入、输出是用户与程序之间交互的主要手段。,15,3.2 数据的输入与输出,C语言本身虽然没有直接提供用于输入和输出的语句,但提供了输入和输出标准库函数(简称标准函数或库函数)。 由于标准输入输出函数的原型放在头文件std
7、io.h中,因此在编写程序时,要用编译预处理命令“#include”将头文件stdio.h包括到用户源文件中。 #include 或 #includestdio.h,16,格式输出函数,函数调用的一般形式: printf(格式控制字符串,输出项表); 功能:将各输出项的值按指定的格式显示在标准输出设备(如屏幕)上。 例如有程序段 : int a=123,b=100; printf(%d %d %dn,a,b,a+b); printf (c = %d + %d = %dn,a,b,a+b );,17,格式控制字符串,用双引号括起的字符串,用于指定输出数据的类型、格式、个数 包括:普通字符和格式说
8、明符,18,照原样输出,printf (c=%d+%d=%dn, a, b, a+b );,格式说明符:指定输出3个十进制整型数,分别为变量 a、b、ab的值,输出格式说明符,在和格式符之间可以使用格式修饰符,19,格式修饰符,例如: %ld 输出十进制长整型数 %m.nf 右对齐,m位域宽,n位小数或n个字符 %-m.nf 左对齐,20,例3.2 不同类型数据的输出。,#include void main() int a=-2; float b=123.456; char c=a; printf(a=%d,%3d,%-3dn,a,a,a); printf(a=%o, %x, %u, %3o,
9、 %3x, %3u n,a,a,a,a,a,a); printf(b=%f,%10.2f, %.2f, %5.2f, %-10.2fn,b,b,b,b,b); printf(b=%e, %10.2e, %.2e, %5.2e, %- 10.2en,b,b,b,b,b); printf(“c=%3c,%-3c,%dn”,c,c,c); printf(%3s,%7.2s,%.3s,%-5.3sn,CHINA,CHINA,CHINA,CHINA); ,21,程序输出: a=-2,-2,-2 a=37777777776,fffffffe,4294967294,37777777776,fffffffe,
10、4294967294 b=123.456001,123.46,123.46, 123.46, 123.46 b=1.234560e+002, 1.23e+002, 1.23e+002, 1.23e+002, 1.23e+002 c=a, c= a, 97 CHINA, CI,CHI,CHI,注意:,printf函数格式控制中的格式说明符与输出参数的个数和类型必须一一对应。 格式说明必须以“%”开头,“ %” 和后面的描述符之间不能有空格。除 %X、%E、%G外类型描述符必须是小写字母。 格式控制字符串中,可包含转义字符。 不同的系统在实现格式输出时,输出结果可能会有一些小的差别。,22,格式输
11、入函数,函数调用的一般形式: scanf(格式控制字符串,输入项表); 功能:按格式控制指定的格式,从标准输入设备(即键盘)交互输入数据,并依次存放到对应地址参数指定的变量中(即将输入值赋给变量)。 例如: scanf (%d%f,23,格式控制字符串,用双引号括起的字符串,用于指定输入数据的类型、格式、个数以及输入的形式 包括:普通字符和格式说明符,24,照原样输入,scanf (a=%d, b=%d, ,格式说明符:指定输入2个十进制整型数赋给变量 a 和 b,输入格式说明符,在和格式符之间可以使用附加说明符,25,附加格式说明符,例如: %ld、%lo输入十进制、八进制长整型数 %lf、
12、%le输入双精度实型数 %mf输入m位数(域宽) %*d忽略输入的一个整型数,26,对float和double型指整数位数+小数点 +小数位数,例如:,scanf (%d%d%d, 输入的形式是:a=32, b=28 (普通字符要照原样输入),27,程序举例:,main( ) int a,b,c; long m; float x; double y; char ch, string20; printf(input a,b,c,m: ); scanf(%d %o %x %ld, ,28,使用scanf函数应注意:,要求在程序运行中输入数据,输入的数据个数和类型必须与格式说明符一一对应。 地址参数
13、形式: putchar(n); putchar(101); putchar(st);,31,说明,putchar是C语言的标准库函数,使用时必须加编译预处理命令: #include “stdio.h” 或 #include 【例】利用putchar函数输出字符。,32,#include stdio.h main( ) char c1,c2; c1=a ; c2=b ; putchar(c1);putchar(c2); putchar(n); putchar(c1-32);putchar(c2-32); putchar(n); ,输出结果:ab AB,字符输入函数,函数调用的一般形式 : get
14、char( ) 功能: 从标准输入设备(即键盘)上交互输入一个字符。 例如: getchar( ) ; c = getchar( ); printf(%c n,getchar( );,33,例如:,【例】getchar函数的应用。 #include stdio.h main( ) char ch; ch=getchar( ); printf(%c %dn,ch,ch); printf(%c %dnn,ch-32,ch-32); ,34,程序运行时输入:m 并按回车键后 输出结果是: m 109 M 77,说明:,getchar是C语言的标准库函数,使用时必须加编译预处理命令: #include
15、 stdio.h 或 #include getchar函数需要交互输入,接收到输入字符之后才继续执行程序。 连续使用getchar函数时,要注意字符的输入形式 ,例如执行如下程序段:,35,char ch1,ch2; ch1=getchar( ); ch2=getchar( );,必须连续输入两个字符,中间不能有其他字符,3.3 顺序结构程序设计,36,顺序结构是程序设计语言最基本、最简单的结构,也称线性结构。程序中包含的语句按照书写的顺序被连续执行。,语句按书写顺序执行,先执行A,再执行B。其中A、B可由一条或多条语句实现。,3.3 顺序结构程序设计,37,可用: 变量初始化 赋值语句 输入
16、函数调用语句,注意各个语句的顺序,顺序结构程序设计举例1,【例】数据交换。从键盘输入a、b的值,输出交换以后的值。 思路:在计算机中交换变量a和b的值,不能只写下面两个赋值语句 a=b ; b=a ;,38,?,正确的交换方法: c=a ; a=b ; b=c;,程序:,main( ) int a,b,c; printf(ninput a, b: ); scanf(%d,%d, ,39,程序运行情况如下: input a, b: 32, 57 before exchange: a=32 b=57 after exchange: a=57 b=32,举例2:,【例】已知三条边a、b、c,求三角形
17、面积。计算三角形面积的海伦公式:,40,其中:,设定义: 整型变量 a、b、c 实型变量 s 、 area,程序如下:,#include math.h main( ) int a,b,c; float s,area ; scanf(%d, %d, %d, ,41,实际上还需要判断a、b、c是否能构成三角形,即应该进行选择判断处理,程序运行情况如下: 3,4,5 area = 6.000,例3.5 :,【例3.5】从键盘输入一个小写字母,用大写形式输出该字母。应用指针完成相应功能。 #include stdio.h void main() char *p,c; /*p为指向字符的指针变量,c为字
18、符变量*/ p= ,42,例3.6 :,【例3.6】输入一个三位正整数,然后逆序输出。例如,输入456,输出654。 #include void main() int x; /*保存输入的三位整数*/ int x1,x10,x100; /*分别保存x的个、十和百位数*/ printf(请输入一个三位整数); scanf(“%3d”, ,43,3.4 选择结构 的程序设计,if语句 1 if语句的一般形式 2 if语句的嵌套 switch语句 1 switch语句的一般形式 2 break语句 选择结构程序设计举例,44,语句一般格式: if (表达式) 语句,45,功能: 首先计算圆括号中表达
19、式的值,如果表达式的值为真(非零值)时,则执行圆括号其后的语句,然后执行该语句后面的下一个语句。如果表达式的值为假(“0”),则跳过圆括号后面的语句,直接执行if语句后面的下一个语句。,3.4.1 if选择结构,简单分支语句,简单分支语句的算法:,例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; ,46,例3.7 :,【例3.7】输入两个整数,输出其中较大的数。 #include stdio.h void main() int a,b,max; printf(请输入两个整数: ); scanf(%d%d, ,47,也可改写为: #include stdio.h
20、void main() int a,b; printf(请输入两个整数: ); scanf(%d%d, ,48,双分支语句,语句一般格式 if (表达式) 语句1 else 语句2 功能: 首先计算小括号中的表达式,如果表达式的值为真(非“0”),则执行紧跟其后的语句1,执行完语句1后,执行if-else结构后面的下一条语句;如果表达式的值为假(“0”),则执行else关键字后面的语句2。,49,双分支语句的算法:,例如: if (x0) m+; else m-; if ( ch= a ,50,例3.9 :,【例3.9】输入两个整数,用双分支的if语句,输出其中较大的数。 #include s
21、tdio.h void main() int a,b; printf(请输入两个整数: ); scanf(%d%d, ,51,多分支语句,语句一般格式: if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式m) 语句m else 语句 n 功能: 依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n 无论执行完那个语句分支,都转到后续语句,52,多重分支语句的算法,流程图,53,表达式m ?,多重分支语句的算法,N-S结构图,54,例如: if (a0) x= -1 ; else if (a=0 ) x= 0 ; else x=1 ;,例3
22、.10 :,【例3.10】根据录入的百分制成绩,显示相应的成绩等级。 #include stdio.h void main ( ) int score; printf (请输入成绩 : ); scanf (%d, ,55,说明:,(1) 以上3种if语句中if后面的条件表达式,一般是逻辑表达式或关系表达式,也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量、常量。例如: if(b) 语句; if(5) 语句; 都是允许的。 在执行if语句时,系统先对表达式进行求解,若表达式的值为“0”,按“假”处理,若表达式的值为非“0”,则按“真”处理,执行指定的语句。,56,说明:,(2) 在if语
23、句中,条件判断表达式必须用圆括号括起来,在语句之后必须加分号。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。 (3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行多个语句,则必须把这多个语句用“”括起来组成一个复合语句。但要注意的是在“”之后不能再加分号。,57,3.4.2 switch选择结构,switch语句的一般形式 : switch (表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 case 常量表达式n: 语句序列n default : 语句序列n+1 功能: 计算表达式的值,与常量表达式
24、的值比较,等于第i个值时,顺序执行语句序列i、i+1、 、 n+1 若与所有常量表达式值都不相等,执行语句序列n+1。,58,switch语句的算法描述,N-S结构图,59,60,【例3.11 】要求输入一个数字,输出一个英文单词。 #include stdio.h void main() int a; printf(input integer number: ); scanf(“%d”,61,switch (a) case 1: printf(Monday.); case 2: printf(Tuesday.); case 3: printf(Wednesday.); case 4: pri
25、ntf(Thursday.); case 5: printf(Friday.); case 6: printf(Saturday.); case 7: printf(Sunday.); default:printf(error.); ,从键盘输入数字5之后,程序运行结果输出: Friday. Saturday. Sunday. error.。 “case 常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。 语句位置影响运行结果,62,switch与break语句结合才能实现 程序的分支,63,switch (a) case 1: print
26、f(Monday.); break; case 2: printf(Tuesday.); break; case 3: printf(Wednesday.); break; case 4: printf(Thursday.); break; case 5: printf(Friday.); break; case 6: printf(Saturday.); break; case 7: printf(Sunday.); break; default:printf(error.); ,说明:,(1)一定要用圆括号把 switch 后面的表达式括起来,否则会给出出错信息。 (2)常量表达式与cas
27、e之间通常应有至少一个空格,否则可能被编译系统认为是语句标号,如case5,并出现语法错误,这类错误较难查找。 (3)所有case子句后所列的常量表达式值必须互不相同,否则就会互相矛盾。,64,说明:,(4)每个 case后面的常量表达式的类型,必须与 switch 关键字后面的表达式类型一致。每个 case只能列举一个整型常量或字符型常量,否则会出现语法错误。 (5)一定要用花括号将 switch 里的case、default等括起来。在case后面可以包含多条执行语句,但可以不必用花括号括起来,系统会自动顺序执行本case后面所有的执行语句。当然加上花括号也可以。 (6)switch语句结
28、构清晰,易理解,任一switch语句均可用条件语句来实现,但反之不然。原因是switch语句中的表达式只能取整型或字符型,而条件语句中的表达式可取任意类型的值。 (7)多个case还可以共用一组执行语句。,65,switch语句的简单应用,【例】已知x=100,y=15,要求输入一个算术运算符(+、-、* 或 / ),并对x和y进行指定的算术运算。,66,思路: 设x和y为float型变量并赋初值; 输入的运算符op为char型变量; 根据op的值(为+、-、*、/)进行x和y的相加、相减、相乘、相除运算(选择分支); 还要考虑到输入字符不是+、-、* 或 / 时的情况,程序:,#includ
29、e stdio.h main( ) float x=100,y=15,z; char op; op=getchar( ); switch (op) case +: z=x+y; break; case -: z=x-y; break; case *: z=x*y; break; case /: z=x/y; break; default: z=0; if(int)z!=0) printf(%f%c%f=%fn,x,op,y,z); else printf (%c is not an operatorn,op); ,67,实型数通常不使用z=0或z!=0的比较 可用if(int)z) 代替,3.
30、4.3 选择结构嵌套,如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。,68,一般形式可表示如下:,if(表达式1) if(表达式1_1) 语句1_1 else 语句1_2 else if(表达式2_1) 语句2_1 else 语句2_2,3.4.3 选择结构嵌套,69,【例3.13】比较两个整数的关系。 #include main( ) int x, y; printf (Enter integer X and Y:); scanf (%d%d, ,应该正确判断: if的内嵌语句 if和else的配对,提倡缩格书写有利于阅读程序,if语句嵌套的形式,简单if语句的嵌套形式 i
31、f (表达式) if 语句 双重(或多重)分支if语句的嵌套形式 if (表达式) if 语句 else if 语句,70,可以是各种形式的if语句,可以是各种形式的if语句,如果是简单if语句, 必须用“ ”括起,例如:, if (c=50) printf(50=50) printf(50150n); if (c=50) printf(50=c=100n); else printf(c50n),71,与哪个if 配对?,再例如:,if(ab) if(ac) if(ad) m=1; else m=2; else m=3;,72,问题:哪一个 else 和哪一个 if 相匹配?,规则:在嵌套的i
32、felse语句中,else总是与上面的离它最近的尚未配对的if 配对。,【例3.14 】比较两个整数的关系,有以下几种写法,请读者判断哪些是正确的? 程序1: if(x=y) if (xy) c=; else c=; else c=; printf (%d%c%dn,x,c,y);,73,程序2:将上面程序的if语句改为: if ( xy ) c=; else c=; 程序3:将上面程序的if语句改为: c=y ) c=; else c=;,74,程序4: c=; if ( x=y ) if ( xy ) c=; else c=; 程序1和2是正确的。一般把内嵌的if语句放在外层的else子句
33、中(如程序1那样),这样由于有外层的else相隔,内嵌的else不会和外层的if配对,而只能与内嵌的if配对,从而不致搞混,如像程序3、4那样就容易混淆。,75,学习if语句的难点,if else 语句的配对 正确用表达式描述条件 例如:当x大于5小于10时令x自增,76,正确判断内嵌语句 例如:if(xy) x=x+3; y=y-2; else x=x-3; y=y+2;,if ( 55 , , ,熟悉常用的if 表达式形式,例如有定义:int a,b=0; a等于什么值时,执行b=2 ;语句? if (a=0) b=2; if (a=1) b=2; if (a!=0) b=2; if (a
34、=1) b=2; if (a=0) b=2; if (a) b=2; if (!a) b=2;,77,等价于,等价于,3.4.4 选择结构程序举例,【例3.18】求一元二次方程ax2+bx+c=0的根。,78,思路:一元二次方程的根取决于系数a,b,c 求根公式:,判别式d = b2- 4ac 当 d = 0时,方程有两个相等的实根: x1=x2=-b/(2*a) 当d 0时,方程有两个不相等的实根: x1=(-b+sqrt(d)/(2*a) x2=(-b-sqrt(d)/(2*a) 当d 0时,方程有两个虚根: x1=jp+ipi x2=jp-ipi,实部 jp=-b/(2*a) 虚部 ip
35、=sqrt(-d)/(2*a),算法:,79,程序:,#include math.h main( ) float a,b,c,d,x1,x2,lp,ip; scanf(%f%f%f, ,80,程序(续):,else if (d1e-6) /* 不相等的实根 */ x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(has two real roots:n) ; printf(x1=%8.4f, x2=%8.4fn,x1,x2); else /* 虚根 */ lp=-b/(2*a);ip=sqrt(-d)/(2*a); printf(has tw
36、o complex roots: n); printf(x1=%8.4f+%8.4fin,lp,ip); printf(x2=%8.4f-%8.4fin,lp,ip); ,81,举例(续):,【例】输入年份,判别该年是否为闰年。,82,思路:年份year为闰年的条件为 能够被4整除,但不能被100整除的年份; 能够被400整除的年份。 只要满足任意一个就可以确定它是闰年。 例如: 1996年、2000年是闰年 1998年、1900年不是闰年,设定标志变量leap,只要符合其中一个条件的就是闰年,令 leap =1;否则令 leap=0,算法:,year%4=0 scanf(%d, ,84,3.
37、5 循环结构的程序设计,while循环控制 do-while循环控制 for循环控制 用goto语句实现循环控制 循环结构中的跳转语句 循环的嵌套 循环结构程序设计举例,85,3.5.1 while语句,语句一般格式: while (表达式) 语句,86,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分,功能:,首先计算表达式的值,当值为真(非“0”)时,执行循环体语句。之后继续判断表达式的值是否为真(非“0”),如果为真(非“0”),继续执行循环体语句,再进行判断,如此重复
38、,直到表达式的值为假(“0”),则离开循环结构,转去执行while语句后面的下一条语句。,87,功能:,88,循环控制条件,循环体,例如:,【例3.20】编写程序,求100个自然数的和 即: s=1+2+3+ +100,89,思路:寻找加数与求和的规律,加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。,算法和程序:,main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum); ,90,i:
39、 循环控制变量 sum: 累加器,程序输出结果: sum=5050,注意:,(1)while语句:先判断表达式,后执行语句。循环体可能执行多次,也可能一次也不执行(例如当i的初值=101) 。 (2)while语句中的表达式一般是关系表达或逻辑表达式或任意合法的表达式,其两端的圆括号不能少,只要表达式的值为真(非“0”)即可继续循环。例如: x=10; while(x!=0) x-; /*退出循环时x为0*/ 等价于: x=10; while(x) x-; /*退出循环时x为0*/ 也可写成: x=10; while(x-); /*退出循环时x为-1*/,91,注意(续):,(3)循环之前循环
40、变量应有值,以能够在进入循环时计算条件(表达式)。 (4)循环体语句如果包括一个以上的语句,则必须用一对大括号括起来,组成复合语句。如果不加大括号,则while语句的范围只到while后面第一个分号结束。 (5)循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。,92,while (i=100) i+; sum=sum+i; ,运行后,输出: sum=5150 原因是什么?,注意(续):,(6)不要把if语句构成的选择结构与while语句构成的循环语句等同起来。在if语句中,若条件表达式成立,if语句块只执行一次;而在while语句中,只要条件表达式成立,就执行循环体直至条件为不成立为
41、止。可见,循环体被执行的次数受条件控制,如果条件表达式永远成立,循环体就要一直执行下去。为了避免这种现象,在设计循环时,循环体内应该有改变条件表达式值的语句,使条件表达式的值最终变成0而结束循环。,93,3.5.2 do-while语句,语句一般格式: do 语句 while (表达式); 功能: 先执行循环体语句一次,再判别表达式的值,若为真(非“0”)则继续执行循环体语句,然后再判断表达式的值,如此重复,直到表达式的值为假(“0”)时结束循环,转去执行do-while语句后的下一条语句。,94,do-while循环的算法,main( ) int i=1,sum=0; do sum=sum+
42、i; i+; while (i=100); printf(%dn,sum); ,95,N-S结构图,用do-while语句 求100个自然数的和,说明:,(1)“表达式”为关系表达式、逻辑表达式和任意合法的表达式,两端的圆括号不能少。在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号。 (2)在do和while之间的循环体如果由多个语句组成时,也必须用大括号括起来组成一个复合语句。,96,说明:,while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,97,区别: do- while 语句先执行循
43、环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行 dowhile循环体中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。,3.5.3 for循环结构,语句一般格式 for (表达式1;表达式2;表达式3) 语句,98,功能: 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,for语句的算法,例如: main( ) int i,sum; sum=0; for ( i=1; i=
44、100; i+) sum=sum+i; printf(sum=%dn,sum); ,99,可部分或全部省略,但“;”不可省略,省略for语句的表达式, 表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环),100,注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行, 省略表达式1和表达式3,即: for(;表达式2;) 就等同于:while( 表达式2 ) 省略表达式2,即: for(表达式1; ;表达式3) 就等同于:表达式1; while(1)表达式3;,例如:, i=1; for ( ; i100) fo
45、r (i=1; i100) i+; ,101,说明:,所有用 while 语句实现的循环都可以用for 语句实现。,102,等价于:,for(表达式1;表达式2 ;表达式3) 语句;,表达式1; while (表达式2) 语句; 表达式3; ,for语句的简单应用,【例】求n! ,即计算p=123n的值。,103,思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。,设置: 乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入) 累乘器 p ,每次循环令p = p*i,程序:,main( ) int i, n; long p; p=1; printf(Enter n:);
46、 scanf(%d, ,104,思考: 如何输出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,几种循环语句的比较,while和do-while语句的表达式只有一个,for语句有三个。 while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。,105,while语句多用于循环次数不定的情况 do-while语句多用于至少要运行一次的情况 for语句多用于要赋初值或循环次数固定的情况,3.5.4 continue语句和break语句,有如下三种语句实现跳转: continue语句 break语句 goto语句 在循环语句的循环体中使
47、用,可以进行循环的流程控制,106,continue语句及应用,功能: 中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。,107,while语句,do-while语句,for语句,例如:, int x,n=0,s=0; while (n10) scanf(%d,108, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+) scanf(%d, ,应用举例,【例】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。,109,算法和程序,main( ) int n,j=0; for(
48、n=100;n=200;n+) if (n%7!=0) continue; printf(%6d,n); j+; if (j%10=0) printf(n); printf( n j=%dn,j); ,110,循环中break的应用,功能: 利用break语句能够强迫终止本层循环,转到后续语句执行。,111,while语句,do-while语句,for语句,例如:, int x,n=0,s=0; while (n10) scanf(%d,112, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+ ) scanf(%d, ,3.5.5 goto语
49、句,113,goto 语句标号;,注意: (1)goto语句能实现程序无条件转移,与if语句一起构成循环结构,为编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。 (2)goto语句可以随意从循环体中跳转到循环体外或从循环体外跳转至循环体内,使用时要慎重考虑程序的逻辑结构。因此应限制使用。,3.5.6 循环的嵌套,如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套。 例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?%4dn:%4d,i*j); ,114
50、,外循环语句,内循环语句,注意:,while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。 不同层次一般要采用不同的循环控制变量。多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。 例如:,115,for(a=1;a=10;a+) for (b=0;b=5;b+) ,外循环执行了10次,内循环执行6次 循环正常结束时,内循环执行了106=60次,【例】编程序,输出以下图形。,116,* * * *,一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的空格和星
51、号: j 从1变化到 i,每次输出一个空格 j 从1变化到 8-2*i1,每次输出一个星号,使用双重循环实现,思路:,算法和程序:,main( ) int i,j; for (i=1; i=4; i+) for (j=1; j=i; j+) printf( ); for (j=1;j=8-(2*i-1);j+) printf(*); printf(n); ,117,思考: 如何输出10行图形? 输出图形向右平移20个字符位置,应如何修改程序?,【例】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。,118,思路:素数是指只能被1和它本身整除的数,如5、7、11、17、等。,分别用2、3、,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。,这是一种穷举算法 设除数为j,从2循环到m-1,3.5.7 循环结构程序举例,算法和程序:,#include math.h main( ) int j,m,k; printf(Enter an integer number: ); scanf(%d, ,119,程序的优化,对于穷举法来说,为了提高程序的效率,就要减少尝试次数。,120,#include math.h main( ) int j,m,k; printf(Enter an integer number: ); s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔科用生物材料性能考核试卷
- 演出经纪人职业素养提升与道德规范践行考核试卷
- 矿用设备虚拟现实维修培训考核试卷
- 电影道具制作中的艺术表现考核试卷
- 纺织品企业战略合作伙伴关系管理考核试卷
- 核果类水果种植园防寒保暖考核试卷
- 电缆的绝缘材料耐热性能研究考核试卷
- 辽宁省阜新市清河门区2025届三下数学期末联考模拟试题含解析
- 济宁医学院《机器人学》2023-2024学年第二学期期末试卷
- 泉州海洋职业学院《三维动画综合实训》2023-2024学年第一学期期末试卷
- 2024年内蒙古师范大学招聘事业编制人员考试真题
- (二模)2025年河南省五市高三第二次联考历史试卷(含答案)
- 《劳动项目五:煮鸡蛋》(教案)-2024-2025学年人教版劳动三年级上册
- (三模)广西2025届高中毕业班4月份适应性测试 英语试卷(含答案解析)
- (四调)武汉市2025届高中毕业生四月调研考试 物理试卷(含答案)
- 福建省部分地市校(福州厦门泉州三明南平莆田漳州)高三下学期3月质量检测化学试题(原卷版)
- 2025年南阳科技职业学院单招综合素质考试题库及答案1套
- 2025年济南市中区九年级中考数学一模考试试题(含答案)
- 《2025 ACC急性冠状动脉综合征管理指南》解读
- 双休背后:从“要我学”到“我要学”的转变-高三家长会
- 中国印楝素市场调查报告
评论
0/150
提交评论