计算机等级考试上机真题解析.docx
- 文档编号:16659272
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:16
- 大小:31.31KB
计算机等级考试上机真题解析.docx
《计算机等级考试上机真题解析.docx》由会员分享,可在线阅读,更多相关《计算机等级考试上机真题解析.docx(16页珍藏版)》请在冰点文库上搜索。
计算机等级考试上机真题解析
计算机等级考试上机真题解析
距离求和专题
1、X[i],y[i]分别表示平面上一个点的坐标,求下列10个点与点(1.0,1.0)的距离的总和,并将结果以格式“%.6f”写入到考生文件夹中paper子文件夹下的新建文design2.dat
#include
#include
voidmain()
{
FILE*p;
inti;
floatx[10]={-1.5,2.1,6.3,3.2,-0.7,7.0,5.1,3.2,4.5,7.6};
floaty[10]={3.5,7.6,8.1,4.5,6.0,1.1,1.2,2.1,3.3,4.4};
floats=0.0;
}
2、完整程序
#include
#include
voidmain()
{
FILE*p;
inti;
floatx[10]={-1.5,2.1,6.3,3.2,-0.7,7.0,5.1,3.2,4.5,7.6};
floaty[10]={3.5,7.6,8.1,4.5,6.0,1.1,1.2,2.1,3.3,4.4};
floats=0.0;
floatdist;
for(i=0;i<10;i++)
{
dist=sqrt((x[i]-1.0)*(x[i]-1.0)+(y[i]-1.0)*(y[i]-
1.0));
s+=dist;
}
p=fopen("design2.dat","w");
fprintf(p,"%.6f",s);
fclose(p);
}
3、%m.n,m表示结果占的总列数,n表示小数点后有几位。
f格式:
用来输出实数(包括单、双精度),以小数形式输出。
有以下几种用法:
%f:
不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:
输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
4、机考试题一般都要求把结果写入到某一个文件中,所以大家要特别注意文件的使用。
4.1、FILE*p;定义文件指针一般都会给定;
4.2、打开文件p=fopen("design2.dat","w");注意写法,和这样一样写就可以了。
4.3、写入结果fprintf(p,"%.6f",s);
4.4、关闭文件fclose(p);
5、这是一个变种的求和问题。
你可以把每一个距离视为一个数值(在这里是小数),然后累加求和,那么就很简单了。
在这个程序里,我又定义了一个变量dist。
这样思路就比较清晰。
结构体
该程序计算四位学生的平均成绩,保存在结构中,然后列表输出这些学生的信息。
#include
structSTUDENT
{ charname[16];
intmath;
intenglish;
intcomputer;
intaverage;
};
voidGetAverage(structSTUDENT*pst) /*计算平均成绩*/
{ intsum=0;
sum=______1______;
pst->average=sum/3;
}
voidmain()
{ int i;
structSTUDENTst[4]={{"Jessica",98,95,90},{"Mike",80,80,90},
{"Linda",87,76,70},{"Peter",90,100,99}};
for(i=0;i<4;i++)
{ GetAverage(______2______);
}
printf("Name\tMath\tEnglish\tCompu\tAverage\n");
for(i=0;i<4;i++)
{ printf("%s\t%d\t%d\t%d\t%d\n",st[i].name,st[i].math,st[i].english,
st[i].computer,st[i].average);
}
}
参考答案
第1空:
pst->math+pst->english+pst->computer
第2空:
st+i
子函数GetAverage的功能是:
求一个结构体变量中各个分量的平均成绩;或者说求一个人(在这里一个结构体变量是一个人)的平均成绩。
sum=数学+英语+计算机。
由于structSTUDENT*pst,pst是指针变量,所以引用本结构体分量的时候要用箭头,
sum=pst->math+pst->english+pst->computer;
当然,如果structSTUDENTpst,那么pst是普通变量,则引用的时候要用点,
sum=pst.math+pst.english+puter;
在主函数中,考点是函数调用,所以实际参数应该是一个地址,可以是&st[i]或者st+i;注意:
st是数组的名称,也是数组的首地址(而且是常量),st+i也是地址,表示下标为i的元素的地址。
for(i=0;i<4;i++)
{ GetAverage(______2______);
}
递归
用递归法将一个六位整数n转换称字符串。
例如:
输入123456,应输出字符串"123456"。
详细解析过程请看本章《计算机等级考试上机真题解析:
递归》:
#include
voiditoa(longi,char*s)
{ if(i==0)
return;
/******1******/
*s='1'+i%10;
itoa(i/10,s-1);
}
voidmain()
{ longn;
charstr[7]="";
scanf("%ld",&n);
/******2******/
itoa(n,str+6);
printf("%s",str);
}
参考答案:
第1错:
*s=i%10+'0';
第2错:
itoa(n,str+5);
此题思路如下:
假设i=1,那么要转换成'1',那么应该是'0'+1='1',所以第1错的地方应该改为*s='0'+i%10;
题目已经规定六位整数,主函数里定义了一个数组是str,有7个元素。
并且被初始化为空字符(也就是'\0'),那么下标为6的元素最终应该保留为空字符('\0')。
个位数转换好之后应该放在下标为5的第六个元素的位置。
故第2错的地方应该改为:
itoa(n,str+5)
删除整数
调用函数f,去除数组中的负数,输入数组x[7],输出结果为:
1 3 4 6。
在本章《计算机等级考试上机真题解析:
删除整数》中,将通过编程实例详细为大家讲解删除整数的算法:
#include
voidf(int*a,int*m)
{ inti,j;
for(i=0;i<*m;i++)
if(a[i]<0){
for(j=i--;j<*m-1;j++)a[j]=a[j+1];
_____1_____; //
}
}
voidmain()
{ inti,n=7,x[7]={1,-2,3,4,-5,6,-7};
_______2_______; //
for(i=0;i printf("\n"); } 2、参考答案: 第1空: *m=*m-1; 第2空: f(x,&n); 3、删除一个整数数组(非字符数组)中的负数。 算法和删除字符的算法基本相似。 但是有其特殊性。 因为整数数组没有结束的标志空字符'\0'。 那么我们只能记住下标。 每删除一个负数,这个数组的有效下标就要缩小一个。 也就是第1空做的工作,*m的内容是总长度。 每次删除一个负数,这个总长度就要减1,所以第1空是*m=*m-1; 4、第2空就是子函数调用。 该子函数的两个形参都是指针,由子函数的第一行voidf(int*a,int*m); 而且返回类型是void,也就是说没有返回值。 x是数组的名称,也是首地址(当然还是一个常量),第二个参数要求是这个数组的长度,也要求是一个地址。 所以是: f(x,&n); 数学区间 为了方便大家更好的把握计算机等级考试的知识点,做到复习时候有的放矢,考试百科为大家提供了《计算机等级考试上机真题解析: 数学区间》系列内容,以下是本章第四部分内容: 1、输入整数n(n>0),求m使得2的m次方小于或等于n,2的m+1次方大于或等于n。 #include voidmain() { intm=0,t=1,n; while(_____1________); // while(! (t<=n&&t*2>=n)){ _____2_____ // m++; } printf(“%d\n”,m); } 2、参考答案 第1空: scanf(“%d”,&n),n<=0 //逗号表达式 第2空: t=t*2; 3、由于题目要求输入整数n,那么当输入的n<=0时,就用一个循环要求用户不停的输入,知道输入的n>0为止,这是第1空的思路。 那么这种用逗号表达式的写法请读者一定要注意,逗号表达式是一种很紧凑的一种解法。 4、在C程序里,如果不用pow(2,m)来求2的m次方,主要是没有头文件math.h,而且本题是不能加的。 所以要用累乘法,每次乘以2,也能达到这个效果。 t=t*2;注意t要初始化为1; 删除字符的三种算法 欢迎大家继续阅读本系列文章,在本章为各位备考计算机等级考试的同学提供《计算机等级考试上机真题解析: 删除字符的三种算法》,删除字符常用的算法主要有以下三种,本章将配合真题为大家讲解: 一、第一种算法(整体移动) 1、算法描述 1.1、逐个访问字符;如果字符串结束了,转到1.4; 1.2、找到要删除的字符(不保留的),将该字符以后的所有字符整体向前移动一个位置。 使用函数strcpy; 1.3、回到1.1; 1.4、结束 2、真题讲解 调用函数f,从字符串中删除所有的数字字符。 #include #include #include voidf(char*s) {inti=0; while(s[i]! ='\0'){ if(isdigit(s[i]))____1____(s+i,s+i+1); // strcpy ___2___ i++;} // else } voidmain() {charstr[80]; gets(str);f(str);puts(str); } 3、参考答案 第1空: strcpy; 第2空: else 4、注意目前找到的要删除的字符是s[i],其地址是s+i,其后的字符是从s[i+1]开始,也就是从地址s+i+1开始。 把后面的所有字符整体复制,然后粘帖到前一个位置。 strcpy(s+i,s+i+1);其头文件是string.h 特别注意这个时候,下标值是不用增长的,没有i++;然后,如果没有发生删除的情况,下标值要正常增长。 所以第2空是else; 5、本题中isdigit函数是判断是否是数字,其头文件是ctype.h; 函数名称: isdigit 函数原型: intisdigit(intch); 函数功能: 检查ch是否是数字(0-9) 函数返回: 是返回1,否则返回0 参数说明: 所属文件: 二、第二种算法(逐个移动) 1、算法描述 1.1、逐个访问字符;如果字符串结束了,转到1.4; 1.2、找到要删除的字符(不保留的),将该字符以后的所有字符逐个向前移动一个位置。 不使用其他函数; 1.3、回到1.1; 1.4、结束 2、程序 #include #include voidf(char*s) { inti=0,j=0; while(s[i]! ='\0') { if(isdigit(s[i])) { for(j=i;s[j]! ='\0';j++)//从s[i+1]开始逐个向前移动一个位置,包括空字符'\0' s[j]=s[j+1];//做删除操作时,下标i保持原地不动; } else i++; } } voidmain() { charstr[80]; gets(str); f(str); puts(str); } 三、第三种算法(保留法) 1、算法描述 1.1、逐个访问字符;如果字符串结束了,转到1.4; 1.2、如果是合法字符(要保留的),将该字符保留,如果是不合法的(要删除的),则忽略(也就是下标j不增加)。 不使用其他函数; 1.3、回到1.1; 1.4、结束 2、真题讲解 将字符串s中所有的字符'c'删除。 #include voidmain() { chars[80]; inti,j; gets(s); for(i=j=0;______1______;i++) // if(s[i]! ='c') { s[j]=s[i]; ______2______ // } s[j]='\0'; puts(s); } 2、参考答案: 第1空: s[i]! ='\0' 第2空: j++; 4、第1空在判断字符串是否结束。 第2空的意思是如果是合法字符(要保留的),那么将其保留,并且j下标增加1,j是合法字符的下标;i是所有字符的下标。 如果是不合法字符(要删除的),则忽略,i会增长1,但是j不增长1; 全局变量和局部变量 感谢大家对本系列文章的关注,本章我们将继续为正在备考计算机等级考试的同学提供《计算机等级考试上机真题解析》系列内容,本章为大家讲解全局变量和局部变量知识点: 1、局部变量: 定义在函数体内; 全局变量: 定义在函数体外; 静态变量: (static变量) 1).局部(请同学们重点掌握静态局部变量) a.静态局部变量在函数内定义,生存期为整个源程序(注意是整个源程序),但作用域与自动变量相同,只能在定义该变量的函数内使用(注意是函数内)。 退出该函数后,尽管该变 量还继续存在,但不能使用它。 b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。 而对自动变量不赋初值,则其值是不定的。 2).全局 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 但是他们的作用域,非静态全局变量的作用域是整个源程序(多个源文件可以共同使用);而静态全局 变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。 自动变量: 我们平时定义的inta;都是自动变量,它前面省略了一个auto; 2、真题解析 2007年春试题5 阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序】 #include intk=1; voidFun(); voidmain() { intj; for(j=0;j<2;j++) Fun(); printf("k=%d",k); } voidFun() { intk=1; printf("k=%d,",k); k++; } (17)程序的输出是 (17) 。 A、k=1,k=2,k=3 B、k=1,k=2,k=1 C、k=1,k=1,k=2 D、k=1,k=1,k=1 (18)将第11行改为“staticint k=1;”后,程序的输出是 (18) 。 A、k=1,k=1,k=1 B、k=1,k=1,k=2 C、k=1,k=2,k=1 D、k=1,k=2,k=3 (19)将第11行改为“k=1;”后,程序的输出是 (19) 。 A、k=1,k=2,k=1 B、k=1,k=1,k=1 C、k=1,k=1,k=2 D、k=1,k=2,k=3 (20)将第11行改为“;”后,程序的输出是 (20) 。 。 A、k=1,k=1,k=2 B、k=1,k=2,k=3 C、k=1,k=1,k=1 D、k=1,k=2,k=1 2、参考答案: (17)、D (18)、C (19)、C (20)、B 3、第17题解析: #include intk=1; //第2行 voidFun(); voidmain() { intj; for(j=0;j<2;j++) Fun(); printf("k=%d",k);//第8行,这个k是全局变量。 和第2行的k是一样的。 } voidFun() { intk=1; //这个k是局部变量,他的生存期只能在fun子函数里面。 作用域只能在定义该变量的fun函数内使用; printf("k=%d,",k); k++; } 第1次调用fun,局部变量k=1;输出1;然后k=2;出了fun函数则k被释放,局部变量k就没有了。 第2次调用fun,局部变量k被重新定义,初始化为1,输出1,然后k=2;出了fun函数则k被释放,局部变量k就没有了。 第8行的k为全局变量,k=1; k=1,k=1,k=1 4、第18题解析: #include intk=1; //第2行 voidFun(); voidmain() { intj; for(j=0;j<2;j++) Fun(); printf("k=%d",k);//第8行,这个k是全局变量。 和第2行的k是一样的。 } voidFun() { staticintk=1; //这个k是静态局部变量,他的生存期是整个源程序。 作用域只能在定义该变量的fun函数内使用; printf("k=%d,",k); k++; } 静态局部变量生存期是整个源程序,也就是说出了fun子函数,k也不会被释放。 但是要注意只能在fun函数里使用, 第1次调用fun,静态局部变量k=1;输出1;然后k=2;出了fun函数则k不释放,静态局部变量依然存在。 第2次调用fun,静态局部变量k不用重新定义,不用初始化为1,输出2,然后k=3。 第8行的k为全局变量,k=1; k=1,k=2,k=1 5、第19题解析 #include intk=1; //第2行 voidFun(); voidmain() { intj; for(j=0;j<2;j++) Fun(); printf("k=%d",k);//第8行,这个k是全局变量。 和第2行的k是一样的。 } voidFun() { k=1; //这个k是全局变量,和第2行是一样的,他的生存期是整个源程序。 作用域也是整个源程序使用; printf("k=%d,",k); k++; } 第1次调用fun,全局变量k=1;输出1;然后k=2;出了fun函数则k不释放,全局变量依然存在。 第2次调用fun,全局变量k=1,输出1,然后k=2。 第8行的k为全局变量,输出2; k=1,k=1,k=2 6、第20题解析 #include intk=1; //第2行 voidFun(); voidmain() { intj; for(j=0;j<2;j++) Fun(); printf("k=%d",k);//第8行,这个k是全局变量。 和第2行的k是一样的。 } voidFun() { ; //取消了k的初始化; printf("k=%d,",k); k++; } 第1次调用fun,输出1;然后k=2;出了fun函数则k不释放,全局变量k依然存在。 第2次调用fun,输出2,然后k=3。 第8行的k为全局变量,输出3; k=1,k=2,k=3 Fibonacci数列专题讲解 许多同学对Fibonacci数列还不是很理解,而Fibonacci数列是历年C语言考题中经常会出现的问题,在此考试百科的小编为大家整理了一篇《计算机等级考试上机真题解析: Fibonacci数列专题讲解》帮助大家更好的学习相关知识: 1、斐波那契数列特点: a、除第一项和第二项之外,任意一项是前面两项之和。 b、第一项和第二项的值是首先给定的。 2、真题解析 本题的考点是斐波那契数列和子函数的结合。 本题主要考了斐波那契数列。 2009年下半年计算机等级考试二级c语言试题3 阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案 【程序说明】 计算并输出Fibonacci序列前10项之和。 要求定义和调用函数fun(fib,n)。 该函数将Fibonacci序列前n项的值存放在一维数组fib中。 Fibonacci序列: 1,1,2,3,5,8,13,21, 34,55,……。 该序列的第一个数和第二个数都是1,从第三个数开始,每个数都是前两个数之和。 运行示例: sum=143 【程序】 #include main() { inti,sum,a[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机等级考试 上机 题解