1、第3章 C语言 程序设计的3种基本结构,1.,2.,3.,本章讲述内容:,字符输入/输出函数 ;,格式输入/输出函数 ;,C语言中的各种选择语句 ;,4.,C语言中的各种循环语句。,C语言把系统函数分别放在扩展名为“.h”的磁盘文件中,称为“头文件”或“头函数”。程序中用到某个系统函数时,就须在程序开头写一个包含命令,即:#include “头文件名“ 以指明该函数在哪一个头文件里。,3.1 顺序结构程序设计,3.1.1 赋值语句、复合语句、空语句,1.,.,若程序中的语句是按书写的顺序执行,那么这段程序的结构就是顺序式的。一般地,顺序结构的程序段,总是先输入数据,接着利用赋值语句对这些数据进
2、行加工或处理,最后把结果打印输出。,.,C语言的输入/输出功能,是通过调用系统提供的输入/输出函数来实现的。直接调用它们,在其后加上语句结束符“;”,就形成了所谓的输入/输出“函数调用语句”。本节介绍输入/输出函数:getchar (),putchar (),printf (),scanf () 。,.,赋值语句,在赋值表达式的后面,加上一个语句结束符“;”,就形成了一个赋值语句。,.,.,赋值语句的一般格式是:= ; 或 = ; 功能是算出“=”右边表达式的值,然后将其赋予左边的变量;或=是算术或位自反赋值运算符,功能是将左边变量和右边表达式进行指定运算,将所得值赋予左边的变量。,语法上,复
3、合语句相当于一个语句,一般格式是: 语句;语句; ,“x = 4; y = 16;”是两条赋值语句,第1条使变量x获得值4,第2条使变量y获得值16。,例:,试分析下面程序的运行结果。,#include “stdio.h“ main() int x, y;x = 4; y = 16;x = 1;printf (“y = %dt“, y);y = 1;printf (“y = %dn“, y); ,(1),(2),“x=1;”是位自反赋值运算符,前一个把x中的值左移一位,后一个把y中的值右移一位。每移一次,就将结果打印输出,反复做两次。,(3),对于整数,每左移一次等于将原来的值乘2;每右移一次
4、等于将原来的值除2。,0,0,0,0,1,0,0,0,第1次x=1后的结果,0,0,0,1,0,0,0,0,第2次x=1后的结果,0,0,0,0,1,0,0,0,第1次y1后的结果,0,0,0,0,0,1,0,0,第2次y1后的结果,2.,复合语句,.,在C语言程序中,可用一对花括号把若干条语句括起来,形成一个整体。这个整体被称为“复合语句”。,.,.,注意:复合语句中可以出现变量说明;复合语句中的最后一条语句的语句结束符(分号)不能省略,否则会造成语法错误;另外,标识复合语句结束的右花括号的后面不能有语句结束符(分号)。,3.,空语句,.,在C语言中,称仅由一个分号组成的语句为“空语句”,即
5、:; 编译程序遇到空语句时,不为产生任何指令代码。即空语句不执行任何操作,它只是C语言语法上的一个概念。,3.1.2 字符输入/输出函数,.,字符输入函数getchar()和字符输出函数putchar(),都在头文件“stdio.h”里。程序中使用时,必须在开始处书写一条包含命令:#include “stdio.h“,.,字符输入函数:getchar(),1.,函数功能:使程序处于等待用户从键盘进行输入的状态。输入以在键盘上按回车换行键结束,随之返回输入的第1个字符。该函数没有参数。,.,在程序中使用该函数的一般形式是:, = getchar ();,即把由getchar()返回的第1个字符,
6、存入赋值语句左边的。,例:,编写程序,从键盘接收一个字符的输入,然后打印输出。,(1),程序实现,#include “stdio.h“ main() char ch;ch = getchar ();printf (“ch = %cn“, ch); ,(2),分析与讨论,.,程序里通过调用字符输入函数 getchar (),将键盘输入的字符序列中的第1个字符存入到ch的。,.,注意:getchar()函数应以Enter键作为输入的结束。该函数只把输入的第1个字符返回。按Enter前输入的其他字符(连同Enter在内) 可被另外的getchar()函数接收。,字符输出函数:putchar(),2.
7、,.,调用形式:putchar (c),其中c为该函数的参数,通常是一个已经赋值的字符型变量,或是一个字符常量。,.,函数的功能是将字符变量c里的内容或字符常量在显示器上显示(即输出)。在程序中使用该函数时的一般形式是:,.,比如,可将上例中的语句printf (“ch=%cn”, ch);改写为:putchar (ch);,putchar (); 或 putchar ();,3.1.3 格式输入/输出函数,.,格式输入函数scanf()和格式输出函数printf(),都在头文件stdio.h里。使 用它们时,在程序的开始处,应该书写包含命令:#include “stdio.h”。不过 由于这
8、两个函数在C语言程序设计中使用得太频繁了,所以即使在程序中没有写这条包含命令,编译也不会出错。,格式输入函数:scanf(),1.,格式输入函数的调用形式为:,.,.,scanf的功能是按中给出的格式说明以及数据间的分隔符,从键盘上输入数据,然后存放到所指示的变量地址里。,scanf ( “ %d , %f ” , ,格式说明,格式控制字符串,数据分隔符,输入地址列表,scanf (,),参数是用双引号括起的字符串常量,里面列出输入数据的格式说明和分隔符;参数列出存放输入数据的各个变量的地址。,a、b为字符型变量。执行“scanf (“a=%c, b=%c“, ”后,要使a为A、b为B,试问在
9、键盘上的正确输入是什么?,在scanf()的格式控制字符串里,安排起数据分隔作用的一般字符。用户输入时,必须按照安排键入这些分隔字符。,.,scanf()函数中最常用的格式字符,格式字符,说明,应用示例,输入示例,d,十进制整数,scanf(“%d”,输入212,变量x里为212,f,十进制实数,scanf(“%f”,输入6.28,变量f里为6.280000,c,单个字符,scanf(“%c”,输入A,变量ch里为A(ASCII码值),字符串,输入Beijing,数组t里为字符串”Beijing”,s,scanf(“%s”,t);,八进制整数,输入324,x为八进制数324,o,scanf(“
10、%o”,十六进制整数,输入D4,x为十六进制数D4,x,scanf(“%x”,.,输入数据时,判断一个数据输入结束的几种方法,(1),例:,解:,scanf()中,格式控制字符串“a=%c, b=%c”里的a=、,、b=都是一般字符。输入时,这部分字符用户必须按原样从键盘键入。因此,在键盘上的正确输入应该是:a=A, b=B /* 这里用“”表示回车换行符 */ 用户在键盘上键入这样的输入后,变量a里就存放字母A的ASCII码值,b里就存放字母B的ASCII码值了。,所有数据从键盘输入完毕后,必须以回车换行(即键盘上的Enter键)作为整个数据输入的结束。,在scanf()的格式控制字符串里,
11、不安排任何数据分隔符,这时就默认空格符、制表符或回车换行符为数据输入完毕的分隔符。比如: scanf (“%d%d%d“, 中的格式控制字符串里没有一般字符。这时,输完一个数据后,就可键入空格(或Tab键,或Enter键),再输下一个数据,直到最后输入回车换行表示整个输入的结束。,(2),(3),在格式符前冠以附加格式符,指明输入数据的域宽(正整数)。比如:scanf (“%3d%2d%4d“, 这里,%3d里的3就是附加格式符,表示由d限定的十进制数为3位数。因此,在键盘上连续键入245321258后回车,scanf就会把245存入变量a,把32存入变量b,把1258存入变量c。,正确使用s
12、canf()函数必须注意的几点,.,(1),(2),中给出的必须是一个变量地址,而不能是其他。因此在变量名的前面不要忘记加上取地址符&。,(3),中给出的格式说明个数(即给出的“%”个数),必须与输入地址列表中所列变量地址的个数相一致,因为它们之间应该是一一对应的。,printf的功能是按照中给出的格式说明,将中列出的变量值转换成所需要的格式,然后在显示器上输出。出现在中的其他字符,将按照原样输出。,参数是用双引号括起的一个字符串常量,里面有要求函数原样输出的字符,以及规定数据输出时采用的格式;参数列出了需要输出的变量名(或表达式),正是它们的内容要按照格式说明的规定加以输出。,格式输出函数:
13、printf(),2.,.,格式输出函数的调用形式为:,.,printf ( “ Two roots: x1 = %f t x2 = %f n ”, re1 , re2);,原样输出的字符,格式说明,格式控制字符串,输出变量列表,执行该语句,就把Two roots: x1 = 、t x2 =,以及n按照原样输出(注意,t 和n 是两个转义字符,输出时将按转义字符的本身含义输出)。另一方面,语句又把输出变量表中所列的变量re1和re2,按照格式控制字符串里给出的两个格式说明%f,分别将它们转换成规定的数据格式(实数)后,在指定的位置处进行输出。,.,printf (,);,.,printf()函
14、数中最常用的格式字符,格式字符,说明,应用示例,输入示例,d,十进制int型,printf(“x=%dn”,x);,X=212,f,十进制double型,printf(“sum=%fn”,sum);,sum=0.628000,c,单个字符,printf(“It is %cn”,c);,It is W,字符串,* Beijing *,s,printf(“* %s *n”,s);,八进制整数,Oct=324,o,printf(“Oct=%on”,x);,十六进制整数,Hex=D4,x,printf(“Hex=%xn”,x);,无符号十进制数,addr=65498,u,printf(“addr=%u
15、n”,.,在printf()的格式字符前,还可冠以附加格式字符,以得到更多的格式输出信息。,附加格式字符,说明,应用示例,输入示例,m(一个正整数),规定输出域宽,printf(“x=%3dn”,x);,X=212,.n(一个正整数),规定小数位数,printf(“sum=%5.2fn”,sum);,sum=44.86,-,输出数据左对齐,printf(“%-3dn”,a);,数据左对齐,#include “stdio.h“ main() int x = 18, y = 222, z = 34;printf (“%4d %4d %4dn“, x, y, z);printf (“%4d %4d
16、%4dn“, x, y, z); ,例:,试给出右边程序的输出格式。,解:,右对齐格式:,左对齐格式:,1 8,2 2 2,3 4,1 8,2 2 2,3 4,4d,-4d,两个空格,也要特别注意函数printf()中格式说明%d与输出变量的对应关系是从左往右一一对应。,格式控制字符串内的格式说明个数应与输出变量表里所列的变量个数吻合,类型一致。,.,使用函数printf()必须注意的问题,(1),格式控制串必须在双引号内。,(2),(3),对输出变量表里所列诸变量(表达式),其计算顺序是自右向左进行的。因此,要注意右边的参数值是否会影响到左边的参数取值。,例:,(1),试分析下面程序的输出。
17、,#include “stdio.h“ main() int x = 4;printf (“%dt %dt %dn“, +x, +x, -x); ,因此,在printf() 输出前,应该先计算-x,再计算中间的+x,最后计算左边的+x。所以,该程序执行后的输出是:5 4 3 而不是:5 6 5,要特别注意函数printf()对输出变量表里所列诸变量(表达式)的计算顺序是自右向左进行的。,(2),(3),printf (“%dt %dt %dn“, +x, +x, -x);,对应关系,第1计算,第2计算,第3计算,3.2.1 if单分支选择语句,3.2选择结构程序设计,.,.,C语言程序中,实现
18、选择结构的手段,一是用if语句,一是用switch语句。其中if语句有3种形式:if单分支选择,ifelse双分支选择,以及ifelse if多分支选择。,if单分支选择语句的一般格式是:,.,如果在条件成立时所要做的事情需要用几条语句来表达,那么格式中的就应该通过使用花括号以复合语句的形式出现。,.,if单分支选择语句的执行流程图,条件,语句,真,假,(后续语句),if ();,当执行中遇到if时,若圆括号里的取值为非0(即条件成立),则执行;否则(即取值为0,条件不成立)就不执行if中的,而去执行该单分支选择语句的后续语句。,比如两次运行该程序,第1次输入242,第2次输入108,其结果如
19、图所示。,例:,编写程序,从键盘输入一个整数,然后输出其绝对值。,(1),程序实现,#include “stdio.h“ main() int num;printf (“Input your integer:n“);scanf (“%d“, ,(2),分析与讨论,.,程序中,条件num0成立时,就执行单分支语句:“num = num;”。这样,在变量num里,总保持是一个正数,即它的里面存放的是输入数据的绝对值。,.,打印语句: printf (“The absolute value is %dn“, num); 是单分支语句的后续语句,无论“num = num;”是否做,这条打印语句总是要执
20、行的。,在具体编写程序时,常用printf()给出提示信息。比如程序一开始给出语句:printf (“Input your integer:n“); 即是提示用户输入数据。这样的做法,使得编写的 程序具有人性化,界面更为显友好。,.,.,#include “stdio.h“ main() int x, y, swap;char ch;printf (“Input two integers.n“);scanf (“%d%d“, ,例:,编写一个程序,输入两个整数,随之输出。然后,再输入一个字符,如果字符是y或Y,则将两个整数交换后输出。,(1),程序实现,(2),分析与讨论,复合语句,实现数据交
21、换,.,判断ch里输入的是小写y或大写Y时,其条件应该写成:ch = y | ch = Y 不能写成:ch = y | ch = Y,.,两个变量间内容的交换,不能写成:x=y; y=x; 因为x、y对应的都是内存单元,执行“x=y;”后,原来x里的值就没有了。再做“y=x;”,达不到交换的目的。,.,为实现单元内容的交换,应设一临时变量swap,以它为中介,分三步完成变量间的交换。,swap=x,x=y,y=swap,x,y,swap,#include “stdio.h“ main() int fir, sec;printf (“Please enter two numbers:“);sca
22、nf (“%d%d“, ,编写程序,输入两个整数,若第1个大于第2个,显示信息first is greater than second!,否则显示信息:first is not greater than second!。最后显示信息:All done!。,3.2.2,ifelse双分支选择语句,.,ifelse双分支选择语句的一般形式是:,例:,(1),程序实现,(2),分析与讨论,.,这是典型的双分支选择结构,可根据条件“fir sec” (第1个整数是否大于第2个)作为判断条件。,条件,语句1,真,假,(后续语句),语句2,ifelse双分支选择语句的执行流程图 。,.,if (); el
23、se;,ifelse if多分支选择语句的执行流程图 。,3.2.3 ifelse if多分支选择语句,.,ifelse if多分支选择语句的一般形式是:,执行中遇到if时,若圆括号里的取值为非0,则执行;否则去判定else if后面圆括号里,如果值为非0,则执行;否则去判定下一个else if后面圆括号里的值,如果值为非0,则执行;如此等等。如果、都为0,那么执行else后面的。在执行了或或或后,去执行后续语句。,.,条件1,语句1,真,假,(后续语句),.,条件2,语句2,真,假,条件3,语句3,真,假,语句n,假,if ();else if ();else if ();else if (
24、);else ;,输入一个字符。若是数字,打印出:It is a number!;若是小写字母,打印出:It is a small letter!;若是大写字母,打印出:It is a capital letter!。否则打印出:It is a other character!。,例:,(1),程序实现,(2),分析与讨论,.,#include “stdio.h“ main() char ch;printf (“Please enter a character:“);scanf (“%c“, ,各判定条件分别是:是数字?是小写字母?是大写字母?是其他字符?根据输入的不同情况,打印出不同的信息。
25、,.,单分支和双分支的语句结构都只根据一个条件来进行选择,而多分支语句结构则是根据多个不同的条件来做选择。在程序中无论使用哪种选择结构,编程者都必须构造恰当的条件,必须清楚谁是整个结构的后续语句。,分别输入数字64、字符、小写字母 f 以及大写字母M后,运行4次的输出结果。,.,3.2.4 if 语句的嵌套结构,.,在各种if选择结构里,其分支语句本身也可是一个if选择结构语句,这就是所谓的“ if 语句的嵌套结构”。,.,嵌套结构中,可能会出现许多if和else。原则上,else总是与它最近的if配对。但在一个if的嵌套结构中,if和else的个数可能不等。为使结构清晰,避免配对错误,编程人
26、员应多用花括号来形成复合语句,以正确地表达自己的设计意图。,例:,有程序段如下:,if (y = 8) if (x = 5) printf (“ n“); else printf (“# # # # #n“); printf (“$ $ $ $ $n“); printf (“,给出的程序段中,有两个if,一个else。只有安插花括号改变if和else的配对,才能达到目的。,if (y = 8) if (x = 5)printf (“ n“);elseprintf (“# # # # #n“); printf (“$ $ $ $ $n“); printf (“,.,.,具体做法如下:,假定x=5
27、、y=8,如何用安插花括号的方法,使上述程序段输出结果: $ $ $ $ $ & & & & &,3.2.5 switch多分支选择语句,.,C语言提供的另一种多分支选择结构是switch语句,它根据一个整型(或字符型)表达式的不同取值,来实现对分支的选择。,.,switch多分支选择语句的一般形式:,switch ( ) case 常量值1:;break;case 常量值2:;break; case 常量值n1:;break;default :;break; ,.,switch语句的功能是求出圆括号内表达 式的值,与case后的常量值逐一比较。找到匹配者时,就执行其后以及后面 case里的语
28、句。若所有case后的常量值都不匹配,才去执行default(如果有的话)后的语句。但在执行匹配的case后的语句时,若遇到break语句,则立即跳去执行switch的后续语句。,.,switch的执行流程图:,表达式,语句1,Y,switch,有break?,N,常量值1,语句2,Y,有break?,常量值2,N,语句3,Y,有break?,常量值3,N,语句n,default,(后续语句),把所给的ifelse if多分支语句程序段改写成switch多分支语句程序段。,如果switch语句中有default,通常都把它放在语句的最后。但这并不是强求的,它在语句里出现的位置,不会影响程序的执
29、行结果。,执行完匹配case后的语句,如果没有遇到break,那就自动去执行下一个case后的语句,而不再判别与其常量值是否匹配。,.,有关switch语句的几点注意,(1),switch后的表达式必须用圆括号括住,取值只能是整型或字符型的。,(2),各case后的常量必须是整数或字符常量,它们不应该相同。,(3),(4),(5),case后的语句也可以是switch语句,从而形成switch语句的嵌套形式。,例:,if (ivalue = 1)ncount1+; else if (ivalue = 2)ncount2+; else if (ivalue = 3)ncount3+; else
30、ncount4+;,switch (ivalue) case 1:ncount1+;break;case 2:ncount2+;break;case 3:ncount3+;break;default:ncount4+;break; ,改写结果,.,输入1时,做“case 1:”后的语句printf (“x = 1n”); 。由于有break,就结束switvh的执行。所以,整个程序的输出结果是:x=1。,输入2时,先做“case 2:”下的x = 1。但因为没有跟随break语句,所以继续做case 3后的x += 2和printf (“x = %dn”,x),在遇break时结束switvh
31、的执行。于是输出3。,例:,#include“stdio.h“ main() int x;printf (“Enter a number:n“);scanf (“%d“,运行所给程序4次,分别输入数据1、2、3和4。试问每次的输出结果是什么?,case 4:printf (“x = %d, “, x+);printf (“x = %dn“, x);break; ,(1),(2),(3),输入3时,输出的结果是:x=5。,(4),输入4时,输出的结果是:x=4, x=5。这是因为在做printf (“x = %d, “, x+)时,x值为4,将4输出后才对x进行+操作。所以紧接着由printf
32、(“x = %dn“, x)输出x=5。,例:,编写一个程序,它从键盘接收一个算术运算符和两个整数。根据运算符的不同,求出相应的算术运算结果,打印输出。,#include “stdio.h“ main() int x1, x2;char opt;printf (“Please enter an :“);scanf (“%c%d%d“, ,case /:if (x2 != 0)printf (“x1/x2=%dn“, x1/x2);elseprintf (“division by zero!n“);break;default:printf (“unknown operator!n“);break
33、; ,(1),程序实现,(2),分析与讨论,算术运算符有+、*和/ 4种。可根据输入的运算符由switch语句来完成相应的算术运算。要考虑两个特殊情况:一是做除法时分母不能为0;二是若输入的不是算术运算符,那就归到“default:”里去处理。,.,程序中遇到while时,先查是否成立。若成立,就去做一次(即“循环体”),然后再去查是否成立,以此形成循环;若不成立,则终止循环,去执行while语句的后续语句。,在一定的条件下,去重复执行一组语句,这样的语句结构称为“循环结构”,被重复执行的那组语句被称为“循环体”。C语言中用于实现循环的语句有3种,它们是:while循环语句,dowhile循环
34、语句,以及for循环语句。,3.3 循环结构程序设计,3.3.1 while循环语句,.,.,while循环语句的一般形式是:,条件?,语句(循环体),真,假,(后续语句),while,.,while语句的执行流程图,.,在程序设计中使用while循环语句时,要注意两个问题:一是在进入循环前,必须为控制循环的条件赋初值,否则无法检验条件是否成立;二是在循环体中,应该含有修改循环条件的语句,否则就可能造成死循环。,while ();,程序中的变量i有两个作用,一是记录当前已输出的个数,这由语句“i+;”来完成;二是用来控制一行输出数据的个数,当它能够被7整除时,就输出一个回车换行符, 这由:if
35、 (i%7 = 0)printf (“n“); 来完成。,虽不知150间能被3整除的正整数有多少个,但可从1到50一个一个地去试:试一个就加1,试一个就加1,直到越过50时停止。,例:,(1),程序实现,(2),分析与讨论,编写一个程序,输出150中间所有能被3整除的正整数。,#include “stdio.h“ main() int num = 1;while (num=50)if (num%3 = 0)printf (“%3d“, num);num+; ,.,为知道某数是否能被3整除,可通过条件:num%3 = 0 来判定。即:用3去除这个测试的数,若余数为0,就表明该数能被3除尽,是所求
36、的数,应把它打印出来。,.,#include “stdio.h“ main() int i= 0, num = 1;while (num=50) if (num%3 = 0) printf (“%3d“, num);i+; if (i%7 = 0)printf (“n“);num+; ,.,为了在用户窗口的一行里只打印比如7个数据,可以修改程序,添加控制一 行输出数据个数的功能。,.,反复输入正整数,计算并输出组成该数的各位数字之和。比如,输入的数是13 256,则输出1+3+2+5+6=17。直到输入的数为0时停止。,例:,(1),程序实现,#include “stdio.h“ main()
37、 int x, x1=0, x2=0, x3=0, x4=0, x5=0;printf (“Please enter a integer:“);scanf (“%d“, ,(2),分析与讨论,注意:若变量是int 型的,那么最大值为32 767(五位数),因此程序中输入的数必须小于等于32767,我们应开辟5个变量x1x5来存放最多5个数字。,注意:最初应把x1x5都赋值0,这样即使输入的是一个三位数,也能够保证最后计算的正确。,.,.,.,程序的关键是如何能根据所输入的数,把它的个、十、百、千、万位分离出来。,进入while前的“scanf (“%d“, ”是完成对循环控制条件的修改。,.,
38、程序中遇到do时,就执行(即循环体),然后去检查while后圆括号内的是否成立。若成立,则再次执行;若不成立,则终止该循环,去执行 dowhile 语句的后续语句。,dowhile语句的执行流程图,3.3.2 dowhile循环语句,.,dowhile循环语句的一般结构是:,.,条件?,语句(循环体),真,假,(后续语句),dowhile,.,关于dowhile语句的几点注意,(1),编写程序时,无论循环体是否为复合语句,最好都用花括号括起来。,(2),dowhile语句的最后要安排分号结束,不能忽略不写。,(3),while和dowhile这两种循环语句的最大差别是:前者的循环体有可能一次也
39、不做(如果进入循环时条件就为假);后者的循环体至少要做一次,因为它的判定条件被安排在了做完一次循环体之后。,do ; while ();,由于变量ch里的初值(空格),并不是通过键盘输入的,因此不能对它进行计数。所以记录空格数的变量m的初值,应该设置为1。,用dowhile语句编写程序,连续输入若干字符,直到回车换行符结束。统计并输出所输入的空格、大写字母、小写字母,以及其他字符(不含回车换行符)的个数。,例:,(1),程序实现,(2),分析与讨论,#include “stdio.h“ main() char ch= ;int i=0, j=0, k=0, m= 1; do if (ch=a
40、,.,考虑到dowhile循环是先做一次循环体后,才去测试循环控制条件,循环体里是分情况对变量ch里的内容进行多分支处理。所以在进入循环前,必须为ch赋一个初值,程序里把它赋为空格。,.,.,控制循环的条件是:(ch=getchar()!=n,即先通过函数getchar()读入一个字符,并赋予变量ch,然后去测试ch里是否为回车换行符。因为ch=getchar()是一个赋值语句,所以要在它的外面用圆括号括起来,才能对ch里的内容进行测试。,利用级数:计算的近似值,精度要求为|1/n|104。请用dowhile循环语句。,例:,(1),程序实现,(2),分析与讨论,4,=,1 -,3,1,+,5
41、,1,7,1,+,9,1,-,-,+,-,n,1,#include “stdio.h“ #include “math.h“ main() float pi = 0.0, n = 1.0, sign = 1.0, item;doitem = sign/n;pi += item;sign *= 1.0;n += 2;while(fabs(item)=1e4);printf (“= %fn“, 4*pi); ,.,关键是如何形成新项。级数各项分子都是1,分母由奇数组成,各项前的符号正负相间。为形成奇数分母,只需以1为起点,不断加2即可(这由程序中的n + = 2; 完成)。为形成正负相间的各项符号,
42、循环时利用变量sign来达到改变item符号的目的。,.,在C语言中,专门提供有求一个数x的绝对值的函数。如果该数是整型的,则使用函数abs(x);如果该数是实型的,则使用函数fabs(x)。程序里判定循环条件时,用到了fabs(x)。由于它们在头文件“math.h”里,所以程序开头增加了一条包含命令:#include “math.h“,用for编写程序,将个位数为6,且能被3整除的三位数全部打印输出(每行打印10个数据),最后输出这种数的个数。,3.3.3 for循环语句,.,条件?,语句(循环体),真,假,(后续语句),for,计算表达式1,计算表达式2,计算表达式3,for循环语句的一般
43、形式是:,例:,#include “stdio.h“ main() int count = 0, num;for (num = 126; num=996; num +=10)if (num%3 = 0),printf (“%4d“, num);count+;if (count%10 = 0)printf (“n“);printf (“Count = %dn“, count); ,解:,for (; ; );,计算,为循环变量赋初值。再计算,若它成立,进入循环体,去执行;否则终止循环,去执行for的后续语句。执行完循环体后,去计算,修改循环条件。又计算,以判定是否进入下一次循环。,编写程序,求1
44、00999之间所有的水仙花数。所谓“水仙花数”,即是一个三位数,它个位、十位、百位数字的立方和,恰好等于该数本身。,例:,(1),程序实现,(2),分析与讨论,#include “stdio.h“ main() int i, j = 1;int nf, ns, nt;for (i =100; i=999; i+) nf = i i/10*10; ns = (i i/100*100)/10;nt = i/100;nf = nf * nf * nf; ns = ns * ns * ns;nt = nt * nt * nt;if (nf + ns + nt) = i)printf (“The %ds
45、 number is %dn“, j, i);j+;,.,用for循环时,循环从100开始,到999止,每次加1。对该区间里的每个数进行测试,看是否满足“个位、十位、百位数字的立方和,恰等于该数本身”的要求。如果满足,就是所求。,.,这里又给出一种分离个位、十位等数字的方法。即若i是一个三位数,那么:nf = i i/10*10; /* 个位数 */ns = (i i/100*100)/10; /* 十位数 */nt = i/100; /* 百位数 */ 应该记住这些方法。,3.3.4 break和continue语句,.,break语句的一般形式是:,例:,阅读下面的程序,它输出什么结果?,
46、#include“stdio.h“ main() int x;for(x = 1; x=10; x+)if (x = 5)break;printf (“%dt“, x);printf (“nBroke out of loop at x = %dn“, x); ,按照for的规定,循环应进行10次。但在x取值为5时,由于条件x=5成立而做break,于是就强迫循环结束,后面的5次循环不做了。即程序执行过程中打印出的结果如下:1 2 3 4Broke out of loop at x = 5,.,程序让变量x从110控制语句“printf (”%dt“, x);”的执行,把当时x的值打印出来。但如
47、果x等于5,那么就强行结束整个循环,去做该循环的后续语句:printf (“nBroke out of loop at x = %dn“, x);,.,break;,该语句只用于两个场合:在switch多分支选择结构中,当某个case后的语句执行完、遇到break时,就跳出switch结构;在循环结构中:若遇到break,就立即结束整个循环,跳到该循环的后续语句处执行。,例:,编写程序,最多接收50个整数,计算它们的累加和。若输入过程中输入了0,则立即停止输入,打印出当时的累加结果。,(1),程序实现,(2),分析与讨论,#include “stdio.h“ main() int i, j=1, num, sum = 0;for (i=1; i=50; i+)printf (“nPlease enter %d number:“, j);scanf (“%d“, ,.,程序中用变量sum记录累加和,该变量的初始值应该是0;用变量j记录输入数据的个数。考虑到可能第1次就输入0等情况,所以在最后打印语句中,应该打印出j1的值,而不是j的值。,.,程序有两个出口,一个是输入满50次后,循环正常结束;另一个是若在循环过程中输入了数值0,那么就利用break语句,提前结束整个循环。,