三级网络绝密34题1
#include
int a[300], cnt=0;
double pjz1=0.0, pjz2=0.0;
void writeDat();
void readDat();
int isP(int m)
{
int i;
for(i = 2; i < m; i++)
if(m % i == 0)
return 0;
return 1;
}
void jsValue()
{
}
main()
{
readDat();
js...
1
#include
int a[300], cnt=0;
double pjz1=0.0, pjz2=0.0;
void writeDat();
void readDat();
int isP(int m)
{
int i;
for(i = 2; i < m; i++)
if(m % i == 0)
return 0;
return 1;
}
void jsValue()
{
}
main()
{
readDat();
jsValue();
writeDat();
printf("cnt=%d\n满足条件的平均值pzj1=%7.2lf\n不满足条件的平均值pzj2=%7.2lf\n", cnt,pjz1,pjz2);
}
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;
fp = fopen("out.dat","w");
fprintf(fp, "%d\n%7.2lf\n%7.2lf\n", cnt, pjz1, pjz2);
fclose(fp);
}
【审题关键句】求素数的个数及平均值,并计算非素数的平均值。
【解题思路】
①首先定义循环变量i,然后通过for循环对数组a[300]中的每个元素a[i]调用函数isP(a[i])判断a[i]是否是素数(素数的算法已在isP()函数中给出,此处直接调用即可),如果是素数,则把其加到变量pjz1上,同时计数变量cnt加1,否则a[i]值加到变量pjz2上。直到判断完数组a[300]中的所有数据后退出循环。
②求出pjz1、pjz2和cnt的值之后,再用变量pjz1的值除以cnt的值就得到素数的平均值,同时把这个值赋给变量pjz1,最后用变量pjz2的值除以300-cnt的值就得到非素数的平均值,并把这个值赋给变量pjz2。
【参考】
int i; //定义变量i
for(i = 0; i < 300; i++) //循环变量i从0依次递增到299
{
if(isP(a[i])) //判断数组元素a[i]是否素数
{
pjz1 += a[i]; //把a[i]累加到变量pjz1
cnt++; //变量cnt加1
}
else pjz2 += a[i]; //否则,把数组元素a[i]累加到变量pjz2
}
pjz1 /= cnt; //所有素数的和pjz1除以素数的个数cnt,得到素数的平均值并赋给变量pjz1
pjz2 /= (300 - cnt); //所有非素数的和pjz2除以非素数的个数300-cnt,得到非素数的平均值并赋给变量pjz2
2
#include
int a[300], b[300], cnt=0;
void readDat();
void writeDat();
void jsValue();
int isP(int m)
{
int i;
for(i = 2; i < m; i++)
if(m % i == 0)
return 0;
return 1;
}
void jsValue()
{
}
void 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]);
}
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);
}
【审题关键句】求素数的个数,存入数组,按从小到大的顺序排序。
【解题思路】
①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量tmp。
②通过for循环依次读取数组中的300个数,其中,循环变量i从0开始每次加1,直到i<300停止循环;在每次循环中判断a[i]是否是素数,如果是素数,则把a[i]的值赋给数组b[cnt],同时数组下标变量cnt值加1。
③在退出循环后,用两个for循环对数组b[]中元素进行两两比较,实现数组元素从小到大的排序,比较过程中通过整型变量tmp实现两个数的交换。
【参考答案】
int i, j, tmp; //定义整型变量i, j, tmp
for(i = 0; i < 300; i++) //循环变量i从0依次递增到299
if(isP(a[i])) b[cnt++] = a[i]; //如果数组元素a[i]是素数,则把a[i]赋给b[cnt],同时数组下标变量cnt加1
for(i = 0; i < cnt; i++) //循环变量i从0开始依次递增,直到其值等于cnt
{
for(j = i + 1; j < cnt; j++) //循环变量j从i + 1开始依次递增,直到其值等于cnt
{
if(b[i] > b[j]) //如果数组元素b[i]大于b[j],则进行互换
{
tmp = b[j]; //把b[j]的值赋给变量tmp
b[j] = b[i]; //把b[i]的值赋给b[j]
b[i] = tmp; //把变量tmp的值赋给b[i]
}
}
}
第二类
3
#include
#include
void readDat();
void writeDat();
int aa[200], bb[10];
void jsSort()
{
}
void main()
{
readDat();
jsSort();
writeDat();
}
void readDat()
{
FILE *in;
int i;
in = fopen("in.dat", "r");
for(i = 0; i < 200; i++)
fscanf(in, "%d,", &aa[i]);
fclose(in);
}
void writeDat()
{
FILE *out;
int i;
out = fopen("out.dat", "w");
for(i = 0; i < 10; i++)
{
printf("i=%d,%d\n", i + 1,bb[i]);
fprintf(out, "%d\n", bb[i]);
}
fclose(out);
}
【审题关键句】按每个数的后三位升序排列,然后取出满足此条件的前10个数依次存入数组,如果后三位的数值相等,则按原先的数值进行降序排列。
【解题思路】
①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量m。
②然后通过两个for循环对数组aa[]中的两个相邻元素按照其后三位值的大小进行从小到大的排序,本题中已给出所有的整数都是四位数,因此,可以通过aa[i] % 1000或aa[j] % 1 000计算得到当前数组元素的后三位值,然后再进行比较,如果两个数需要转换位置,可通过中间变量m进行转换。
③上一是两个元素后三位不相同的情况,根据题意,需要再增加一个else if语句判断两个相邻元素的后三位数一样的情况,如果相同,则需要继续判断两个四位数的大小,并按从大小的顺序排序。
④最后,通过一个for循环依次读取aa[i]数组中前10个元素并保存到数组bb[i]中。
【参考答案】
int i, j, m; //定义整型变量i, j, m
for(i = 0; i < 199; i++) //循环变量i从0开始,每次递增1,直到其值等于199
for(j = i + 1; j < 200; j++) //循环变量j 从i + 1开始,每次递增1,直到其值等于200
{
if((aa[i] % 1000) > (aa[j] % 1000)) //如果aa[i]的后三位大于aa[j]的后三位,则进行互换
{
m = aa[i]; //把aa[i]的值赋给m
aa[i] = aa[j]; //把aa[j]的值赋给aa[i]
aa[j] = m; //把m的值赋给aa[j]
}
else if((aa[i] % 1000) == (aa[j] % 1000)) //如果aa[i]的后三位等于aa[j]的后三位
{
if(aa[i] < aa[j]) //如果aa[i]小于aa[j],则进行互换
{
m = aa[i]; //把aa[i]的值赋给m
aa[i] = aa[j]; //把aa[j]的值赋给aa[i]
aa[j] = m; //把m的值赋给aa[j]
}
}
}
for(i = 0; i < 10; i++)
bb[i] = aa[i]; //循环变量从0开始,每次递增1,直到等于10,把数组元素aa[i]赋给bb[i]
4444
#include
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void writeDat();
void jsVal()
{
}
void readDat()
{
int i;
FILE *fp;
fp = fopen("in.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();
}
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);
}
【审题关键句】四位数的千位<=百位<=十位<=个位,且四位数是偶数,统计出满足此条件的个数,按从小到大的顺序存入数组。
【解题思路】
①首先,本题要定义多个变量,包括两个循环变量循环i、j,一个用于数据交换的整型变量ab,以及分别用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、sw(十位)和gw(个位)。
②通过for循环依次对数组中的每个四位数进行分解,每分解一个四位数,根据题目要求,判断其“千位<=百位<=十位<=个位”的条件是否满足,并通过a[i] % 2 == 0表达式判断该四位数是否为偶数,各判断表达式之间用&&运算符进行连接,当满足条件时,则将a[i]的值赋给数组变量b[cnt],同时数组下标变量cnt的值加1。循环结束后,所有满足条件的四位数都将保存到数组b[cnt]中。
③将所有的四位数判断完毕后,最后通过两个for循环,对b[cnt]数组中的元素按从小到大的顺序排序。
【参考答案】
int qw, bw, sw, gw, i, j, ab;
for(i = 0; i < MAX; i++)
{
qw = a[i] / 1000; //a[i]除以1 000得到a[i]的千位上的数值,并赋给变量qw
gw = a[i] % 10; //a[i]对10求余得到a[i]的个位上的数值,并赋给变量gw
bw = (a[i] - qw * 1000) / 100; //a[i]与其千位数的差除以100,得到其百位上的数值
sw = (a[i] - qw * 1000 - bw * 100) / 10; //a[i]减去其千位数再减去其百位数值再除以10,得到其十位上的数值
if((qw <= bw && bw <= sw && sw <= gw) && (a[i] % 2 == 0)) //如果a[i] 千位数小于等于百位数,百位数小于等于十位数,十位数小于等于个位数,并且a[i]是偶数
b[cnt++] = a[i]; //把a[i]赋给b[cnt],同时数组下标变量cnt加1
}
for(i = 0; i < cnt - 1; i++) //循环变量i从0开始,每次加1,直到其值大于等于cnt - 1
for(j = i + 1; j < cnt; j++) //循环变量j从i + 1开始,每次加1,直到其值大于等于cnt
if(b[i] > b[j]) //如果数组元素b[i]大于b[j],则进行两者互换
{
ab = b[j]; //把b[j]的值赋给变量ab
b[j] = b[i]; //把 b[i]的值赋给b[j]
b[i] = ab; //把ab的值赋给b[i]
}
补充if(gw-qw-bw-sw>0)
{pjz1+=a[i];cnt++;}
else pjz2+=a[i];pjz1/=cnt;pjz2/=(300-cnt);
5
#include
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void writeDat();
void jsVal()
{
}
void readDat()
{
int i;
FILE *fp;
fp = fopen("in.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();
}
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);
}
【审题关键句】千位+十位组合与个位+百位组合,都是奇数,两数相减结果大于等于0小于等于10,从大到小排序。
【解题思路】
①首先,本题要定义多个变量,包括两个循环变量循环i、j;用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、sw(十位)和gw(个位);两个用来存放重新组合数字的变量newV1和newV2。
②通过for循环依次对数组中的每个四位数进行分解,每分解一个四位数,根据题目要求,对其各位数进行重新组合,形成两个新的十位数,组合条件分别是原四位数的千位和十位组成一个十位数,个位和百位组成一个十位数,并将两个新的十位数分别赋给变量newV1和newV2。
③数字重组完毕之后,再根据题目要求筛选满足条件的四位数,本题需要考虑多个筛选条件:一是新组合的十位数中,其十位数不能为0,即原四位数的千位和个位数字不能为0;二是两个新组合的十位数之差必须大于等于0小于等于10;三是两个新组合的数字均为奇数。
④将同时满足以上3个条件的四位数赋给数组b[cnt],同时数组下标值加1,当for循环执行完毕后,则将所有满足条件的四位数全部存放到数组b[cnt]中。
⑤最后通过两个for循环,对数组b[cnt]中的元素按从大到小的顺序排序,排序过程中,可用newV1或newV2作为数据交换的中间变量。
【参考答案】
int qw, bw, sw, gw, i, j, newV1, newV2;
for(i = 0; i < MAX; i++)
{
/*对四位数进行分解*/
qw = a[i] / 1000;
gw = a[i] % 10;
bw = (a[i] - qw * 1000) / 100;
sw = (a[i] - qw * 1000 - bw * 100) / 10;
/*分解后的四位数重新组合为两个十位数*/
newV1 = qw * 10 + sw; //a[i]的千位上的数字与其十位上的数字组成新的两位数newV1
newV2 = gw * 10 + bw; //a[i]的个位上的数字与其百位上的数字组成新的两位数newV2
if(qw && gw && (newV1 - newV2>0 && newV1-newV2<=10) && (newV1 % 2) && (newV2 % 2)) //如果a[i]的千位上的数字,个位上的数字均不等于零并且新组成的第一个数大于第二个数且第一个数与第二个数的差小于等于10且第一个数字,第二个数字均为奇数
b[cnt++] = a[i]; //把a[i]赋给b[cnt],同时下标变量cnt加1
}
/*对数组b[cnt]中的数字进行排序*/
for(i = 0; i < cnt - 1; i++)
for(j = i + 1; j < cnt; j++)
if(b[i] < b[j]) //如果数组元素b[i]小于b[j],则两者交互换,对数组b进行降序排列
{
newV1 = b[j];
b[j] = b[i];
b[i] = newV1;
}
6
#include
void writeDat(int num, int b[]);
int jsValue(int bb[])
{
}
void main()
{
int b[20], num;
num = jsValue(b);
writeDat(num, b);
}
void writeDat(int num, int b[])
{
FILE *out;
int i;
out = fopen("out.dat", "w");
fprintf(out, "%d\n", num);
for(i = 0; i < num; i++)
fprintf(out, "%d\n", b[i]);
fclose(out);
}
【审题关键句】完全平方根,有两个相同数。
【解题思路】
①首先,本题要定义多个变量,包括一个循环变量k;一个用来保存k平方的变量n;一个数组下标变量cnt并赋初值为0;存放三位数分解之后各位数的变量a(百位)、b(十位)、c(个位)。
②通过for循环筛选满足条件的数。大致分4步设定筛选条件,第一步设定判断条件,循环变量的初值从10开始,因为从10开始的数,其平方数最少也是3位数,循环的终止条件此处先留空,在后面的循环体中进行设定,每执行一次循环,变量k的值加1;第二步指定变量n的值等于k的平方,判断变量n的值如果小于100则进入下一次循环,如果n值大于999则退出整个for循环,这表示只有n值在100和999(包含)之间才执行条件表达式后面的语句;第3步是分解满足条件的三位数,得到每位数上的数字,然后通过if条件语句判断三个数中是否有两个数相等,即可以通过表达式“(a-b)*(a-c)*(b-c) == 0”进行判断;第四步将满足条件的数输出,并把满足条件的三位数n赋给数组元素bb[cnt],同时数组下标变量cnt加1。
③返回满足条件的三位数的个数cnt。
【参考答案】
int n, k, a, b, c, cnt = 0; //定义整型变量n, k, a, b, c, cnt,同时变量cnt的初值为0
for(k = 10;; k++) //循环变量k从10开始,每次递增1
{
n = k * k; //把k的平方数赋给n
if(n < 100) continue; //如果n的值小于100,则进入下一次循环
if(n > 999) break; //如果n的值大于999,则退出for循环语句
a = n / 100; //n除以100得到n的百位上的数字
b = n % 100 / 10; //n对100求余再除以10,得到n的十位上的数字
c = n % 10; //n对10求余得到n个位上的数字
if((a-b)*(a-c)*(b-c) == 0) //如果n三个数位上的数字有两个相同
{
printf("N=%d=%d*%d\n", n, k, k);
bb[cnt++] = n; //把满足条件的三位数n赋给数组元素bb[cnt],同时数组下标变量cnt加1
}
}
return cnt; //返回满足条件的三位数的个数cnt
第4类 根据相邻数大小进行筛选统计并排序
7
#include
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void writeDat();
void jsVal()
{
}
void readDat()
{
int i;
FILE *fp;
fp = fopen("in.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();
}
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);
}
【审题关键句】小于后连续5个数,偶数,从小到大排序。
【解题思路】
①首先定义两个循环整型变量i、 j和一个用于数据交换的整型变量ab。
②然后在for循环语句中,先指定循环变量i从0开始,依次递增到MAX - 5(到MAX-5的原因是因为从倒数第5个数开始,其后面的数都不满5个数,与题目要求不符,因此可以省略最后5个数),接着对每个数组元素a[i]判断其是否为偶数且小于其后面连续的5个数,然后把满足此条件的数组元素a[i]赋给数组元素b[cnt],同时数组的下标变量cnt加1。
③最后,用双重for循环语句对数组b中的数组元素两两比较大小,如果前一个数组元素大于后一个数组元素,则两者进行互换,实现对数组b进行升序或降序的排列。
【参考答案】
int i, j, ab;
for(i = 0; i < MAX - 5; i++)
{
if((a[i] % 2==0) && a[i] < a[i+1] && a[i] < a[i+2] && a[i] b[j]) //如果数组元素b[i]大于b[j],则两者互换
{
ab = b[j];
b[j] = b[i];
b[i] = ab;
}
8
#include
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void writeDat();
void jsVal()
{
}
void readDat()
{
int i;
FILE *fp;
fp = fopen("in.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();
}
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);
}
【审题关键句】大于前连续5个数,偶数,从大到小排序。
【解题思路】本题类似于第35套题,通过审题可以发现主要有3个不同点:①要求进行比较的元素大于连续前5个数,因此在设置for循环条件语句时,应该从第6个元素开始,即数组下标i的值等于5,参考答案的第2条语句;②当前元素连续大于前5个数时,前5个元素的数组下标表示也有所不同,判断表达式也不一样,参考答案的第4条语句;③统计结果按从大到小的方式进行排序,即参考答案的第9条语句。
【参考答案】
int i, j, ab;
for(i = 5; i < MAX; i++)
{
if((a[i] % 2==0) && a[i] > a[i-1] && a[i] > a[i-2] && a[i] >a[i-3] && a[i] >a[i-4] && a[i] >a[i-5]) //判断a[i]连续大于该四位数以前的五个数且该数是偶数
b[cnt++] = a[i]; //把满足此条件的四位数a[i]存入数组元素b[cnt],同时数组下标变量cnt加1
}
/*对数组b进行降序排序*/
for(i = 0; i < cnt - 1; i++)
for(j = i + 1; j < cnt; j++)
if(b[i] < b[j]) //如果数组元素b[i]小于b[j],则两者进行互换
{
ab = b[j];
b[j] = b[i];
b[i] = ab;
}
9
#include
int b[3];
void writeDAT();
void jsValue()
{
}
main()
{
jsValue();
printf("M=100, n=%d\nM=1000, n=%d\nM= 10000, n=%d\n", b[0], b[1], b[2]);
writeDAT();
}
void writeDAT()
{
FILE *fp;
fp = fopen("out.dat", "w");
fprintf(fp, "%d\n%d\n%d\n", b[0], b[1], b[2]);
fclose(fp);
}
【审题关键句】Sn=A1+A2+…+An,An=An-2+2An-1,Sn
void writeDat();
int jsValue(int t)
{
}
main()
{
int n;
n = 1000;
printf("n=%d,f=%d\n",n,jsValue(n));
writeDat();
}
void writeDat()
{
FILE *in, *out;
int i, n, s;
in = fopen("in.dat", "r");
out = fopen("out.dat", "w");
for(i = 0; i < 10; i++)
{
fscanf(in, "%d", &n);
s = jsValue(n);
fprintf(out, "%d\n", s);
}
fclose(in);
fclose(out);
}
【审题关键句】F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。
【解题思路】
①定义表示Fibonacci数列中第F(n-2)项的变量f0,第F(n-1)项的变量f1,第F(n)项的变量f2。
②当Fibonacci数列中第F(n)项的值f2小于t时,把数列当前第F(n-1)项的值f1赋给f0,把数列当前第F(n)项的值f2赋给f1,根据Fibonacci数列的递推关系,第n项的值等于第n-1项的值与第n-2项值的和,计算数列当前第n+1项的值f2= f0 + f1。依次循环,当f2的值大于t时,退出while循环,把f2的值返回。
【参考答案】
int f0 = 0, f1 = 1, f2 = 1; //定义整型变量f0,f1,f2,并分别赋初值为0,1,1
/* f0表示数列中的第F(n-2)项,f1表示数列中的第F(n-1)项,f2表示数列中的第F(n)项*/
while(f2 < t) //当数列中的第F(n)项的值小于t时,执行while循环
{
f0 = f1; //把数列当前第F(n-1)项的值赋给f0
f1 = f2; //把数列当前第F(n)项的值赋给f1
f2 = f0 + f1; //数列当前第F(n-1)项的值加上第F(n)项的值得到数列第F(n+1)项的值
}
return f2; //退出while循环时,得到Fibonacci数列中大于t的最小的一个数f2,返回
11
#include
#include
void writeDAT();
double countValue()
{
}
main()
{
printf("实根=%f\n", countValue());
printf(" %f\n",cos(countValue()) -countValue());
writeDAT();
}
void writeDAT()
{
FILE *wf;
wf=fopen("out.dat","w");
fprintf(wf, "%f\n", countValue());
fclose(wf);
}
【审题关键句】Xn+1=cos(Xn)的迭代计算。
【解题思路】
①因为方程cos(x)-x=0的根为实数,所以定义两个双精度型变量x0, x1。并把变量x1的初值设为0.0。
②根据题目中给出的求方程一个实根的迭代算法,在while循环中,首先把变量x1的值赋给x0,然后利用表达式cos(x0)求出一个值x1,再调用vc6.0的求绝对值的库函数fabs(),判断如果x0与x1差的绝对值小于0.000001,就认为x1的值是方程cos(x)-x=0的一个实根,此时退出循环,把x1的值返回。
【参考答案】
double x0, x1= 0.0; //定义双精度型变量x0, x1, 变量x1赋初值为0.0
while(1) //执行while循环语句
{
x0 = x1; //把x1的值赋给x0
x1 = cos(x0); //求出一个新的x1
if(fabs(x0 - x1) < 0.000001) //如果x0-x1的绝对值小于0.000001,则退出循环
break; //退出循环
}
return x1; //此时x1的值就是方程的一个实根
12
#include
#define N 200
int cnt1, cnt2, xx[N];
float pj;
void writeDat();
void jsValue()
{
}
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp = fopen("in.dat","r");
for(i = 0; i < 20; i++)
{
for(j = 0; j < 10; j++)
{
fscanf(fp, "%d,", &xx[i*10+j]);
printf("%d ", xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
read_dat(xx);
jsValue();
printf("\n\ncnt1=%d,cnt2=%d, pj=%6.2f\n", cnt1, cnt2, pj);
writeDat();
}
void writeDat()
{
FILE *fw;
fw = fopen("out.dat","w");
fprintf(fw, "%d\n%d\n%6.2f\n", cnt1, cnt2, pj);
fclose(fw);
}
【审题关键句】读入数值,奇数个数,偶数个数,数组下标为偶数的平均值。
【解题思路】
①首先定义循环变量i,并对全局变量cnt1、cnt2和pj赋初值0。
②在for循环语句中,将数组xx中的每个数组元素xx[i]对2求余数,如果余数非零,则说明xx[i]是奇数,奇数的个数变量cnt1加1,否则,偶数的计数变量cnt2加1;接着将数组xx下标i对2求余,如果余数等于0,则把xx[i]的值累加到变量pj。
③退出循环时,变量pj的值除以100.0就得到数组xx下标i为偶数的元素值的算术平均值pj(因为数组中共有200个数组,下标为奇偶数的元素各占一半,因此直接将累加变量pj的值直接除100即可得到这些数的平均值)。
【参考答案】
int i; cnt1=0; cnt2=0; pj=0;
/* for循环语句计算数组xx中的数值为奇数的个数cnt1和数值为偶数的个数cnt2以及数组xx下标为偶数的元素值的和*/
for(i = 0; i < N; i++) //循环变量i从0开始,每次递增1,直到其值小于N
{
if(xx[i] % 2) cnt1++; //如果xx[i]的值为奇数,变量cnt1加1
else cnt2++; //否则, xx[i]的值为偶数,变量cnt2加1
if(i % 2==0) pj += xx[i]; //如果数组xx下标i为偶数,则把xx[i]的值累加到变量pj
}
pj /= 100.0; //变量pj除以100.0得到数组xx下标i为偶数的元素值的平均值pj
13
#include
#include
void progReadWrite();
double countValue(int n)
{
}
main()
{
printf("自然数之和的平方根=%f\n", countValue(1000));
progReadWrite();
}
void progReadWrite()
{
FILE *fp, *wf;
int i, n;
double s;
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);
s = countValue(n);
fprintf(wf, "%f\n", s);
}
fclose(fp);
fclose(wf);
}
【审题关键句】同时被3和7整除的自然数和的平方根。
【解题思路】
①定义循环整型变量i和双精度型变量sum,并将sum值设置为0.0。
②采用for循环语句,循环变量i从7开始依次递增直到其值等于或大于n,在循环体中,如果i除以3和7的得的余数同时为0,则说明这个数能同时被3和7整除,这时把这个数的值乘以1.0转化成实型数据,累加到变量sum上。
③退出循环后,调用求平方根的函数sqrt(sum),求得这些数的和的平方根赋给变量sum,把sum的值返回。
【参考答案】
int i;
double sum = 0.0;
/*计算7至n 以内能同时被3和7整除的数的和*/
for(i = 7; i < n; i++) //循环变量i从7开始,每次循环其值增加1,直到其值小于n
if((i % 3) == 0 && (i % 7) == 0) //如果i能同时被3和7整除
sum += 1.0 * i; //把i变量实型数值累加到变量sum上
sum = sqrt(sum); //调用求平方根的库函数sqrt(),计算满足条件的数的和的平方根,并赋给变量sum
return sum; //返回sum的值
14
#include
#define N 200
int max, cnt, xx[N];
float pj;
void writeDat();
void jsValue()
{
}
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp = fopen("in.dat","r");
for(i = 0; i < 20; i++)
{
for(j = 0; j < 10; j++)
{
fscanf(fp, "%d,", &xx[i*10+j]);
printf("%d ", xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
read_dat(xx);
jsValue();
printf("\n\nmax=%d,cnt=%d,pj= %6.2f\n", max, cnt, pj);
writeDat();
}
void writeDat()
{
FILE *fw;
fw = fopen("out.dat","w");
fprintf(fw, "%d\n%d\n%6.2f\n", max, cnt, pj);
fclose(fw);
}
【审题关键句】最大数及其个数,同时被3或7整除的整数的算术平均值。
【解题思路】
①定义循环整型变量i和用于保存数组xx中的能被3整除或能被7整除的元素的个数变量cnt1,并把其值设置为0。把全局变量max、cnt的初值设置为0;把变量pj的初值设置为0.0。
②采用for循环语句,循环变量i从0开始,依次递增到N-1,对数组xx中的每一个数组元素xx[i]用if条件语句判断其值是否能被3整除或能被7整除,如果xx[i]满足上述条件,则把其值累加到变量pj,同时变量cnt1的值加1。再判断数组元素xx[i]与max的大小,如果xx[i]大于max,则xx[i]的值赋给max,同时把变量cnt的值赋为1,如果xx[i]等于max,则变量cnt的值加1。
③退出循环后,用变量pj的值除以cnt1的值就得到满足条件的数的算术平均值。
在for循环语句对200个整数逐个进行扫描,判断其能被3整除或能被7整除的数,并把这些数累加到变量pj,并统计这些数的个数,用这些数的和除以它们的个数,就得到这些数的平均值。对于求出数组xx中的最大数max及最大数的个数cnt的问题,把数组xx中的第一个数赋给变量max,对于能被3整除或能被7整除的数与max的值比较大小,如果此数比max的值大,则把这个数赋值给max,如果此数等于max的值,则最大数的个数cnt加1。
【参考答案】
int i, cnt1 = 0;
max = 0; cnt = 0; pj = 0.0;
/*计算 数组xx中的最大数max及最大数的个数cnt和数组xx中的元素值能被3整除或能被7整除的所有数的和*/
for(i = 0; i < N; i++)
{
if((xx[i] % 3) == 0 || (xx[i] % 7) == 0) //如果xx[i]能被3整除或能被7整除
{
pj += xx[i]; //把xx[i]累加到变量pj上
cnt1++; //变量cnt1加1
}
if(xx[i] > max) //如果xx[i]的值大于max,则xx[i]就是新的最大值,同时变量cnt的值赋为1
{
max = xx[i]; //把xx[i]的值赋给max
cnt = 1; //变量cnt的值赋为1
}
else if(xx[i] == max) //xx[i]的值等于max,则变量cnt的值加1
cnt++;
}
/*退出for 循环时,pj 的值等于所有能被3整除或能被7整除的数的和*/
pj /= (float) cnt1; //pj的值除以所有能被3整除或能被7整除的数的个数,得到能被3整除或能被7整除的所有数的算术平均值,赋给pj
15
#include
#include
char xx[100][11];
int yy[10];
int ReadDat(void);
void WriteDat(void);
void CountRs(void)
{
}
void main()
{
int i;
for(i = 0; i < 10; i++)
本文档为【三级网络绝密34题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。