计算机二级上机解题技巧.docx
- 文档编号:30086084
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:46
- 大小:1.29MB
计算机二级上机解题技巧.docx
《计算机二级上机解题技巧.docx》由会员分享,可在线阅读,更多相关《计算机二级上机解题技巧.docx(46页珍藏版)》请在冰豆网上搜索。
计算机二级上机解题技巧
一、填空题
(一)链表类型题目包括:
15、42、43、50、56、75、79、85、86、87
技巧解析:
1、首先看清楚题目要求和意思。
看清楚链表有没有带头结点,如果带有头结点,指向数据源的指针内容是p=h—>next;如果是不带有头结点,则填写的是p=h;
2、如果所要填写的空在循环语句while的括号中的时候,里面的内容填写的是p或者是q,以最近出现的为主;如果是在循环语句的里面的时候,填写的是q=p—>next;
3、如果是排序的时候,从小到大的时候是大于号,从大到小的时候是小于号。
4、如果链表题目中考到调用函数,一般只需要填入实参head,例如:
fun(head);在构造链表的时候都会有头结点,一般用head来表示,head指向了链表中的第一个数据的地址。
细化分类:
1.将数据域中的数据进行排序,类似题目:
15、42
voidfun(NODE*h)
{NODE*p,*q;intt;
/**********found**********/
p=__1__;指向数据源,由于h是带头结点的链表,因此需要填入h->next
while(p){判断链表p是否已经到末尾
/**********found**********/
q=__2__;比较两个数的大小,因此需要q指向p中的下一个数据需要填入p->next,也就是说p指向了第一个数据,q指向了第二个数据。
while(q){判断q是否指向了末尾
/**********found**********/
if(p->data__3__q->data)从小到大排序,因此填入大于符号
{t=p->data;p->data=q->data;q->data=t;}交换数据
q=q->next;q自增,目的是比较出最小的数据
}
p=p->next;p自增
}
}
联想记忆分析1:
对一维数组进行从小到大排序
voidfun(intb[N])
{inti,j,a;
for(i=0;i for(j=i;j if(b[i]>b[j]){a=b[i];b[i]=b[j];b[j]=a;} } } 联想记忆分析2: 对结构体数组按照姓名进行从小到大排序 for(i=0;i for(j=i;j if(strcmp(a[i].name,a[j].name)>0){a=b[i];b[i]=b[j];b[j]=a;} 2.将数据域中的元素逆置,类似的题目: 43、50 链表中数据域中的元素逆置,首先将第一个数据取出来放在最后一个位置,也就是将其next置空,表示已经到了末尾。 接着将第二个数据放到第一个的前面,依次类推即可将整个数据域逆置。 voidfun(NODE*h) {NODE*p,*q,*r; /**********found**********/ p=__1__;指向数据源,由于h是带头结点的链表,因此需要填入h->next /**********found**********/ if(__2__)return;填入p==NULL,判断第一个数据是否为空,如果为空就无需逆置,执行return语句,结束函数的执行。 q=p->next;q指向了p的下一个数据,确保链表的完整性 p->next=NULL;将第一个数据取出来放在最后一个位置,也就是将其next置空,表示已经到了末尾。 while(q) {r=q->next;用来跟踪数据,指向了q的下一个数据 q->next=p;将第二个数据放到第一个的前面,依次类推即可将整个数据域逆置。 /**********found**********/ p=q;q=__3__;这里需要将q指向后面的数据,因此可以填入q->next,或者是r都可以。 } h->next=p; } 联想记忆分析1: 数组元素的逆置 inta[10]={1,2,3,4,5,6,7,8,9,10}; inti,j=0,b[10]; for(i=9;i>=0;i--){b[j]=a[i],j++;} 数组的逆置只需从数组长度减一开始往后将元素放在另外一个数组中就行。 联想记忆分析2: 字符串的逆置 voidfun(char*str) {char*p; intlen; len=strlen(str); while(len) {*p=str[len-1]; len--; p++; } } 函数的功能实现了指针p指向了字符串str逆置后的首地址。 3.输出数据,释放结点,缩短链表,类似的题目: 56 4.给一个递增有序的链表插入一个新结点,并保持链表有序。 类似的题目: 87 5.统计结点个数,计算结点之和。 类似的题目: 75、85 6.删除链表中数据域值相同的节点,保留一个。 类似的题目: 79 (二)结构体类型的题目: 2、9、16、22、23、30、33、47、51、78、80、82、88、92、97 1.对数据进行排序,类似的题目: 2、97 注意: 排序涉及到数据的经典交换,所要填写的数据有窍门。 例如: t=a;a=b;____需要填空,根据交换的“三步曲”很容易确定这个空一定填入b=t。 for(i=0;i for(j=i;j if(strcmp(a[i].name,a[j].name)>0)考点③ {a=b[i];b[i]=b[j];b[j]=a;} 考点①中要求填入i 考点②必须填入i 考点③注意两点,一是strcmp(a[i].name,a[j].name)比较a[i]和a[j]中的name谁大,二是“>”的使用,大于符号用于从小到大的排序,小于符号用于从大到小的排序。 2.将形参a所指的结构体变量中的数据赋值给结构体变量b,进行相应的修改,类似的题目: 9、16、23、33、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); (三)文件类型的题目: 22、28、30、32、47、63、80、88、94 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值。 (四)数组类型的题目: 3、4、7、20、24、26、39、40、41、54、57、64、68、70、71、76、89、90、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的使用格式。 注意里面的格式中使用的都是和指针。 5、特殊的特殊处理。 第7题的填空的内容记住。 (五)字符串类型的题目: 5、8、10、11、12、14、18、19、21、34、35、45、48、49、53、55、62、65、67、72、74、77、81、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]考试的时候要特别注意。 (六)数学题目: 6、13、25、29、36、46、52、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)少分号: 2题第一空、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)普通变量大小写的区别: A有的变量在定义的时候是小写但是在使用的时候是大写,或是在定义的时候是大写在使用的时候却是小写。 B大小写没有出错,程序中直接使用了没有定义过的变量,要求学生更加细心的读题目。 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 二级 上机 解题 技巧