C语言程序设计教程(电子教案)ppt课件_第1页
C语言程序设计教程(电子教案)ppt课件_第2页
C语言程序设计教程(电子教案)ppt课件_第3页
C语言程序设计教程(电子教案)ppt课件_第4页
C语言程序设计教程(电子教案)ppt课件_第5页
已阅读5页,还剩312页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选,1,C语言程序设计教程,目录,第1章C语言概述第2章数据类型、运算符和表达式第3章C程序中的输入、输出第4章C程序的控制结构第5章数组第6章函数第7章编译预处理命令第8章指针第9章结构体第10章文件,精选,3,第1章C语言概述,学习目标,对C语言有一个概括的了解,能够编写包含键盘输入、计算和显示输出等操作的简单C程序。,主要内容,C语言的产生与特点简单C程序的组成C语言应用程序开发的基本步骤,1.1C语言的产生及特点,C语言是为了编写系统程序而在1968年开始研发的计算机高级语言C语言表达能力强,使用灵活,程序结构清晰,紧凑,可移植性好C语言是进一步学习面向对象的程序设计语言C+和VC的

2、基础,主函数名,最简单的C程序的组成,对程序的注释,1.2C语言程序的结构及书写格式,一.C程序的结构,main()intx,y,z,sum;scanf(%d,%d,%d,printf(sum=%dn,sum),定义变量x,y,z和sum,从键盘输入三个整数赋给变量x,y和z,显示变量sum的值,计算x+y+z,并将结果赋给变量sum,程序说明,一般C程序的组成,【例1-2】采用模块结构,改写例1-1的程序。add(intx,inty,intz)return(x+y+z);main()intx,y,z;printf(PleaseInputThreeIntegers:n);scanf(%d,%d

3、,%d,注意:每个C程序必定有一个、而且只能有一个主函数main()。,主函数可以调用其它子函数,而子函数不可以调用主函数,子函数彼此之间也可以相互调用。,C程序的组成,二.C程序的书写格式,1.C程序允许一行写一个或多个语句,当一个语句分几行书写时,在换行前应加上“”符,然后从下一行的开头继续。2.习惯上,书写C程序时均使用小写英文字母。3.C程序一般都采用缩进格式的书写方法,不同结构层次的语句,从不同的起始位置开始,同一结构层次中的语句,缩进同样个数的字符位置。4.应当在程序中适当地添加一些注释行。,1.3C程序的编辑、调试和运行,编辑源程序生成目标程序经编译经连接库修改源程序函数生成ex

4、e文件运行运行时出错,第1章结束,精选,14,第2章数据类型、运算符和表达式,学习目标,1.掌握基本数据类型的概念和常量表示方法,掌握变量的定义方法,能够根据实际情况选用适当的数据类型2.熟练掌握数值表达式的构造方法,能够利用表达式完成数值计算,主要内容,C数据类型概述常量和变量算术运算表达式赋值表达式自增、自减表达式,2.1概述,C语言支持的数据类型,基本数据类型说明符,整型:intlong字符型:char实型:floatdoublelongdouble,2.2常量,常量在程序运行过程中,其值不能被改变的量。,一.不同数制整型常量的表示例如:12:十进制数12012:八进制数12(等于十进制

5、数10,用前导符0表示八进制数常量)0 x12:十六进制数12(等于十进制数18,用前导符0X或0 x表示十六进制数常量),二.字符常量的表示用括起来的可显示字符,如A、$、3等(转义字符除外)2.用八进制数表示其ASC代码的字符,如101表示西文字符A、63表示数字字符3。3.用十六进制数表示其ASC代码的字符,如:x41表示西文字符A、x2A表示字符*。4.用表示字符,”表示字符”,表示字符。5.用双引号括起来的字符序列表示字符串常量,其中最后一个字符是字符串结束符0,不显式地表示出来。如:“English”。,【例2-1】常量的例子main()floatr;printf(PleaseIn

6、putRadius:n);scanf(%f,定义浮点型变量r,人机对话,通知用户输入半径的值,从键盘输入半径的值,并将值赋给变量r,显示结果,常量2,常量3.1415926,三.符号常量,可以用#define命令定义符号常量,在程序的执行过程中不允许改变符号常量的值。,【例2-2】说明符号常量的例子,#definePRICE30main()intnum,total;num=10;total=num*PRICE;printf(total=%d,total);,通过#include定义符号常量PRICE为30,定义二个整型变量num和total,使变量num的值为10,执行运算1030并把运算的结

7、果赋予变量total,显示结果,2.3变量的定义和初始化,变量:在程序运行时,其值可变的量被称为变量,分为整型变量、实型变量和字符型变量,一.C语言中的标识符,C语言把用户给常量、变量、函数、标号和其它对象所起的名字统称为标识符。用户定义的标识符须遵循如下规则:标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,标识符的长度不超过32个字符。同时,C语言的关键字和库函数名不能作为标识符。,例如,下面的字符序列均为合法的C语言标识符:a,b,word,_file,file2,F_name,f_name注意:C编译程序字母区分大小写,所以上述F_name和f_name是二个

8、不同的标识符。下面的字符序列为不合法的C语言标识符:2L违反了标识符第一个字符必须为字母或下划线的规定。a*违反了标识符只能由字母、数字和下划线三种字符组成的规定。int违反了C语言的关键字和库函数名不能作为标识符的规定。,二.变量分类1.整型变量分类,整型变量的值域,2.浮点型变量的分类及其值域,Longdouble,取值(绝对值)范围占字节数,3.字符型变量及其值域,在设计程序时,应当根据数据本身的特点和变化范围正确选择变量类型。,三.变量的定义和初始化,变量的定义格式:类型说明符变量名表;,int、unsigned、long、float、double、char等,变量名只能由字母、数字和

9、下划线三种字符组成,且第一个字符必须为字母或下划线。,例如,语句:inta1,a2,age;floatx,y,z;charch;分别定义了整型变量a1,a2,age,浮点型变量x,y,z和字符型变量ch。,变量的初始化:在定义变量的同时对变量预先设置初值。例如,执行语句:intnum=20;floatpi=3.14;charc1,c2=M;变量num、pi、c2的初值分别为20、3.14和字符M。,四.各类数值型数据间的混合运算,高doublefloatlongunsigned低intchar,当各种不同类型的数据混合运算时,其运算结果的类型由上图所示的类型转换原则确定。,【例2-3】设程序中

10、定义变量:inti;floatf;doubled;,执行运算:i+(f*d)-(f+i)(这里的*表示乘法)下图给出了在运算过程中所发生的数据类型的转换i+(f*d)-(f+i)doubledoubledoubledoubledoubledoubledoubledoubledouble,2.4算术运算符和算术运算表达式,一.算术运算符算术运算符包括:+(加)-(减)*(乘)/(除)%(求余),操作符%只作用于整数x%y的值就是x除以y的余数。,操作符/的两种含义:整数除法(整除)当被除数和除数都是整型数据时,“”运算的结果为整型。例如:5/2的值为2(而不是2.5)实数除法当被除数和除数中至少

11、有一个是实数型数据时,“”运算的结果为实数型。例如:5.0/2的值为2.5,二.算术运算表达式,用算术运算符和括号将运算对象连接起来、并符合C语言语法规则的式子,称为算术运算表达式或算术表达式。例如:设r、x、y是已经定义的数值型变量,则:3.14*r*r、x+2*y-3/z、(x-y)*(x-y/2)均是合法的算术运算表达式,单独的r、x、y也是合法的算术运算表达式。实际上,单独的常量或变量是最简单的算术运算表达式。,注意:算术运算表达式中的分数线须用/表示例如:2+3ikj表示为C语言表达式就是:(2+3*i)/(k*j)或(2+3*i)/k/j,C程序中,称表达式的运算结果为表达式的值。

12、C语言规定,在表达式求值时,须按运算符优先级的高低次序执行。对算术运算而言,必须遵循先括号内后括号外,先乘、除及求余运算,后加减的运算优先级规则。,C语言规定了运算符二种不同的结合方向:左结合:当参于运算的数据两侧的运算符优先级相同时,运算顺序为自左至右。C语言规定算术运算符遵循左结合的规则。例如,计算算术运算表达式a+b-c时,运算符“+”和“”具有相同的优先级,所以先执行a+b,其结果再和c相减。,右结合:当参于运算的数据两侧的运算符优先级相同时,运算顺序为自右向左。C语言提供的运算符中有少量运算符遵循右结合的规则。教材的附录部分列出了C语言中所有运算符以及它们的优先级和结合性。,2.5赋

13、值运算符与赋值运算表达式,一.赋值运算符赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。例如:执行程序段inta;a=3;a=a-5;当执行语句“a=3;”就完成一次赋值运算,把赋值运算符右边的值3赋给赋值运算符左边的变量a,赋值后,a的值为3。再执行语句“a=a-5;”,赋值运算符右边的表达式a-5的运算结果为-2,将-2赋给a。最后,变量a的值变为-2。,复合的赋值运算符复合的赋值运算符的格式:算术运算符=所以,+=、-=、*=、/=、%=都是复合的赋值运算符。,二.赋值运算表达式将一个变量通过赋值运算符或复合的赋值运算符与一个表达式连接而成的式子称为赋值运算表达式。赋值运

14、算表达式的格式为:变量名=表达式或变量名复合的赋值运算符表达式,例如: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;,将一个变

15、量通过复合的赋值运算符与一个表达式连接而成的式子同样称为赋值运算表达式。例如: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言规定,将赋值运算符右边表达式的值作为赋值运算表达式的值。所以,

16、赋值运算表达式(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()inta;chari;a=B-1;i=a+10;printf(a:%d,a:%cn,a,a);printf(i:%d,i:%cn,i

17、,i);,以字符格式输出变量a的值结果为字符A,以整型格式输出变量a的值结果为67,【例2-6】大小写字母的转换,main()charc1=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-:在使用i之后,执行i-=1,使i的值减1。上述“使用”指的是i加1或减1前后的其他操作,如赋值、运算、显示等。若不

18、存在其它操作,则i+与+i一样,执行i+=1,使i的值加1;i-与-i一样,执行i-=1,使i的值减1。,【例2-7】自加、自减运算符的应用。main()inti=10,j;floatpi=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;,先执行pi-=1;再将pi的值输出,2.7位运算符,位运算以字节(byte)中的每一个二进位(bit)为运算对象,最终的运算结果是整型数据。位运算分为

19、按位逻辑运算和移位运算。一.按位逻辑运算符按位逻辑运算符包括:按位逻辑与运算符:“计算:aprintf(Enterafloatn);scanf(%f,若ab成立,执行这一语句,ab不成立,执行这一语句,例4.10输入a,b,c,利用求根公式求一元二次方程ax2+bx+c=0的根。流程图:,#includemain()floata,b,c;floatx1,x2,delta;printf(PleaseInputa,b,c:);scanf(%f,%f,%f,printf(x1=%f,(-b+delta)/(2*a);printf(x2=%fn,(-b-delta)/(2*a);elsedelta=s

20、qrt(-delta);printf(x1=%f+%fin,-b/(2*a),delta/(2*a);printf(x1=%f-%fin,-b/(2*a),delta/(2*a);,程序:,if与else配对,用以找出a、b中的大者,【例4-11】编程求整数a、b、c中的最大者,a、b、c由键盘输入。main()inta,b,c,max;print(Pleaseenterthreeintegers:n);scanf(%d,%d,%d,条件运算符C语言提供了条件运算符“?:”。由条件运算符构成的表达式称为条件运算表达式。在某些情况下,条件语句ifelse可以用条件运算表达式来代替。条件运算表达式

21、的格式:表达式1?表达式2:表达式3执行时,先判断表达式1的值,如果其不为0,则以表达式2的值作为条件运算表达式的值,否则,以表达式3的值作为条件运算表达式的值。,只有在if语句内嵌的语句为赋值语句、且两个分支都给同一个变量赋值时,才能用条件表达式代替if语句,【例4-12】从键盘输入二个整数,输出其中的较大者。main()inta,b;printf(Pleaseinputtwointegers:n);scanf(%d,%d,使用条件运算符使程序变得简洁,二.条件语句的嵌套C语言允许在条件语句中又包含另一个条件语句,称之为条件语句的嵌套。,在if语句中又嵌套了另一个if语句,【例4-13】从键

22、盘上输入一个字符,判断它是英文字母、数字或其它字符。,流程简图:,程序:#includemain()charch;printf(Enteracharacter:);chgetchar();if(ch=0,【例4-14】修改例4-10的程序,要求在求解方程之前,先判断输入的二次项系数a是否为0,若为0,则输出出错信息。,“if”和“else”的正确配对复合语句和条件语句的嵌套结构为解决一些较为复杂的编程问题提供了必要的条件。但同时也使程序的结构变得复杂,不易读懂。特别是在程序中有多个和ifelse的情况。在阅读程序之前,必须能正确地将“”和“”配对、将“if”和“else”配对,使程序的结构变得

23、清晰和有条理。“if”和“else”配对应遵循下述规律:自上而下,“else”总是和上面离它最近的“if”配对。而且,每一个“else”只能和一个“if”配对。由于单独的“if”也是条件语句,所以,允许无“else”配对的“if”单独存在。同理,“”和“”配对应遵循下述规律:自上而下,“”总是和上面离它最近的“”配对。,【例4-15】如果变量x的值是-15,变量y的值是-10,则执行下面的程序段后,屏幕上显示的内容是什么?if(x0)if(x10)printf(A);elseprintf(B);elseif(y-20)printf(C);elseprintf(D);printf(E);为了看清

24、程序结构,必须先将if和else正确配对。,将if和else正确配对:,该程序段采用了缩进格式,这种格式更容易反映出程序结构。,流程图:,switch语句的格式:switch(整型表达式)case整型常量表达式1:语句序列1break;case整型常量表达式2:语句序列2break;case整型常量表达式k:语句序列kbreak;default:语句序列k+1,三.开关语句开关语句用于在程序中实现多路选择。,Switch语句的执行流程:,说明:格式中的break语句不是必须的,应根据需要而定。格式中的default语句不是必须的,在缺省的情况下,相当于语句序列k+1是空语句。格式中的是必须的。

25、,【例4-16】编写一个四则运算计算器程序,可以实现输入二个数和一个四则运算符,输出运算结果的功能。main()floatoperandl,operand2,result;charoperator;scanf(%f,%c,%f,由operator的值决定执行哪一个case语句,执行break语句后就结束switch语句,【例4-17】用switch语句实现从键盘输入成绩,转换成相应的等级后输出(90-100为A,80-89为B,70-79为C,60-69为D,59及以下为E)。main()intscore;printf(PleaseInputAScore:);scanf(%d,用以将输入的成绩

26、按等级与10以内的某一个非负整数相对应,case10、case9执行相同的语句,4.6循环结构在程序中,若干个在一定条件下反复执行的语句就构成了循环体,循环体连同对循环的控制就组成了循环结构。循环结构也是最常见的程序结构。几乎所有实用的程序都包含循环结构。,在C程序中常用的循环语句包括:while语句dowhile语句for语句,【例4-18】编程求1+2+3+4+n(n由键盘输入),并输出结果。根据例4-1给出的算法和流程图,设计如下的程序:main()intn,i=1,sum=0;printf(Pleaseinputn:n);scanf(%d,流程图,while(i=0.00001)pri

27、ntf(“SUM=%f”,sum);,循环的次数预先不知,sum+=1.0/(i-1)*i);i+;,循环体是复合语句,【例4-20】用dowhile语句实现【例4-18】。main()intn,i=1,sum=0;printf(Pleaseinputn:);scanf(%d,循环体至少被执行一次,流程图:,main()intn,i=2;longintfac=1;printf(Pleaseinputn:);scanf(%d,程序:,说明:表达式1用于给循环变量赋初值,表达式2给出执行循环体的条件,表达式3用于修改循环变量。,【例4-22】编程计算1-3+5-7+-99分析:原题就是计算1+(-

28、3)+5+(-7)+(-99),这还是一个连加问题。主要应解决加数符号的交叉变化。在程序中用变量j表示符号,以1表示正号、1表示负号。main()inti,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()inti,sum=0;for(i=1;i=100;i+)if(i%3=0),C语言允许for语句一般格式中的表达式1,表达式2和表达式3空缺,但

29、它们所具有的功能应当在适当的地方由另外的语句来实现。例4-23-1与例4-23程序的功能是一样的。【例4-23-1】main()inti=1,sum=0;for(;i=100;i+)if(i%3=0),对循环变量i赋初值,省却了对循环变量i赋初值的表达式1,四.循环的嵌套循环的嵌套是指一个循环体内又包含另一个完整的循环结构。,例如:(1)while()(2)while()while()dowhile();,再如:(3)do(4)for()for()while()while();,注意:在循环嵌套时,外循环必须完全包含内循环。,【例4-24】编程输出如下由“*”组成的三角形。*,外循环控制输出5

30、行*字符,内循环控制一行输出2*i-1个*字符,输出一行*字符后换行,main()inti,j;for(i=1;i=5;i+)for(j=1;j=2*i-1;j+)printf(*);printf(n);,4.7continue语句和break语句continue语句和break语句属于转向语句,它们常用在循环体中,用于改变循环的执行顺序。,一.continue语句在循环体中执行continue语句后,程序将立即跳过continue语句之后尚未执行的语句,提前结束本轮循环,返回到循环的开始处,准备执行下一轮循环。,注意:(1)continue、break语句必须和if语句配合使用,否则,循环体

31、中continue、break语句后面的部分将是多余的。(2)continue、break语句只对其直接所属的循环语句起作用。,【例4-25】从键盘输入整数,如果是奇数,则继续输入,如果是非0偶数,则显示该偶数后继续输入,如果是0则输出“Theend.”后结束。分析:题目要求不断地从键盘输入整数,直到输入0时结束。这可以用循环结构来实现。main()intn=1;while(n!=0)printf(Pleaseinputaninteger:n);scanf(%d,保证循环体至少被执行一次,若输入的是奇数则结束本轮循环并返回循环开始处,用for语句来实现【例4-25】。【例4-25-1】main

32、()intn=1;for(;n!=0;)printf(Pleaseinputaninteger:n);scanf(%d,二.break语句在循环体中执行break语句后,将立即结束循环。【例4-26】每次从键盘输入一个整数进行累加,一旦累加和大于100时,停止输入并输出累加和。main()intn,sum=0;while(1)printf(Pleaseinputaninteger:n);scanf(%d,若条件满足,则结束本次循环,永真条件,用for语句来实现【例4-26】。【例4-26-1】main()intn,sum=0;for(;)printf(Pleaseinputaninteger:

33、n);scanf(%d,省却了对循环条件的判断,用break语句控制结束循环,第4章结束,精选,144,第5章数组,学习目标,熟练掌握一维数组、二维数组、字符数组的定义、初始化。熟练掌握数组元素的引用方法。3.熟练掌握C程序处理字符串的常用方法。,主要内容,一维数组二维数组字符数组和字符串,5.l一维数组的定义及应用,一.一维数组的定义n次多项式通常被表示为:f(x)=anxn+an-1xn-1+an-2xn-2+a2x2+a1x+a0各项系数为:an,an-1,an-2,a2,a1,a0它们有下列特点:同名a同类型实数类型以下标0,1,2,n-1,n区别各元素an、an-1、an-2、a2、

34、a1、a0,在C语言中,把具有一定顺序关系的同名、同类型变量的集合称为数组,称元素的共名a为数组名,将各元素记为:a0,a1,a2,an-1,an。根据元素下标的个数将数组分为一维数组、二维数组、。故又称数组元素为下标变量。,一维数组的定义:,数据类型数组名元素个数;例如:intdata4;定义了一个有4个元素的一维数组data,元素类型为int型;又如:charc10;定义了一个有4个元素的一维数组c,元素类型为char型,注意:,在数组定义中,方括号中的元素个数只能是整数常量(包括符号常量);2.数组元素的下标从0开始;3.数组名的命名规则与变量名相同;4.数组在内存中按其下标递增的顺序连

35、续存储各元素的值,数组名表示第一个变量的存储地址;5.参加数据处理的只能是数组中的元素变量,数组整体不能参加数据处理,二.一维数组的初始化一维数组的初始化就是在定义数组时对所有的数组元素赋初值。,例如:定义intdata4=3,0,5,0;则等号右边花括号中的数值3,0,5,0依次被赋予data0,data1,data2及date3作为初值。设数组data从地址为2000H的内存单元开始存放,其在内存中的存储情况如下图所示:,data0:2000H03data1:2002H00data2:2004H05data3:2006H00,此外,在初始化的格式中,中的某个初始化数据可以缺省,但是用以分隔

36、数据的逗号不能省略。默认缺省的数据为零值。例如,执行语句:intdata4=3,5,;和intdata4=3,0,5,0;的结果也是一样的。C语言还允许在数组初始化时不指明数组元素的个数。例如:用intb=1,2,3,4;定义并初始化一维数组b是合法的。此时,中初始化数据的个数即为数组元素个数。所以,数组b有4个元素。,说明:在初始化的格式中,中的初始化数据用逗号分隔。当初始化数据个数少于数组元素个数时,剩下的数组元素被赋予零值。所以,intdata4=3,0,5;和intdata4=3,0,5,0;的结果是一样的。,三.一维数组元素的引用数组元素在程序中可参与同类型的变量所能进行的各种运算,

37、并遵循与同类型变量相同的运算规则。在程序中,通过数组名和下标引用相应的数组元素。,【例5-1】用1,3,5,7,9,11,13,15,17,19为数组a的各元素赋值,然后按a9、a8、a7、a0的顺序输出。main()inti,a10;for(i=0;i=0;i-)printf(%d,ai);,【例5-2】输入4个整数a0,a1,a2,a3将它们从小到大按升序排序后输出。排序方法之一:起泡法排序,起泡法升序排序的思路是:将相邻两个数ai,ai+1(i=0,1,2)进行比较,若aiai+1,就交换此两数,这样,大数就会逐渐往下沉,小数往上升。4个数,经过第一轮3次两两比较、交换,最大数就会沉到最

38、后,存放在a3中。第二轮再将前面的3个数经过2次这样的两两比较、交换后,其中的最大数就会被存放在a2中,第三轮将剩下的2个数比较1次,大的数被换到a1,小的数存放在a0中。这样,经过三轮比较就完成了4个数的排序。一般地,对n个数进行排序,共需进行n-1轮比较,在第i轮中要对n-i+1个数进行n-i次相邻元素的两两比较、交换。,a008要求变成02a10604a20406a30208,根据算法:执行第一轮比较:for(j=0;jaj+1)将aj的值与aj+1的值互换;,示意图:,结果:经过三次循环,a0a3中的内容变为:6,4,2,8。最大值8已经“沉”到最下面。,根据算法:再执行第二轮比较:f

39、or(j=0;jaj+1)将aj的值与aj+1的值互换;,结果:经过二次循环,a0a3中的内容变为:4,2,6,8。,根据算法:执行第三轮比较:for(j=0;jaj+1)将aj的值与aj+1的值互换;,示意图:,结果:经过一次循环,a0a3中的内容变为:2,4,6,8。实现了所要求的排序。,一般地,设:n个数为a0,a1,a2,an-2,an-1,则n个数的起泡排序算法可用for循环表示为:for(i=0;iaj+1)将aj的值与aj+1的值互换;,【例5-2-1】起泡法排序的程序:,用符号常量N表示元素个数,排序方法之二:选择法排序选择法排序的思路是:先经过3次比较找出a0、a1、a2和a

40、3中的最小数并与a0对换,再经过2次比较找出a1、a2和a3中的最小数并与a1进行对换,最后,进行一次比较,选出a2和a3中的最小数与a2进行对换。一般地,对n个数进行排序,共需进行n-1轮比较,在第i轮要经过n-i次两两比较,从而在数组未经排序的n-i+1个数中找出最小数并与ai-1对换。与起泡法相比,选择法只是在每轮比较结束后,根据需要,作一次对换操作。在数据个数较多的情况下,相比起泡法有更高的效率。,【例5-2-2】选择法排序的程序。,for(i=0;i=N-2;i+)k=i;for(j=i+1;j=N-1;j+)if(ajak)k=j;if(i!=k)t=ai;ai=ak;ak=t;p

41、rintf(nthesortednumbers:n);for(i=0;i=N-1;i+)printf(%d,ai);printf(n);,#defineN4main()intaN;inti,j,k,t;printf(input%dnumbers:n,N);for(i=0;i=0;i-)scanf(%f,输入x以便计算多项式的值,5.2字符型数组与字符串一.字符型数组,字符型数组也是一维数组。在定义字符型数组的同时可对其初始化,用将初始化数据括起。例如:语句charstr1=p,r,o,g,r,a,m;定义了一个有七个元素的字符数组str1,并用花括号中的字符常量对数组进行初始化。下面的语句实现

42、的是同样的功能:charstr1112,114,111,103,114,97,109;所不同的是,花括号中的数据不是字符常量本身,而是字符常量相应的ASC代码值。设数组str1从地址为2000H的内存单元开始存放,由于一个字符型数据占一个字节,所以各数组元素的存储单元地址从2000H到2006H。,字符型数组str1在内存中的存储情况:,【例5-4】从键盘输入十个字符,统计字符g出现的次数。main()intcounter=0,i;charc10;printf(Pleaseinputtencharactersn);for(i=0;ia,三.常用的字符串处理函数为了方便对字符串的处理,C语言提供

43、了若干字符串处理函数。在使用这些函数时,应在程序的开始使用预处理命令:“#include”或“#include”,1字符串输入函数gets()gets()函数的作用是:从键盘上输入一个字符串,并把它存放在参数所指示的字符数组中,输入的字符串以作为结束。函数gets()的调用格式:gets(字符数组名)如果函数调用成功,将返回字符数组的首地址,否则,返回空值NULL。,2字符串输出函数puts()函数puts()的作用是:将参数中提供的字符串输出到显示屏。函数puts()的调用格式:puts(字符数组名或字符串常量)如果函数调用成功,将返回字符串结束符“0”,否则,返回一个非0值。,说明:在使用

44、gets()、puts()函数之前,应当使用预处理命令#include。,3求字符串长度函数strlen()函数strlen()的作用是:统计由参数提供的字符串所包含的字符个数(字符串末尾的“0”不计在内)。函数strlen()的调用格式:strlen(字符数组名)如果函数调用成功,将返回字符个数。,4字符串连接函数strcat()函数strcat()的作用是:用于连接二个由参数提供的字符串,将第二个参数提供的字符串连接在第一个参数提供的字符串之后,成为一个新的字符串。函数strcat()的调用格式:strcat(字符数组1,字符数组2)如果函数调用成功,将返回字符数组1。说明:(1)字符数组

45、1要定义得足够大以便能容纳连接后的新字符串。(2)字符数组2既可以是字符数组名,也可以是字符串常量。例如:charc30=China;puts(strcat(c,isagreatcountry.);,5字符串拷贝函数strcpy()函数strcpy()的作用是:用于拷贝由参数提供的字符串,将第二个参数提供的字符串拷贝到由第一个参数提供的字符数组中。该数组中原有的字符串将被覆盖。函数strcpy()的调用格式:strcpy(字符数组1,字符数组2)如果函数调用成功,将返回字符数组1。说明:字符数组2既可以是字符数组名,也可以是字符串常量。,6.字符串比较函数strcmp()函数strcmp()的

46、作用是:用于比较二个由参数提供的字符串的大小。比较二个字符串的大小,就是依次比较二个字符串中字符的ASC代码值,若二个字符串中各对应位置上的字符都相同,则认为这二个字符串相等。若第一个字符串中某个位置上字符的ASC代码值大于第二个字符串中对应位置上字符的ASC代码值,而在此之前二个字符串中对应位置上的字符都相同,则认为第一个字符串大于第二个字符串。反之,则认为第二个字符串大于第一个字符串。,函数strcmp()的调用格式:strcmp(字符数组1,字符数组2)如果函数调用成功,返回值如下:为0,当字符数组1等于字符数组2返回值:为1,当字符数组1大于字符数组2为1,当字符数组1小于字符数组2例

47、如,比较字符串“English”和“England”,按上述规则,strcmp(“English”,“England”)的返回值为1,而strcmp(England,English)的返回值为-1。,说明:字符数组1、字符数组2既可以是字符数组名,也可以是字符串常量。,【例5-7】预先设定以字符串“123456”为密码,再从键盘输入一个字符串,若和密码相符,显示:Welcome!,否则显示:Sorry!#include#includemain()charpw=123456,c10;printf(Pleaseinputyourpassword:n);gets(c);if(strcmp(pw,c)

48、=0)printf(Welcome!n);elseprintf(Sorry!n);,必须使用strcmp()函数,7.将字符串中大写字母转换成小写字母函数strlwr()函数strlwr()的作用是:将由参数提供的字符串中所有的大写字母转换成小写字母。函数strlwr()的调用格式:strlwr(字符数组名或字符串常量),8.将字符串中小写字母转换成大写字母函数strupr()函数strupr()的作用是:将由参数提供的字符串中所有的小写字母转换成大写字母。函数strupr()的调用格式:strupr(字符数组名或字符串常量),5.3二维数组一.二维数组的定义和初始化,定义二维数组的格式:类型

49、说明符数组名行数列数;例如,语句:intscore43;定义了四行三列的二维数组(矩阵)score。可以在定义二维数组时同时对其初始化。下面的语句在定义二维数组(矩阵)score的同时对其初始化:intscore43=75,88,72,68,91,92,87,96,98,78,82,90;矩阵中的元素由其所在的行与列唯一确定,scoreij表示矩阵中第i行,第j列的元素,于是:score00=75,score21=96,score32=90,score22=98,。,设数组score在内存中的起始地址为2000H,则其在内存中的存储情况如下图所示:2000H75200CH872002H88第0

50、行的200EH96第2行的2004H72各元素2010H98各元素2006H682012H782008H91第1行的2014H82第3行的200AH92各元素2016H90各元素,结论:二维数组在内存中按行的次序排列,在各行中,又按列元素的次序分配存储单元。所以,在进行初始化时,向二维数组的各个元素赋初值的数据排列顺序一定要和数组各元素在内存中的存储顺序完全一致。二维数组的行、列下标都从0开始。,二维数组初始化的另一种格式:将对应于数组每一行的数据用一对花括号括起来。例如:intx23=1,2,3,4,5,6;其中第一组数据1,2,3对应于第0行的三个元素x00,x01,x02。第二组数据4,

51、5,6对应于第1行的三个元素x10,x11,x12。使用这种花括号嵌套的方法,可以像一维数组初始化那样,对于赋0值的元素,在其对应的初值数据位置上缺省该数据。例如:intx233,4;等价于:intx23=3,0,0,0,0,4;,第二个花括号中的二个逗号不可省略,因为它们表示还有二个元素。,再如:intx23=1,2,;等价于:intx23=1,2,0,0,0,0;在定义二维数组并进行初始化时,允许省略其行数。但要注意,二维数组的列数在定义时不可省略。例如:inta3=75,88,72,68,91,92,87,96,98,78,82,90;等价于:inta43=75,88,72,68,91,

52、92,87,96,98,78,82,90;再如:floatb3=1.21,2.0,-5.5,4.32,-5.8,-9.60;等价于:floatb33=1.21,0.0,0.0,2.0,-5.5,0.0,4.32,-5.8,-9.60;,第二个花括号不可省略,因为在这里它们表示该行元素全部为0,二.二维数组元素的引用及应用举例在程序中,通过数组名和下标引用数组元素。其格式为:数组名行下标列下标二维数组元素的行、列下标从0开始。【例5-8】从键盘输入整型的二行三列的矩阵,将其转置后输出。main()inta23,b32,i,j;for(i=0;i2;i+)for(j=0;j3;j+)scanf(%

53、d,for(j=0;j3;j+)for(i=0;i2;i+)bji=aij;for(j=0;j3;j+)for(i=0;i2;i+)printf(%d,bji);printf(n);,矩阵转置,【例5-9】设有一个四行三列的整型矩阵,从键盘上输入矩阵元素的值,计算并输出每行元素的平均值。main()inta43,i,j;floatave,b4;for(i=0;i4;i+)for(j0;j3;j+)scanf(%d,【例5-10】编程找出四行三列的整型矩阵中元素的最小值,并指出其所在的行与列。分析:首先,默认位于第0行、第0列的元素是当前的最小值,然后,依次用矩阵中元素的值与当前的最小值比较,若

54、比当前的最小值更小,令其成为当前的最小值,并记下其所在的行号与列号。这样,到最后,当前的最小值也就是整个矩阵中元素的最小值,同时也记下了其所在的行号与列号。,main()introw=0,column=0,min,i,j;inta43=-8,3,67,12,-31,5,0,64,-100,98,0,16;min=a00;,for(i=0;i4;i+)for(j0;jy?x:y);main()inta,b,c;printf(PleaseInputtwointegers:n);scanf(%d,%d,(2)形参只能是变量,而实参必须是具有确定值的表达式。,main()inta,b,c;scanf(

55、%d,%d,实参为常量10和表达式a+b,实参为表达式a-b和a+b,执行该语句后,变量a、b均已有了确定的值,例如:intmax(intx,inty)return(xy?x:y);,(3)调用函数时实参与形参的个数、类型和先后顺序应当保持一致。【例6-3】实参与形参的个数、类型和先后顺序对函数调用的影响。intadd(charx,inty)intz;return(x+y);main()chara;inti;printf(PleaseInputAnIntegerNumberandacharacter);scanf(%d,%c,正确的调用,错误的调用,这个return语句永远也不会被执行,二.函数的返回值函数的返回值就是通过函数调用,主调函数从被调用函数中的ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论