已知在文件IN.dat中存有100个产品销售记录,每个产品销售记录由产品代码code(字符型4位)、产品名称name(字符型10位)、单价uprice(整型)、数量amount(整型)、金额sum(长整型)5部分组成。其中:金额=单价×数量。函数RData()读取这100个销售记录并存入结构数组sell中。请编写函数SortDat(),其功能是:按金额从大到小进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中。最后调用函数WData(),把结果输出到OUT.dat文件中。
注意:部分源程序已经给出。请勿改动主函数main()、读数据函数RData()和输出数据函数WData()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{ char code[5]; /* 产品代码 */
char name[11]; /* 产品名称 */
int uprice; /* 单价 */
int amount; /* 数量 */
long sum; /* 金额 */
} PRO;
PRO sell[MAX];
void RData();
void WData();
void SortDat()
{
}
void main()
{ memset(sell, 0, sizeof(sell));
RData();
SortDat();
WData();
}
void RData()
{ FILE *fp;
char str[80], ch[11];
int i;
fp = fopen("IN.dat", "r");
for (i=0; i<100; i++)
{ fgets(str, 80, fp);
memcpy(sell[i].code, str, 4);
memcpy(sell[i].name, str+4, 10);
memcpy(ch, str+14, 4);
ch[4] = 0;
sell[i].uprice = atoi(ch);
memcpy(ch, str+18, 5);
ch[5] = 0;
sell[i].amount = atoi(ch);
sell[i].sum = (long)sell[i].uprice * sell[i].amount;
}
fclose(fp);
}
void WData()
{ FILE *fp;
int i;
fp = fopen("OUT.dat", "w");
for (i=0; i<100; i++)
{ printf("%s %s %4d %5d %5d\n",sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum);
fprintf(fp, "%s %s %4d %5d %5d\n",sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum);
}
fclose(fp);
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现SoreDat()函数的功能即可。SoreDat()要实现的功能是:按金额从大到小进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中。因此解答本题的关键在于如何通过自定义类型变量读取一条销售记录,并按其中指定的成员排序。
【解题思路】在双重for循环中首先比较两个产品的金额,如果前一个产品的金额小于后一个产品的金额,则这两个产品进行数据交换。如果两个产品的金额相等,则用字符串比较函数strcmp比较两个产品的代码,如果返回的值大于0,则这两个产品进行数据交换。
【参考答案】
void SortDat()
{ int i, j;
PRO temp;
for (i=0; i<MAX-1; i++)
for (j=i+1; j<MAX; j++)
if (sell[i].sum < sell[j].sum)
{ temp = sell[i];
sell[i] = sell[j];
sell[j] = temp;
}
else if (sell[i].sum == sell[j].sum)
{ if (strcmp(sell[i].code, sell[j].code) > 0)
{ temp = sell[i];
sell[i] = sell[j];
sell[j] = temp;
}
}
}
【易错分析】结构型数据对成员的访问用“.”成员运算符;两个字符串的比较用字符串比较函数strcmp()。
【考点链接】成员运算符、字符串比较函数strcmp、if else语句。
责任编辑:小草