探讨一下大概思路哈:
项目和学校各设一个结构体,如下:
//项目结构体
typedef struct project{
int prjID; //项目编号
char* prjName[]; //项目名
int prjScore; //某学校在本项目取得的分数
int prjScID; //该学校ID
char* prjScoreStuName[]; //取得该分数的学生姓名
struct project *next; //用来支持一个同项目根据分数排序的链表
}project_t;
//学校结构体
typedef struct school{
int scID; //学校编号
char* scName[]; //学校名
project_t* scPrj[m+w]; //记录本学校在所有项目中的成绩,无成绩的项目为空指针NULL
}school_t;
有了结构体后,再维护两张表,一张是全体项目表,一张是全体学校表:
//因为规定了最大数量,所以若不知道具体数量时下列两表的[]内也可以直接使用限定的最大数量
project_t* allPrjTbl[m+w]; //全体项目表
school_t* allScTbl[n]; //全体学校表
完成以上步骤后,就可以支持需要的功能了:
//我不知道具体输入方式,所以以数组为例写下大概逻辑,假定输入都是有序的
//功能函数我就不写具体实现了,根据函数名应该能看出它的作用
1.输入项目成绩,假定各输入数据都由第1名在前按序排列
void input_project_score(int prjID, char* prjName, int *score, int score_num, int* scID, char** stuName)
{
for (int i = 0; i < score_num; i++)
{
project_t* newPrjNode = creat_project_node(prjID, prjName, score[i], scID[i], stuName[i]);
//新记录入表
if (i == 0)
{
allPrjTbl[prjID] = newPrjNode;
}
else
{
find_list_tail(allPrjTbl[prjID])->next = newPrjNode;
}
allScTbl[scID[i]].scPrj[prjID] = newPrjNode; //记录到对应学校
}
}
2.统计各学校总分,这里就写一下单个的,所有学校的就根据allScTbl来就好
int get_school_score_sum(int scID)
{
int score_sum = 0;
for (int i = 0; i < m+w; i++)
{
score_sum += allScTbl[scID].scPrj[i]->prjScore;
}
return score_sum;
}
3.按学校编号、学校总分、男女团体总分排序输出
//就不写了,思路和上面是一样的,就是输出内容不一样而已
4.按学校编号查询学校某个项目的情况
project_t* get_school_project(int scID, int prjID)
{
return allScTbl[scID].scPrj[i];
}
5.按项目编号查询取得前三或前五的学校
//在这个例子的录入方法下,allPrjTbl[prjID]就是一张按成绩排序的链表,查询这个链表的每个节点的prjScID,再拿这个ID从allScTbl表找就好了
大概思路就是以上这样,输入输出方式不影响这些逻辑
运动会分数统计系统
https://blog.csdn.net/weixin_43811333/article/details/104806493