版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、- PAGE 36 -C语言程序设计复习提纲一、Visual C+6.0开发环境1、了解Visual C+6.0的安装过程;2、了解Visual C+6.0的工作界面,菜单和工具栏的使用;二、掌握C语言程序运行的过程1、编辑:是指把按照C语法规则编写的程序代码通过编辑器(Visual C+ 6.0,Turbo C 3.0)输入计算机,并存盘。在存盘时,C源文件的扩展名为 .c 2、编译:对源程序进行编译,即将源程序转换为扩展名为.obj的二进制代码;即生成该源文件的目标代码。 3、连接:将用户程序生成的多个目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代码连接在一起,生成一个可
2、执行文件(.exe)。4、执行:执行生成的可执行代码,并输出结果。5、调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。三、结构化程序设计的基本概念1、概念以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,将原来较为复杂的问题化简为一系列简单模块的设计,任何模块都可以使用一些基本的结构来实现,任何复杂的程序,都可以使用这些基本结构按一定的顺序组合起来,这些基本结构的特点都是只有一个入口、一个出口,这样的程序设计方法称为结构化程序设计。2、基本思想结构化程序设计的基本思想是采用自顶向下,逐步细化、模块化设计、结构化编码的程序设计方法
3、和单入口单出口的控制结构。自顶向下、逐步细化的程序设计方法从问题本身开始,经过逐步细化,将解决问题的步骤分解为由基本程序结构模块组成的结构化程序框图;单入口单出口的思想认为一个复杂的程序,如果它仅是由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。据此就很容易编写出结构良好、易于调试的程序来。3、三种基本结构顺序结构选择结构循环结构4、三种基本结构的特点只有一个入口只有一个出口每一个基本结构中的每一部分都有机会执行到结构内不存在“死循环”5、设计原则自顶向下逐步细化模块化设计结构化编码6、结构化程序设计方法要求把程序的结构规定为顺序、选择和
4、循环三种基本机构,并提出了自顶向下、逐步求精、模块化程序设计等原则。结构化程序设计是把模块分割方法作为对大型系统进行分析的手段,使其最终转化为三种基本结构,其目的是为了解决由许多人共同开发大型软件时,如何高效率地完成可靠系统的问题。程序的可读性好、可维护性好成为评价程序质量的首要条件。缺点:程序和数据结构松散地耦合在一起。解决此问题的方法就是采用面向对象的程序设计方法(OOP)。四、C程序的基本组成:C程序是由若干个函数构成的,至少有一个主函数main(),各函数在程序中的前后位置是任意的。C程序的基本组成:声明区、主程序区、函数定义区。1、声明区处在程序文件的所有函数的外部,一般包含:包含头
5、文件、宏定义、类定义、结构体定义、函数声明、全局变量声明、条件编译等。2、主程序区主程序以main()函数开始,main()函数(主函数)是程序运行时的入口,包含局部变量的声明、函数调用、一般运算、结构控制、对象与结构的处理、文件处理等。3、函数定义区函数的定义包含函数说明和函数体两部分。图1 C语言数据类型数据类型基本类型空类型(无值类型)void构造类型指针类型实型(浮点型)联合型类型union单字符型char整型int单精度型float双精度型double字符型宽字符型w-char逻辑型bool类类型class枚举型类型enum结构类型struct数组类型五、C的数据类型、运算符、表达式
6、1、常量和变量、常量:在程序中直接用符号(文字)表示的数据 整型常量:表示形式有十进制、八进制(以0开头)和十六进制(以0 x或0X开头)。整型常量可以后缀字母L(或l)表示长整数,后缀字母U(或u)表示无符号整数。实型常量(浮点型常量):表示形式有一般形式和指数形式。实型常量缺省为double型,如后缀f或F,则为float型。字符常量:用单引号括起来的一个字符。不可显示的字符可用转义序列的方法来表示(见P26)。字符串常量:用双引号括起来的字符序列。布尔常量:false,true。 符号常量:#define 宏名 常数例:下列哪些常量是合法的常量:12.7, -6.87E-2, 0XAbC
7、D, 、0625L, 87U, -0 x98C2变量:指程序在运行时其值可改变的量。变量应先定义(声明其类型和名称)后使用; 变量定义的一般形式为: ,;在定义一个变量的同时,也可以给它赋以初值。 变量的命名规则(见P9)2、数据类型、基本数据类型(见P23)、构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的。数组:是由具有相同数据类型的元素组成的集合。结构体:是由不同的数据类型构成的一种混合的数据结构,构成结构体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元。共用体:是类似于结构体的一种构造类型,与结构体不同的是构成共同体的数据成员共用同一段内存单元。枚举:是将变量
8、的值一一列举出来,变量的值只限于列举出来的值的范围内。、指针类型变量用于存储另一变量的地址,而不能用来存放基本类型的数据。它在内存中占据一个存储单元。、类是一个数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质。 3、运算符和表达式、算术运算符和算术表达式注意:int i=1.2*3; /结果为3,而不是3.6。 int i=5/3结果为1。、赋值运算符和赋值表达式注意:赋值运算符的结合性是从右至左的复合赋值运算符:int a=12; a+=a-=a*=a;、关系运算符和关系表达式注意:关系运算符的优先级低于算术运算符。例如:a+bc 等价于 (a+b)c,a
9、!=bc等价于a!=(bc) “=”与“=”的区别关系运算符的优先级低于算术运算符、逻辑运算符与逻辑表达式注意:逻辑非的优先级最高,逻辑与次之,逻辑或最低逻辑运算符的短路特性。int x,y,z; x=y=z=-1; +x&+y|+z; printf(“x=%dty=%dtz=%dn”,x,y,z);(结果:0 -1 0)x=y=z=-1; +x|+y&+z; printf(“x=%dty=%dtz=%dn”,x,y,z); (结果:0 0 -1)x=y=z=-1; +x&+y&+z; printf(“x=%dty=%dtz=%dn”,x,y,z); (结果:0 -1 -1)、自增(+)、自减
10、(-)运算符注意:自增(+)、自减(-)运算符的前置用法和后置用法的区别。int i, j, k; int m, n, p; i = 8; j = 10; k = 12; /* 自增在操作数之前 */ m = +i;printf(i = %dn, i);printf(m = %dn, m); (结果:9 9)/* 自减在操作数之后 */n = j-; printf(j = %dn, j); printf(n = %dn, n); (结果:9 10)/* 自增、自减的混合运算 */p = (+m)*(n+)+(-k); printf(k = %dn, k); printf(p = %dn, p)
11、; (结果:11 111)、条件运算符表达式1?表达式2:表达式3注意:结合性是自右向左。ab?a:cd?c:d相当于ab?a:(cd?c:d)条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。如:ab?a-b:b-a相当于ab?(a-b):(b-a) 、位运算符位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。如:int a=5,b=6;a&b=4;a|b=7;ab=3;b=249;b2=1。、逗号运算符表达式, 表达式, , 表达式n注意:自左至右,依次计算各表达式的值,“表达式n” 的值即为整个逗号表达式的值。如:a = 3 * 5, a * 4
12、, a + 5的值为20。4、运算符的优先级与结合性、所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性。反之,称为右结合性。结合性是语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。、表达式求值按运算符的优先级高低次序执行。例如,先乘除后加减。如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按语言规定的结合方向(结合性)进行。例如,算术运算符的结合方向是“自左至右”,即:在执行“a b + c”时,变量b先与减号结合,执行“a - b”;然后
13、再执行加c的运算。六、顺序结构程序设计数据的输入和输出1、格式化输出printf()函数和格式化输入scanf()函数、格式化输出函数(printf())和格式化输入函数(scanf())都包含在头文件“stdio.h”中。、格式化输出printf()函数printf()函数的一般格式如下:printf(格式字符串 ,输出项表);如:printf(“x=%d”,x)输出项表:要输出的数据项(可以没有,多个时以“,”分隔)格式控制串:包含两种信息格式说明: %修饰符格式字符 ,用于指定输出格式普通字符或转义序列:原样输出。格式控制字符:格式转换字符含义举例%d,%i以十进制整数输出int a=6
14、5;printf(“%d”,a)/65%x,%X以十六进制数输出无符号整数int a=65;printf(“%x”,a)/41%o以八进制数输出无符号整数int a=65;printf(“%o”,a)/101%u以十进制数输出无符号整数int a=-1;printf(“%u”,a)/65535%c输出一个字符型数据int a=65;printf(“%c”,a)/A%s输出一个字符串printf(“%s”,“abcd”)%e,%E以指数形式输出一个浮点型数据(小数位数缺省值为6位)float x=984.235497426;printf(%e,x);/9.842355e+002%f以十进制小数形
15、式输出一个浮点型数据(小数位数缺省值为6位)float x=984.235432426;printf(%f,x);/984.235413%g,%G按照%e,%f输出宽度较短的格式输出,不输出无意义的0float x=9.8;printf(%g,x);/9.8、格式化输入scanf()函数scanf()函数的一般格式scanf(格式字符串, 输入项首地址表);格式字符串。格式字符串可以包含3种类型的字符:格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)。格式指示符与printf()函数的相似,空白字符作为相邻2个输入数据的缺省分隔符,非空白字符在输入有效数据时,必须原样
16、一起输入。输入项首地址表由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。变量首地址的表示方法: &变量名其中“&”是地址运算符。数据输入操作如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。例如,scanf(%d%d,&num1,&num2);假设给num1输入12,给num2输入36,则正确的输入操作为:1236或者:12 36 注:使用“”符号表示按回车键操作,在输入数据操
17、作中的作用是,通知系统输入操作结束。“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。 例如,scanf(%d,%d,&num1,&num2); 假设给num1输入12,给num2输入36,正确的输入操作为:12,36七、选择结构程序设计1、if语句、if语句的一般格式 if(表达式) 语句组1; else 语句组2; if语句中的“表达式”必须用“(”和“)”括起来。else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。、if语句的执行过程缺省else子句时当“
18、表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条。指定else子句时当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。、if语句的嵌套与嵌套匹配原则if语句允许嵌套。所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。if语句嵌套时,else子句与if的匹配原则:与在它上面、距它最近、且尚未匹配的if配对。例:铁路托运行李,假设每张车票可按每公斤0.5元托运50公斤以内的行李,如果超过50公斤时,超过的部分每公斤加价0.3元,试编写一道计算行李托运费的程序。解:/*程序
19、功能:计算行李托运费*/#include Void main() float w,x; printf(输入行李的重量:); scanf(%f,&w); if(w50.0) x=50.0*0.5+(w-50.0)*0.8; else x=w*0.5;printf(行李重量w=%.2f公斤,托运费x=%.2f元n,w,x); 2switch语句、switch语句的一般形式switch(表达式) case 常量表达式1:语句组;break; case 常量表达式2:语句组;break; case 常量表达式:语句组;break; default:语句组;break; 、执行过程 当switch后面“
20、表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default 后面的语句(组)。然后,再执行switch语句的下一条。说明switch后面的“表达式”,可以是int、char和枚举型中的一种。每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入
21、口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。各case及default子句的先后次序,不影响程序执行结果。多个case子句,可共用同一语句(组)用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。例:从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80,等级为C;60score70,等级为D;score60,等级为E。解:#include Void main()int score, grade; printf(“Input a
22、score(0100): ”); scanf(“%d”, &score); grade = score/10; /*将成绩整除10,转化成switch语句中的case标号*/ switch (grade)case 10: case 9: printf(“grade=An”); break;case 8: printf(grade=Bn); break; case 7: printf(grade=Cn); break; case 6: printf(grade=Dn); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(“
23、grade=En”); break; default: printf(“The score is out of range!n”);八、循环程序设计1、while语句、一般格式 while(循环继续条件) 循环体语句组;、执行过程求解“循环继续条件”表达式。如果其值为非0,转;否则转。执行循环体语句组,然后转。执行while语句的下一条。例:/*程序功能:求1100的累计和*/#include void main() int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/ while( i=100 ) sum += i;/*实现累加*/ i+;/*循环控制变量i增1*/ pr
24、intf(“sum=%dn”,sum); 程序运行情况如下:sum=50502、do-while语句(直到型循环)、一般格式 do 循环体语句组; while(循环继续条件);/*本行的分号不能缺省*/当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。、执行过程执行循环体语句组。计算“循环继续条件”表达式。如果“循环继续条件”表达式的值为非 0(真),则转向继续执行;否则,转向。执行do-while的下一条语句。、do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。do-while语句比较适用于处理:不论条件是否成立,先执行1次循环体语句组的情况。例:用do-wh
25、ile语句求解1100的累计和。/*程序功能:求1100的累计和*/main() int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/ Do sum += i; /*累加*/ i+; while(i=100);/*循环继续条件:i=100*/ printf(“sum=%dn”,sum); 3、for语句、for语句的一般格式 for(变量赋初值;循环继续条件;循环变量增值) 循环体语句组;、for语句的执行过程求解“变量赋初值”表达式。求解“循环继续条件”表达式。如果其值非0,执行;否则,转至。执行循环体语句组,并求解“循环变量增值”表达式,然后转向。执行for语句的下
26、一条语句。、说明“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。例如,for(sum=0;i=100;i+) sum += i; for(sum=0,i=1;i=100;i+) sum += i;“循环继续条件”部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。如:while(!E)等价于while(0),while(E)等价于while(1)。例
27、:求n的阶乘n!(n!=1*2*n)。/*程序功能:求n!*/main() int i, n; long fact=1;/*将累乘器fact初始化为1*/ printf(“Input n: ”); scanf(“%d”, &n); for(i=1; i=n; i+)fact *= i;/*实现累乘*/ printf(%d ! = %ldn, n, fact); 程序运行情况如下:Input n: 55 ! = 1204、循环的比较、While和 for都是先判断后循环,而do-while是先循后判断。即do-while语句在条件不成立时循环体也要被执行一次。、while和do-while语句的
28、条件表达式只有一个,只起到控制循环结束的作用,循环变量的初值等都用其他语句完成;for语句则有3个表达式,不仅能起到控制循环结束的作用,还可给循环变量赋初值。5、循环的嵌套、循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。、for语句和while语句允许嵌套,do-while语句也不例外。例:编程: 打印下列图形 * * * * *解:/*程序功能:打印5行*,第一行1个,第二行3个,第三行5个.*/#include void main() int i=1; while(i=5) int j=1,k=1; while(j=5-i) pr
29、intf( ); j+; while(k=2*i-1) printf(*); k+; printf(n); i+; 6、break语句与continue语句、一般格式: break; continue;、功能break:强行结束循环,转向执行循环语句的下一条语句。continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。、说明break能用于循环语句和switch语句中,continue只能用于循环语句中。循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无
30、关。例:求输入的十个整数中正数的个数及其平均值#include void main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d,&a);if(a=0) continue;num+;sum+=a; printf(%d plus integers sum :%6.0fn,num,sum); printf(Mean value:%6.2fn,sum/num);例:编程:设计一个程序完成以下功能:若输入英文字母,则原样输出;输入其他字符,则不输出,直到输入q键结束。解:#include void main()char ch;doch=g
31、etchar();if(ch=Q | ch=q)break;else if(ch=A & ch=a & ch=z)putchar(ch);while(1);九、数组及其使用1、一维数组、一维数组的定义:数据类型 数组名常量表达式, 数组名2常量表达式2;“数据类型”是指数组元素的数据类型。数组名,与变量名一样,必须遵循标识符命名规则。“常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数
32、组中的所有元素,按其下标的顺序占用一段连续的存储单元。、数组元素的引用引用数组中的任意一个元素的形式: 数组名下标表达式“下标表达式”可以是任何非负整型数据,取值范围是0(元素个数-1)。1个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理。、一维数组元素的初始化初始化格式:数据类型 数组名常量表达式初值表如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。“初值表”中的初值个数,可以
33、少于元素个数,即允许只给部分元素赋初值。例:从键盘上任意输入n个整数,用冒泡法按从小到大地排序,并在屏幕上显示出来。解:冒泡法排序的基本思想:从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。#include iostream.h#define N 10 /*定义符号常量(数据个数N)*/void main() int dataN;/*定义1个1维整型数组data*/ int i,j,temp;/*定义循环变量和临时变量*/
34、cout请输入10个数:n; for(i=0; idatai; /*冒泡法排序*/ for(i=0; iN-1; i+) /*外循环:控制比较趟数*/ for(j=0; jdataj+1) /*如果dataj大于dataj+1,交换两者的位置*/ temp=dataj; dataj=dataj+1; dataj+1=temp; ; /*输出排序后的数据*/ coutn输出排序后的结果:n; for(i=0; iN; i+) coutdatai ; coutendl; 2、二维数组、二维数组的定义: 数据类型 数组名行常量表达式列常量表达式, 数组名2行常量表达式2列常量表达式2;数组元素在内存
35、中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推。设有一个m*n的数组x,则第i行第j列的元素xij在数组中的位置为:i*n+j(注意:行号、列号均从0开始计数)。、二维数组元素的引用引用2维数组元素的形式为:数组名行下标表达式列下标表达式“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x34,则可用的行下标范围为02,列下标范围为03。对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的2维数组元素。、二维数组元素的初始化按行赋初值数据类型 数组名行常量表达式列
36、常量表达式第0行初值表,第1行初值表,最后1行初值表;赋值规则:将“第0行初值表”中的数据,依次赋给第0行中各元素;将“第1行初值表”中的数据,依次赋给第1行各元素;以此类推。按2维数组在内存中的排列顺序给各元素赋初值数据类型 数组名行常量表达式列常量表达式初值表;赋值规则:按2维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。如果对全部元素都赋初值,则“行数”可以省略。注意:只能省略“行数”。例:有M个学生,学习N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩。解:/*功能:计算个人平均成绩与各科平均成绩,并在屏幕上显示出来。*/#define
37、NUM_std 5 /*定义符号常量人数为5*/#define NUM_course 4 /*定义符号常量课程为4*/#include stdio.hvoid main() int i,j; static float scoreNUM_std+1NUM_course+1=78,85,83,65, 88,91,89,93, 72,65,54,75,86,88,75,60, 69,60,50,72; for(i=0;iNUM_std;i+) for(j=0;jNUM_course;j+) scoreiNUM_course += scoreij;/*求第i个人的总成绩*/scoreNUM_stdj
38、+= scoreij; /*求第j门课的总成绩*/ scoreiNUM_course /= NUM_course;/*求第i个人的平均成绩*/ for(j=0;jNUM_course;j+) scoreNUM_stdj /= NUM_std; /*求第j门课的平均成绩*/ /*输出表头*/ printf(学生编号 课程1 课程2 课程3 课程4 个人平均n); /*输出每个学生的各科成绩和平均成绩*/for(i=0;iNUM_std;i+)printf(学生%dt,i+1); for(j=0;jNUM_course+1;j+) printf(%6.1ft,scoreij); printf(n)
39、; /*输出1条短划线*/ for(j=0;j8*(NUM_course+2);j+) printf(-); printf(n课程平均); /*输出每门课程的平均成绩*/ for(j=0;jNUM_course;j+) printf(%6.1ft,scoreNUM_stdj); printf(n); 3、字符数组、字符数组的定义1维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样。2维字符数组,用于同时存储和处理多个字符串,其定义格式与2维数值数组一样。、字符数组的初始化字符数组的初始化,可以通过为每个数组元素指定初值字符来实现。、字符数组的引用 字符数组的逐个字符引用,与引用
40、数值数组元素类似。字符数组的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用getchar()或scanf()函数输入字符。字符数组的输出 字符数组的输出,可以用putchar()或printf()函数。4、字符串及其结束标志所谓字符串,是指若干有效字符的序列。C语言中的字符串,可以包括字母、数字、专用字符、转义字符等。C语言规定:以0作为字符串结束标志(0代表ASCII码为0的字符,表示一个“空操作”,只起一个标志作用)。因此可以对字符数组采用另一种方式进行操作了字符数组的整体操作。注意:由于系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。另外,由于
41、结束标志也要在字符数组中占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。字符数组的整体初始化字符串设置了结束标志以后,对字符数组的初始化,就可以用字符串常量来初始化字符数组。字符数组的整体引用字符串的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用scanf()函数输入字符串。字符串的输出printf()函数,不仅可以逐个输出字符数组元素,还可以整体输出存放在字符数组中的字符串。5、常用的字符串处理函数字符串标准函数的原型在头文件string.h中。、输入字符串gets()函数调用方式:gets(字符数组)函数功能:从标准输入设备(stdin)键盘上,读
42、取1个字符串(可以包含空格),并将其存储到字符数组中去。使用说明gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。该函数输入的字符串中允许包含空格,而scanf()函数不允许。输出字符串puts()函数调用方式:puts(字符数组)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用n取代字符串的结束标志0。所以用puts()函数输出字符串时,不要求另加换行符。使用说明字符串中允许包含转义字符,输出时产生一个控制操作。该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。、字符串比较strcmp()
43、函数调用方式:strcmp(字符串1 ,字符串2)其中“字符串”可以是串常量,也可以是1维字符数组。函数功能:比较两个字符串的大小。如果:字符串1=字符串2,函数返回值等于0; 字符串1字符串2,函数返回值正整数。使用说明如果一个字符串是另一个字符串从头开始的子串,则母串为大。不能使用关系运算符“”来比较两个字符串,只能用strcmp() 函数来处理。、拷贝字符串strcpy()函数调用方式:strcpy(字符数组, 字符串)其中“字符串”可以是串常量,也可以是字符数组。函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。使用说明字符数组必须定义得足够大,以便容纳复制过
44、来的字符串。复制时,连同结束标志0一起复制。不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。连接字符串strcat()函数调用方式:strcat(字符数组, 字符串)函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。使用说明由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。连接前两个字符串都有结束标志0,连接后“字符数组”中存储的字符串的结束标志0被舍弃,只在目标串的
45、最后保留一个0。求字符串长度strlen()函数(len是length的缩写)调用方式:strlen(字符串)函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。将字符串中大写字母转换成小写strlwr()函数调用方式:strlwr(字符串)函数功能:将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换。将字符串中小写字母转换成大写strupr()函数调用方式:strupr(字符串)函数功能:将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。十、函数的定义与调用1、函数的定义任何函数(包括主函数main())都是由函数说明和函数体两部
46、分组成。根据函数是否需要参数,可将函数分为无参函数和有参函数两种。、无参函数的一般形式 函数类型 函数名( void ) 说明语句部分; 可执行语句部分; 注意:在旧标准中,函数可以缺省参数表。但在新标准中,函数不可缺省参数表;如果不需要参数,则用“void”表示,主函数main()例外。、有参函数的一般形式函数类型 函数名( 数据类型 参数,数据类型 参数2 ) 说明语句部分; 可执行语句部分; 有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。例:定义一个函数,用于求两个数中
47、的大数。解:/*功能:定义一个求较大数的函数并在主函数中调用*/int max(int n1, int n2) /*定义一个函数max()*/ return (n1n2?n1:n2); main()int max(int n1, int n2);/*函数说明*/ int num1,num2; printf(input two numbers:n); scanf(%d%d, &num1, &num2);printf(max=%dn, max(num1,num2);、说明函数定义不允许嵌套。在语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数ma
48、in()之前或之后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。空函数既无参数、函数体又为空的函数。其一般形式为:函数类型 函数名(void) 在老版本C语言中,参数类型说明允许放在函数说明部分的第2行单独指定。 2、函数的返回值与函数类型函数返回值与return语句有参函数的返回值,是通过函数中的return语句来获得的。return语句的一般格式: return ( 返回值表达式 );return语句的功能:返回调用函数,并将“返回值表达式”的值带给调用函数。注意:调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void
49、”定义成“无(空)类型”。函数类型在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致。如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。3、对被调用函数的说明和函数原型在ANSI C新标准中,采用函数原型方式,对被调用函数进行说明,其一般格式如下:函数类型 函数名(数据类型 参数名, 数据类型 参数名2);/C语言同时又规定,在以下2种情况下,可以省去对被调用函数的说明:当被调用函数的函数定义出现在调用函数之前时。因为在调用之前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。如果在所有函数定义之前,在函数外部(例如文件开始处)预先
50、对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明。4、函数的调用 一般形式为: 函数名(实际参数表) 切记:实参的个数、类型和顺序,应该与被调用函数所要求的参数(形参)个数、类型和顺序一致,才能正确地进行数据传递。、调用函数方式:函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。函数语句。C/C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句。函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。、说明:调用函数时,函数名称必须与具有该功能的自定义函数
51、名称完全一致。实参在类型上按顺序与形参,必须一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不到正确的结果。如果实参表中包括多个参数,对实参的求值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反。Turbo C和MS C是按自右向左的顺序进行的 。5、函数的形参与实参、函数的参数分为形参和实参两种,作用是实现数据传送。形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。 例:实参
52、对形参的数据传递。/*实参对形参的数据传递。*/void main() void s(int n); /*说明函数*/ int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ printf(n_s=%dn,n); /*输出调用后实参的值,便于进行比较*/ void s(int n) int i; printf(n_x=%dn,n); /*输出改变前形参的值*/ for(i=n-1; i=1; i-) n=n+i; /*改变形参的值*/ printf(n_x=%dn,n); /*输出改变后形参的值*/ 、说明:实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量
53、,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。实参和形参占用不同的内存单元,即使同名也互不影响。6、函数的嵌套调用和递归调用、函数的嵌套调用 指在执行被调用函数时,被调用函数又调用了其它函数。如图所示:、函数的递归调用函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。7、内部变量与外部变量、内部变量在一个函数
54、内部说明的变量是内部变量,它只在该函数范围内有效。只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称“局部变量”。、关于局部变量的作用域还要说明以下几点:主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系。形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。在复合语句中也可定义变量,其作用域只在复合语句范围内
55、。 、外部变量在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。例:输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。解:/*功能:利用全局变量计算长方体的体积及三个面的面积*/int s1,s2,s3;int vs(int a,int b,int c) int v;v=a*b*c; s1=a*b; s2=b*c; s3=a*c;return v;main()int v,l,w,h;printf(ninput length,widt
56、h and height: );scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3);十一、指针1、指针和指针变量的概念、指针即地址一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。指针变量专门用于存储其它变量地址的变量2、指针变量的定义与应用、指针变量的定义:数据类型 *指针变量, *指针变量2;、取地址运算()和指针运算(*)取地址运算的格式:变量指针运算的格式:*指针变量例:#include void main()int a,b;int *p1,*p2;a=100;b=10;
57、p1=&a;p2=&b;printf(a =%dn, a);printf(b+2=%dn, b+2);printf(p1=%xn, p1);printf(p2=%xn,p2);printf(*p1=%dn,*p1);printf(*p2+2=%dn,*p2+2);例:编写程序,实现从键盘输入两个数,输出时从大到小排列(利用指针概念),#include void main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(
58、max=%d,min=%dn,*p1,*p2);3、指针与数组指针和一维数组数组名代表数组的首地址,是一个常量。数组指针:就是指向数组元素地址的指针变量。例:从n个数中找出最大值和最小值(见P180)指针和二维数组用数组名表示二维数组的行地址数组元素三种形式引用: aij 下标法 *(ai+j) 用一维数组名 *(*(a+i)+j) 用二维数组名 指针数组指针数组:数组的所有元素都是存放指针的数组称为指针数组。即:指针数组中每一个元素(下标变量)都是指针变量。指针数组的定义形式: 数组长度=地址列表;4、指针与字符串将字符串的首地址赋给指针,用字符指针变量来处理字符串。字符指针变量与字符指针数
59、组字符数组和字符指针变量都能实现字符串的存储与运算,但两者之间还是有区别的,主要包括以下几点:字符数组由若干元素组成,每个元素存放一个字符;字符指针变量存放的是字符串的首地址。赋值方式不同:不能用赋值语句给字符数组赋值。char str14;str=“I love china!” 这是错误的。字符指针变量可以采用下面的形式赋值:char *p;p=“china!” 这是正确的。但要注意赋给指针变量p的不是字符串,而是字符串的首地址。定义一个数组,在编译时分配存放n个元素的存储空间;定义指针变量只分配存放一个地址的空间。5、指针与函数函数指针函数名就代表函数的入口地址。函数指针:函数的入口地址称
60、为函数指针。即指向函数的指针变量为函数指针。函数指针定义格式: (*指针变量名)();其中:“存储类型”是函数指针本身的存储类型;“数据类型”是指函数返回值的数据类型;例如:int (*p)();定义一个指向整形函数的指针变量p。例:求a和b中的最大者。 程序如下:void main()int max();int (*p)();int a,b,c;p=max; /*函数max入口地址赋给p*/scanf(“%d,%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);int max(int x,int y)int z;if (xy) z=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省三门峡市(2025年)辅警招聘公安基础知识题库附含答案
- 2026年法律篇面试试题及答案
- 农业科技的发展与农业现代化
- 农业银行数据安全与隐私保护合规策略
- 2025年医学检验技术士考试题及答案
- 高效团队建设与管理:实践案例详解
- 2025年应城市国有企业公开招聘员人笔试参考题库附带答案
- 2025年国家义务教育质量监测小学生心理健康测试试卷+答案
- (2025年)天车操作工操作规程试题附答案
- 山西大学附中2025~2026学年第二学期高三3月模块诊断 历史答案
- 2025年初中劳动技术教师招聘考试测试卷及答案
- 2026广东中山市神湾镇神湾社区居民委员会招聘1人考试备考试题及答案解析
- 《红领巾相约中国梦》课件2025-2026学年湖南文艺版音乐三年级下册
- 2026江苏徐州地铁集团下属运营公司招聘笔试备考题库及答案解析
- 2026甘肃平凉华亭市招聘社区工作者10人考试参考试题及答案解析
- 优先内部采购制度
- 医药招商业务管理制度
- 国开2026年春季《形势与政策》大作业答案
- 基于数字孪生技术的草原监测与智能放牧管理系统研究
- 2026年六安职业技术学院单招职业适应性考试题库含答案详解(培优)
- 2025年福建海峡企业管理服务有限公司招聘5人笔试历年典型考点题库附带答案详解2套试卷
评论
0/150
提交评论