输入学生信息与三科成绩,并存放在链表中;输出总成绩最高的 学生信息及成绩。

img

img

img


输入学生信息与三科成绩,并存放在链表中;输出总成绩最高的
学生信息及成绩。例如,若学生信息为:"2023001张一明839278;2023002李小明859478;2023003王大民888878",则执行程序后,输出总分最高的学生李小明的相关信息。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7738059
  • 你也可以参考下这篇文章:在有n个学生的成绩表里,每条信息由姓名与分数组成,要求:1按分数高低次序,输出每个学生的名字,分数相同的为同一名次,2按名次输出每个学生的姓名与分数。
  • 除此之外, 这篇博客: 有一个表示学生信息的结构体中的 有一个学生结构体,其数据成员有: 学号, 姓名, 3 门课程。从键盘上输入 5 个学生的信息。要求输出: 1.按照学号递增输出全部学生信息,每个学生的信息一行。(格式: 学号 姓名 分数1 分数 2 分数 3 总分) 2.输出每门课程最高分的学生的信息 3.输出每门课程的平均分 4.按照总分输出学生排名 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • #define _CRT_SECURE_NO_DEPRECATE
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define N 5
    typedef struct student
    {
    int stuID;
    char name[20];
    double score[3];
    }STU;
    
    void Print_InFo(STU *);
    void Print_RankstuID(STU *);
    void Print_MaxScoreOfOne(STU *);
    void Print_AvegerScore(STU *);
    void Print_RankOfTotal(STU *);
    	
    int main()
    {
    	STU stus[5];
    	int i = 0;
    	for (; i < 5; i++)
    	{
    		scanf("%d%s%lf%lf%lf", &stus[i].stuID, &stus[i].name, &stus[i].score[0], 	&stus[i].score[1], &stus[i].score[2]);
    	}
    	Print_RankstuID(stus);
    	printf("-------------------------------------------------------\n");
    	Print_MaxScoreOfOne(stus);
    	printf("-------------------------------------------------------\n");
    	Print_AvegerScore(stus);
    	printf("-------------------------------------------------------\n");
    	Print_RankOfTotal(stus);
    	system("pause");
    	return 0;
    }
    
    //打印学生信息
    void Print_InFo(STU *stus)
    	{
    	int i = 0;
    	for (; i < N; i++)
    	{
    		printf("学号:%d		姓名:%s		分数1:%5.2		分数2:lf%5.2		分数3:lf%5.2		总分:lf%5.2lf", stus[i].stuID, stus[i].name, stus[i].score[0], stus[i].score[1], stus[i].score[2],stus[i].score[0]+stus[i].score[1]+ stus[i].score[2]);
    	}	
    }
    //按照学号顺序输出学生信息
    void Print_RankstuID(STU *stus)
    {
    	int i = 0, j = 0;
    	for (i = N; i > 0; i++)//外层控制无序数的数量
    	{
    		for (j = N; j > 0; j++)//内层控制比较
    		{
    			if (stus[j].stuID > stus[j + 1].stuID)
    			{
    				STU s = stus[j];
    				stus[j] = stus[j + 1];
    				stus[j + 1] = s;
    			}
    		}
    	}
    	printf("按照学生的学号排序如下:\n");
    	Print_InFo(stus);
    }
    	
    //输出每门课程最高分的学生信息
    void Print_MaxScoreOfOne(STU *stus)
    {
    	STU* s;
    	int i = 0, j = 0;
    	for (i = 0; i < 3; i++)
    	{
    		s = &stus[0];		//认为第一个是最大的,让s始终指向最大的
    		printf("课程%d最高分的学生信息为:\n", i + 1);
    		for (j = 1; j < N; j++)
    		{
    			if (stus[j].score[i] > s->score[i])
    			{
    				s = &stus[j];
    			}
    		}
    		printf("学号:%d		姓名:%s		分数1:%5.2lf		分数2%5.2lf		分数3%5.2lf		总分%5.2lf\n", s->stuID, s->name, s->score[0], s->score[1], s->score[2], s->score[0] + s->score[1] + s->score[2]);
    	}
    }
    //打印每门课程的平均分
    void Print_AvegerScore(STU *stus)
    {
    	int i = 0, j = 0;
    	double ave = 0;
    	for (i = 0; i < 3; i++)
    	{
    		ave = 0;
    		for (j = 0; j < N; j++)
    		{
    			ave += stus[j].score[i];
    		}
    		ave /= N;
    		printf("课程%d的平均分为%5.2lf\n", i + 1, ave);
    	}
    }
    	
    //按照总分高低输出学生排名
    void Print_RankOfTotal(STU *stus)
    {
    	int i = 0, j = 0;
    	for (i = 0; i < N - 1; j++)
    	{
    		for (j = 0; j < N - 1 - i; j++)
    		{
    			if (stus[j].score[0] + stus[j].score[1] + stus[j].score[2] < stus[j + 1].score[0] + stus[j + 1].score[1] + stus[j + 1].score[2])
    			{
    				STU s = stus[j];
    				stus[j] = stus[j + 1];
    				stus[j + 1] = s;
    			}
    		}
    		printf("按照学生的总分排名如下:\n");
    		Print_InFo(stus);
    	}
    }
    
    
    
  • 您还可以看一下 数智优佳学堂老师的智慧城市之智慧中台专题-数字孪生城市架构解决方案课程中的 数字孪生城市的价值 小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以解决该问题。

    解决方案如下:

    首先,我们需要定义一个包含学生姓名和三个科目成绩的结构体,然后通过链表将多个学生的信息依次存储下来。存储完成之后,遍历链表,计算每个学生的总分,找到总分最高的学生并输出该学生的详细信息。下面是代码实现:

    #include <iostream>
    #include <string>
    using namespace std;
    
    // 定义学生信息结构体
    struct Student{
        string name;
        int score[3];
        int total_score;
        Student* next;
    };
    
    // 添加学生函数
    void addStudent(Student* &head){
        Student* p = new Student;
        cout << "请输入学生信息(学号 姓名 科目1成绩 科目2成绩 科目3成绩),各字段之间以空格分隔,输入完毕后请按回车键:" << endl;
        cin >> p->name >> p->score[0] >> p->score[1] >> p->score[2];
        p->total_score = p->score[0] + p->score[1] + p->score[2];
        if (head == NULL){
            head = p;
            p->next = NULL;
        }
        else{
            p->next = head;
            head = p;
        }
        cout << "添加成功!" << endl;
    }
    
    // 遍历并输出学生信息函数
    void traverse(Student* head){
        Student* p = head;
        Student* top = NULL;
        int max_score = 0;
        while (p != NULL){
            cout << "学号:" << p->name << " 姓名:" << p->score[0] << " 科目1成绩:" << p->score[1] << " 科目2成绩:" << p->score[2] << " 科目3成绩:" << p->score[3] << " 总分:" << p->total_score << endl;
            if (p->total_score > max_score){
                max_score = p->total_score;
                top = p;
            }
            p = p->next;
        }
        cout << "最高分学生信息如下:" << endl;
        cout << "学号:" << top->name << " 姓名:" << top->score[0] << " 科目1成绩:" << top->score[1] << " 科目2成绩:" << top->score[2] << " 科目3成绩:" << top->score[3] << " 总分:" << top->total_score << endl;
    }
    
    int main(){
        Student* head = NULL;
        for (int i = 0; i < 3; i++){
            addStudent(head);
        }
        traverse(head);
        return 0;
    }
    

    在上面的代码中,我们定义了一个包含学生姓名和三个科目成绩的结构体,并通过添加学生函数将多个学生的信息依次存储下来,在存储的过程中,我们也计算了每个学生的总分。然后我们遍历链表,输出每个学生的详细信息,并找到总分最高的学生并输出该学生的信息。

    注意我们的代码只实现了对三个科目成绩的存储和计算,要想进行更多科目的计算,只需要在结构体中增加相应的score字段即可。同时,由于题目没有要求输出学生信息时需要按照总分排序,我们采用了遍历的方式遍历链表,这样做效率并不高,如果要求按照总分排序输出,需要使用高效的排序算法(例如,快速排序、堆排序等)来进行优化。

(1) MYDATA (2) h->next=q; (3) pos = j; (4) p = h->next; (5) findMax(h);