C程序设计教程(第二版式)1-3

上传人:小*** 文档编号:243137386 上传时间:2024-09-16 格式:PPT 页数:125 大小:1.04MB
返回 下载 相关 举报
C程序设计教程(第二版式)1-3_第1页
第1页 / 共125页
C程序设计教程(第二版式)1-3_第2页
第2页 / 共125页
C程序设计教程(第二版式)1-3_第3页
第3页 / 共125页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第3章 结构化程序设计,3.1,结构化程序设计思想,3,.2,语句与分程序,3.3,顺序结构程序设计,3.4,关系运算符与逻辑运算符,3.5,选择结构程序设计,3.6 循环结构程序设计,3.1,结构化程序设计思想,3.1.1,结构化程序设计思想的产生,20,世纪,60,年代“软件危机”,的产生,是否在程序设计中使用“,goto,”,语句的争论,Corrado,B,hm,和,Guiseppe Jacopini,.,就证明了只要有顺序、选择和循环三种形式的控制结构,就足以导出其它各式各样的程序结构,从而在理论上奠定了结构化程序设计的基础。,3.1.2,结构化程序设计的三种基本结构,(1) 顺序结构,顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。,(2) 选择结构(分支结构),选择结构是一种先对给定条件进行判,断,并根据判断的结果执行相应命令的结,构。,(3) 循环结构,循环结构是指多次重复执行同一组,命令的结构。,具有循环结构的程序一般必须指定循,环的终止条件,以便对程序的循环进行有,效的控制,以免进入无限循环(或称死循,环)的状态。,C,程序的执行部分由执行语句构成。,执行语句的种类,表达式语句,函数调用语句,控制语句,复合语句(或称分程序),空语句,3.2,语句与分程序,最简单的可执行语句。只要在表达,式后面加上分号就可以了。,例如:,+,i;,x=y;,有效的表达式语句一般都要有赋值,运算, 否则,不做任何赋值运算的表达,式大多数是无意义的。,表达式语句,函数调用语句,由函数名、实际参数以及分号构成。,例如:,printf,(welcome);,printf,是函数名,“,welcome”,是实际参数。函,数名既可以是,C,语言提供的库函数名,也,可以是我们自己定义的函数名。,控制语句,控制语句是用于控制程序流程的语句,控,制语句一般指那些改变了顺序结构的语句。,C,语言的控制语句,分支语句(,if,和,switch),循环语句(,while、do-while、for),转向语句(,break、,goto,、continue、return)。,熟练掌握控制语句是学会程序设计的基础。,复合语句和分程序结构,复合语句是用 和 把数据说明语句和若干个有序的执行语句组合在一起而构成。,其一般格式为, 数据说明;,语句;,复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来看待,因此又称为分程序。,空语句,C,语言中有一个很特殊的语句,即空语句。空语句,顾名思义,就是什么也不存在的语句,只有一个分号:,;,尽管空语句不会有任何命令执行,但仍然是一个有用的语句。常用于循环语句中,使循环体为空。,例如:,for (sum=0,i=0;i、=、=10)&(x10),表,示如果,x,大于10;也可以使用逻辑运算符连接关,系表达式,例如,,if (ab) &(b=c);,还可以是,一般的表达式,甚至是一个常量或一个变量,例,如,,if (x),和,if (,checkstate,(),只要,x,或,checkstate,(),的值为非0,表达式即为真。,例,3.4,使用,if,形式编写程序:输入,x,,,求出并输出,x,的绝对值。,#,include ,stdio,.h,/*-abs(x)-*/,void main(),int,x;,scanf,(%d,if (xb,将两个数的位置调换;否则,保持不变。,#,include ,stdio,.h,/*-swap a and b-*/,void main(),int,a,b,temp;,scanf,(%d%d,if (ab), temp=a; a=b; b=temp;,printf,(%d,%dn,a,b);,例3.6请判断下面程序的执行结果,并解释该程序的功能。,#,include ,stdio,.h,void main(),int,a=10,b=20,x;,x=a;,if (ab),x=b;,printf,(%dn,x);,2.,if else,形式,if else,形式的语法是:,if (,表达式),语句1;,else,语句2;,下一条语句;,功能:,检测表达式,如果值为非0(真),则执行语,句1,然后执行下一条语句;如果值为0(假),,执行语句2,再执行下一条语句。,例3.7编写程序,输入两个浮点数,分别表示昨天和今天的鸡蛋的单价,如果鸡蛋涨价了提示“不要买鸡蛋”,否则提示“可以买鸡蛋”。,#,include ,stdio,.h,/*-price of egg-*/,void main(), float a,b;,printf,(,nPlease,input price of egg yesterday:);,/*,提示用户输入昨天的鸡蛋单价*/,scanf,(%f, /*,接收昨天的鸡蛋单价,*/,printf,(,nPlease,input price of egg today:);,/*,提示用户输入今天的鸡蛋单价*/,scanf,(%f, /*,接收今天的鸡蛋单价,*/,if (a=A & cb),x=,printf,(max is %d.n,*x);,else,x=,printf,(max is %d.n,*x);,#,include ,stdio,.h,/*-max-*/,void main(),int,a=30,b=20,*x;,if (ab), x=,printf,(max is %d.n,*x);,else, x=,printf,(max is %d.n,*x);,3.5.4,else if,形式,例如我们要解决这样一个问题:输入一个股,票今天和昨天的收盘价,如果今天的收盘价大于,昨天的收盘价,提示“上涨”;如果今天的收盘价,小于昨天的收盘价,提示“下跌”;如果今天的收,盘价刚好等于昨天的收盘价,提示“平盘”。,判断条件的结果实际上是三种情况,我们先,用,if else,解决这个问题:,用,if else,解决这个问题,:,#,include ,stdio,.h,/*-price of stock-*/,void main(), float x,y;,printf,(,nPlease,input price of stock yesterday:);,/*,提示用户输入昨天的股票价格*/,scanf,(%f, /*,接收昨天的股票价格 */,printf,(,nPlease,input price of stock today:);,/*,提示用户输入今天的股票价格*/,scanf,(%f, /*,接收今天的股票价格 */,if (x=y) /*,若今天的股票价格等于昨天的股票价格 */,printf,(Equality!n); /*,输出提示:平盘 */,else, if (xy) /*,若今天的股票价格小于昨天的股票价格 */,printf,(Rise!n); /*,输出提示:上涨 */,else /*,否则 */,printf,(Fall!n); /*,输出提示:下跌 */,else if,的语法:,if (,表达式,1),语句,1,;,else if (,表达式,2),语句,2,;,else if (,表达式,3),语句,3,;,else if (,表达式,n),语句,n,;,else,语句,n+1;,一条语句;,功能:按表达式的顺序进行判断,最早值为,真的表达式将引起执行相应语句,i,,并且不再继续,判断其它条件,跳转到下一条语句执行。若全部,表达式为假,则执行语句,n+1。,例3.11用,else if,形式解决上面的股票问题。,#,include ,stdio,.h,/*-price of stock-*/,void main(), float x,y;,printf,(,nPlease,input price of stock yesterday:);,/*,提示用户输入昨天的股票价格*/,scanf,(%f,/*,接收昨天的股票价格 */,printf,(Please input price of stock today:);,/*,提示用户输入今天的股票价格*/,scanf,(%f, /*,接收今天的股票价格 */,if (x=y) /*,若今天的股票价格等于昨天的股票价格 */,printf,(Equality!n); /*,输出提示:平盘 */,else if (x55) group=4;,/*,岁数大于55岁在第四组 */,else if (age40 ) group=3; /*,岁数大于40岁在第三组 */,else if (age17) group=2; /*,岁数大于17岁在第二组 */,else group=1; /*,岁数小于等于17岁在第一组 */,printf,(Group is %c!n,group);,3.5.3,嵌套的,if,语句,修改例3.12,排除不可能的岁数 。,#,include ,stdio,.h,/* sport group */,void main(),int,age; char group;,printf,(Please input age:); /*,提示用户输入岁数,*/,scanf,(%d,if (age0&age55) group=4;,/*,岁数大于,55,岁在第四组,*/,else if (age40 ) group=3;,/*,岁数大于,40,岁在第三组,*/,else if (age17) group=2;,/*,岁数大于,17,岁在第二组,*/,else group=1; /*,岁数小于等于,17,岁在第一组,*/,printf,(Group is %c!n,group);,else,printf,(Data Error!n);,if (,表达式1),if (,表达式2),语句1;,else,语句2;,if (,表达式1) & (表达式2),语句1;,if (!,表达式1),语句2 ;,if (,表达式1),if (,表达式2),语句1;,else,语句2;,if (,表达式1) & (表达式2),语句1;,if (,表达式1) & (!表达式2),语句2 ;,if (,表达式,1),if (,表达式,2),语句,1,;,else,语句,2,else,到底与哪个,if,结合呢?因为这时有两种可能,,这就产生了所谓的二义性。,C,语言规定:,else,与离,它最近的,if,结合。,#,include ,stdio,.h,void main(),int,x;,printf,(Please input one integer:);,/*,输入一个整数 */,scanf,(%d,if (x0) /*,如果,x,大于0 */,if (x%2=0),/*,如果,x,是偶数 */,printf,(positive and evenn);,else,/*x,是奇数 */,printf,(positive and oddn);,3.5.4,switch,语句,switch,语句属于多路分支结构。,switch,的常用形式:,switch (,条件表达式),case,常量表达式1:语句1;,break;,case,常量表达式2:语句2;,break;,case,常量表达式3:语句3;,break;,case,常量表达式,n:,语句,n;break;,default,语句,n+1; break;,功能:首先计算条件表达式的值,然,后找到与其相等的常量表达式的,case,分支,去执行语句,然后退出,switch,语句,若没,有与条件表达式相等的常量表达式,则执,行,default,语句后面的语句,n+1,。,default,语,句可省略。若语句,i,后不含,break,,,继续执,行下一条语句,i+1,,,不用判断常量表达式。,例,3.14,假设花店里有四种花:玫瑰(,rose,)、,百合(,lily,)、,康乃馨(,carnation,),和兰花,(,orchid,),,其单价分别是,4.50,、,20.00,、,2.00,和,6.00,。编写程序,首先显示一个简易,菜单,将花店里有的花列出来,请用户选择,,然后请用户输入要买的数量,计算用户应付,的费用并输出。,#,include ,stdio,.h,void main(),int,kind,amount;,double fee;,printf,(n# Welcome you! #);/*,显示简易菜单,*/,printf,(nn);,printf,(n 1-rose.);,printf,(n 2-lily.);,printf,(n 3-carnation.);,printf,(n 4-orchid.);,printf,(nn);,printf,(,nplease,choose what you want buy:);,/*,提示用户输入买花的品种,*/,scanf,(%d,printf,(,nplease,enter amount you want buy:);,/*,提示用户输入买花的数量,*/,scanf,(%d,switch (kind) /*,根据用户选的种类和数量计算费用,*/,case 1:fee=amount*4.50;break;,case 2: fee=amount*20.00;break;,case 3: fee=amount*2.00;break;,case 4: fee=amount*6.00;break;,default:,printf,(error choose);,printf,(,nplease,pay your fee %.2lf:,fee);,/*,输出费用,*/,注意:,(1),case,分支中的语句,i,后面的,break,语句一般,情况下不要省略,因为没有,break,语句,程序,不能跳出,switch,语句,而是执行下一条,case,语,句后面的语句,直到遇到,break,才能终止,switch,的执行。,switch (s), case +:a=a+b;,case - :a=a*b;break;,case *:a=a-b;break;,case /:a=a/b;break,(2) 条件表达式和常量表达式的数据类型必须,一致,常量表达式中不能包含变量。实际上,,switch,语句的重点就在于如何构造条件表达式,,并让它的值正好能够匹配,n,个常量表达式的值。,(3) 多个,case,可以共同使用相同的语句,i。,switch (s),case 1:,case 2:,case 4:,case 5:,printf,(%d,x);break;,(4),每个常量表达式应不相等,因为它类似于语,句标号的作用,,case,部分与,default,的顺序可自由,书写。若每个,case,后包含,break,,,则顺序不影响,最后的执行结果。反之,则有可能影响执行结果,s=2;,switch (s),case 1:,printf,(1);break;,case 2:,printf,(2);break;,case 3:,printf,(3);break;,结果?,switch (s),case 1:,printf,(1);,case 2:,printf,(2);,case 3:,printf,(3);,结果?,(5),语句,i,可以用复合语句,而且允许省略花括号,。,(6),switch,语句可以嵌套,即在一个,switch,语句,中嵌套另一个,switch,语句,但是要注意,break,只,能跳出最内层的,switch,语句。,例,3.15,根据输入字符,(0,到,F,,,用,%,c,接收,),显示与该字,符所表示的十六进制数相对应的十进制数。(例,如输入,A,,,输出,10,;输入,0,,输出,0,。),#,include ,stdio,.h,#include ,stdio,.h,void main(),char i;,printf,(,nplease,input 0F :);,scanf,(%c, /*,接收输入,*/,switch (i),case 0: case 1: case 2: case 3: case 4: case 5:,case 6: case 7: case 8: case 9:,printf,(n%d,i-0);break;,case A: case a:,printf,(n%d,10);break;,case B: case b:,printf,(n%d,11);break;,case C: case c:,printf,(n%d,12);break;,case D: case d:,printf,(n%d,13);break;,case E: case e:,printf,(n%d,14);break;,case F: case f:,printf,(n%d,15);break;,default:,printf,(error data);,C,语言中提供的唯一的一个三目运算符就是,条件运算符“?:”,它的运算对象有三个。,条件运算符的语法格式是:,表达式1 ?表达式2 :表达式3,由条件运算符与操作数构成的表达式也可以,称为条件表达式。,包括了条件运算符的条件表达式的计算方法,是:首先计算表达式,1,的值,若表达式,1,为真,条,件表达式的解取表达式,2,的值,表达式,1,为假,条,件表达式的解取表达式,3,的值。,3.5.5,条件运算符,例,3.16,使用条件运算符将输入的字母小写变大写。,#,include ,stdio,.h,#include string.h,void main(),char c;,puts(please input one char:);,c=,getchar,();,c=(c=a?(c+A-a):c);,putchar,(c);,putchar,(n);,例,3.17,使用条件运算符输出两个输入整数的较大,者,使用指针指向较大的数所在的存储单元。,#,include ,stdio,.h,void main(),int,i,j,*,pmax,;,printf,(,nplease,input two integer:);,scanf,(%d%d,pmax,=ij?,printf,(%dn,*,pmax,);,printf,(%un,pmax,);,/*,输出,pi,的内容,实际上是,i,和,j,中较大数,的地址,*/,3.5.6,选择结构程序举例,例,3.18在我们国内的大学中,学生的学习成绩以百分制计算,但有些国家的大学是按等级记录学生的成绩,例如:,A、B、C、D,等。如果一个学生要出国,就需要将自己成绩单中的成绩做一个转换。假设需要按下表进行转换,编写程序,分别使用,if,语句和,switch,语句根据输入的百分制分数,输出相应的分数等级。,程序一:,首先排除非法的分数,然后使用,else if,形式将,分数分级。,程序二:,没有先排除非法的分数,因此,else if,形式时,要使用两个并列的条件才能将分数分级。,程序三:,先排除了非法的分数,然后使用,switch,语句,将分数分级。赋值语句,s=score/10,的功能是将分,数取整,取整以后的结果有,11,中情况:,0,,,19,,,10,。,例3.19 编写程序,输入一个用整数表示的年份,输出显示,该年份是否是闰年。,判断一个用整数表示的年份是不是闰年的规则是:,该数满足二个条件之一是闰年:,(1) 能被400整除;,(2) 能被4整除,但不能被100整除。,根据上述规则,我们可以画一个,N-S,流程图来解决,该问题。其中用到两个存储单元,year,和,flag,,,year,存放,整数表示的年份,,flag,是个标记,其值为,1,表示是闰年,,其值为,0,表示不是闰年。,程序一:,判断闰年用,if,形式嵌套,if else,形式,,#,include ,stdio,.h /* leap year */,void main(),int,year,flag;,printf,(,Pleae,input a year:);,scanf,(%d,if (year%400!=0), if (year%4=0), if (year%100=0),flag=0;,else flag=1;,else flag=0;,else,flag=1;,if (flag=0),printf,(%d is not leap yearn,year);,else,printf,(%d is leap yearn,year);,程序二:,判断闰年用,else if,和,if else,形式,可编写程序如下:,#,include ,stdio,.h,void main(),int,year,flag;,printf,(,Pleae,input a year:);,scanf,(%d, /*,输入年度 */,if (year%400=0) flag=1;,else if (year%4!=0) flag=0;,else if (year%100!=0) flag=1;,else flag=0;,if (!flag),printf,(%d is not a leap yearn,year);,/*,输出“不是闰年” */,else,printf,(%d is a leap yearn,year);,/*,输出“是闰年” */,程序三:,判断闰年用逻辑表达式,可编写程序如下:,#,include ,stdio,.h,void main(),int,year,flag;,printf,(,Pleae,input a year:);,scanf,(%d,/*,输入年度 */,flag=(year%400=0)|(year%4=0,/*,用逻辑表达式计算是否是闰年 */,flag?,printf,(%d is a leap yearn,year):,printf,(%d is,not a leap yearn,year);,3.6 循环结构程序设计,3.6.1 问题的提出,3.6.2,while,语句,3.6.3,do while,语句,3.6.4,for,语句,3.6.5,多重循环,3.6.6,break,语句在循环语句中的用法,3.6.7,continue,语句,3.6.8 程序举例,3.6.1 问题的提出,第一个问题:,在屏幕上输出40个星号。,第二个问题:,重复接收用户输入的整数,直到这个数是一,个正确的百分制的分数。,第三个问题:,计算1+1/2+1/3+ +1/,n。n,由用户指定(程,序运行时输入)。,3.6.2,while,语句,while,循环语句的语法是:,while (,表达式),语句;,功能:首先计算表达式的值,如果表达式的值,非零(真),执行“语句”,并再次计算表达式,的值,此过程重复执行,直到表达式的值为零,(假),循环结束。,重复执行的语句被称为循环体,表达式被称,为循环表达式。,while,语句的框图,例,3.20,用,while,语句解决“在屏幕上输出,40,个星号”的问题。,#,include ,stdio,.h,void main(),int,i;,i=1;,while (i=40),printf,(%c,*);,i+;,printf,(n);,例,3.21,用,while,语句解决“重复接收用户输入的整数,直到这个数是一个正确的百分制的分数。,#include ,stdio,.h,void main(),int,score;,printf,(Please input your score:);,scanf,(%d,while (score100),printf,(Data error!Please input your,score again:);,scanf,(%d,printf,(,nYour,score is %d!,score);,例3.22 用,while,语句解决“计算1+1/2+1/3+ +1/,n。n,由用户指定(程序运行时输入)。”的问题。,/*,sum of 1+1/2+1/3+ +1/n */,#include ,stdio,.h,void main(),int,i, n; double sum;,i=1;,sum=0;,printf,(,nPlease,input a integer:);,scanf,(%d,while (i=n),sum=sum+1.0/i;,i+;,printf,(sum=%lfn,sum);,需要注意以下几点:,(1),循环次数的控制要正确。,(2) 循环体包含一个以上的语句时,一定要用花括号括起来,否则,可能与程序要求不符。,(3),在循环体内要有使循环趋向于结束的语句,否则,可能引起无限循环。,(4) 循环表达式可以是真,通过在循环体中加,if,语句对循环进行控制。,判断程序结果:,#,include ,stdio,.h,void main(),int,i; i=0;,while (i20),i+;,printf,(%d ,i);,printf,(n);,判断程序结果:,#,include ,stdio,.h,void main(),int,i; i=1;,while (i=20),printf,(%d ,i);,i+;,printf,(n );,判断程序结果:,#,include ,stdio,.h,void main(),int,i; i=1;,while (10) /*,循环表达式为真 */,printf,(%d ,i);,if (i20) i+;,else break;,printf,(n );,3.6.3,do while,语句,do while,语句的语法,do while,循环语句的语法是:,do,语句;,while (,表达式);,功能:,执行“语句”,计算表达式的值,如果表达式的值非零(真),继续执行“语句”,直到表达式的值为零(假),循环结束。,do while,语句的框图,do while,与,while,语句的区别是:,do,whil,总是要先做一遍循环体,再做表,达式的判断,因此循环体中的语句肯定要做一,次。在设计程序时,如果不知道重复执行的次,数,而且第一次必须执行时,常采用,do while,语句。,例3.23 用,do while,语句解决“在屏幕上输出40个星号”的问题。,/*,display * */,#include ,stdio,.h,void main(),int,i;,i=1;,do,printf,(%c,*);,i+;,while (i=40);,printf,(n);,例3.24 用,do while,语句解决“重复接收用户输入的整数,直到这个数是一个正确的百分制的分数”的问题。,#,include ,stdio,.h,void main(),int,score;,do,printf,(,nPlease,input your score :);,scanf,(%d, while (score100);,printf,(,nYour,score is %d!,score);,例3.25 用,do while,语句解决“计算1+1/2+1/3+ +1/,n。n,由用户指定(程序运行时输入)。”的问题。,#,include ,stdio,.h,void main(),int,i, n; double sum;,i=1; sum=0;,printf,(,nPlease,input a integer:);,scanf,(%d,do, sum=sum+1.0/i;,i+;, while (i=n);,printf,(sum=%lfn,sum);,使用,do while,语句需要注意的问题,注意:,(1) 为了避免编译系统把,do while,的,while,当做,while,语句的开始,,do while,的循环体即使是一句,,也需要用括号括起。例如,,#,include ,stdio,.h,void main(), char c;,do,putchar,(c=,getchar,();, while (c!=$);,但是,不能将上例的,do while,语句写成:,do,putchar,(c=,getchar,();,while (c!=$);,(2),由于,do while,语句是先做循环体,再判断表达,式,所以有些程序不能用,do while,语句编写。,例如:,输入某门功课的若干个同学的成绩,以-1,作为终止的特殊成绩,计算平均成绩。也就是说,,不能将-1计算在内。,例3.26 求平均成绩的错误程序。,#,include ,stdio,.h,void main(),int,sum,i,a;,sum=0;,i=0;,do,scanf,(“%d”,sum=sum+a;,i+;, while (a!=-1);,printf,(aver=%fn,1.0*sum/i);,for,语句的语法,for,循环语句的语法是:,for (,表达式1;表达式2;表达式3),语句 ;,其功能可以用下面的过程来描述:,(1) 计算表达式1;,(2) 计算表达式2,判断表达式2是否为“真”,若是“真”,执行循环体中的“语句”,若为“假”循环结束,跳转到,for,语句下面的一个语句执行;,(3) 计算表达式3;,(4) 跳转到第(2)步执行。,3.6.4,for,语句,for,语句的和框图,for,语句实际等价于下面的,while,语句:,表达式1;,while (,表达式2 ) ,语句;,表达式3;,例3.27 用,for,语句解决“在屏幕上输出40个星号”的问题。,/*,display * */,#include ,stdio,.h,void main(),int,i;,for (i=1;i=40; i+),printf,(%c,*);,printf,(n);,例3.28 用,for,语句解决“重复接收用户输入的整数,直到这个数是一个正确的百分制的分数”的问题。,#,include ,stdio,.h,void main(),int,score;,printf,(Please input your score:);,for(,scanf,(
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!