学生信息管理系统
可实现的主要功能:
1.对学生信息的增、删、改
2.查找学生姓名/学号
3.排序学生姓名/学号/成绩
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define MAXNUM 100
struct student{
int num; //学号
char name[20]; //姓名
float price; //成绩
};
struct stuList{
struct student stu[MAXNUM]; //学生信息
int length; //实际学生数 +1
};
struct stuList* L;
void welcome()//欢迎界面
{
printf(" --------------------------------------\n");
printf(" 欢迎来到 \n");
printf(" 《C语言数据结构课程设计》 \n");
printf(" 学生信息管理系统 \n");
printf(" --------------------------------------\n");
printf(" 设计者学院:新工科产业学院 \n");
printf(" 班级:智能193 \n");
printf(" 学号:2019129xxxxx \n");
printf(" 姓名:liuyi ");
printf("\n\t ");system("date/t");
printf("\n");
}
void inputstu(int n){//初始化学生信息
L=(struct stuList*)malloc(sizeof(struct stuList)); //分配存储单元
L->length=9;
L->stu[1].num=201903;strcpy(L->stu[1].name,"张三");L->stu[1].price=89.0;
L->stu[2].num=201904;strcpy(L->stu[2].name,"李四");L->stu[2].price=80.0;
L->stu[3].num=201905;strcpy(L->stu[3].name,"王五");L->stu[3].price=100.0;
L->stu[4].num=201901;strcpy(L->stu[4].name,"小明");L->stu[4].price=79.0;
L->stu[5].num=201908;strcpy(L->stu[5].name,"李华");L->stu[5].price=90.0;
L->stu[6].num=201902;strcpy(L->stu[6].name,"赵六");L->stu[6].price=84.0;
L->stu[7].num=201906;strcpy(L->stu[7].name,"刘嘻");L->stu[7].price=78.0;
L->stu[8].num=201907;strcpy(L->stu[8].name,"陈情");L->stu[8].price=93.0;
int i;
for(i=1;i<=n;i++){
L->length++;
printf(">>>输入第%d个学生学号:",i);
scanf("%d",&(L->stu[i+8].num));
printf(">>>输入第%d个学生姓名:",i);
scanf("%s",&(L->stu[i+8].name));
printf(">>>输入第%d个学生成绩:",i);
scanf("%f",&(L->stu[i+8].price));
printf("\n");
}
printf("--------信息初始化完成,按任意键继续--------");
getch();
system("cls");
}
void outputstu(){//显示学生信息功能函数
int i;
printf("编号 学号\t");printf(" 姓名\t");printf("成绩\t\t");
printf("\n-------------------------------------------------\n");
for(i=1;i<L->length;i++){
printf(" %-5d%-9d\t",i,L->stu[i].num);
printf(" %-10s\t",L->stu[i].name);
printf("%.1f\n",L->stu[i].price);
}
printf("-------------------------------------------------");
printf("\n返回上一级菜单请按任意键!");
getch();
system("cls");
}
void sortNum(int low,int high){//按学号排序(快速排序)
int pos;
if(low<high){
pos=Quicksort(low,high);
sortNum(low,pos-1);// 左部分快速排序
sortNum(pos+1,high);//右部分快速排序
}
return;
}
int insertstu(int i){
int k,xuehao;
if(L->length==MAXNUM) //顺序表满,插入失败
return 0;
if(i<1 || i>L->length)//插入位置不合法,插入失败
return 0;
printf(">>>输入插入学生学号:");
scanf("%d",&xuehao);
sortNum(1,L->length-1);
int find=searchNum(xuehao);
if(find!=-1){
printf("该学生学号已存在!");
printf("\n学号:%d,姓名:%s\n",L->stu[find].num,L->stu[find].name);
return 0;
}
//将数据(i到length-1)后移
for(k=L->length-1;k>=i;k--)
L->stu[k+1]=L->stu[k];
L->stu[i].num=xuehao;
printf(">>>输入插入学生姓名:",i);
scanf("%s",&(L->stu[i].name));
printf(">>>输入插入学生成绩:",i);
scanf("%f",&(L->stu[i].price));
printf("\n");
//修改顺序表长度
L->length++;
return 1;
}
int deletestu(int i){
int k;
if(L->length==1) //顺序表空,删除失败
return 0;
if(i<1 || i>L->length)//删除位置不合法,删除失败
return 0;
//1.将数据(i到length-1)前移
for(k=i;k<=L->length-1;k++)
L->stu[k]=L->stu[k+1];
//2.修改顺序表长度
L->length--;
return 1;
}
void insert_tip(){//插入提示
int i;
printf(">>>输入插入位置:");
scanf("%d",&i);
if(insertstu(i)==1){
printf("插入成功!\n");
}else{
printf("插入失败!\n");
}
}
void delete_tip(){//删除提示
int i;
printf(">>>输入删除位置:");
scanf("%d",&i);
if(deletestu(i)==1){
printf("删除成功!\n");
}else{
printf("删除失败!\n");
}
}
void show(){
int i;
printf("编号 学号\t");printf(" 姓名\t");printf("成绩\t");
printf("\n-------------------------------------------------\n");
for(i=1;i<L->length;i++){
printf(" %-5d%-9d\t",i,L->stu[i].num);
printf(" %-10s\t",L->stu[i].name);
printf("%.1f\n",L->stu[i].price);
}
printf("-------------------------------------------------");
printf("\n学生排序已完成!");
}
void sortName()//按姓名排序(折半排序)
{
int i,j,low,high,mid,num;
float price;
for(i=2;i<L->length;i++){
L->stu[0]=L->stu[i];
for(low=1,high=i-1;low<=high;){
mid=(low+high)/2;
if(strcmp(L->stu[0].name,L->stu[mid].name)<0)
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--){//将low开始的有序记录向后移动一个位置
L->stu[j+1]=L->stu[j];
}
L->stu[high+1]=L->stu[0];
}
}
int Quicksort(int low,int high){//按学号排序(快速排序)
L->stu[0]=L->stu[low];
int x=L->stu[low].num;
while(low<high){
while(low<high&&L->stu[high].num>=x) high--;//从右向左找第一个小于x的数
if(low<high){
L->stu[low]=L->stu[high];
low++;
}
while(low<high&&L->stu[low].num<=x) low++;//从左向右找第一个大于x的数
if(low<high){
L->stu[high]=L->stu[low];
high--;
}
}
L->stu[low]=L->stu[0];
return low;
}
void sortPrice(){//按成绩排序(直接插入排序)
int i,j;
for(i=2;i<L->length;i++){
if(L->stu[i].price<L->stu[i-1].price){
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].price<L->stu[j].price;--j){
L->stu[j+1]=L->stu[j];
}
L->stu[j+1]=L->stu[0];//插入到正确位置
}
}
return;
}
void sortmenu()//排序菜单
{
int num1;
do{
printf("\n\n\n");
printf("\t\t\t☆☆学生信息排序☆☆\n");
printf("\t\t---------------------------------------\n");
printf("\t\t\t 1 按姓名排序 \n");
printf("\t\t\t 2 按学号排序 \n");
printf("\t\t\t 3 按成绩排序 \n");
printf("\t\t\t 4 返回上一级 \n");
printf("\t\t---------------------------------------\n");
printf("\t\t\t请输入菜单选项1-3:");
scanf("%d",&num1);
system("cls");
switch(num1){
case 1:sortName();show();break;//按姓名排序
case 2:sortNum(1,L->length-1);show();break;//按学号排序
case 3:sortPrice();show();break;//按成绩排序
case 4:menu();
default:printf("选项错误!按任意键继续!");
getch();
system("cls");
}
}while(num1);
}
int searchName(int low,int high,char name[]){//按姓名查找(折半查找,递归)
int mid;
if(low<=high){
mid=(low+high)/2;
if(strcmp(L->stu[mid].name,name)==0){
return mid;
}
else if(strcmp(name,L->stu[mid].name)<0){
return searchName(low,mid-1,name);
}
else{
return searchName(mid+1,high,name);
}
}
return -1;
}
void searchName_tip(){
sortName();
char findname[30];
int index;
printf(">>>输入查找的学生姓名:");
scanf("%s",&findname);
index=searchName(1,L->length-1,findname);
if(index==-1){
printf("查找失败,不存在此姓名的学生。");
}
else{
printf("查找成功,此学生的学号为:%d,成绩为:%.2f",L->stu[index].num,L->stu[index].price);
}
}
int searchNum(int num){//按学号查找(折半,非递归)
int left=1,right=L->length-1,mid;
while(left<=right){
mid=(left+right)/2;
if(num==L->stu[mid].num) return mid;
if(num>L->stu[mid].num) left=mid+1;
else right=mid-1;
}
return -1;
}
void searchNum_tip(){
sortNum(1,L->length-1);
int findnum;
int index;
printf(">>>输入查找的学号:");
scanf("%d",&findnum);
index=searchNum(findnum);
if(index==-1){
printf("查找失败,不存在此学号的学生。");
}
else{
printf("查找成功,此学生的姓名为:%s,成绩为:%.2f",L->stu[index].name,L->stu[index].price);
}
}
void searchmenu()//查询菜单
{
int num1;
do{
printf("\n\n\n");
printf("\t\t\t☆☆学生信息排序☆☆\n");
printf("\t\t---------------------------------------\n");
printf("\t\t\t 1 按姓名查找 \n");
printf("\t\t\t 2 按学号查找 \n");
printf("\t\t\t 3 返回上一级 \n");
printf("\t\t---------------------------------------\n");
printf("\t\t\t请输入菜单选项1-3:");
scanf("%d",&num1);
system("cls");
switch(num1){
case 1:searchName_tip();break;
case 2:searchNum_tip();break;
case 3:menu();
default:printf("选项错误!按任意键继续!");
getch();
system("cls");
}
}while(num1);
}
void Price(){
sortPrice();
int x=L->length,i;
float sum=0.0;
for(i=1;i<=x;i++){
sum+=L->stu[i].price;
}
printf("\t -----------------------------------------------------\n");
printf("\t ☆☆☆ 学生成绩情况 ☆☆☆ \n");
printf("\t -----------------------------------------------------\n");
printf("\n\n\t\t该系统现共有学生%d人",x-1);
printf("\n\n\t\t最高分:%.1f,姓名:%s,学号:%d",L->stu[x-1].price,L->stu[x-1].name,L->stu[x-1].num);
printf("\n\n\t\t最低分:%.1f,姓名:%s,学号:%d",L->stu[1].price,L->stu[1].name,L->stu[1].num);
printf("\n\n\t\t平均分:%.2f",1.0*sum/x);
getch();
system("cls");
}
void xiugai(){
show();
int index,s;
printf("请输入修改学生的编号:");
scanf("%d",&index);
if(index>L->length-1){
printf("编号输入错误!\n");
return;
}
printf("请输入要修改的内容 姓名1/成绩2:");
scanf("%d",&s);
switch(s){
case 1:
printf("请输入修改后的姓名:");
scanf("%s",&(L->stu[index].name));
break;
case 2:
printf("请输入修改后的成绩:");
scanf("%f",&(L->stu[index].price));
break;
default:
printf("输入错误!\n");
}
return;
}
void menu()//主菜单
{
int num;
printf("\t -----------------------------------------------------\n");
printf("\t \n");
printf("\t ☆☆☆ 欢迎使用莆院学生信息管理系统 ☆☆☆ ");
printf("\t \n");
printf("\t -----------------------------------------------------\n");
printf("\t | 1 → 显示学生信息 |\n");
printf("\t | 2 → 添加学生信息 |\n");
printf("\t | 3 → 删除学生信息 |\n");
printf("\t | 4 → 排序学生信息 |\n");
printf("\t | 5 → 修改学生信息 |\n");
printf("\t | 6 → 查找学生信息 |\n");
printf("\t | 7 → 学生成绩分析 |\n");
printf("\t | 8 → 退出学生系统 |\n");
printf("\t -----------------------------------------------------\n");
printf("\t\t\t\t\t\t");system("date/t");
printf("\t\t\t\t\t\t ");system("time/t");
printf("\t请选择菜单选项1-6:");
scanf("%d",&num);//设置菜单,通过num来选择
switch(num){
case 1:system("cls");outputstu();break;//学生信息显示
case 2:system("cls");insert_tip();break; //输入提示 _添加学生信息
case 3:system("cls");delete_tip();break;//删除提示_删除学生信息
case 4:system("cls");sortmenu();break;//排序
case 5:system("cls");xiugai();break;//修改
case 6:system("cls");searchmenu();break;//查找
case 7:system("cls");Price();break;//成绩分析
case 8:printf("\n\t\t★★★感谢您的使用,期待下一次相遇★★★\n");exit(0);break;
default: printf("选项错误!按任意键继续!");
getch();
system("cls");
}
menu();
return;
}
void password(int j)//用户登录验证
{ // j定义为3次
int i;
char name[10],pw[10],c;
printf("请输入用户名:");
scanf("%s",name);
printf("请输入密码:");
while((c=getch())!='\r'){//当输入回车时,结束循环
pw[i]=c;
i++;
if(c!='\b'){
printf("*");//当输入内容不是退格时就显示"*"号
}
else{
printf("\b \b");//当输入内容是退格时,删除前一个"*"号
}
}
if((strcmp(name,"liuyi")||strcmp(pw,"123"))!=0){
if(j-1==0)
{
printf("\n\n\n");
printf("\t\t\t连续错误三次,登录失败,系统即将关闭!\n\n");
exit(0);
}else{
printf("\t\t\t用户名或密码错误,您还有%d次机会重新输入\n\n",--j);
password(j);
}
}
else
{
system("cls");
printf("登入成功!\n\n请输入初始化学生个数:");
int n;
scanf("%d",&n);
printf("\n");
inputstu(n);//学生信息初始化
menu();
}
}
int main(){
system("title PTU学生管理系统");
system("color F4");//设置系统背景色和前景色
system("mode 100,30");
welcome();
password(3);
}