编写一个程序,该程序输入职工工号和完成的产品数量,程序允许同一职工有多次输入,由程序对其完成的产品数量实现累计。程序按完成数量对他们排序,并确定他们的名次。按完成产品数量由多到少的顺序,输出名次、同一名次的职工人数及他们的工号(工号由小到大顺序输出)。要求程序有序链表存储数据。『答案仅供参考』要求程序有序链表存储数据
#include <stdio.h>#include <string.h>#include <header.h>/*编写一个程序,该程序输入职工工号和完成的产品数量,程序允许同一职工有多次输入,由程序对其完成的产品数量实现累计。程序按完成数量对他们排序,并确定他们的名次。按完成产品数量由多到少的顺序,输出名次、同一名次的职工人数及他们的工号(工号由小到大顺序输出)。信息:职工编号(nEmployId,nProductNumber)要求:1.允计同一人多次输入,对产品实行累计*/const int nPerson = 10;//车间工人数char *arr_personId[] = {"001", "002", "003", "004", "005", "006", "007", "008", "009", "010"};int arr_proNumber[nPerson] = {0};/*某个员工的产品数量*/void PersonOne(int index){ int nProCount, nClear; scanf("%d", &nProCount); while(nProCount < 0) { printf("您输入的计件数量不符合标准,请输入数字:\n"); while((nClear = getchar()) != '\n' && nClear != EOF); scanf("%d", &nProCount); } arr_proNumber[index] += nProCount;}/*所有员工计量统计*/void AllPersonPro(){ int i =0; while(i < nPerson) { char nPerId[nPerson]; memset(nPerId, '\0', nPerson); printf("请输入您的编号及完成的产品数量:\n"); scanf("%s", nPerId); int j = 0, index = 0, flag = 0; for(j = 0;j < nPerson;++j) { if(!strcmp(nPerId, arr_personId[j])) { index = j; ++flag; } } j = 0; while(flag == 0) { printf("对不起,您输入的编号不正确,请确认后重新输入:\n"); scanf("%s", nPerId); while(j < nPerson) { if(!strcmp(nPerId, arr_personId[j])) { index = j; ++flag; break; } ++j; } } if(arr_proNumber[index] == 0) { ++i; } PersonOne(index); }}struct Employ{ char cEmpNum[nPerson]; int nNumber;};/*员工计件排名*/void sort(){ AllPersonPro(); struct Employ p[nPerson]; int i = 0; for(i = 0;i < nPerson;++i) { strcpy(p[i].cEmpNum, arr_personId[i]); p[i].nNumber = arr_proNumber[i]; } //对员工作进行排名 for(i = 0;i < nPerson;++i) { for(int j = i; j > 0;--j) { //根据计件数排名 if(p[j].nNumber > p[j-1].nNumber) { struct Employ temp = p[j]; p[j] = p[j-1]; p[j-1] = temp; } //如果计件数相同,根据工号排名 if(p[j].nNumber == p[j-1].nNumber) { if(strcmp(p[j].cEmpNum, p[j-1].cEmpNum) < 0) { struct Employ temp = p[j-1]; p[j-1] = p[j]; p[j] = temp; } } } } for(i = 0;i < nPerson;++i) { printf("编号:%s 计件数:%d\n", p[i].cEmpNum, p[i].nNumber); }}