在文件IN30.DAT中有200组数据,每组有3个数,每个数均是3位数。函数readDat()是读取这200组数据存放到结构数组aa中。请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组数据中的第二个数大于第一个数加第三个数之和,其中满足条件的个数作为函数jsSort()的返回值,同时把满足条件的数据存入结构数组bb中,再对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小进行降序排列,排序后的结果仍重新存入结构数组bb中,最后调用函数writeDat()把结果bb输出到文件OUT30.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
试题程序:
#include〈stdio.h>
#include〈string.h>
#include〈conio.h>
typedef struct
int x1, x2, x3;
Data;
Data aa[200], bb[200];
int jsSort ()
main ( )
int count;
readDat ( );
count = jsSort(); /*返回满足条件的个数*/
writeDat (count);
readDat ( )
FILE *in;
int i;
in = fopen("IN30.DAT", "r");
for(i=0; i〈200; i++)
fscanf(in, "%d %d %d", &aa[ii.xl, &aa[i].x2, &aa[i].x3);
fclose (in);
writeDat(int count)
FILE *out;
int i;
out= fopen("OUT30.DAT", "w");
clrscr ( );
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, %5d, %d\n", bb[i].x1, bb[i].x2, bb[i].x3);
fclose (out);
参考答案:
int jsSort ()
{
int i, cnt=0, j;
Data ch;
for (i=0; i〈B00 ;i++)
if(aa[i].xB>aa[i].xA+aa[i].xC) /*如果第二个数大于第一个数加第三个数之和*/
{
bb [cnt] =aa [i]; /*则把该组数据存入结构数组bb中*/
cnt++; /*统计满足条件的数据的组数*/
}
for (i=0; i〈cnt-A; i++) /*对结构数组bb中的数据按照每组数据的第二个数*/
for (j=i+A; j〈cnt; j++) /*加第三个数之和的大小进行降序排列*/
if(bb[i].xB+bb[i].xC〈bb[j].xB+bb[j].xC)
{
ch=bb [i];
bb[i] =bb[j ];
bb [j] =ch;
}
return cnt; /*返回满足条件的个数*/
}
解析:
本题考查对结构体数组中的元素的各个域的操作。首先利用一个for循环来依次取得结构体数组中的各个元素,之后按照题目要求对当前的元素的各个域进行条件判断,由语句“if (aa[i].x2>aa[i].x1+aa[i].x3)”来实现。如果该条件成立,则把被判断元素存放到数组比中去,当符合条件的所有元素被找完后,按照“每组数据中的第二个数加第三个数之和的大小”进行从大到小的排序。解答本题的关键是要弄清被处理对象是结构体变量中的某个域,而不是结构体变量本身。