代码如下,注释写的很清楚了吧,求回答,大一生只会纯C语言。或者能否给几个其他测试样例?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct banggong
{
char name[1000];
char job[100];
long contribution;
int grade;
int postpos;//记录输入顺序
};
void myscanf(char a[], struct banggong* p, int num);
void Sort1(struct banggong* p, int n);
void Adjustjob(struct banggong* p, int n);
void Sort2(struct banggong* p, int a, int b);//排序的上下限
void Sort3(struct banggong* p, int a, int b);
int main()
{
int n;
char temp[1000];
scanf("%d", &n);
getchar();
struct banggong* p = (struct banggong*)malloc(n * sizeof(struct banggong));
for (int i = 0; i < n; i++) {
gets(temp);
myscanf(temp, p, i);//将整体读入的字符串转化为字符串数据
}
Sort1(p, n);//对着帮贡排序
Adjustjob(p, n);//调整职位
Sort2(p, 1, 2);//在同职位的情况下对着等级排序,护法
Sort2(p, 3, (4 < n - 1) ? 4 : (n - 1));//在同职位的情况下对着等级排序,护法
Sort2(p, 5, (8 < n - 1) ? 8 : (n - 1));//长老
Sort2(p, 9, (15 < n - 1) ? 15 : (n - 1));//堂主
Sort2(p, 16, (40 < n - 1) ? 40 : (n - 1));//精英
Sort2(p, 41, n);//帮众
for (int i = 0; i < n - 1; i++)
printf("%s %s %d\n", p[i].name, p[i].job, p[i].grade);
printf("%s %s %d", p[n - 1].name, p[n - 1].job, p[n - 1].grade);
free(p);
return 0;
}
void myscanf(char a[], struct banggong* p, int num)
{
long x = 0;
int y = 0, count = 0, i = 0;
for (i = 0; a[i] != ' '; i++)//读到空格停止
p[num].name[i] = a[i];
count += (i + 1);//count记录位置
p[num].name[i] = '\0';
for (i = 0; a[i + count] != ' '; i++)//读到空格停止
p[num].job[i] = a[i + count];
count += (i + 1);//count记录位置
p[num].job[i] = '\0';
for (i = 0; a[i + count] != ' '; i++)//读到空格停止
x = x * 10 + (a[i + count] - '0');//读贡献
count += (i + 1);//count记录位置
p[num].contribution = x;
for (i = 0; a[i + count] != '\0'; i++)
y = y * 10 + (a[i + count] - '0');//读等级
p[num].grade = y;
p[num].postpos = num + 1;
}
void Sort1(struct banggong* p, int n)
{
int i, j, k, tg, tp;//tc交换贡献,tg交换等级,tp交换位置顺序
long tc;
char tname[50];//tname交换名字
for (i = 3; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (p[k].contribution < p[j].contribution) k = j;
if (k != i) {
tc = p[k].contribution;
p[k].contribution = p[i].contribution;
p[i].contribution = tc;
tg = p[k].grade;
p[k].grade = p[i].grade;
p[i].grade = tg;
tp = p[k].postpos;
p[k].postpos = p[i].postpos;
p[i].postpos = tp;
strcpy(tname, p[k].name);
strcpy(p[k].name, p[i].name);
strcpy(p[i].name, tname);
}
}
}
void Adjustjob(struct banggong* p, int n)
{
int i = 1;
for (i = 1; i < n; i++) {
if (i == 0) strcpy(p[i].job, "BangZhu");
else if (i == 1 || i == 2) strcpy(p[i].job, "FuBangZhu");
else if (i == 3 || i == 4) strcpy(p[i].job, "HuFa");
else if (i >= 5 && i <= 8) strcpy(p[i].job, "ZhangLao");
else if (i >= 9 && i <= 15) strcpy(p[i].job, "TangZhu");
else if (i >= 16 && i <= 40) strcpy(p[i].job, "JingYing");
else if (i > 40) strcpy(p[i].job, "BangZhong");
}
}
void Sort2(struct banggong* p, int a, int b)
{
if (a >= b) return;
int i, j, k, tg, tp;
long tc;
char tname[50];
int count[1000] = { 0 };//等级桶
for (i = a; i <= b - 1; i++)//上下限对着等级排序
{
k = i;
for (j = i + 1; j <= b; j++)
if (p[k].grade < p[j].grade) k = j;
if (k != i) {
tc = p[k].contribution;
p[k].contribution = p[i].contribution;
p[i].contribution = tc;
tg = p[k].grade;
p[k].grade = p[i].grade;
p[i].grade = tg;
tp = p[k].postpos;
p[k].postpos = p[i].postpos;
p[i].postpos = tp;
strcpy(tname, p[k].name);
strcpy(p[k].name, p[i].name);
strcpy(p[i].name, tname);
}
}
for (i = a; i <= b; i++)
count[p[i].grade]++;
int ans = 0;
for (i = 150; i >= 0; i--)
{
if (count[i] == 1) ans++;
else if (count[i] >= 2) Sort3(p, a + ans, a + ans + count[i]);
}
}
void Sort3(struct banggong* p, int a, int b)
{
if (a >= b) return;
int i, j, k, tg, tp;
long tc;
char tname[50];
for (i = a; i < b - 1; i++)//上下限对着等级排序
{
k = i;
for (j = i + 1; j < b; j++)
if (p[k].postpos > p[j].postpos) k = j;
if (k != i) {
tc = p[k].contribution;
p[k].contribution = p[i].contribution;
p[i].contribution = tc;
tg = p[k].grade;
p[k].grade = p[i].grade;
p[i].grade = tg;
tp = p[k].postpos;
p[k].postpos = p[i].postpos;
p[i].postpos = tp;
strcpy(tname, p[k].name);
strcpy(p[k].name, p[i].name);
strcpy(p[i].name, tname);
}
}
}