需求:
要求实现一个基于指针的学生成绩管理系统,具体功能如下:
代码:
/*************************************************************************
> File Name: soresMG2.c
> Author: 小刘
> Description:
> Created Time: 2025年05月26日 星期一 13时45分38秒
************************************************************************/
#include
#include
#include
#define MAX_STUDENT 50 // 最大学生数量
#define COURSE_NUM 3 // 课程科目数量
#define ID_LENGTH 4
/** 函数原型声明 **/
// 添加学生信息
void addStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int *count);
//显示所有记录
void displayAll(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
// 显示统计信息
void showStatistics(int (*scores)[COURSE_NUM],int count);
// 成绩排序
void sorseSorting(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
// 学生查找
void searchStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
// 学号校验 1- 校验合格 0-校验不合格
int validate(char *id);
int main(int argc,char *argv[])
{
int choice;
int studentCount = 0;
char studentIds[MAX_STUDENT][ID_LENGTH];
int scores[MAX_STUDENT][COURSE_NUM];
do
{
// 系统菜单界面
printf("\033[1;32m+-----------------------+\033[0m\n"); // 绿色边框
printf("\033[1;32m| \033[1;33m学生成绩管理系统 v2.0\033[1;32m |\033[0m\n");
printf("\033[1;32m| \033[1;33m作者:小刘\033[1;32m |\033[0m\n");
printf("\033[1;32m+-----------------------+\033[0m\n");
printf("\033[31m1. 添加学生信息\033[0m\n");
printf("\033[31m2. 显示所有记录\033[0m\n");
printf("\033[31m3. 查看统计信息\033[0m\n");
printf("\033[31m4. 成绩排序\033[0m\n");
printf("\033[31m5. 查找学生\033[0m\n");
printf("\033[31m6. 退出系统\033[0m\n");
printf("\n请输入您的选择: ");
scanf("%d",&choice);
switch(choice)
{
case 1://
addStudent(scores,studentIds,&studentCount);
break;
case 2:
displayAll(scores,studentIds,studentCount);
break;
case 3:
showStatistics(scores,studentCount);
break;
case 4:
sorseSorting(scores,studentIds,studentCount);
break;
case 5:
searchStudent(scores,studentIds,studentCount);
break;
case 6:
printf("系统已退出,感谢使用!\n");
break;
default:
printf("无效输入,请重新选择!\n");
}
}while(choice != 6);
return 0;
}
// 查找学生
void searchStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
{
if(count == 0)
{
printf("暂无学生数据!\n");
return;
}
char targetID[ID_LENGTH + 1];
printf("\n请输入要查找的学号:\n");
scanf("%4s",targetID);
while(getchar() != '\n');
for (int i = 0;i < count; i++)
{
if(memcmp(ids[i],targetID,ID_LENGTH) == 0)
{
printf("找到学生记录:\n");
printf("学号:%.4s\n",ids[i]);
printf("成绩:China=%d Math=%d English=%d\n",scores[i][0],scores[i][1],scores[i][2]);
return;
}
}
printf("未找到该学号的学生记录!\n");
}
// 成绩排序
void sorseSorting(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
{
if(count == 0)
{
printf("暂无学生数据!\n");
return;
}
printf("%s\t%s\t%s\t\n","China","Math","English");
for(int i = 0;i < COURSE_NUM ;i++)
{
for(int j = 0; j < count;j++)
{
for(int k = 0;k < count -j-1;k++)
{
if(scores[k][i] < scores[k+1][i])
{
int score = scores[k][i];
scores[k][i] = scores[k+1][i];
scores[k+1][i] = score;
}
}
}
}
for(int i = 0;i < count ;i++)
{
for(int j = 0; j < COURSE_NUM;j++)
{
printf("%d\t",scores[i][j]);
}
printf("\n");
}
printf("\n");
}
// 查看统计信息
void showStatistics(int (*scores)[COURSE_NUM],int count)
{
if(count == 0)
{
printf("暂无学生数据!\n");
return;
}
int courseTota[COURSE_NUM] = {0};
int max[COURSE_NUM] = {0};
int min[COURSE_NUM] = {100,100,100};
for(int i = 0;i < count; i++)
{
for(int j = 0;j < COURSE_NUM;j++)
{
int score = scores[i][j];
courseTota[j] += score;
if(score > max[j])max[j] = score;
if(score < min[j])min[j] = score;
}
}
printf("\n---- 课程统计信息 ----\n");
char *courses[] = {"China","Math","English"};
for(int i = 0;i < COURSE_NUM;i++)
{
printf("%s:\n",courses[i]);
printf(" 平均分:%.2f\n",(float)courseTota[i] / count);
printf(" 最高分:%d\n",max[i]);
printf(" 最低分:%d\n",min[i]);
}
}
// 显示所有记录
void displayAll(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
{
printf("\n----- 学生成绩列表 ----\n");
if(count == 0)
{
printf("暂无学生数据!\n");
return;
}
printf("%s\t%s\t%s\t%s\t\n","学号","Chaina","Math","English");
for(int i =0;i < count ; i++)
{
printf("%.4s\t",ids[i]);
for(int j = 0;j < COURSE_NUM ;j++)
{
printf("%d\t",*(*(scores + i) + j));
}
printf("\n");
}
printf("\n");
}
/**
* 添加学生信息
*/
void addStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int *count)
{
// 校验存储空间是否已满
if(*count >= MAX_STUDENT)
{
printf("错误信息:存储空间已满!\n");
return;
}
printf("\n----- 请添加学生信息 -----\n");
//创建一个数组,用来存放学生学号
char tempId[ID_LENGTH + 1];
do
{
printf("请输入4位学号:");
scanf("%4s",tempId);
while(getchar() != '\n');
}while(!validate(tempId));
// 检查序号是否已存在
register int i;
for(i = 0;i < *count; i++)
{
//使用
if (memcmp(ids[i],tempId,ID_LENGTH) == 0)
{
printf("错误信息:该学号已存在!\n");
return ;
}
}
memcpy(ids[*count],tempId,ID_LENGTH);
// 输入成绩
printf("请输入%d门课程成绩(0~100):\n",COURSE_NUM);
for (i = 0; i < COURSE_NUM;)
{
printf("课程%d:",i+1);
int tempScore = scanf("%d",&scores[*count][i]);
if(tempScore != 1)
{
printf("错误信息:成绩无效,请重新输入!\n");
while(getchar() != '\n');
continue;
}
if(scores[*count][i] < 0 || scores[*count][i] >100)
{
printf("错误信息:成绩无效,请重新输入!\n");
continue;
}
i++;
}
(*count)++;
printf("学生信息添加成功!\n");
}
// 校验信息
int validate(char *id)
{
char *p = id;
int len = 0;
while(*p && len < ID_LENGTH)
{
if(!(*p >= '0' && *p <= '9'))
{
printf("学号必须为数字!\n");
return 0;
}
p++;
len++;
}
// 校验输入的长度
if(len != ID_LENGTH || *p != '\0')
{
printf("学号必须为4位!");
return 0;
}
return 1;
}