问答题
已知文件IN42.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件0UT42.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WfiteDat()的内容。 [试题程序] #include<stdio.h> #include<memory.h> #include<string.h> #include<stdlib.h> #define MAX 100 typedef struct char dm[5];/*产品代码*/ char mc[11];/*产品名称*/ int dj;/*单价*/ int S1;/*数量*/ long je;/*金额*/ PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() voidmain() memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE*fp; char str[80],ch[11]; int i; fp=fopen("IN42.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); ch[4]=0; sell[i].dj=atoi(ch); memcpy(ch,str+18,5); ch[5]=0; 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("OUT42.DAT","W");for(i=0;i<100;i++) fprintf(fp,"%s%s%4d%5d%10ld/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fclose(fp);
【正确答案】 void SortDat() { int i,j: /*定义循环控制变量*/ PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/ for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++) if(strcmp(sell[i].dm,sell[j].dm)>0) /*按产品代码从小到大进行排列*/ { temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } else if(strcmp(sell[i].dm,sell[j].dm)==0) /*若产品代码相同,则按金额从小到大进行排列*/ if(sell[i].je>sell[j].je) { temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; }
【答案解析】 [解析] 本题是有关结构体数组的排序问题。 这可以用选择法来实现,即用第一个元素的产品代码依次同它后面的元素的产品代码进行比较,如果发现当前元素的产品代码比后面的某个元素的产品代码对应字符的ASCⅡ码大(这里用到了字符串比较函数strcmp()),则交换这两个元素的位置,继续和后面的其他元素进行比较。 最终在第一个元素中存放的是产品代码最小的元素,以此类推,就实现了按产品代码从小到大排序的功能。在排序过程中,若产品代码相同,则要按照金额从小到大进行排列。
提交答案
关闭