1、第3章 C语言的基本控制结构,学习目的与要求:,掌握C 语言的格式输入与输出函数scanf和printf。,熟练掌握选择结构的使用方法,熟练掌握三种循环结构的使用方法,根据给定的问题,给出相应的解决方法,基本内容,顺序结构,顺序结构是选择结构和循环结构的基础 。,C顺序结构是结构化程序设计中最简单和最常用的结构。,顺序结构要求按照各语句的书写顺序一条一条地执行 。,C语句,一个C函数包含声明部分和执行部分,执行部分是由语句组成的,语句的作用是向计算机系统发出操作指令,要求执行相应的操作。C语言中的语句主要有控制语句、表达式语句、空语句、复合语句、函数调用语句等,C语句控制语句,用于完成一定的控
2、制功能。C语言有以下9种控制语句:,if() else (条件语句) for()(循环语句) while() (循环语句) dowhile() (循环语句) break (中断switch或循环语句) continue (结束当前循环语句) switch (多分支选择语句) return (返回语句) goto (转向语句),C语句表达式语句,表达式是通过运算符号连接操作数得到的式子,表达式可以是算术运算表达式、关系运算表达式、逻辑运算表达式、赋值表达式等。一个表达式加上分号就构成表达式语句。,例如: x=1; a=3*b-c/4; +i; c=ab?a:b;都是合法的表达式语句。,C语句空语
3、句,空语句也可以用在程序调试中 。,空语句。空语句是只由一个分号“;”构成的语句。,空语句不执行任何操作,通常与while和for语句一起使用,作为循环语句的循环体(循环体什么也不执行),例如: while(c=getchar()= ) ;,例如: void doSomething() 调试时在程序流程中调用该函数,可以保证能够正常回到调用点,C语句复合句,用大括号“ ”将多条语句括起来得到的语句,又称为分程序。复合语句通常用于条件分支结构、循环结构中。,例如: if(xy) temp=x; x=y; y=temp; ,C语句函数调用句,在函数调用之后加上分号形成的命令语句。,例如:调用输出函
4、数 printf(a=%dn,a);,数据的输入输出,C语言没有提供专门的输入输出语句,所有输入和输出的操作都是由函数调用来实现的。在C语言的函数库中提供了用来进行输入输出的函数,这些函数被称为“标准输入输出函数”。它是以标准的计算机输入输出设备(一般为终端设备)作为输入输出对象的。,数据的输入输出,C语言提供的所有函数都是存放在C语言的函数库中,要使用这些函数时,需要通过预编译命令#include将以“.h”为扩展名的相应库文件包含到源文件中。例如,如果要使用标准输入输出函数,需要在源文件的开头包含如下命令: #include 或 #include stdio.h,字符输出函数putchar
5、,若从计算机向显示器输出一个字符,可以调用系统函数库中的putchar函数。,函数的一般形式为: putchar(ch) 功能:将参数ch的值以字符类型输出到系统的标准输出设备(通常是显示器),如果函数调用成功,则返回参数字符。,putchar函数应用举例,编写程序用putchar函数输出字符串“China”。 #include int main() char ch1=C,ch2=h, ch3=i; putchar(ch1); putchar(ch2); putchar(ch3); putchar(n); putchar(97); putchar(n); return 0;,putchar(c
6、h)函数中的ch可以是字符常量、字符变量、字符允许范围内的整数以及表达式。,字符输入函数getchar,向计算机输入一个字符,可以调用系统函数库中的getchar函数 。,函数的一般形式为: getchar()功能:获得用户从系统的标准输入设备(通常是键盘)输入的一个字符,并返回该字符的ASCII码。,getchar函数应用举例,接收用户输入的字符串,并将其打印出来。 #include int main() char ch1,ch2,ch3,ch4,ch5; printf(输入一个字符串:n); ch1=getchar(); ch2=getchar(); ch3=getchar(); ch4=
7、getchar(); ch5=getchar(); putchar(ch1); putchar(ch2); putchar(ch3); putchar(ch4); putchar(ch5); putchar(n); return 0;,getchar函数是一个无参函数,若要获得该函数的值,需赋给一个字符变量或整型变量。,格式输出函数printf,C语言提供的printf函数可以用参数设置格式化输出,并将结果显示到标准输出设备上。,printf函数的一般形式为: printf(格式控制字符串, 输出对象列表),例如:printf(“a=%d,b=%dn,a,b);,格式输出函数printf,pr
8、intf(格式控制字符串, 输出对象列表),格式控制字符串,普通字符:原样输出,格式说明 :%+格式控制符,转义字符,其它符号:修饰符,改变输出形式,“输出对象列表”指定需要输出的数据,可以是常量、变量、表达式或函数调用。对象列表中可以有多个表达式,多个表达式之间用逗号分隔。,printf函数的一般形式可以表示为: printf(参数1, 参数2, 参数3, , 参数n),printf函数中的格式字符,printf函数中的修饰符,printf函数应用举例,接收用户输入的字符串,并将其打印出来。 #include int main() short a=2, c=-6,d=32768; unsig
9、ned short m=65535; int b=32768; float f=29.3683; double x=1.583, y=0.992; char ch=B; printf(a=%hd, a=%4hdn,a,a); printf(b=%d, b=%-10d, b=%4dn,b,b,b); printf(c=%hd, c=%ho, c=%hx, c=%hun,c,c,c,c); printf(d=%hd, d=%ho, d=%hx, d=%hun,d,d,d,d); printf(m=%hd, m=%ho, m=%hx, m=%hun,m,m,m,m);,printf函数应用举例,pr
10、intf(f=%f, f=%6.2f, f=%6f, f=%dn,f,f,f,f); printf(ch=%c, ch=%dn,ch,ch); printf(n%6.2f,x); printf(n+%5.2f,y); printf(n-); printf(n%6.2fn,x+y); return 0;,注意:printf函数中参数列表中的对象必须与格式控制命令的个数和类型一一对应,两者如果不匹配则无法输出正确结果。,格式输入函数scanf,scanf函数的功能是在程序运行过程中接收用户输入的数据,并将其赋值给已经定义的变量。,scanf函数的一般形式为: scanf(格式控制字符串, 变量地址
11、列表),例如:int var; scanf(%d,scanf函数中的格式字符,scanf函数中的修饰符,scanf函数应用举例,用scanf函数输入数据 。 #include int main() int a,b,x, y; float f; char ch1,ch2,ch3; printf(输入数据:n); scanf(a=%d,b=%d,scanf函数使用说明,“变量地址列表”中的各变量名前必须加上“&”符号。,如果“格式控制字符串”中除了格式声明外还有其它字符,则在输入时在对应位置上应输入与这些字符相同的字符。,例如: scanf(“%d%d”, ,例如: scanf(a=%d,b=%d
12、, 输入时应按照下面的格式进行输入: a=5,b=9,scanf函数使用说明,若scanf函数中有不同类型的数据输入时,要注意数据的输入格式。若输入项是数值型数据,各输入项之间可以使用空格、制表符(Tab)和回车隔开。,例如:scanf(%d%d, 下面的输入格式都是正确的 59 (表示空格,表示回车)59 (中间使用制表符)5 9,例如:scanf(%f%c%c%c, 若输入12.5ABC ,则ch1、ch2和ch3的值分别是“”,“A”和“”,若输入项中包含字符型数据,空格和回车等都作为有效字符。输入时一定要注意,否则得不到正确的结果。,顺序结构程序举例,输入三角形的三条边,编写程序求三角
13、形的面积(保留2位小数)。 #include #include int main() float a,b,c,s,area; printf(请输入三角形的三条边:n); scanf(%f%f%f,基本内容,选择结构,选择结构用于根据条件的成立与否选择下一步要执行的动作,可以从两种或多种候选动作中选择一种执行。C语言中的选择语句可以根据表达式的值选择要执行的分支语句,从而实现流程控制。,C语言中,提供两种选择语句实现流程的控制:if语句单分支选择,也可以通过一系列嵌套的if-else语句实现多分支选择。switch语句多分支选择,其中表达式的值与一组常量比较。,简单if语句,简单if语句的一般形
14、式为: if (表达式) 语句段,例如:if (xy) printf(xy); if语句括号中的表达式一般是关系表达式或逻辑表达式,也可以是其它表达式。,简单if语句举例,通过键盘输入三个整数a、b、c,按从小到大的顺序输出这三个整数。 #include int main() int a,b,c,temp; printf(请输入三个整数:n); scanf(%d%d%d,if-else语句,if-else语句的一般形式为: if (表达式) 语句段 1 else 语句段2,例如:if (xy) printf(xy); else printf(x=y);,if-else语句举例,求两个数值之间的
15、最小值。 #include int a,b; int min1,min2; printf(请输入两个整数值:); scanf(%d%d, ,if 语句的嵌套,在if-else语句中可以执行一条语句,也可以包含任何有效的C语言语句块,当该语句块又是一个if-else语句时,则形成了if-else语句的嵌套。使用嵌套的if-else语句可以实现按照不同条件选择两个以上的分支流程。,if 语句的嵌套举例,从键盘输入一个x的值,编写程序计算下列函数的值。#include int x,y; printf(请输入x的值:); scanf(%d,if 语句的嵌套说明,else总是与if成对出现。可以单独使用
16、if语句,但是不能单独使用else语句。,else总是与它上面最近的未配对的if匹配。,if 语句的嵌套说明,常用的if-else语句嵌套,其嵌套的一般形式是:,if(表达式1) 语句段1else if(表达式2) 语句段2else if(表达式3) 语句段3 else if(表达式n) 语句段nelse 语句段n+1,这种嵌套形式又称作elseif结构。,elseif结构举例,编写程序判定学生成绩,实现从键盘输入一个百分制的成绩,输出相应的等级:优(90score100)、良(80score int score; printf(请输入学生的成绩:); scanf(%d,elseif结构举例,
17、else if(score70) printf(该学生的成绩类别为:及格n); else if(score80) printf(该学生的成绩类别为:中等n); else if(score=1e-6); pi*=4; printf(pi=%fn,pi); return 0;,for语句,C语言提供的for循环语句使用很灵活,既可以用于已知循环次数的情况,也可以用于循环次数不确定而只有循环结束条件的情况,可以代替while和dowhile循环。,for语句的一般形式是: for(表达式1;表达式2;表达式3)语句,for语句执行流程,(1)计算 的值。,(2)计算的值,若为真(非0),则执行循环体
18、,然后转向第(3)步。若为假(0)则转向第(5)步。,(3)执行循环体,(4)计算的值,然后转向第(2)步。,(5)结束循环,执行for循环后的语句。,for语句应用举例,利用for语句求1100之间的和。 #include int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(sum=%dn,sum); return 0;,for语句最容易理解、最常用的形式是: for(循环变量赋初值;循环条件;循环变量增值) 循环体,for语句使用说明,可以将for语句的形式改写成while语句的形式。,for语句中的表达式1、表达式2、表达式3每一个都可以省略,甚至
19、三个表达式都可以同时省略,但是起分隔作用的“;”不能省略。,如果省略表达式1,表示不在for语句中给循环变量赋初值,为了能正常执行循环,应在for语句前给循环变量赋初值。,for(;) printf(%dn,i);等价于: while(1) printf(%dn,i);,例如: fac=1.0; i=1; for(;i=n;i+)fac=fac*i;,例如: for(i=1,fac=1.0;i+) /省略表达式2 fac=fac*i;if(i=n) break; /终止循环 ,例如: for(i=1,fac=1.0;i=n;) fac=fac*i; i+; /此处改变循环变量的值 ,for语句
20、使用说明,如果省略表达式2,即不存在判断循环终止的条件,也就是认为表达式2恒为“真”,此时的循环是“死循环”。若要终止循环,应在循环体中设置终止循环的机制。,如果省略表达式3,即不在此位置进行循环变量的修改,则应在其它位置(如循环体中)设置使循环趋于结束的操作。,如果省略了表达式1和表达式3,只给出表达式2,则表达式1和表达式3的值应在相应的位置进行赋值。,表达式2一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值非0,就执行循环体。,例如: for(sum=0; i=100; i+) sum+=i;再例: for(i=1,fac=1.0 ; i=n; fac*=i, i+
21、);,例如: for(i=0;(ch=getchar()!=n;i+=c);,for语句使用说明,表达式1可以是与循环变量无关的其它表达式;表达式3也可以是与修改循环变量无关的表达式。并且表达式1和表达式3可以是简单表达式,也可以是逗号表达式。,循环嵌套,一个循环语句的循环体内如果包含另一个完整的循环,这种循环之间的层次关系就构成了循环的嵌套。内嵌循环的循环体中还可以再嵌套循环,由此可以构成多层循环。C语言提供的三种循环语句之间可以实现相互嵌套。,编写程序,以三角的形式打印九九乘法表。 #include int main() int i,j; for(i=1;i10;i+) for(j=1;j
22、=i;j+) printf(%d*%d=%dt,j,i,i*j); printf(n); return 0;,循环嵌套举例,循环嵌套,循环嵌套说明,理论上循环嵌套的深度不受限制,但在实际应用中不提倡使用嵌套层次太多的循环结构。,使用嵌套结构时,要注意嵌套不能交叉。,嵌套的内外层循环不能使用同名的循环变量,而并列结构的循环允许使用同名的循环变量。,break和continue语句,C语言提供break和continue语句用于中断正常的控制流。break语句强制从switch语句和循环语句中退出。而continue语句是强制结束本次循环,开始下一次循环。,在循环中break语句通常和if条件语句
23、搭配使用,用于检测当某个条件成立时跳出循环。,而continue语句和if条件语句配合使用,判断是否退出循环的当前迭代。,break和continue语句说明,break语句只能用于switch语句和循环语句 。而continue语句只能用于循环语句,break语句只能用于循环体内,不能用于循环表达式内 。,break语句只能跳出一层循环,即当前的循环。,continue和break语句的区别:break语句是中断所在的整个循环,把控制转移到紧随循环之后的语句,而continue语句并没有使整个循环终止,只是终止了循环的当前迭代。,break语句应用举例,随机产生两个两位数,进行加法测试,由用
24、户回答,直到回答正确为止。#include #include #include int main() int a,b,result,answer; srand(time(0); /利用系统时间产生一个随机数种子 a=rand()%89+10; /产生10到99之间的随机整数 b=rand()%89+10; result=a+b;,break语句应用举例,while(1) scanf(%d,continue语句应用举例,编写程序,接收用户从键盘输入的学生成绩,打印累加的有效成绩。 #include int main() int score,total; total=0; printf(请输入成绩
25、:); while(scanf(%d,循环结构应用举例,穷举法示例:百钱买百鸡问题。迭代法示例:求Fibonacci数列,循环结构应用举例,算经中有一道题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?编程实现。#include int main() int cock,hen,chicken; printf(*百钱买百鸡问题*n ); printf( cockt hent chickenn ); for(cock=1;cock20;cock+) for(hen=1;hen33;hen+) chicken=100-cock-hen; if(5*cock+3*h
26、en+chicken/3.0=100) printf(%4dt%4dt%4dn ,cock,hen,chicken); return 0;,此处要除以实数,循环结构应用举例,求Fibonacci数列的前20项。Fibonacci数列具有下面的性质: #include int main() int i; float f1,f2,f; f1=f2=1; printf(%8.0f%8.0f,f1,f2); for(i=3;i=20;i+) f=f1+f2; printf(%8.0f,f); if(i%4=0) /每行输出4个数 printf(n); f1=f2; f2=f; return 0;,此处完成迭代,基本内容,本章小结,数据的输入与输出:字符的输入函数getchar和输出函数putchar,格式输入函数scanf和格式输出函数printf。,程序设计的三种结构:顺序结构、选择结构和循环结构。,实现选择的语句:if语句(if语句、ifelse语句、if语句的嵌套)、switch语句,实现循环的语句:while语句、dowhile语句和for语句,以及循环嵌套。,利用三种结构解决具体问题。,