计算机三级

下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数 cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数 writeDAT()把结果cnt和sam输出到文件OUT51.DAT中。其中的S,L X,N,I,N,E各代表一个十进制数。注意:部分源程序已给出。请勿改动主函数main()和写函数writeDAT()的内容。试题程序:include<stdio. h>int cnt, sum

题目

下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数 cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数 writeDAT()把结果cnt和sam输出到文件OUT51.DAT中。其中的S,L X,N,I,N,E各代表一个十进制数。

注意:部分源程序已给出。

请勿改动主函数main()和写函数writeDAT()的内容。

试题程序:

include<stdio. h>

int cnt, sum;

void countValue()

{

}

void main ()

{

cnt=sum=O;

countValue ();

printf ("满足条件的个数=%d\n", cnt);

printf ("满足条件所有的SIX与NINE的和=%d\n", sum);

writeDAT ();

}

writeDAT ( )

{

FILE *fp;

fp=fopen("OUT51.DAT", "w");

fprintf (fp, "%d\n%d\n", cnt, sum);

fclose (fp);

}

参考答案和解析
正确答案:void countValue() { int i=100; while (1) { if(3*i%2==0 && 3'i/2>=1000 && 3'i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE+NINE*/ { /*即一个3位数乘3再除2余数为0且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足上条件的所有SIX与NINE的和*/ i++; } else i++; /*如果果不满足条件则取下一个数*/ if(i>999 II 3'i/2>9999) break; /*当SIXP不为3位数或所得的数不为四位数时退出循环*/ } } }
void countValue() { int i=100; while (1) { if(3*i%2==0 && 3'i/2>=1000 && 3'i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE+NINE*/ { /*即一个3位数乘3再除2余数为0,且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足上条件的所有SIX与NINE的和*/ i++; } else i++; /*如果果不满足条件,则取下一个数*/ if(i>999 II 3'i/2>9999) break; /*当SIXP不为3位数或所得的数不为四位数时,退出循环*/ } } } 解析:本题二查的知识点如下:
(1)循环与判断的嵌套使用。
(2)多条件的布尔运算。
(3)“%”与“/”运算符的使用。
根据题意,求的是满足3位数乘以3等于4位数乘以2的数的个数。我们可以使用循环结构对所有的3位数进行判断,若某个3位数乘以3整除2所得的数是4位整数,则这个3位数是满足条件的数。当判断的数不再是3位数或者进行处理后所得的数大于9999,则要退出循环。在这里,还要注意判断结构中,各条件之间是用“与”运算还是用“或”运算。
如果没有搜索结果,请直接 联系老师 获取答案。
相似问题和答案

第1题:

下列程序的功能是:计算500~800之间素数的个数cnt,并按所求素数的值从小到大的顺序,再计算其间隔加、减之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数……的值sum。请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum输出到文件OUT66.DAT中。

注意:部分源程序已给出。

请勿改动主函数mam()和写函数writeDAT()的内容。

试题程序:

include<stdio. h>

int cnt, sum;

void countValue ( )

{

}

void main ()

{

cnt= sum=0;

countValue();

printf ("素数的个数=%dkn", cnt );

printf ("按要求计算得值=%d\n", sum );

writeDAT ( );

}

writeDAT ( )

{

FILE *fp;

fp=fopen ( "OUT66. DAT", "w" );

fprintf (fp, "%d\n%d\n", cnt, sum);

fclose (fp);

}


正确答案:void countValue ( ) { int ijhalfyy[100]; for (i=500; i800; i++) { half=i/2; for (j=2; 3=half; j++) if (i%j==0) break; /*如果该数不是素数则退出此层循环*/ if (j>=half) /*如果该数是素数则将该数存入数组yy中*/ { yy [cnt]=i; ont ++; /*统计素数的个数*/ } } for(i=0j=-1;icnt;i++) /*计算这些素数的间隔加、减之和*/ { j=i*-1; sum+=j*yy[i]; } }
void countValue ( ) { int i,j,half,yy[100]; for (i=500; i800; i++) { half=i/2; for (j=2; 3=half; j++) if (i%j==0) break; /*如果该数不是素数,则退出此层循环*/ if (j>=half) /*如果该数是素数,则将该数存入数组yy中*/ { yy [cnt]=i; ont ++; /*统计素数的个数*/ } } for(i=0,j=-1;icnt;i++) /*计算这些素数的间隔加、减之和*/ { j=i*-1; sum+=j*yy[i]; } } 解析:本题考查的知识点如下:
(1)利用循环和“%”进行素数的判断。
(2)间隔加、减的实现。
在本题中,首先要找出判断素数的方法。若一个数a依次除以从2到a/2的数所得的余数都不是0,则这个数是素数。用此方法依次判断出从500到800区间内的素数。由题意可知,第1,3,5…个素数计算加法,第2,4,6…个素数计算减法。减去1个正整数就是加上负的这个正整数,所以可以将这个正整数乘以-1进行加法。使用循环实现求和,在奇数次的循环中,每个素数乘以1,偶数次的循环中,素数乘以-1,就可实现间隔加、减。

第2题:

下列程序的功能是:选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些4位自然数的个数cnt及这些数的和sum。请编写函数countValue()实现程序的要求,最后调用函数wfiteDAT()把结果cnt和sum输出到文件OUT67.DAT中。

注意:部分源程序已给出。

请勿改动主函数main()和写函数writDAT()的内容。

试题程序:

include<stdio.h>

int cnt,sum;

void countValue()

{

}

void main()

{

cnt=sum=0;

countValue ();

printf ("满足条件的自然数的个数=%d\n", cnt);

printf ("满足条件的自然的值的和=%d\n", sum);

writeDAT ();

}

writeDAT ( )

{

FILE *fp;

fp=fopen ( "OUT67. DAT" , "w" );

fprintf (fp, "%d\n%d\n", cnt, sum);

fclose {fp);

}


正确答案:void countValue() { int i thou hun ten data; for (i=5000; i>=1000; i--) { t hou=i/1000; /*求四位数的千位数字*/ hun=i%1000/100; /*求四位数的百位数字*/ ten=i%100/10; /*求四位数的十位数字*/ dat a=i%l 0; /*求四位数的个位数字*/ if (thou+hun==ten+data && thou+hun==(data-thou) *10) { /*千位数与百位数之和等于十位与个位数之和且千位数下百位数之和等于 于个位数与千位数之差的10倍*/ cnt++; /*则统计满足条件的数的个数*/ sum+=i; /*将满足条件的数求和*/ } }
void countValue() { int i, thou, hun, ten, data; for (i=5000; i>=1000; i--) { t hou=i/1000; /*求四位数的千位数字*/ hun=i%1000/100; /*求四位数的百位数字*/ ten=i%100/10; /*求四位数的十位数字*/ dat a=i%l 0; /*求四位数的个位数字*/ if (thou+hun==ten+data && thou+hun==(data-thou) *10) { /*千位数与百位数之和等于十位与个位数之和,且千位数下百位数之和等于 于个位数与千位数之差的10倍*/ cnt++; /*则统计满足条件的数的个数*/ sum+=i; /*将满足条件的数求和*/ } } 解析:本题考查的知识点如下:
(1)“%”与“/”的使用。
(2)判断结构中多个条件的布尔运算。
(3)循环结构的使用。
本题要求选出5000以下符合条件的4位数,所以选择范围是1000到5000。这里要借助运算符“%”与“/”将4位数各位上的数拆成独立的数字:将1个4位数整除1000则可得到其千位上的数字,除以1000取余再整除 100则可得百位上的数字,除以100取余再整除10则可得十位上的数字,除以10取余则得个位卜的数字。题巾给出的两个条件都要满足,所以两条件之间用“与”运算。使用循环结构对1000到5000之间的数依次进行上述的处理。

第3题:

已知数据文件IN87.DAT中存有300个4位数,并已调用函数readDat()把这些数存入数组a中,请编制一函数jsValue(),具功能是:求出千位数上的数加个位数上的数等于百位数上的数加十位数上的数的个数cnt,再求出所有满足此条件的4位数平均值pjz1,以及所有不满足此条件的4位数的平均值pjz2,最后调用函数 writeDat()把结果cnt,pjz1,pjz2,输出到out87.dat文件中。

例如:6712,6+2=7+1,则该数满足条件,计算平均值pjz1,且个数cnt=cnt+1。

8129,8+9≠1+2,则该数不满足条什,计算平均值pjz2。

注意:部分源程序已给出。

程序中已定义数组:a[300],b[300],已定义变量:cnt,pjz1,pjz2。

请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

试题程序:

include

int a[300], cnt=0;

double pjz1=0.0,pjz2=0.0;

void jsValue()

{

main ( )

{

int i;

readDat ();

jsValue ();

writeDat ();

printf ("cnt=%d\n满足条件的平均值pjz1=%7.21f\n不满足条件的平均值pjz2=% 7.21f\n",cnt,pjz1,pjz2);

readDat ()

{

FILE *fp;

int i;

fp=fopen("in87.dat","r");

for(i=0;i<300;i++)

fscanf (fp, "%d, ",&a [i]);

fclose(fp);

}

writeDat ()

{

FILE *fp;

int i;

fp=fopen ("out87. dar", "w");

fprintf(fp,"%d\n%7.21f\n%7.21f\n",cnt,pjz1,pjz2);

fclose (fp);

}


正确答案:void jsValue () { int i thou hun ten data n=O; for (i=0; i300; i++) { thou=a [i]/1000; /*求四位数的千位数字*/ hun=a [i] %1000/100; /*求四位数的百位数字*/ ten=a [i] %100/10; /*求四位数的十位数字*/ data=a [i] %10; /*求四位数的个位数字*/ if (thou+data==hun+ten) /*如果千位数加个位数等于百位数加十位数*/ { cnt++; /*则统计满足条件的数的个数*/ pjz1+=a [i]; /*将满足条件的数求和*/ } else { n++; /*否则统计不满足条件的数的个数*/ pjz2+=a [i]; /*将不满足条件的数求和*/ } } pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ }
void jsValue () { int i, thou, hun, ten, data, n=O; for (i=0; i300; i++) { thou=a [i]/1000; /*求四位数的千位数字*/ hun=a [i] %1000/100; /*求四位数的百位数字*/ ten=a [i] %100/10; /*求四位数的十位数字*/ data=a [i] %10; /*求四位数的个位数字*/ if (thou+data==hun+ten) /*如果千位数加个位数等于百位数加十位数*/ { cnt++; /*则统计满足条件的数的个数*/ pjz1+=a [i]; /*将满足条件的数求和*/ } else { n++; /*否则统计不满足条件的数的个数*/ pjz2+=a [i]; /*将不满足条件的数求和*/ } } pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ } 解析:本题考查的知识点如下:
(1)运算符“%”及“/”的使用。
(2)循环结构及选择结构的使用。
在本题中,首先要将一个4位数的千位、百位、十位、个位拆成独立的数字。这里借助特殊运算符号“%”(取余)和“/”(整除),拆分方法略。然后判断符合千位数+个位数:百位数+十位数的数的个数。依次求得符合各种条件的数的和及其平均值。

第4题:

下列程序的功能是:计算出启然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT51.DAT中。其中的S,I,X,N,I,N,E各代表一个十进制数。

注意:部分源程序已给出。

请勿改动主函数main()和写函数writeDAT()的内容。

试题程序:

include

int cnt,sum;

void CountValue()

{

}

Void main()

{

Cnt=Sum=0;

COUNtValUe();

printf("满足条件的个数=%\n",cnt):

printf("满足条件的所有的SIX与NINE的和=%d\n",sum);

}

WriteDAT();

{

FILE *fp;

fp=fopen("OUT51.DAT", "w");

fprintf(fp,"%d\n%d\n",cnt,sum);

fclose(fp);

}


正确答案:void countValue() { int i=100; while(1) { if(3*i%2==0 && 3*i/2>1000 && 3*i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE*NINE*/ { /*即一个3位数乘3再除2余数为0 且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足此条件的所有SIX与NINE的和*/ i++; } else i++; /*如果不满足条什则取下一个数*/ if(i>999 || 3*i/2>9999) break; /*当SIX不为3位数时或所得的数不为四位数时退出循环*/ } }
void countValue() { int i=100; while(1) { if(3*i%2==0 && 3*i/2>1000 && 3*i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE*NINE*/ { /*即一个3位数乘3再除2余数为0, 且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足此条件的所有SIX与NINE的和*/ i++; } else i++; /*如果不满足条什,则取下一个数*/ if(i>999 || 3*i/2>9999) break; /*当SIX不为3位数时或所得的数不为四位数时,退出循环*/ } } 解析:本题考查的知识点如下:
(1)循环与判断的嵌套使用。
(2)多条件的布尔运算。
(3)“%”与“/”运算符的使用。
根据题意,求的是满足3位数乘以3等于4位数乘以2的数的个数。我们可以使用循环结构对所有的3位数进行判断,若某个3位数乘以3整除2所得的数是4位整数,则这个3位数足满足条件的数。当判断的数不再是3位数或者进行处理后所得的数大于9999,则要退出循环。在这里,还要注意判断结构中,各条件之问是用“与”运算还是用“或”运算。

第5题:

下列程序的功能是:选出100~1000间的所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数(如293)。计算并输出上述这些素数的个数cnt,以及这些素数值的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT17.DAT中。

注意:部分源程序已给出。

请勿改动主函数main()和写函数writeDAT()的内容。

试题程序:

include <stdio.h>

int cnt, sum;

void countValue()

{

}

main()

{

cnt=sum=0;

countValue();

print f ("素数的个数=%d\n", cnt);

printf("满足条件素数值的和=%d", sum);

writeDAT();

}

writeDAT()

{

FILE *fp;

fp=fopen("OUT17.DAT", "w");

fprintf(fp, "%d\n%d\n", cnt, sum);

fclose(fp);

}


正确答案:void countValue() { int i j halfhun ten data; for (i=101; i1000;i++) { hun=i/100; /*求百位数字*/ ten=i%100/10; /*求十位数字*/ data=i%10; /*求各位数字*/ if (hun== (ten+data)%10) /*如果个位数字与十位数字之和被10除所得余数恰是百位数 字 则进一步判断该数是否为素数*/ { half=i/2; for (j=2; jhalf; j++) if (i%j==0) break; if (j >=half) {cnt++; sum+=i; } /*计算这些数的个数cnt 以及这些素数值的和sum*/ } } }
void countValue() { int i, j ,half,hun, ten, data; for (i=101; i1000;i++) { hun=i/100; /*求百位数字*/ ten=i%100/10; /*求十位数字*/ data=i%10; /*求各位数字*/ if (hun== (ten+data)%10) /*如果个位数字与十位数字之和被10除所得余数恰是百位数 字, 则进一步判断该数是否为素数*/ { half=i/2; for (j=2; jhalf; j++) if (i%j==0) break; if (j >=half) {cnt++; sum+=i; } /*计算这些数的个数cnt, 以及这些素数值的和sum*/ } } } 解析:本题的解题思路是利用一个for循环依次取得100到1000之间的数,接着求得当前所取得的数的各个位上的数字值,语句“hun=i/100;ten=i%100/10:data=i%10:”可以分别取得某数的百位、十位及个位上的数字值,然后判断该数个位数字与十位数字之和被10除所得的余数是否恰好等于百位上的数字。如果这个条件成立,接着去判断原数是否是素数,这里,考虑到效率问题,可以依次用从2到该原数本身一半的数去除原数,如果原数能被除尽,则证明该数肯定不是素数,不需要做下面的工作,接着去取下一个数,继续判断。只有同时满足上述两个条件的数才是本题所需的数,这时把该数累加到变量sum (满足条件素数值的和)中,同时也给计数器变量cnt(素数的个数)加1。

第6题:

已知数据文件IN68.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:如果4位数各位上的数字均是奇数,则统计出满足此条件的个数cnt,并把这些4位数按从大到小的顺序存入数组b中。最后调用函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT68.DAT文件。

注意:部分源程序已给出。

程序中已定义数组:a[200],b[200],已定义变量:cnt。

请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

试题程序:

include<stdio.h>

define MAX 200

int a[MAX],b[MAX],cnt=0;

void jsVal()

{

}

void readDat ( )

{

int i;

FILE *fp;

fp= fopen ("IN68. DAT", "r");

for (i=0; i<MAX; i++)

fscanf (fp, "%d", &a [i])

fclose (fp);

}

void main ( )

{

int i;

readDat ( );

jsVal ( );

printf ("满足条件的数=%d\n", cnt);

for (i=0; i<cnt; i++)

printf ("%d",b[i]);

printf ("\n");

writeDat ( );

}

writeDat ( )

{

FILE *fp;

int i;

fp= fopen ("out68.dat", "w");

fprintf (fp, "%d\n", cnt);

for (i=0; i<cnt; i++)

fprintf (fp, "%din", b [i]);

fclose (fp);

}


正确答案:void jsVal() { int ithouhuntendataj; for(i=0;i200;i++) { thou=a[i]/1000; /*求四位数的千位数字*/ hun=a[i]%1000/100; /*求四位数的百位数字*/ ten=a[i]%100/10; /*求四位数的十位数字*/ data=a[i]%10; /*求四位数的个位数字*/ if(thou%2!=0 && hun%2!=0 && ten%2!=0 && data%2!=0) /*如果4位数各位上的数字均是奇数*/ { b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } } for(i=0;icnt-1;i++) /*将数组b中的数按从大到小的顺序排列*/ for(j=i+1;jcnt;j++) if(b[i]b[j]) { data=b[i]; b[i][b[j]; b[j]=data; } }
void jsVal() { int i,thou,hun,ten,data,j; for(i=0;i200;i++) { thou=a[i]/1000; /*求四位数的千位数字*/ hun=a[i]%1000/100; /*求四位数的百位数字*/ ten=a[i]%100/10; /*求四位数的十位数字*/ data=a[i]%10; /*求四位数的个位数字*/ if(thou%2!=0 && hun%2!=0 && ten%2!=0 && data%2!=0) /*如果4位数各位上的数字均是奇数*/ { b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } } for(i=0;icnt-1;i++) /*将数组b中的数按从大到小的顺序排列*/ for(j=i+1;jcnt;j++) if(b[i]b[j]) { data=b[i]; b[i][b[j]; b[j]=data; } } 解析:本题考查的知识点如下:
(1)“%”与“/”的使用。
(2)循环结构与判断结构的使用。
(3)数据的排序。
本题中,首先借助“%”与“/”将4位数各位上的数拆成独立的数字:将1个4位数整除1000则可得到其千位上的数字,除以1000取余再整除100则可得百位上的数字,除以100取余再整除10则可得十位上的数字,除以10取余则得个位上的数字。1个数除以2取余所得的数不等于0,则此数是奇数。题中要求将符合条件的4位数按从大到小的顺序存入数组b中,我们可以先将符合条件的4位数存入数组b,然后对b中的数进行排序。排序使用“选择排序法”。

第7题:

已知数据文件IN82.DAT中存有300个4位数,并已调用函数readDat()把这些数存入数组a中,请编制一函敞jsValue(),其功能是:求出这些4位数是素数的个数cnt,再求出所有满足此条件的4位数的平均值pjz1,以及所有不满足此条件的4位数的平均值pjz2,最后调用函数writeDat()把结果cnt,pjz1,pjz2,输出到out82.dat文件中。

例如:5591是素数,则该数满足条件,计算平均值pjz1,且个数cnt=cnt+1。

9812是非素数,则该数不满足条件,计算平均值pjz2。

注意:部分源程序已给出。

程序中已定义数组:a[300],b[300],已定义变量:cnt,pjz1,pjz2。

请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

试题程序;

include<stdio.h>

int a[300], cnt=0;

double pjz1=0.0,pjz2=0.0;

int isP(int m)

{

int i;

for(i=2;i<m;i++)

if(m%i==0) return 0;

return 1;

}

void jsValue()

{

main()

{

int i;

readDat();

jsValue();

writeDat();

printf("cnt=%d\n满足条件的平均值pjz1=%7.2lf\n不满足条件的平均值

pjz2=%7.2lf\n",cnt,pjz1,pjz2);

}

readDat()

{

FILE *fp;

int i;

fp=fopen( "in82.dat","r");

for(i=0;i<300;i++)

fscanf(fp,"%d,",&a[i]);

fclose(fp);

}

writeDat()

{

FILE *fp;

int i;

fp=fopen("out82.dat","w");

fprintf(fp,"%d\n%7.2lf\n%7.2lf\n",cnt ,pjz1,piz2);

fclose(fp);

}


正确答案:void isValue() { int i; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数*/ { piz1+=a[i]; /*将满足条件的数求和*/ cnt++; /*统计满足条件的数的个数*/ } else pjz2+=a[i]; /*将不满足条件的数求和*/ piz1=piz1/cnt; /*求满足条件的数的平均值*/ pjz2=pjz2/(300-cnt); /*求不满足条件的数的平均值*/ }
void isValue() { int i; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数*/ { piz1+=a[i]; /*将满足条件的数求和*/ cnt++; /*统计满足条件的数的个数*/ } else pjz2+=a[i]; /*将不满足条件的数求和*/ piz1=piz1/cnt; /*求满足条件的数的平均值*/ pjz2=pjz2/(300-cnt); /*求不满足条件的数的平均值*/ } 解析:本题考查的知识点如下:
(1) 循环结构的使用。
(2) 判断结构的使用。
在本题中,已给出判断素数的函数isP(),只要依次将数据带入即可。300个数据依次存入数组中,可以使用循环实现对数据的访问。当数是素数时,求其和pjz1,并统计素数的个数。不是素数时,求和pjz2。最后将和除以个数,即可得其平均值。

第8题:

已知数据文件IN23.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中。请编制函数JsVal(),其功能是:依次从数组a中取出一个4位数,如果4位数连续大于该4位数以前的5个数且该数是奇数,该数必须能被7整除,则统计出满足此条件的数的个数cnt,并把这些4位数按从大到小的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT23.DAT文件中。

注意:部分源程序已给出。

程序中已定义数组:a[200],b[200],已定义变量:cnt。

请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

试题程序:

include 〈stdio.h>

define MAX 200

int a[MAX], b[MAX], cnt = 0;

void jsVal()

{

}

void readDat ()

{

int i;

FILE *fp;

fp = fopen("IN23.DAT", "r"

for(i=0; i〈MAX; i++)

fscanf(fp, "%d", &a[i]

fclose (fp);

}

main ( )

{

int i;

readDat ();

jsVal ();

printf ("满足条件的数=%d\n", cnt);

for(i=0; i〈cnt; i++)

printf("%d", b[i] );

printf("\n");

writeDat ();

}

writeDat ()

{

FILE *fp;

int i;

fp = fopen("OUT23.DAT", "w");

fprintf(fp, "%d\n", cnt);

for(i=0; i〈cnt; i++)

fprintf(fp, "%d\n", b[i]);

fclose (fp);

}


正确答案:void jsVal() { int i j flag=0; for(i=5; i〈MAX; i++) /*如果4位数连续大于该数以前的5个数则置flag为1否则取下一个数*/ { for(j=i-5; j〈i; j++) { if(a[i]>a[j]) flag=1; else {flag=0; break;} } if(flag==1&&a[i]%2==1&&a[i]%7==0) /*如果flag为1且该数是奇数该数能被7整除则将该数存入数组b中并统计满足条件的数的个数*/ { b[cnt]=a[i]; cnt++; } } for{i=0;i〈cnt-1; i++) /*将数组b中的数按从大到小的顺序排列*/ for(j=i+1; j〈cnt; i++) if(b[i]〈b[j]) { flag=b[i]; b[i]=b[j]; b[j]=flag; } }
void jsVal() { int i, j, flag=0; for(i=5; i〈MAX; i++) /*如果4位数连续大于该数以前的5个数,则置flag为1,否则取下一个数*/ { for(j=i-5; j〈i; j++) { if(a[i]>a[j]) flag=1; else {flag=0; break;} } if(flag==1&&a[i]%2==1&&a[i]%7==0) /*如果flag为1且该数是奇数,该数能被7整除,则将该数存入数组b中,并统计满足条件的数的个数*/ { b[cnt]=a[i]; cnt++; } } for{i=0;i〈cnt-1; i++) /*将数组b中的数按从大到小的顺序排列*/ for(j=i+1; j〈cnt; i++) if(b[i]〈b[j]) { flag=b[i]; b[i]=b[j]; b[j]=flag; } } 解析:根据题意可知,要编制函数的功能有两部分:一是找出满足条件的4位数,二是对找出的数进行从大到小排序。首先利用一个for循环来依次从数组中取得4位数,接着拿当前得到的4位数与该数前面的连续的5个数依次进行比较。如果该数比它前面的5个数都大,则给标志变量flag赋值1,接着对flag进行判断,如果不为1,则该数肯定不符合条件,直接去取下一个数。若flag值为1,再来判断该数是否是奇数,如果恰好该数又能被7整除,则把该数添加到数组b中。这样就可以依次取出符合条件的数。然后利用选择法对数组b中的元素进行从大到小的排序。

第9题:

已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT() 把这些数存入数组a中。请编制函数Svalue(),其功能是:求出这些四位数中素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后将数组b中的四位数按从小到大的顺序排序,最后调用写函数writeDat(),把结果输出到文件OUT.DAT中。例如:5591是素数,则满足条件,存入数组b中,且个数cnt=cnt+1;9812是非素数,则不满足条件,忽略。部分源程序已给出。程序中已定义数组a[300]、b[300],已定义变量cnt。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。#include <stdio.h>int a[300], b[300], cnt = 0;int isP(int m){ int i; for (i=2; i<m; i++) if (m%i == 0) return 0; return 1;}void jsValue(){ }void ReadDat(){ FILE *fp; int i; fp = fopen("in.dat", "r"); for (i=0; i<300; i++) fscanf(fp, "%d,", &a[i]); fclose(fp);}void writeDat(){ FILE *fp; int i; fp = fopen("out.dat", "w"); fprintf(fp, "%d\n", cnt); for (i=0; i<cnt; i++) fprintf(fp, "%d\n", b[i]); fclose(fp);}main(){ int i; ReadDat(); jsValue(); writeDat(); printf("cnt=%d\n", cnt); for (i=0; i<cnt; i++) printf("b[%d]=%d\n", i, b[i]);}


正确答案:参考试题解析
【解析及答案】本题的程序属于按条件查找特定类型的数字的程序,考核的知识点为判断素数和排序算法。
本题的解题思路是:逐个判断数组a中的元素是否为素数,如果是素数,则将其存入数组b中,最后对数组b进行升序排列。计算方法是:每次选定一个位置的元素,然后将该元素与该元素后面的所有元素进行比较,如果该元素比其后面的元素大,则两者交换,较比完成后,此位置的元素比其后面所有的元素都小;比较一直进行到所有元素均被访问后结束。在该程序中已经给出一个函数 isP()。通过分析可知,该函数的功能是判断参数m是否为素数,若是素数,则返回1;若不是,则返回0。在解答本题时,若题目中提供了此类函数,就可以直接调用,为编程提供便利。
程序的流程是:首先调用函数ReadDat() 读入数据,然后调用函数jsValue() 对数据进行处理,最后由函数writeDat() 将结果写回到文件out.dat中。在函数jsValue() 中,首先通过一个for循环来判断a[i] 是否为素数,若是素数,则把a[i] 存入数组b中,且记录个数的变量cnt的值将增加1,然后通过两重for循环将数组b中的元素进行升序排列,函数结束。
void jsvalue() /*标准答案*/
{int j,I,value;
for(I=0;I<300;I++)
if(isP(a[I])) {b[cnt]=a[I];cnt++;}
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if(b[I]>b[j])
{value=b[I]; b[I]=b[j]; b[j]=value;}
}

第10题:

已知数据文件in55.dat中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数JsValue(),其功能是:求出千位数上的数减百位数上数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的4位数平均值pjz1,以及所有不满足此条件的4位数平均值pjz2,最后调用函数writeDat()把结果cnt,pjz1,pjz2输出到out55.dat文件中。

例如:9123,9-1-2-3>0,则该数满足条件,计算平均值pj21,且个数cnt=cnt+1。

9812,9-8-1-2<0,则该数不满足条件,计算平均值pjz2。

注意:部分源程序已给出。

程序中已定义数组:a[300],已定义变量:cnt。

请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

试题程序:

include

int a[300], cnt=0;

double pjz1=0.0,pjz2=0.0;

jsValue()

{

}

main()

{

int i;

readDat();

jsValue();

writeDat();

printf("cnt=%d\n满足条件的平均值pjz1=%7.2lf\n不满足条件的平均值

pjz2=%7.2lf\n",cnt,pjz1,pjz2);

}

readDat()

{

FILE*fp;

int i;

fp=fopen("in55.dat","r");

for(i=0;i<300;i++)

fscanf(fp,”%d,”,&a[i]);

fclose(fp);

}

writeDat()

{

FILE*fp;

int i;

fp=fopen("out55.dat","N");

fprintf(fp,"%d\n%7.2lf\n%7.2lf\n",cnt ,pjz1,pjz2);

fclose(fp);

}


正确答案:jsvalue() { int ithouhuntendatan=0; for(i=0;i300;i++) { thou=a[i]/1000; /*求四位数的千位数字*/ hun=a[i]%1000/100;/*求四位数的百位数字*/ ten=a[i]%100/10; /*求四位数的十位数字*/ data=a[i]%10; /*求四位数的个位数字*/ if(thou-hun-ten-data>O) /*如果千位数字减百位数字减十位数字减个位数字 大于零*/ { cnt++; /*统计满足条件的数的个数*/ pjz1+=a[i]; /*将满足条件的数求和*/ } else { n++; /*统计不满足条件的数的个数*/ piz2+=a[i]; /*将不满足条件的数求和*/ } } pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ }
jsvalue() { int i,thou,hun,ten,data,n=0; for(i=0;i300;i++) { thou=a[i]/1000; /*求四位数的千位数字*/ hun=a[i]%1000/100;/*求四位数的百位数字*/ ten=a[i]%100/10; /*求四位数的十位数字*/ data=a[i]%10; /*求四位数的个位数字*/ if(thou-hun-ten-data>O) /*如果千位数字减百位数字减十位数字减个位数字 大于零*/ { cnt++; /*统计满足条件的数的个数*/ pjz1+=a[i]; /*将满足条件的数求和*/ } else { n++; /*统计不满足条件的数的个数*/ piz2+=a[i]; /*将不满足条件的数求和*/ } } pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ } 解析:本题考查的知识点如下:
(1)将4位数各位上的数拆分为独立的数字。
(2)循环结构的使用。
在本题中,首先要将4位数各位上的数字拆分为独立的数字。这要借助运算符“%”(取余)与“/”(整除)。将一个4位数整除1000则可得到其千位上的数字,除以1000取余再整除100则可得百位上的数字,除以100取余再整除10则可得十位上的数字,除以10取余则得个位上的数字。求得各位上的数字后,就可以进行比较了。

更多相关问题