前言
相信很多同学在大一期末或者实践周中都会有程序大作业,那么我们就来看看C语言大作业——学生信息管理系统,这个学生信息管理系统是本人在大一实践周独自完成,整个系统都是用大一所学的课本知识所编写绝不超纲!!!
此学生系统是在Dev-C++中创建一个项目所实现的,项目内分为了四个单元,分别是System.h System.c Menu.c Text.c
接下来我会把整个系统分为以上四个单元为四个部分展示!!!小弟不才,远远不如各位代码前辈,自己写的程序有很多不足,甚至可能会有bug,欢迎大家提出建议,我定尽全力改进,希望和同学们共同学习共同进步!!!同学们觉得有用可以随意拷贝转发和收藏!!!感谢大家!!!
系统功能和框架:
功能 :
能够实现管理学生的学号、姓名、年级、专业、绩点等重要信息并且能对此类信息进行录入、打印、删除、查找、修改等操作,当对学生的信息录入、删除、修改或者对系统格式化的时候需要输入管理员密码。整个系统代码中我们使用了一些刷新操作,能使代码运行的时候更加美观。
框架:
1.录入学生信息
1.1尾部单词录入 1.2尾部多次录入 1.0返回上一级
2.打印学生信息
1.1打印所有学生信息 1.2查找某个学生信息 1.3按照年级分类打印 1.4按照专业分类打印 1.5按照绩点排序打印 1.6按照学号排序打印 1.0返回上一级
3.删除学生信息 (输入学生学号即可删除此学生信息)
4.修改学生信息
4.1修改姓名 4.2修改学号 4.3修改年级 4.4修改专业 4.5修改绩点 4.0返回上一级
5.管理员设置
5.1修改密码 5.2初始化密码 5.0返回上一级
0.退出系统
-1.格式化(将系统中的所有信息全部格式化清除)
系统代码展示:
第一部分System.h:
System.h单元主要用于编写头文件和定义顺序表节点以及学生信息节点(使用我们所学知识结构体和动态顺序表储存结构)
#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
//定义学生信息节点
typedef struct Student
{
int id;//学号
char name[50];//姓名
int year;//年级
char career[50];//专业
double score;//绩点
}STU;
//定义顺序表节点
typedef struct SeqList
{
STU *a;
int size;//顺序表中存储的数据个数
int capacity;//顺序表存储的空间大小
}SL;
第二部分System.c:
主要用于编写对学生信息操作的函数(顺序表中的尾插初始化等操作)
1.顺序表的初始化:
void SeqListInit(SL *ps)
{
ps->a=NULL;
ps->size=ps->capacity=0;
}
2.检查顺序表的空间适当对其增容:
void SeqListCheckCapacity(SL *ps)
{
if(ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
//capacity是否等于0是的话就赋值4不是的话就乘2扩大两倍容量
STU *tmp=(STU*)realloc(ps->a, newcapacity*sizeof(STU));
// realloc给ps->a申请空间(单位是字节所以要乘以sizeof)
if(tmp==NULL)//if检查空间是否申请成功
{
printf("realloc fail\n");
exit(-1);//终止程序函数
}
ps->a=tmp;
ps->capacity=newcapacity;
}
}
3.销毁空间防止野指针:
//销毁空间防止野指针
void SeqListDestory(SL *ps)
{
free(ps->a);
ps->a=NULL;
ps->size=ps->capacity=0;
}
4.顺序表中的信息打印:
只是打印单个顺序表结点的信息。
void SeqListPrintf(SL *ps)
{
// 显示学生信息
int i;
printf("以下是所有的学生信息\n");
printf("\n");
for (i = 0; i < ps->size; i++)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
}
}
5.对顺序表的尾部进行单次插入:
void SeqListPushBack(SL *ps)
{
//检查是否有足够的空间 并增容
SeqListCheckCapacity(ps);
int i;
//赋值
printf("录入学生的姓名: ");
//gets(ps->a[ps->size].name);
scanf("%s",ps->a[ps->size].name);
printf("录入学生的学号: ");
scanf("%d", &ps->a[ps->size].id);
//检查学生学号是否重复
for (i = 0; i < ps->size; i++)
{
while(ps->a[i].id==ps->a[ps->size].id)
{
printf("学号有所重复,请重新输入\n");
ps->a[ps->size].id=0;
scanf("%d", &ps->a[ps->size].id);
}
}
printf("录入学生所在年级:");
scanf("%d",&ps->a[ps->size].year);
printf("录入学生的专业:");
//gets(ps->a[ps->size].career);
scanf("%s",ps->a[ps->size].career);
printf("录入学生的绩点: ");
scanf("%lf", &ps->a[ps->size].score);
ps->size++;
printf("录入成功...\n");
printf("\n");
}
6.对顺序表尾部进行单词删除:
void SeqListPopBack(SL *ps)
{
if(ps->size>0)
{
ps->size--;
}
else
{
printf("无数据不能进行删除操作");
}
}
7.对顺序表中的信息进行查找返回下标:
这里的查找主要查找学号,并且返回我们查找的同学所在顺序表位置中的下标并返回,找到他的位置之后方便后面对其操作。
int SeqListFind(SL *ps,int x)
{
int i;
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==x)
return i;
}
return -1;
}
8.在顺序表中指定位置(pos)删除数据:
此操作可以结合上一个操作联合使用,这样就可以对学生信息进行定点删除
void SeqListErase(SL *ps,int pos)
{
assert(pos>=0&&pos<ps->size);
int begain=pos+1;
while(begain<ps->size)
{
ps->a[begain-1]=ps->a[begain];
begain++;
}
ps->size--;
printf("删除成功...");
}
(接下来的函数基本上是对学生信息进行大类操作)
9.根据学生姓名和学号查找学生信息:
//根据学号查找学生信息
void ForStudentbyID(SL *ps)
{
int i,n,x,sum=0;
printf("请输入你要查找的学生学号:\n");
scanf("%d",&n);
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==n)
{
x=SeqListFind(ps,n);
printf("学生 %s 的信息如下:\n",ps->a[x].name);
printf("学号: %d\n", ps->a[x].id);
printf("年级: %d\n", ps->a[x].year);
printf("专业: %s\n", ps->a[x].career);
printf("绩点: %.2lf\n", ps->a[x].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("无此学号,查找失败...返回上一级操作\n");
}
}
//根据学生姓名查找信息
void ForStudentbyName(SL *ps)
{
int i,x,sum=0;
char Name[50];
printf("请输入你要查找的学生姓名:\n");
scanf("%s",Name);
for(i=0;i<ps->size;i++)
{
if(strcmp(Name,ps->a[i].name)==0)
{
x=SeqListFind(ps,ps->a[i].id);
printf("学生 %s 的信息如下:\n",ps->a[x].name);
printf("学号: %d\n", ps->a[x].id);
printf("年级: %d\n", ps->a[x].year);
printf("专业: %s\n", ps->a[x].career);
printf("绩点: %.2lf\n", ps->a[x].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("无此学生,查找失败...返回上一级操作\n");
}
}
10.查找并打印同一专业的学生信息:
此函数可以将同一专业的同学进行筛选,同时做一个sum累加器,如果需要可以将sum输出就能知道我们要查找的这个专业的学生总人数,但在我的这个程序里未来节省时间我并未输出同一专业的总人数。
void SeqListSameCareer(SL *ps)
{
int i,sum=0;
char temp[50];
printf("请输入你要分类的专业\n");
scanf("%s",temp);
printf("\n");
for (i = 0; i < ps->size; i++)
{
if(strcmp(ps->a[i].career,temp)==0)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("没有此专业学生\n");
}
}
11.查找并打印同一年级的学生信息:
这个函数的写法与上一个查找同一专业的学生信息类似,可以直接套用
void SeqListSameYear(SL *ps)
{
int i,year1,sum=0;
printf("请输入你要分类的年级\n");
scanf("%d",&year1);
for (i = 0; i < ps->size; i++)
{
if(ps->a[i].year==year1)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("没有此年级学生\n");
}
}
12.根据学生成绩和学号对学生信息进行排序:
我用了我们所学的最简单的冒泡排序对学生信息进行排序,(因为两个函数类似我就将他们放在一起展示吧!)
//根据绩点来由高到低排序信息
void SeqListRank(SL *ps)
{
int i,j;
STU temp;
for (i = 0; i < ps->size-1 ; i++)
{
for(j=0;j<ps->size-i-1;j++)
{
if(ps->a[j].score<ps->a[j+1].score)
{
temp=ps->a[j];
ps->a[j]=ps->a[j+1];
ps->a[j+1]=temp;
}
}
}
}
//根据学号排序打印学生信息
void SeqListrank(SL *ps)
{
int i,j;
STU temp;
for (i = 0; i < ps->size-1 ; i++)
{
for(j=0;j<ps->size-i-1;j++)
{
if(ps->a[j].id>ps->a[j+1].id)
{
temp=ps->a[j];
ps->a[j]=ps->a[j+1];
ps->a[j+1]=temp;
}
}
}
}
13.修改学生信息:
这里我把对学生的信息修改和输出都写在了一个函数里,因为当时这个是后面加进去的所以就写的比较大块。
void SeqListCorrect(SL *ps)
{
int input=1,x,n,i;
system("cls");
while(input!=0)
{
Menu4();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input);
int sum=1;
if(input==1||input==2||input==3||input==4||input==5)
{
printf("****** 请输入你想要修改学生的学号 ******\n");
scanf("%d",&x);
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==x)
{
sum++;
}
}
if(sum==1)
{
system("cls");
printf("无此学生...操作失败自动返回\n");
input=-2;
system("pause");
}
n=SeqListFind(ps,x);
}
switch(input)
{
case 1:
printf("请输入%s新的姓名:\n",ps->a[n].name);
scanf("%s",ps->a[n].name);
printf("修改姓名成功\n");
system("pause");
break;
case 2:
printf("请输入&s新的学号:\n",ps->a[n].name);
scanf("%d",&ps->a[n].id);
printf("修改学号成功\n");
system("pause");
break;
case 3:
printf("请输入%s新的年级:\n",ps->a[n].name);
scanf("%d",&ps->a[n].year);
printf("修改年级成功\n");
system("pause");
break;
case 4:
printf("请输入%s新的专业:\n",ps->a[n].name);
scanf("%s",ps->a[n].career);
printf("修改专业成功\n");
system("pause");
break;
case 5:
printf("请输入%s新的绩点:\n",ps->a[n].name);
scanf("%lf",&ps->a[n].score);
printf("修改绩点成功\n");
system("pause");
break;
case -2:
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
system("cls");
}
}
14.信息持久化,将学生信息保存在电脑文件中:
此操作可以让我们的学生信息以及管理员密码等数据保存在我们的文件夹中,下一次运行程序时系统会自动读入数据,以实现信息的持久化。
void SaveStudent(SL *ps)
{
int i;
FILE *file=fopen("./stu.info","w");
if(file==NULL)
{
printf("打开student文件失败\n");
return;
}
SeqListCheckCapacity(ps);
for(i=0;i<ps->size;i++)
{
SeqListCheckCapacity(ps);
if(fwrite(&ps->a[i],sizeof(STU),1,file)!=1)
{
printf("保存%s出现错误\n",ps->a[i].name);
return;
}
}
fclose(file);
}
void LoadStudent(SL *ps)
{
int i;
FILE* file=fopen("./stu.info","r");
if(!file)
{
printf("!!!此系统无学生数据!!!\n");
return;
}
SeqListCheckCapacity(ps);
while(fread(&ps->a[ps->size],sizeof(STU),1,file)==1)
{
ps->size++;
SeqListCheckCapacity(ps);
}
fclose(file);
printf("(学生信息读取成功)... \n");
}
//管理员密码的保存
void SavePassword(char *password)
{
FILE *file1=fopen("./password.txt","w");
if(file1==NULL)
{
printf("打开password文件失败\n");
return;
}
fprintf(file1,"password=%s",password);
fclose(file1);
}
void LoadPassword(char *password)
{
FILE* file1=fopen("./password.txt","r");
if(!file1)
{
printf("----------- (初始化密码1-9) -----------\n");
return;
}
fscanf(file1,"password=%s",password);
fclose(file1);
printf("(管理员密码读取成功)...\n");
}
15.整个部分的代码展示:
#include "System.h"
//顺序表的初始化
void SeqListInit(SL *ps)
{
ps->a=NULL;
ps->size=ps->capacity=0;
}
//检查增容操作
void SeqListCheckCapacity(SL *ps)
{
if(ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
//capacity是否等于0是的话就赋值4不是的话就乘2扩大两倍容量
STU *tmp=(STU*)realloc(ps->a, newcapacity*sizeof(STU));
// realloc给ps->a申请空间(单位是字节所以要乘以sizeof)
if(tmp==NULL)//if检查空间是否申请成功
{
printf("realloc fail\n");
exit(-1);//终止程序函数
}
ps->a=tmp;
ps->capacity=newcapacity;
}
}
//销毁空间防止野指针
void SeqListDestory(SL *ps)
{
free(ps->a);
ps->a=NULL;
ps->size=ps->capacity=0;
}
//顺序表的打印
void SeqListPrintf(SL *ps)
{
// 显示学生信息
int i;
printf("以下是所有的学生信息\n");
printf("\n");
for (i = 0; i < ps->size; i++)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
}
}
//顺序表的尾插
void SeqListPushBack(SL *ps)
{
//检查是否有足够的空间 并增容
SeqListCheckCapacity(ps);
int i;
//赋值
printf("录入学生的姓名: ");
//gets(ps->a[ps->size].name);
scanf("%s",ps->a[ps->size].name);
printf("录入学生的学号: ");
scanf("%d", &ps->a[ps->size].id);
//检查学生学号是否重复
for (i = 0; i < ps->size; i++)
{
while(ps->a[i].id==ps->a[ps->size].id)
{
printf("学号有所重复,请重新输入\n");
ps->a[ps->size].id=0;
scanf("%d", &ps->a[ps->size].id);
}
}
printf("录入学生所在年级:");
scanf("%d",&ps->a[ps->size].year);
printf("录入学生的专业:");
//gets(ps->a[ps->size].career);
scanf("%s",ps->a[ps->size].career);
printf("录入学生的绩点: ");
scanf("%lf", &ps->a[ps->size].score);
ps->size++;
printf("录入成功...\n");
printf("\n");
}
//尾删
void SeqListPopBack(SL *ps)
{
if(ps->size>0)
{
ps->size--;
}
else
{
printf("无数据不能进行删除操作");
}
}
//在顺序表中查找目标学号
int SeqListFind(SL *ps,int x)
{
int i;
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==x)
return i;
}
return -1;
}
//在顺序表中指定位置(pos)删除数据
void SeqListErase(SL *ps,int pos)
{
assert(pos>=0&&pos<ps->size);
int begain=pos+1;
while(begain<ps->size)
{
ps->a[begain-1]=ps->a[begain];
begain++;
}
ps->size--;
printf("删除成功...");
}
//查找相同专业或者相同年级的所有同学相关信息
void SeqListSameCareer(SL *ps)
{
int i,sum=0;
char temp[50];
printf("请输入你要分类的专业\n");
scanf("%s",temp);
printf("\n");
for (i = 0; i < ps->size; i++)
{
if(strcmp(ps->a[i].career,temp)==0)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("没有此专业学生\n");
}
}
void SeqListSameYear(SL *ps)
{
int i,year1,sum=0;
printf("请输入你要分类的年级\n");
scanf("%d",&year1);
for (i = 0; i < ps->size; i++)
{
if(ps->a[i].year==year1)
{
printf("学生 %s 的信息如下:\n", ps->a[i].name);
printf("学号: %d\n", ps->a[i].id);
printf("年级: %d\n", ps->a[i].year);
printf("专业: %s\n", ps->a[i].career);
printf("绩点: %.2lf\n", ps->a[i].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("没有此年级学生\n");
}
}
//根据绩点来由高到低排序信息
void SeqListRank(SL *ps)
{
int i,j;
STU temp;
for (i = 0; i < ps->size-1 ; i++)
{
for(j=0;j<ps->size-i-1;j++)
{
if(ps->a[j].score<ps->a[j+1].score)
{
temp=ps->a[j];
ps->a[j]=ps->a[j+1];
ps->a[j+1]=temp;
}
}
}
}
//根据学号排序打印学生信息
void SeqListrank(SL *ps)
{
int i,j;
STU temp;
for (i = 0; i < ps->size-1 ; i++)
{
for(j=0;j<ps->size-i-1;j++)
{
if(ps->a[j].id>ps->a[j+1].id)
{
temp=ps->a[j];
ps->a[j]=ps->a[j+1];
ps->a[j+1]=temp;
}
}
}
}
//修改学生信息
void SeqListCorrect(SL *ps)
{
int input=1,x,n,i;
system("cls");
while(input!=0)
{
Menu4();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input);
int sum=1;
if(input==1||input==2||input==3||input==4||input==5)
{
printf("****** 请输入你想要修改学生的学号 ******\n");
scanf("%d",&x);
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==x)
{
sum++;
}
}
if(sum==1)
{
system("cls");
printf("无此学生...操作失败自动返回\n");
input=-2;
system("pause");
}
n=SeqListFind(ps,x);
}
switch(input)
{
case 1:
printf("请输入%s新的姓名:\n",ps->a[n].name);
scanf("%s",ps->a[n].name);
printf("修改姓名成功\n");
system("pause");
break;
case 2:
printf("请输入&s新的学号:\n",ps->a[n].name);
scanf("%d",&ps->a[n].id);
printf("修改学号成功\n");
system("pause");
break;
case 3:
printf("请输入%s新的年级:\n",ps->a[n].name);
scanf("%d",&ps->a[n].year);
printf("修改年级成功\n");
system("pause");
break;
case 4:
printf("请输入%s新的专业:\n",ps->a[n].name);
scanf("%s",ps->a[n].career);
printf("修改专业成功\n");
system("pause");
break;
case 5:
printf("请输入%s新的绩点:\n",ps->a[n].name);
scanf("%lf",&ps->a[n].score);
printf("修改绩点成功\n");
system("pause");
break;
case -2:
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
system("cls");
}
}
//信息持久化
void SaveStudent(SL *ps)
{
int i;
FILE *file=fopen("./stu.info","w");
if(file==NULL)
{
printf("打开student文件失败\n");
return;
}
SeqListCheckCapacity(ps);
for(i=0;i<ps->size;i++)
{
SeqListCheckCapacity(ps);
if(fwrite(&ps->a[i],sizeof(STU),1,file)!=1)
{
printf("保存%s出现错误\n",ps->a[i].name);
return;
}
}
fclose(file);
}
void LoadStudent(SL *ps)
{
int i;
FILE* file=fopen("./stu.info","r");
if(!file)
{
printf("!!!此系统无学生数据!!!\n");
return;
}
SeqListCheckCapacity(ps);
while(fread(&ps->a[ps->size],sizeof(STU),1,file)==1)
{
ps->size++;
SeqListCheckCapacity(ps);
}
fclose(file);
printf("(学生信息读取成功)... \n");
}
//管理员密码的保存
void SavePassword(char *password)
{
FILE *file1=fopen("./password.txt","w");
if(file1==NULL)
{
printf("打开password文件失败\n");
return;
}
fprintf(file1,"password=%s",password);
fclose(file1);
}
void LoadPassword(char *password)
{
FILE* file1=fopen("./password.txt","r");
if(!file1)
{
printf("----------- (初始化密码1-9) -----------\n");
return;
}
fscanf(file1,"password=%s",password);
fclose(file1);
printf("(管理员密码读取成功)...\n");
}
//根据学号查找学生信息
void ForStudentbyID(SL *ps)
{
int i,n,x,sum=0;
printf("请输入你要查找的学生学号:\n");
scanf("%d",&n);
for(i=0;i<ps->size;i++)
{
if(ps->a[i].id==n)
{
x=SeqListFind(ps,n);
printf("学生 %s 的信息如下:\n",ps->a[x].name);
printf("学号: %d\n", ps->a[x].id);
printf("年级: %d\n", ps->a[x].year);
printf("专业: %s\n", ps->a[x].career);
printf("绩点: %.2lf\n", ps->a[x].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("无此学号,查找失败...返回上一级操作\n");
}
}
//根据学生姓名查找信息
void ForStudentbyName(SL *ps)
{
int i,x,sum=0;
char Name[50];
printf("请输入你要查找的学生姓名:\n");
scanf("%s",Name);
for(i=0;i<ps->size;i++)
{
if(strcmp(Name,ps->a[i].name)==0)
{
x=SeqListFind(ps,ps->a[i].id);
printf("学生 %s 的信息如下:\n",ps->a[x].name);
printf("学号: %d\n", ps->a[x].id);
printf("年级: %d\n", ps->a[x].year);
printf("专业: %s\n", ps->a[x].career);
printf("绩点: %.2lf\n", ps->a[x].score);
printf("\n");
sum++;
}
}
if(sum==0)
{
printf("无此学生,查找失败...返回上一级操作\n");
}
}
第三部分Menu.c:
这个单元主要用于编写系统所要用到的各个菜单,请看代码展示:
#include "System.h"
//菜单
void Menu1()
{
printf("***************************************\n");
printf("--------欢迎使用学生管理系统1.0--------\n");
printf("***************************************\n");
printf("***-------(1.录入学生信息)--------***\n");
printf("***-------(2.打印学生信息)--------***\n");
printf("***-------(3.删除学生信息)--------***\n");
printf("***-------(4.修改学生信息)--------***\n");
printf("***--------(5.管理员设置)---------***\n");
printf("***---------(0.退出系统)----------***\n");
printf("***----------(-1.格式化)----------***\n");
printf("***************************************\n");
}
void Menu2()
{
printf("***************************************\n");
printf("------------ 录入学生信息 -------------\n");
printf("***************************************\n");
printf("***-------(1.尾部单次录入)--------***\n");
printf("***-------(2.尾部多次录入)--------***\n");
printf("***--------(0.返回上一级)---------***\n");
printf("***************************************\n");
}
void Menu4()
{
printf("***************************************\n");
printf("------------ 修改学生信息 -------------\n");
printf("***************************************\n");
printf("***---------(1.修改姓名)----------***\n");
printf("***---------(2.修改学号)----------***\n");
printf("***---------(3.修改年级)----------***\n");
printf("***---------(4.修改专业)----------***\n");
printf("***---------(5.修改绩点)----------***\n");
printf("***--------(0.返回上一级)---------***\n");
printf("***************************************\n");
}
void Menu3()
{
printf("***************************************\n");
printf("------------ 打印学生信息 -------------\n");
printf("***************************************\n");
printf("***-----(1.打印所有学生信息)------***\n");
printf("***-----(2.查找某个学生信息)------***\n");
printf("***-----(3.按照年级分类打印)------***\n");
printf("***-----(4.按照专业分类打印)------***\n");
printf("***-----(5.按照绩点排序打印)------***\n");
printf("***-----(6.按照学号排序打印)------***\n");
printf("***--------(0.返回上一级)---------***\n");
printf("***************************************\n");
}
void Menu5()
{
printf("***************************************\n");
printf("------------- 管理员设置 --------------\n");
printf("***************************************\n");
printf("***---------(1.修改密码)----------***\n");
printf("***--------(2.初始化密码)---------***\n");
printf("***--------(0.返回上一级)---------***\n");
printf("***************************************\n");
}
void Menu6()
{
printf("***************************************\n");
printf("***-----(1.根据学生学号查找)------***\n");
printf("***-----(2.根据学生姓名查找)------***\n");
printf("***--------(0.返回上一级)---------***\n");
printf("***************************************\n");
}
第四部分Text.c:
这个部分就将前几个部分所写的操作和菜单结合起来形成最后完整的系统,我使用的时swich和while循环对系统进行数字选择操作。(void text这类比较乱的函数主要用于前期对系统编写操作的时候进行测试有没有错误和bug)大家可以直接看StudentSystem函数!!那里才是正题!!!
整个部分的代码展示:
#include "System.h"
void text()
{
SL s1;
//顺序表的初始化
SeqListInit(&s1);
int i,n,id;
printf("请输入要录入几个学生的信息\n");
scanf("%d",&n);
//尾插信息
for(i=0;i<n;i++)
{
SeqListPushBack(&s1);
}
//打印信息
SeqListPrintf(&s1);
//查找删除操作
//printf("输入你想删除的学生的学号\n");
//scanf("%d",&id);
//printf("\n");
//SeqListErase(&s1,SeqListFind(&s1,id));
//printf("删除之后的所有学生信息\n");
//printf("\n");
//SeqListPrintf(&s1);
//根据专业来分类 并输出
//SeqListSameCareer(&s1);
SeqListSameYear(&s1);
//排序操作
//printf("根据绩点排序之后的学生信息");
//SeqListRank(&s1);
//SeqListPrintf(&s1);
}
void StudentSystem()
{
system("color F0");
SL s1;
int x,i,k,n,num;
char password[50]={'1','2','3','4','5','6','7','8','9'};
char password1[50];
int input=1,input1=1,input2=1,input3=1;
SeqListInit(&s1);
LoadStudent(&s1);
LoadPassword(&password);
while(input!=0)
{
Menu1();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input);
if(input==1||input==3||input==4||input==-1||input==5)
{
system("cls");
printf("---------*** ----登录---- ***----------\n");
printf("---------- 请输入管理员密码 -----------\n");
printf("---------------------------------------\n");
scanf("%s",password1);
if(strcmp(password1,password)!=0)
{
printf("密码错误,登录失败...返回\n");
system("pause");
input=-2;
}
}
switch(input)
{
case -2:
break;
case 1:
while(input1!=0)
{
system("cls");
Menu2();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input1);
switch(input1)
{
case 1:
system("cls");
SeqListPushBack(&s1);
break;
case 2:
system("cls");
printf("请输入要录入几个学生的信息\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("录入第%d个学生...\n",i+1);
SeqListPushBack(&s1);
}
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
break;
}
SaveStudent(&s1);
system("pause");
}
break;
case 2:
system("cls");
int input1=1;
if(s1.size==0||s1.a==NULL)
{
printf("系统中无学生信息,自动返回上一级\n");
input1=0;
}
while(input1!=0)
{
Menu3();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input1);
switch(input1)
{
case 1:
system("cls");
SeqListPrintf(&s1);
system("pause");
break;
case 2:
while(input3!=0)
{
system("cls");
Menu6();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input3);
switch(input3)
{
case 1:
system("cls");
ForStudentbyID(&s1);
system("pause");
break;
case 2:
system("cls");
ForStudentbyName(&s1);
system("pause");
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
}
break;
case 3:
system("cls");
SeqListSameYear(&s1);
system("pause");
break;
case 4:
system("cls");
SeqListSameCareer(&s1);
system("pause");
break;
case 5:
system("cls");
SeqListRank(&s1);
SeqListPrintf(&s1);
SaveStudent(&s1);
system("pause");
break;
case 6:
system("cls");
SeqListrank(&s1);
SeqListPrintf(&s1);
SaveStudent(&s1);
system("pause");
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
system("cls");
}
system("pause");
break;
case 3:
system("cls");
if(s1.size==0||s1.a==NULL)
{
system("cls");
printf("系统中无学生信息,自动返回上一级\n");
}
else
{
printf("---0返回---请输入你想要删除的学生信息的学号:\n");
scanf("%d",&x);
while(x!=0)
{
num=SeqListFind(&s1,x);
if(num!=-1)
{
SeqListErase(&s1,num);
SaveStudent(&s1);
break;
}
else
{
system("cls");
printf("删除失败无此学生,自动返回上一级\n");
break;
}
}
}
system("pause");
break;
case 4:
system("cls");
if(s1.size==0||s1.a==NULL)
{
system("cls");
printf("系统中无学生信息,自动返回上一级\n");
input1=0;
}
else
{
SeqListCorrect(&s1);
SaveStudent(&s1);
}
system("pause");
break;
case 5:
while(input2!=0)
{
system("cls");
Menu5();
printf("--------- 请输入选择你的操作 ----------\n");
scanf("%d",&input2);
switch(input2)
{
case 1:
system("cls");
printf("请输入你的新密码\n");
scanf("%s",password);
SavePassword(password);
printf("密码修改成功...\n");
system("pause");
break;
case 2:
system("cls");
remove("password.txt");
printf("密码初始化成功...pasword=1-9\n");
printf("系统自动关闭,请重启...\n");
input2=input=0;
system("pause");
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
}
break;
case -1:
SeqListDestory(&s1);
SaveStudent(&s1);
printf("格式化成功...\n");
system("pause");
break;
case 0:
break;
default:
system("cls");
printf("无此选项请重新输入\n");
system("pause");
break;
}
system("cls");
}
}
int main()
{
//基础操作测试
//text();
//Menu1();
StudentSystem();
//Menu2();
}
温馨提示:
大家在拷贝这个系统代码的时候一定要建立项目且建立四个单元并将每个单元费别对应四个部分的代码放进去哦,要不然就会出现很多错误!!!
当然建议大家有能力可以再将密码加密成*我当时时间优先未对密码进行加密操作,所以安全性很低,以及对所有学生成绩输出打印的时候也不是很好,大家也可以修改成表格式的可能会更好!
希望大家都能取得进步,预祝大家取得一个好成绩!!!
(头顶有项目源代码压缩包,我所使用的编译器是Dev-C++大家有需要的可以下载使用)