1、最简单的C程序的组成,例1.1,main(),int x,y,z;,scanf(“%d,%d,%d”,sum=x+y+z;,printf(“sum=%dn”,sum);,*,C 语言程序设计教程,刘新铭 吉顺如,辜碧容 郑君华,编著,1,目 录,第1章 C语言概述,第2章,数据类型、运算符和表达式,第3章 C,程序中的输入、输出,第4章 C,程序的控制结构,第5章,数,组,第6章,函数,第7章,编译预处理命令,第8章,指,针,第9章,结,构,体,第10章,文,件,第 1 章 C语言概述,3,学习目标,对C语言有一个概括的了解,能够编写包含键盘输入、计算和显示输出等操作的简单C程序。,主要内容
2、C,语言的产生与特点,简单,C,程序的组成,C,语言,应用程序开发的基本步骤,1.1 C语言的产生及特点,C语言是为了编写系统程序而在1968年开始研发的计算机高级语言,C语言表达能力强,使用灵活,程序结构清晰,紧凑,可移植性好,C语言是进一步学习面向对象的程序设计语言 C+和VC 的基础,【例1-1】从键盘输入三个整数,输出它们的和,main()/*计算三个整数的和 */,int x,y,z,sum;,scanf(d,d,d,sumx+y+z;,printf(sumdn,sum);,语句,函数体,主函数名,最简单的C程序的组成,对程序的,注释,1.2 C语言程序的结构及书写格式,一.C程序
3、的结构,main(),int x,y,z,sum;,scanf(%d,%d,%d,sum=x+y+z;,printf(sum=%dn,sum),定义变量x,y,z,和sum,从键盘输入三个整,数赋给变量x,y和z,显示变量,sum的值,计算x+y+z,并将结,果赋给变量sum,程序说明,一般C程序的组成,【例1-2】采用模块结构,改写例1-1的程序。,add(int x,int y,int z),return(x+y+z);,main(),int x,y,z;,printf(Please Input Three Integers:n);,scanf(%d,%d,%d,printf(sum%dn
4、add(x,y,z);,函数add(),主函数,main(),调用函数,add(),函数1,主函数main(),函数2,函数k,注意:,每个C程序必定有一个、而且只能有一个主函数main()。,主函数可以调用其它子函数,而子函数不可以调用主函数,子函数彼此之间也可以相互调用。,C程序的组成,二.C程序的书写格式,1.C程序允许一行写一个或多个语句,,当一个语句分几行书写时,在换行前应加上“”符,然后从下一行的开头继续。,2.习惯上,书写C程序时均使用小写英文字母。,3.,C程序一般都采用缩进格式的书写方法,不同结构层次的语句,从不同的起始位置开始,同一结构层次中的语句,缩进同样个数的字符位置
5、4.,应当在程序中适当地添加一些注释行。,1.3 C程序的编辑、调试和运行,编辑源程序 生成目标程序,经编译,经连,接库,修改源程序,函数,生成exe文件,运行,运行时出错,编译,出错,第1章 结束,第 2 章 数据类型、运算符和表达式,14,学习目标,1.掌握基本数据类型的概念和常量表示方法,掌握变量的定义方法,能够根据实际情况选用适当的数据类型,2.熟练掌握数值表达式的构造方法,能够利用表达式完成数值计算,主要内容,C,数据类型概述,常量和变量,算术运算表达式,赋值表达式,自增、自减表达式,2.1 概 述,C语言支持的数据类型,基本,数据,类型,整型,单精度型,主要,数据,类型,构造,
6、数据,类型,指针,类型,实型,字符型,数组类型,结构体类型,双精度型,基本数据类型说明符,整型:int,long,字符型:char,实型:float,double,long double,2.2 常 量,常量,在程序运行过程中,其值不能被改,变的量。,一.不同数制整型常量的表示,例如:12 :十进制数 12,012:八进制数 12(等于十进制数10,用前导符0表示八进制数,常量,),0 x12:十六进制数 12(等于十进制数 18,用前导符0X或0 x表示十六进制数,常量,),二.字符常量的表示,用括起来的可显示字符,如,A,、,$,、,3,等,(,转义字符除外,),2.,用八进制数表示其,A
7、SC,代码的字符,如,101,表示西文字符,A,、,63,表示数字字符,3,。,3.,用十六进制数表示其,ASC,代码的字符,如,:x41,表示西文字符,A,、,x2A,表示字符*。,4.,用,表示字符,,”,表示字符”,,表示字符,。,5.,用双引号括起来的字符序列表示字符串常量,其中最后一个字符是字符串结束符,0,,不显式地表示出来。如,:“English”,。,【例2-1】常量的例子,main(),float r;,printf(Please Input Radius:n);,scanf(%f,printf(The Circumference of Cirle:%fn,2*3.14159
8、26*r);,定义浮点型,变量r,人机对话,通知用户,输入半径的值,从键盘输入半径的值,,并将值赋给变量r,显示结果,常量2,常量,3.1415926,三.符号常量,可以用#define命令定义符号常量,在程序的执行过程中不允许改变符号常量的值。,【例2-2】说明符号常量的例子,#define PRICE 30,main(),int num,total;,num=10;,total=num*PRICE;,printf(,total=%d,total);,通过#include定义符号常,量PRICE为30,定义二个整型变量,num和total,使变量num的值为10,执行运算1030,并把运算的
9、结果赋,予变量total,显示结果,2.3 变量的定义和初始化,变量:在程序运行时,其值可变的量被称为变量,分为整型变量、实型变量和字符型变量,一.C语言中的标识符,C语言把用户给常量、变量、函数、标号和其它,对象所起的名字统称为标识符。,用户定义的标识符须遵循如下规则:,标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,标识符的长度不超过32个字符。同时,C语言的关键字和库函数名不能作为标识符。,例如,下面的字符序列均为合法的C语言标识符:,a,b,word,_file,file2,F_name,f_name,注意:,C编译程序字母区分大小写,所以上述F_name和
10、f_name是二个不同的标识符。,下面的字符序列为不合法的C语言标识符:,2L 违反了,标识符第一个字符必须为字母,或下划线,的规定。,a*违反了,标识符只能由字母、数字和下,划线三种字符组成,的规定。,int 违反了,C语言的关键字和库函数名不,能作为标识符,的规定。,二.变量分类,1.整型变量分类,有符号整型说明符,无符号整型说明符,整,型,int,signed,signed int,unsigned,unsignedint,长,整,型,long,longint,signedlong,signedlong int,unsignedlong,unsignedlong int,有符号整型,无
11、符号整型,占字节数,整,型,int,-32768 32767,unsigned,0 65535,2,字,节,长,整,型,long,-2,31,(2,31,-1),unsignedlong,04,294,967,295,4,字,节,整型变量的值域,2.浮点型变量的分类及其值域,Long double,取值,(绝对值),范围,占字节数,10,-4931,10,4932,单精度型,双精度型,10,-37,10,38,4,float,double,10,-307,10,308,浮点型,说明符,8,16,3.字符型变量及其值域,说明符,取值范围,(字符的ASC码值),占字节数,char,0 255,1,
12、在设计程序时,应当根据数据本身的特,点和变化范围正确选择变量类型。,三.变量的定义和初始化,变量的定义格式:,类型说明符 变量名表,;,int、unsigned、,long、float、,double、char等,变量名只能由字母,、数字和下划线三种,字符组成,且第一,个字符必须为字母,或下划线,。,例如,语句:,int,a1,a2,age;,float,x,y,z;,char,ch;,分别定义了整型变量a1,a2,age,浮点型变量,x,y,z和字符型变量ch。,变量的初始化:,在定义变量的同时对变量预,先设置初值。,例如,执行语句:,int num=20;,float pi=3.14;,c
13、har c1,c2=M ;,变量num、pi、c2的初值分别为20、3.14和 字符M。,四.各类数值型数据间的混合运算,高 double float,long,unsigned,低 int char,当各种,不同类型的数据混合运算时,,,其运算结果的,类型由上图所示的类型转换原则确定,。,【例2-3】设程序中定义变量:,int i;float f;double d;,执行运算:i+(f*d)-(f+i)(这里的*表示乘法),下图给出了在运算过程中所发生的数据类型的转换,i+(f*d)-(f+i),double double double,double double,double,double
14、 double,double,2.4 算术运算符和算术运算表达式,一.算术,运算符,算术,运算符,包括:,+(加),-(减),*(乘),/(除),%(求余),操作符%只作用于整数,x%y 的值就是 x除以 y,的余数。,操作符/的两种含义:,整数除法(整除),当被除数和除数都是整型数据时,“”运算的结果为整型。例如:5/2的值为2(而不是2.5),实数除法,当被除数和除数中至少有一个是实数型数据时,“”运算的结果为实数型。,例如:5.0/2的值为2.5,二.算术运算表达式,用算术运算符和括号将运算对象连接起来、,并符合C语言语法规则的式子,称为算术运算表,达式或算术表达式。,例如:设r、x、y
15、是已经定义的数值型变量,则:3.14*r*r、x+2*y-3/z、(x-y)*(x-y/2),均是合法的算术运算表达式,单独的r、x、y也,是合法的算术运算表达式。实际上,单独的常,量或变量是最简单的算术运算表达式。,注意:,算术,运算,表达式,中的分数线须用/表示 例如:2+3i kj 表示为C语言表达式就是:(2+3*i)/(k*j)或 (2+3*i)/k/j,C程序中,称表达式的运算结果为,表达式的值,。,C语言规定,在表达式求值时,须按运算符优先级的,高低次序执行。,对算术运算而言,必须遵循先括号,内后括号外,先乘、除及求余运算,后加减的运算,优先级规则。,C语言规定了运算符二种不同的
16、结合方向:,左结合:,当参于运算的数据两侧的运算符优先级,相同时,运算顺序为自左至右。,C,语言规定,算术运算符遵循左结合的规则,。,例如,计算算术运算表达式,a+b-c,时,,运算符“,+”,和“,”,具有相同的优先级,所以先执行,a+b,,,其结果再和,c,相减。,右结合:,当参于运算的数据两侧的运算符优先级,相同时,运算顺序为自右向左。,C,语言提供的运算符中有少量运算符遵循右结合的,规则。,教材的附录部分列出了,C,语言中所有运算符以及它,们的优先级和结合性。,2.5 赋值运算符与赋值运算表达式,一.赋值运算符,赋值符号“=”就是赋值运算符,它的作用是将一,个数据赋给一个变量。,例如:
17、执行程序段 int a;,a=3;,a=a-5;,当执行语句“a=3;”就完成一次赋值运算,把赋,值运算符右边的值3赋给赋值运算符左边的变量a,,赋值后,a的值为3。再执行语句“a=a-5;”,赋值,运算符右边的表达式a-5的运算结果为-2,将-2赋,给a。,最后,变量a的值变为-2。,复合的赋值运算符,复合的赋值运算符的格式:,算术运算符=,所以,+=、-=、*=、/=、%=都是复合的赋值运算符。,二.赋值运算表达式,将一个变量通过赋值运算符或复合的赋值运算符与,一个表达式连接而成的式子称为赋值运算表达式。,赋值运算表达式的格式为:,变量名=表达式 或,变量名 复合的赋值运算符 表达式,例如
18、x=1.414,m1=E,s=3.14159*r*r,或 a+=5,x/=a+1,上述各例都是合法的赋值运算表达式。,赋值运算表达式的作用是把赋值运算符右边表达式,的值赋给赋值运算符左边的变量。,当算术运算符和赋,值运算符同时出现在一个表达式中时,算术运算符的,优先级高于赋值运算符。,C语言允许赋值运算表达式中的表达式部分还是一,个赋值表达式,这样就构成了多重赋值。多重赋值,表达式中,赋值运算符遵循右结合的法则,即:,自右向左的运算顺序。,例如:多重赋值语句 a=b=c=x+8;,在执行时等价于依次执行三个语句:,c=x+8;,b=c;,a=b;,将一个变量通过复合的赋值运算符与一个表达式连
19、接而成的式子同样称为赋值运算表达式。,例如:a+=5,x/=a+1,下面的例子说明了复合的赋值运算符的运算规则。,表达式 a+=5 等价于 a=a+5,表达式 a*=4-b 等价于 a=a*(4-b),表达式 a%=b-1 等价于 a=a%(b-1),注意:,复合的赋值运算符右边的表达式是作为一个整体,参与其左边算术运算符所规定的运算的。,【例2-4】赋值运算表达式举例,1)y=3*(x-1);/*将3*(x-1)的结果,赋值给变量y。*/,2)a=(b=4)+(c=6);/*这里的赋值运算表,达式(b=4)、(c=6)参于算术运算,C,言规定,将赋值运算符右边表达式的值,作为赋值运算表达式
20、的值,。所以,赋,值运算表达式(b=4)的值为4,(c=6),的值为6,最后将它们的和赋值给变量a,,由于算术运算符的优先级高于赋值运,算符,所以表达式中的括号是必须的。,*/,3)a+=a*=a+2;/*这里的语句等价于:,a=a*(a+2);,a=a+a;*/,三.字符型与整型的关系,字符型数据的值在内存表现为它们的,ASC,代码值(,0-255,之间的一个整数,),2.,字符常量以其,ASC,代码值参与整数运算。,如:,A+2,的值为,67,字符A的ASC码值,为65,【例2-5】字符型变量参与算术运算,main(),int a;,char i;,a=B-1;,i=a+10;,print
21、f(a:%d,a:%cn,a,a);,printf(i:%d,i:%cn,i,i);,以字符格式输,出变量a的值,结果为字符A,以整型格式输,出变量a的值,结果为67,【,例2-6,】,大小写字母的转换,main(),char c1=a,c2=B;,c1=c1-32;,c2=c2+32;,printf(c1:%c,c2%c,c1,c2);,大小写英文字母,的ASC码值相差,32,2.6 自增、自减运算符+、-,功能:(设i为整型变量),+i:在使用i之前,先执行i+=1,使i的值加1。,-i:在使用i之前,先执行i-=1,使i的值减1。,i+:在使用i之后,执行i+=1,使i的值加1。,i-:
22、在使用i之后,执行i-=1,使i的值减1。,上述“使用”指的是i加1或减1前后的其他操作,如赋值、运算、显示等。,若不存在其它操作,则i+与+i一样,执行i+=1,使i的值加1;i-与-i一样,执行i-=1,使i的值减1。,【例2-7】自加、自减运算符的应用。,main(),int i=10,j;,float pi=3.14,pa;,j=i+;,pa=+pi;,printf(j=%d,pa=%fn,j,pa);,printf(i=%d,pi=%fn,i+,-pi);,先将i的值赋给变量j,再执行i+=1;,先执行pi+=1;,再将pi的值赋给变量pa,先将i的值输出,再执行i+=1;,先执行p
23、i-=1;,再将pi的值输出,2.7 位运算符,位运算以字节(byte)中的每一个二进位(bit)为运,算对象,最终的运算结果是整型数据。,位运算分为按位逻辑运算和移位运算。,一.按位逻辑运算符,按位逻辑运算符包括:,按位逻辑与运算符:“&”,按位逻辑或运算符:“|”,按位逻辑非运算符:“”,按位逻辑异或运算符:“”,运算法则,设用x、y表示字节中的二进位,取值为0或1。按位,逻辑运算符的运算法则为,:,按位逻辑与运算:,x&y的结果为1,当且仅当x、y均为1,否则x&y的,结果为0。,按位逻辑或运算:,x|y的结果为0,当且仅当x、y均为0,否则x|y的,结果为1。,按位逻辑异或运算:,xy
24、的结果为1,当且仅当x、y的值不相同,否则,xy的结果为0。,按位逻辑非运算:,当x=1时,x=0,而当x=0时,x=1。,位运算表达式的格式:,整型变量名 运算符(&、|、)整型变量名,或,整型变量名,【例2-8】位运算符的应用,设有:int a=55,b=36;计算:a&b、a|b、ab及a的结果。,假定每个整型变量占二个字节(16bit),则在内存中的二进,制数a、b为:,a:00000000 00110111 b:00000000 00100100,按上述按位运算的法则,列出下述算式:,a&b:a|b:,00000000 00110111 00000000 00110111,&0000
25、0000 00100100|00000000 00100100,00000000 00100100 00000000 00110111,ab:,00000000 00110111 00000000 00100100 a:00000000 00110111,00000000 00100100 a:11111111 11001000,00000000 00010011,结果:a&b=24,a|b=37,ab=13,a=ffc8,(用十六进制表示),二.移位运算符,C语言提供的移位运算实现将整数数据按二,进位右移或左移的功能。,向右移位运算符:,“”,向左移位运算符:,“2、(a-b)2:00000
26、000 010110,左边补0,结果:00000000 00010110,a-b:00000000 00010011,(a-b),小于比较运算符:,=,小于等于比较运算符:,、=、a+b、a!=2、-5=a,由于,关系运算符优先于赋值运算符,,所以,原式等价于,x=(b a),由题设可知,ba,成立,结果为,1,故最后执行赋值运算,x=1,。,(2)a!=b=c,由于,关系运算符,!=,的运算优先级低于关系运算符,=,所以原式等价于,a!=(b=c),由题设可知,b=c,不成立,结果为,0,原式可化为,a!=0,由题设可知,a!=0,成立,结果为,1,。,(3)(a b)(b b 不成立,结果
27、为0,b 1,其结果为0。,(4)f=a b c,由于同优先级的关系运算符遵循自左至右的结合方向,,故原式等价于:,f=(a b)c),由题设可知,a b的结果为1,(a b)、=、b)|(ca),由题设可知,原式等于 0|1,结果为1。,(2)(!ca)|(ba),由题设可知,原式等于(!53)|(43),由于逻辑非运算的优先级高于关系运算符,而!5,的值为 0,故原式又等于(03)|(4=1&x5&x!=3;,2.x是3的倍数或5的倍数,可用逻辑表达式表示为:,x%3=0|x%5=0;,4.5 选择结构,在许多场合,需要根据不同的情况执行不同的语句。称这种程序结构为选择结构。C语言提供的条
28、件语句和开关语句可用于实现选择结构程序设计。,一.if语句和ifelse语句,if语句,if语句的格式,:,if(表达式),语句,值为0,值为非0,表达式,语句,执行时,首先计算表达式的值,若其值不为0,(表示真),则执行语句部分,否则,跳过语句,部分,执行其后面的语句,【例4-7】从键盘输入实数a,输出a的绝对值,main(),float a;,printf(Enter a floatn);,scanf(%f,if(a0),a=-a;,printf(a=%fn,a);,若a=100)&(ab),printf(MAX=%d,MIN=%d,n,a,b);,else,printf(MAX=%d,M
29、IN=%d,n,b,a);,ab成立,执行,这一语句,ab不成立,执,行这一语句,例4.10 输入a,b,c,利用求根公式求一元二次方程,ax,2,+bx+c=0 的根。,流程图:,开始,输入a,b,c,计算b*b-4*a*c,并赋值给变量delta,delta=0?,计算:sqrt(delta),并将结果赋给变量delta,输出实根,结 束,计算:sqrt(-delta),并将结果赋给变量delta,输出复根,开始,输入a,b,c,计算b*b-4*a*c,并赋值给变量delta,delt=0?,Yes,No,计算:sqrt(delta),并将结果赋给变量,delta,输出实根,计算:sqrt
30、delta),并将结果赋给变量,delta,输出复根,结束,#include,main(),float a,b,c;,float x1,x2,delta;,printf(Please Input,a,b,c:);,scanf(%f,%f,%f,delta=b*b-4*a*c;,if(delta=0),delta=sqrt(delta);,printf(x1=%f,(-b+,delta)/(2*a);,printf(x2=%fn,(-b-,delta)/(2*a);,else,delta=sqrt(-delta);,printf(x1=%f+%fin,-b/(2*a),delta/(2*a)
31、printf(x1=%f-%fin,-b/(2*a),delta/(2*a);,程序:,if与else配对,,用以找出a、b中,的大者,【例4-11】编程求整数a、b、c中的最大者,a、b、c由键盘,输入。,main(),int a,b,c,max;,print(Please enter three integers:n);,scanf(%d,%d,%d,if(ab),max=a;,else,max=b;,if(max0?10:-10;,等价于,:,条件语句:,if(x0),y10;,else,y-10;,只有在if语句内嵌的语句为,赋值语句、且两个分支都给,同一个变量赋值时,才能用,条件
32、表达式代替if语句,【例4-12】从键盘输入二个整数,输出其中的较大者。,main(),int a,b;,printf(Please input two integers:n);,scanf(%d,%d,printf(MAX=%dn,(ab)?a:b);,使用条件运算符,使程序变得简洁,二.条件语句的嵌套,C语言允许在条件语句中又包含另一个条件语,句,称之为条件语句的嵌套。,在if语句中又嵌套,了另一个if语句,【例4-13】从键盘上输入一个字符,判断它是英文字母、,数字或其它字符。,输入的是数字?,输入的是字母?,显示:是数字,显示:是字母,显示:是其它字符,结 束,yes,no,yes,n
33、o,流程简图:,程序:,#include,main(),char ch;,printf(Enter a character:);,chgetchar();,if(ch=0&ch=A&ch=a&c,=0,?,其余部分请参阅图4-6中的相应部分,yes,no,yes,no,流程图:,“if”和“else”的正确配对,复合语句和条件语句的嵌套结构为解决一些较为复杂的,编程问题提供了必要的条件。但同时也使程序的结构变得,复杂,不易读懂。特别是在程序中有多个 和ifelse,的情况。,在阅读程序之前,必须能正确地将“”和“”配对、将“if”,和“else”配对,使程序的结构变得清晰和有条理。,“if”和
34、else”配对应遵循下述规律:,自上而下,“else”总是和上面离它最近的“if”配对。而且,,每一个“else”只能和一个“if”配对。由于单独的“if”也是,条件语句,所以,允许无“else”配对的“if”单独存在。,同理,“”和“”配对应遵循下述规律:,自上而下,“”总是和上面离它最近的“”配对。,【例4-15】如果变量x的值是-15,变量y的值是-10,则执,行下面的程序段后,屏幕上显示的内容是什么?,if(x0),if(x10),printf(A);,else,printf(B);,else,if(y-20),printf(C);,else,printf(D);,printf(E)
35、为了看清程序结构,必须先将if和else正确配对。,if(x0),if(x10),printf(A);,else,printf(B);,else,if(y-20),printf(C);,else,printf(D);,printf(E);,if(x0),if(x10),printf(A);,else,printf(B);,else,if(y-20),printf(C);,else,printf(D);,printf(E);,将if和else正确配对:,该程序段采用了缩进格式,,这种格式更容易反映出程,序结构。,显示:E,x0,?,x10?,显示:,A,显示:B,y-20,?,显示:C,显示
36、D,yes,yes,no,no,yes,no,no,yes,流程图:,switch 语句的格式:,switch(整型表达式),case 整型常量表达式1:语句序列1 break;case 整型常量表达式2:语句序列2 break;,case 整型常量表达式k:语句序列k break;default:语句序列k+1 ,三.开关语句,开关语句用于在程序中实现多路选择。,Yes,语句序列1,语句序列2,有break?,有break?,语句序列k-1,有break?,语句序列k,语句序列k+1,开关语句之后的语句,有break?,开关:,整型表达式,Yes,Yes,Yes,no,no,no,no,S
37、witch语句的执行流程:,说明:,格式中的break语句不是必须的,应根据需要而 定。,格式中的default语句不是必须的,在缺省的情 况下,相当于语句序列k+1是空语句。,格式中的 是必须的。,(1)switch语句与if语句的不同之处在于:,switch语句只能对整型(含字符型)表达式的值是否等于,给定的值进行判断,而if语句可以用于判断各种表达式。,(2)switch语句中,case后面只能是常量。,(3)同一个switch语句中,任意两个case后面的常量值不能,相同。,注意:,【例4-16】编写一个四则运算计算器程序,可以实现输入二,个数和一个四则运算符,输出运算结果的功能。,m
38、ain(),float operandl,operand2,result;,char operator;,scanf(%f,%c,%f,switch(operator),case+:,resultoperandl+operand2;,break;,case-:,result=operandl一operand2;,break;,case*:,result=operandl*operand2;,break;,case/:,resultoperandloperand2;,break;,default:,printf(Illegal operator,error!n);,printf(result=%
39、fn,result);,由operator的值,决定执行哪一个,case语句,执行break语句后,就结束switch语句,【例4-17】用 switch 语句实现从键盘输入成绩,转换成相应的,等级后输出(90-100为A,80-89为B,70-79为C,60-69为D,59及以下为E)。,main(),int score;,printf(Please Input A Score:);,scanf(%d,printf(n);,switch(score/10),case 10:,case 9:printf(%cn,A);break;,case 8:printf(%cn,B);break;,cas
40、e 7:printf(%cn,C);break;,case 6:printf(%cn,D);break;,default:printf(%cn,E);,用以将输入的成绩,按等级与10以内的,某一个非负整数,相对应,case10、case9,执行相同的语句,4.6 循环结构,在程序中,若干个在一定条件下反复执行的语句,就构成了循环体,循环体连同对循环的控制就组成,了循环结构。循环结构也是最常见的程序结构。几,乎所有实用的程序都包含循环结构。,在C程序中常用的循环语句包括:,while语句,do while语句,for语句,一.while语句,while语句的格式:,while(表达式),语句,语
41、 句,表达式,值为非0,值为0,执行流程:,循环体,循环控制,称控制,循环的变量为,循环变量,【例4-18】编程求1+2+3+4+n(n由键盘输入),,并输出结果。,根据例4-1给出的算法和流程图,设计如下的程序:,main(),int n,i=1,sum=0;,printf(Please input n:n);,scanf(%d,printf(1+2+%d=%d,n,sum);,流程图,while(i=0.00001),printf(“SUM=%f”,sum);,循环的次数,预先不知,sum+=1.0/(i-1)*i);,i+;,循环体是复,合语句,二.do-while语句,do-while
42、语句的格式:,do,语句,while(表达式);,语句,表达式,值为非0,值为0,执行流程:,循环体,循环控制,【例4-20】用do while 语句实现【例4-18】。,main(),int n,i=1,sum=0;,printf(Please input n:);,scanf(%d,do,sum+=i+;,while(i=n);,printf(1+2+%d=%d n,n,sum);,循环体至少被,执行一次,【例4-21】编程计算n!,n由键盘输入。,开 始,1,fac,2,i,faci,fac,i+1,i,从键盘输入n,i n?,输出 fac,结 束,流程图:,main(),int n,i
43、2;,long int fac=1;,printf(Please input n:);,scanf(%d,do,fac*=i+;,while(i=n);,printf(%d!=%ldn,n,fac);,程序:,说明:表达式1用于给循环变量赋初值,表达式2给出执行,循环体的条件,表达式3用于修改循环变量。,三.for语句,for语句的格式:,for(表达式1;表达式2;表达式3),语句(循环体),表达式1,表达式2,语句,表达式3,值为非0,值为0,执行流程:,【例4-22】编程计算1-3+5-7+-99,分析:,原题就是计算1+(-3)+5+(-7)+(-99),这还是一个连,加问题。主要应
44、解决加数符号的交叉变化。,在程序中用变,量j表示符号,以1表示正号、1表示负号。,main(),int i,j,sum=0;,j=1;,for(i=1;i=99;i+=2),sum+=i*j;,j*=-1;,printf(1-3+5-7+-99=%dn,sum);,【例4-23】编程求1到100以内所有能被3整除但不能被7整除,的整数的和。,分析:,本例还是一个连加问题,只是要求加数能被3整除且,不能被7整除。,main(),int i,sum=0;,for(i=1;i=100;i+),if(i%3=0)&(i%7!=0),sum+=i;,printf(SUM=%dn,sum);,C语言允许f
45、or语句一般格式中的表达式1,表达式2,和表达式3空缺,但它们所具有的功能应当在适当的,地方由另外的语句来实现。,例4-23-1与例4-23程序的功能是一样的。,【例4-23-1】,main(),int i=1,sum=0;,for(;i=100;i+),if(i%3=0)&(i%7!=0),sum+=i;,printf(SUM=%dn,sum);,对循环变量i,赋初值,省却了对循环,变量i赋初值的,表达式1,例4-23-2与例4-23程序的功能也是一样的。,【例4-23-2】,main(),int i=1,sum=0;,for(;i=100;),if(i%3=0)&(i%7!=0),sum+
46、i;,i+;,printf(SUM=%dn,sum);,省却了修改循环,变量,在这里修改,循环变量,四.循环的嵌套,循环的嵌套是指一个循环体内又包含另一个完整,的循环结构。,例如:,(1)while()(2)while(),while()do,while();,外循环,内循环,再如:,(3)do (4)for(),for(),while(),while();,外循环,内循环,注意:,在循环嵌套时,外循环必须完全包含内循环。,【例4-24】编程输出如下由“*”组成的三角形。,*,*,*,*,*,外循环控制,输出5行*字符,内循环控制一行,输出2*i-1个*字符,输出一行*字符,后换行,main
47、),int i,j;,for(i=1;i=5;i+),for(j=1;j100),break;,printf(SUM=%dn,sum);,若条件满足,,则结束本次循环,永真条件,用for语句来实现【例4-26】。,【例4-26-1】,main(),int n,sum=0;,for(;),printf(Please input an integer:n);,scanf(%d,sum+=n;,if(sum100),break;,printf(SUM=%dn,sum);,省却了对循环,条件的判断,用break语句,控制结束循环,第4章 结束,第5章数,组,144,学习目标,熟练掌握一维数组、二维数
48、组、字符数组的定义、初始化。,熟练掌握数组元素的引用方法。,3.,熟练掌握,C,程序处理字符串的常用方法。,主要内容,一维数组,二维数组,字符数组和字符串,5.l 一维数组的定义及应用,一.一维数组的定义,n 次多项式通常被表示为:,f(x)=a,n,x,n,+a,n-1,x,n-1,+a,n-2,x,n-2,+a,2,x,2,+,a,1,x+a,0,各项系数为:a,n,,a,n-1,,a,n-2,,a,2,,a,1,,a,0,它们有下列特点:,同名,a,同类型,实数类型,以下标 0,1,2,n-1,n 区别各元素,a,n,、a,n-1,、a,n-2、,、a,2,、a,1,、a,0,在C语言中
49、把具有一定顺序关系的同名、同类型变量的集,合称为数组,称元素的共名a为数组名,将各元素记为:a0,a1,a2,an-1,an。根据元素下标的个数将数,组分为 一维数组、二维数组、。故又称数组元素为下标,变量。,一维数组的定义:,数据类型 数组名元素个数;,例如:int data4;,定义了一个有4个元素的一维数组data,元素类型为int型;,又如:char c10;,定义了一个有4个元素的一维数组c,元素类型为char型,注意:,在数组定义中,方括号中的元素个数只能是整数常量(包括符号常量);,2.,数组元素的下标从,0,开始;,3.,数组名的命名规则与变量名相同;,4.,数组在内存中按其
50、下标递增的顺序连续存储各元素的值,数组名表示第一个变量的存储地址;,5.,参加数据处理的只能是数组中的元素变量,数组整体不能参加数据处理,二.一维数组的初始化,一维数组的初始化就是在定义数组时对所有的数组元素赋初值。,例如:定义 int data4=3,0,5,0;,则等号右边花括号中的数值3,0,5,0依次被赋予data0,data1,data2及date3作为初值,。,设数组data从地址为2000H的内存单元开始存放,其在内存中,的存储情况如下图所示:,data0:2000H,0 3,data1:2002H 0 0,data2:2004H 0 5,data3:2006H 0 0,此外,在






