c语言程序设计上机题目.docx
《c语言程序设计上机题目.docx》由会员分享,可在线阅读,更多相关《c语言程序设计上机题目.docx(12页珍藏版)》请在冰豆网上搜索。
c语言程序设计上机题目
1
、请编一个函数fun,它的功能是:
根据以下公式求π的值(要求满足精度0.0005,即,某项小于0.0005时停止迭代):
程序运行后,如果输入精度0.0005,则程序输出多少。
注意:
部分源程序存在PROG1.C中,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。
试题源程序如下:
#include<stdio.h>
#include<math.h>
doublefun(doubleeps)
{
}
main()
{doublex;
printf("Inputeps:
");
scanf("%lf",&x);printf("\neps=%lf,PI=%lf\n",x,fun(x));
}
分析:
(1)本题所用基本算法应为累加。
假设累加值放在变量s中,累加项放在变量t中,累加操作由语句s=s+t;来实现。
(2)若称为第1累加项,则其前的1为第0累加项,其后的一项为第2累加项,按给定的公式可知,从第1累加项开始,后一项的累加项是前一项的值乘以。
所以当前的累加项应当是:
t=t*n/(2.0*n+1.0)。
表达式右边的t中是前一项的值,表达式左边的t为当前的每累加累加项。
请注意,不要写成:
t*n/(2*n+1)而进行整除。
(3)若第0累加项的1作为s的初值,语句:
s=s+t;执行n次,就把第1到第n项累加到了s中。
每进行一次累加,n值增1。
(4)把以上操作放在循环中。
按本题规定,当某项小于eps(0.0005)时停止迭代,因此若用while循环,可用t>=eps作为控制循环进行的条件:
while(t>=eps){s+=t;n++;t=t*n/(2.0*n+1);}
(5)注意应给所用变量赋适当的初值。
(6)退出循环后,函数的返回值应是:
2*s。
3.请编写一个函数voidfun(charm,intk,intxx[]),该函数的功能是:
将大于整数m且紧靠m的k个素数存入xx所指的数组中。
例如,若输入17和5,则应输出:
19,23,29,31,37。
注意:
部分源程序存在PROG1.C中,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。
试题源程序如下:
#include<stdio.h>
voidfun(intm,intk,intxx[])
{
}
main()
{intm,n,zz[100];
printf("\nPleaseentertwointegers(m&n):
");
scanf("%d%d",&m,&n);
fun(m,n,zz);
for(m=0;m<n;m++)printf("%d",zz[m]);
printf("\n\n");
}
分析:
(1)本题的基本算法是求素数。
假设有整数i,若i不能被2到i之间的任意一个数除尽,则i就是素数;若一旦能被某个数除尽就不是素数。
(2)以下是求i是否为素数的基本算法:
变量ok用作i是素数的标志,ok为1,则i是素数。
ok=1;
for(p=2;p<i/2;p++)
if(i%p==0){ok=0;break;}
if(ok)……
(3)本题要求把大于m的k个素数存入xx所指的数组中。
所以,i的值应大于m;取大于m的值逐一进行判断,若是素数就放入xx所指数组中。
把以上语句放入一个循环中:
for(i=m+1,j=0;?
;i++)
{ok=1;
for(p=2;p<=i/2;p++)
if(i%p==0){ok=0;break;}
if(ok){xx[j]=i;j++;}
}
此处,变量i统计存入数组中元素的个数,同时作为下标。
(4)按本题的要求,外循环结束的条件应当是:
j<k(j的值从0到k-1)。
只要求得了k个素数,就可退出循环。
因此在?
处应填入j<k。
∙ 1.一下程序
fun(intx,inty)
{staticintm=0,i=2;
i+=m+1;m=i+x+y;returnm;}
main()
{intj=1,m=1,k;
k=fun(j,m);printf("%d,",k);
k=fun(j,m);printf("%d\n",k);
}
参考答案:
5,11
2.若有定义:
char*x="abcdefghi";能正确运用了strcpy函数的是:
chary[10];*s;strcpy(s=y+1,x+1);
3.有以下程序执行后W结果是;
intfun1(doublea){returna*a;}
intfun2(doublex,doubley)
{doublea=0,b=0;
a=fun1(x);b=fun1(y);return(int)(a+b);}
main()
{doublew,w=fun2(1.1,2.0);.......}
参考答案:
5.0
4.设函数的fun定义形式为:
voidfun(charch,flaotx){.....}
则对函数fun的调用语句是:
fun(32,32);
5.已有定义chara[]="xyz",b[]={'x','y','z'};则叙述正确的是:
a数组的长度大于b数组长度
∙ 6.一下叙述错误的是C)
A.对于double类型数组,不可以直接用数组名进行整体输入或输出
B.数组名代表的是数组所占存储区的首地址,其值不可改变
C.当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息
D.可以通过赋值的方式确定数组元素的个数
7.有以下程序:
charfun(charx,chary)
{if(x
returny;}
main()
{inta='9',b='8',c='7';
printf("%c\n",fun(fun(a,b),fun(b,c)));
}
参考答案是:
7
8.若定义以下函数:
doublemyadd(doublea,doubleb)
{return(a+b);}
并将其放在调用语句之后,则在调用之前应对其说明,正确的说明有:
doublemyadd(double,double);
doublemyadd(doubleb,doublea);
doublemyadd(doubiex,doubley);
9.有以下程序,执行后输出的是:
fun(intx,inty)
return(x+y);}
main()
inta=1,b=2,c=3,sum;
sum=fun((a++,b++,a+b),c++);
printf("%d\n",sum);}
参考答案:
8
10.有以下程序结果是
#defineP3
F(intx)
{return(P*x*x);}
main()
{printf("%d\n",F(3+5));}
参考答案:
192
∙一、DOS操作题
1 删除当前目录下的目录ZSF\DAS。
答案:
RD ZSF\DAS
2 将当前目录下的目录KUY\GWE中的文件BTY.EXE改名为KJH.EXE。
答案:
REN KUY\GWE\BTY.EXE KJH.EXE
二、调试修改程序题
下面程序中函数fun的功能是:
根据整型形参m,计算如下公式的值:
y=1+1/2!
+1/3!
+1/4!
+...+1/m!
例如:
若m=6,则应输出:
1.718056。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include〈conio.h〉
#include〈stdio.h〉
/ *错误在fun函数中 * /
double fun(int m)
{int y=1, t=1;
int i;
for(i=2; i〈=m; i++)
{t=t*1/i; y+= t; }
return(y);
}
main()
{int n;
clrscr();
printf("Enter n:
");
scanf("%d", &n);
printf("\nThe result is %1f\n", fun(n));
}
答案:
对fun子程序进行修改,修改以后的程序如下:
double fun(int m)
{ double y=1, t=1; /*类型应为 double*/
int i;
for(i=2; i〈=m; i++)
{t=t*1.0/i; y+= t; }
/* 此处应为 double 类型的数据进行运算*/
return(y);
}
转贴于:
计算机二级考试_考试大
【责编:
daiy 纠错】
三、编程题
请编一个函数int fun(int pm),它的功能是:
判断pm是否是素数。
若pm是素数,返回1;若不是素数,返回0。
pm的值由主函数从键盘读入。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include 〈conio.h〉
#include 〈stdio.h〉
#include 〈math.h〉
int fun(int a)
{ /*答案开始 */
┇
┇
/*答案结束 */
}
main() / * 主函数* /
{ int x;
clrscr();
printf("\nPlease enter a number:
");
scanf("%d", &x);
printf("%d\n", fun(x));
}
答案:
在函数fun中添加程序段如下:
int fun(int a)
{ /*参考答案开始 */
int i;
if(a==2) return 1;
i=2;
while ((a%i)!
=0 && i〈=sqrt((float) a)) i++;
if ((a%i)==0)
{ printf("%d not is a prime!
",a); return 0; }
printf("%d is a prime!
",a); return 1;
/*参考答案结束 */ }
1.请编制函数ReadDat( )实现从文件HEX.IN中读取100个十六进
制数到字符串数组xx中; 请编制函数H16To10(), 将xx中的十六进
制数转换成十进制数并把已转换的十进制数仍存放在字符串数组xx
中, 最后调用函数WriteDat()把结果输出到DEC.OUT文件中。
原始数据文件存放的格式是:
每行存放10个数, 并用逗号隔
开。
(每个数均大于0且小于等于2000)
注意:
部分源程序存放在PROG1.C中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
/*参考答案*/
#include
#include
#include
#include
#define MAX 100
char xx[MAX][20] ;
void WriteDat(void) ;
int ReadDat(void)
{ FILE *fp ;
int i,j;
char c;
if((fp = fopen("HEX.IN", "r")) == NULL) return 1 ;
/***********读入数据并存放到数组xx中*************/
for(i = 0; i < MAX; i++)
{ j = 0;
while((c = (char) fgetc(fp)) !
= EOF)
{ if(c == ’,’)
{ xx[j] = ’\0’;
break;
}
else if(c !
= ’\n’ && c !
= ’\r’)/*去掉回车换行符*/
{ if(!
isdigit(c))/*如果是字母,则转换为大写*/
c &= 0xdf;
xx[j] = c;
++j;
} }
if(c == EOF)
break;
}
fclose(fp) ;
return 0 ;
}void H16To10(void)
{ char str[20];
int i,j,len,val;
for(i = 0; i < MAX; i++)
{ strcpy(str,xx);
转贴于:
计算机二级考试_考
2.ReadDat( )实现从文件FC.IN中读取1000个十进制
整数到数组xx中; 请编制函数Compute()分别计算出xx中奇数的个
数odd, 偶数的个数even, 平均值aver以及方差totfc的值, 最后调
用函数WriteDat()把结果输出到FC1.OUT文件中。
计算方差的公式如下:
1 N
totfc = ── ∑ (xx - aver)^2
N i=1
原始数据文件存放的格式是:
每行存放10个数, 并用逗号隔
开。
(每个数均大于0且小于等于2000)
注意:
部分源程序存放在PROG1.C中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
/*参考答案*/
#include
#include
#include
#define MAX 1000
int xx[MAX], odd = 0, even = 0 ;
double aver = 0.0 , totfc = 0.0 ;
void WriteDat(void) ;
int ReadDat(void)
{
FILE *fp ;
int i,j;
char c,str[20];
if((fp = fopen("FC.IN", "r")) == NULL) return 1 ;
/***********读入数据并存放到数组xx中*************/
for(i = 0; i < MAX; i++)
{
j = 0;
while((c = (char) fgetc(fp)) !
= EOF)
{
if(c == ’,’)
{
str[j] = ’\0’;
break;
}
else if(c !
= ’\n’ && c !
= ’\r’)/*去掉回车换行符*/
{
str[j] = c;
++j;
}
}
xx = atoi(str);
if(c == EOF)
break;
}
fclose(fp) ;
return 0 ;
}
void Compute(void)
{
int i;
long count = 0;
for(i = 0; i < MAX; i++)
{
if(xx & 1)
odd++;
else
even++;
count += xx;
}
aver = (double)count/MAX;
for(i = 0; i < MAX; i++)
totfc += (xx - aver)*(xx - aver);
totfc /= MAX;
}
转贴于:
计算机3试3大设有n个人围坐一圈并按顺时针方向从1到n编号, 从第s个人开
始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个
人重新开始1到m的报数, 如此进行下去直到所有的人都出圈为止。
现要求按出圈次序, 每10人一组, 给出这n个人的顺序表。
请考生
编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出
到文件JOSE.OUT中。
设 n = 100, s = 1, m = 10。
(1) 将1到n个人的序号存入一维数组p中;
(2) 若第i个人报数后出圈, 则将p置于数组的倒数第i个位
置上, 而原来第i+1个至倒数第i个元素依次向前移动一个
位置;
(3) 重复第
(2)步直至圈中只剩下p[1]为止。
注意:
部分源程序存放在PROG1.C中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
/*参考答案*/
#include
#define N 100
#define S 1
#define M 10
int p[100], n, s, m ;
void WriteDat(void) ;
void Josegh(void)
{
int i,j,s1,w;
s1 = s;
for(i = 1; i <= n; i++)
p[i-1] = i;
for(i = n; i>=2; i--)
{
s1 = (s1 + m - 1)%i;
if(s1 == 0)
s1 = i;
w = p[s1 - 1];
for(j = s1; j < i; j++)
p[j - 1] = p[j];
p[i - 1] = w;
}
}
void main()
{
m = M ;
n = N ;
s = S ;
Josegh() ;
WriteDat() ;
}