计算机三级数据库简单数据运算问题9g.docx
《计算机三级数据库简单数据运算问题9g.docx》由会员分享,可在线阅读,更多相关《计算机三级数据库简单数据运算问题9g.docx(15页珍藏版)》请在冰豆网上搜索。
计算机三级数据库简单数据运算问题9g
1.编写函数jsValue,它的功能是:
求Fibonacci数列中大于t的最小的一个数,结果由函数返回。
其中Fibonacci数列F(n)的定义为:
F(0)=0,F
(1)=1
F(n)=F(n-1)+F(n-2)
最后调用函数writeDat()读取50个数据t,分别得出结果且把结果输出到文件out.dat中。
例如:
当t=1000时,函数值为:
1597。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和写函数writeDat()的内容。
#include
intjsValue(intt)
{intf0=0,f1=1,fn;
fn=f0+f1;
while(fn<=t)
{f0=f1;
f1=fn;
fn=f0+f1;
}
returnfn;
}
main()
{
intn;
n=1000;
printf("n=%d,f=%d\n",n,jsValue(n));
writeDat();
}
writeDat()
{
FILE*in,*out;
inti,n,s;
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<50;i++){
fscanf(in,"%d",&n);
s=jsValue(n);
printf("%d\n",s);
fprintf(out,"%d\n",s);
}
fclose(in);
fclose(out);
}
*****************************************************************************************
2.下列程序prog1.c的功能是:
利用以下所示的简单迭代方法求方程:
cos(x)-x=0的一个实根。
Xn+1=cos(Xn)
迭代步骤如下:
(1)取X1初值为0.0;
(2)X0=X1,把X1的值赋给X0;
(3)X1=cos(X0),求出一个新的X1;
(4)若X0-X1的绝对值小于0.000001,执行步骤(5),否则执行步骤
(2);
(5)所求X1就是方程cos(X)-X=0的一个实根,作为函数值返回。
请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果输出到文件OUT17.DAT中。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include
#include
#include
floatcountValue()
{doublex0,x1;
x1=0.0;
do{x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=0.000001);
returnx1;
}/*fabs是针对符点数进行取绝对值的,ABS是针对整数进行取绝对值的
main()
{
clrscr();
printf("实根=%f\n",countValue());
printf("%f\n",cos(countValue())-countValue());
writeDat();
}
writeDat()
{
FILE*wf;
wf=fopen("OUT17.DAT","w");
fprintf(wf,"%f\n",countValue());
fclose(wf);
}
*****************************************************************************************
3.请编写函数countValue(),它的功能是:
求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。
例如若n为1000时,函数值应为:
s=153.909064。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输入输出数据函数progReadWrite()的内容。
#include
#include
#include
doublecountValue(intn)
{inti;
doubles=0.0;
for(i=1;iif(i%21==0)s+=i;
returnsqrt(s);
}
main()
{
clrscr();
printf("自然数之和的平方根=%f\n",countValue(1000));
progReadWrite();
}
progReadWrite()
{
FILE*fp,*wf;
inti,n;
floats;
fp=fopen("in.dat","r");
if(fp==NULL){
printf("数据文件in.dat不存在!
");
return;
}
wf=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(fp,"%d\n",&n);
s=countValue(n);
fprintf(wf,"%f\n",s);
}
fclose(fp);
fclose(wf);
}
*****************************************************************************************
4.已知在文件in.dat中存有N个(个数<200)实数,函数readdat()读取这N个实数并存入数组xx中。
请编制函数calvalue(),其功能要求:
1、求出这N个实数的平均值aver;
2、分别求出这N个实数的整数部分之和sumint以及小数部分之和sumdec,最后调用函数writedat()把所求的结果输出到文件out.dat中。
注意:
部分源程序已给出。
请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。
#include
#include
#defineMAXNUM200
floatxx[MAXNUM];
intN=0;/*文件IN.DAT中共有多少个实数*/
doubleaver=0.0;/*平均值*/
doublesumint=0.0;/*整数部分之和*/
doublesumdec=0.0;/*小数部分之和*/
intReadDat(void);
voidWriteDat(void);
voidCalValue(void)
{inti;
for(i=0;i{sumint+=(long)xx[i];/*以强制类型转换来获得xx[i]的整数部分
sumdec+=xx[i]-(long)xx[i];
aver+=xx[i];
}
aver/=N;
}
voidmain()
{inti;
clrscr();
for(i=0;iif(ReadDat()){
printf("数据文件IN.DAT不能打开!
\007\n");
return;
}
Calvalue();
printf("文件IN.DAT中共有实数=%d个\n",N);
printf("平均值=%.2lf\n",aver);
printf("整数部分之和=%.2lf\n",sumint);
printf("小数部分之和=%.2lf\n",sumdec);
WriteDat();
system("pause");
}
intReadDat(void)
{
FILE*fp;
inti=0;
if((fp=fopen("in.dat","r"))==NULL)return1;
while(!
feof(fp)){
fscanf(fp,"%d,",&xx[i++]);
}
fclose(fp);
return0;
}
voidWriteDat(void)
{
FILE*fp;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%.2lf\n%.2lf\n%.2lf\n",aver,sumint,sumdec);
fclose(fp);
}
*****************************************************************************************
5.下列程序prog1.c的功能是:
在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。
请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。
最后调用函数writeDat()把结果输出到文件out.dat中。
请勿改动主函数main()和写函数writeDat()的内容。
#include
intjsValue(intbb[])
{inti,j,cnt=0,bw,sw,gw;
for(i=100;i<=999;i++)
{bw=i/100;sw=i%100/10;gw=i%10;
for(j=10;j*j<=i;j++)
if(i==j*j&&(bw==sw||sw==gw||gw==bw))bb[cnt++]=i;
}
returncnt;
}
main()
{
intb[20],num;
num=jsValue(b);
writeDat(num,b);
}
writeDat(intnum,intb[])
{
FILE*out;
inti;
out=fopen("out.dat","w");
printf("%d\n",num);
fprintf(out,"%d\n",num);
for(i=0;ifclose(out);
}
*******************************************************************************6.请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中偶数的个数even,奇数的平均值ave1,偶数的平均值ave2以及方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N2
totfc=1/N∑(xx[i]-ave2)
i=1
设N为偶数的个数,xx[i]为偶数,ave2为偶数的平均值。
原始数据文件存放的格式是:
每行存放10个数,并用逗号隔开。
(每个数均大于0且小于等于2000)
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include
#include
#include
#defineMAX1000
intxx[MAX],odd=0,even=0;
doubleave1=0.0,ave2=0.0,totfc=0.0;
voidWriteDat(void);
intReadDat(void)
{inti;
FILE*fp;
if((fp=fopen("IN.DAT","r"))==NULL)return1;
/*********编制函数ReadDat()的部分************/
for(i=0;i{fscanf(fp,"%d,",&xx[i]);
if((i+1)%10=________________________________________________________fscanf(fp,"\n");}
/*******************************************/
fclose(fp);
return0;
}
voidCompute(void)
{inti,yy[MAX];
for(i=0;iyy[i]=0;
for(i=0;iif(xx[i]%2==0){yy[even++]=xx[i];ave2+=xx[i];}
else{odd++;ave1+=xx[i];}
if(odd==0)ave1=0;
elseave1/=odd;
if(even==0)ave2=0;
elseave2/=even;
for(i=0;itotfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;
}
voidmain()
{
inti;
for(i=0;iif(ReadDat()){
printf("数据文件IN.DAT不能打开!
\007\n");
return;
}
Compute();
printf("OVEN=%d\nAVE1=%f\nAVER2=%f\nTOTFC=%f\n",even,ave1,ave2,totfc);
WriteDat();
}
voidWriteDat(void)
{
FILE*fp;
inti;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d\n%f\n%f\n%f\n",even,ave1,ave2,totfc);
fclose(fp);
}
*****************************************************************************************
7.下列程序prog1.c的功能是:
计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt以及满足此条件所有的SIX与NINE的和SUM。
请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum,输出到文件OUT15.DAT中。
其中的S,I,X,N,E各代表一个十进制数字。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include
intcnt,sum;
voidcountValue()
{ints,i,x,n,e,six,nine;
for(s=1;s<10;s++)
for(i=0;i<10;i++)
for(x=0;x<10;x++)
for(n=1;n<10;n++)
for(e=0;e<10;e++)
{six=s*100+i*10+x;
nine=n*1000+i*100+n*10+e;
if(3*six==2*nine)
{cnt++;sum+=six+nine;}
}
}
voidmain()
{
cnt=sum=0;
countValue();
printf("满足条件的个数=%d\n",cnt);
printf("满足条件所有的SIX与NINE的和=%d\n",sum);
writeDat();
}
writeDat()
{
FILE*fp;
fp=fopen("OUT15.DAT","w");
fprintf(fp,"%d\n%d\n",cnt,sum);
fclose(fp);
}
另一种经典解法:
voidcountValue()
{inti_;
for(i=666;i<=999;i=i+2)
if((i/10%10==(3*i/2)/100%10)&&((3*i/2)/1000==(3*i/2)%100/10))
{cnt++;sum+=i+3*i/2;}
}
运算结果为:
满足条件的个数=4
满足条件所有的SIX与NINE的和=9430
********************************************************************************************
8.请编写函数voidcountValue(int*a,int*n),它的功能是:
求出1到1000之内能被7或11整除但不能同时被7或11整除的所有整数放在数组a中,并通过n返回这些数的个数。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDAT()的内容。
#include
#include
voidcountValue(int*a,int*n)
{inti;
*n=0;
for(i=1;i<=1000;i++)
if(i%7==0&&i%11||i%7&&i%11==0)/*或者可以作为可以被7,11整除但是不可被77整除
a[(*n)++]=i;
}
main()
{
intaa[1000],n,k;
clrscr();
countValue(aa,&n);
for(k=0;kif((k+1)%10==0)printf("\n");
elseprintf("%5d",aa[k]);
writeDAT();
}
writeDAT()
{
intaa[1000],n,k;
FILE*fp;
fp=fopen("out19.dat","w");
countValue(aa,&n);
for(k=0;kif((k+1)%10==0)fprintf(fp,"\n");
elsefprintf(fp,"%5d",aa[k]);
fprintf(fp,"\n");
fclose(fp);
}
*****************************************************************************************
9.请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值ave1,偶数的平均值ave2以及所有奇数的方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N2
totfc=1/N∑(xx[i]-ave1)
i=1
设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。
原始数据文件存放的格式是:
每行存放10个数,并用逗号隔开。
(每个数均大于0且小于等于2000)
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include
#include
#include
#defineMAX1000
intxx[MAX],odd=0,even=0;
doubleave1=0.0,ave2=0.0,totfc=0.0;
voidWriteDat(void);
intReadDat(void)
{
inti;
FILE*fp;
if((fp=fopen("IN.DAT","r"))==NULL)return1;
/*********编制函数ReadDat()的部分************/
for(i=0;i{fscanf(fp,"%d,",&xx[i]);
if((i+1)%10==0)
fscanf(fp,"\n");
}
/*******************************************/
fclose(fp);
return0;
}
voidCompute(void)
{inti,yy[MAX];
for(i=0;iyy[i]=0;
for(i=0;iif(xx[i]%2){yy[odd++]=xx[i];ave1+=xx[i];}
else{even++;ave2+=xx[i];}
if(odd==0)ave1=0;
elseave1/=odd;
if(even==0)ave2=0;
elseave2/=even;
for(i=0;itotfc+=(yy[i]-ave1)*(yy[i]-ave1)/odd;
}
voidmain()
{
inti;
for(i=0;iif(ReadDat()){
printf("数据文件IN.DAT不能打开!
\007\n");
return;
}
Compute();
printf("ODD=%d\nAVE1=%f\nAVE2=%f\nTOTFC=%f\n",odd,ave1,ave2,totfc);
WriteDat();
}
voidWriteDat(void)
{
FILE*fp;
inti;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d\n%f\n%f\n%f\n",odd,ave1,ave2,totfc);
fclose(fp);
}
*****************************************************************************************