• / 31
  • 下载费用:12 金币  

C语言-复习计划提纲记要.doc

关 键 词:
语言 复习计划 提纲 记要
资源描述:
\\C语言复习提纲第一章 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、编译:将C语言源程序编译成目标程序,即对源程序进行编译,并将源程序转换为扩展名为.obj的二进制目标代码(即把已经编辑好的源程序翻译成二进制目标代码的过程)。 3、连接:将用户程序生成的目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代码连接在一起,生成一个可执行文件(.exe)。4、执行:执行生成的可执行代码,并输出结果。5、调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。▲三、结构化程序设计的基本概念1、概念以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,将原来较为复杂的问题化简为一系列简单模块的设计,任何模块都可以使用一些基本的结构来实现,任何复杂的程序,都可以使用这些基本结构按一定的顺序组合起来,这些基本结构的特点都是只有一个入口、一个出口,这样的程序设计方法称为结构化程序设计。2、基本思想结构化程序设计的基本思想是采用"自顶向下,逐步细化、模块化设计、结构化编码"的程序设计方法和"单入口单出口"的控制结构。3、三种基本结构⑴顺序结构 ⑵选择结构 ⑶循环结构4、三种基本结构的特点⑴只有一个入口 ⑵只有一个出口⑶每一个基本结构中的每一部分都有机会执行到⑷结构内不存在“死循环”5、设计原则⑴自顶向下 ⑶逐步细化 ⑶模块化设计⑷结构化编码▲四、C程序的基本组成:C程序是由若干个函数构成的,至少有一个主函数main(),main()的位置可以任意,其他各函数在程序中的前后位置也是可以任意的。程序的执行总是从主函数开始,在主函数中结束。主函数是可以调用其他任何非主函数的函数,任何非主函数也可以调用其它任何非主函数。C程序的基本组成:声明区、主程序区、函数定义区。1、声明区处在程序文件的所有函数的外部,一般包含:包含头文件、宏定义、类定义、结构体定义、函数声明、全局变量声明、条件编译等。2、主程序区主程序以main()函数开始,main()函数(主函数)是程序运行时的入口,包含局部变量的声明、函数调用、一般运算、结构控制、对象与结构的处理、文件处理等。3、函数定义区函数的定义包含函数说明和函数体两部分。4、注释//或/* */为注释,不能嵌套不产生编译代码,不影响程序的执行效率。▲五、标识符1、标识符的定义:用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。2、标识符的命名规则:由字母、数字或下画线组成,并且第1个字符必须为字母或下画线。注意:标识符区分大小写,即大写字母和小写字母的通常意义不同,且不能与关键字重名。练习1_1:下列变量标识符哪些是正确的,哪些是不正确的?a3bc if a!bc _abc abc _3abc a_bc 3abc3、标识符分类:关键字、预定义标识符、用户自定义标识符。第二章 数据类型、运算符和表达式图2_1 C语言的数据类型数据类型基本类型空类型(无值类型)void构造类型指针类型实型(浮点型)联合型类型union单字符型char整型int单精度型float双精度型double字符型宽字符型w-char逻辑型bool类类型class枚举类型enum结构类型struct数组类型▲一、C语言的数据类型C语言中基本数据类型包括整型、实型、字符型、枚举类型,构造类型有数组、结构体、共用体等。⑴、基本数据类型(见P17)⑵、构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的。n 数组:是由具有相同数据类型的元素组成的集合。n 结构体:是由不同的数据类型构成的一种混合的数据结构,构成结构体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元。n 共用体:是类似于结构体的一种构造类型,与结构体不同的是构成共同体的数据成员共用同一段内存单元。n 枚举:是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。⑶、指针类型变量用于存储另一变量的地址,而不能用来存放基本类型的数据。它在内存中占据一个存储单元。⑷、类是一种数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质。 二、常量和变量⑴、常量:在程序运行的整个过程中,其值始终保持不变的量。n 整型常量:表示形式有十进制、八进制(以0开头)和十六进制(以0x或0X开头)。整型常量可以后缀字母L(或l)表示长整数,后缀字母U(或u)表示无符号整数。n 实型常量(浮点型常量):表示形式有一般形式和指数形式。实型常量缺省为double型(双精度型),如后缀f或F,则为float型(单精度型)。n 字符常量:用单撇号括起来的一个字符。如'A','*'等。转义字符:用反斜杠引导的,具有特定含义的字符(见P22表2-4),如 '\n','\367','\x8a'。注:C语言字符集中的任何一个字符均可用转义字符来表示。n 字符串常量:用双撇号括起来的字符序列。如"student","广东广州"等。n 布尔常量:false,true。 n 符号常量:² #define 宏名 常数练习2_1:下列哪些是合法的常量:①12.7f ②0986 ③0986.012 ④、0625L ⑤87U⑥-0x98C2 ⑦01a ⑧-6.87E-2 ⑨1.2e0.5 ⑩E-3 ⑾0xFF ⑿2L ⒀'\72' ⒁160 ⒂-0xffff⒃5E2.0 ⒄-0xcdf ⒅1.3E ⒆2E0 ⒇0668(21)011 (22)0xe (23)-01 (24)-0x48a (25)0x⑵变量:指程序在运行时其值可改变的量。n 变量应先定义(声明其类型和名称)后使用; n 变量定义的一般形式为: u < 数据类型 > <变名1>,<变名2>,…,<变名n>;n 在定义一个变量的同时,也可以给它赋以初值。 练习2_2以下正确的变量标识符是①3abc ②$amount ③Num_of_Student ④ if ⑤a!bc ⑥_above ⑦_abc ⑧a>b ⑨sin ⑩day▲三、运算符和表达式1、算术运算符和算术表达式注意:int i=1.2*3; //结果为3,而不是3.6。 int i=5/3结果为1。表达式17/5的结果是3,表达式17%5的结果是2。2、赋值运算符和赋值表达式注意:n 赋值运算符的结合性是从右至左的n 复合赋值运算符:int a=12; a+=a-=a*=a;(a=a+(a=a-(a=a*a)),结果为0)注意:在C语言中,定义int a=b=c=3;是错误的,而定义int a,b,c; a=b=c=3;是正确的。 练习2_3设m=9,i=3,则执行运算m%=i+1后,m的值是多少?结果1。m=m%(i+1)→m=9%(3+1)→m=1。3、关系运算符和关系表达式注意:n 关系运算符的优先级低于算术运算符。例如:a+b>c 等价于 (a+b)>c,a!=b>c等价于a!=(b>c) n “=”与“==”的区别4、逻辑运算符与逻辑表达式注意:n 逻辑非的优先级最高,逻辑与次之,逻辑或最低练习2_4 若有int a=3,b=0;则表达式a&&!b的值为1。练习2_5设有变量说明:int a=8,b=7;那么执行语句:printf("%d,%d \n",++a,b--),输出的结果是9,7练习2_6设a,b,c均为int型变量,则执行语句a=b=3;c=++a||++b;后,b的值为3。练习2_7设x、y和z都是int型变量,且x=8, y=3, z=5, 则表达式x*y/z+6-14%z的值为6。练习2_8设有定义:int x=1,y=-1;则执行语句printf("%d\n",(x--&++y);后的输出结果是0。练习2_9 设x,y,z,t均为int型变量,则执行以下语句x=y=z=1;t=++x||++y&&++z; 后,x、y、z、t的值分别为2,1,1,1。6、条件运算符表达式1?表达式2:表达式3注意:n 结合性是自右向左。a>b?a:c>d?c:d相当于a>b?a:(c>d?c:d)n 条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。如:a>b?a-b:b-a相当于a>b?(a-b):(b-a) 练习2_10设有变量说明:int x=3,y=5;那么表达式:z=x>y?x:y运算后,z的值是5。7、位运算符位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。练习2_11 int a=5,b=6;a&b=4;a|b=7;a^b=3;~b=-7;b<<2=24;b>>2=1。注:在位运算中,操作数左移三位,其结果相当于操作数乘以8。8、逗号运算符表达式1, 表达式2, ……, 表达式n注意:自左至右,依次计算各表达式的值,“表达式n” 的值即为整个逗号表达式的值。如:a = 3 * 5, a * 4, a + 5的值为20。▲四、运算符的优先级与结合性1、所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性。反之,称为右结合性。结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。2、表达式求值n 按运算符的优先级高低次序执行。例如,先乘除后加减。n 如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。例如,算术运算符的结合方向是“自左至右”,即:在执行“a – b + c”时,变量b先与减号结合,执行“a - b”;然后再执行加c的运算。练习2_12 设int x=2,y=3,z=4; 执行语句行x++;y+=1;z=x+y--以后,x,y和z的值分别是多少?答案:3,3,7练习2_13 若有定义int m=2;则逻辑表达式(m=3)&&(m= =3)的值是1。练习2_14 如果a=5,b=3,c=7,d=9,则条件表达式ab) && (n=c>d);后,n的值为2。练习2_16 如果a=5,b=3,c=7,d=9,则条件表达式am,正常输出; 3.2,根据定义和数据的输入方式,输入函数语句的正确形式为scanf("%lf%lf",&d,&f)。(scanf("%4.2lf%3.1lf",&d,&f) 或scanf("%4.2f%3.1f",&d,&f)都是错误的)练习3_2 有下列程序段int m=2, n=2;n = m++ -1;printf("%d %d\n", m ,n); 输出结果是3,1。第四章 选择结构程序设计▲一、算法1、算法的概念:算法是指为解决一个问题而采取的确定的、有限的方法和步骤。2、算法的描述方法最常用的有自然语言、流程图、N-S流程图、PAD图和伪代码等。▲二、顺序结构程序设计顺序结构是结构化程序设计中最简单、最常见的一种程序结构。顺序结构中的语句是按照书写的先后次序执行的,并且每个语句都会被执行到。练习4_1 编写一个程序,从键盘上输入一个学生5门课的成绩,计算出该学生的总成绩和平均成绩,并用自然语言描述算法。解:设变量 a、b、c、d、e分别表示学生5门课的成绩,sum表示总成绩,aver表示平均成绩, 则用自然语言描述算法如下:①输入学生5门课的成绩a、b、c、d、e;②求总成绩sum=a+b+c+d+e;③求平均成绩: aver =sum/5.0;④输出总成绩和平均成绩。程序如下:#include main(){float a,b,c,d,e,sum,aver;printf("请输入学生5门课的成绩\n");scanf("%f,%f,%f,%f,%f",&a,&b,&c,&d,&e);sum=a+b+c+d+e;aver=sum/5.0;printf("总成绩=%0.2f,平均成绩=%.2f\n",sum,aver);}练习4_2 编写一个程序,从键盘输入梯形的上底、下底和高的值(浮点数),计算并输出其面积(保留两位小数),并用N-S结构图表示算法。 解:设变量a、b、h、area分别表示梯形的上底、下底、高和面积,则用N-S结构图表示算法如下:输入梯形的上底a、下底b和高h计算梯形的面积: area=(a+b)*h/2.0输出结果。 程序如下:#include main(){float a,b,h,area;printf("请输入梯形的上底、下底和高\n");scanf("%f,%f,%f",&a,&b,&h); area=(a+b)*h/2.0;printf("梯形的面积为%0.2f\n",area);}练习4_3 编写一个程序,从键盘输入圆的半径,计算并输出圆的周长和面积(保留两位小数),用伪代码表示出算法。解:设用变量r 、length、area分别表示圆的半径、周长和面积,则用伪代码表示算法如下:BEGIN input r length=2*3.14*r area=3.14*r*r print length,areaEND程序如下:#include #define PI 3.14main(){float r,length,area;printf("请输入圆的半径\n");scanf("%f",&r);length=2*PI*r;area=PI*r*r;printf("圆的周长为%0.2f\n",length);printf("圆的面积为%0.2f\n",area);} ▲三、选择结构程序设计1、if语句⑴、if语句的一般格式 if(表达式) {语句组1;} [else {语句组2;} ]n if语句中的“表达式”必须用“(”和“)”括起来。表示程序执行的条件,常用关系运算符、逻辑运算符等表示的条件表达式,其结果只有两个值“1”或“0”(成立或不成立)。如:表示字符型变量ch是大写英文字符的C语言表达式是ch>='A'&&ch<='Z',要判断字符变量ch中的值是否为数字字符,则其表达式是ch>='0'&&ch<='9'。n else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。n 当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。⑵、if语句的执行过程n 缺省else子句时n 当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条。n 指定else子句时n 当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。⑶、if语句的嵌套与嵌套匹配原则n if语句允许嵌套。所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。n if语句嵌套时,为避免嵌套的if-else语句的二义性,C语言规定:else总是与在其之前最近的未配对的if语句组成配对关系。练习4_4:铁路托运行李,假设每张车票可按每公斤0.3元托运40公斤以内的行李,如果超过40公斤时,超过的部分每公斤加价0.5元,试编写一道计算行李托运费的程序。解:/*程序功能:计算行李托运费*/#include Void main() { float w,x; printf("输入行李的重量:"); scanf("%f",&w); if(w>40.0) x=40.0*0.3+(w-40.0)*0.8; else x=w*0.5;printf("行李重量w=%.2f公斤,托运费x=%.2f元\n",w,x); }2.switch语句⑴、switch语句的一般形式switch(表达式) { case 常量表达式1:语句组;break; case 常量表达式2:语句组;break; ...... case 常量表达式n:语句组;break; [default:语句组;[break; ]] }⑵、执行过程 n 当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。n 如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default 后面的语句(组)。然后,再执行switch语句的下一条。⑶说明n switch后面的“表达式”,可以是int、char和枚举型中的一种。n 每个case子句后面的“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。n case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以要退出switch语句,方法是使用break语句。n 各case及default子句的先后次序,不影响程序执行结果。n 多个case子句,可共用同一语句(组)n 用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。练习4_5以下程序段的输出结果是int x=7,y=8,z=9;if(x>y)  x=y,y=z;z=x;printf("%d,%d,%d\n",x,y,z);结果:7,8,7练习4_6 以下程序的输出结果是#include void main(){ int m=5;if(m++>5)printf("%d\n",m);elseprintf("%d\n",m--);}结果:6练习4_7 以下程序的输出结果是#include void main(){int k=1,x=0,y=0;switch(k){case 0:y++;case 1:x++;case 2:x++;y++;}printf("x=%d,y=%d\n",x,y);}结果x=2,y=1第五章 循环结构程序设计▲一、循环程序设计1、while语句⑴、一般格式 while(循环继续条件) { 循环体语句组;}⑵、执行过程①求解“循环继续条件”表达式。如果其值为非0,转②;否则转③。②执行循环体语句组,然后转①。③执行while语句的下一条。练习5_1:/*程序功能:求1~100的累计和*/#include void main() { int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/ while( i<=100 ) { sum += i;/*实现累加*/ i++;/*循环控制变量i增1*/ }printf(“sum=%d\n”,sum); }程序运行情况如下:sum=50502、do-while语句(直到型循环)⑴、一般格式 do { 循环体语句组; } while(循环继续条件);/*本行的分号不能缺省*/当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。⑵、执行过程①执行循环体语句组。②计算“循环继续条件”表达式。如果“循环继续条件”表达式的值为非 0(真),则转向①继续执行;否则,转向③。③执行do-while的下一条语句。⑶、do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。因此do......while语句不论条件是否成立,至少要执行一次循环体。练习5_2:用do-while语句求解1~100的累计和。/*程序功能:求1~100的累计和*/main() { int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/ Do { sum += i; /*累加*/ i++; }while(i<=100);/*循环继续条件:i<=100*/ printf(“sum=%d\n”,sum); }3、for语句⑴、for语句的一般格式 for([变量赋初值];[循环继续条件];[循环变量增值]) { 循环体语句组;}⑵、for语句的执行过程①求解“变量赋初值”表达式。②求解“循环继续条件”表达式。如果其值非0,执行③;否则,转至④。③执行循环体语句组,并求解“循环变量增值”表达式,然后转向②。④执行for语句的下一条语句。⑶、说明①“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。②当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。③“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。例如,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)。for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。练习5_3:求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 ! = %ld\n", n, fact); }程序运行情况如下:Input n: 5↙5 ! = 120练习5_4 有以下程序#include void main(){int a=10,b=10,i;for(i=0;a>8;b=++i)printf("%d %d ",a--,b);}程序输出的结果是10 10 9 1练习5_5 有以下程序#include void main(){int k;for(k=0;k<10;k++);printf("%d",k);}答案:10练习5_6以下程序的运行结果是#include void main(){int m;for(m=1;m<=50;m++){if(m%12!=0) continue; printf("%4d",m);} printf("\n");}答: 12 24 36 484、循环的比较⑴、While和 for都是先判断后循环,而do-while是先循后判断。即do-while语句在条件不成立时循环体也要被执行一次。⑵、while和do-while语句的条件表达式只有一个,只起到控制循环结束的作用,循环变量的初值等都用其他语句完成;for语句则有3个表达式,不仅能起到控制循环结束的作用,还可给循环变量赋初值。练习5_7 对于以下程序段int m=-1;do{ m=m*m;}while(!m);循环执行的次数为多少?答:1次。练习5_8 对于以下程序段int k=5; while (k=0) k=k-1; printf("%d\n",k);,循环体执行的次数为多少次?答:0次。练习5_9 对于以下程序段int a=5;while(a>=1) a--;程序执行后,a的值是0。练习5_10以下程序#include void main(){int i;for(i=0;i<10;i++);printf("%d",i);}输出结果是10。5、循环的嵌套⑴、循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。⑵、for语句和while语句允许嵌套,do-while语句也不例外。练习5_11:编程: 输出下列图形 * *** ***** ******* *********解:/*程序功能:打印5行"*",第一行1个,第二行3个,第三行5个...*/#include void main(){ int i=1; while(i<=5) { int j=1,k=1; while(j<=5-i) { printf(" "); 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只是结束本次循环。③循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。练习5_12 求Fibonacci数列前12项的和。解:每月新增兔子数Fn={1,1,2,3,5,8,13,21,34,…}(斐波那契数列)月份n 兔子数Fn 1 F1=1 2 F2=1 3 F3=2=F1+F2 4 F4=3=F2+F3 …n Fn=Fn-1+Fn-2 由此可写出递推公式1 (n=1)F(n)= 1 (n=2) F(n-1)+ F(n-2) (n>3) 程序代码如下:#includevoid main(){ int F1=1,F2=1; int F,S=2,n=3; while(n<=12) { F=F1+F2; F1=F2; F2=F; S=S+F; n++; } printf("S=%d\n",S); }第六章 数组数组是数目固定、类型相同的若干变量的有序集合。▲一、一维数组1、一维数组的定义:数据类型 数组名[常量表达式][, 数组名2[常量表达式2]……];n “数据类型”是指数组元素的数据类型。n 数组名,与变量名一样,必须遵循标识符命名规则。n “常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。n 数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。n 数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。注:数组名能与其他变量名相同,数组名后是用方括号括起来的常量表达式,不能和圆括号。2、数组元素的引用引用数组中的任意一个元素的形式: 数组名[下标表达式]n “下标表达式”可以是任何非负整型数据,取值范围是0~(元素个数-1)。n 1个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。n 在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理。⑶、一维数组元素的初始化n 初始化格式:数据类型 数组名[常量表达式]={初值表}n 如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。n “初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。3、数组元素的存储数组元素在计算机内存中存储时,占据一片连续的存储空间,数组名代表数组元素占据的内存空间的首地址。由于数组各元素的数据类型相同,因此在数组中,每一个元素在内存里占用的存储单元数都是相同的。练习6_1:从键盘上任意输入n个整数,用冒泡法按从小到大地排序,并在屏幕上显示出来。解:冒泡法排序的基本思想:从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。#include "stdio.h"#define NUM 10/*定义符号常量(数据个数N)*/main(){ int data[NUM];/*定义1个1维整型数组data*/ int i,j,temp;/*定义循环变量和临时变量*/ printf("请输入10个整数:\n"); for(i=0; ii; j--) /*内循环:进行每趟比较*/ if(data[j]main(){int i,j,min;float temp,ave=0;float a[11];printf("\n输入评委所打的分数:\n");for(i=1;i<=10;i++)scanf("%f",&a[i]); /*选择法排序*/for(i=1;i<=9;i++)/*外循环:控制比较趟数*/{min=i;for(j=i+1;j<=10;j++) /*内循环:每趟比较的次数*/if(a[min]>a[j])min=j;temp=a[i];a[i]=a[min];a[min]=temp;}for(i=2;i<=9;i++) /*注意i值的变化范围*/ave=ave+a[i];printf("去掉一个最低分:%6.1f分\n",a[1]);printf("去掉一个最高分:%6.1f分\n",a[10]);printf("选手最后得分:%6.1f分\n",ave/8);}二、二维数组1、二维数组的定义: 数据类型 数组名[行常量表达式][列常量表达式][, 数组名2[行常量表达式2][列常量表达式2]……];n 数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推。n 设有一个m*n的数组x,则第i行第j列的元素x[i][j]在数组中的位置为:i*n+j(注意:行号、列号均从0开始计数)。2、二维数组元素的引用引用2维数组元素的形式为:数组名[行下标表达式][列下标表达式]n “行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。n “行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x[3][4],则可用的行下标范围为0~2,列下标范围为0~3。n 对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的2维数组元素。3、二维数组元素的初始化n 按行赋初值数据类型 数组名[行常量表达式][列常量表达式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};赋值规则:将“第0行初值表”中的数据,依次赋给第0行中各元素;将“第1行初值表”中的数据,依次赋给第1行各元素;以此类推。n 按2维数组在内存中的排列顺序给各元素赋初值数据类型 数组名[行常量表达式][列常量表达式]={初值表};赋值规则:按2维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。如果对全部元素都赋初值,可以省略“行数”,但不能省略“列数”。注意:只能省略“行数”。练习6_5 执行int a[][3]={1,3,5,7,9,11};语句后,a[1][0]的值是7。练习6_6 以下对二维数组a进行正确初始化的是 A.int a[2][3]={{1,2},{3,4},{5,6}}; B.int a[][3]={1,2,3,4,5,6};C.int a[2][]={1,2,3,4,5,6}; D.int a[2][]={{1,2},{3,4}};三、字符数组1、字符数组的定义n 1维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样。n 2维字符数组,用于同时存储和处理多个字符串,其定义格式与2维数值数组一样。2、字符数组的初始化字符数组的初始化,可以通过为每个数组元素指定初值字符来实现。3、字符数组的引用 字符数组的逐个字符引用,与引用数值数组元素类似。n 字符数组的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用getchar()或scanf()函数输入字符。n 字符数组的输出 字符数组的输出,可以用putchar()或printf()函数。四、字符串及其结束标志所谓字符串,是指若干有效字符的序列。C语言中的字符串,可以包括字母、数字、专用字符、转义字符等。C语言规定:以‘\0’作为字符串结束标志(‘\0’代表ASCII码为0的字符,表示一个“空操作”,只起一个标志作用)。因此可以对字符数组采用另一种方式进行操作了──字符数组的整体操作。注意:由于系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。另外,由于结束标志也要在字符数组中占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。1.字符数组的整体初始化字符串设置了结束标志以后,对字符数组的初始化,就可以用字符串常量来初始化字符数组。2.字符数组的整体引用n 字符串的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用scanf()函数输入字符串。n 字符串的输出printf()函数,不仅可以逐个输出字符数组元素,还可以整体输出存放在字符数组中的字符串。五、常用的字符串处理函数字符串标准函数的原型在头文件string.h中。1、输入字符串──gets()函数①调用方式:gets(字符数组)②函数功能:从标准输入设备(stdin)──键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去。③使用说明n gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。n 该函数输入的字符串中允许包含空格,而scanf()函数不允许。2.输出字符串──puts()函数①调用方式:puts(字符数组)②函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用‘\n’取代字符串的结束标志‘\0’。所以用puts()函数输出字符串时,不要求另加换行符。③使用说明n 字符串中允许包含转义字符,输出时产生一个控制操作。n 该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。3、字符串比较──strcmp()函数①调用方式:strcmp(字符串1 ,字符串2)其中“字符串”可以是串常量,也可以是1维字符数组。②函数功能:比较两个字符串的大小。如果:字符串1=字符串2,函数返回值等于0; 字符串1<字符串2,函数返回值负整数; 字符串1>字符串2,函数返回值正整数。③使用说明n 如果一个字符串是另一个字符串从头开始的子串,则母串为大。n 不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。4、拷贝字符串──strcpy()函数①调用方式:strcpy(字符数组, 字符串)其中“字符串”可以是串常量,也可以是字符数组。②函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。③使用说明n 字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志'\0'一起复制。n 不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。5.连接字符串──strcat()函数①调用方式:strcat(字符数组, 字符串)②函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。③使用说明n 由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。n 连接前两个字符串都有结束标志'\0',连接后“字符数组”中存储的字符串的结束标志'\0'被舍弃,只在目标串的最后保留一个'\0'。6.求字符串长度──strlen()函数(len是length的缩写)①调用方式:strlen(字符串)②函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。练习6_7 执行 char str[10]= "I am a teacher\0";strlen(str)后的结果是14。7.将字符串中大写字母转换成小写──strlwr()函数①调用方式:strlwr(字符串)②函数功能:将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换。8.将字符串中小写字母转换成大写──strupr()函数①调用方式:strupr(字符串)②函数功能:将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。第七章 函数▲一、函数的定义与调用1、函数的定义任何函数(包括主函数main())都是由函数说明和函数体两部分组成。根据函数是否需要参数,可将函数分为无参函数和有参函数两种。⑴、无参函数的一般形式 函数类型 函数名( void ) { 说明语句部分; 可执行语句部分; }注意:在旧标准中,函数可以缺省参数表。但在新标准中,函数不可缺省参数表;如果不需要参数,则用“void”表示,主函数main()例外。⑵、有参函数的一般形式函数类型 函数名( 数据类型 参数[,数据类型 参数2……] ) { 说明语句部分; 可执行语句部分; }有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。练习7_1:定义一个函数,用于求两个数中的大数。解:/*功能:定义一个求较大数的函数并在主函数中调用*/int max(int n1, int n2) /*定义一个函数max()*/ { return (n1>n2?n1:n2); }main(){int max(int n1, int n2);/*函数说明*/ int num1,num2; printf("input two numbers:\n"); scanf("%d%d", &num1, &num2);printf("max=%d\n", max(num1,num2));}⑶、说明①函数定义不允许嵌套(但函数的调用可以嵌套)。在C语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。②空函数──既无参数、函数体又为空的函数。其一般形式为:[函数类型] 函数名(void) { }③在老版本C语言中,参数类型说明允许放在函数说明部分的第2行单独指定。 2、函数的返回值与函数类型⑴.函数返回值与return语句有参函数的返回值,是通过函数中的return语句来获得的。①return语句的一般格式: return ( 返回值表达式 );②return语句的功能:返回调用函数,并将“返回值表达式”的值带给调用函数。注意:调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空)类型”。⑵.函数类型函数的类型说明符指明了函数的类型,它实际上是函数返回值的类型。如果不要求函数有返回值,函数的类型说明符可以写为void,如果缺省,C语言函数返回类型的默认定义类型是int型。在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致。如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。即:在C语言中,函数返回值的数据类型取决于在定义该函数时所指定的数据类型。3、对被调用函数的说明和函数原型在ANSI C新标准中,采用函数原型方式,对被调用函数进行说明,其一般格式如下:函数类型 函数名(数据类型[ 参数名][, 数据类型[ 参数名2]…]);C/C语言同时又规定,在以下3种情况下,可以省去对被调用函数的说明:①当被调用函数的函数定义出现在调用函数之前时。因为在调用之前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。②如果在所有函数定义之前,在函数外部(例如文件开始处)预先对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明。③当一个函数是int类型时,它与被调用者的前后位置关系可以忽略,可以省略对被调函数的说明。4、函数的调用 一般形式为: 函数名([实际参数表]) 切记:实参的个数、类型和顺序,应该与被调用函数所要求的参数(形参)个数、类型和顺序一致,才能正确地进行数据传递。⑴、调用函数方式:①函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。②函数语句。C/C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句。③函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。⑵、说明:①调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。②实参在类型上按顺序与形参,必须一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不到正确的结果。③如果实参表中包括多个参数,对实参的求值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反。Turbo C和MS C是按自右向左的顺序进行的 。练习7_2 写出以下程序运行的结果#include void main(){int x=2,y=5;int max(int, int);max(x,y);printf("max=%d\n",max(x,y));}int max(int a,int b){int temp;if(a>b)temp=a;elsetemp=b;return temp;}运行结果:max=55、函数的形参与实参⑴、函数的参数分为形参和实参两种,作用是实现数据传送。形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。 练习7_3:实参对形参的数据传递。/*实参对形参的数据传递。*/void main(){ void s(int n); /*说明函数*/ int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ printf("n_s=%d\n",n); /*输出调用后实参的值,便于进行比较*/ }void s(int n) { int i; printf("n_x=%d\n",n); /*输出改变前形参的值*/ for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/ printf("n_x=%d\n",n); /*输出改变后形参的值*/ }⑵、说明:①实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。②形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。③实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。④实参和形参占用不同的内存单元,即使同名也互不影响。6、函数的嵌套调用和递归调用⑴、函数的嵌套调用 指在执行被调用函数时,被调用函数又调用了其它函数。如图所示:⑵、函数的递归调用函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。练习7_4 用递归函数解决猴子吃桃问题。问题描述如下:有一堆桃子不知其数,猴子每天吃前一天的一半多一个,到第十天只剩一个,试编程求这堆桃子的个数。解:设第n天的桃子数为x(n),则根据题意可写出递归公式 1 (n=10)x(n)= (x(n+1)+1) * 2 (n<10) 据此可以写出递归函数。程序代码如下:#include void main(){int x(int n);printf("第一天的桃子数为:%d\n",x(1));} int x(int n){int total;if(n==10)total=1;else total=(x(n+1)+1)*2;return total;} 二、变量的作用域、局部变量与全局变量变量的作用域是指变量在程序中的有效范围。C语言中的变量,按作用域范围可分为两种:局部变量和全局变量。⑴、局部变量(内部变量)在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称“局部变量”。 局部变量的作用域被限定在其所定义的局部范围中。⑵、关于局部变量的作用域还要说明以下几点:①主函数main()中定义的变量是内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系
展开阅读全文
  语墨文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:C语言-复习计划提纲记要.doc
链接地址:http://www.wenku38.com/p-145399.html

                                            站长QQ:1002732220      手机号:18710392703    


                                                          copyright@ 2008-2020 语墨网站版权所有

                                                             经营许可证编号:蜀ICP备18034126号

网站客服微信
收起
展开