问答题
在文件IN.DAT中有200组数据,每组有3个数,每个数均是3位数。函数readDat()的功能是读取这200组数据,存放到结构数组aa中。请编写函数jsSort(),返回满足此条件的数的个数。其函数的功能是:在200组数据中找出满足每组数据中的第二个数大于第一个数加第三个数之和这个条件的数,并把这些数存入结构数组bb中,再对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小顺序进行降序排列,排序后的结果仍重新存入结构数组bb中。最后调用函数writeDat(),把结果bb输出到文件OUT.DAT中。
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
[试题程序]
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
int x1, x2, x3;
}Data;
Data aa[200], bb[200];
void readDat();
void writeDat();
int jsSort() //返回满足条件的数的个数
{
}
void main()
{
int count;
readDat();
count=jsSort();
writeDat(count);
}
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);
}
void writeDat(int count)
{
FILE*out;
int i;
out=fopen("OUT.DAT", "w");
system("CLS");
for(i=0; i<count; i++)
{
printf("%d, %d, %d第二个数+第三个数=%d\n", bb[i].x1, bb[i].x2, bb[i].x3, bbi].x2+bb[i].x3);
fprintf(out, "%d, %d, %d\n", bb[i].x1, bb[i].x2, bb[i].x3);
}
fclose(out);
}
【正确答案】
【答案解析】int jsSort()
{int i, j; /*定义循环控制变量*/
int cnt=0; /*定义计数器变量*/
Data temp; /*定义数据交换时的暂存变量,这里是一个Data类型的结构体变量*/
for(i=0; i<200; i++)
if(aa[i].x2>aa[i].x1+aa[i].x3) /*如果第二个数大于第一个数加第三个数之和*/
{
bb[cnt]=aa[i]; /*则把该组数据存入结构数组bb中*/
cnt++; /*同时统计满足条件的数据的个数*/
}
for(i=0; i<cnt-1; i++) /*对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小进行降序排列*/
for(j=i+1; j<cnt; j++)
if(bb[i].x2+bb[i].x3<bb[j].x2+bb[j].x3)
{
temp=bb[i];
bb[i]=bb[j];
bb[j]=temp;
}
return cnt; /*返回满足条件数据的组数*/
}
[考点] 本题考查的知识点主要包括:结构体成员的访问,元素的排序,if判断结构和逻辑表达式。
此题属于结构体的筛选排序问题。分析题干要求,可以归纳出3个关键点:关键点1通过条件“每组数据中第2个数大于第1个数和第3个数之和”对每组数据进行判断;关键点2保存满足条件的数到新数组中并统计其数量;关键点3对新数组中的数再按照第2个数和第3个数之和的大小进行降序排列;关键点4函数的返回值为之前统计的满足的数据的组数。 接着分析具体的解决方法,首先通过if判断结构和逻辑表达式实现对所有结构的筛选,保存并统计个数,然后通过起泡法完成排序,最后函数返回组数。