#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);
}
}
我可以解决该问题。
解决方案如下:
首先,我们需要定义一个包含学生姓名和三个科目成绩的结构体,然后通过链表将多个学生的信息依次存储下来。存储完成之后,遍历链表,计算每个学生的总分,找到总分最高的学生并输出该学生的详细信息。下面是代码实现:
#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);