问答题 在数据文件in.dat中有200组数据,每组有3个数,每个数均是三位数。函数readDat()是读取这200组数据存放到结构数组aa中。请编制函数isSort(),其函数的功能是:要求在200组数据中找出第一个数大于第二个数与第三个数之和的数,其中满足条件的个数作为函数jsSort()的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第一个数与第三个数之和的大小进行升序排列(第一个数与第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数writeDat()把结果bb输出到out.dat文件中。
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
void readDat();
void writeDat(int count);
typedef struct
{
int x1, x2, x3;
} Data;
Data aa[200], bb[200];
int jsSort ()
{

}
void main()
{
int count;
readDat ();
count=jsSort();
writeDat (count);
}
/ *读取这200组数据存放到结构数组aa中"/
void readDat()
{
FILE *in;
int i;
in=fopen("in.dat", "r");
for(i=0; i<200; i++)
fscanf(in, "%d,%d,%d", &aa[i].x1, &aa[i].x2, &aa[i] .x3);
fclose (in);
}
/*把结果bb输出到out.dat文件中*/
void writeDat(int count)
{
FILE *out;
int i;
out=fopen("out.dat", "w");
for(i=0; i<count; i++)
{
printf("%d,%d,%d第一个数+第三个数=%d\n", bb[i].x1, bb[i].x2, bb[i].x3, bb[i].x1+bb[i].x3);
fprintf(out, "%d,%d,%d\n", bb[i].x1, bb[i] .x2, bb[i].x3);
}
fclose(out);
}
【正确答案】
【答案解析】int i,j,count=0;
Data cc;
for(i=0; i<200; i++)
{
/*如果aa[i]的第一个数大于第二个数加第三个数之和,则把aa[i]复制到bb[count]中,同时数组下标变量count;加1*/
if(aa[i].x1> (aa[i].x2+aa[i].x3))
memcpy((Data*)&bb[count++],(Data*)&aa[i],sizeof(Data));
}
/*对bb中的数据按照每组数据的第一个数与第三个数之和的大小进行升序排列*/
for(i=0; i<(count-1); i++)
for(j=2+1; j<count;j++)
{
/*如果bb[i]的第一个数与第三个数之和大于bb[j]的第一个数与第三个数之和,则bb[i]与bb[j]互换*/
if((bb[i].x1+bb[i].x3)>(bb[j].x1+bb[j].x3))
{
memcpy((Data*)&cc,(Data*)&bb[i],sizeof(Data));
memcpy((Data*)&bb[i],(Data*)&bb[j],sizeof(Data));
memcpy((Data*)&bb[j],(Data*)&cc,sizeof(Data));
}
}
return count; //返回满足条件的数据的个数 [解析] 第1个数大于第2个数加第3个数,存入数组,按第1个加第3个数之和升序排序。
通过审题可以发现主要有两个不同点:①筛选满足条件的记录不同,参考答案的第5行,修改if条件语句的设置即可;②对满足条件的筛选结果进行排序的条件不同,参考答案的11行,修改if条件语句的设置即可。