问答题 已知在文件in.dat中存有200组数据,每组有3个数,每个数均是三位数。函数readDat()是读取这200组数据存放到结构数组aa中。请编制函数jsSort(),其函数的功能是:要求在200组数据中找出第二个数大于第一个数加第三个数之和的数,其中满足条件的个数作为函数jsSort()的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第二个数加第三个之和的大小进行降序排列(第二个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数writeDat()把结果bb输出到out.dat文件中。
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
typedef struct
{
int x1, x2, x3;
} Data; //定义结构体类型Data
Data aa[200] , bb[200]; //定义结构体Data型一维数组aa[200], bb[200]
void readDat();
void writeDat(int count);
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].xl, &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] .x2+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;
/*在200组数据中找出条件为每组数据中的第二个数大于第一个数加第三个数之和的数据,满足条件的数据的个数为变量count的值,同时把满足条件的数据存入结构数组bb中*/
for(i=0; i<200; i++)
{
/*如果aa[i]的第二个数大于第一个数加第三个数之和,则把aa[i]复制到bb[count]中,同时数组下标变量count加1*/
if(aa[i].x2>(act[i].x1+act[i].x3))
memcpy((Data*)&bb[count++],(Data*)&aa[i],sizeof(Data));
}
/*对bb中的数据按照每组数据的第二个数加第三个之和的大小进行降序排列*/
for(i=0;i<(count-1);i++)
for(j=i+1; j<counL; j++)
{
/*如果bb[i]的第二个数与第三个数之和小于bb[j]的第二个数与第三个数之和,则bb[i]与bb[j]互换*/
if((bb[i].x2+bb[i].x3)<(bb[j].x2+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; //返回满足条件的数据的个数 [解析] 第2个数大于第1个数加第3个数,存入数组,按第2个加第3个数之和降序排序。
①首先定义两个循环变量i、j;一个计数变量count;一个用于中间转换数据的结构体变量cc。
②建立一个for循环,指定第一个for循环的循环变量i从0开始,到200时结束,每循环一次,变量i的值加1。在循环体中依次判断每行数据中,如果aa[i]的第二个数大于第一个数加第三个数之和,则把aa[i]复制到bb[count]中,同时数组下标变量count加1。
③将所有满足条件的记录筛选保存到数组bb[]后,再通过两个for循环对数组bb[]中记录进行排序。第一个for循环的循环变量i的初值为0,当等于数组计数变量count的值减1时停止循环,每循环一次,i的值加1;第二个for循环的循环变量i的初值等于i+1,当等于数组计数变量count的值时停止循环,每循环一次,j的值加1;每次进行比较时,如果第i行的第二个数加第三个之和小于其后面第j行的第二个数加第三个之和,将执行if条件语句后面花括号中的命令,花括号中3条命令的功能就是根据题目要求按每行数据中第二个数加第三个之和从大到小排序。
④最后将计数函数count返回。