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