问答题 已知在IN.DAT文件中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)五部分组成。其中:金额=单价×数量。函数ReadDat()读取这100个销售记录并存入结构数组sell中。请编写函数SortDat(),其功能要求:按产品名称从小到大进行排列,若产品名称相等,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat(),把结果输出到OUT.DAT文件中。 注意:部分程序已经给出。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h> #define MAX 100 typedef struct { char dm[5]; /*产品代码*/ char mc[11]; /*产品名称*/ int dj; /*单价*/ int sl; /*数量*/ long je; /*金额*/ } PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() { void main () { memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() { 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].dm,str,4); memcpy(sell[i].mc,str+4,10); memcpy(ch,str+14,4); sell[i].dj=atoi(ch); memcpy(ch,str+18,5); sell[i].sl=atoi(ch); sell[i].je=(long)sell[i].dj * sell[i].sl; } fclose(fp); } void WriteDat() { FILE *fp; int i; fp=fopen("OUT.DAT","w"); for(i=0;i<100;i++) { printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fprintf(fp,"%s %d %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); }
【正确答案】void SortDat() { int i,j; PRO xy; /*对数组sell的所有100条记录进行选择排序*/ for (i=0;i<99;i++) for (j=i+1;j<100;j++) /*按每条记录mc字段(产品名称)的大小进行升序排列*/ if (strcmp(sell[i].mc,sell[j].mc)>0) { xy=sell[i]; sell[i]=sell[j]; sell[j]=xy; } else if (strcmp(sell[i].mc,sell[j].mc)==0) { /*若mc字段相等则按je字段(金额)的大小进行升序排列*/ if (sell[i].je>sell[j].je) { xy=sell[i]; sell[i]=sell[j]; sell[j]=xy; } } }
【答案解析】