上机100套题及答案4150文档格式.docx
《上机100套题及答案4150文档格式.docx》由会员分享,可在线阅读,更多相关《上机100套题及答案4150文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
Input:
scanf("
%d"
&
k);
%s\n"
fun(k));
【参考答案】
(1)char*fun(intn)
(2)2
(3)n%i==0或!
(n%i)
【考点分析】
本题考查:
函数的定义;
for循环语句中循环变量的取值范围;
判定非素数算法。
【解题思路】
填空1:
根据main()中调用的函数fun(k),可知函fun的形参为int型变量,函数的返回值为字符型指针。
填空2:
判断一个数是否为素数时,也就是判断这个数是否有除了1和其自身之外的因子,所以for循环的变量从2开始,直到这个数的前一个数。
填空3:
如果一个数能被除了1和其自身之外的数整除(即余数为0),则这个数不是素数。
下列给定程序中,函数fun的功能是:
按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每5个元素求一个平均值,并将这些值依次存放在w所指的数组中。
若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。
例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。
请改正函数fun中的错误,使它能得出正确的结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#defineSIZE20
fun(double*s,double*w)
{intk,i;
doublesum;
for(k=2,i=0;
i<
SIZE;
i++)
{s[i]=k;
k+=2;
sum=0.0;
for(k=0,i=0;
{sum+=s[i];
/*************found**************/
if(i+1%5==0)
{w[k]=sum/5;
sum=0;
k++;
}
returnk;
{doublea[SIZE],b[SIZE/5];
inti,k;
k=fun(a,b);
Theoriginaldata:
\n"
for(i=0;
{
if(i%5==0)printf("
%4.0f"
a[i]);
\n\nTheresult:
k;
i++)printf("
%6.2f"
b[i]);
\n\n"
(1)错误:
if(i+1%5==0)正确:
if((i+1)%5==0)
【考点分析】本题考查:
if条件表达式。
本题除了考查循环语句以外,其实就是一道简单的数学题,循环条件if(i+1%5==0)是一个语法错误,这跟题目考查的知识点毫无关系,也就是说,做这样的题,只要读懂了题干意思,问题便可迎刃而解了。
程序定义了
的二维数组,并在主函数中自动赋值。
请编写函数fun(inta[][N],intn),该函数的功能是:
使数组左下半三角元素中的值乘以n。
例如,若n的值为3,a数组中的值为:
则返回主程序后a数组中的值应为:
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#defineN5
voidfun(inta[][N],intn)
main()
{
inta[N][N],n,i,j;
FILE*out;
*****Thearray*****\n"
i<
N;
i++)
{
for(j=0;
j<
j++)
a[i][j]=rand()%10;
%4d"
a[i][j]);
n=rand()%10;
n=%4d\n"
n);
fun(a,n);
*****THERESULT*****\n"
for(j=0;
j++)
a[i][j]);
/******************************/
out=fopen("
out.dat"
"
w"
j<
j++)
a[i][j]=i*j+1;
fun(a,9);
fprintf(out,"
fprintf(out,"
fclose(out);
/******************************/
fun(inta[][N],intn)
inti,j;
i++)
=i;
j++)
a[i][j]=a[i][j]*n;
}
for循环嵌套,获得二维数组的各个元素。
首先,从数组中找出要被乘以n的那部分元素,这一过程其实就是找出将被挑出的元素在原数组中的分布规律的过程。
通过观察得出,要被处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。
找到这个规律后,依次从数组中取得合乎要求的元素,然后乘以n。
第四十二套
给定程序中,函数fun的功能是:
在形参s所指字符串中的每个数字字符之后插入一个*号。
例如,形参s所指的字符串为:
def35adh3kjsdf7。
执行结果为:
def3*5*adh3*kjsdf7*。
voidfun(char*s)
inti,j,n;
s[i]!
='
\0'
;
if(s[i]>
0'
【1】s[i]<
9'
)
n=0;
while(s[i+1+n]!
=【2】)
n++;
for(j=i+n+1;
j>
i;
j--)
s[j+1]=【3】;
s[j+1]='
*'
i=i+1;
chars[60]="
ba3a54cd23a"
\ntheoriginalstringis:
%s\n"
s);
fun(s);
\ntheresultis:
(1)&
(2)0(3)s[j]或*(s+j)
if语句,根据题意确定条件表达式,很多情况下,往往配合逻辑运算符;
while循环语句,确定循环条件。
很明显,if语句中的条件是为了判断是否为数字,因此填入&
。
while语句判断是否到了字符串的结尾,因此填入0。
for语句使数字后的字符全都向后移一个单位,那么要使s[j+1]=s[j]。
找出一个大于给定整数m且紧随m的素数,并作为函数值返回。
请改正程序中的错误,使它能得出正确的结果。
intfun(intm)
{intI,k;
for(I=m+1;
;
I++)
{for(k=2;
k<
I;
k++)
if(I%k!
=0)
break;
if(k<
I)
return(I);
{intn;
\nPleaseentern:
"
n);
printf("
%d\n"
fun(n));
if(i%k!
=0)正确:
if(i%k==0)
(2)错误:
if(k<
i)正确:
if(k>
=i)
if条件语句;
求素数算法。
【解题思路】素数就是质数,本题的任务是随便输入一个整数m,然后在m的后面寻找紧跟m的一个质数,作为函数值返回。
for(i=m+1;
i++)是从m后面的一位开始循环,将m后面一位的值赋予i。
然后,我们依次判断m后面的一位是否为素数。
for(k=2;
k++)
if(i%k==0)
是一个简单的数学判断问题,判断i被赋予的值与k的余数是否为0。
请编写函数voidfun(intx,intpp[],int*n),它的功能是:
求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
例如,若x中的值为30,则有4个数符合要求,它们是1、3、5、15。
voidfun(intx,intpp[],int*n)
voidmain()
FILE*wf;
intx,aa[1000],n,i;
\nPleaseenteranintegernumber:
\n"
);
scanf("
&
x);
fun(x,aa,&
n);
for(i=0;
n;
%d"
aa[i]);
\n"
wf=fopen("
fun(30,aa,&
fprintf(wf,"
fclose(wf);
/*****************************/
voidfun(intx,intpp[],int*n)
inti,j=0;
for(i=1;
x;
i=i+2)
/*i的初始值为1,步长为2,确保i为奇数*/
if(x%i==0)
/*将能整除x的数存入数组pp中*/
pp[j++]=i;
*n=j;
/*传回满足条件的数的个数*/
偶数的判定方法;
整除的实现。
本题题干信息是:
能整除x且不是偶数的所有整数。
循环语句中,i从1开始且每次增2,所以i始终是奇数。
第四十三套
依次取出字符串中所有的小写字母以形成新的字符串,并取代原字符串。
voidfun(char*s)
intI=0;
char*p=s;
while(【1】)
if(*p>
a'
*p<
z'
s[I]=*p;
【2】;
p++;
s[I]=【3】;
charstr[80];
\nEnterastring:
gets(str);
\n\nThestringis:
str);
fun(str);
\n\nThestringofchangingis:
(1)*p
(2)i++或++i或i+=1或i=i+1
(3)'
while循环语句;
循环变量累加实现小写字母统计;
字符串结束标识'
while循环的循环条件是指针p所指的字符不是'
时,while循环结束。
如果指针p所指的字符为小写字母,则将这个字符存于原字符串s中,同时,下标自加1,为下一次存放做准备。
在取出所有小写字母并存于原字符串s后,要注意在最后加上字符串结束标志符'
计算并输出high以内最大的10个素数之和。
high由主函数传给函数fun。
例如high的值为100,则函数的值为732。
请改正程序中的错误,使程序能得出正确的结果。
math.h>
intfun(inthigh)
intsum=0,n=0,j,yes;
while((high>
=2)&
(n<
10))
yes=1;
for(j=2;
=high/2;
if(high%j==0)
yes=0;
break
if(yes)
sum+=high;
n++;
high--;
returnsum;
fun(100));
break正确:
break;
C语言中程序语法。
一个简单的程序语法错误,没有加分号。
请编写一个函数fun,它的功能是:
根据以下公式求
的值(要求满足精度0.005,即某项小于0.005时停止迭代)。
/2=1+1/3+1*2/(3*5)+1*2*3/(3*5*7)+1*2*3*4/(3*5*7*9)+…+1*2*3*…*n/(3*5*7*…*(2n+1))
程序运行后,如果输入精度0.0005,则程序输出3.14…。
doublefun(doubleeps)
doublex;
Inputeps:
%lf"
x);
\neps=%1f,PI=%1f\n"
x,fun(x));
fun(0.0005));
doublefun(doubleeps)
doubles=1.0,s1=1.0;
intn=1;
while(s1>
=eps)
/*当某项大于精度要求时,继续求下一项*/
{s1=s1*n/(2*n+1);
/*求多项式的每一项*/
s=s+s1;
/*求和*/
}
return2*s;
迭代法求多项式的值;
While循环语句;
return语句实现函数值的返回。
从第2项开始以后的每一项都是其前面一项乘以n/(2*n+1),程序中用s1来表示每一项,s来表示求和后的结果。
注意s1和s的初值都为1.0,返回时要乘以2,即return2*s,这跟数学思路有关系,学习者理解后就很简单。
【解题宝典】
迭代算法:
计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
第四十四套
从键盘输入一组小写字母,保存在字符数组str中。
把字符数组str中字符下标为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。
例如,输入"
acegikm"
则输出"
aCeGiKm"
#defineN80
voidfun(chars[])
while(【1】)
if(I%2!
s[I]-=【2】;
【3】;
charstr[N];
\nInputastring:
\n***originalstring***\n"
puts(str);
\n***newstring***\n"
(1)s[i]!
或s[i]
(2)32或'
-'
A'
(3)i++
小写字母转成大写字母;
奇数的判定方法。
while循环的条件是当前参加判断的字符不为'
,即还没有到字符串的结尾。
将小写字母转换为对应的大写字母的方法是,将小写字母的ASCII码减去32,如'
的结果就是32。
通过i++依次访问字符串s中的各个字符。
计算整数n的阶乘。
doublefun(intn)
doubleresult=1.0;
while(n>
1&
n<
170)
result*=--n;
return;
{intn;
Enteraninteger:
\n\n%d!
=%1g\n\n"
n,fun(n));
result*=--n;
正确:
result*=n--;
return;
returnresult;
阶乘的计算方法;
return语句,实现函数值的返回。
【解题思路】该题采用循环语句计算n的阶乘。
当n大于1且小于170时,令result与n相乘,同时n自动减1,循环至n=2(n=1时无须相乘)。
0和1的阶乘都等于1,可用条件语句和循环语句实现上述功能。
自增1、自减1运算符:
自增1运算符记为"
++"
其功能是使变量的值自增1。
自减1运算符记为"
--"
其功能是使变量值自减1。
自增1,自减1运算符均为单目运算,都具有右结合性。
有以下几种形式:
>
++i∶i自增1后再参与其他运算。
--i∶i自减1后再参与其他运算。
i++∶i参与运算后,i的值再自增1。
i--∶i参与运算后,i的值再自减1。
请编写函数fun,该函数的功能是:
计算n门课程的平均分,计算结果作为函数值返回。
例如,有5门课程的成绩是90.5,72,80,61.5,55,则函数的值为71.80。
#include