本系列资料由"韬略宏智" 授权发布,任何网站不得转载,否则追究法律责任。
第1套
请编写一个函数jsValue(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入数组xx传回。最后调用函数readwriteDat()读取10组数据,分别得出结果且把结果输出到文件out1.dat中。部分程序已经给出。
例如:若输入17,5,则应输出:19,23,29,31,37。
请勿改动主函数main()和输出数据函数readwriteDat()的内容。
#include
#include
void readwriteDat();
void jsValue (int m,int k,int xx[])
{
}
main()
{
int m,n,xx[1000];
clrscr();
printf("\nPlease enter two integers:");
scanf("%d,%d",&m,&n);
jsValue (m,n,xx);
for(m=0;m
printf("\n");
readwriteDat();
}
void readwriteDat()
{
int m,n,xx[1000],i;
FILE *rf,*wf;
rf=fopen("in1.dat","r");
wf=fopen("out1.dat","w");
for(i=0;i<10;i++)
{
fscanf(rf,"%d %d",&m,&n);
jsValue (m,n,xx);
for(m=0;m
fprintf(wf,"\n");
}
fclose(rf);
fclose(wf);
}
}
void main()
{
ReadDat();
jsSort();
WriteDat();
}
ReadDat()
{
FILE *in;
int i;
in=fopen("in2.dat","r");
for(i=0;i<200;i++)
fscanf(in,"%d,",&aa[i]);
fclose(in);
}
WriteDat()
{
FILE *out;
int i;
clrscr();
out=fopen("out2.dat","w");
for(i=0;i<10;i++)
{
printf("%d ",bb[i]);
fprintf(out,"%d \n ",bb[i]);
}
fclose(out);
}
答案解析
【答案】
void jsSort()
{
int i,j,data;
for(i=0;i<199;i++)
for(j=i+1;j<200;j++)
{
if (aa[i]%1000>aa[j]%1000)
{
data=aa[i];
aa[i]=aa[j];
aa[j]=data;
}
else if(aa[i]%1000==aa[j]%1000)
if(aa[i]<aa[j])
{
data=aa[i];
aa[i]=aa[j];
aa[j]=data;
}
}
for(i=0;i<10;i++)
bb[i]=aa[i];
}
【解析】
考点:(1)数据的分解;
(2)分解后的筛选;
(3)筛选后的排序。
本题的解题思路是:对每个四位数的后三位数字进行比较排序,若后三位相等则按原始值进行排序。可以通过“%”来取出得当前数的后三位数字,比较排序的算法是每次选定一个位置的元素和它后面的所有元素相比较,如果比后面的元素大则两者交换,若相等则按实际大小排序,比较一趟完成后,此位置上元素的后三位数字,都不大于其后面所有元素的后三位数字。比较一直进行到所有元素均被访问后结束,一共需要比较199趟,每趟需要比较199-j次。
程序的流程是:首先调用了ReadDat()函数读入数据并且存放在数组aa中,然后调用jsSort()函数对数据进行操作,最后由WriteDat()函数将结果写回文件out2.dat中去。
在jsSort()函数中,前面两重for循环的功能是对数组aa中的元素进行排序,其排序的过程是根据每个元素的后三位数字大小进行升序排列。其中aa[i]%1000操作是舍去千位上的数字,得到百位、十位和个位数字,然后通过下面else if语句和内嵌if语句进行判断,如果元素的后三位相等,则按实际大小进行降序排列。最后执行一个for循环,将排序好的前十位数字存入数组bb中,jsSort()函数结束。
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |