二级上机题.docx
《二级上机题.docx》由会员分享,可在线阅读,更多相关《二级上机题.docx(22页珍藏版)》请在冰豆网上搜索。
二级上机题
一、填空题
请补充fun函数,该函数的功能是:
判断一个年份是否为闰年。
例如,2007年不是闰年,2008是闰年。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
intfun(intn)
{
intflag=0;
if(n%4==0)
if(___1___)
flag=1;
if(___2___)
flag=1;
return___3___;
}
main()
{
intyear;
printf("Inputtheyear:
");
scanf("%d",&year);
if(fun(year))
printf("%disaleapyear.\n",year);
else
printf("%disnotaleapyear.\n",year);
}
二、改错题
下列给定程序中,fun函数的功能是:
根据形参n,计算如下公式的值。
例如,若输入5,则应输出2.28333。
请修改程序中的错误或在横线处填上适当的内容并把横线删除,使它能计算出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
#include
doublefun(intn)
{
doubles=1.0;
inti;
/******error**********/
for(i=2;i<=n;i++)
s+=1.0/k;
/******error**********/
___填空___
}
main()
{
intn;
printf("\npleaseenter1integernumbers:
\n");
scanf("%d",&n);
printf("\n\ntheresultis%lf\n",fun(n));
}
请编写函数fun,它的功能是:
求出1到500之内能被7或11整除,但不能同时被7和11整除的所有整数,并将它们放在b所指的数组中,通过m返回这些数的个数。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
voidfun(int*b,int*m)
{
}
main()
{
inta[500],m,i;
FILE*out;
fun(a,&m);
out=fopen("outfile.dat","w");
for(i=0;iif((i+1)%10==0)
{
printf("%5d\n",a[i]);
fprintf(out,"d\n",a[i]);
}
else
{
printf("%5d,",a[i]);
fprintf(out,"%d,",a[i]);
}
fclose(out);
}
一、填空题
【答案及难度指数】★
(1)n%100!
=0
(2)n%400==0(3)flag
【一起来审题】
(1)该题中函数功能是判断一个年份是否为闰年。
其中,闰年的条件是年数可以被4整除,即为闰年;被100整除而不能被400整除的为平年;被100整除也可被400整除的为闰年。
(2)从已给部分源程序的main主函数开始入手,主函数中的"if(fun(year))"判断语句,调用函数fun对年数进行判断。
(3)进入fun函数,利用if对年数进行判断。
【解题思路】
第一空:
根据闰年的条件和已有的语句"if(n%4==0)",知道这里的条件应该是能被4整除但要排除被100整除的整数,所以第一空填"n%100!
=0"。
第二空:
被100整除也可被400整除的为闰年,所以第二空填"n%400==0"。
第三空:
主函数中"if(fun(year))"语句是对函数返回值的判断,所以fun函数应该将对n的判断的flag值返回,第三空填"flag"。
【主要考点】if条件语句。
二、改错题
【答案及难度指数】★★
(1)s+=1.0/i;
(2)returns;
【一起来审题】
该题中函数功能是求题干累加公式的值。
从已给定源程序的main主函数开始入手,通过"printf("\n\ntheresultis%lf\n",fun(n));"语句调用fun函数,求得公式值。
【解题思路】
(1)第一个标识下,在以i为循环参数的for循环中进行公式累加,每一项为1.0/i,所以"s+=1.0/k;"改为"s+=1.0/i;"。
(2)第二个标识下,首先根据题干,将"填空"删除,函数定义为"doublefun(intn)",它有double型的返回值,所以这里返回累加公式的计算结果,即"returns;"。
【主要考点】函数功能;函数返回。
三、编程题
【答案及难度指数】★★★
intj,k=0;
for(j=2;j<500;j++)//循环条件
if((j%7==0||j%11==0)&&j%77!
=0)
//判断是否符合题干要求
b[k++]=j;//将结果放入数组b
*m=k;//将累加器值赋值给m
【一起来审题】
(1)该程序的解题思路,可以分解为以下几步:
判断是否被7整除→判断或者是否被11整除→并且不被77整除→按要求返回计算结果。
(2)从已给部分源程序的main主函数开始入手,核心函数"fun(a,&m);",其中m返回这些数的个数,a传给函数中的参数,存放计算结果的数组b。
【解题思路】
进入fun函数,根据前面的分析:
首先,定义变量k,设置为累计器,计算符合条件的数的个数。
然后,通过循环,判断小于500的每一个整数是否符合题干中的要求。
其中的判断条件能否被7或者被11整除为j%7==0||j%11==0,不能被11和7同时整除为j%77!
=0,它们之间的并关系就用&&连接,最后结果即为(j%7==0||j%11==0)&&j%77!
=0。
最后,将符合条件的整数存入数组b中,同时对k进行自加,将k值赋给m,返回结果。
【主要考点】数组操作;函数传值;if条件语句;for循环语句。
一、填空题
请补充函数fun(char*t),该函数的功能是把字符串中的内容逆置。
例如,字符串中原有的字符串为ABCDE,则调用该函数后,串中的内容为EDCBA。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
#include
#defineM60
voidfun(char*t)
{
intj,m=strlen(t)-1;
chars;
for(j=0;j{
s=t[j];
___2___;
___3___;
}
}
main()
{
charb[M];
printf("Inputastring:
");
gets(b);
printf("Theoriginalstringis:
");
puts(b);
fun(b);
printf("\n");
printf("Thereversalstring:
");
puts(b);
}
二、改错题
下列给定程序中,函数fun的功能是:
判断字符ch是否与s所指串中的某个字符相同,若相同,则什么也不做;若不同,则将其插在串的最后。
请修改程序中的错误,使它能得出正确的操作。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
#include
#include
/*******error*********/
voidfun(chars,charc)
{
while(*s&&*s!
=c)
s++;
/*******error*********/
if(*s=='c')
{
s[0]=c;
/*******error*********/
s[1]='0';
}
}
main()
{
charstr[81],ch;
printf("\nPleaseenterastring:
\n");
gets(str);
printf("\nPleaseenterthecharacter
tosearch:
");
ch=getchar();
fun(str,ch);
printf("\nTheresultis%s\n",str);
}
三、编程题
请编写函数fun,函数的功能是求出二维数组周边元素之和,作为函数值返回。
二维数组中的值在主函数中赋予。
例如,若二维数组中的值为:
3 5 7 9
9 9 9 4
9 9 9 8
则函数值为72。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#defineM3
#defineN4
intfun(intb[M][N])
{
}
main()
{
inta[M][N]={{3,5,7,9},{9,9,9,4},
{9,9,9,8}};
inti,j,sum;
FILE*out;
printf("Theoriginaldatais:
\n");
for(i=0;i{
for(j=0;jprintf("%6d",a[i][j]);
printf("\n");
}
sum=fun(a);
printf("\nThesum:
%d\n",sum);
printf("\n");
out=fopen("outfile.dat","w");
fprintf(out,"%d",sum);
fclose(out);
}
一、填空题
【答案及难度指数】★
(1)m--
(2)t[j]=t[m](3)t[m]=s
【一起来审题】
(1)该程序功能实现字符串的逆置。
把字符串中字符逆置就是把字符串中的第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,直到所有的元素交换完成为止。
(2)从已给部分源程序的main主函数开始入手,主函数调用"fun(b);",通过键盘输入字符串b,作为参数传给函数voidfun(char*t)中的t。
(3)进入fun函数,要想实现逆置,首先要求得字符串的长度。
通过"m=strlen(t)-1;"求得m的值即为字符串的长度。
然后通过for循环对字符串进行置换。
【解题思路】
第一空:
for(j=0;j第二空:
"chars;"用来定义存放临时的字符,"s=t[j];"的目的是首先用s存放字符串t的第j个字符,这样将第m个字符存放在j的位置,就首先实现了将后面的第m个字符置换到前面的第j的位置,所以第二空填t[j]=t[m]。
第三空:
前面实现了后面的第m个字符置换到前面的第j个字符,同时将第j个字符的内容存放在临时的字符s,现在就将这个临时字符s中的内容存放在第m个字符位置,这样就完成了j位置的字符与m位置字符的置换,所以第三空填t[m]=s。
【主要考点】字符数组。
【解题思路】
(1)第一个标识下,"voidfun(chars,charc)"根据主函数中的定义,知道s为数组名,传的应该是数组地址,所以应改为"voidfun(char*s,charc)"。
(2)while循环中对c与s进行匹配检查,第二个标识下,是当不同时执行连接操作,那么判断s是否为结尾的表达式应该是"if(*s=='\0')"。
(3)第三个标识下,连接后的新串要添加结尾符,所以正确的表达是将"s[1]='0';"改为"s[1]='\0';"。
【主要考点】函数定义语法;数组操作。
三、编程题
【答案及难度指数】★★★
inti,j,s=0;
for(j=0;j{
s+=b[0][j];
s+=b[M-1][j];
}
for(i=1;i<=M-2;i++)//统计列元素
{
s+=b[i][0];
s+=b[i][N-1];
}
returns;
【一起来审题】
该程序功能是求出二维数组周边元素之和。
其中周边元素是指数组的最上和最下的两行,最左和最右的两列。
数组第一行元素的行下标为0,最后一行元素的行下标为M-1,第一列的列下标为0,最后一列的列下标为N-1。
【解题思路】
进入fun函数,根据前面的分析:
求周边元素的和,可以采用两个循环分别把行元素和列元素相加。
但要避免把周边元素重复相加。
【主要考点】二维数组;for循环语句。
二、改错题
下列给定程序中,函数fun的功能是:
按以下递归公式求函数值。
10 (n=1)
fun(n)=
fun(n-1)+2 (n>1)
例如,当给n输入6时,函数值为20。
请修改程序中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
/********error********/
intfun(n)
{
intm;
/********error********/
if(n=1)
m=10;
else
m=fun(n-1)+2;
return(m);
}
main()
{
intn;
printf("Entern:
");
scanf("%d",&n);
printf("Theresult:
%d\n\n",fun(n));
}
三、编程题
请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按ASCII码降序排列。
例如,原来的字符串为Justabc,则排序后输出为Jutsbac。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#include
#include
voidfun(char*str,intn)
{
}
main()
{
charstr[10];
FILE*out;
printf("inputstringwithsevencharacters:
");
gets(str);
fun(str,7);
printf("\n%s",str);
out=fopen("outfile.dat","w");
strcpy(str,"Justsdf");
fprintf(out,"%s",str);
fclose(out);
}
二、改错题
【答案及难度指数】★★
(1)intfun(intn)
(2)if(n==1)
【一起来审题】
(1)该题中函数功能是按题目中给出的递归公式求函数值。
其中,递归是指函数直接或者间接调用函数本身的一种方法。
(2)从已给定源程序的main主函数开始入手,从键盘获得输入的参数n,然后通过"printf("Theresult:
%d\n\n",fun(n));"语句调用fun函数,计算公式的值。
【解题思路】
(1)定义函数fun时,形参n并没有指定参数类型,因此,"intfun(n)"改为"intfun(intn)"。
(2)根据题目要求,原题中的"if(n=1)"应该是用于判断n是否等于1,但是被错误表示成赋值表达式。
因此,"if(n=1)"应该改为"if(n==1)"。
【主要考点】函数定义;逻辑表达式。
三、编程题
【答案及难度指数】★★★
chart;
inti,j;
for(i=1;i//对n个元素进行循环选择
for(j=i+1;jif(str[i]{
t=str[i];
str[i]=str[j];
str[j]=t;
}
【一起来审题】
该程序功能是对字符的排序。
字符的排序有多种方法,如冒泡排序、选择排序等。
本题答案中采用的是选择排序。
其中,选择排序法的降序排序,首先从数组中挑选一个最大的元素,把它和第一个元素交换,接着从剩下的n-1个元素中再跳出一个最大的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。
【解题思路】
进入fun函数,根据前面的分析:
选择排序法中的降序排序,首先从数组中挑选一个最大的元素,把它和第一个元素交换,接着从剩下的n-1个元素中再挑出一个最大的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。
【主要考点】数组操作;函数传值;if条件语句;for循环语句。
一、填空题
请补充fun函数,该函数的功能是求一维数组a[N]的平均值,并对所得结果进行四舍五入保留两位小数。
例如,当a[10]={23.1,12.3,5.3,56.4,10.0,13.7,24.5,42,1.2,9.9}时,输出结果为:
average=19.840000。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
doublefun(doublea[10])
{
inti;
longtemp;
doubleaverage=0.0;
doublesum=0.0;
for(i=0;i<10;i++)
___1___;
average=sum/10;
average=___2___;
temp=___3___;
average=(double)temp/100;
returnaverage;
}
main()
{
doubleaverage,a[10]={23.1,12.3,5.3,
56.4,10.0,13.7,24.5,42,1.2,9.9};
inti;
printf("\nThedata:
\n");
for(i=0;i<10;i++)
printf("%6.1f",a[i]);
printf("\n\n");
average=fun(a);
printf("Theaverage=%f\n\n",average);
}
二、改错题
下列给定程序中fun函数的功能是:
将n个无序整数从小到大排序。
请修改程序中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
#include
#include
fun(intn,int*b)
{
inti,j,p,t;
for(j=0;j{
p=j;
/*******error*********/
for(i=j+1;iif(b[p]>b[i])
/******error**********/
t=i;
if(p!
=j)
{
t=b[j];
b[j]=b[p];
b[p]=t;
}
}
}
putarr(intn,int*z)
{
inti;
for(i=1;i<=n;i++,z++)
{
printf("%4d",*z);
if(!
(i%10))
printf("\n");
}
printf("\n");
}
main()
{
inta[10]={0,4,2,8,6},n=5;
printf("\n\nBeforesorting%dnumbers:
\n",n);
putarr(n,a);
fun(n,a);
printf("\nAftersorting%dnumbers:
\n",n);
putarr(n,a);
}
三、编程题
编写函数fun,函数的功能是:
根据以下公式计算,计算结果作为函数值返回。
p通过形参传入,例如,若p的值为21时,函数的值为1.909091。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#include
floatfun(intn)
{
}
main()
{
intn;
floatstr;
FILE*out;
printf("\nPleaseinputtheintegern:
");
scanf("%d",&n);
str=fun(n);
printf("Theresultis:
%f\n",str);
str=fun(10);
out=fopen("outfile.dat","w");
fprintf(out,"%f",str);
fclose(out);
}
一、填空题
【答案及难度指数】★★
(1)sum+=a[i]
(2)average*1000
(3)(average+5)/10
【一起来审题】
该题中函数功能是求一维数组的平均值。
此题的解题思路首先求得数组各元素的和,然后求得平均值,最后进行四舍五入处理。
【解题思路】
第一空:
利用for循环求得数组的总和,根据fun函数中定义sum存放总和,所以第一空填"sum+=a[i]"。
第二空:
题干中要求保留两位,这可以通过对指定数字扩大,对平均值扩大1000倍。
其中,通常求实数x保留m位小数,首先将x扩大10(m+1)倍,进行截取判断,最后进行恢复。
所以第二空填"average*1000"。
第三空:
四舍五入,如果值大于5那么加上5就会进位;反之,如果值小于5,加上5就不会进位,所以对扩大后的值加5,可以实现四舍五入的截取,第三空填"(average+5)/1