考点③注意两点,一是strcmp(a[i].name,a[j].name)比较a[i]和a[j]中的name谁大,二是“>”的使用,大于符号用于从小到大的排序,小于符号用于从大到小的排序。
2.结构体变量数据赋值
类似的题目:
51、78、82、92
voidfun(structstudenta)
{structstudentb;inti;
/**********found**********/
b=__1__;将形参a中的值赋值给结构体变量b,因此填入a进去即可
b.sno=10002;改变结构体变量b中的sno为10002
/**********found**********/
strcpy(__2__,"LiSi");将“LiSi”赋值给变量b中的name,因此填入b.name
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",b.sno,b.name);输出变量b中的学号和姓名
/**********found**********/
for(i=0;i<3;i++)printf("%6.2f",b.__3__);输出变量b中的成绩,因为成绩是一个数组有三个元素,因此用循环来控制输出,所以填入b.score[i]
printf("\n");
}
对比记忆:
structstudent考点①fun(structstudenta)
{inti;
a->sno=1002;考点②
strcpy(a->name,”LiSi”);考点③
for(i=0;i<3;i++)a->scare[i]+=1;考点④
returna;}
3.结构体和文件结合,类似的题目:
22、30、47、80、88
voidfun(char*filename,longsno)
{FILE*fp;
STUn;inti;
fp=fopen(filename考点①,"rb+");
/**********found**********/
while(!
__1__考点②)
{fread(&n,sizeof(STU),1,fp);考点③
/**********found**********/
if(n.sno__2__)break;
}
if(!
feof(fp))
{for(i=0;i<3;i++)n.score[i]+=3;
/**********found**********/
fseek(fp,-1L*__3__,SEEK_CUR);考点④
fwrite(&n,sizeof(STU),1,fp);考点⑤
}
fclose(fp);
}
考点1需要注意打开的是哪个文件,本题目中指向的是形参filename所指向文件。
考点2feof(fp)用于判断文件是否结束。
考点3fread(&n,sizeof(STU),1,fp)从文件中读取一个数据给变量n。
考点4fseek(fp,-1L*__3__,SEEK_CUR);将指针移动到当前位置前一位,由于指针指向的是结构体,因此fseek(fp,-1L*sizeof(STU),SEEK_CUR);
考点5写入数据fwrite(&n,sizeof(STU),1,fp);
(三)文件类型题目:
63、94、96
1、文件类型的题目,看清楚题目意思,定义一个文件的指针,第一个位置出现fp的时候要填FILE*;
2、掌握文件中fopen、fprintf、fscanf、fputs、fputc、fgets、fgetc、fseek、fwrite、fread、rewind函数的使用的格式。
fopen(“文件名”,“打开方式”);
fclose(文件指针);
fscanf(文件指针,格式控制字符串,输入列表项);
fprintf(文件指针,格式控制字符串,输出列表项);
fwrite(存入数据的指针,每一个数据占有的字节,输入数据的个数,文件指针);
fread(读出数据的指针,每一个数据占有的字节,输出数据的个数,文件指针);
3、文件打开之后要注意关闭文件,关闭文件的函数fclose(文件指针);
4、在循环语句中如果使用到的是while(!
feof())空格中填写的文件指针,表明判断的是文件指针是否已经指到了文件的末尾。
备注:
如果文件指针指到了文件的末尾,则feof返回的是非零值,如果没有指在文件的末尾,返回的是0值。
(四)数组类型的题目:
54、57、59、64、68、70、71、76、89、90、98、99
一维数组:
1、求一个数值数组中的所有值的平均值和把大于或者小于平均值的数辅导例外一个数组中。
在计算机平均值时,首先定义一个变量来存放平均分,平均分一般用av变量来代替,如果av已经定义但是没有赋初值,那么这个空填写的内容的为:
av=0;
2、求算平均值值时有两种方法,第一种是算出总的分数,最后再除以总的个数即可,如算1到6之间的数的平均值,首先算出1到6的和,其次用综合除以总的个数6,即可以得到平均值;第二种方法是用每一个数除以6再把所有的和加起来。
即1/6+2/6+3/6+4/6+5/6+6/6;所以在执行的一维数组中算平均值时也是存在来中情况,如果在for语句的后面有av=av/N;则第二个空一般的填写时av+=s[i];如果说没有av=av/N;则填写的是:
av+=s[i]/N;
3、在后面的一个空的填写的时候要注意变量的累加情况,如果变量使用了j和i,那么这一个空的填写的内容为:
j++;
4、如果一维数组中求的是把大于或者是小于平均值的数移动到数组的首部的时候,这种题目的解答时这样的,第一个空一般填写的内容为:
j++;第二个空填写的内容是-1;
5、对数组进行排序时:
如果是从大到小的排序的时候,用的是小于符号,如果是从小到大排序时使用的是大于符号。
二维数组:
1、二维数组的题目,填空的时候一般是填在函数调用,函数在调用时候写的应该是二维数组名;在定义函数的时候使用的是函数的类型和由m各元素组成一行的指针变量,假设二维数组的名字是ss,那么填写的内容是:
(*ss)[M];如果调用的是普通变量则填写的内容为:
intn;
2、二维数组遍历时,使用的是两个循环,使用的是循环的嵌套使用,第二个循环的使用的时候填写的内容为:
j=0;(特殊的特殊处理)
3、交换两个变量的值的使用的格式为:
t=a;a=b;b=t;
记住交换变量的格式和顺序。
4、如果二维数组是字符串的题目的时候,要记住字符串中函数的使用的格式;即:
strlen、strcmp、strcpy、sizeof、strcat的使用格式。
注意里面的格式中使用的都是和指针。
(五)字符串类型的题目
53、55、62、65、67、72、74、77、81、84、91、93、100
解题方法:
1、循环的条件是判断该字符是否和结束符(’\0’)相等,如果相等,说明该字符串结束,否则说明没有结束,继续循环。
2、把一个数字字符转变成对应的数值的格式是:
ch=ch-‘0’;把大写字母转变为小写字母的格式:
ch=ch+32;把小写字母转变为大写字母的格式为:
ch=ch-32;
3、区分好字符数组中的指针(p)和指针所指的值(*p)的关系。
在循环语句中,当指针往后走一个位置的时候,用的是指针的自加,而不是指针所指的值的自加。
即:
p++,不能是(*p)++,后者就是值的自加。
4、掌握字符数组中的函数的使用的格式。
即:
strlen、strcmp、strcpy、sizeof、strcat的使用格式。
注意里面的格式中使用的都是指针或是地址。
5、字符数组结束时都有一个结束符:
‘\0’;在字符数组中的题目中的结束后要加上一个结束符。
也可以用0来代替‘\0’。
6、如果考察的是字符串数组,注意函数定义中形参的定义,例如:
定义的是N行M列的二维数组来存放字符串。
那么voidfun(char(*ss)__1__,intk)
fun函数中的形参必须填入的是char(*ss)[M],不能是char(*ss)[N]考试的时候要特别注意。
(六)数学题目
52、58、60、66、69、73、83、95
解题方法:
1.如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0或者是0.0;如果以后用到的是乘除运算,则赋初值为1或者是1.0;
2.循环条件的填空,分析表达式的规律,看表达式中的最后一项的值是否到了第m项或者是第n项,如果到了第m或者第n项,则在循环中的第二个表达式中用到的是i<=m或者是i<=n;
3.循环条件中如果用的是while语句,则循环变量的初值应该在while的外面定义和赋初值,在循环语句中必须给变量自加或者是自减。
如果没有则一般填的是i++;
4.看表达式中的每一项的运算规则,按照运算的规则把每一项中的n值替换为i,特殊情况例外。
如果是表达式中用到的是间隔相加减的运算时,注意给中间变量赋初值为1或者是1.0;在后面的运算中给变量乘以一个-1,以改变中间变量的符号。
解题分析:
(1)看清题目中要求的题意,题目要求做什么就只需考虑什么。
(2)找出题目中的表达式:
当n=1时,表达式变为
,当n=2时,表达式为
,n不断的变化,得到的表达式值也不相同,题目中要求将n=1,n=2…n=n的值进行一个累加,最后得到一个结果赋值给变量s。
(3)通过以上的分析我们可以得到如下的信息:
1)需要一个变量来存储结果值。
对应到程序中,我们使用s来表示,因为
计算的结果可能为小数,因此将s定义为实型。
2)需要一个变量从1开始递增到n,对应到程序中用i表示。
3)需要用到循环的知识。
4)函数最后会将s的值进行返回。
doublefun(intn)
{inti;doubles,t;
/**********found**********/
s=__1__;需要给s赋初始值,一般赋值为0或是1,这里面有规律,在填空题中一定填入的是0。
/**********found**********/
for(i=1;i<=__2__;i++)需要填入的是i变量的初始值和结束值,结束值一般是通过实参传递给形参的,因此很多时候填入形参名即可。
{t=2.0*i;将2*i的值赋值给变量t,因此遇到
直接用t*t代替就行。
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/__3__;需要在(2.0*i-1)*(2.0*i+1)/__3__;中填入适当的值来补充完整表达式
,比较得知,(2.0*i-1)*(2.0*i+1)/__3__;缺少的是
部分,上面分析过
可以用t*t来代替,因此,第三个填入t*t就行!
}
returns;
}
二.改错题分类总结
改错题总的出错分为两大类:
语法出错和逻辑出错,此类题目是比较简单的题型,因此也是最容易把握的知识点。
注意:
错误都是出现在/**********found**********/下面的这一行。
只是下面的这一行,其他行都没有错误。
不能修改其他行。
做题方法:
1.首先拿到题目,先将题目详细看看,看清题目对做题时很有帮助的,特别是一些逻辑性较强的题目很有用。
有的同学可能会觉得题目太难了不想去读,其实在做改错题目时即便你不会也能把题目做对。
2.按照以下的步骤解决题目中的错误的内容,对应着修改。
修改完之后保存即可。
(一)语法错误
1.关键字出错:
在二级C语言考试中仅仅考查学生对基本的关键字掌握情况,比如:
整型就是int不是Int,知识点简单。
(1)6题第二个空:
If应该改为if;
(2)12题第二个空:
If应该改为if;
(3)23题第一空:
dounle应该改为double;
(4)35题第二空:
If应该改为if;90
(5)36题第二空:
Double应该改为double。
51题的第一空double
(6)2题第二空:
wihle应该改为while。
(7)return为小写,不能使大写的。
54、86
2.格式出错:
在考试中主要考查学生细心的程度,最喜欢考简单的知识点。
(1)少分号:
题第一空、28题第一空、29题第一空、34题第二空、37题第二空、48题第二空。
考查的知识点:
分号是语句结束的标志。
59、70、79、97、
(2)for语句的格式:
for(;;)中间用分号隔开不是用逗号隔开。
3题第二空、6题第一空、14题第二空都是出现了for语句格式出错的问题。
53、73
(3)if语句的格式:
if(表达式),if后面必须加上小括号。
37题第一空if后面必须加上小括号。
(4)命令行格式出错:
17题第一空中include命令少了#,正确的形式应该是#include“stdio.h”;
(5)常用函数格式:
A22题第一空中n=strlen[aa]应该改为n=strlen(aa),记住函数名后面一定是花括号,不能是方括号,方括号只有在数组下标中用到。
B49题第一空intj,c,floatxa=0.0;应该改为intj,c;floatxa=0.0;记住:
要同时定义两种以上不同的数据类型的时候必须在不同类型的数据中间加上分号。
C41题第二空scanf(“%d”,a[i][j]);应该改为scanf(“%d”,&a[i][j])。
考查Scanf输入函数的格式。
(6)数组:
A数组下标引用时候只能用中括号。
28题第二空t(k)=b(j)应该改为t[k]=b[j]。
B二维数组中的列下标不能省略。
46题第一空必须将数组列下标补充完整。
(7)常用符号出错:
AC语言中大于等于符号是“>=”,但是在考试的时候可能出现将它写为“=>”,49题第二空就是这样的错误。
B当题目中需要比较某个字符是否是大写字母或是小写字母、数字时,必须将“与”、“或”、“非”记住。
判断某个字符是否是大写字母:
charch;if(ch>=’A’&&ch<=’Z’)printf(“%c”,ch);
判断某个字符是否是小写字母:
charch;if(ch>=’a’&&ch<=’z’)printf(“%c”,ch);
判断某个字符是否是数字:
charch;if(ch>=’0’&&ch<=’9’)printf(“%c”,ch);
判断某个数字是否能同时被5和7整除:
inti=35;if(i%5==0&&i%7==0)printf(“%d”,i);
判断某个数字是否能被5或7整除:
inti=35;if(i%5==0||i%7==0)printf(“%d”,i);
判断某个数字是否是偶数或奇数:
inti=35;if(i%2==0)printf(“%d是一个偶数”,i);
elseprintf(“%d是一个奇数”,i);
(二)逻辑错误
1.使用了没有定义过的变量:
这种题目可以通过编译查找出出错的地方并改之。
(1)0(零)和o(字母欧)的区别:
19题第一空、23题第二空、43题第二空、51题第二空。
77、98、
(2)P(大)和p(小)的区别:
33题第一空。
82
(3)普通变量大小写的区别:
1).有的变量在定义的时候是小写但是在使用的时候是大写,或是在定义的时候是大写在使用的时候却是小写。
2).大小写没有出错,程序中直接使用了没有定义过的变量,要求学生更加细心的读题目。
45题第二空使用到了i这个变量,但是我们在定义行中没有找到i的定义,因此在做题时候要上下结合来分析题目。
22题第二空c=aa[j]中的c没有定义过,参看定义的语句不能发现应该是ch=aa[j]。
38题第一空要求将后面用到的变量s1定义完整。
2.运算符号出错:
(1)C语言中除号是“/”不是“\”
(2)赋值号(=)和等号(==)混淆,记住在if语句中出现赋值号(=)一般是讲它改为等号(==)。
14题第一空和29题第二空都是这样的错误。
87、91、94
3.表达式的取值范围出错:
当遇到计算表达式的累加或是累减时,一定用到循环来完成相应的操作。
例如:
改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:
for(i=2;i做这样的题目看两点:
一看题目中的表达式,二看for语句中变量的取值范围。
31题第二空同样的考点。
52.2、81、88、
4.C语言中的除法运算:
这个考点同样考查表达式的相关知识。
例如:
改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:
for(i=2;i赋值号左边问题不大,我们看看右边1/(i*i),其中i是整数,那么i*i也是整数,在C语言中1除以比它大的数时值为零。
这样和题目的要求就不相符。
记住:
1/2的值为零,只有1.0/2或是1.0/2.0的值为0.5。
39题第一空也同样是这种错误。
57、76
5.找最大值和排序问题:
遇到这种题目在改错题中最容易考查的是大于(>)、小于(<)等符号的变化,当你查找出错的地方没有语法错误,也没有使用了未定义的变量时,记住这个口诀:
将大于改为小于,将小于改为大于!
11题第二空、12题第一空和13题第二空、4题第二空都可以用这样的方法。
58
6.函数的返回值及其参数:
重点
intfun(intx,inty)main()
{{
if(x>y)returnx;inta,b,c;
elsereturny;scanf(“%d%d”,&a,&b);
}c=fun(a,b);
printf(“最大值为:
%d”,c);}
(1)函数的返回类型:
在上面的例子中fun函数的返回值是int,如果将int改为double,很明显是错误的。
从两个地方来看,首先returnx;中x的类型必须和fun函数中的返回值相同,x是整型。
其次c=fun(a,b);中fun函数将一个返回值赋值给了变量C,说明函数返回的值一定是整型。
记住:
函数调用、函数的返回值和ruturn中数据类型必须一致!
1.1、3.1、16.1、19.2、34.1、36.1、40.1、48.1、71都死这样的错误,(注1.1表示第一题第一空)。
78、89、90、
(2)return后面的表达式及其类型:
19.2、30.2、39.2
(3)函数传递的参数:
intfun(int*x,int*y)main()
{{
if(*x>*y)return*x;inta,b,c;
elsereturn*y;scanf(“%d%d”,&a,&b);
}c=fun(&a,&b);
printf(“最大值为:
%d”,c);}
一定注意:
传递的是值还是地址。
比较上面两个例子大家很容易区别传递的是值还是地址,第一个例子调用函数的时候传递的是值,因此在fun函数的形参中x和y仅仅是普通的变量,而第二个例子中调用函数的时候传递的是地址,因此在fun函数的形参中x和y就是两个指针变量。
5.1、13.1、17.2、20.1、25.2、52.1、56、84、85、依据刚刚讲的方法很快就能找出出错点。
100
(4)指针的使用:
intfun(int*x,int*y)
{
if(*x>*y)return*x;
elsereturn*y;
}
在此例中fun函数的形参是x和y,它们的类型是整型的指针,那么在fun函数的函数体中使用到x和y的值时一定要区分:
x>y比较的是x和y所存变量地址的大小,*x>*y才是比较值的大小。
如果存在*x=x+y;的类似情况一定是错误的,必须要将赋值号的左右两边的类型变为一致。
5.2、5.3、20.2、24.2、35.1、44.1、72、75、一定特别注意!
7.数组:
(1)数组下标的初始值:
数组下标从零开始,到长度减一结束。
考试技巧:
当出错行在定义部分时,先检查该定义语句有没有语法错误,再看定义语句中的变量有没有赋初始值,最后看变量赋的初始值有没有正确。
定义初始值有窍门,遇到累加时,用来存放累加和的变量一般赋值为零,遇到求阶乘时,用来存放阶乘值的变量一般赋值为一。
8.1中的变量k赋值为1,但是我们说了数组的下标只能从0开始,因此将1改为0就行了。
(2)普通变量的初始值:
依照上面的技巧,我们同样可以将它延伸到普通变量中。
41.1中需要将变量的值进行初始化,题目中有这样的要求:
“输出主对角线元素之和”,既然这样我们很肯定初始值应该为零,接着我们看看是给哪个变量赋值?
看printf(“sum=%d”,sum);输出的是sum的值,说明sum就是我们要补充在横线上的变量。
10.1也可以用同样的方法来分析。
(3)数组和字符串长度减一
当使用数组中的元素时,最大值只能到数组长度减一。
字符串以’\0’作为字符串的结束标志,因此取值最大也只能到字符串长度减一。
25.2中输出printf(“%d”,aa[i]);分析程序知道i在此时就是数组的长度,我们要输出数组中的元素,最大就只能到aa[i-1],因此改为printf(“%d”,aa[i-1]);就行了。
4.1和38.2中考查的是字符串长度减一的问题。
(4)数组下标往后走
当题目要求将一个数组中的元素直接赋值或是以某种方式复制到另一个数组中时,接受数据的