您现在的位置:您现在的位置: 一起学 >> 计算机 >> 计算机等级考试 >> 计算机三级 >> 信息管理 >> 上机题库 >> 正文

计算机三级信息管理技术上机考试试题三(附答案)

来源:网友上传  2012-4-25 22:48:54   【一起学:终身教育引导者

已知在文件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()

【考点链接】成员运算符、字符串比较函数strcmpif else语句。

来源:网友上传- 上机题库

责编:上传用户303799  收藏此页 打印 回到顶部