因为比较简单就不过多赘述,有问题的读者可以在评论区评论,也可以私信一起讨论
一、.c文件
#include"Module.h"
int main()
{
SqList L;
int N = 0,Choice=0;
printf("您将录入的学生信息个数为:");
scanf_s("%d", &N);
InitList(L, N);//初始化顺序表L
while (1)
{
printf("请选择想完成的操作:1:查询学生成绩\t2:按总分对学生进行排序\t3:查看各科的平均分\t4:退出\n");
scanf_s("%d", &Choice);
switch (Choice)
{
case 1:
Find(L);
break;
case 2:
Rank(L);
break;
case 3:
average(L);
break;
case 4:
exit(0);
break;
}
}
}
二、.h文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAXSIZE 20//限制结构体STU最大容量
#define QUANTITY 21//限制顺序表最大元素个数
typedef struct
{
char name[20];
int Chinese,Math,English,total;//toral用来存放总分
//int Total = Chinese+Math+English;不能这样写会报错
}STU;
typedef struct
{//L.elem存储所需空间的地址,后将为基地址申请空间存放数据
STU* elem;//存储空间的基地址,顺序表指针动态赋存储空间
int length;
}SqList;//顺序表
int InitList(SqList& L, int N)//传引用,以及传参N
{
int flag2 = 0;
L.elem = new STU[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
L.length = N;//定义顺序表表长为N
if (L.elem == NULL)//判断申请空间是否成功,如果申请空间不成功返回false
{
return false;//将函数返回值定义为int
} //return false相当于返回0,return true相当于返回1
else//成功申请空间
{ //继续对传入参数N(表长也是元素个数)进行判断
if (L.length == 0)//L.length = N=0
{
printf("您将录入的学生信息个数为:0\n");
}
else if (L.length < 0)//L.length=N=0
{
printf("非法输入请重新输入:");
return false;
}
else if (L.length > QUANTITY)//如果超出顺序表最大容量
{
printf("对不起您输入的数据超出存储范围,请重新输入:");
return false;
}
else//合法输入1<=N<= QUANTITY
{//初始化顺序表
for (int i = 0; i < L.length; i++)
{
circul://从goto回到circul处
printf("请输入第%d个学生的姓名、语文、数学、英语的成绩:", i + 1);
scanf_s("%s", &L.elem[i].name, sizeof(L.elem[i].name));
scanf("%d", &L.elem[i].Chinese, sizeof(L.elem[i].Chinese));
scanf_s("%d", &L.elem[i].Math, sizeof(L.elem[i].Math));
scanf_s("%d", &L.elem[i].English, sizeof(L.elem[i].English));
if (((L.elem[i].Chinese <= 150) && (L.elem[i].Chinese >= 0)) && ((L.elem[i].Math <= 150) && (L.elem[i].Math >= 0)) && ((L.elem[i].English <= 150) && (L.elem[i].English >= 0)))
{
flag2 = 1;
}
else
{
flag2 = 0;
printf("输入成绩错误!!请重新录入\n");
goto circul;
}
}
printf("输入完成,所输入学生信息为:\n");//打印顺序表内容
for (int i = 0; i < L.length; i++)
{
printf("%s\t%d\t%d\t%d\n", L.elem[i].name, L.elem[i].Chinese, L.elem[i].Math, L.elem[i].English);
}
return true;
}
}
}
int Find(SqList& L)
{
char name[12] = { 0 };
int i = 0, j = 0,flag=0;
printf("请输入你想查询学生的名字:\n");
scanf_s("%s", &name,sizeof(name));
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].name, name) == 0)
{
flag = 1;
printf("该学生的语文成绩为:%d\t数学成绩为:%d\t英语成绩为:%d\n",L.elem[i].Chinese, L.elem[i].Math, L.elem[i].English);
return true;
}
}
if (flag == 0)
{
printf("未检索到学生姓名!!\n");
return false;
}
}
int Rank(SqList& L)
{
int arr[5] = { 0 };
for (int i = 0; i < L.length; i++)
{
L.elem[i].total = L.elem[i].Chinese + L.elem[i].Math + L.elem[i].English;
}//求出总分
for (int i = 0; i < L.length; i++)
{
int count1 = 0;
for (int j=0; j < L.length; j++)
{
if (L.elem[i].total < L.elem[j].total)
{
count1 += 1;
}
}
arr[i] = count1;//利用数组存储名次
}
for (int a = 0; a <= L.length; a++)
{
for(int b=0;b<L.length;b++)
if(arr[b]==a)//当名次和序号对应时打印顺序表元素
printf("%s是第%d名\t语文成绩为:%d\t数学成绩为:%d\t英语成绩为:%d\t总成绩为:%d\n", L.elem[b].name, a + 1, L.elem[b].Chinese, L.elem[b].Math, L.elem[b].English, L.elem[b].total);
}
return true;
}
int average(SqList& L)
{
float A_Chinese=0, A_Math=0, A_English = 0;
for (int i=0; i < L.length; i++)
{
A_Chinese += L.elem[i].Chinese;
A_Math += L.elem[i].Math;
A_English += L.elem[i].English;
}
printf("本次测试语文平均分为:%.2f\t数学平均分为:%.2f\t英语平均分为:%.2f\n", A_Chinese/3.0, A_Math/3.0, A_English/3.0);
return true;
}
三、结果展示
当输入学生信息个数小于0时会被认定为非法输入,将重新输入;
等于0时将会打印:录入学生信息个数为0
当录入学生成绩超过150时会要求重新输入学生成绩
完成输入后按照功能表依次实现功能
这是后面用VScode运行的结果