程序test.c的功能是:计算100以内满足以下条件的所有整数i的个数cnt以及这些i之和sum。条件:i,i+4,i+10都是素数,同时i+10小于100。请考生编写函数countvalue实现程序要求,最后调用函数wfiteDAT把结果cnt和sum输出到文件out.dat中。(数值l不是素数)

题目

程序test.c的功能是:计算100以内满足以下条件的所有整数i的个数cnt以及这些i之和sum。条件:i,i+4,i+10都是素数,同时i+10小于100。请考生编写函数countvalue实现程序要求,最后调用函数wfiteDAT把结果cnt和sum输出到文件out.dat中。(数值l不是素数)


相似考题
参考答案和解析
正确答案:
【审题关键句】100以内(含l00)满足i、i+4、i+10都是素数的整数的个数以及这些i之和。
【解题思路】
①首先定义循环变量i,然后将i的值赋初值为3,每循环一次则将i的值加1,直到i<90。
②在for循环中,每执行一次循环则调用函数isPrime(该函数具体的算法已经在源程序中给出,直接用即可),对i、 i+4、i+10是否同时是素数进行判断,如果这三个数同时为素数,则计数变量cnt值加1,同将时将变量i的值累加到sum上。
【参考答案】

更多“程序test.c的功能是:计算100以内满足以下条件的所有整数i的个数cnt以及这些i之和sum。条件:i,i+4,i+10都是素数,同时i+10小于100。请考生编写函数countvalue实现程序要求,最后调用函数wfiteDAT把结果cnt和sum输出到文件out.dat中。(数值l不是素数)”相关问题
  • 第1题:

    已知数据文件INl5.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中。请编制函数jsVal(),其功能是:依次从数组a中取出一个4位数,如果该4位数连续小于该4位数以后的5个数且该数是偶数,则统计出满足此条件的数的个数cnt,并把这些4位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT15.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('IN15.DAT", "r");

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

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

    fclose (fp);

    }

    main ( )

    {

    int i;

    readDat ( );

    j sVal ( );

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

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

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

    printf ( "\n" );

    writeDat ( );

    }

    writeDat ( )

    {

    FILE *fp;

    int i;

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

  • 第2题:

    下列程序的功能是:选出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。

  • 第3题:

    下列程序的功能是:计算出启然数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,则要退出循环。在这里,还要注意判断结构中,各条件之问是用“与”运算还是用“或”运算。

  • 第4题:

    下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数I(1+10也是在100以内)的个数cnt,以及这些I之和sum。请编制函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件out64.dat中(数值1不是素数)。

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

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

    试题程序:

    include<stdio.h>

    int cnt, sum;

    int isPrime(int number)

    {

    int i,tag=1;

    if (number==1)

    return 0;

    for(i=2;tag && i<=number/2;i++)

    if(number%i==0) tag=0;

    return tag;

    }

    void countValue ( )

    {

    }

    void main( )

    {

    cnt=sum=0;

    countValue ( );

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

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

    writeDAT ( );

    }

    writeDAT ( )

    {

    FILE *fp;

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

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

    fclose(fp);

    }


    正确答案:void countValue() { int icount=0xx[30]; int jkm; cnt=0; sum=0; for(i=2;i90;i++) /*找数的范围为100以内*/ if(isPrime(i)) /*如果该数为素数则将它存入数组xx中并统计个数*/ { xx[count]=i; count++; } for(i=0;icount;i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if(isPrime(xx[i]+4)&&isPrime(xx[i]+10)) { cnt++; /*统计满足条件的数的个数*/ sum+=xx[i]; /*将满足条件的数组xx中的数求和*/ } }
    void countValue() { int i,count=0,xx[30]; int j,k,m; cnt=0; sum=0; for(i=2;i90;i++) /*找数的范围为100以内*/ if(isPrime(i)) /*如果该数为素数,则将它存入数组xx中,并统计个数*/ { xx[count]=i; count++; } for(i=0;icount;i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if(isPrime(xx[i]+4)&&isPrime(xx[i]+10)) { cnt++; /*统计满足条件的数的个数*/ sum+=xx[i]; /*将满足条件的数组xx中的数求和*/ } } 解析:本题考查的知识点如下:
    (1)循环结构与判断结构的嵌套使用。
    (2)判断结构中多个条件的布尔运算。
    题中要求判断在100以内,i,i+4,i+10都是素数的个数。因为i+10也必须在100以内,1不是素数,我们可以从2开始判断到89即可(90是偶数,明显不是素数)。可以先找出2到89之间素数的个数,再判断这些素数加4和加10后是否还是素数。加4是素数与加10是素数必须同时满足,所以两个条件间用“与”运算。

  • 第5题:

    已知数据文件IN58.DAT中存有300个4位数,并己调用读函数readDat()把这些数存入数组a中,请编制一函数isValue(),其功能是:求出这些4位数是素数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到OUT58.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;

    }

    jsValue()

    {

    }

    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]);

    }

    readDat ( )

    {

    FILE *fp;

    int i;

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

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

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

    fclose (fp);

    }

    writeDat ( )

    {

    FILE *fp;

    int i;

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

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

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

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

    fclose(fp);

    }


    正确答案:jsValue() { int ijvalue; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数则将该数存入数组b中*/ { b[cnt]=a[i]; cnt++; /*并统计满足条件的数的个数*/ } for(i=0;icnt-1;i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;i++) if(b[i]>b[j]) { value=b[i]; b[i]=b[j]; b[j]=value; } }
    jsValue() { int i,j,value; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数,则将该数存入数组b中*/ { b[cnt]=a[i]; cnt++; /*并统计满足条件的数的个数*/ } for(i=0;icnt-1;i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;i++) if(b[i]>b[j]) { value=b[i]; b[i]=b[j]; b[j]=value; } } 解析:本题考查的知识点如下:
    (1)循环的嵌套。
    (2)数据的排序。
    在本题中,已给出了判断素数的函数voidisP(intm),只需将数代入进行判断即可。将素数存入数组b,再对数组b中的数进行排序。排序采用“选择排序法”——第一次从第一个数据开始和所有后面的数据进行比较,与比它大(小)的数据交换位置,将数据中最大(小)的数交换到最前面。第二次从第二个数据开始与后面的数据进行比较,将本次比较中最大(小)的数据交换至第二个位置,直至最后一个数据。以此类推,则可完成题目的要求。

  • 第6题:

    程序test.c的功能是:计算出自然数SIX和NINE满足条件SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和SUM。请编写函数countValue实现程序的要求,最后main函数调用函数writeDAT把结果cnt和 sum,输出到文件0ut.dat中。 其中的S,I,X,N,E各代表一个十进制数字,允许代表的数字相同,但s和N不能为0。例如:944+944+944=1416+1416注意:部分源程序存放在test.c文件中。 请勿改动主函数main和输出数据函数writeDAT的内容。


    正确答案:
    【审题关键句】计算满足条件的sIX+sIX+sIx-NINE+NINE的SIX和NINE的个数以及满足此条件所有的SIX与NINE的和,S,I,X,N,E各代表一个十进制数字。
    【解题思路】
    ①定义整型变量S,i,X,n,e,six,nine。
    ②在第一层for循环中,因为S的值不能为0,所以循环变量s从1开始,依次递增直到其值等于10,退出循环。在第二层for循环中,循环变量i从0开始,依次递增直到其值等于10,退出循环。在第三层for循环中,循环变量X从0开始,依次递增直到其值等于10,退出循环。在第四层for循环中,因为n的值不能为0,所以循环变量n从1开始,依次递增直到其值等于10,退出循环。在第五层for循环中,循环变量e从0开始,依次递增直到其值等于10。
    ③设置完所有for循环条件后,在循环体中,由变量S的值乘以l00,变量i的值乘以10,以及变量X组成一个三位数赋给变量six,由变量n的值乘以1000,变量i的值乘以100,变量n的值乘以10,以及变量e组成一个四位数赋给变量nine,再用if条件语句判断,如果三倍的six等于两倍的nine,则计数变量cnt加1,把six与nine的和累加到变量sum,同时在屏幕上,输出six与nine的值。
    【参考答案】


  • 第7题:

    已知数据文件in.dat中存有300个四位数,并已调用读函数readDat把这些数存入数组a中,请编制一函数jsValue,其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。最后maini函数调用写函数writeDat把数组b中的数输出到0ut.dat文件中。 例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。 9812是非素数,则该数不满足条件忽略。 注意:部分源程序存在test.C文件中。 程序中已定义数组:a[300],b[300],已定义变量:cnt


    正确答案:
    【审题关键句】求素数的个数,存入数组,按从小到大的顺序排序。
    【解题思路】
    ①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量tmp。
    ②通过for循环依次读取数组中的300个数,其中,循环变量i从0开始每次加1,直到i<300停止循环;在每次循环中判断a[i]是否是素数,如果是素数,则把a[i]的值赋给数组b[cnt],同时数组下标变量cnt值加1。
    ③在退出循环后,用两个for循环对数组b[]中元素进行两两比较,实现数组元素从小到大的排序,比较过程中通过整型变量tmp实现两个数的交换。
    【参考答案】

  • 第8题:

    程序test.c的功能是:选出1000至5000范围内(包括l 000、5000)符合下面条件的四位自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的整10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数countValue实现程序的要求。最后main函数调用函数 writeDAT把结果cnt和sum输出到out.dat文件中。 注意:部分源程序存放在test.c文件中。 请勿改动主函数main和输出数据函数writeDAT的内容。


    正确答案:
    【审题关键句】千位+百位等于十位+个位,且千位+百位等于个位-千位的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和。
    【解题思路】
    ①首先定义一个循环变量i,以及分别用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、SW(十位)和 gw(个位)。
    ②通过for循环依次对数组中的每个四位数进行分解,循环初值为l 000,终值为5000,每循环一次,循环变量i的值加1。每分解一个四位数,根据题目要求,判断其“千位+百位=十位+个位”的条件是否满足,同时判断“(千位+百位)=(个位-千位)*10”的条件是否满足,两个条件之间用运算符进行连接。当同时满足以上两个判断条件时,计数变量cnt的值加l,同时将该四位数累加到求和变量sum中,最终得到满足条件的四位自然数个数cnt及它们的和sum。
    本题中cnt和sum变量在源程序中已经定义,在该子程序中就不需要再重新定义了。
    【参考答案】

  • 第9题:

    程序test.c的功能是:在三位整数(100至999)中寻找符合下面条件的整数,并依次从小到大存入数组b[]中。条件如下:某数既是完全平方数,又有两位数字相同,例如144、676等。 请考生编制函数intjsValue(int bb[])实现此功能,满足该条件的整数的个数通过所编制的函数返回。 最后调用函数writeDat把结果输出到文件out.dat中。 注意:部分源程序存放在test.c文件中。 请勿改动主函数main和写函数writeDat的内容。


    正确答案:
    【审题关键句】完全平方根,有两个相同数。
    【解题思路】
    ①首先,本题要定义多个变量,包括一个循环变量k;一个用来保存k平方的变量n;一个数组下标变量cnt并赋初值为0;存放三位数分解之后各位数的变量a(百位)、b(十位)、c(个位)。
    ②通过for循环筛选满足条件的数。大致分4步设定筛选条件,第一步设定判断条件,循环变量的初值从l0开始,因为从l0开始的数,其平方数最少也是3位数,循环的终止条件此处先留空,在后面的循环体中进行设定,每执行一次循环,变量k的值加1;第二步指定变量n的值等于k的平方,判断变量n的值如果小于l00则进入下一次循环,如果n值大于999则退出整个for循环,这表示只有n值在100和999(包含)之间才执行条件表达式后面的语句;第3步是分解满足条件的三位数,得到每位数上的数字,然后通过if条件语句判断三个数中是否有两个数相等,即可以通过表达式“(a-b)*(a-c)*(b-c)=0”进行判断;第四步将满足条件的数输出,并把满足条件的三位数n赋给数组元素bb[cnt],同时数组下标变量cnt加1。
    ③返回满足条件的三位数的个数cnt。
    【参考答案】

    第3类素数的整除

  • 第10题:

    已知数据文件in.dat中存有300个四位数,并已调用读函数readDat把这些数存入数组a中,请编制一函数isValue,其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。最后main函数调用写函数writeDat把数组b中的数输出到out.dat文件中。 例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。 9812是非素数,则该数不满足条件忽略。 注意:部分源程序存在test.C文件中。 程序中已定义数组:a[300],b[300],已定义变量:cnt请勿改动数据文件in.dat中的任何数据、主函数main、读函数readDat和写函数writeDat的内容。


    正确答案:
    【审题关键句】求素数的个数,存入数组,按从小到大的顺序排序。
    【解题思路】
    ①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量tmp。
    ②通过for循环依次读取数组中的300个数,其中,循环变量i从0开始每次加1,直到i<300停止循环;在每次循环中判断a[i]是否是素数,如果是素数,则把a[i]的值赋给数组b[cnt],同时数组下标变量cnt值加1。
    ③在退出循环后,用两个for循环对数组b[]中元素进行两两比较,实现数组元素从小到大的排序,比较过程中通过整型变量tmp实现两个数的交换。
    【参考答案】

  • 第11题:

    已知数据文件IN14.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中。请编制一个函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到OUT14.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()

    {

    }

    main()

    {

    int i;

    readDat();

    jsValue();

    writeDat();

    for(i=0;i<cnt;i++)printf("b[%d]=%d\n",i,b[i]);

    }

    readDat()

    {

    FILE *fp;

    int i;

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

    for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);

    fclose(fp);

    }

    writeDat()

    {

    FILE *fp;

    int i;

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

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

    for(i=0;i<cnt;i++)fprintf(fp,"%d\n",b[i]);

    fclose(fp);

    }


    正确答案:void jsValue() { int jivalue; for(i=0;i300;i++) if(isP(a[i])){b[cnt]=a[i];cnt++;} for(i=0;icnt-1;i++) /*将数组b中的四位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;j++) if(b[i]>b[i]){value=b[i];b[i]=b[j];b[j]=value;} } [解析] 此题型考查的知识点包括以下几方面: (1) 运算符“/”(相除)和“%”(取余)的灵活运用; (2) 循环结构的使用; (3) 数据的排序(在这里主要是使用选择排序法); (4) 选择结构的使用。 此函数的功能是:求出所有这些四位数中是素数的数值并依次存入数组b中然后对数组b中的四位数按从小到大的顺序进行排序。程序中判断素数的函数isP()已给出。
    void jsValue() { int j,i,value; for(i=0;i300;i++) if(isP(a[i])){b[cnt]=a[i];cnt++;} for(i=0;icnt-1;i++) /*将数组b中的四位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;j++) if(b[i]>b[i]){value=b[i];b[i]=b[j];b[j]=value;} } [解析] 此题型考查的知识点包括以下几方面: (1) 运算符“/”(相除)和“%”(取余)的灵活运用; (2) 循环结构的使用; (3) 数据的排序(在这里主要是使用选择排序法); (4) 选择结构的使用。 此函数的功能是:求出所有这些四位数中是素数的数值,并依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序。程序中判断素数的函数isP()已给出。

  • 第12题:

    试题1

    下列程序的功能是:找出所有100以内(含100)满足i,i+4,i+10都是素数的整数i(i+10也在100以内)的个数cnt以及这些i之和sum。请编写函数countvalue()实现程序要求,最后调用函数writeDat()把结果cnt和sum输出到文件out.dat中。

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

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

    试题程序:

    #include <stdio.h>

    int cnt, sum;

    int isPrime(int number)

    {

    int i, tag = 1;

    for (i=2; tag && i<=number/2; i++)

    if (number%i == 0)

    tag = 0;

    return tag;

    }

    void countValue()

    {

    }

    void writeDat()

    {

    FILE *fp;

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

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

    fclose(fp);

    }

    void main()

    {

    cnt = sum = 0;

    countValue();

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

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

    writeDat();


    正确答案:

    试题1答案:
    void countvalue()
    {
    int i;
    for(i=2;i<=90;i++)
    if(isPrime(i) && isPrime(i+4) && isPrime(i+10))
    {
    cnt++;
    sum+=i;
    }
    } }
    试题1分析:
    该程序属于按条件查找数字的题目,考核的知识点为:(1)素数的判定;(2)统计个数并求和。
    本题的解题思路是:题目要求的筛选范围是“所有100以内(含100)满足i、i+4、i+10都是素数的整数i(i+10也在100以内)”,由于最小的素数是2,且i+10要在100以内(含100),所以筛选的范围是2~90。
    题目要求的筛选条件是“满足i、i+4、i+10都是素数的整数i”。在答题之前,应先通读题目已给出的源程序,在我们要实现的函数countvalue()之前给出一个在题目中从未提及的函数isPrime()。仔细分析这个函数的代码不难发现,它实现了从2~number/2内寻找能整除number的数,如果找到就使变量tag为0,此时循环条件将不成了,最终返回0,如果找不到,变量tag为1,返回1.这段代码实现的是判断一个数是够是素数。所以在函数中对筛选条件可以简化为if(isPrime(i) && isPrime(i+4) && isPrime(i+10))。
    程序的流程是:调用countvalue()函数对数据进行处理,最后由writeDAT()函数将结果写入文件out.dat中。
    在countvalue()函数中,For循环的功能是判断i、i+4、i+10是否都为素数,若在素数则将i累加到sum中,同时个数cnt加1,函数结束。

     

  • 第13题:

    已知数据文件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。最后将和除以个数,即可得其平均值。

  • 第14题:

    已知数据文件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;}
    }

  • 第15题:

    已知数据文件IN58.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函njsValue(),其功能是:求出这些4位数是素数的个数cnt,再把所有满足此条件的4位数依次存入数组 b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到

    OUT58.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;

    jsValue()

    {

    }

    main ( )

    {

    int i;

    readDat ();

    jsValue();

    writeDat ();

    printf ("cnt=~/od\n",cnt);

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

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

    }

    readDat ( )

    {

    FILE *fp;

    int i;

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

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

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

    fctose(fp);

    }

    writeDat ()

    {

    FILE *fp;

    int i;

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

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

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

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

    fclose (fp);

    }


    正确答案:jsValue ( ) { int i j value; for (i=0; i300; i++) if (isP (a [ii ) ) /*如果该数为素数则将该数存入数组b中*/ { b[cnt]=a[i]; } for (i=0; icnt-1; i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for (j=i+l; jcnt; j++) if (b [ii >b[j ] ) { value=b [i]; b[i]=b[j]; b [j] =value; } }
    jsValue ( ) { int i, j, value; for (i=0; i300; i++) if (isP (a [ii ) ) /*如果该数为素数,则将该数存入数组b中*/ { b[cnt]=a[i]; } for (i=0; icnt-1; i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for (j=i+l; jcnt; j++) if (b [ii >b[j ] ) { value=b [i]; b[i]=b[j]; b [j] =value; } } 解析:本题考查的知识点如下:
    (1)循环的嵌套。
    (2)数据的排序。
    在本题中,已给出了判断素数的函数void isP(int m),只需将数代入进行判断即可。将素数存入数组b,再对数组b中的数进行排序。排序采用“选择排序法”——第一次从第一个数据开始和所有后面的数据进行比较,与比它大(小)的数据交换位置,将数据中最大(小)的数交换到最前面。第二次从第二个数据开始与后面的数据进行比较,将本次比较中最大(小)的数据交换至第二个位置,直至最后一个数据。以此类推,则可完成题目的要求。

  • 第16题:

    已知数据文件IN82.DAT中存有300个4位数,并已调用函数readDat()把这些数存入数组a中,请编制一函数isValue(),其功能是:求出这些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.21f\n不满足条件的平均值

    pjz2=%7.21f\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.21f\n%7.21f\n",cnt,pjz1,pjz2);

    fclose(fp);

    }


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

  • 第17题:

    请补充main函数,该函数的功能是:把1~100间的所有素数保存在数组aa中,然后输出这些素数并计算它们的和。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在 main函数的横线上填入所编写的若干表达式或语句。

    试题程序:

    include<stdio.h>

    main()

    {

    int n, i, j, k, flag, sum;

    int aa [50];

    sum=O;

    k=O;

    clrscr ();

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

    {

    【 】;

    for (j=2; j<i&&flag; j++)

    if (i%j==O)

    {

    【 】;

    }

    if (flag)

    {

    sum+=i;

    【 】;

    }

    }

    printf("\n*** prime number ***\n");

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

    {

    if (i%10==0)

    printf ("\n");

    printf ("%4d", aa [i]);

    }

    printf ("\nsum=%d", sum);

    }


    正确答案:flag=1 flag=0 aa[k+++]=i
    flag=1 flag=0 aa[k+++]=i 解析:第一空:由后面的if句可以看出,当nag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将fflag清零。第二空:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。如果当前数不是素数,则将flag清零。第三空:如果当前数是素数,则将它保存在数组bb中。

  • 第18题:

    下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数重(I+10也是在100以内)的个数cnt,以及这些I之和sum。请编制函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件out64.dat中(数值1不是素数)。

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

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

    试题程序:

    include<stdio.h>

    int cnt,sum;

    int isPrime (int number)

    {

    int i,tag=l;

    if (number== 1 )

    return 0;

    for(i=2;tag && i<=number/2;i++)

    if (number%i==0) tag=0;

    return tag;

    }

    void countValue ( )

    {

    }

    void main ( )

    {

    cnt=sum=0;

    countValue ( );

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

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

    writeDAT ( );

    }

    writeDAT ( )

    {

    FILE *fp;

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

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

    fclose (fp);

    }


    正确答案:void countValue ( ) { int icount=0xx[30]; int j k m; cnt=0; sum=0; for (i=2; i90; i++) /*找数的范围为100以内*/ if (isPrime (i)) /*如果该数为素数则将它存入数组xx中并统计个数*/ { xx [ count ]=i; count++; } for (i=0; icount; i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if (isPrime (xx [i] +4) &&isPrime (xx [i] +10) ) { cnt ++; /*统计满足条件的数的个数*/ sum+=xx [i]; /*将满足条件的数组xx中的数求和*/ ) }
    void countValue ( ) { int i,count=0,xx[30]; int j, k, m; cnt=0; sum=0; for (i=2; i90; i++) /*找数的范围为100以内*/ if (isPrime (i)) /*如果该数为素数,则将它存入数组xx中,并统计个数*/ { xx [ count ]=i; count++; } for (i=0; icount; i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if (isPrime (xx [i] +4) &&isPrime (xx [i] +10) ) { cnt ++; /*统计满足条件的数的个数*/ sum+=xx [i]; /*将满足条件的数组xx中的数求和*/ ) } 解析:本题考查的知识点如下:
    (1)循环结构与判断结构的嵌套使用。
    (2)判断结构中多个条件的布尔运算。
    题中要求判断在100以内,i,i+4,i+10都是素数的个数。因为i+10也必须在100以内,1不是素数,我们可以从2开始判断到89即可(90是偶数,明显不是素数)。可以先找出2到89之间素数的个数,再判断这些素数加4和加10后是否还是素数。加4是素数与加10是素数必须同时满足,所以两个条件间用“与”运算。

  • 第19题:

    程序test.c的功能是:计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔减、加之和,即第1个素数.第2个素数+第3个素数.第4个素数+第5个素数…的值sum。请编写函数count Value实现程序的要求,最后main函数调用函数writeOAT把结果cnt和Sum,输出到文件out.dat中。


    正确答案:
    【审题关键句】计算500~800区间内素数的个数,素数的值从大到小排序,再计算其间隔减、加之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数……的值。
    【解题思路】
    ①首先定义一个循环变量循环i和用于正负号转换的变量j,同时赋i的初值为-1。
    ②通过for循环对800到500的每个数字进行逐个的扫描,指定循环变量i的初值为800,当i值等于500停止循环,每执行一次循环,i的值便减1。(注意,本题for循环从大到小依次读取数据是根据题目要求设计的,这样得到的素数值其排序方式就是从大到小排序。)
    ③在每次执行for循环时,都调用素数判断函数isPrime判断当前的i值是否为素数,如果是素数,则素数计数变量cnt值加1,正负号转换变量j的值乘以-1,实现正负数的交替转换,最后将每次循环得到的i*j的值累加到求和变量 sum中。
    【参考答案】

  • 第20题:

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


    正确答案:
    【审题关键句】选出100以上、1000以内所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数,计算并输出上述这些素数的个数以及这些素数值的和。
    【解题思路】
    ①首先定义一个循环变量循环i以及用来存放3位数分解之后各位数的变量bw(百位)、SW(十位)和gw(个位)。②通过for循环对100到999的每个数字进行逐个的扫描,循环变量i从100开始,每执行一次循环,i的值加1。③在每次执行for循环时,分解当前变量i值的百位上的数字、十位上的数字和个位上的数字,然后利用表达式(gw+SW)
    %10==bw来判断个位数字与十位数字之和被l0除所得余数与百位数字是否相等,同时调用函数isP判断变量i的值是否是素数,如果以上两个条件同时满足(两个表达式通过运算符进行连接),则计数变量cnt值加1、并把其值加到变量sum上,直到循环结束,即可求出从100到999中所有满足条件的素数的个数和它们的和。
    【参考答案】


  • 第21题:

    程序test.c的功能是:选出1000至5 000范围内(包括1 000、5 000)符合下面条件的四位自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的整10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数countValue实现程序的要求。最后main函数调用函数 writeDAT把结果crlt和sum输出到out.dat文件中。


    正确答案:
    【审题关键句】千位+百位等于十位十个位,且千位+百位等于个位.千位的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和。
    【解题思路】
    ①首先定义一个循环变量i,以及分别用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、SW(十位)和gw(个位)。
    ②通过for循环依次对数组中的每个四位数进行分解,循环初值为1000,终值为5000,每循环一次,循环变量i的值加1。每分解一个四位数,根据题目要求,判断其“千位十百位=十位+个位”的条件是否满足,同时判断“(千位+百位)=(个位-于位)*10”的条件是否满足,两个条件之间用运算符进行连接。当同时满足以上两个判断条件时,计数变量cnt的值加1,同时将该四位数累加到求和变量sum中,最终得到满足条件的四位自然数个数cnt及它们的和sum。
    本题中cnt和sum变量在源程序中已经定义,在该子程序中就不需要再重新定义了。
    【参考答案】

  • 第22题:

    已知数据文件1N68.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 Iii );

    printf ("\n");

    writeDat ();

    }

    writeDat ()

    {

    FILE *fp;

    iht i;

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

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

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

    fprintf {fp,"%d\n",b Iii );

    fclose (fp);

    }


    正确答案:void jsVal() { iht 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; /*求四位数的十位数字*/ dat a=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; i for (j=i+l; jcnt; j++) if (b[i] b[j] ) { data=b[i]; b[i]=b[j]; b [j] =data; } }
    void jsVal() { iht 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; /*求四位数的十位数字*/ dat a=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; i for (j=i+l; 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中的数进行排序。排序使用“选择排序法

  • 第23题:

    下列程序的功能是:计算出自然数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,则要退出循环。在这里,还要注意判断结构中,各条件之间是用“与”运算还是用“或”运算。