全国计算机等级考试二级C语言资料机试Word格式.docx
《全国计算机等级考试二级C语言资料机试Word格式.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C语言资料机试Word格式.docx(57页珍藏版)》请在冰豆网上搜索。
若主函数中仅用语句形式调用函数,则需要通过形参间接地返回所得结果。
(4)选择适当的算法进行编程,输入程序语句。
不要忘记及时存盘!
(5)编译程序,直到没有语法错误。
(6)调试程序,利用试题中给出的例示数据进行输入(若要求输入的话),运行程序,用示例的输出数据检验输出结果,直到结果相同。
特别要注意:
程序设计题要求完全设计正确才会给分,因此,要么是40分,要么是0分,不会给中间分。
那么想通过机试,程序填空题和程序修改题通常来说必须全部正确才能容易通过,否则不容易通过。
上机改错题重点题型归类分析
分类一:
简单语法错误
◆题型一:
符号遗漏
1、下列程序的功能是:
读入一个整数k(2≤k≤10000),打印它的所有质因子(即所有为素数的因子)。
例如,若输入整数:
2310,则应输出:
2、3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include“conio.h”
#include“stdio.h”
/**************found**************/
IsPrime(intn);
{inti,m;
m=1;
for(i=2;
i<
n/i++)
if!
(n%i)
{m=0;
break;
}
return(m);
}
main()
{intj,k;
clrscr();
printf(“nPeaseenteranintegernumberbetween2and10000:
”);
scanf(“%d”,&
k);
printf(“nnTheprimefactor(s)of%dis(are):
”,k);
for(j=2;
j<
=k;
j++)
if((!
k%j))&
&
(IsPrime(j))}
printf(〃n%4d〃,j);
printf(〃n〃);
【参考答案】
(1)IsPrime(intn)
(2)if(!
(n%i))
【解题技巧】常见的符号遗漏问题包括以下两种:
(1)分号问题
●遗漏分号:
k++——>
k++;
break——>
break;
returnsum——>
returnsum;
●分号多余:
if(k>
1);
{}——>
1){}
while(k>
1){}
switch();
switch(){}
(2)遗漏括号
ifk>
1——>
if(k>
1)if!
(n%i)——>
if(!
(n%i))
whilek>
while(k>
1)
◆题型二:
符号出错
2、给定程序MODI1.C中函数fun的功能是:
用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止:
π111
┄┄≈1-┄┄+┄┄-┄┄+...
4357
例如,程序运行后,输入0.0001,则程序输出3.1414。
请改正程序中的错误,使它能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include<
math.h>
stdio.h>
floatfun(floatnum)
{ints;
floatn,t,pi;
t=1;
pi=0;
n=1;
s=1;
while(t>
=num)
{
pi=pi+t;
n=n+2;
s=-s;
t=s%n;
pi=pi*4;
returnpi;
main()
{floatn1,n2;
printf("
Enterafloatnumber:
"
);
scanf("
%f"
&
n1);
n2=fun(n1);
%6.4f\n"
n2);
(1)while((fabs(t))>
=num)
(2)t=s/n
3、下列给定程序中,函数fun的功能是:
从低位开始取出长整型变量s中偶数位上的数,一次构成一个新数放在t中。
例如,当s中的数为7654321时,t是的数为642。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
conio.h>
/************found************/
voidfun(longs,longt)
{longsl=10;
s/=10;
*t=s%10;
while(s<
0)
{s=s/100;
*t=s%10*sl+*t;
sl=sl*10;
main()
{longs,t;
clrscr();
nPleaseenters:
"
);
%ld"
&
s);
fun(s,&
t);
Theresultis:
%ldn"
t);
(1)voidfun(longs,long*t)
(2)while(s>
【解题技巧】符号出错会表现在以下七个方面:
(1)“%”和除号“/”混淆,如inti=j/k;
——>
inti=j%k;
有时候反过来考,将“%”改为“/”
(2)赋值号“=”和等号“==”混淆
如if(i=j)——>
if(i==j)while(i=j)——>
while(i==j)
(3)复合赋值出错,如:
i\=10——>
i/=10,除号是左下的斜线
(4)强制转换出错,如inti=int(f)——>
inti=(int)f强制转化是在类型上加括号
(5)大小写问题,如IF(){}—>
if(){}或For(){}—>
for(){}注:
所有的关键字都是小写字母
(6)条件判断时的符号问题(要根据具体题意来修改)
如if(fabs(n-m)<
0.0001)——>
if(fabs(n-m)>
0.0001)if(*s<
*p)——>
if(*s>
*p)
for(;
j<
=n;
)——>
n;
)int*a[10]——>
int(*a)[10]
(7)浮点数不能比较大小,只能用绝对值来比较
◆题型三:
变量定义出错
4、程序的功能更是求方程2x3-4x2+3x-6=0的一个根,求要求绝对误差不超过0.001。
例如,若给m输入-100,给n输入90,则函数求得的一个根值为2.000。
请改正程序中的错误,使它能得出正确结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构。
doublefunx(doublex)
{return(2*x*x*x-4*x*x+3*x-6);
doublefun(doublem,doublen)
{
intr;
r=(m+n)/2;
while(fabs(n-m)<
0.001)
{if(funx(r)*funx(n)<
0)m=r;
elsen=r;
r=(m+n)/2;
returnr;
{doublem,n,root;
Entermn:
\n"
scanf("
%lf%lf"
m,&
n);
root=fun(m,n);
root=%6.3f\n"
root);
【参考答案】:
(1)doubler;
(2)while(fabs(m-n)>
【解题技巧】变量定义可能会出现以下三种错误:
(1)变量定义时没有初始化,或者初始化的值不对,如ints=1——>
ints=0,一般在累加求和时容易出现此类错误
(2)变量定义出错,如intsum=0.0——>
doublesum=0.0或者是使用变量前并没有定义
(3)变量定义的类型和程序中使用的类型不匹配,如intr——>
doubler;
◆题型四:
赋值出错
5、给定程序MODI1.C中函数fun的功能是:
将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。
高位仍在高位,低位仍在低位。
例如,当s中的数为:
87653142时,t中的数为:
7531。
请改正程序中的错误,使它能得出正确的结果。
voidfun(longs,long*t)
{intd;
longsl=1;
t=0;
while(s>
0)
{d=s%10;
if(d%2==0)
{*t=d*sl+*t;
sl*=10;
s/=10;
{longs,t;
\nPleaseenters:
fun(s,&
Theresultis:
%ld\n"
t);
(1)*t=0;
(2)if(d%2!
=0)
6、下列给定程序中,函数fun的功能是:
实现两个整数的交换。
例如给a和b分别输入60和65,输出为:
a=65b=60
voidfun(inta,b)
{intt;
t=b;
b=a;
a=t;
{inta,b;
Entera,b:
%d%d"
a,&
b);
fun(&
a=%db=%dn"
a,b);
(1)voidfun(int*a,int*b)
(2)t=*b;
*b=*a;
*a=t;
【解题技巧】在解题时,要注意以下几种常见的错误:
(1)赋值时类型不匹配。
如char*r,*p;
if(r==p)——>
if(*r==*p),*r,*p才是内容
charch="
\0"
;
charch='
\0'
字符是用单引号括起来
0'
此时是将字符0赋给ch变量,而不是\0
——>
charch=0;
'
的ASCII码就是0,可直接用0进行赋值
(2)指针类赋值出错(左右两边类型不一致)
如:
int*a;
intx=10,t=20;
a=&
x;
t;
指针只能存放变量的地址
将变量赋给指针所指向的变量
(3)实现交换时赋值出错
if(a<
b){t=a;
b=t}------>
a=b;
b=t;
错误形式正确形式
分类二:
固定语法格式搭配错误
输入输出格式出错
1、给定程序MODI1.C中,fun函数的功能是:
先从键盘上输入一个3行3列矩阵的各个元素的值,然后输出主对角线元素之积。
请改正程序中的错误,或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
intfun()
inta[3][3],sum,i,j;
***********************************
_____;
for(i=0;
i<
3;
i++)
{for(j=0;
j++)
*****************************************
scanf(“%d”,a[i][j]);
i<
i++)
sum=sum*a[i][i];
printf(“Sum=%dn”,sum);
main()
{fun();
(1)sum=1;
(2)scanf("
%d"
a[i][j]);
2、给定程序MODI1.C中函数fun的功能是:
输出M行M列整数方阵,然后求两条对角线上元素之和,返回此和数。
#defineM5
intfun(intn,intxx[][])
{inti,j,sum=0;
printf("
\nThe%dx%dmatrix:
\n"
M,M);
for(i=0;
M;
i++)
{for(j=0;
%f"
xx[i][j]);
for(i=0;
n;
sum+=xx[i][i]+xx[i][n-i-1];
return(sum);
{intaa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf("
\nThesumofallelementson2diagnalsis%d."
fun(M,aa));
(1)intfun(intn,intxx[][M])
(2)printf("
xx[i][j]);
【解题技巧】注意输入输出的正确格式,关注容易出错的地方,如下图
正确形式错误形式
scanf(“%d”,a[i][j])——>
scanf(“%d”,&
a[i][j])
inti,*p=&
i;
scanf(“%d”,&
p)——>
scanf(“%d”,p);
inti=10;
printf(“%f”,i);
printf(“%d”,i);
printf(“%d”,“string”);
printf(“%s”,“string”);
选择结构中的基本格式问题
3、给定程序MODI1.C中函数fun的功能是:
用递归算法计算斐波拉契数列中第n项的值。
从第1项起,斐波拉契数列为:
1、1、2、3、5、8、13、21、……
例如,若给n输入7,该项的斐波拉契数值为:
13。
请改正程序中的错误,使它能得出正确结果。
longfun(intg)
/**********found**********/
switch(g);
{case0:
return0;
case1;
case2:
return1;
return(fun(g-1)+fun(g-2));
{longfib;
intn;
Inputn:
n=%d\n"
n);
fib=fun(n);
fib=%d\n\n"
fib);
(1)switch(g)
(2)case1:
return1;
case2:
return1;
【解题技巧】注意选择结构的正确语法格式,关注容易出错的地方,如下图
循环结构中的基本格式问题
4、给定程序MODI1.C中函数fun的功能是:
根据整型形参m的值,计算如下公式的值。
111
t=1-------------……------
2*23*3m*m
例如,若m中的值为:
5,则应输出:
0.536389。
doublefun(intm)
{doubley=1.0;
inti;
for(i=2;
m;
y-=1/(i*i);
return(y);
{intn=5;
\nTheresultis%lf\n"
fun(n));
(1)for(i=2;
=m;
i++)
(2)y-=1.0/i/i;
分类三:
函数类错误(考试重点、难点,出现的频率非常高)
函数定义时出错
1、给定程序MODI1.C中函数fun的功能是:
根据形参m的值(2≤m≤9〕,在m行m列的二维数组中