虎奔等级考试真题解读Word文件下载.docx
《虎奔等级考试真题解读Word文件下载.docx》由会员分享,可在线阅读,更多相关《虎奔等级考试真题解读Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
![虎奔等级考试真题解读Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/13/3dbeb425-4589-47fb-a531-5ec945d48207/3dbeb425-4589-47fb-a531-5ec945d482071.gif)
999||x<
0)
{ printf("
Pleaseinput(0<
x<
=999):
"
);
scanf("
%d"
&
x);
}
printf("
\nTheresultis:
%d\n"
fun(x));
}。
【微答案】
(1)0
(2)x (3)t++
【微分析】
填空1:
变量n用于存放符合条件的整数的个数,应赋初值为0。
填空2:
根据题目要求,确定循环变量t的取值范围t<
=x。
填空3:
循环变量t自增1操作。
二、程序改错题
给定程序MODI1.C中函数fun的功能是:
先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面。
例如:
当s所指的字符串为:
"
ABCDE"
时,则t所指的字符串应为:
EDCBAABCDE"
。
请改正程序中的错误,使它能得出正确的结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构!
string.h>
voidfun(char*s,char*t)
{
/************found************/
inti;
i=0;
sl=strlen(s);
for(;
i<
sl;
i++)
t[i]=s[sl-i];
for(i=0;
t[sl+i]=s[i];
t[2*sl]='
\0'
;
{ chars[100],t[100];
\nPleaseenterstrings:
%s"
s);
fun(s,t);
Theresultis:
%s\n"
t);
(1)inti,sl;
(2)t[i]=s[sl-i-1];
(1)变量s1没有定义。
(2)该循环实现将s串中的字符逆序存入t串中,t[i]对应s串中的s[sl-i-1]。
三、程序设计题
函数fun的功能是:
将a、b中的两个两位正整数合并形成一个新的整数放在c中。
合并的方式是:
将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。
例如,当a=45,b=12。
调用该函数后,c=1425。
部分源程序存在文件PROG1.C中。
数据文件IN.DAT中的数据不得修改。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
voidfun(inta,intb,long*c)
main()/*主函数*/
{ inta,b;
longc;
Inputab:
scanf("
%d%d"
&
a,&
b);
fun(a,b,&
c);
%ld\n"
c);
*c=a%10+(b%10)*10+(a/10)*100+(b/10)*1000;
本题的主要问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。
由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。
得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。
使用c时要进行指针运算。
找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数,然后输出;
例如,当x值为5时,100~999之间各位上数字之和为5的整数有:
104、113、122、131、140、203、212、221、230、302、311、320、401、410、500。
共有15个。
当x值为27时,各位数字之和为27的整数是:
999。
只有1个。
n=0;
=__1__){
s1=t%10;
s2=(__2__)%10;
if(s1+s2+s3==__3__)
t++;
while(x<
Pleaseinput(x>
0):
(1)999
(2)t/10 (3)x
题目要求找出100~999之间符合要求的数,所以while语句的循环条件是t<
=999。
变量s2存放三位数的十位,取出三位数十位数值的方法为s2=(t/10)%10。
题目需要判断各位上数字之和是否为x,所以if语句条件表达式是s1+s2+s3==x。
从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。
高位仍在高位,低位仍在低位。
例如,当s中的数为:
7654321时,t中的数为:
642。
voidfun(longs,longt)
{ longsl=10;
s/=10;
*t=s%10;
while(s<
0)
{ s=s/100;
*t=s%10*sl+*t;
sl=sl*10;
{ longs,t;
\nPleaseenters:
%ld"
s);
fun(s,&
t);
(1)voidfun(longs,long*t)
(2)while(s>
函数的形参类型应与实参类型相同,主函数中函数fun()的调用方式说明其参数应为指针类型,所以形参t应定义为long*t。
while循环的功能是,每循环一次就从s中的数上取出一位进行运算,直到取完为止,所以循环条件为s>
0。
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:
按分数的高低排列学生的记录,高分在前。
部分源程序在文件PROG1.C文件中。
#defineN16
typedefstruct
{ charnum[10];
ints;
}STREC;
voidfun(STRECa[])
STRECtmp;
inti,j;
for(i=0;
i<
N;
for(j=i+1;
j<
j++)
{ /*请按题目要求完成以下代码*/
{ STRECs[N]={{"
GA005"
85},{"
GA003"
76},{"
GA002"
69},{"
GA004"
85},
{"
GA001"
91},{"
GA007"
72},{"
GA008"
64},{"
GA006"
87},
GA015"
GA013"
GA012"
GA014"
91},
GA011"
66},{"
GA017"
GA018"
GA016"
72}};
FILE*out;
fun(s);
Thedataaftersorted:
\n"
for(i=0;
i<
N;
{ if((i)%4==0)printf("
printf("
%s%4d"
s[i].num,s[i].s);
out=fopen("
c:
\\test\\out.dat"
"
w"
);
{ if((i)%4==0&
&
i)fprintf(out,"
fprintf(out,"
%4d"
s[i].s);
fprintf(out,"
fclose(out);
STRECt;
for(i=1;
i++)/*用冒泡法进行排序,进行N-1次比较*/
for(j=0;
j<
N-1;
j++)/*在每一次比较中要进行N-1次两两比较*/
if(a[j].s<
a[j+1].s)
{t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}/*按分数的高低排列学生的记录,高分在前*/
对N个数进行排序的算法很多,其中最简单的排序算法是冒泡算法。
利用双层for循环嵌套和一个if判断语句来实现,外层循环用来控制需比较的轮数,内层循环用来控制两两比较。
将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。
例如,从主函数输入一个整数:
27638496,函数返回值为:
26846。
unsignedlongfun(unsignedlongn)
{ unsignedlongx=0,s,i;
intt;
s=n;
i=__1__;
while(__2__)
{ t=s%10;
if(t%2==0){
x=x+t*i;
i=__3__;
s=s/10;
returnx;
{ unsignedlongn=-1;
while(n>
99999999||n<
n<
100000000):
n);
fun(n));
(1)1
(2)s>
0 (3)i*10
变量i用来控制被取出的偶数在新数中的位置,应赋初值1。
while语句的循环条件是s>0。
变量i用来标识个位、百位和千位等。
输出M行M列整数方阵,然后求两条对角线上元素之和,返回此和数。
#defineM5
intfun(intn,intxx[][])
{ inti,j,sum=0;
printf("
\nThe%dx%dmatrix:
M,M);
for(i=0;
M;
i++)
{ for(j=0;
j++)
printf("
%f"
xx[i][j]);
for(i=0;
n;
sum+=xx[i][i]+xx[i][n-i-1];
return(sum);
main()
{ 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]);
(1)当用数组作为函数的形参时,可以不定义数组的行数,但一定要定义数组的列数。
(2)该处错误比较隐蔽,一般C语言上机考试很少涉及printf函数中的错误,此处只要明白"
d"
和"
f"
的区别就可以了。
格式字符d表示以带符号的十进制形式输出整数(正整数不输出符号);
格式字符f表示以小数形式输出单精度、双精度数据,隐含输出6位小数。
将a、b中的两个两位正整数合并形成一个新的整数放在c中。
合并的方式是:
将a中的十位和个位数依次放在变量c的千位和十位上,b中的十位和个位数依次放在变量c的个位和百位上。
调用该函数后,c=4251。
{
*c=b/10+(a%10)*10+(b%10)*100+(a/10)*1000;
本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。
得到后对应乘以1000、100、10、1,就可得到c的千位数、百位数、十位数和个位数。
注意使用c时要进行指针运算。
将形参n中,各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。
例如,输入一个整数:
64862。
{ unsignedlongx=0;
while(n)
{ t=n%10;
if(t%2==__1__)
x=__2__+t;
n=__3__;
(1)0
(2)10*x(3)n/10
定义变量t用来存放某数的各个位数值,此处判断t是否为偶数,即对2求余结果是否为0。
将t作为x的个位数,原来x的各个位上升1位,即x=10*x+1。
每循环一次,通过除法运算,去掉数值最后一位。
将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。
高位仍在高位,低位仍在低位。
87653142时,t中的数为:
7531。
voidfun(longs,long*t)
{ intd;
longsl=1;
t=0;
while(s>
{ d=s%10;
if(d%2==0)
{ *t=d*sl+*t;
sl*=10;
s/=10;
【微答案】
(1)*t=0;
(2)if(d%2!
=0)或if(d%2==1)
(1)由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。
因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即*t=0。
(2)变量d表示数s各个位上的数,此处的if条件应为判断d是否为奇数。
‘
编写一个函数fun,它的功能是:
实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。
例如,分别输入下面两个字符串:
FirstString--
SecondString
程序输出:
FirstString--SecondString
voidfun(charp1[],charp2[])
{ chars1[80],s2[40];
Enters1ands2:
%s%s"
s1,s2);
s1=%s\n"
s1);
s2=%s\n"
s2);
Invokefun(s1,s2):
fun(s1,s2);
Afterinvoking:
prin