上机考试攻略
- 格式:doc
- 大小:37.50 KB
- 文档页数:6
四川省计算机二级C上机考试攻略<!=======程序调试题部分======!>一、错误数量从第二十四次(2006年4月)考试开始至今,错误数量一致设为5处,改对一处得8分。
二、推荐改错流程1、阅读试题。
(1)看清试卷上要求修改的程序名称。
正式考试时工作目录下会出现多个C源程序,打开时不要弄错了.(2)了解程序功能。
试卷上有该程序功能说明,并且有时还会出现在程序中使用的一些变量、数组等的名称,读题时即可了解这些数据的作用,有助于等会儿更好地分析程序。
(3)注意“注意”。
试卷上改错题一般会有“注意:不得增加行或删除行,不得更改程序结构。
”字样。
但偶然还是有例外。
曾在第二十次第二套题中,出现了“注意:可以增加和修改程序行,但不得删除程序中的整行。
在一处增加的程序行不得超过两行,不得更改程序的结构。
”。
改错时增加了一行代码。
2、通读程序。
阅读完试卷的说明后,先别急着去编译、连接和运行。
应先通读整个程序,了解程序的整体结构和算法实现。
修改你能发现的错误,有些错误是相当明显的。
C程序从主函数开始运行,阅读程序也需从主函数开始。
当发生函数调用时,再转到被调用函数去阅读,执行结束或遇return语句返回。
C常见错误地方(按一般程序流程):(1)输入语句(相当常见,基本每一次考试都有)常见错误为2种情况:a.用scanf函数接收整型或其它数值型变量值。
错误:scanf (“%d”, m ) 改正:m改为&m 点评:在scanf函数后的接收参数均使用的是地址值。
如果是一般变量,前加取地址运算符&,如果是指针,直接使用指针变量名(指针本身代表地址),如果是字符数组接收字符串。
则直接使用字符数组名(数组名代表数组首地址)。
此外还要注意输入格式控制是否正确。
b.用gets接收字符串时。
错误:char a[100]; gets(a[100]); 改正:gets(a);点评:当定义了一个数组例如a[100], 在程序的执行语句中再也不可能见到a[100]了,如果是访问数组元素,其下标只能是0-99。
另外,当数组用作函数实参时,一般都使用数组名,其意为:将数组首地址传递给形参。
(2)函数调用时(相当常见,基本每套改错题都在调用时有错)函数调用格式:函数名(实参1,实参2。
)。
函数调用时的错误原因较为复杂。
大致可分为以下几种情况:a.函数调用时参数个数不对。
函数调用要求实参和形参(定义函数时首部括号里的参数)个数要相等。
这种错误一般是调用时缺少实参。
最近在第25次考试第二套题中出现过。
b.函数调用时参数类型不匹配。
函数调用要求实参和形参类型要一致。
形参和实参类型如果不一致,则需修改其中一方。
具体是哪一方出错需结合具体题目判定。
这种错误出现次数最多。
c.函数返回值出问题或与定义返回类型不一致。
对于涉及到有返回值的被调用函数,要注意几个问题。
1. return返回的值是否满足题意要求.例如第27次第一套题return后未返回mid.2. 返回值类型是否同函数名前的返回类型保持一致. 例如第27次第一套题函数返回了整型值,但函数返回类型却定义为void类型.3. 如果在主函数中将函数返回值赋给了某变量,该变量类型是否和函数返回类型一致.这种出错情形较少见。
(3) 实现程序功能的核心代码处在实现该程序功能的关键代码部分,通常会设置1到2处,甚至有时会设置3-4处错误。
这部份的错误需要仔细分析该算法才能找出错误的地方。
这部分中的错误多为运算符或表达式出错。
经常出错的运算符:”<”和”<=”,”>”和”>=”,”=”和”==”,”==”和”!=”,”<”和”>”,”+=”和”-=”,”&&”和”||”,”!”等。
经常出错的表达式:如指针法访问数组元素等。
例如:在第26次考试第一套改错题是选择法对8个数由大到小排序。
在实现选择法这段代码中一共出现了4处错误。
原代码:for(i=0;i<n-1;i++){p=i;for(j=1;j<n;j++) /* j=1改为j=i+1 */if(a[p]>a[j]) /* >改为<*/p=j;temp=a[p];a[p]=a[j]; /* a[j] 改为a[i]*/a[j]=temp; /* a[j] 改为a[i]*/}(4)输出语句部分。
输出格式控制或输出表达式有误。
如:第25次第3套,针对长整型变量n.输出代码:printf(“ The result is:%d”,n); /* %d 改为%ld*/第27次第5套:输出整型数组a中的元素,原代码:for(i=0; i<n; i++)printf(“%4d”,a); /* a改为a[i] */(5)其它地方:a. 数据定义及初始化。
阅读完毕后,对各数据含义应该明确了,此时检查各数据是否正确定义,尤其注意被调用函数形参定义部分(每一个形参都应单独定义),另外部分数据可能要在定义时初始化。
例如:在第27次第2套被调用函数中:int n,i=0; /*n应改为n=0*/在第27次第3套中:int fun(int s , int n ) /* int s 应改为int *s */b. 预处理命令。
主要是头文件包含可能不正确。
例:第二十三次第一套题,在程序中使用了pow()函数,错误代码:#include <string.h> /* string.h 改为math.h */3、编译、连接;试运行通读并修改完程序后,按F9键编译和连接(注意:请勿直接使用Ctrl+F9运行程序,因为如果程序无错(error)但有警告(warnning),直接运行将无法看到警告)。
如果编译和连接过程报错或警告,根据屏幕下方消息框中的提示信息进行相应修改,直到无错和警告为止。
然后再使用Ctrl+F9运行程序,如果结果不正确,此时有2种办法:(1)回到第2步,继续读程序修改错误,然后再编译、连接和试运行。
重复这2步一直到正确为止。
(2)进行第4步。
4、使用跟踪执行功能,定位出错位置。
(此处操作较复杂,需教师结合具体试题讲解示范一次)注意:在进行这一步之前,你应该要完成程序语法错误的修改,即这时程序是可以执行的,只是执行结果不正确。
TurboC提供了一个跟踪执行(Trace into)的功能,快捷键F7。
它是把程序的运行分解为以行为单位,即每按一次F7,只执行程序中一行代码。
同时配合菜单最后一项“Break/Watch”菜单中相应命令,设置要观察的变量或表达式。
在每执行完一行后,观察屏幕下方“watch”框中你添加的要观察的各个数据的变化情况。
如果在哪一行执行完毕后,数据的变化和预期的不一致,那么错误地方肯定就在刚才执行的这一行。
如果碰到循环次数很多的循环,还可配合Toggle breakpoint命令设置断点。
<!=======编程题部分======!>-、阅读编程要求举例:第27次第3套编程题:/**********************************************************************/编写程序test3-2.c(60分)按要求编写程序:(1)编写函数fun,其功能是:统计形参s所指字符串中数字字符出现的次数,并存放在形参t所指的变量中。
例如:形参s所指字符串为:abcdef35agd3khe7,则数字出现的次数为4。
(2)在main函数中,从已有文件test3-2.in中读出一行字符(字符个数不超过80个)到字符数组str中,调用函数fun,统计出数字出现的次数,并在屏幕上输出结果。
/**********************************************************************/(1)注意要求你编写的程序文件名字,该题要求文件名为test3-2.c。
文件名不能乱取,否则极有可能被判0分。
(2)了解程序功能和结构。
注意在题目中出现的变量、数组、函数和文件的名字,在编程时也应采用这些名字。
此题要求编写main和fun两个函数,fun函数形参有s和t,main函数里要从文件”test3-2.in”读字符串到字符数组str里。
进一步分析还可知s应为字符型指针,t为整型指针。
程序结构为main数执行输入、调用fun函数和输出,fun函数完成统计。
二、建立程序文件(1)新建文件。
选择“File”菜单->“new”命令,将新建一个名为NONAME.C的文件。
(2)修改文件名。
选择“File”菜单->“Write to”命令。
直接输入文件名,此题即直接输入test3-2.c后回车。
修改后可从屏幕右上角看到是否是“TEST3-2.c”,如果不是,重新执行“write to”命令。
注意:(1)文件名大小写无影响。
(2)第2步也可用选择“File”菜单->“Save”命令,不过此时可修改文件名以及路径。
而路径在考试时是不允许修改的(未保存在考试工作目录下的文件不能上传至服务器)。
(3)由于此前考试中有不少学生误改了路径或名字,造成编程题得0分。
所以有时考试前机房工作人员好人做到底,已将编程题文件建好了,内容为空,此时考生只需通过”File”菜单->”Load”打开该文件进行编写即可。
三、编写程序(好习惯:编写过程中随时按F2保存)首先要知道C语言编程是非常灵活的,同一道题给不同的人编程是不可能完全一样的。
所以无固定方法可循,不过在考试时,如果题目要求越多,限制条件越多,则编的程序应该越接近。
在第27次考试及以前,编程题均涉及文件,大多数时候还涉及函数调用。
以此题为例:(1)依据题意打好程序框架结构:定义已知道的数据和函数,文件打开和关闭,数据输入和输出,函数调用。
#打开头文件此题结构:#include <stdio.h> 头文件可根据需要最后添加返回类型fun(形参定义) void fun(char *s, int *t){ {定义数据;功能实现;} }void main() void main(){ { char str[80];定义数据; int n; /* 保存统计的数字字符个数*/ 打开文件; FILE *fp;输入语句;fp=fopen(“test3-2.in”,”r”); /*打开出错处理代码略*/ 函数调用; fgets(str,80,fp);输出语句;fun( str , &n );关闭文件; printf(“%d\n”,n);} fclose(fp);}注意:如果涉及函数调用的编程,则最好将被调用函数定义放在主函数前,此举可避免在主函数声明被调用函数。
(2)程序核心功能代码编写。