程序控制流课件_第1页
程序控制流课件_第2页
程序控制流课件_第3页
程序控制流课件_第4页
程序控制流课件_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

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

文档简介

第三章

程序控制流顺序结构程序设计选择结构程序设计循环控制结构程序设计〔一〕顺序结构程序设计内容C语句概述数据输入输出顺序结构程序设计举例〔1.1〕C语言概述C语句概述C语句是用来向计算机系统发出操作指令。一个语句经编译后产生假设干条机器指令。一个实际的程序应当包含假设干语句。应当指出,C语句都是用来完成一定操作任务的。变量定义局部的内容不应称为语句。如:inta;不是一个C语句,它不产生机器操作,而只是对变量的定义。C程序结构C语句分类C程序的语句有五种,分号“;〞是C语句结束的标志:1〕控制语句。完成一定的控制功能。如: if语句、for语言、break语句等。2〕函数调用语句。函数调用语句由一个函数调用加一个分号构成。如: printf(“thisisacstatement.〞);3〕表达式语句。任何表达式加上分号构成,如: x=1;y=x+y;--x;y+1;4〕空语句。仅由一个分号构成,如: ;5〕复合语句。用{}括起来组成的一个语句,如: if〔a>b〕{x=0;b=b+1;x=a;}〔1.2〕数据输入输出对数据输入输出的理解1〕所谓输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示屏、打印机、磁盘等)输出数据称为“输出〞;从外部向输入设备(如键盘、磁盘、光盘、扫描仪等)输入数据称为“输入〞。2〕C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在C标准函数库中提供了一些输入输出函数,例如,printf函数和scanf函数。3〕在使用C语言库函数时,要用预编译命令“#include〞将有关的“头文件〞包括到用户源文件中。如在调用标准输入输出库函数时,文件开头应有以下预编译命令:#include<stdio.h>根本输入输出函数最根本输入输出函数有:printf()(格式输出)scanf()(格式输入)putchar()(字符输出)getchar()(字符输入)注意:在调用上述根本库函数时,应在程序开始处包含标准输入输出头文件,即: #include<stdio.h>putchar函数putchar函数的作用是向终端输出一个字符.例3.1:输出单个字符。#include<stduio.h>intmain(){ chara; charb; charc;

a=‘B’; b=‘O’; c=‘Y';

putchar(a); putchar(b); putchar(c);

return1;}运行结果:BOYputchar函数putchar函数原型: intputchar(intc)其中:c是待输出字符的ASCII码。用putchar函数既可以输出能在屏幕上显示的字符;也可以输出控制字符;如: putchar(‘\n’)〔输出一个换行符〕还可以输出其他转义字符,如: putchar('\101') (输出字符'a') putchar('\'') (输出单引号字符') putchar('\015')(输出回车)getchar函数getchar是从终端(或系统隐含指定的输入设备)输入一个字符。例3.2:输入单个字符#include<stdio.h>intmain(){ charc;

c=getchar(); putchar(c); return1;}getchar函数函数原型: intgetchar(void);说明:没有参数,返回获取到的字符的ASCII。请注意,getchar()只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一局部。例如: putchar(getchar());也可以用printf函数输出: printf(〞%c",getchar());printf函数功能:通过标准输出设备〔如显示器〕输出一组数据。输出形式由“格式控制〞字符串规定。格式:printf(“格式控制〞,输出表列);如:printf(“%d,%c\n〞,i,c);说明:“格式控制〞是用双引号括起来的字符串,也称“转换控制字符串〞,它包括两种信息:1〕格式说明,由“%〞和格式字符组成,如%d,%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%〞字符开始的。2〕普通字符,即需要原样输出的字符。例如上面printf函数中双引号内的逗号、空格和换行符。“输出表列〞是需要输出的一些数据,可以是表达式。printf函数的格式字符〔1/10〕对不同类型的数据用不同的格式字符。常用的有以下几种格式字符:1〕d格式符。用来输出十进制整数。有以下几种用法:①%d,按整型数据的实际长度输出。②%md,m为指定的输出字段的宽度。如果数据的位数小于m,那么左端补以空格,假设大于m,那么按实际位数输出。如 printf("%4d,%4d",a,b);假设a=123,b=12345,那么输出结果为 123,12345③%ld,输出长整型数据。如 longa=135790; printf("%ld",a);printf函数的格式字符〔2/10〕2)o格式符,以八进制数形式输出整数。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一局部输出。例如: inta=-1; printf("%d,%o",a,a);-1在内存单元中的存放形式(以补码形式存放)如下: 1111111111111111输出为-1,177777同样可以指定字段宽度,如printf(“a:%8o〞,a)输出为: a:177777printf函数的格式字符〔3/10〕3〕x格式符,以十六进制数形式输出整数。同样不会出现负的十六进制数。例如: inta=-1; printf(“%x,%o,%d〞,a,a,a);输出结果为ffff,177777,-1同样可以用“%lx〞输出长整型数;也可以指定输出字段的宽度,如“%12x〞。printf函数的格式字符〔4/10〕4〕u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。一个有符号整数(int型)也可以用%u格式输出;反之,一个unsigned型数据也可以用%d格式输出。按相互赋值的规那么处理(见前面的赋值规那么描述)。unsigned型数据也可用%o或%x格式输出。printf函数的格式字符〔5/10〕例3.3:无符号数据的输出:intmain(){ unsignedinta=65535; intb=-2;

printf("a=%d,%o,%x,%u\n",a,a,a,a); printf("b=%d,%o,%x,%u\n",b,b,b,b); return1;}运行结果为: a=-1,177777,ffff,65535 b=-2,177776,fffe,65534printf函数的格式字符〔6/10〕5〕c格式符,用来输出一个字符。如: charc='a'; printf("%c",c);输出字符‘a’,请注意:“%c〞中的c是格式符,逗号右边的c是变量名,不要搞混。一个整数,只要它的值在0~255范围内,也可以用字符形式输出,在输出前,系统会将该整数作为ascii码转换成相应的字符;反之,一个字符数据也可以用整数形式输出。printf函数的格式字符〔7/10〕例3.4:字符数据的输出:intmain(){ charc='a'; inti=97;

printf("%c,%d\n",c,c); printf(“%c,%d\n〞,i,i);

return1;}运行结果为: a,97 a,97也可以指定输出字数宽度,如:printf("%3c",c)printf函数的格式字符〔8/10〕6〕s格式符,用来输出一个字符串。有几种用法:%s,例如:printf("%s","china")%ms,输出的字符串占m列,如字符串本身长度大于m,那么突破m的限制,将字符串全部输出。假设串长小于m,那么左补空格。%-ms,如果串长小于m,那么在m列范围内,字符串向左靠,右补空格。%m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。%-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,那么m自动取n值,即保证n个字符正常输出。printf函数的格式字符〔9/10〕例3.5:字符串的输出intmain(){ printf(“%3s,%7.2s,%.4s,%-5.3s\n〞, “china〞, “china〞, “china〞, “china〞);

return1;}输出如下:china,ch,chin,chi其中第3个输出项,格式说明为“%.4s〞,即只指定了n,没指定m,自动使m=n=4,故占4列。printf函数的格式字符〔10/10〕7〕其它格式符,如f、e等,需要时查相关文档,一看就明白。scanf函数功能:从终端输入任何类型的多个数据。格式:scanf("格式控制",地址表列)说明:“格式控制〞的含义同printf函数;“地址表列〞是由假设干个地址组成的表列,可以是变量的地址,或字符串的首地址。scanf函数例如例3.9:用scanf函数输入数据。intmain(){ inta; intb; intc;

scanf(“%d%d%d〞,&a,&b,&c); printf(“%d,%d,%d\n〞,a,b,c);

return1;}&a、&b、&c指a、b、c在内存中的地址,按照a、b、c在内存的地址将a、b、c的值存进去。scanf函数格式说明〔1/2〕与printf函数中的格式说明相似,以%开始,以一个格式字符结束,中间可以插入附加的字符。说明:1)对unsigned型变量所需的数据,可以用%u,%d或%o,%x格式输入。2)可以指定输入数据所占列数,系统自动按它截取所需数据。如,scanf("%3d%3d“,&a,&b);输入:123456系统自动将123赋给a,456赋给b。此方法也可用于字符型:scanf("%3c“,&ch);如果从键盘连续输入3个字符abc,由于ch只能容纳一个字符,系统就把第一个字符‘a’赋给ch。scanf函数格式说明〔2/2〕3〕如果在%后有一个“*〞附加说明符,表示跳过它指定的列数。例如: scanf(“%2d%*3d%2d〞,&a,&b);如果输入如下信息: 1234567将12赋给a,%*3d表示读入3位整数但不赋给任何变量。然后再读入2位整数67赋给b。4〕输入数据时不能规定精度,例如:scanf("%7.2f“,&a);是不合法的,不能企图用这样的scanf函数并输入以下数据而使a的值为12345.67。1234567使用scanf函数时应注意的问题〔1/4〕1〕scanf函数中的“格式控制〞后面应当是变量地址,而不应是变量名。例如,如果a、b为整型变量,那么 scanf("%d,%d",a,b);是不对的,应将“a,b〞改为“&a,&b〞。2〕如果在“格式控制〞字符串中除了格式说明以外还有其他字符,那么在输入数据时应输入与这些字符相同的字符。例如 scanf("%d,%d“,&a,&b);输入时应用如下形式:3,4注意3后面是逗号,它与scanf函数中的“格式控制〞中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的:34(不对) 3:4(不对)使用scanf函数时应注意的问题〔2/4〕如果是 scanf(“%d%d〞,&a,&b);输入时两个数据间应空2个或更多的空格字符: 1034或1034如果是 scanf(“%d:%d:%d〞,&h,&m,&s);输入应该用以下形式:12:23:36如果是 scanf("a=%d,b=%d,c=%d“,&a,&b,&c);输入应为以下形式:a=12,b=24,c=36使用scanf函数时应注意的问题〔3/4〕3〕在用“%c〞格式输入字符时,空格字符和“转义字符〞都作为有效字符输入: scanf("%c%c%c“,&c1,&c2,&c3);如输入abc字符‘a’送给c1,字符‘’送给c2,字符‘b’送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此‘’作为下一个字符送给c2。使用scanf函数时应注意的问题〔4/4〕4〕在输入数据时,遇以下情况时该数据认为结束。①遇空格,或按“回车〞或“跳格〞(tab)键。②按指定的宽度结束,如“%3d〞,只取3列。③遇非法输入。如 scanf("%d%c%f",&a,&b,&c);输入 1234a1230.26 ↓↓↓ abc第一个数据对应%d格式在输入1234之后遇字母a,因此认为数值1234后已没有数字了,第一个数据到此结束,把1234送给变量a。字符‘a’送给变量b,由于%c只要求输入一个字符,因此输入字符a之后不需要加空格,后面的数值应送给变量c。如果由于疏忽把本来应为1230.26错打成123o.26,由于123后面出现字母‘o’,就认为该数值数据到此结束,将123送给c。〔1.3〕顺序结构程序设计举例例1〔1/2〕例3.10:输入三角形的三边长,求三角形面积。为简单起见,设输入的三边长a、b、c能构成三角形。从数学知识求三角形面积的公式为其中s=(a+b+c)/2

例1〔2/2〕#include<math.h>#include<stdio.h>intmain(){ floata,b,c,s,area;

scanf("%f,%f,%f“,&a,&b,&c);

s =1.0/2*(a+b+c); area =sqrt(s*(s-a)*(s-b)*(s-c));

printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n“,a,b,c,s); printf("area=%7.2f\n",area);

return1;}例2例3.12从键盘输入一个大写字母,要求改用小写字母输出。#include<stdio.h>intmain(){ charcl; charc2;

cl=getchar(); printf(“%c,%d\n〞,cl,cl);

c2=cl+32; //转换为小写 printf(“%c,%d\n〞,c2,c2); return1;}练习〔二〕选择结构程序设计内容关系运算符和关系表达式逻辑运算符和逻辑表达式if语句条件运算符switch语句程序举例总述选择结构,是三种根本结构之一。它的作用是:根据所指定的条件是否满足,决定从给定的两组操作选择其一。例如:if(x>0){ y=1;}else{ y=-1;}〔2.1〕关系运算符和关系表达式关系运算符与关系表达式所谓“关系运算〞实际上是“比较运算〞。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如:a>3是一个关系表达式,大于号(>)是一个关系运算符。如果a的值为5,那么满足给定的“a>3〞条件,因此关系表达式的值为“真〞(即“条件满足〞);如果a的值为2,不满足“a>3〞条件,那么称关系表达式的值为“假〞。关系运算符与关系表达式语言提供6种关系运算符:①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)⑤==(等于)⑥!=(不等于)优先级相同(高)优先级相同(低)关系运算符与关系表达式关于优先次序:1〕前4种关系运算符(<,<=,>,>=)的优先级别相同,后两种也相同。前4种高于后2种。2〕关系运算符的优先级低于算术运算符。3〕关系运算符的优先级高于赋值运算符。关系表达式〔1/2〕用关系运算符将两个表达式连接起来的式子,称关系表达式。其中,这两个表达式可以是:算术表达式关系表达式逻辑表达式赋值表达式字符表达式如:a>b,a+b>b+c,(a=3)>(b=5),‘a’<‘b’,(a>b)>(b<c)关系表达式〔2/2〕关系表达式的值是一个逻辑值,即“真〞或“假〞。例如,关系表达式“5==3〞的值为“假〞,“5>=0〞的值为“真〞。C语言没有逻辑型数据,以1代表“真〞,以“0〞代表“假〞。如:设a=3,b=2,c=1,那么以下赋值表达式:1〕d=a>b d的值为1。2〕f=a>b>c f的值为0(因为“>〞运算符是自左至右的结合方向,先执行“a>b〞得值为1,再执行关系运算“1>c〞,得值0,赋给f)。〔2.2〕逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。如: (a>b)&&(x>y)逻辑运算符C语言提供三种逻辑运算符:1〕&&逻辑与2〕||逻辑或3〕!逻辑非“&&〞和“||〞是“双目(元)运算符〞,它要求有两个运算量(操作数),如(a>b)&&(x>y),(a>b)||(x>y)。“!〞是“一目(元)运算符〞,只要求有一个运算量,如(a>b)。举例: a&&b 假设a、b为真,那么a&&b为真。 a||b 假设a、b之一为真,那么a||b为真。 a 假设a为真,那么!a为假。在一个逻辑表达式中如果包含多个逻辑运算符,如 !a&&b||x>y&&c逻辑运算符优先级按以下的优先次序:(1)!(非)→&&(与)→(或),即“!〞为三者中最高的。(2)逻辑运算符中的“&&〞和“||〞低于关系运算符,“!〞高于算术运算符。逻辑表达式〔1/2〕逻辑表达式的值应该是一个逻辑量“真〞或“假〞。C语言编译系统在给出逻辑运算结果时,以数值1代表“真〞,以0代表“假〞,但在判断一个量是否为“真〞时,以0代表“假〞,以非0代表“真〞。即将一个非零的数值认作为“真〞。例如:1〕假设a=4,那么!a的值为0。因为a的值为非0,被认作“真〞,对它进行“非〞运算,得“假〞,“假〞以0代表。2〕假设a=4,b=5,那么a&&b的值为1。因为a和b均为非0,被认为是“真〞,因此a&&b的值也为“真〞,值为1。3〕a、b值同前,a||b的值为1。4〕a、b值同前,!a||b的值为1。5〕4&&0||2的值为1。逻辑表达式〔2/2〕在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如:1〕a&&b&&c只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值。如左图所示。2)a||b||c只要a为真(非0),就不必判断b和c;只有a为假,才判别b;a和b都为假才判别c。如右图所示。〔2.3〕if语句if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if语句有三种形式。if语句的形式1〕形式一:if…… if(表达式) { 语句 } 例如: if(x>y) { printf(“%d〞,x); }这种if语句的执行过程如右图:if语句的形式2〕形式二:if……else…… if(表达式) { 语句1 } else { 语句2 } 例如: if(x>y) { printf(“%d〞,x); } else { printf(“%d〞,y); }if语句的形式形式三:if……elseif……else…… if(表达式1) { 语句1 } elseif(表达式2) { 语句2 } … elseif(表达式m) { 语句m } else { 语句n }if语句的形式例如: if(number>500) { cost=0.15; } elseif(number>300) { cost=0.10; } elseif(number>100) { cost=0.075; } else { cost=0.05; }对if语句形式的说明〔1/2〕1〕三种形式的if语句中在if后面都有“表达式〞,一般为逻辑表达式或关系表达式。例如,if(a==b&&x==y)printf(“a=b,x=y〞);以下if语句是否合法? if(3) printf(“O.k.〞); if('a')printf("%d",'a');对if语句形式的说明〔2/2〕2〕语句局部无论有多少条语句都用花括号括起来,这样做不容易出错,也便于今后维护。如: if(a>1000) { printf(“a=%d\n〞,a); } else { a++; printf(“a=%d\n〞,a); }if语句举例〔1/2〕例4.1输入两个实数,按代数值由小到大的次序输出这两个数。#include<stdio.h>intmain(){ floata,b,t;

scanf(“%f,%f“,&a,&b);

if(a>b) { t=a; a=b; b=t; }

printf(“%5.2f,%5.2f〞,a,b); return1;}

if语句举例〔2/2〕例4.2输入3个数a,b,c,要求按由小到大的顺序输出。解此题的算法比上一题稍复杂一些。可以用伪代码写出算法:S1:ifa>b将a和b对换(a是ab中的小者)S2:ifa>c将a和c对换(a是ac中的小者,因此a是三者中最小者)S3:ifb>c将b和c对换(b是bc中的小者,也是三者中次小者)然后顺序输出a,b,c即可。算法如下:#include<stdio.h>intmain(){ floata,b,c,t; scanf(“%f,%f,%f〞,&a,&b,&c);

if(a>b) { t=a; a=b; b=t; }

if(a>c) { t=a; a=c; c=t; }

if(b>c) { a=b; b=c; c=t; }

printf("%5.2f,%5.2f,%5.2f“,a,b,c); return1;}if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。例如:有一函数:y-1 (x<0)0 (x=0)1 (x>0)编一程序,输入一个x值,输出y值。#include<stdio.h>intmain(){ intx,y;

scanf("%d“,&x);

if(x<0) { y=-1; } else { if(x==0) { y=0; } else { y=1; } }

printf("x=%d,y=%d\n“,x,y);

return1;}〔2.3〕条件运算符条件运算符有以下if语句: if(a>b) { max=a; } else { max=b; }可以用下面的条件运算符来处理: max=(a>b)?a∶b;条件运算符格式条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件表达式的一般形式为: 表达式1?表达式2∶表达式3。它的执行过程如下图。对条件表达式的说明〔1/3〕1〕条件运算符的执行顺序:先求解表达式1,假设为非0(真)那么求解表达式2,此时表达式2的值就作为整个条件表达式的值。假设表达式1的值为0(假),那么求解表达式3,表达式3的值就是整个条件表达式的值。 max=(a>b)?a∶b执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。2〕条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。条件运算符的优先级别比关系运算符和算术运算符都低。因此 max=(a>b)?a∶b括号可以不要,可写成 max=a>b?a∶b对条件表达式的说明〔2/3〕3〕条件运算符的结合方向为“自右至左〞。如果有以下条件表达式: a>b?a∶c>d?c∶d相当于 a>b?a∶(c>d?c∶d)4〕条件表达式还可以写成以下形式: a>b?(a=100):(b=100);或者 a>b?printf(“%d〞,a):printf(“%d〞,b);即“表达式2〞和“表达式3〞不仅可以是数值表达式,还可以是赋值表达式或者函数表达式。对条件表达式的说明〔3/3〕5〕条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如: x?'a'∶'b'x是整型变量,假设x=0,那么条件表达式的值为‘b’。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如 x>y?1∶1.5如果x≤y,那么条件表达式的值为1.5,假设x>y,值应为1,由于1.5是实型,比整型高,因此,将1转换成实型值1.0。条件运算符举例例4.4:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。#include<stdio.h>intmain(){ charch;

scanf("%c“,&ch);

ch=(ch>='a'&&ch<=’Z')?(ch+32)∶ch;

printf("%c“,ch);

return1;}〔2.4〕switch语句switch语句的引入Switch语句是多分支选择语句。if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(90分以上为‘a’等,80~89分为‘b’等,70~79分为‘c’等……);人口统计分类(按年龄分为老、中、青、少、儿童);工资统计分类;银行存款分类……。switch语句格式它的一般形式如下: switch(表达式) { case常量表达式1: 语句1 break; case常量表达式2:

语句2 break; … case常量表达式n: 语句n break; default: 语句n+1 break; }switch语句举例例如,要求按照考试成绩的等级打印出百分制分数段,可以用Switch语句实现: switch(grade) { case'a'∶ printf(“85~100\n〞); break; case'b'∶ printf(“70~84\n〞); break; case'c'∶ printf(“60~69\n〞); break; case‘d'∶ printf(“<60\n〞); break; default∶ printf(“error\n〞); brea; }对switch语句的说明〔1/3〕1〕switch后面括弧内的“表达式〞,ANSI标准允许它为任何类型。2〕当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,假设所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。3〕每一个case的常量表达式的值必须互不相同,否那么就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。4〕各个case和default的出现次序不影响执行结果。例如,可以先出现“default:…〞,再出现“case‘D’:…〞,然后是“case‘a’:…〞。对switch语句的说明〔2/3〕5〕执行完一个case后面的语句后,如果没有break语句,流程控制转移到下一个case继续执行。“case常量表达式〞只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。例如,上面的例子中,如果没有break语句,假设grade的值等于‘a’,那么将连续输出:85~10070~8460~69<60error因此,应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。需用一个break语句来到达此目的。对switch语句的说明〔3/3〕6〕多个case可以共用一组执行语句;如: … case'a'∶ case'b'∶ case'c'∶printf(">60\n");break; …grade的值为‘a’、‘b’或‘c’时都执行同一组语句。〔2.6〕程序举例例5.5例4.5:写程序,判断某一年是否闰年。说明:我们用以下图来表示判别闰年的算法。以变量leap代表是否闰年的信息。假设某年为闰年,那么令leap=1;假设为非闰年,令leap=0。最后判断leap是否为1(真),假设是,那么输出“闰年〞信息。例5.6例4.6求ax2+bx+c=0方程的解。前面已介绍过根本的算法,实际上应该有以下几种可能:①a=0,不是二次方程。②b2-4ac=0,有两个相等实根。③b2-4ac>0,有两个不等实根。④b2-4ac<0,有两个共轭复根。例4.6用N-S流程图表示算法例4.7例4.7运输公司对用户计算运费。路程(S)越远,每公里运费越低。标准如下: s<250km 没有折扣 250≤S<500 2%折扣 500≤S<1000 5%折扣 1000≤S<2000 8%折扣 2000≤S<3000 10%折扣 3000≤S15%折扣设每公里每吨货物的根本运费为P(Price的缩写),货物重为w(weight的缩写),距离为S,折扣为d(discount的缩写),那么总运费f(freight的缩写)的计算公式为: f=P*w*S*(1-d)分析此问题,折扣的变化是有规律的:从图可以看到,折扣的“变化点〞都是250的倍数(250,500,1000,2000,3000)。利用这一特点,可以在横轴上加一种坐标c,c的值为S/250。c代表250的倍数。当c<1时,表示S<250,无折扣;1≤c<2时,表示250≤S<500,折扣d=2%;2≤c<4时,d=5%;4≤c<8时,d=8%;8≤c<12时,d=10%;c≥12时,d=15%。〔三〕循环控制结构程序设计内容while语句do…while语句for语句循环的嵌套几种循环的比较break和continue语句goto语句程序举例〔3.1〕while语句while语句while语句用来实现“当型〞循环结构。其一般形式如下:while(表达式){ 语句}当表达式为非0值时,执行while语句中的内嵌语句。其流出图见右图。其特点是:先判断表达式,后执行语句。wile语句例如例5.2:求n的阶乘〔n=100〕。分析:用流程图表示,如图:while语句例如#include<stdio.h>intmain(){ inti; intsum=0;

i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum); return1;}〔3.2〕do…while语句do…while语句dowhile语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为do{ 循环体语句}while(表达式);它是这样执行的:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真〞)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。执行过程如下图。do…while语句例如例5.3:用dowhile语句求n的阶乘〔n=100〕。分析:用流程图表示,如图。do…while语句例如#include<stdio.h>intmain(){ inti; sum=0;

i=1; do { sum=sum+i; i++; }while(i<=100); printf("%d",sum); reutrn1;}〔3.3〕for语句for语句for语句的一般形式为:for(表达式1;表达式2;表达式3){ 语句}它的执行过程如下:(1)先求解表达式1。(2)求解表达式2,假设其值为真(值为非0),那么执行for语句中指定的内嵌语句,然后执行下面第(3)步。假设为假(值为0),那么结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句。用图表示执行过程如下:for语句for语句最简单的应用形式也就是最易理解的如下形式:

for(循环变量赋初值;循环条件;循环变量增值) { 语句 }

例如: for(i=1;i<=100;i++) { sum=sum+i; }for语句对于以上for语句的一般形式也可以改写为while循环的形式:

表达式1; while(表达式2) { 语句 表达式3;}for语句说明〔1/9〕1〕for语句的一般形式中的“表达式1〞可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如: for(;i<=100;i++) { sum=sum+i; }执行时,跳过“求解表达式1〞这一步,其他不变.for语句说明〔2/9〕2〕如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。如下图:例如: for(i=1;;i++) { sum=sum+i; } 它相当于: i=1; while(1) { sum=sum+1; i++; }for语句说明〔3/9〕3〕表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如: for(i=1;i<=100;) { sum=sum+i;

i++; }for语句说明〔4/9〕4〕可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如: for(;i<=100;) { sum=sum+i; i++; }相当于: while(i<=100) { sum=sum+i; i++; }在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。for语句说明〔5/9〕5〕三个表达式都可省略。如: for(;;) { 语句 }相当于 while(1) { 语句 }for语句说明〔6/9〕6〕表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for(sum=0;i<=100;i++) { sum=sum+i; }表达式3也可以是与循环控制无关的任意表达式。for语句说明〔7/9〕表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:

for(sum=0,i=1;i<=100;i++) { sum=sum+i; }或 for(i=0,j=100;i<=j;i++,j--) { k+=i*j; }for语句说明〔8/9〕7〕表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面例子: for(i=0;(c=getchar())!=‘\n';i+=c) { ; //空循环 }执行流出如以下图所示:〔3.4〕循环嵌套循环嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。各种语言中关于循环的嵌套的概念都是一样的。三种循环(while循环、dowhile循环和for循环)可以互相嵌套。〔3.5〕几种循环的比较几种循环的比较〔1/2〕1〕三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。2〕while和dowhile循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。几种循环的比较〔2/2〕3〕用while和dowhile循环时,循环变量初始化的操作应在while和dowhile语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。4〕while循型、dowhile循环和for循环,可以用break语句跳出循环,用continue

温馨提示

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

评论

0/150

提交评论