[问题描述]
学生信息管理系统
[基本要求]
设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:
1.试选择一种方式存储:基于数组、链表或文件方式
2.总成绩要求自动计算;
3.查询:分别给定学生学号、姓名,能够查找到学生的基本信息(要求至少用两种查找算法实现);
排序:分别按学生的学号、总成绩进行排序(要求至少用两种排序算法实现)。
#include<cstdio>
#include<iostream>
#define OVERFLOW -2
#include<cstring>
using namespace std;
const int MaxSize=20;
typedef struct {
//char num[20];
double num;
char name[20];
char sex[10];
double score[5];
double tolscore; //自动计算
}Student;
//存储学生信息的顺序表的定义:
typedef struct{
Student stu[MaxSize];
int length;
}SequenList;
SequenList L;
/**初始化一个空表*/
void InitList(){
if(!L.stu) exit(OVERFLOW);
L.length=0;//空表长度为0
}
/**交换两个学生的信息*/
void Swap(int i,int j){
double num;
char name[20];
char sex[10];
double score[5];
double tolscore;
//交换学号,姓名,性别,成绩,总成绩
strcpy(name,L.stu[i].name);strcpy(L.stu[i].name,L.stu[j].name);strcpy(L.stu[j].name,name);
strcpy(sex,L.stu[i].sex);strcpy(L.stu[i].sex,L.stu[j].sex);strcpy(L.stu[j].sex,sex);
num=L.stu[i].num;L.stu[i].num=L.stu[j].num;L.stu[j].num=num;
score[0]=L.stu[i].score[0];L.stu[i].score[0]=L.stu[j].score[0];L.stu[j].score[0]=score[0];
score[1]=L.stu[i].score[1];L.stu[i].score[1]=L.stu[j].score[1];L.stu[j].score[1]=score[1];
tolscore=L.stu[i].tolscore;L.stu[i].tolscore=L.stu[j].tolscore;L.stu[j].tolscore=tolscore;
}
/**打印学生信息*/
void PrintStuMes(){
printf(\"--------------------------------------------------------------------------------------\\n\");
printf(\"学号\\t\\t 姓名\\t\\t性别\\t 英语\\t C语言\\t 总成绩\\n\");
for(int i=1;i<=L.length;i++){
printf(\"%.0lf\\t %s\\t %s\\t %.2lf %.2lf\\t %.2lf\\n\",L.stu[i].num,
L.stu[i].name,L.stu[i].sex,L.stu[i].score[0],L.stu[i].score[1],L.stu[i].tolscore);
}
printf(\"--------------------------------------------------------------------------------------\\n\");
}
/**从文件中读取学生信息并输出*/
void ReadStuMes(){
//char num[20];
double num;
char name[10];
char sex[5];
double score[2];
FILE *fp;
if((fp=fopen(\"C:\\\\Users\\\\xiaowei\\\\Desktop\\\\in1.txt\",\"r\"))==NULL){
printf(\"文件读取发生错误,无法进行读入!\");
exit(0);
}
while(!feof(fp)){
fscanf(fp,\"%lf%s%s%lf%lf\",&num,name,sex,&score[0],&score[1]);
L.length++;//0号单元不使用
//strcpy(L.stu[L.length].num,num);
L.stu[L.length].num=num;
strcpy(L.stu[L.length].name,name);strcpy(L.stu[L.length].sex,sex);
L.stu[L.length].score[0]=score[0],L.stu[L.length].score[1]=score[1];
L.stu[L.length].tolscore=L.stu[L.length].score[0]+L.stu[L.length].score[1];
if(L.length==MaxSize)
break;
}
printf(\"从数据文件中读取的学生信息为:\\n\");
PrintStuMes();
printf(\">>任意键进入主界面\");
system(\"pause\");
system(\"cls\");
}
/**按照学号排序(冒泡排序)*/
void BubbleSort(){
for(int i=1;i<=L.length-1;i++){
for(int j=1;j<=L.length-i;j++)
if(L.stu[j].num>L.stu[j+1].num)
Swap(j,j+1);
}
}
/**按照学生学号查找某位同学的基本信息(先排序在二分)*/
void BinarySearch(){
BubbleSort();
printf(\"请输入您要查找的学生的学号:\");
double num;
scanf(\"%lf\",&num);
int index=-1;
int left=1,right=L.length;
while(left<=right){
int mid=left+(right-left)/2;
if(L.stu[mid].num==num){
index=mid;
break;
}
else if(num<L.stu[mid].num)
right=mid-1;
else
left=mid+1;
}
if(index==-1){
printf(\"您查找的学生不存在,请重新输入!\\n\");
BinarySearch();
}
else{
printf(\"---------------------------------------------------------------------------------------------------------\\n\");
printf(\"学号:%.0lf\\t姓名:%s\\t性别:%s\\t\\t英语:%.2lf\\tC语言:%.2lf\\t总成绩:%.2lf\\n\",
L.stu[index].num,L.stu[index].name,L.stu[index].sex,L.stu[index].score[0],
L.stu[index].score[1],L.stu[index].tolscore);
printf(\"---------------------------------------------------------------------------------------------------------\\n\");
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
}
}
/**按照学生姓名查询学生的基本信息(顺序查找)*/
void Search_seq(){
printf(\"请输入您要查询的学生的姓名:\");
char name[20];
scanf(\"%s\",name);
int index=-1;
for(int i=1;i<=L.length;i++){
if(strcmp(name,L.stu[i].name)==0)
index=i;
}
if(index==-1){
printf(\"您查找的学生不存在,请重新输入!\\n\");
Search_seq();
}
else{
printf(\"---------------------------------------------------------------------------------------------------------\\n\");
printf(\"学号:%.0lf\\t姓名:%s\\t性别:%s\\t\\t英语:%.2lf\\tC语言:%.2lf\\t总成绩:%.2lf\\n\",
L.stu[index].num,L.stu[index].name,L.stu[index].sex,L.stu[index].score[0],
L.stu[index].score[1],L.stu[index].tolscore);
printf(\"---------------------------------------------------------------------------------------------------------\\n\");
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
}
}
/**进行一次排序,返回枢轴位置*/
int Partition(int left,int right){//对顺序表进行一次排序,返回枢轴位置
L.stu[0]=L.stu[left];//将枢轴信息放在0号位置
int pivotkey=L.stu[left].tolscore;//记录枢轴的总成绩
while(left<right){
while(left<right&&L.stu[right].tolscore>=pivotkey) right--;//右移,直到小于枢轴的销售量
L.stu[left]=L.stu[right];//覆盖
while(left<right&&L.stu[left].tolscore<=pivotkey) left++;//左移,直到大于枢轴的销售量
L.stu[right]=L.stu[left];//覆盖
}
L.stu[left]=L.stu[0];
return left;
}
/**对顺序表进行排序*/
void QSort(int left,int right){
if(left<right){//长度大于1
int pivotloc=Partition(left,right);//记录返回的枢轴的位置
QSort(left,pivotloc-1); //左子表排序
QSort(pivotloc+1,right);//右子表排序
}
}
/**按照总成绩排序(快速排序)*/
void QuickSort(){//对L进行快速排序
QSort(1,L.length);
printf(\"按照总成绩排序(快速排序)后的结果为:\\n\");
PrintStuMes();
printf(\">>Enter键返回主界面\");
system(\"pause\");
system(\"cls\");
}
/**主界面*/
void Menu(){
printf(\"-----------------欢迎进入学生管理系统-----------------\\n\");
printf(\"1.打印全部学生的基本信息\\n\");
printf(\"2.按照学生学号查询学生的基本信息(折半查找)\\n\");
printf(\"3.按照学生姓名查询学生的基本信息(顺序查找)\\n\");
printf(\"4.按照学生学号排序(冒泡排序)\\n\");
printf(\"5.按照学生总成绩排序(快速排序)\\n\");
printf(\"6.退出\\n\");
printf(\"------------------------------------------------------\\n\");
printf(\">>请输入您的选择:\");
int chose;
scanf(\"%d\",&chose);
switch(chose){
case 1:{
PrintStuMes();
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
Menu();
}
case 2: {
BinarySearch();
Menu();
}
case 3: {
Search_seq();
Menu();
}
case 4: {
BubbleSort();
printf(\"按照学生学号排序(冒泡排序)后的学生信息为:\\n\");
PrintStuMes();
printf(\">>Enter键返回主界面\");
system(\"pause\");
system(\"cls\");
Menu();
}
case 5: {
QuickSort();
Menu();
}
case 6: {
printf(\"您输入的信息有误,请重新输入!\");
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
Menu();
}
}
}
int main(){
InitList();
ReadStuMes(); //从文件读入学生信息
Menu();
return 0;
}
继续阅读与本文标签相同的文章
-
微信小程序兼容性问题。
2026-05-18栏目: 教程
-
flex的兼容性处理问题
2026-05-18栏目: 教程
-
Mac高效开发之iTerm2、Prezto和Solarized主题
2026-05-18栏目: 教程
-
将阿里云产品整合成为高校课程实训的训练营产品的实践(四)
2026-05-18栏目: 教程
-
中间人攻击,HTTPS也可以被碾压
2026-05-18栏目: 教程
