《计算机软件基础第二章.ppt》由会员分享,可在线阅读,更多相关《计算机软件基础第二章.ppt(62页珍藏版)》请在三一办公上搜索。
1、第二章 顺序结构、选择结构、循环结构的程序设计,程序设计的三种基本结构,顺序结构用来表示一个操作序列,它的执行过程是按顺序执行各序列。选择结构也称分支结构,根据给定条件,选择执行某个分支操作。循环结构根据条件重复执行某些操作。,相关基础知识,在使用C语言库函数时,要用预编译命令#include将有关的头文件包括到用户到源文件中。在头文件中包含了与用到的函数有关的信息。例如使用标准输入输出库函数时,要用到stdio.h文件。文件后缀h是head的缩写,#include命令都是放在程序的开头,因此这类文件被称为头文件。在调用标准输入输出库函数时,文件开头应有以下预编译命令:#include或#in
2、cludestdio.h stdio.h是standard intput&output的缩写,它包含了与标准I/O库有关的变量定义和宏定义。考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include 命令。,一、格式输出函数printf的一般格式Printf(格式控制字符串,输出表列);printf(a=%d,b=%d,a,b);括号内包括两部分:(1)格式控制字符串是用双引号括起来的字符串,也称转换控制字符串,它包括两种信息:格式说明,由%和格式字符组成,如%d,%f,%c等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由%字符开始的。普通字符,
3、即需要原样输出的字符。例如上面printf函数中双引号内的逗号、空格、a=和b=。(2)输出表列是需要输出的一些数据,可以是表达式。,常用的有以下几种格式字符:d格式符。用来输出十进制整数。有以下几种用法:%d,按整型数据的实际长度输出。%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。%ld,输出长整型数据。如:long a=135790;printf(%ld,a);如果用%d输出,就会发生错误,因为整型数据的范围为3276832767。对long型数据应当用%ld格式输出。对长整型数据也可以指定字段宽度,如将上面printf函数中的%ld改
4、为%8ld,则输出为:135790一个int型数据可以用%d或%ld格式输出。,c格式符 用来输出一个字符。,f格式符 用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:%f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。应当注意,并非全部数字都是有效数字。单精度实数的有效位数一般为7位。%m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。,main()float f=123.456;printf(“%fn%10fn%10.2fn%-10.2fn,f,
5、f,f,f,f);输出结果如下:123456001凵凵123.456001凵凵凵凵凵凵123.46凵凵123.46凵凵凵凵,二、scanf函数的一般格式 scanf(“格式控制字符串”,地址表列)格式控制的含义同printf函数;地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。scanf(%d,如果从键盘连续输入3个字符abc,由于ch只能容纳一个字符,系统就把第一个字符a赋给ch。,(2)输入数据时不能规定精度,例如,scanf(%7.2f,输入时两个数据间应空2个或更多的空格字符。如:10凵凵34或10凵凵凵34,如果是:scanf(%d:%d,输入应为以下形式:a=
6、12,b=34,putchar函数(字符输出函数)的作用是向终端输出一个字符。例如:putchar(c);它输出字符变量c的值。c可以是字符型变量或整型变量。getchar函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为 getchar()函数的值就是从输入设备得到的字符。putchar和getchar可以用一行表示:putchar(getchar();如getchar()的值为a,因此putchar函数输出a。也可以用printf函数输出:printf(%c,getchar();,如果在一个函数中(现为main函数)要调用getchar函数
7、,应该在该函数的前面(或本文件开头)加上包含命令:#include,顺序结构的例题:,例4:输入三角形的三边长,求三角形面积 为简单起见,设输入的三边长a、b、c能构成三角形。从数学知识已知求三角形面积的公式为 area=,其中s=(a+b+c)/2据此编写程序为:#include main()float a,b,c,s,area;scanf(%f,%f,%f,例5:从键盘输入一个大写字母,要求改用小写字母输出 如何将一个大写字母转换成小写字母?我们通过码的形式来进行转换。includestdio.h main()char c1,c2;c1=getchar();printf(%c,%dn,c1
8、,c1);c2=c1+32;printf(%c,%dn,c2,c2);,选择结构,选择结构 基础知识,关系运算符:、=、!=(双目运算符)关系表达式:用关系运算符连接的式子关系表达式的值只有两个:真为1,假为0321逻辑运算符:双目&、|,单目!,逻辑表达式的结果是逻辑值,用0(逻辑假)、1(逻辑真)表示逻辑运算符的运算规则:,()高!、+、-*、/、%+、-、=、!=&|=低,选择结构一、if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if语句的三种形式a.if(表达式)语句 例如:if(xy)printf(%d,x);这种if语句的执行过
9、程见右图,单分支if语句,if(表达式)语句1 else 语句2 例如:if(xy)printf(%d,x);else printf(%d,y);执行过程见图。,双分支if语句,例6 输入两个实数,按代数值由小到大的次序输出这两个数。main()float a,b,t;scanf(%f,%f,运行情况如下:3.6,-3.2-3.20,3.60,例7 输入3个数a、b、c,要求按由小到大的顺序输出。main()float a,b,c,t;scanf(%f,%f,%f,c.if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if()if()语句1 内嵌if else
10、 语句2 else if()语句3 内嵌if else 语句4应当注意if与else的配对关系。else总是与它上面的最近的if配对。如果if与else的数目不一样,为实现程序设计者的要求,可以加花括号来确定配对关系。例如:if()if()语句1(内嵌if)else 语句2 这时 限定了内嵌if语句的范围,因此else与第一个if配对。,例8 有一函数:-1(x0)编一程序,输入一个x的值,输出y值,此题有多种解法,在此列出其中两种:程序1:main()int x,y;scanf(%d,程序2:main()int x,y;scanf(%d,2、条件运算符若if语句中,在表达式为真和假时,且都只
11、执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句:if(ab)max=a;else max=b;可以用下面的条件运算符来处理:max=(ab)?a:b;其中max=(ab)?a:b是一个条件表达式。它是这样执行的:如果(ab)条件为真,则条件表达式取值a,否则取值b。条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件表达式的一般形式为 表达式1?表达式2:表达式3,说明:(1)条件运算符的执行顺序:先求表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表
12、达式3,表达式3的值就是整个条件 表达式的值。(2)条件运算符优先于赋值运算符。低于关系运算符和算术运算符。(3)条件运算符的结合方向为自右至左。如果有以下条件表达式:ab?a:cd?c:d 相当于 ab?a:(cd?c:d)如果a=1,b=2,c=3,d=4,则条件表达式的值等于4,例9 输入一个字符,判断它是否为大写字母,若是则变成小写字母,若不是则不作处理。最后输出这个字符。main()char ch;scanf(%c,二、switch语句switch语句是多分支选择语句。if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。多分支选择问题也可以用嵌套的if 语句来处理,但
13、如果分支较多,则嵌套的if语句层次多,程序冗长且可读性降低。而switch语句就可以很好的解决这个问题。它的一般形式如下:switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式n:语句n default:语句n+1,例如,要求按照考试成绩的等级打印出百分制分数段,可以用switch语句实现 switch(grade)case A:printf(85100n);case B:printf(7084n);case C:printf(6069n);case D:printf(60n);default:printf(errorn);,执行完一个cas
14、e后面的语句后,流程控制转移到下一个case继续执行。case常量表达式只是其语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。例如,上面的例子中,若grade的值等于A,则将连续输出:85100 7084 6069 60 error 因此,应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。将上面的switch语句改写:,switch(grade)case A:printf(85100n);break;case B:
15、printf(7084n);break;case C:printf(6069n);break;case D:printf(60n);break;default:printf(errorn);最后一个分支(default)可以不加break语句,如果grade的值为B,则只输出7084,多个case可以共用一组执行语句。如:case A:caseB:case C:printf(60n);break;grade的值为A、B或C时都执行同一组语句。,例10 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s250km 没有折扣 250s500 2折扣 500s1000 5折扣 10
16、00s2000 8折扣 2000s3000 10折扣 3000s 15折扣 设每公里每吨货物的基本运费为p(price的缩写),货物重为w(weight的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为:f=p*w*s*(1-d),分析此问题,折扣的变化是有规律的。可以看出,折扣的变化点都是250的倍数。利用这一特点,可以在路程上加上坐标c,c的值为s/250。c代表250的倍数。当c1时,表示s250,无折扣;1c2时,表示250s500,折扣d=2;2c4时,折扣d=5;4c8时,折扣d=8;8c12时,折扣d=10;c12时,折扣d=1
17、5.,main()int c,s;float p,w,d,f;scanf(%f,%f,%d,case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(freight=%15.4f,f);,循环结构一、while语句while语句用来实现当型循环结构。其一般形式如下:while(表达式)语句 当表达式为非0值时,执行while语句中的内嵌语句。其流程下图。其特点是:先判断表达式,后执行语句。,例11 求,main()int i,sum=0;i=1;while(i=100)sum=s
18、um+i;i+;printf(%d,sum);,二、do-while 语句do-while语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为 do 循环体 while(表达式);它是这样执行的:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(真)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,例12 用do-while 语句求,main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%d,sum);,三、while语句和do-while语句的区别与联系,在一般情况下,用wh
19、ile语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。如例11和例12程序中的循环体是相同的,得到结果也相同。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,main()int i,sum=0;scanf(%d,main()int i,sum=0;scanf(%d,运行情况如下:1sum=55再运行一次:11sum=0,运行情况如下:1sum=55再运行一次:11sum=11,四、for语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可
20、以代替while语句。for语句的一般形式为:for(表达式1;表达式2;表达式3)语句,for语句最简单的应用形式也就是最易理解的如下形式:for(循环变量赋初值;循环条件;循环变量增值)语句例如:for(i=1;i=100;i+)sum=sum+i;可以看到它相当于一下语句:i=1;while(i=100)sum=sum+i;i+;对于以上for语句的一般形式也可以改写为while循环的形式:表达式1;while(表达式2)语句 表达式3;,1、for语句的一般形式中的表达式1可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如for(;i=100;
21、i+)sum=sum+i;执行时,跳过求解表达式1这一步,其他不变。2、如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于:i=1;while(1)sum=sum+1;i+;,3、表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=1;i=100;)sum=sum+1;i+;在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。
22、,4、可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100;)sum=sum+i;i+;相当于 while(i=100)sum=sum+i;i+;在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值。,5、3个表达式都可省略。如:for(;)语句 相当于 while(1)语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止的执行循环体。,6、表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i+)
23、sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。表达式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;表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值。,在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:for(i=1;i=100;i+,i+)sum=sum+i;相当于 for(i=1;i=100;i=i+2)sum=sum
24、+i;,表达式一般是关系表达式(如i=100)或逻辑表达式(如ab 在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于n(换行符),如果不等于n,就执行循环体。此for语句的执行过程,它的作用是不断输入字符,将它们的ASC码相加,直到输入一个换行符为止。注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。,for(;(c=getchar()!=n;)printf(%c,c);只有表达式2,没有表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一
25、个换行为止。,五、循环嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式:(1)while()(2)do while()do while();while();,(3)for(;)(4)for(;)for(;)while()(5)while()(6)do do for(;)while();while();while();,例13 写出以下程序的输出结果main()int i,j,k;printf(i j kn);for(i=0;i2;i+)f
26、or(j=0;j2;j+)for(k=0;k2;k+)printf(%d%d%dn,i,j,k);,i j k0 0 00 0 10 1 00 1 1 0 01 0 1 1 01 1 1,六、break语句前面已经介绍过用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如:for(r=1;r100)break;printf(%f,area);计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area100时,执行brea
27、k语句,提前结束循环,即不再继续执行其余的几次循环。,break语句的一般形式为:break;break语句不能用于循环语句和switch语句之外的任何其他语句中。,九、continue语句一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,例14 把100200之间的不能被3整除的数输出。main()int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(%d,n);当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。当然,本例中循环体也可以改用一个语句处理:if(n%3!=0)printf(%d,n);,例15 main()int i=1,sum=0;do if(sum4)break;sum+=2;i+;while(i=5);printf(the sum is%d,i=%d,sum,i);,
链接地址:https://www.31ppt.com/p-6024154.html