C语言选择题知识点复习资料.doc_第1页
C语言选择题知识点复习资料.doc_第2页
C语言选择题知识点复习资料.doc_第3页
C语言选择题知识点复习资料.doc_第4页
C语言选择题知识点复习资料.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

全国计算机等级考试注意事项及复习资料(内部资料,翻版必究)新视野培训教学研究组 编2013年下半年全国计算机等级考试复习资料(一)、C语言部分1、C语言的基础知识1)合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。有其它元素就错了。并且第一个必须为字母或则是下划线。第一个为数字就错了。 关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。2)实型数据的合法形式:2.333e-1 就是合法的,且数据是2.33310-1。考试口诀:e前e后必有数,e后必为整数。.3)字符数据的合法形式:: 1 是字符占一个字节,1是字符串占两个字节(含有一个结束符号)。 0 的ASCII数值表示为48,a 的ASCII数值是97,A的ASCII数值是65。一般考试表示单个字符错误的形式:65 1字符是可以进行算术运算的,记住:0-0=48大写字母和小写字母转换的方法:A+32=a 相互之间一般是相差32。4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。5)转义字符的考查: 在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。 在程序中 int a = 06d, 是一个八进制的形式。 在转义字符中,x6d 才是合法的,0不能写,并且x是小写。 141 是合法的, 0是不能写的。 108是非法的,因为不可以出现8。6)算术运算符号的优先级别: 同级别的有的是从左到右,有的是从右到左。7)强制类型转换: 一定是 (int)a 不是 int(a),注意类型上一定有括号的。 注意(int)(a+b) 和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。8)表达式的考查: 是表达式就一定有数值。 赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。 自加、自减表达式:假设a=5,+a(是为6), a+(为5);运行的机理:+a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个+a表达式的数值为6,而a+是先用该表达式的数值为5,然后再把a的数值加上1为6,再放到变量a中。 进行了+a和a+后 在下面的程序中再用到a的话都是变量a中的6了。 考试口诀:+在前先加后用,+在后先用后加。逗号表达式:优先级别最低 ; 表达式的数值逗号最右边的那个表达式的数值。 (2,3,4)的表达式的数值就是4。例题:main() int x,y,z;x=y=1; z=x+,y+,+y;printf(“%d,%d,%dn”,x,y,z);程序运行后的输出结果是A) 2,3,3 B) 2,3,2 C) 2,3,1 D) 2,2,19)位运算的考查: 会有一到二题考试题目。 总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。 例1:char a = 6, b; b = a2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。 例2:一定要记住,异或的位运算符号。0 异或 1得到1。 0异或 0得到0。两个女的生不出来。 1 异或 1得到0。两个男的生不出来。考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。 例3:在没有舍去数据的时候,右移一位表示除以2。10)018的数值是非法的,八进制是没有8的,逢8进1。 11)%符号两边要求是整数。不是整数就错了。12)三种取整丢小数的情况:1、int a =1.6; 2、(int)a; 3、1/2; 3/2;13)字符型和整数是近亲: char a = 65 ; printf(“%c”, a); 得到的输出结果:aprintf(“%d”, a);得到的输出结果:652、输入和输出1)printf函数的格式考查: %d对应整型;%c对应字符;%f对应单精度等等。宽度的,左对齐等修饰。 %ld对应 long int;%lf 对应double。2)scanf函数的格式考察: 注意该函数的第二个部分是&a 这样的地址,不是a; scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。3)putchar ,getchar 函数的考查: char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。 putchar(y)把字符y输出到屏幕中。4)如何实现两个变量x ,y中数值的互换(要求背下来) 不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来) 这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。 main() double hui;int xy; scanf(“%f”,&hui);scanf(“%d”,&xy); printf(“%f,%d”,hui,xy);如果从键盘上输入的数据的值是:23 回车 34.789回车,则最后的输出结果是: 3、选择结构 特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。1)关系表达式: 表达式的数值只能为1(表示为真),或0(表示假) 当关系的表达是为真的时候得到1。如 98这个是真的,所以表达式的数值就是1;2)逻辑表达式: 只能为1(表示为真),或0(表示假)a) 共有& | ! 三种逻辑运算符号。b) !&| 优先的级别。c) 注意短路现象。考试经常考到。 d) 要表示 x 是比0大,比10小的方法。0x10是不可以的(一定记住)。是先计算0x 得到的结果为1或则0;再用0,或1与10比较得到的总是真(为1)。所以一定要用 (0x)&(xbc)printf(%dn,d); else if(c-1=d)=1)printf(%dn,d+1); elseprintf(%dn,d+2);执行后输出结果是()。A) 2 B) 3 C) 4 D) 编译时有错,无结果4)条件表达式: 表达式1 ?表达式2 :表达式3 注意是当表达式1的值为:非0时候 是表达式2的数值,当为0是就是表达式2的数值。考试口诀:真前假后。5)switch语句:a) 一定要注意 有break 和没有break的差别,书上(54页)的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。b) switch只可以和break一起用,不可以和continue用。c) switch(x) x:是整型常量,字符型常量,枚举型数据。case 1: . case后面的只能是常量不能是变量 。 case 2: . 注意:break可以用在循环语句中,也可以用在switch语句中。但是continue语句只能用在循环语句中。例题:main() int x=1,y=0,a=0,b=0;switch( x) case 1: switch(y) case 0: a+;break; case 1:b+;break; case 2: a+;b+;break;printf(“a=%d,b=%dn”,a,b);4、循环结构1)三种循环结构: a)for() ; while(); do- while()三种。 b)for循环当中必须是两个分号,千万不要忘记。 c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。 d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错),dowhile循环是至少执行一次循环。复习:三个循环结构的执行过程。while 是先判断后执行。do.while是先执行后判断。for() 先执行表达式1,判断表达式2,执行循环体中的内容,在执行表达式3.例题:2) break 和 continue的差别 记忆方法: break:是打破的意思,(破了整个循环)所以看见break就退出真个一层循环。 continue: 是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。3)嵌套循环 就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。4) while(c=getchar())!=n) 和 while(c=getchar() !=n)的差别先看a = 3 != 2 和 (a=3)!=2 的区别:(!=号的级别高于=号 所以第一个先计算 3!=2) 第一个a的数值是得到的1;第二个a的数值是3。考试注意点: 括号在这里的重要性。main() int i=0,s=0; for(;) if(i=0|i=5) continue ; if(i=6) break; i+;s+=i;printf(“%d”,s);A、10 B、13 C、21 D、程序进入死循环5、函数函数:是具有一定功能的一个程序块;是C语言的基本组成单位。1) 函数的参数,返回数值void f(int v,int w) int t;t=v;v=w;w=tmain()int x=1,y=3,z=2;if(xy) f(x,y); else if(yz) f(y,z);else f(x,z);printf(“%d,%d,%dn”,x,y,z);2)函数的调用: 实参和形参之间 传数值,和传地址的差别。(考试的重点) 按数值传替,形参的变化不会改变实参的变化。(单向传替) 按地址传替,形参的变化就会有可能改变实参的变化。(双向传替)3)函数声明的考查:一定要有:函数名,函数的返回类型,函数的参数类型。不一定要有:形参的名称。4)要求掌握的库函数:sqrt() fabs() pow() sin() 其中pow(a,b)是重点。23为pow(2,3)。以及sqrt()表示的是一个表达式或者是一个数值的开方。 5)函数最后返回值的类型决定于函数的定义类型。6、指针1)、指针变量的本质是用来放地址,而一般的变量是放数值的。int *p 中 *p和p的差别:*p可以当做变量来用;*的作用是取后面地址p里面的数值 p是当作地址来使用。*p+ 和 (*p)+的之间的差别:改错题目中很重要 *p+是 地址会变化。 (*p)+ 是数值会要变化。若有说明: int n=2,*p=&n,*q=p;则以下的非法的赋值语句是:()A、p=q B、*p=*q C、n=*q; D、p=n 2)、三名主义:(考试的重点) 数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次) 函数名:表示该函数的入口地址。 字符串常量名:表示第一个字符的地址。考试重要的话语:指针变量是存放地址的。并且指向哪个就等价哪个,所有出现*p的地方都可以用它等价的代替。例如:int a=2,*p=&a; *p=*p+2;(由于*p指向变量,所以指向哪个就等价哪个,这里*p等价于,可以相当于是a=a+2)指针变量两种初始化方法一:int a=2,*p=&a;(定义的同时初始化)方法二:int a=2,*p;(定义之后初始化)p=&a;3)、给指针变量赋空值之后,不能对该变量进行指针运算。#include“stdio.h”main() int n,*p=NULL; *p=&n; printf(“请输入数据:”); scanf(“%d”,&p);printf(“结果是:”);printf(“%dn”,p);该程序试图通过指针p为变量n读入数据并输出数据,但是程序中有多处错误,以下语句正确的是:()A、int n,*p=NULL; B、*p=&n; C、scanf(“%d”,&p); D、printf(“%dn”,p);4)返回指针的函数: 格式: 函数返回值类型 *函数名(形式参数列表)int *f(int *x,int *y) if(*x*y) return x; else return y;main() int a=7,b=8,*p,*q,*r; p=&a;q=&b; r=f(p,q); printf(“%d,%d,%d”,*p,*q,*r);执行后输出结果是()A) 7,8,8 B) 7,8,7 C) 8,7,7 D) 8,7,87、数组1)一维数组的重要概念:对a10这个数组的讨论。 1、a表示数组名,是第一个元素的地址,也就是元素a10的地址。 2、a是地址常量,所以只要出现a+,或者是a=a+2赋值的都是错误的。 3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。对a33的讨论。 1、a表示数组名,是第一个元素的地址,也就是元素a10的地址。 2、a是地址常量,所以只要出现a+,或者是a=a+2赋值的都是错误的。 3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。 4、a0、a1、a2也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a0+1,a1+1,a2+1都是跳一列。 5、注意a和a0 、a1、a2是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。重点复习:定义的格式和排序例题:一下能正确定义一维数组的是:A、int num; B、#define N 100 int num0.100 D、int N=100 int numN; int numN#include“stdio.h”main() int i,j,t;a5=2,1,4,3,5; for(i=0;i4;i+) for(j=i+1;j5;j+)if(aiaj) t=ai;ai=aj;aj=t; for(i=0;i 1 2 3 第一行 a1- 4 5 6 第二行 a2- 7 8 9 第三行步骤二:这样作题目间很简单:*(a0+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a01元素,所以是。*(a1+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a12元素,所以是6。一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。3) 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写 int a=1,2 合法。 int a4=2,3,4合法。 但int a4=2,3,4非法。4) 二维数组中的行指针 int a12; 其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p2指针 a0,a1现在就是一个列指针。a0+1 跳一个数组元素。搭配*p2指针数组使用5) 还有记住脱衣服法则: a2 变成 *(a+2) a23变成 *(a+2)3再可以变成 *(*(a+2)+3)以下错误的定义语句是A)int x3=0,1,1,2,3;B)int x43=1,2,3,1,2,3,1,2,3,1,2,3;C)int x4=1,2,3,1,2,3,1,2,3,1,2,3;D)int x3=1,2,3,4;8、字符串1)、字符串的概念:由双引号括起来的若干个字符所组成的序列。每一个字符串都有一个0做为结束的标识。2)字符串的存储形式:两种存储 数组存储 用数组来存储字符串。 、将每一个字符分别赋值给数组中的每一个元素。 、定义字符数组的时候就给数组中的每一个元素赋初值。但是最后必须有一个结束符。 C、直接把一个字符串赋值给一个数组。 D、当把字符串中的内容赋值给数组时,当数组中的元素的个数多余数组字符个数的时候,可以不用加最后的结束符。 E、在定义数组的时候,省略了数组的长度的时候,如果没有结束符,那么这个数组时不能构成一个字符串的。 指针存储 用指针来存储字符串。在定义指针变量的同时将一个字符数组赋值给一个指针变量。以下不能正确进行字符串赋值的语句时:()A、char str5=”good!”; B、char str=”good!”C、char *str=”good!” D、char str5=g,o,o,d;3)、字符串的输入和输出输出: A、printf函数输出字符串是,格式控制说明符是%s,其中的输出项为:地址。输出时不带有字符串的定界符。B、puts函数输出的一个字符串,同样的括号中的内容只能是一个字符串或者是一个地址。输出时不带有字符串的定界符。输入: A、scanf函数,在输入的时候,格式控制说明符任然为%s,输入项中的内容仍然为:地址。在输入的时候不输入字符串的定界符。但是使用scanf函数在输入数据的时候,不能接受回车符和空格符。 、gets()函数接受的仍然是一个字符串,输入项中的内容仍然为:地址。在输入的时候不输入字符串的定界符。但是使用scanf函数在输入数据的时候,能接受回车符和空格符。例题:当用户要求输入的字符串中含有空格时,应使用的输入函数是:A、scanf() B、getchar() C、gets() D、getc()4)、字符串处理函数掌握字符串的处理函数:strcpy() strcmp() strlen() strcat()其中括号中的内容均是地址。掌握每一个函数的含义和功能。#include”stdio.h”main() char p20=”abcd”,q=”abc”,r=”abcde”;strcat(p,r);strcpy(p+strlen(q),q);printf(“%dn”sizeof(p);9、文件1)、文件指针的定义的格式:FILE *文件指针。2)、打开文件的格式:fopen(“文件名”,“打开方式”); 重点看打开方式为 r和w的形式。3)、关闭文件:fclose(文件指针)。 文件的操作:1)、feof函数的格式以及函数的功能。返回的是文件指针的位置.如果在文件的末尾,则返回的是一个非0值,若是不在文件末尾,返回的是0值。2)、fseek函数(定位函数) 掌握定位的原则。 例如:与fseek(fp,0L,seek_set)有相同作用的是:A、feof() B、ftell() C、fgetc() D rewind()上机考试重点:fprintf( 文件指针,格式控制字符串,输入列表 );功能:按照格式控制说明的格式将输入列表中的值输入到文件指针所指的文件中。fscanf(文件指针,格式控制字符串,输出列表);功能:按照格式控制说明的格式从文件指针所指的文件中读取中数据来,并且赋值给输出列表。10、对C语言的深入讨论1)、用户定义类型: typedef 原有类型 标识符;掌握:没有定义新的类型,只是将原有的类型换了一个名字而已。2)、编译预处理 编译预处理必须单独占有一行,在程序执行时不占用程序的执行时间。 运算规则:先替换,后计算。# include # define N 5 # define M N+1 # define f(x) (x*M) main() int i1,i2; i1=f(2); i2=f(1+1);printf(“%d %dn”,i1,i2);程序运行结果是A) 12 12 B) 11 7 C) 11 11 D) 12 73)、标识符的作用域 按照变量出现的位置,将其分为:全局变量和局部变量。按照存储存储类别分为:自动型和静态型。四个关键字:auto register static extern 局部变量的作用范围只是其所在的花括号中。而全局变量的作用范围是从定义开始,一直到程序的结束。 当同时出现局部变量和全局变量的时候,局部变量有效,而全局变量没有效果。全局变量相当于一个静态变量。 静态变量在使用时占有永久的存储单元。在使用的时候只用看一次其初值。#include int a=5;void fun(int b) int a=10;a+=b; printf(“%d”,a);main()int c=20;fun(c); a+=c; printf(“%dn”,a);4)、动态存储分配掌握函数开辟存储单元的格式: A、malloc(size) 开辟的是动态的存储单元,返回的是一个空指针,若要将其赋值给一个指针变量,必须进行强制类型转换。B、calloc(n,size) 开辟的是动态的存储单元,返回的是一个空指针,若要将其赋值给一个指针变量,必须进行强制类型转换。例如:已有定义语句,double *p,请写出完整的语句,利用malloc函数使p指向一个双精度型的动态存储单元。 5)、main(int argc,char *argv) 这种含有参数的题目,是很呆板的题目。第一个参数是表示输入的字符串的数目,第二个参数是指向存放的字符串。6)、函数的递归调用。 函数的递归调用的时候先画出方框图,再从后面往前算,即可。11、结构体1)、结构体的定义的格式: struct 结构体名 成员列表;成员列表中,成员的类型可以是不相同的。2)、定义结构体变量的3中格式 A、struct 结构体名 成员列表;struct 结构体名 变量名; B、struct 结构体名 成员列表;变量名; C、struct 成员列表;变量名;3)应用结构体变量中的成员-三种方法 A、结构体变量.成员名; B、结构体指针变量成员名; C、(结构体指针变量).成员名4)数据传递A、传递的是结构体变量 :单向传递B、传递的是结构体变量的地址:双向传递C、传递的是结构体变量中的成员:若是地址 双向传递,若是数值 单向传递D、传递的是结构体数组元素: 单向传递E、传递的是结构体数组的数组名:双向传递。举例子:课本上的题目第156页最后一题。5)、链表首先看清楚题目要求和意思。看清楚链表有没有带头结点,如果带有都结点,第一空填的内容是p=hnext;如果是不带有头结点,则第一个空填写的是p=h;如果第二个空是在循环语句while的括号中的时候里面的内容填写的是p或者是q,以最近出现的为主;如果是在循环语句的里面的时候,填写的是q=pnext;如果是排序的时候,从小到大的时候是大于号,从大到小的时候是小于号。如果出出现了r的地方,则在后面的空中填的是r12、数组和指针1)数组名即为数组的首地址,是一个地址常量,不能进行+,-运算,也不能将一个数据复制给数组名。将一个数组名赋值给一个指针变量后,这个指针变量得到的就是这个数组中的第一个元素的地址,对指针变量进行移动运算,那么指针将移动,移动的时候若是正数,则往后移动。同时还可以对指针进行中括号运算,得到的将是数据的值。例如:int a10;int *p;p=a;p0代表的是 a0元素。p+,代表的是指针往后移动一个位置。int a10;int *p;p=a+1;那么p1代表的元素为a22)、二维数组的名字也是一个指针,但是为一个指针常量,不能进行+,-运算,也不能将一个数据复制给数组名,注意二维数组的名字为一个行指针,所以对数组名加一运算时,是跳过一整行,而不是一个元素。掌握: A、a+1代表的是第2行一整行,得到的是一整行的地址。 B、*(a+1)得到的是第二行中第一个元素的地址。C、*(*(a+1)代表的是第二行中第一个元素的值。3)、指针数组 指针数组的定义的格式:类型 *数组名元素个数;其中数组中的每一个元素均为指针,代表的都是一个存储单元的地址。4)行指针行指针的定义格式:类型 (*数组名)元素个数;对行指针进行+1运算时,得到的是往后一整行的地址。而不是一个元素的地址。5)函数与数组函数在传递数据的时候要求:形式参数和实际参数的个数要相等,类型要相同。当传递的是数组的时候,要求形式参数必须是指针或者是数组。传递的是二维数组的时候,要求形式参数必须是二维数组或者是行指针。传递的时候双向传递。(二)、公共基础复习纲要第一章 数据结构与算法1.1 算法算法:是一组有穷指令集,是解题方案的准确而完整的描述。通俗地说,算法就是计算机解题的过程。算法不等于程序,也不等于计算方法,程序的编制不可能优于算法的设计。算法是一组严谨地定义运算顺序的规则,每一个规则都是有效的,且是明确的,此顺序将在有限的次数下终止。所以其四个基本特征包括:(1)确定性,算法中每一步骤都必须有明确定义,不允许有模棱两可的解释,不允许有多义性; (2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止;(3)可行性,算法原则上能够精确地执行;(4)拥有足够的情报。算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。指令系统:一个计算机系统能执行的所有指令的集合。基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。算法的三种基本控制结构:顺序结构、选择结构、循环结构。算法基本设计方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。算法效率的度量算法复杂度:算法时间复杂度和算法空间复杂度。算法时间复杂度:指执行算法所需要的计算工作量。即算法执行过程中所需要的基本运算次数。通常,一个算法所用的时间包括编译时间和运行时间。算法空间复杂度:指执行这个算法所需要的内存空间。包括算法程序所占的空间,输入的初始数据所占的空间,算法执行过程中所需的额外空间。1.2 数据结构的基本概念数据结构:指相互有关联的数据元素的集合。数据结构研究的三个方面:(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。数据的逻辑结构应包含:(1)表示数据元素的信息;(2)表示各数据元素之间的前后件关系(指逻辑关系,与存储位置无关)。数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构,也称数据物理结构。数据的存储结构有顺序、链接、索引等。线性结构的条件,(一个非空数据结构):(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。非线性结构:不满足线性结构条件的数据结构。1.3 线性表及其顺序存储结构线性表是由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。在复杂线性表中,由若干项数据元素组成的数据元素称为记录;由多个记录构成的线性表称为文件。非空线性表的结构特征:(1)且只有一个根结点a1,它无前件;(2)有且只有一个终端结点an,它无后件;(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。线性表的顺序存储结构具有以下两个基本特点:(1)线性表中所有元素所占的存储空间是连续的;(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。顺序表的运算:查找、插入、删除。 1.4线性链表数据结构中的每一个结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。结点由两部分组成:(1) 用于存储数据元素值,称为数据域;(2) 用于存放指针,称为指针域,用于指向前一个或后一个结点。在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。链式存储方式即可用于表示线性结构,也可用于表示非线性结构。线性单链表中,HEAD称为头指针,HEAD=NULL(或0)称为空表。如果是双项链表的两指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。线性链表的基本运算:查找、插入、删除。1.5栈和队列栈:限定在一端进行插入与删除的线性表。其允许插入与删除的一端称为栈顶,用指针top表示栈顶位置。不允许插入与删除的另一端称为栈底,用指针bottom表示栈底。栈按照“先进后出”(FILO)或“后进先出”(LIFO)组织数据,栈具有记忆作用。栈的存储方式有顺序存储和链式存储。栈的基本运算:(1) 入栈运算,在栈顶位置插入元素;(2) 退栈运算,删除元素(取出栈顶元素并赋给一个指定的变量);(3) 读栈顶元素,将栈顶元素赋给一个指定的变量,此时指针无变化。队列:指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。用rear指针指向队尾,用front指针指向队头元素的前一个位置。队列是“先进先出”(FIFO)或“后进后出”(LILO)的线性表。队列运算包括:(1) 入队运算:从队尾插入一个元素; (2) 退队运算:从队头删除一个元素。队列的顺序存储结构一般采用队列循环的形式。循环队列s=0表示队列空;s=1且front=rear表示队列满。计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。1.6 树与二叉树树是一种简单的非线性结构,其所有元素之间具有明显的层次特性。在树结构中,每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为树的根结点,简称树的根。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。树的最大层次称为树的深度。二叉树的特点:(1) 非空二叉树只有一个根结点;(2) 每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。满二叉树是指除最后一层外,每一层上的所有结点有两个子结点,则k层上有2k-1个结点深度为m的满二叉树有2m-1个结点。完全二叉树是指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点。二叉树基本性质:(1)在二叉树的第k层上,最多有2k-1(k1)个结点; (2)深度为m的二叉树最多有2m-1个结点; (3)度为0的结点(即叶子结点)总是比度为2的结点多一个; (4)具有n个结点的二叉树,其深度至少为log2n+1,其中log2n表示取log2n的整数部分(5) 具有n个结点的完全二叉树的深度为log2n+1;(6) 设完全二叉树共有n个结点。如果从根结点开始,按层序(每一层从左到右)用自然数1,2,n给结点进行编号(k=1,2.n),有以下结论:若k=1,则该结点为根结点,它没有父结点;若k1,则该结点的父结点编号为INT(k/2);若2kn,则k结点的左子结点编号为2k;否则该结点无左子结点(也无右子结点);若2k+1n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。补充:增加度为1的结点不会影响二叉树的叶子结点数,每增加一个度为2的结点便会增加一个叶子结点,没有度为2的结点时叶子结点数为1。已知完全二叉树有x个结点,求其叶子结点数:确定层数为k; 第k层的结点数y=x-(2 k-1-1);第k-1层的叶子结点数n=2 (k-1)-1-y/2; 最后y+n。二叉树存储结构采用链式存储结构,对于满二叉树与完全二叉树可以按层序进行顺序存储。二叉树的遍历:(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树;(树根在第一,下走不跳结点)(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树;(有左先左,再寻根,后找右。最左边的结点最先遍历,最右边的结点最后遍历)(3)后序遍历(LRD)首先遍历左子树,然后访问遍历右子树,最后访问根结点。(有左先左,再找右,后寻根,到最右一路上行,树根在最后)小结:逻辑结构可分为线性表和非线性表。 线性表包括栈、队列,其存储方式为顺序存储、链式存储均可。链式型有:线性链表,带链的栈, 带链的队列,循环链表等。 非线性表包括树(二叉树),其存储方式为链式存储。1.7 查找技术只能使用顺序查找的两种情况:(1)线性表为无序表,不管是顺序存储还是链式存储;(2)表采用链式存储结构,即使是有序线性表。二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log2n次,而顺序查找需要比较n次。1.8 排序技术排序是指将一个无序序列整理成按值非递减顺序排列的有序序列。交换类排序法:(1)冒泡排序法,需要比较的次数为n(n-1)/2; (2 ) 快速排序法。插入类排序法:(1)简单插入排序法,最坏情况需要n(n-1)/2次比较; (2) 希尔排序法,最坏情况需要O(n1.5)次比较。选择类排序法:(1)简单选择排序法, 最坏情况需要n(n-1)/2次比较;(2) 堆排序法,最坏情况需要O(nlog2n)次比较。相比以上几种(除希尔排序法外),堆排序法的时间复杂度最小。第二章 程序设计基础2.1 程序设计设计方法和风格“清晰第一、效率第二”已成为当今主导的程序设计风格。形成良好的程序设计风格需注意:(详见书P27)1、源程序文档化; 2、数据说明的方法; 3、语句的结构; 4、输入和输出。注释分序言性注释和功能性注释。 语句结构清晰第一、效率第二。2.2 结构化程序设计结构化程序设计方法的四条原则是:1、自顶向下; 2、逐步求精; 3、模块化; 4、限制使用goto语句。结构化程序的基本结构及特点:(1)顺序结构:一种简单的程序设计,最基本、最常用的结构;(2)选择结构:又称分支结构,包括简单选择和多分支选择结构,可根据条件,判断应该 选择哪一条分支来执行相应的语句序列;(3)循环结构:又称重复结构,可根据给定条件,判断是否需要重复执行某一相同或类似的程序段。结构化程序设计的特点:只有一个入口和出口2.3 面向对象的程序设计面向对象的程序设计的首次提出以60年代末挪威奥斯陆大学和挪威计算机中心研制的SIMULA语言为标志。面向对象方法的优点:(1)与人类习惯的思维方法一致; (2)稳定性好; (3)可重用性好;(4)易于开发大型软件产品; (5)可维护性好。对象是面向对象方法中最基本的概念,可以用来表示客观世界中的任何实体,对象是实体的抽象。面向对象的程序设计方法中,对象是由数据的容许的操作组成的封装体,是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组表示其静态特征的属性和它可执行的一组操作组成。属性即对象所包含的信息,它在设计对象时确定,一般只能通过执行对象的操作来改变。操作描述了对象执行的功能,是对象的动态属性,操作也称为方法或服务。对象的基本特点:(1)标识惟一性; (2)分类性; (3)多态性; (4)封装性; (5)模块独立性好。类是指具有共同属性、共同方法的对象的集合。类是关于对象性质的描述。类是对象的抽象,对象是其对应类的一个实例。消息是一个实例与另一个实例之间传递的信息。对象间的通信靠消息传递。它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。消息的组成包括:(1)接收消息的对象的名称; (2)消息标识符,也称消息名; (3)零个或多个参数。继承是使用已有的类定义作为基础建立新类的定义技术,广义指能够直接获得已有的性质和特征,而不必重复定义他们。继承具有传递性,一个类实际上继承了他上层的全部基类的特性。继承分单继承和多重继承。单继承指一个类只允许有一个父类,即类等级为树形结构;多重继承指一个类允许有多个父类。多态性是指同样的消息被不同的对象接受时可导致完全不同的行动的现象第三章 软件工程基础3.1 软件工程基本概念计算机软件是包括程序、数据及相关文档的完整集合。软件的特点包括:(1)软件是一种逻辑实体,具有抽象性;(2)软件的生产与硬件不同,它没有明显的制作过程;(3)软件在运行、使用期间不存在磨损、老化问题;(4)软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题;(5)软件复杂性高,成本昂贵;(6)软件开发涉及诸多的社会因素。软件

温馨提示

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

最新文档

评论

0/150

提交评论