C语言最重要的知识点复习资料

更新时间:2024-06-09 17:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言最重要的知识点复习资料 总体上必须清楚的:

1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。 3)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. 4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位.

5)一定要记住 二进制 如何划成 十进制及十进制如何划成二进制。要记住八进制,十六进制的表示形式。 概念常考到的:

1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、每个C语言程序中main函数是有且只有一个。 3、在函数中不可以再定义函数。

4、算法的是一定要有输出的,他可以没有输入。 5、break可用于循环结构和switch语句。 6、逗号运算符的级别最低。 第一章

1)合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了。

关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 2)实型数据的合法形式:

2.333e-1 就是合法的,且数据是2.333×10-1。 考试口诀:e前e后必有数,e后必为整数。. 3)字符数据的合法形式::

'1' 是字符占一个字节,\是字符串占两个字节(含有一个结束符号)。

'0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。 一般考试表示单个字符错误的形式:'65' \ 字符是可以进行算术运算的,记住: '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。 9)位运算的考查:

会有一到二题考试题目。 总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

例1: char a = 6, b;

b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。 例2: 一定要记住,异或的位运算符号。0 异或 1得到1。 0 异或 0得到0。两个女的生不出来。 1 异或 1得到0。两个男的生不出来。

考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。

例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以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); 得到的输出结果:a printf(“%d”, a); 得到的输出结果:65

第二章

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 这样是把小数部分去掉。

第三章

特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。 1)关系表达式:

表达式的数值只能为1(表示为真),或0(表示假)

当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1; 2)逻辑表达式:

只能为1(表示为真),或0(表示假) a) 共有&& || ! 三种逻辑运算符号。 b) !>&&>|| 优先的级别。

c) 注意短路现象。考试比较喜欢考到。

d) 要表示 x 是比0大,比10小的方法。0

else 是与最接近的if且没有else的相组合的。 注意if 语句中带{}和不带{}的区别,例如

If(a

表达式1 ?表达式2 :表达式3

注意是当非0时候 是表达式2的数值,当为0是就是表达式2的数值。 考试口诀:真前假后。 5)switch语句:

a) 一定要注意 有break 和没有break的差别,书上(34页)的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。 b) switch只可以和break一起用,不可以和continue用。 c) switch(x) x:是整型常量,字符型常量,枚举型数据。 {case 1: …. 不可以是变量。 case 2: …. }

第四章 1)三种循环结构:

a)for() ; while(); do- while()三种。

b)for循环当中必须是两个分号,千万不要忘记。

c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。 d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错),do-while循环是至少执行一次循环。 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。

考试注意点: 括号在这里的重要性。 第五章

函数:是具有一定功能的一个程序块;是C语言的基本组成单位。 1) 函数的参数,返回数值(示意图): main() {

int a = 5,b=6,c; c = add(a,b); printf(“%d”,c); }

调用函数 a,b是实参

整个函数得到一个数值就是 Add函数的返回数值。

int add ( int x, int y) { int z; z=x+y; return z; }

被调用函数

x,y是形式参数 函数返回数值是整型

z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。

程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行 2)一定要注意参数之间的传递

实参和形参之间 传数值,和传地址的差别。(考试的重点) 传数值的话,形参的变化不会改变实参的变化。

传地址的话,形参的变化就会有可能改变实参的变化。 3)函数声明的考查:

一定要有:函数名,函数的返回类型,函数的参数类型。 不一定要有:形参的名称。 4)要求掌握的库函数:

sqrt() fabs() pow() sin() 其中pow(a,b)是重点。23是由pow(2,3)表示的。

第六章

指针变量的本质是用来放地址,而一般的变量是放数值的。 int *p 中 *p和p的差别:

*p可以当做变量来用;*的作用是取后面地址p里面的数值 p是当作地址来使用。

*p++ 和 (*p)++的之间的差别:改错题目中很重要 *p++是 地址会变化。

(*p)++ 是数值会要变化。 三名主义:(考试的重点)

数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次) 函数名:表示该函数的入口地址。

字符串常量名:表示第一个字符的地址。 考试重要的话语:

指针变量是存放地址的。并且指向哪个就等价哪个,所有出现*p的地方都可以用它等价的代替。

例如:int a=2,*p=&a; *p=*p+2;

(由于*p指向变量a,所以指向哪个就等价哪个,这里*p等价于a,可以相当于是a=a+2) 指针变量两种初始化

方法一:int a=2,*p=&a;(定义的同时初始化) 方法二:int a=2,*p; (定义之后初始化) p=&a; 第七章

1)一维数组的重要概念: 对a[10]这个数组的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 对a[3][3]的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。 4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。

5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。

2) 二维数组做题目的技巧:

如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。

步骤一:把他们写成: 第一列 第二列 第三列 a[0]à 1 2 3 ->第一行 a[1]à 4 5 6 —>第二行 a[2]à 7 8 9 ->第三行 步骤二:这样作题目间很简单:

*(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。

*(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。

一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。 3) 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写

int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。 4) 二维数组中的行指针 int a[1][2];

其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针

a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用 5) 还有记住脱衣服法则:

a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3) 这个思想很重要!

其它考试重点 文件的复习方法:

把上课时候讲的文件这一章的题目要做一遍,一定要做,基本上考试的都会在练习当中。 1)字符串的 strlen() 和 strcat() 和strcmp() 和strcpy()的使用方法一定要记住。他们的参数都是地址。其中strcat() 和strcmp()有两个参数。

2)strlen 和 sizeof的区别也是考试的重点;

3)define f(x)(x*x) 和 define f(x) x*x 之间的差别。一定要好好的注意这写容易错的地方,替换的时候有括号和没有括号是很大的区别。

4)int *p;

p = (int *)malloc(2);

p = (int *)malloc(sizeof(int));以上两个等价 当心填空题目,malloc的返回类型是 void *

5)还有main(int argc,char **argv) {} 这种含有参数的题目,是很呆板的题目。第一个参数是表示输入的字符串的数目,第二个参数是指向存放的字符串。

6)函数的递归调用一定要记得有结束的条件,并且要会算简单的递归题目。要会作递归的题目

7)结构体和共用体以及链表要掌握最简单的。typedef考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。

8)函数指针的用法(*f)()记住一个例子: int add(int x, int y) {....} main()

{ int (*f)(); f=add; }

赋值之后:合法的调用形式为1、add(2,3); 2、f(2,3); 3、(*f)(2,3)

9)两种重要的数组长度:

char a[]={?a?,?b?,?c?}; 数组长度为3,字符串长度不定。sizeof(a)为3。 char a[5]={ ?a?,?b?,?c?} 数组长度为5,字符串长度3。sizeof(a)为5。 10)scanf 和 gets的数据:

如果输入的是 good good study!

那么scanf(“%s”,a); 只会接收 good. 考点:不可以接收空格。 gets(a); 会接收 good good study! 考点:可以接收空格。 11)共用体的考查: union TT { int a;

char ch[2];}

考点一: sizeof (struct TT) = 2; 考点二: TT t1 ; t1=0x1234;

那么 ch[0]=0x 34; ch[1]=0x12

12)“文件包含”的考查点:

no1.c no2.c #include”no2.c” main()

{ add(29 , 33); ……. }

int add(int a,int b) {

return a+b; }

这里一个C语言程序是有两个文件组成,分别是no1.c, no2.c。那么no1.c中最开始有个#include”no2.c”他表示把第二个文件的内容给包含过来,那么no1.c中调用add()函数的时候就可以了把数值传到no2.c中的被调用函数add()了。

一个文件必须要有main函数。 这句话错了。 例如:no2.c就没有。

头文件一定是以.h结束的。 这句话错了。例如:no1.c中就是#include”no2.c”以.c结尾的。

****************************第一题目******************************* 对应的代码:

For(i=3;i<=n;i++)

for (j=2; j

if (i%j == 0) 如果碰到有个数字j可以被i整除,那么表break; 示这个数不是素数,要用break直接结束循

环,这个时候我们的j肯定是小于i的。 /**********found**********/

if (j>=i) j>=i,表示在上面if (i%j == 0)没有成功,所以会循环执行for (j=2; j=i,这样可以知道该数字i就是素数。 /**********found**********/

{ count++; printf( count? \

****************************第二题目******************************* 填空题: 代码:

/**********found**********/

for (i=0; i

t=a[i];

/**********found**********/

a[i] = a[n-1-i]; //将前面的数组与后面的数组进行对换。当i=0的时候,表示是第一个数组元素,所以要和最后一个数组元素互换,所以是a[n-1-i] /**********found**********/

a[n-1-i] = t; //将前面的数组元素放到后面去。直接将上面的代码抄下来就可以了 } }

****************************第三题目******************************* 代码: 分析:

int fun(STU *std, STU *k, int year) { int i,n=0;

for (i=0; i

/**********found**********/

if( std[i].year = =year) 由于要比较的是相同的年数,所以要将每次循环的结构体中的year都要比较一次,当我们指定的参数year和我们结构体中某个元素的year相同的时候,就执行下面的“把这个结构体数据保存到数组k中” /**********found**********/

k[n++]= std[i]; 要注意,n++,之后那么下次新得到的数据就放到了后面,例如,第一个放到了k[0],由于进行了n++,那么下次符合条件的新的结构体就放到了k[1]中了。这里注意:进行的是结构体的整体复制,所以是填写std[i]这个结构体的名称。 /**********found**********/

return (n);} 根据题目的要求,是要求返回符合条件的结构的数目,很多人会写成n-1,这个地方应该是填写n。带入法则:假定有一个符合题目的要求,那么我们知道就执行一次k[n++]= std[i].由于k的初始值是0,所以这个地方是进行n++之后变成了1,返回的就是n,现在为1。不是能n-1得到的0。

****************************第四题目******************************* 代码: 分析:

#define M 5 #define N 20

int fun(char (*ss)[N], int *n) { int i, k=0, len= N;

/**********found**********/

for(i=0; i< M; i++) 题目要求:求字符串数组中长度最短的字符数串所在的行下标,所以这里循环的时候,一定是循环字符串的个数,也就是字符数组中表示存放字符个数的数组的行的个数(上课时强调的重点)。这个地方明显就是M,表示的是五行,作五次的循环判断,每次将字符串最短的给保存下来。 { len=strlen(ss[i]);

if(i==0) *n=len; //第一个字符串判断时要,初始化len, /**********found**********/

if(len < *n) 注意:*n是已经保存了前面判断出来的最短的字符串中字符的个数,len的数值是现在判断的这个字符串的字符个数。如果现在len的数值比前面所有字符串中最短的字符串(*n存放)还要短,那么就要把len的数值代替*n中去,因为 *n是表示最短的字符串的个数。 { *n=len;

k=i; 题目要求返回的是最短字符串的行下标,也就是这里要保存的是循环的中的i,它表示正在判断第几个字符串的长度。这里保存的就是最短字符串的行下标。 } }

/**********found**********/

return(i;); 所以这里根据题目意思是返回 i,它表示最短字符串的行下标。 }

****************************第五题目******************************* 代码: 分析:

typedef struct { int num;

char name[9]; char sex;

struct { int year,month,day ;} birthday; float score[3];

}STU; //一个结构体的定义 /**********found**********/ void show(STU tt) 注意:这里是被调用函数的行参的考察,我们学习的主要是传地址和传数值名称两种,这个地方是传名称,看到下面打印的时候使用的是tt.num,很明显行参的名称是tt,并且是传递的是参数的名称,如果传递的是地址,下面的引用应该是tt->num. 或 (*tt).num. { int i;

printf(\ tt.birthday.year, tt.birthday.month, tt.birthday.day); for(i=0; i<3; i++)

/**********found**********/

printf(\根据观察我们可以发现该结构体成员中有个浮点型的score[3]的成员,这个地方是通过循环依次把这三个成绩数出来,所以填写的是tt.score[i],(上课时强调如何使用过)。 printf(\}

main( )

{ STU std={ 1,\ printf(\/**********found**********/

show(std); 这里填写的是调用函数,这个地方是实参,我们呢可以看到上面定义了一个结构体变量,std,所以这个地方就是填写std。(too simply) }

****************************第六题目******************************* 代码: 分析:

void fun( SLIST *p)

{ SLIST *t, *s;

t=p->next; s=p; 两个指针,t和s,我们要注意,s是在t前面的一个指针, —> s t

while(t->next != NULL) 当t没有到末尾的时候(我要大家背了这句话)。 { s=t;

/**********found**********/

t=t->next; 这里也是我上课要大家背的,表示将指针往后挪一个位置。填写的是next。 }

/**********found**********/

printf(\ 将这个数据输出,我们知道数据域是data,所以这个地方要填写的是t->data.

s->next=NULL; /**********found**********/

free(t);} —> s t

由于这个地方要求把最后一个节点给释放掉,所以这个地方是把t给释放掉。画个图,题目就很简单了。

****************************第七题目******************************* 代码: 分析:

void fun(char *s) { int i, j, n;

for(i=0; s[i]!='\\0'; i++)

/**********found**********/

if(s[i]>='0' && s[i]<='9') 判断一个字符是否为数字要用到逻辑与&&,这个是我上课时候强调的重点。这里我们要记住用这个方法判断字符是否为数字,请大家记住。 { n=0;

/**********found**********/

while(s[i+1+n]!= ?\\0?) n++; 这个地方要注意:这里是要填写到后面的字符不是为0的化,我们就将n进行自加,也就是说,到s[i]后面的某个位置当他不是为空,我们要把他往后挪。这里的n是得到要挪位的个数。 for(j=i+n+1; j>i; j--) /**********found**********/

s[j+1]= s[j]; 把前一位的s[j]往后挪一位,因为增加了一位字符*,所以要往后面挪一个位置。使得空出的位置我们写上字符*。 s[j+1]='*';

i=i+1; 跳过*这个字符的位置。 } }

****************************第八题目******************************* 代码: 分析:

#include #define N 4

/**********found**********/

void fun(int (*)t[N] , int n) 从主函数可知道,传递的实参是一个二维的数组名,所以我们应该在接收的时候用树上规定的三种格式即可,这个地方一定要注意N是在前面已经预定义为了4,所以要用到我们这里的方法。其它写法见树上说的。要记住二维数组名是一个行指针,不是列指针! { int i,s;

/**********found**********/

for(i=0;i

/**********found**********/

t[i][n-1-i]=s; 这个地方的填空,很简单,上课的时候我要求大家一定把两个数字进行互换给背下来,在这地方根据这个方法就可以知道填写的一定是s。(技巧解题目) }}

****************************第九题目******************************* 代码: 分析:

#define N 9

int fun(int a[], int n) 函数的行参是一个数组,可以看成一个指针 { int i,j; j = 0;

for (i=0; i

/**********found**********/

if (a[i]%2== 0) { 判断一个数字是否为偶数,上课我们强调了是考试的重点,这里要求判断数组每个数,所以根据循环我们知道填写的应该为a[i]%2。请大家记住:判断一个数字是偶数,是a[i]%2 ==0。对2整除等于0的数字一定是偶数。 /**********found**********/

aj] = a[i]; j++; 要求当这个数组是偶数的时候,我们就要保存好,所以在这个地方,我们要填上的是a[j].注意到这个地方,我们的j是从0开始的,每次填写一个后,我们的j++一次,这样是便于存放下一个偶数。 }

/**********found**********/

return j; 这里返回的是偶数的个数,所以我们填写的是j,这个地方不是j+1或者是j-1,我们可以通过代入法进行验算。由于上面每次存放一个偶数都要进行一次j++,所以,即使后面没有偶数了,我们也进行了j++,所以就直接就是填写j。(上机常考题目)如果是只有一个偶数,那么我们就知道也要执行一次j+,j从0变成了1,正好是返回一个。 }

****************************第十题目***************************** 代码: 分析:

#define N 9

int fun(int a[], int n) { int i,j; j = 0;

for (i=0; i

/**********found**********/

if (a[i]%2== 1) 这个题目非常的简单,和前面一个题目很类似。首先判断一个数字是否为奇数,那么很快我们就知道判断一个数字是否为奇数是,a[i]%2==1就是奇数了。 {

/**********found**********/

a[j] = a[i]; j++; 如果是奇数就要把他给存放起来,这个地方j是初始化为0,每次存放一个奇数,我们就要将j进行一次自加,便于存放下一个奇数。 }

/**********found**********/

return j; j就是我们要返回的奇数的个数,由于,每次存放一个奇数后,我们都会进行j++,所以在返回的时候就不用返回j+1了。 }

****************************第十一题目**************************** 代码: 分析:

#include void fun(char *s, int *t) { int i, n; n=0;

/**********found**********/

for(i=0; s[i] !=NULL; i++) 循环的时候,第二个是判断的条件,这个地方要判断字符是否已经到字符串的末尾了,所以我们可以看到这个地方我们函数的第一个行参是 char *s,这个地方指针可以当作数组使用,所以这个地方可以填写的是s[i]活着是*(s+i) /**********found**********/ if(s[i]>='0'&&s[i]<= '9' ) n++;

判断一个字符是否为数字,是要求大家一定牢牢记住的,这个地方不再多讲。

/**********found**********/

return *t = n; 这个return后面填写的语句是比较有特色的,是一个赋值语句,题目要求把字符窜中数字的个数放到指针参数t中,所以应该填写这个答案,由于调用函数第二个传递的是地址,所以我们接收的时候采用的是指针t。 }

****************************第十二题目**************************** 代码: 分析:

#include #include #define N 8 typedef struct { char num[10];

int year,month,day ; }STU;

/**********found**********/

STU fun(STU *std, char *num) 返回的类型应该是结构体类型,这个地方是常考的题型,类似于返回int类型等,只是把结构体类型看成一个类型!

{ int i; STU a={\ for (i=0; i

/**********found**********/

if( strcmp(std[i].num,num)==0 ) 要判断每个结构体元素的的num是否与我们指定的num相同。要注意我们传递过来的是结构体的数字,所以每个元素都要判断。 /**********found**********/

return (std[i]); 由于该函数要返回的是一个结构体变量,所以要把这个符合要求的结构体元素返回,所以这个地方要返回的是结构体名称。 return a; }

****************************第十三题目**************************** 代码: 分析:(文件的考察)

/**********found**********/

void WriteText(FILE *fw) 这个地方是填写的是文件指针,这个填空题目很单一话,只要求大家认真的记住这个文件指针。 { char str[81];

printf(\ gets(str);

while(strcmp(str,\/**********found**********/

fputs(str,fw); fputs(\把输入的内容写道了文件当中。这个也是要求大家记住的。看网上课堂详细讲了这几个文件的函数处理的方法。 gets(str); } }

void ReadText(FILE *fr) { char str[81];

printf(\ fgets(str,81,fr); while( !feof(fr) ) {

/**********found**********/

printf(\这个是文件的读出处理,这个也是要求大家自己背的,在网上课堂中,文件中动的内容已经讲的很清楚了。 fgets(str,81,fr); }

****************************第十四题目**************************** 代码: 分析:

#include #define N 4

void fun(int (*t)[N], int m) { int i, j;

/**********found**********/

for(i=0; i=0; j- -) 这个循环是表示右移多少个位置。 /**********found**********/

t[i][j+m ]=t[i][j]; 可以通过代入法进行解题目,实际的意义是把前面的元素放到后面来进行保存,前面的元素后面会将其覆盖为0,后面的元素则是被前面的元素覆盖了。 /**********found**********/

for(j=0; j

****************************第十五题目**************************** 代码: 分析:

#include #include

double fun(double x, int n) { double f, t; int i;

/**********found**********/

f = 1; 初始化是我们考试的时候的重点,我们这个题目可以看到第一个地方是初始化为1的。由于要相加的第一项是1,所以填写的是1。如果要加的第一项目是2则要填写2。注意看清楚题目。 t = -1;

for (i=1; i

/**********found**********/

t *= (-1)*x/i; 每次要循环加上一个数值,这个地方要注意,题目是要求一正一负,所以在这个地方是填写-1,那么累积相加的时候,一项为正,一项为负。 /**********found**********/

f += t; 每次循环的时候,要把当前项目给加进来,这个地方的t表示的是当前项。用f来保存每次累加的和。 }

return f; }

****************************第十六题目**************************** 代码: 分析:

#include #define N 9

void fun(int a[], int n) { int i, t, p;

/**********found**********/

p = (n%2==0)?n/2:n/2+1; 这个是条件语句。首先大家一定要弄懂这个语

是真前假后。为真是取表达式2的数值,假取表达式3的数值。这个地方

按题目要求是,当为偶数的时候是为n/2,当为奇数的时候要变成n/2+1,这种题目,大家往往应该用代入法进行测试即可得到答案。 for (i=0; i

t=a[i];

/**********found**********/

a[i] = a[p+i]; 要进行互换的两个元素,a[i]表示是从第一个元素开始处理 a[p+i]表示从中间的元素开始处理。将这两个数值进行交换。 /**********found**********/ a[i] = t; 上课的时候,强调了大家一定要记住互换的两个数的方法。这个地方请大家记住。 } }

****************************第十七题目**************************** 代码: 分析:

/**********found**********/

void fun(PERSON *std) 由于传递时候是结构体的数组名称,所以这个地方要接收的时候,就一定要用结构体指针,从后面的代码可以观察到结构体的指针是用std[i]来进行处理的,虽然出现的形式是数组,但是可以看成是指针。这里填写的时候就要用到*std指针。 {

/**********found**********/

PERSON temp; 进行交换的数值,使用的结构体变量,所以这个地方要用结构体变量名。

if(std[0].num>std[1].num)

{ temp=std[0]; std[0]=std[1]; std[1]=temp; } if(std[0].num>std[2].num)

{ temp=std[0]; std[0]=std[2]; std[2]=temp; } if(std[1].num>std[2].num)

{ temp=std[1]; std[1]=std[2]; std[2]=temp; } }

main()

{ PERSON std[ ]={ 5,\ int i;

/**********found**********/

fun(std); 题目要求的讲行参指针所指向的结构体的数值进行排序,所以这个地方一定是要传递的是结构体数组名,它表示的是地址,行参才可以用结构体指针来接收。 printf(\ for(i=0; i<3; i++)

printf(\}

****************************第十八题目**************************** 代码: 分析:

for(i=1;i

t=i; 进行第一步赋值,由于处理的是奇数位,所以这个地方,首先要对变量t进行初始化,后面用到了变量t没有被初始化,这个地方,我们填写是t = i;所以这个地方是把第一个下标为1的数组的下标初始化给变量t,这里的含义是t为下标的数组就是目前假定的最小的一个字符。 /**********found**********/

for(j=i+2 ; js[j]) t=j; if(t!=i)

{ x=s[i]; s[i]=s[t]; s[t]=x; } 完成交换 }

for(i=1,j=0; i

p[j]=?\\0?; 字符串一定要有结束符号,这个是重点,一定要记住,考试一定有很多同学会碰到这个填空题目。 }

****************************第十九题目**************************** 代码: 分析:

#include #define N 4

/**********found**********/

void fun(int (*t)[N] ) /这个地方是接收传递来的数组元素,传的是二维数组名称,这个地方要用到的是[N],由于传来的是4行4列的,所以要写成这个样子。 { int i, j;

for(i=1; i

/**********found**********/

t[i][j] =t[i][j]+t[j][i];题目要求我们把以中轴为对角的元素相加,并存放到左下角的元素中,所以这个地方很简单。 /**********found**********/

t[j][i] =0; 根据题目要求,要把右上角的所有元素变成0。这个地方也很简单。 } } }

****************************第二十题目**************************** 代码: 分析:

if(len>n) {

/**********found**********/

n=len; k=i; 这个地方填写的是k,表示的是将求出最长字符长度的那行数组的行下

标保存下来。后面的i!=k的时候,就可以不用处理这行最长的字符串,不用给它的左边补充*符号。 } }

for(i=0; i

len=strlen(ss[i]);

/**********found**********/

for(j=len; j>=0; j--) 填写的是len,表示的是我们要进行循环,把前面的字符放到后面去,空出左边的元素,用来存放题目要求的*。这里的len是现在要处理的字符串的长度。字符长度是len长,那么将字符移到右边去的次数就是len次。 ss[i][m--]=ss[i][j]; for(j=0; j

/**********found**********/

S[i][j]='*'; 填写的是s[i][j],i表示要处理的行数,j表示要处理的列数,这个都是可以从循环中得到的。 }

****************************第二十一题目************************** 代码: 分析:

#include void fun(char *s)

{ int i, n, k; char c; n=0;

for(i=0; s[i]!='\\0'; i++) n++; /**********found**********/

if(n%2==0) k=n-1; 这个地方要注意,处理的时候有数组元素是偶数个和奇数个的区别。奇、偶不同,最后一个元素也不同。解决的方法是采用代入法,来求应该填入的数字。 else k=n-2;

/**********found**********/

c=s[k]; 将最后一个数字(这里就是s[k]这个元素)进行保存,然后后面会要绕回填写到第一个数组元素去。

for(i=k-2; i>=1; i=i-2) s[i+2]=s[i]; /**********found**********/

s[1]=c ; 把前面保存的最后一个奇数数组的数字,存放到数组元素的第一个奇数下标。 }

****************************第二十二题目************************** 代码: 分析:

#include

/**********found**********/

char fun(char ch) 考察的是函数的返回值,根据观察我们可以发觉,这个地方的函数返回

数值是char类型,所以我们填写的时候是写上char,表示该函数运行得到的结果是一个字符。 {

/**********found**********/

if (ch>='0' && ch<=?9?)这个地方要背下来的,我们一定要记住判断一个字符是否为数字字符的写法,所以,这个地方平常背下来就很方便了,注意是采用的逻辑与&&. /**********found**********/

return '9'- (ch-?0?);简单的数学题目,要求把字符9变成字符0,8变成1的处理,可以采用代入法计算即可。没有什么道理可以讲。不懂的话可以问数学老师。 return ch ; }

****************************第二十三题目************************** 代码: 分析:

#define N 9

void fun(int a[], int n)

{ int i,j, max, min, px, pn, t;

for (i=0; i

/**********found**********/

max = min = a[i]; 关于初始化一定是c语言上机考试的重点,这个地方初始化的时候,假定最大和最小的数值都是第一个数组元素。 px = pn = i;

for (j=i+1; j

/**********found**********/

if (max< a[j]) 每次循环的时候,如果判断的这个数字比当前我们存放的max要大的话,我们就要把这个大的数组元素的数值和下标给保存下来。 { max = a[j]; px = j; } /**********found**********/

if (min> a[j]) 同上面一样,要将当前的数组元素与我们的min来进行比较,看那个数值要小一些,如果小则要保存。 { min = a[j]; pn = j; } }

if (pn != i) 下面的代码就是将每次循环找到的最大数值和最小数值分别存放到要存放的位置

{ t = a[i]; a[i] = min; a[pn] = t; if (px == i) px =pn; }

if (px != i+1)

{ t = a[i+1]; a[i+1] = max; a[px] = t; } } }

****************************第二十四题目************************** 代码:

分析:

STD fun(STD std[], int n) { STD max; int i;

/**********found**********/

max= std[0]; 这里一定要注意:max是一个结构体变量,所以我们在赋值 的时候一定要注意初始化,这个地方的初始化我强调很多次 了,是考试的重点,在这里,我们是把第一个结构体元素作 为数值进行传递的。 for(i=1; i

/**********found**********/

if(max.age

main( )

{ STD std[5]={\}; STD max; max=fun(std,5);

printf(\/**********found**********/

printf(\Age : %d\\n\这里要打印的的格式说明是%s表示的是字符串形式输出,我们知道该结构体数组的第一个成员是name,书上强调过,结构体的字符串数组是可以整体引用的,所以在这个地方注意是填写max.name,把求出的最大age的结构体输出。 }

****************************第二十五题目************************** 代码: 分析:

void fun( SLIST *h, int *n)

{ SLIST *p; 生成一个链表指针 /**********found**********/

*n =0; 由于题目要求是把节点的个数通过指针变量(*n)返回,所以这个地方要将该变量进行初始化,所以填写的是*n。 p=h->next; while(p) { (*n)++;

/**********found**********/

p=p->next; 统计一个节点个数就应该往后面挪一位,所以这个地方填写的是next,我上课的时候强调了这句话是考试的重点。 } }

main()

{ SLIST *head;

int a[N]={12,87,45,32,91,16,20,48}, num; head=creatlist(a); outlist(head); /**********found**********/

fun(head, &num); 考察的是参数的题目,这个地方要注意我们接收行参的实参是一个链表指针,所以我们的行参就要是一个链表地址,这个地方填写的是链表首地址head。 printf(\}

****************************第二十六题目************************** 代码: 分析:

#define M 5 #define N 20

void fun(char (*ss)[N]) { int i, j, n, len=0; for(i=0; in)n=len; }

for(i=0; i

/**********found**********/

n=strlen((*ss)[i]); 首先要求该数组的整个的长度,在这个地方要填写的是地址,strlen的参数一定是个地址,这个地方是数组元素的地址。 for(j=0; j

/**********found**********/

ss[i][len+j]='*';要将数组元素的右边全部给赋值为 * 号,也是从字符串的最后一个结束字符开始处理,这个地方就是len+j,每次循环处理一个。 /**********found**********/

ss[i][n+j+ 1]='\\0'; 考试的重点,这个地方一定要注意,我们要把字符串的最后一个字符当作结束符号来处理,考试的必考题目。 } }

****************************第二十七题目************************** 代码: 分析:

char fun(char ch) {

/**********found**********/

if ((ch>='a')&&(ch<='z'))非常简单的一个题目,这个地方是判断该字符是否为小写字符,这个是要大家都要背下来的,这个地方填写的是逻辑与,也就是&&。千万不要写成了逻辑或||了。

return ch -'a' + 'A'; 把小写字符变成大写字符。 if ( isupper(ch) )

/**********found**********/

return ch +'a'-?A? ;把大写字符变成小写字符。这个大家只要用代入法就知道了,我们要记住,小写字符a比大写字符A的ASCII数值要大。 /**********found**********/

return ch; 既不是大写字符,也不是小写字符的时候是返回原值的。 }

****************************第二十八题目************************** 代码: 分析:

int fun(int n)

{ int a[10000], i,j, count=0;

for (i=2; i<=n; i++) a[i] = i; 将数组进行初始化 i = 2;

while (i

/**********found**********/

for (j=a[i]*2; j<=n; j+=a[i]) 这个地方是处理将某个数字的倍数进行置0。填写的是j+=a[i]表示的是将j的数值进行倍数的累加,那么这个数值肯定不是素数,那么就要进行置0处理。 a[j] = 0; i++;

/**********found**********/

while (a[i]==0) 这里要求判断a[i]的数值是否为0,如果为0就要进行跳过,因为为0表示该数字已经处理过了。 i++; }

printf(\ for (i=2; i<=n; i++)

/**********found**********/

if (a[i]!=0) 这个地方是通过一个循环来完成素数的统计,根据题目的意思,要统计整个数组中不是0的元素的个数,这个就是我们要求的素数的个数。 { count++; printf( count?\} return count; }

****************************第二十九题目************************** 代码: 分析:

void fun( SLIST *h) { SLIST *p, *q; p=h->next; if (p!=NULL) { q=p->next;

while(q!=NULL)

{ if (p->data==q->data) 当两个节点的数据域相同

{ p->next=q->next; p是前面那个指针,q是后面那个指针,这个地方要注意的是q这个节点本来是由p->next 来链接的,这个地方成将p—>next指向了q后面的节点。 /**********found**********/

free( q ); 要释放掉断掉的这个指针节点q指向的节点,一定 不要搞错节点。也就是大家作链表的题目的时候, 最好是画一个图来处理。 /**********found**********/

q=p-> next; 要将指针q指向指针p后面的节点,以便下次循环来操作。 }

else 当数字域不相同的时候,我们要处理的是将两个指针分别往后面移动一个位置,所以这个地方填写的是next。 { p=q;

/**********found**********/ q=q-> next ; } } } }

****************************第三十题目************************** 代码: 分析:

#include

int fun(int a, int b, int c) {

int t;

/**********found**********/ 首先要记住“真前假后”这句话, 作这个题目的时候,大家一定要把条件给列出来

a>b为正,那么执行 (b>c? b :(a>c?c:___1___))这个表达式,这个地方如果同时b>c为正,那么中间的数字就是b,如果b>c为假的话,也就是bc?c:a),所以第一空填写这个,依次类推得到下面的答案

t = (a>b) ? (b>c? b :(a>c?c:(a>c?c:a))) : ((a>c)? (a>c)?a: ((b>c)?c: (b>c)?c:b)); return t; }

有了它计算机二级想不过都难~~~(收藏起来,会用到的) 二级C语言

考试大纲:http://ncre.csai.cn/ncredg/200605160849041980.htm 资料下载:http://data.csai.cn/View_7744.html

历年试题:http://ncre.csai.cn/category.asp?class=v17 视频教程:http://platform.csai.cn/intro/ncre_c.htm

重难点分析与题解:http://ncre.csai.cn/ncrefx/200703151118271174.htm 模拟测试:http://data.csai.cn/View_43696.html

复习全攻略:http://ncre.csai.cn/zt/ZT_C_cc0911.htm

考点分析:http://ncre.csai.cn/ncrefx/200612201144361030.htm 二级Visual Basic

考试大纲:http://ncre.csai.cn/ncredg/200605160904311624.htm

资料下载:http://data.csai.cn/View_7748.html

历年试题:http://ncre.csai.cn/category.asp?class=v22 视频教程:http://platform.csai.cn/intro/ncre_VB.htm

重难点分析:http://ncre.csai.cn/ncrefx/200708141419091328.htm 考点分析:http://ncre.csai.cn/ncrefx/200612141547271298.htm VB语言复习专题:http://ncre.csai.cn/zt/ZT_VB_cc0913.htm 二级Visual Foxpor

考试大纲:http://ncre.csai.cn/ncredg/200605170854421935.htm 资料下载:http://data.csai.cn/View_7747.html

历年试题:http://ncre.csai.cn/category.asp?class=v25 视频教程:http://platform.csai.cn/intro/ncre_VF.htm

重难点分析与题解:http://ncre.csai.cn/ncrefx/200703231548431006.htm 考点分析:http://ncre.csai.cn/ncrefx/200612281154001109.htm

VF程序设计辅导:http://ncre.csai.cn/ncrefx/200606280918141757.htm 二级C++

考试大纲:http://ncre.csai.cn/ncredg/200605160915441498.htm 资料下载:http://data.csai.cn/View_7745.html

历年试题:http://ncre.csai.cn/category.asp?class=v8

视频教程:http://platform.csai.cn/intro/ncre_c++.htm

重难点分析:http://ncre.csai.cn/ncrefx/200707131042431538.htm 二级java

考试大纲:http://ncre.csai.cn/ncredg/200605160911201577.htm 资料下载:http://data.csai.cn/View_7749.html

历年试题:http://ncre.csai.cn/category.asp?class=v6

视频教程:http://platform.csai.cn/intro/ncre_java.htm

重难点分析:http://ncre.csai.cn/ncrefx/200707130908401249.htm 二级Access

考试大纲:http://ncre.csai.cn/ncredg/200605170846131747.htm 资料下载:http://data.csai.cn/View_7743.html

历年试题:http://ncre.csai.cn/category.asp?class=v7 视频教程:http://platform.csai.cn/intro/ncre_access.htm

重难点分析:http://ncre.csai.cn/ncrefx/200708071015051882

本文来源:https://www.bwwdw.com/article/h0w6.html

Top