上机100套题及答案8190.docx
- 文档编号:8641239
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:47
- 大小:52.61KB
上机100套题及答案8190.docx
《上机100套题及答案8190.docx》由会员分享,可在线阅读,更多相关《上机100套题及答案8190.docx(47页珍藏版)》请在冰豆网上搜索。
上机100套题及答案8190
2009年4月上机100套题81-90
第八十一套
请补充函数fun,该函数的功能是:
逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c数组中,形成一个新的字符串。
例如,若a中的字符串为aBCDeFgH,b中的字符串为ABcd,则c中的字符串应为aBcdeFgH。
注意:
部分源程序给出如下。
请勿改动上函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
voidfun(char*p,char*q,char*c)
{
intk=【1】;
while(*p【2】*q)
{if(*p<*q)
c[k]=*q;
elsec[k]=*p;
if(*p)p++;
if(*q)q++;
k++;
}
}
main()
{chara[10]="fshADfg",b[10]="sdAEdi",c[80]={'\0'};
fun(a,b,c);
printf("Thestringa:
");puts(a);
printf("Thestringb:
");puts(b);
printf("Theresult:
");puts(c);
}
【参考答案】
(1)0
(2)||
【解题思路】函数fun的功能是输出一个矩阵,并要求对角线上的元素赋值1,其他元素赋值0。
本题的关键是如何通过下标确定对角线上的元素。
对角线上元素的下标有两种情况:
一是行列下标相等;二是列下标等于最大下标减去行下标。
下列给定程序中,函数fun的功能是:
从字符串s中删除所有小写字母c。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
voidfun(char*s)
{inti,j;
for(i=j=0;s[i]!
='\0';i++)
if(s[i]!
='c')
/*************found**************/
s[j]=s[i];
/*************found**************/
s[i]='\0';
}
voidmain()
{chars[80];
printf("\nEnterastring:
");
gets(s);
printf("Theoriginalstring:
");
puts(s);
fun(s);
printf("Thestringafterdeleted:
");
puts(s);
printf("\n\n");
}
【参考答案】
1)错误:
s[j]=s[i];正确:
s[j++]=s[i];
(2)错误:
s[i]='\0';正确:
s[j]='\0'
【解题思路】由本题循环条件if(s[i]!
='c')可知,如果字符串中的字符不是'c',则执行循环,所以应该是s[j++]=s[i];,这样错误2中的问题也就清晰了。
假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
除了尾部的*号之外,将字符串中其他*号全部删除。
形参p已指向字符串中最后一个字母。
在编写函数时,不得使用C语言的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G******,删除后,字符串中的内容应当是ABCDEFG******。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
voidfun(char*a,charp[81])
{
}
voidmain()
{
FILE*wf;
chars[81],*t,p[81]="****A*BC*DEF*G******";
printf("Enterastring:
\n");
gets(s);
t=s;
while(*t)
t++;
t--;/*指针t指向字符串尾部*/
while(*t=='*')
t--;/*指针t指向最后一个字母*/
fun(s,t);
printf("Thestringafterdeleted:
\n");
puts(s);
/******************************/
wf=fopen("out.dat","w");
t=p;
while(*t)
t++;
t--;
while(*t=='*')
t--;
fun(p,t);
fprintf(wf,"%s",p);
fclose(wf);
/*****************************/
}
【参考答案】
voidfun(char*a,char*p)
{
char*t=a;
for(;t<=p;t++)
if(*t!
='*')
*(a++)=*t;
/*将p以前所有不是星号的字符保留下来*/
for(;*t!
='\0';t++)
*(a++)=*t;
/*将p以后的所有星号保留下来*/
*a='\0';
/*在字符串最后加上结束标记位*/
}
【解题思路】
删除字符串中非尾部*号,主要思想就是把不删除的字符保留起来。
本题曾在历年上机考试及模拟试题中多次出现,一般用两个循环语句来实现。
第1个循环的作用是将p以前所有不是*号的字符保留下来,即删除p以前所有的*号。
第2个循环的作用是将p以后的所有*号保留下来。
第八十二套
请补充函数fun,该函数的功能是:
在字符串的最前端加入n个*号,形成新串,并且覆盖。
注意:
字符串的长度最长允许为79。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编若干表达式或语句。
试题程序:
#include
#include
#include
#include
voidfun(chars[],intn)
{
chara[80],*p;
intI;
p=【1】;
for(I=0;I do {a[I]=【2】; I++; }while(【3】); a[I]=0; strcpy(s,a); } voidmain() {intn;chars[80]; system("CLS"); printf("\nEnterastring: ");gets(s); printf("\nThestring: %s\n",s); printf("\nEntern(numberof*): "); scanf("%d",&n); fun(s,n); printf("\nThestringafterinster: %s\n",s); } 【参考答案】 (1)s (2)*p++(3)*(p)或*p或*p! =0 【解题思路】 填空1: 一般情况下,指针都与数组有关联,根据下文可见,应填入数组的首地址。 填空2: 由题意可知,当加完*后,就要赋值字符串,将p的值赋给a数组。 填空3: 这里是一个判断条件,显然与字符串的结束有关,当为结束符时,判断条件为假,退出循环。 下列给定程序中,函数fun的功能是: 读入一个字符串(长度<20),将该字符串中的所有字符按ASCII码升序排序后输出。 例如,若输入edcba,则应输出abcde。 请改正程序中的错误,使它能统计出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include voidfun(chart[]) { charc; intI,j; /*************found**************/ for(i=strlen(t);i;i--) for(j=0;j /*************found**************/ if(t[j] { c=t[j]; t[j]=t[j+1]; t[j+1]=c; } } main() { chars[81]; system("CLS"); printf("\nPleaseenteracharacterstring: "); gets(s); printf("\n\nBeforesorting: \n%s",s); fun(s); printf("\nAftersortingdecendingly: \n%s",s); } 【参考答案】 (1)错误: for(i=strlen(t);i;i--) 正确: for(i=strlen(t)-1;i;i--) 或for(i=strlen(t)-1;i>0;i--) 本题是利用选择法对数组元素进行比较排序。 所谓选择法,是依次用当前取得的元素和它后面的元素进行比较,在第一个元素和它后面的元素顺次比较时,可以借助中间变量来对两个数进行交换,保证第一个元素始终存放数组中的最大数,以后依次挑选出次大数,这样最终的数组就是有序的。 Strlen函数在求字符串长度时,会加上结束符,所以要减1。 (2)这里是一个分析逻辑错误,题中要求按升序排序,所以应改为if(t[j]>t[j+1])。 假定输入的字符串中只包含字母和*号。 请编写函数fun,它的功能是: 将字符串尾部的*号全部删除,前面和中间的*号不删除。 例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是****A*BC*DEF*G。 注意: 部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include voidfun(char*a) { } voidmain() { FILE*wf; chars[81],t[81]="****A*BC*DEF*G*******"; printf("Enterastring: \n"); gets(s); fun(s); printf("Thestringafterdeleted: \n"); puts(s); /******************************/ wf=fopen("out.dat","w"); fun(t); fprintf(wf,"%s",t); fclose(wf); /*****************************/ } 【参考答案】 voidfun(char*a) { while(*a! ='\0') a++; a--; /*指针a指向字符串的尾部*/ while(*a=='*') a--; /*指针a指向最后一个字母*/ *(a+1)='\0'; /*在字符串最后加上结束标志位*/ } 【解题思路】 删除字符串尾部*号的主要思想就是把不删除的字符保留起来。 第八十三套 请补充main函数,该函数的功能是: 把字符串str1中的非空格字符拷贝到字符串str2中。 例如,若str1="gladtoseeyou! ",则str2="gladtoseeyou! "。 注意: 部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include #include #defineN80 voidmain() { staticcharstr1[N]="gladtoseeyou! "; charstr2[N]; intI=0,j=0; system("CLS"); printf("\n*****str1*****\n"); puts(str1); while(str1[I]) { if(【1】) str2[j++]=str1[I]; 【2】; } printf("\n*****str2*****\n"); for(I=0;I printf("%c",str2[I]); } 【参考答案】 (1)str1[i]! ='' (2)i++ 【解题思路】填空1: 如果当前字符不为空格,则将它保存在字符串str2中。 填空2: 在while循环中,通过i++取得字符串str1中当前字符的下一个字符,继续判断是否为空格。 已知一个数列从0项开始的前3项: 0,0,1,以后的各项都是其相邻的前3项之和。 下列给定的程序中,函数fun的功能是: 计算并输出该数列前n项的平方根之和sum。 n的值通过形参传入。 例如,当n=10时,程序的输出结果应为23.197745。 请改正程序中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include #include #include /*************found**************/ fun(intn) {doublesum,s0,s1,s2,s;intk; sum=1.0; if(n<=2)sum=0.0; s0=0.0;s1=0.0;s2=1.0; for(k=4;k<=n;k++) {s=s0+s1+s2; sum+=sqrt(s); s0=s1;s1=s2;s2=s; } /*************found**************/ returnsum } voidmain() {intn; system("CLS"); printf("InputN="); scanf("%d",&n); printf("%f\n",fun(n)); } 【参考答案】 (1)错误: fun(intn)正确: doublefun(intn) (2)错误: returnsum正确: returnsum; 【解题思路】 ANSI新标准允许使用这样一种方法对形参类型做说明,即在列出"整型表列"时,同时说明参数类型。 例如: intmax(intx,inty) {…} 相当于: intmax(x,y) intx,y; {…} 又如: floatfun(array,n) intarray[10],n; 可以写成: floatfun(intarray[10],intn) 通过上面的分析,大家应该对本题中的错误有所了解。 假定输入的字符串中只包含字母和*号。 请编写函数fun,它的功能是: 只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。 形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。 在编写函数时,不得使用C语言提供的字符串函数。 例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G。 注意: 部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include voidfun(char*a,intn,inth,inte) { } voidmain() { FILE*wf; chars[81],*t,*f; charp[81]="****A*BC*DEF*G*******"; intm=0,tn=0,fn=0; printf("Enterastring: \n"); gets(s); t=f=s; while(*t) {t++;m++;}/*m为字符串的长度*/ t--;/*指针t指向字符串尾部*/ while(*t=='*') {t--;tn++;}/*指针t指向最后一个字母,tn统计尾部'*'的个数*/ while(*f=='*') {f++;fn++;}/*指针f指向第一个字母,fn统计前导'*'的个数*/ fun(s,m,fn,tn); printf("Thestringafterdeleted: \n"); puts(s); /******************************/ wf=fopen("out.dat","w"); fun(p,21,4,7); fprintf(wf,"%s",p); fclose(wf); /*****************************/ } 【参考答案】 voidfun(char*a,intn,inth,inte) { inti,j=0; for(i=h;i /*第一个字母和最后一个字母之间的字符全不删除*/ a[j++]=a[i]; a[j]='\0'; /*在字符串最后加上结束标记*/ } 【解题思路】 注意循环变量i的初值(h)和终止值(n-e),由于h和e分别表示a中的前导*号和尾部*号的个数,n是字符串的长度,所以从a[h]到a[n-e-1]之间的所有字符都要保留,而其他字符均删除。 删除操作(即留下相应字符)现已由循环完成。 本题技巧部分: voidfun(char*a,intn,inth,inte) {a[n-e]='\0'; strcpy(a,a+h);} 另外请注意,a[n-e]的作用是在最后一个字母后加上字符串结束符。 本程序采用了strcpy()库函数。 第八十四套 给定程序中,函数fun的功能是: 有 矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。 例如,若N=3,有下列矩阵: 123 456 789 计算结果为: 100 650 10149 注意: 部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序: #include #defineN4 voidfun(int(*t)【1】) { inti,j; for(i=1;i { for(j=0;j { 【2】=t[i][j]+t[j][i]; 【3】=0; } } } main() { inti,j,t[][N]={12,21,33,44,52,45,36,27,18,9,66,73,84,45,36,27,18}; printf("\nTheoriginalarray: \n"); for(i=0;i { for(j=0;j printf("%4d",t[i][j]); printf("\n"); } fun(t); printf("\nTheresultis: \n"); for(i=0;i { for(j=0;j printf("%4d",t[i][j]); printf("\n"); } } 【参考答案】 (1)[N] (2)t[i][j](3)t[j][i] 【解题思路】填空1: 根据程序可知,传入参数为二维数组,所以填入[N]。 填空2: 根据题意可知,对称元素相加的和存放在左下三角元素中,那么填入的是t[i][j]。 填空3: 右上三角元素置0,那么填入t[j][i]。 下列给定程序中,函数fun的功能是: 计算n的5次方的值(规定n的值大于2且小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。 例如,7的5次方是16807,其低3位数的和值是15。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include intfun(intn,int*value) { intd,s,i; /*************found**************/ d=0; /*************found**************/ s=1; for(i=1;i<=5;i++) d=d*n; *value=d; for(i=1;i<=3;i++) { s=s+d%10; /*************found**************/ s=s/10; } returns; } voidmain() { intn,sum,v; do { printf("\nEntern(2 "); scanf("%d",&n); }while(n<=2||n>=8); sum=fun(n,&v); printf("\n\nTheresult: \nvalue=%dsum=%d\n\n",v,sum); } 【参考答案】 (1)错误: d=0;正确: d=1; (2)错误: s=1;正确: s=0; (3)错误: s=s/10;正确: d=d/10; 【解题思路】 (1)分析题目,这里属于逻辑错误,假如d=0,则d=d*n就不能计算n的5次方。 (2)在for循环中,如果s=1,就改变了d的个位数的值。 (3)s用来求个位、十位、百位的和,d是n的5次方的值,除以10,用来求十位、百位的值。 请编写函数fun,其功能是: 将s所指的字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。 例如,若s所指字符串中的内容为ABCDEFG123
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 100 答案 8190
![提示](https://static.bdocx.com/images/bang_tan.gif)