资源描述
会计学1C语句语句(yj)和流程控制和流程控制第一页,共31页。3.2 基本基本(jbn)语句语句 C语言的基本语句可分为表达式语句、函数调用语句和说明语句三种。(1)表达式语句在上一章介绍的一些表达式之后紧跟着加上一个分号“;”,即可形成表达式语句。如: x = 7; i+; i-; x = y*z;它们(t men)分别为赋值语句、增减1语句和算术运算语句。注意:并不是所有的表达式都可加上分号构成C 的语句。如“i+j”表达式加上分号形成的“i+j;”没有任何意义,不是语句。(2)函数调用语句由带特定参数的一次函数调用加上一个分号构成。如: printf (China); scanf (%d,&a);是两个库printf()、 scanf()函数调用语句。 第1页/共31页第二页,共31页。(3)说明语句说明语句包括变量(binling)定义语句和变量(binling)说明、函数说明、结构说明等。例如: int x,y,z=3; 定义x,y,z为整型变量(binling) static int w ; 定义w为静态整型变量(binling) int max();定义ax是整型函数struct student stu; 定义stu是结构体类型变量(binling)3.2 基本基本(jbn)语句语句 第2页/共31页第三页,共31页。3.3 复合复合(fh)语句语句 复合语句也称为程序(chngx)块。其一般形式是: 说明部分语句部分它是由一对花括号(“”和“”)括起来的说明部分和语句部分组合而成的复合结构。最简单的复合语句是单纯由二至多个语句经花括号括起来的结构形式。至今我们见到的复合语句是在函数中,函数的执行部分(函数体)总是一个复合语句。复合语句中可以有说明部分,也可以没有。【例3.1】a和b的数值进行交换的多个语句,可用“”和“”括起来形成复合语句。main() int a,b,t; scanf (%d %d,&a,&b); if(a%dn,a,b);也可以把变量t的说明语句放在复合语句中第3页/共31页第四页,共31页。main() int a,b; scanf (%d %d,&a,&b); if (ab) int t; t = a;a = b;b = t; printf (%d%dn,a,b);在C语言中,每个变量都有其作用域,作用域为从定义它的地方开始,到同一层对应的右括号结束。即使外层(wi cn)中定义了与它同名的变量,内层中出现的该名字意味着内层变量起作用,而外层(wi cn)变量的访问被阻塞。关于变量的作用域,在第5章将会详细讨论。 3.3 复合复合(fh)语句语句 第4页/共31页第五页,共31页。3.4 控制控制(kngzh)语句语句 对于任何一种计算机程序(chngx)来说,不外乎有这样三种基本结构(也称为流程控制):顺序结构、选择结构、循环结构。下面在学习各种程序(chngx)设计语句之前,我们首先一起学习语言的几种基本结构及其描述方式。3.4.1 顺序结构 在前面所讨论的大多数是顺序结构。在顺序结构中,语句都是表达式语句或其复合构成的复合语句。程序(chngx)的执行按语句的出现或安放的顺序依次执行。如图所示。 第5页/共31页第六页,共31页。3.4.2 选择结构选择结构选择结构如图选择结构如图3-2(b)所示。条件成立则执行语句,否则执行。、只能执行一个,、的出口路径汇合在一起。所示。条件成立则执行语句,否则执行。、只能执行一个,、的出口路径汇合在一起。3.4.3 循环结构循环结构循环结构分为当型循环和直到型循环结构,如图循环结构分为当型循环和直到型循环结构,如图3-2(c)(d)所示。当型循环结构先判断是否为真,若为真执行;再判断是否为真,若为真再执行,如此反复,直到为假。直到型循环结构先执行,再判断是否为假,若为假再执行,如此反复,直到为真。所示。当型循环结构先判断是否为真,若为真执行;再判断是否为真,若为真再执行,如此反复,直到为假。直到型循环结构先执行,再判断是否为假,若为假再执行,如此反复,直到为真。下面各节将基于下面各节将基于(jy)上面各种结构分别介绍它们所对应的语句。上面各种结构分别介绍它们所对应的语句。 3.4 控制控制(kngzh)语句语句 第6页/共31页第七页,共31页。3.5 分支分支(fnzh)结构程序设计语句结构程序设计语句 1if语句if语句为判断语句,其一般形式有三种:(1)if(表达式) 语句S(2)if(表达式) 语句S1 else 语句S2(3)if(表达式1) 语句S1else if(表达式2) 语句S2else if(表达式3) 语句S3else if(表达式n) 语句Snelse 语句Sn+1先看第(1)种形式。它将根据表达式的值决定是否执行“语句S”。被测试的条件是圆括号中的表达式,若表达式的值非零(表示该条件成立或关系真),则执行“语句S”,否则跳过“语句S”。如图所示。其中(qzhng)“语句S”既可是单个C语句,也可以是多个C语句组成的复合语句。 第7页/共31页第八页,共31页。再看第(2)种形式: if (表达式) 语句(yj)S1 else 语句(yj)S2当表达式的值非0,执行语句(yj)S1,否则执行语句(yj)S2。流程如图所示。3.5 分支结构程序设计分支结构程序设计(chn x sh j)语句语句 第8页/共31页第九页,共31页。2if语句的嵌套语句的嵌套if语句的嵌套是指在语句的嵌套是指在if语句中又包含了一个或多个语句中又包含了一个或多个if语句。一般形式如下:语句。一般形式如下:if (表达式表达式) if(表达式表达式) 语句语句1 else 语句语句2elseif(表达式表达式) 语句语句3 else 语句语句4说明:说明:(1) if与与else是配对关系是配对关系(gun x),else总是与它上面最近的总是与它上面最近的if配对。配对。(2) 可用复合语句来改变配对关系可用复合语句来改变配对关系(gun x)。如:。如:if (表达式表达式) if(表达式表达式) 语句语句1elseif(表达式表达式) 语句语句3 else 语句语句4对对if语句的嵌套层数语句的嵌套层数c语言没有限制。语言没有限制。 3.5 分支结构程序设计分支结构程序设计(chn x sh j)语句语句 第9页/共31页第十页,共31页。3.5 分支结构程序设计分支结构程序设计(chn x sh j)语句语句 第10页/共31页第十一页,共31页。【例】用户从键盘键入+、-、*和/中的任意一个,屏幕上出现对应的英文单词plus,minus,multiply,divide。若按了其他(qt)键,屏幕上出现问号。#inlclude stdio.hmain() int c; c = getchar(); if(c = = + ) printf(plusn); else if (c = = - ) printf(minusn); else if (c = = ) printf(multiplyn); else if (c = = / ) printf(dividen); else printf(?n);3.5 分支分支(fnzh)结构程序设计语句结构程序设计语句 第11页/共31页第十二页,共31页。3switch语句(开关语句)语句(开关语句)switch语句用于多路选择转向的程序中,也就是多路分支结构语句用于多路选择转向的程序中,也就是多路分支结构(jigu)的程序。前面曾用多重的的程序。前面曾用多重的if-else 语句来表示多路选择转向,现在用语句来表示多路选择转向,现在用switch语句来实现更为清楚简明。语句来实现更为清楚简明。switch 语句的一般形式:语句的一般形式: switch (表达式(表达式) case 常量表达式常量表达式1:语句:语句1 case 常量表达式常量表达式2:语句:语句2 case 常量表达式常量表达式n:语句:语句n default: 语句语句n+1 3.5 分支分支(fnzh)结构程序设计语句结构程序设计语句 第12页/共31页第十三页,共31页。关于switch语句的相关说明:(1) switch后面括号内的表达式,可以是整形表达式、字符型表达式,也可以是枚举型数据,且必须与case后的常量表达式的类型一致;(2) case和default后的语句可以是任意语句,不必用花括号括起来构成复合语句,会自动(zdng)顺序执行本case后面的可执行语句;(3) case和default相当于语句标号,当表达式的值与某个case 后面常量表达式的值相等时,就从该case后面的语句开始执行,直到遇到break语句或switch语句结束。如果所有的常量表达式的值都没有与表达式的值匹配,就从default后面的语句开始执行,直到遇到break语句或执行到switch语句结束。在没有default语句时,什么也不执行,直接执行switch的后继语句;(4) 同一个switch语句中,任意两个case的常量均不允许有相同的值,嵌套例外。(5) 如果希望在某个case和default分支执行后使流程跳出switch语句,则可以在该分支的最后加上一条break语句。如果各个case和default都是独立的分支时,它们都可以用一条break语句中止,这时它们在switch语句中出现的次序不影响执行结果。(6) 多个case可以共用一组执行语句,如 case A: case B: case C: printf(60n);break;表达式的值为A、B或C时都执行同一组语句。3.5 分支结构分支结构(jigu)程序设计语句程序设计语句 第13页/共31页第十四页,共31页。3.5 分支分支(fnzh)结构程序设计语句结构程序设计语句 【例】写一个程序(chngx),求某年某月的月天数。main() int y,m,d; scanf(%d,%d, ,&m,&d); switch(m) case 4: case 6: case 9: case 11:d=30;break; case 2: d=28+(y%d= =0&y%100!=0|y%400= =0);break; default:d=31;printf(y=%d,m=%d,d=%dn,y,m,d);第14页/共31页第十五页,共31页。3.6 循环循环(xnhun)语句语句 3.6.1 while循环语句循环语句while循环语句的一般形式为:循环语句的一般形式为:while (表达式)(表达式) 语句语句S它表示,当表达式的值为非它表示,当表达式的值为非0(即表达式为真),就执行语句(即表达式为真),就执行语句S;再计算表达式的值,若非;再计算表达式的值,若非0,再执行语句,再执行语句S,直到表达式计算的结果为,直到表达式计算的结果为0(即表达式为假),结束(即表达式为假),结束(jish)循环。有的书上称为循环。有的书上称为“当型循环当型循环”。其流程如图。其流程如图3-4所示。所示。 第15页/共31页第十六页,共31页。【例3.7】把输入的字符原样(yun yn)输出,直到输入“?”为止。#include stdio.hmain() char c; while (c = getchar()! = ? ) putchar( c ); 【例3.8】求1至100的和。main() int i = 1,sum = 0; while (i= 100) sum = sum+i;i+;printf(sum = %d,sum); 3.6 循环循环(xnhun)语句语句 第16页/共31页第十七页,共31页。3.6.2 do-while 语句语句do-while 语句的一般格式为:语句的一般格式为: do 语句语句 S while (表达式);(表达式);它表示,首先执行它表示,首先执行(zhxng)“语句语句S”,再计算表达式的值。当表达式的值为非零时,重复执行,再计算表达式的值。当表达式的值为非零时,重复执行(zhxng)循环体循环体“语句语句S”,直到表达式的值为零时结束,直到表达式的值为零时结束do-while循环。如图循环。如图3-5所示。所示。 3.6 循环循环(xnhun)语句语句 第17页/共31页第十八页,共31页。【例3.9】求1至100之和。main() int i = 1,sum = 0; do sum+= i;i+; while(i= 100); printf(sum = %dn,sum); 【例3.10】在屏幕(pngm)上显示若干行同一内容的字符串I love China!main() int i; scanf (%dn,&i); do printf (I love China!); while (i-);3.6 循环循环(xnhun)语句语句 第18页/共31页第十九页,共31页。3.6.3 for循环语句(yj)for 循环语句(yj)的一般形式为:for(表达式E1;表达式E2;表达式E3) 语句(yj)S其流程图如图3-6所示。它等价于语句(yj):表达式E1;while (表达式E2)假真计算表达式E1计算表达式E2 E2 = ? 语句(yj)S计算表达式E3for语句(yj)入口 语句(yj)S 表达式 E3; 3.6 循环循环(xnhun)语句语句 第19页/共31页第二十页,共31页。从图中可以(ky)看出:第一个“表达式E1”用来使循环初始化。“表达式E2”指出测试条件,当“表达式E2”的值不等于0(真),进行一次循环,与while的工作方式相同;当“表达式E2”的值为0时(假),结束循环。“表达式E3”规定循环中每次迭代后的增量。【例3.11】使用for循环语句求1100之和。main()int i,sum = 0; for (i = 1;i= 100;i+) sum = sum+i; printf (sum = %dn,sum);也可以(ky)省略for语句中的“表达式E1”或“表达式E3”,将控制循环变量的初始化及增量修改在其他地方表示出来。可改写成: 3.6 循环循环(xnhun)语句语句 第20页/共31页第二十一页,共31页。main() int i = 1,sum = 0; for (;i= 100;) sum = sum+i; +i;printf(sum = %dn,sum);在for语句中,表达式E1、E2和E3并不限于整型,可以是枚举型、浮点型等类型。例如下面(xi mian)语句是合法的:for (x = 0.0;x= 5.0;x = (x+0.1)printf(%f %fn,x,xx); 3.6 循环循环(xnhun)语句语句 第21页/共31页第二十二页,共31页。3.6.4 goto语句和带标号的语句语句和带标号的语句goto语句是无条件转移语句,其一般形式如下:语句是无条件转移语句,其一般形式如下: goto 标号;标号;其中标号是一标识符。其中标号是一标识符。goto语句的含义是把程序的执行流成转移到标号标识的语句处。即转到同一函数内具有如下形式的带标号的语句:语句的含义是把程序的执行流成转移到标号标识的语句处。即转到同一函数内具有如下形式的带标号的语句: 标号:语句标号:语句标号表明了标号表明了goto 的转向的转向(zhunxing)目的地。在目的地。在C语言中任何语句都可以带标号。语言中任何语句都可以带标号。【例【例4.12】用】用if语句、语句、goto语句和带标号的语句构成循环求语句和带标号的语句构成循环求1到到100之和。之和。main()() int i = 1,sum = 0; loop:sum = sum+i; i+; if (i= 100) goto loop; printf(sum = %dn,sum););3.6 循环循环(xnhun)语句语句 第22页/共31页第二十三页,共31页。3.7 其他其他(qt)的控制语句的控制语句 3.7.1 break语句(中止语句(中止(zhngzh)语句)语句)break语句的一般形式为:语句的一般形式为: break;它能使循环提前结束。前面所讲的循环控制流是在底部或顶部通过测试来决定循环是否结束,若要使循环提前结束,即从循环体内向外转移时,可用它能使循环提前结束。前面所讲的循环控制流是在底部或顶部通过测试来决定循环是否结束,若要使循环提前结束,即从循环体内向外转移时,可用“break语句语句”实现。实现。【例【例3.13】求连续输入的正整数之和。】求连续输入的正整数之和。main()() int i,m,sum = 0;for (i = 1;i+) scanf (%d,&m);); if (m0) break; else sum = sum+m; printf(%d,%dn,i,sum);); 第23页/共31页第二十四页,共31页。3.7.2 continue语句(继续语句)语句(继续语句)continue语句的作用是结束本次语句的作用是结束本次(bn c)循环,即跳过循环体中下面尚未执行的语句,对于循环,即跳过循环体中下面尚未执行的语句,对于for循环,执行表达式循环,执行表达式3,之后同其他循环一样接着进行下一次是否需要执行循环的判定。,之后同其他循环一样接着进行下一次是否需要执行循环的判定。continue语句的一般形式:语句的一般形式:continue;从键盘读入从键盘读入50个整数,求其中正整数之和个整数,求其中正整数之和main()() int i,a, sun = 0; for (i = 0;i50;i+) scanf(%d,&a);); if (a0) continue; sum = sum+a; printf(sum = %dn,sum););该程序表示,当输入的整数为正时,累加进该程序表示,当输入的整数为正时,累加进sum,否则不执行,否则不执行sum = sum+a;语句;语句 3.7 其他的控制其他的控制(kngzh)语句语句 第24页/共31页第二十五页,共31页。注意:contine和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;break语句则是结束循环,不再(b zi)进行条件判断。3.7.3 return语句(返回语句)C程序是由一个main()函数及若干个其他函数构成的。将流程从被调函数返回到主调函数的断点处,继续执行主调函数,可通过return语句实现。return语句一般形式: return (表达式);或 return;若return;语句用做函数的最后一句,则可省略,依靠函数的后花括号可返回到主调函数的调用处。 3.7 其他的控制其他的控制(kngzh)语句语句 第25页/共31页第二十六页,共31页。3.8 循环的退出循环的退出(tuch)及死循环的避免及死循环的避免 正常的循环退出,通常是从正常出口退出,当循环的条件不成立时,循环即告结束。3.8.1 循环的退出若想提前结束循环(其原因可能不是由于条件不成立,而是根据输入或计算的结果来定),此时可按情况选择采用前面所讲break,continue及goto语句(yj)来实现。但它们三者是有区别的。主要在于:采用goto语句(yj),可以一下子跳出多重循环。如果用break语句(yj),只能跳出一层循环。前者可提高实际效率。 3.8.2 死循环问题1由while语句(yj)引起的死循环及do-while引起的死循环 第26页/共31页第二十七页,共31页。【例3.15】误将i写成j的程序(chngx)。main() int s = 0,i = 1,j; while (i= 100) s = s+i; j = i+1; /*误将i写成j*/ printf(%dn,s);条件为永真时也是死循环,如while(1100),误将英文i写成数字1。【例3.16】误将英文i写成数字1的程序(chngx)。 main() int s = 0,i = 1; do 3.8 循环循环(xnhun)的退出及死循环的退出及死循环(xnhun)的避免的避免 第27页/共31页第二十八页,共31页。 s = s+i; i+; while (1100); /*误将英文i写成数字1*/ printf(%d,s);2由for语句形成的死循环(xnhun)【例3.17】因i+未被置于循环(xnhun)体内形成的死循环(xnhun)。main() int s = 0,i = 1; for(;i100;) s = s+i; i+; printf(%d,s); 3.8 循环循环(xnhun)的退出及死循环的退出及死循环(xnhun)的避免的避免 第28页/共31页第二十九页,共31页。3.9 程序程序(chngx)举例举例 【例】设有一篮鸡蛋,不超过400个,若每次拿2个(或每次都拿3、4、5、6个)时,篮里总剩一个蛋,若每次拿7个,则刚好拿完,问篮里原有多少个鸡蛋?分析,首先推断蛋的数目(shm)必是奇数,故可设置n = 3,然后用3除,若余数非1就加2,直至余数为1止;若再用4除,若余数非1就不断加6(23 = 6,即2和3的最小公倍数),至余数为1止;再用5除,若余数非1就反复加12(即2、3、4的最小公倍数),直至余数为1止;再用6除,若余数非1则加60(即2、3、4、5的最小公倍数),待余数为1止;最后用7除,若不能整除就加60,直至整除为止,这时的n值就是所求的数目(shm)。用while语句进行重复计算。程序如下: main() int n = 3; while (n%3! = 1) n += 2; while (n%4! = 1) n = n+6; /* 或n += 6;*/ while (n%5! = 1) n = n+12; /* 或n += 12;*/ while (n%6! = 1) n = n+60; /* 或n += 60;*/ while (n%7! = 0) n = n+60; printf (There are %d eggs. n,n) 运行结果: There are 301 eggs。 读者可将其中的while语句改为do-while语句。 第29页/共31页第三十页,共31页。【例】带100元钱去买鱼,大鱼每条3元,中等(zhngdng)大小每条2元,小鱼每条5角,要求买100条鱼,试用C程序算出共有几种采购方案。解:可用for语句来构成两重循环的程序解此问题。程序如下: main() int dy,zy,xy; for (dy = 0;dy= 33;dy+) /* 0= dy= 33*/ for (zy = 0;zy= 50;zy+) /* 0= zy= 50*/ xy = 100-dy-zy; if (3*dy+2*zy+0.5*zy = 100) printf(dy = %d zy = %d xy=%dn,dy,zy,xy); 3.9 程序程序(chngx)举例举例 第30页/共31页第三十一页,共31页。
展开阅读全文