1、通达学院 科学与技术协会高级语言程序设计总复习课程的全部内容可分为五大模块:(1) 基础知识(2) 三种基本结构及流程控制(3) 函数(4) 数据类型(5) 文件下面按这五大模块分别作回顾模块一:基础知识部分需要掌握的知识要点:(1)冯诺依曼体系结构的计算机组成:运算器、控制器、存储器、输入设备、输出设备,以及各部分的主要功能。(2)C 语言程序的组成:由一个或多个文件组成,每个文件由一个或多个函数组成,函数是 C 程序的基本单位,一个程序有且只有一个 main( )函数,这是程序的入口函数(3)从 C 的源程序到可执行的文件的全过程:编辑、编译、链接最后才能运行,各阶段生成的文件扩展名分别为
2、:.c、.obj、.exe,头文件的扩展名:.h(4)函数的组成:函数首部和函数体,函数中可有注释行/* */ (5)编译预处理有三种:文件包含、宏、条件编译:预处理命令行都必须以“#”号开始宏定义#define 宏名 串也是一种编译预处理,取消宏定义用:#undef 宏名 C 程序中定义一个符号常量是借助于宏定义实现的,例如: #define NUM 35 注意:不在行末加分号,因为在对源程序编译过程中(不是运行时)进行宏替换时,将宏所代表的字符串原样替换进去,有时加了分号是要出错的,例如: int arrNUM 。宏替换因为只在编译时进行,所以不占运行时间,只占编译时间带参数的宏可以完成一
3、些简单函数的功能,例如:#define MUL(x,y) x*y主函数中如果有变量定义如下:int a=2,b=3,c;用形如:c= MUL(a,b);实现求 a、b 的乘积。但是请大家思考,如果用c= MUL(a+2,b+5),则变量 c 的值为?因此,一般将宏中的参数在所定义的串中打上括号,如:#define MUL(x,y) (x)*(y)再求 c= MUL(a+2,b+5)(6)C 程序中的六种符号:关键字、标识符、运算符、分隔符、其它符号、数据(包括常量和变量)熟记所有常见关键字,关键字中最多的是流程控制语句中的关键字,如:for、while、do、if、else、switch、ca
4、se、default、break、continue、goto、return等,还有一大类是变量类型及存储类别的,如:int、short、long、signed、unsigned、char、double、float、enum、union、struct、typedef、static、register、auto、extern,还有一些如:void 、sizeof 等;能正确定义标识符(在程序中,符号常量名、变量名、函数名都是用户自定义标识符) ,自定义标识符的正确与否可从以下几方面判断:是否以字母或下划线开头;是否是只有字母、数字、下划线的序列是否选用了关键字练习:下列哪一个是合法的用户自定义标识符
5、_。A、_do_while; B、begin?end; C、for; D、1st_run;通达学院 科学与技术协会掌握所有的运算符及其优先级、结合方向及特殊的运算规则:34 种运算符的优先级关系大致为: 、( )、-、.-一元运算符-乘除类算术运算符-加减类算术运算符-移位运算符- 有大小关系的关系运算符 -等与不等的关系运算符-位运算符-逻辑与- 逻辑或 -条件运算符- 各种赋值运算符-逗号运算符。结合方向:一元运算符、条件运算符、赋值运算符三种为自右向左结合,其它均为自左向右结合能改变变量值的运算符:赋值、+、- -,注意前后+、- -的区别具有特殊运算规则的运算符:逻辑与 x/=(a=4
6、,b=a*5,b+)+9 执行后,变量 a、b、x 的值分别是多少?表达式的值呢?2、if (!x) 此处!x 相当于 x= =0if (x) 此处 x 相当于 x! =0常量与变量:常量是其值不可变化的量,有两种表现形式:字面常量和符号常量,C 是定义符号常量只有一种方法:#define 常量名 串C 中的字面常量有五种:整型常量、实型常量、字符常量、字符串常量、枚举常量(不作要求)整型常量有三种合法制式:十、八(如 012) 、十六(如 0xa3),另外还可以有 L(l) 、U(u)作后缀,分别表示长整型及无符号常量实型常量有两种表示形式:小数形式、指数形式,注意:小数形式要求一定要有小数
7、点,小数点前面或后面的数字可以缺省;指数形式一定要有 E(e) ,并且在其左边一定是合法的整数或小数形式的实数,右边必须是合法的整数。字符常量是以一对单括起的单个字符(191错) ,需要特别注意的是以右开头的转义字符的三种形式:n 、 121、 xa5,记住A 、 a、 0、 n的 ASCII 码分别为:65、97、48、10,字符常量的大小就是其 ASCII 码值的大小小写转大写:ch=ch-32;大写转小写:ch=ch+32;字符串常量是以一对双“括起的 0 个或多个字符,需要特别注意字符串的长度与字符串所占的字节数之间相差 1练习:1、字符串“12t345r489“的长度是_,占_字节。
8、2、char c=m;c=c-35;putchar(c);的输出结果是_3、下列哪一个不是合法的常量A、027 B、2.5e2.5 C、 0xfdaL D、10.e+0变量:在程序运行过程中其值可变的量,需要先定义后使用。每一个变量都具有:变量名、变量的当前值、变量的地址、变量的存储属性,指针变量中存的是地址,其余变量中存放的是值。在所有函数之外定义的变量称为全局变量,其作用域为定义点开始到程序结束(去掉含同名局部量的作用区域) ;在函数内部定义的变量称为局部变量(形式参数也是局部变量) ,通达学院 科学与技术协会局部变量分 auto(默认)和 static 两种,前者是在函数被调用时分配空间
9、,每次函数执行完毕后将不再存在,但是 static 型的局部变量在函数第一次被调用时进行分配空间,只初始化一次,每次函数执行完毕后将继续存在,但是只在本函数中才起作用,因此这种变量的读程序题一定要注意!练习:#include int cal(int n) static int f=20;f+=n;return f;void main ( )int i;for(i=1;i,则对应的输入语句是什么?2、float v1234.5678;,输出格式为:输出总宽度为 10,精度为 3,则应使用语句printf(_);实现;若输出语句为:printf(“%.3f”,v); ,输出的内容为:_(2)选择结
10、构:用 if.else、switch 语句配合复合语句、 break 语句控制实现。If 语句有三种形式:单分支 if、双分支 if、嵌套 if,注意 else 应与其前最靠近的未匹配过的 if 相对应,而与对齐的形式无关,每一个 else 实际上都隐含了一个条件,要充分利用这些条件分析程序;if 后的条件通常是关系表达式,但是实际上可以是任何表达式,仅以该表达式是 0 或非 0 来判断条件的假和真。注意:if ( )及 else 后面都只能控制一条语句,经常需要用到复合语句。switch 语句中特别要注意的是:( 1)switch 后面的表达式类型应当为整型、字符型、枚举型,而不可以是 fl
11、oat 或 double 型,因为表达式的取值必须是离散值。(2)找到与表达式匹配的常量后开始执行,直到遇到 break 或语句结束才会停止。因此每一个分支后如果没有及时用 break,则继续向下执行,这样,switch 结构可以选择多个分支执行(3)这些常量的顺序调整不影响程序的正确性,只要每个分支执行的功能固定就可以了。通达学院 科学与技术协会练习:1、已知变量 tf 为整型,下面的条件语句中,五种表达有一种与其它四个不等价,它是?A、 if (tf ) 语句 1; else 语句 2; B、if ( tf=0 ) 语句 2; else 语句 1;C、if (tf!=0 ) 语句 1; e
12、lse 语句 2;D、if (!tf ) 语句 2; else 语句 1;E、if (tf=1 ) 语句 1; else 语句 2;2、设以下所有变量均为整型,下列程序所实现的分段函数是?if (x0) y=1; else y=0;if (xb)c=a;a=b;b=c;4、设有声明 int a=1, b=2,则下面程序段的输出结果是? 如果是内层的每个 case 后有break,而外层没有 break,输出结果是?switch (a)case 1:printf(“#n“);switch (b)case 1: printf(“*n“); case 2: printf(“*n“); case 3:
13、 printf(“*n“); break;case 2: printf(“#n“); break;(3)循环结构:常用 while、 dowhile、for 三种流程控制语句实现,注意 while 和 for 属于当型循环,dowhile 属于直到型循环,若 while 后的条件为非 0 则继续循环,若为 0 则通达学院 科学与技术协会结束,三种循环是可以相互转化的。这里特别强调的是:循环的退出一般是条件为 0(for的表达式 2,如果表达式 2 缺省,则表示永真条件、while 或 do while 后的表达式就可以表示条件,如:while (A) ,这就是一个永真条件)时不进入循环体,但是
14、在循环体内也可以用一定条件下的 break 语句退出本层循环。如果表示条件的表达式值永远不可能为0,则为一个死循环,这一点要注意!在循环语句中可以用 break 表示退出本层次循环、continue 表示忽略本次循环体中的后续语句,重新开始下一次循环条件的判断,以便决定是否要继续循环。循环体只有一条语句,注意复合语句的正确使用,不要误用分号形成循环体为空语句,例如:for (i=0;i头文件中练习:1、若已有定义 int i,则对于如下循环语句,循环体执行的次数分别为 _。for( i=0 ; ; i+ )printf(“%d “,i);for( ; i=0 ; i+ )printf(“%d
15、“,i);for( i=0 ; i void main()int x=1,y=2;for(;x7 )通达学院 科学与技术协会printf(“x=%d y=%dn“,x,y);break;if ( x= =6 ) continue;y *= x;这一模块中有很多经典算法,下面几个是同学们必须非常熟悉的:(1) 质数问题 判断一个整数是否为质数(用一层循环可以解决)会定义函数实现,函数原型:int prime(int n); 判断参数 n 是否为质数,如果是,返回1,如果不是,返回 0。 找出一定范围内所有的质数(用两层循环可以解决)会定义函数实现,函数原型:void prime(int low,
16、int high); 找出从 low 到 high 范围内的所有质数,是质数则输出。如果函数需要返回该范围内的质数个数,则应该将返回值类型修改为 int。能按一定的格式输出(2)求最大公约数问题可以用辗转相减或相除的方法都可以得到。会定义函数实现,函数原型:int gcd(int m,int n);在辗转相除法中,当余数为 0 时的除数即为最大公约数,注意循环控制方式的不同可能导致返回值的不一样。求最小公倍数:a*b/gcd(a,b)(3)求和问题:掌握求和问题中条件的控制方式、累加的方式: 可以根据求和的项数要求来求解,例如:求 100 项之和; 可以根据每一项的精度进行求解,例如:求到这一
17、项的绝对值不超过 1E-6 为止,注意这时的循环条件应该为:while(fabs(term)=1E-6), 如果用 do.while 循环,条件也是这样表示。 注意分子、分母、当前项、和分别用一个变量表示,正确定义变量的类型,通达学院 科学与技术协会正确解决变符号问题:s=-s;(4)输出规则图形式问题分析行号与当前行前导空格数、符号个数、符号形状之间的关系,正确控制换行。(5)利用循环可以控制输入数据的范围,这在实验三的 P23 页。int a,b;do scanf(”%d%d”, while (ab|b1000);实现输入的 a,b 范围是:10long fun (int n) stati
18、c long s;if (n= =0 | n= =1) s = n;else s = n+ fun( n-1 );return s;void main ( )int i;for (i=1;is2,而应该用 strcmp(s1,s2)0)、字符串的赋值、字符串的连接等。算法:首先要理解一维数组名作实参和形式能数传地址的实质;掌握在一维数组中:输入数组所有元素、输出数组所有元素、寻找最大数、最小数、求元素的平均值、查找某一个值是否是数组中的元素、数组元素逆置、某种常见排序算法等。数组元素实际个数随着输入动态统计的方法:应当设定一个输入结束标志,在输入该标志之前的元素都依次作为数组的有效元素,该标志
19、不计入内,用如下代码输入以-1 为结尾标志的数组并输出所有的有效元素:#include void main()int a100,num=0,i=0;do scanf(“%d“,while (ai-1!=-1);num=i-1;for (i=0;iint f (int *a, int num, int x); void main( ) int a10=8,6,17,29,34,5,7,23,2,1;int pos;pos=f (a,10,7);printf(“%d“,pos+1);int f (int *a, int num, int x) int i;for (i=0; iy 的值为_ , +
20、(pt-x) 的值为_, +pt-x 的值为_、(*pt).y 的值为_。2、以下对结构体变量 stu 中成员的非法引用是_。struct Pointint x;int y; pos, *p=A、pos.x B、(*p).y C、p-x D、Point.y作为函数参数,通常定义结构体的指针作为形式参数,将实参结构体变量的地址传入,这样省时效率高,而且可在被调函数中修改对应实参结构体成员的值练习:下列程序的运行结果是?#include typedef struct Student char name10;double score; STU;void f (STU *s) (*s).score*=
21、20;printf(“%s %.1fn“, s-name, (*s).score);void main() STU stu=“LiuBo“, 4.5, “JiWei“, 4.6, “Lijie“, 5.0;f (stu+1);printf(“%s %.1fn“, stu-name, (*stu).score);利用结构体和指针的递归定义可以实现单链表例:struct nodeint data;struct node *next; *head;在单链表中,最重要的是头指针的信息,头指针用于指向单链表的第一个结点处,顺着链依次寻找其它的结点,单链表不可随机访问其中的结点,最后一个结点的指针域置为空
22、理解单链表的遍历、插入一个结点、删除一个结点等方法。通达学院 科学与技术协会练习:1、设以下程序的所有的指针均为上面 struct node*变量,已知 head 为头指针,指针 p 指向了单链表中的某一个结点处,但肯定不是指向第一个结点和最后一个结点,指针 q 指向了某一个结点处,该结点不在链表中,下面的代码实现的功能是_? (方法提示:根据描述先画出单链表示意图来)p=p-next; s-next=p-next; p-next=s;如果 p 指向的是链表中倒数第二个结点处,则上面代码实现的功能为_,这时代码还可以写成_?下面的代码的功能是_?p-next =p-next-next; del
23、ete p-next;下面的代码的功能是_?for (p=head; p ; p=q) q=p-next; delete p; 下面的代码的功能是_?p=(struct node*)malloc(sizeof(struct node);p-data=x;p-next=head;head=p;2、链表中的结点的形成可以有两种方式,一种是静态的,即定义了结构体变量,只是将不同变量的 next 域作了连接,另一种是利用 malloc( )函数逐个申请动态空间,再进行指针间的连接。下面程序代码的运行结果是:void main() struct nodeint data;struct node *nex
24、t *head,*p , a,b,c;int j;a.data=10; b.data=20; c.data=30;b.next= c.next= a.next=0;head= p=head-next;printf(“%d n“, p-data);动态申请一个结点空间:p=( struct node*)malloc(sizeof(struct node),然后才能执行:p-data=;p-next=;可以利用指针生成动态数组空间,例如:int *p;p=(int *)malloc(sizeof(int); /*申请一个 int 空间*/p=(int *)malloc(2*sizeof(int);
25、 /*申请 2 个连续的 int 空间,实现动态一维数组*/p=(int *)calloc(2, sizeof(int); /*申请 2 个连续的 int 空间,实现动态一维数组*/通达学院 科学与技术协会模块五:文件C 语言中的文件的组成及分类:C 中的文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件C 文件打开的方式:基本方式: r(只读) w(只写)、a(追加) 后面可以加上+表示可读可写(注意,如果打开一个新文件可读可写,则一定是 w+;如果打开一个旧文件可读可写,则一定是 r+) 、加上 b 表示打开二进制文件,否则默认是对文本文件操作注意:文件的操作步骤:(1) 定
26、义 FILE*文件指针,一个文件对应一个指针(2) 利用文件指针打开文件 fp=fopen(文件名,打开方式),注意文件名要用双引号括起,并且路径之间用,打开方式也要用双引号括起(3) 进行文件读写操作,一般用 fgetc(fp,c)来从已有文件中获取一个字符,用fputc(fp,c)向 fp 所对应的文件中写入一个字符,该操作往往要用循环条件控制执行。用 fwrite 和 fread 实现数据块的读写,这在内存变量为结构体类型时特别有用,例如:struct nodeint x,y;s10=2,3,1,8; int i;FILE *fp=fopen(“c:ABC.dat”,wb);fwrite
27、(s,sizeof(struct node),10,fp);则可以实现一次将 s 数组的 10 个结构体元素写入到文件 ABC.dat 中,以上还可以用下面的语句实现写入: fwrite(s,10*sizeof(struct node),1,fp);for (i=0;i#include void main( )FILE *fp;char ch;if ( (fp=fopen(“c:aaa.txt“,“r“)=NULL)通达学院 科学与技术协会printf(“cannot open this file“);exit(0);while(!feof(fp) ch=fgetc(fp);putchar(ch);fclose(fp);思考:(1)如果需要逆序在屏幕上显示原文件的内容,上述程序如何修改?(2)若将文件 c:aaa.txt 原样复制到 D 盘下作为 bbb.txt,程序该如何修改?(3)若只将文件 c:aaa.txt 中的字母复制到 D 盘下作为 bbb.txt,程序该如何修改?(4)若将文件 c:aaa.txt 中的字母都转变为小写字母复制到 D 盘下作为bbb.txt,程序该如何修改?(5)若将文件 c:aaa.txt 连接到 D:ccc.txt 后面,程序应该如何修改?