学生管理系统

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Length sizeof(struct student) //用来开辟空间
int n=0;
struct student
{
// char class_0[20]; //班级
char num[10]; //学号
char name[20]; //姓名
float c_prog; //c语言程序设计
float eng; //大学英语
float math; //高等数学
float sum; //总成绩
int order; //名次
struct student *next;
}*head,*p,*p1,*p2; //head表示开头 p表示不同位置的数据

float Statistic(struct student *p)
{
p->sum =p->c_prog +p->eng +p->math ;
return p->sum ;
}

void add() //添加
{
p1=(struct student *)malloc(Length); //开辟存储空间
if(n==0) //判断链表开头
head=p1; //n=0代表输入的是第一个数据 //p2的结尾所指向的地址是p1
else p2->next=p1; //n!=0 就它们连接起来
system("cls");
printf("\t请输入学生学号:");
scanf("%s",&p1->num );
printf("\t请输入学生姓名:");
scanf("%s",&p1->name );
//printf("\t请输入学生班级:");
//scanf("%s",&pl->class_0 );
printf("\n");
printf("\t请输入C程序成绩:");
scanf("%f",&p1->c_prog );
printf("\t请输入英语成绩:");
scanf("%f",&p1->eng );
printf("\t请输入数学成绩:");
scanf("%f",&p1->math );
Statistic(p1);
p2=p1; //p2指向p1所在的地址
p2->next=NULL; //链表结束标志
n+=1;
//n判断是不是第一个数据
system("pause");
system("cls");
}
void print()
{
if(n!=0)
{
p=head; //p先指向开头
system("cls");
printf("|\t学号\t|\t姓名\t|\tC语言\t|\t英语\t|\t数学\t|\t总分\t|\n");
do
{
printf("|\t%s\t|\t%s\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\n",p->num,p->name,p->c_prog,p->eng,p->math,p->sum);
p=p->next; //p打印结束 把p指向next以判断下一个区域有没有内容
}while(p!=NULL);//只要p指向的内存区域有数据 就打印内容
}
else
printf("******您还没有添加数据哟!\n");
system("pause");
system("cls");
}

void sort()
{

struct student z[100];

int i,j;
printf("********************************************STUDENT");
printf("********************************************\n");
printf("|\t名次\t|\t学号\t|\t姓名\t|\t高数\t|\t英语\t|\tC语言\t|\t总分\t|\n");
p = head;
for(i=0;i<n;i++){
strcpy(z[i].name,p->name);
strcpy(z[i].num,p->num);
z[i].c_prog=p->c_prog;z[i].eng=p->eng;z[i].math=p->math;
z[i].sum=p->sum;
p=p->next;
}


for(j=0;j<n;j++){
for(i=j+1;i<n;i++){
if(z[j].sum<z[i].sum){
int t;char c[10];
t=z[j].sum;z[j].sum=z[i].sum;z[i].sum=t;
t=z[j].c_prog;z[j].c_prog=z[i].c_prog;z[i].c_prog=t;
t=z[j].eng;z[j].eng=z[i].eng;z[i].eng=t;
t=z[j].math;z[j].math=z[i].math;z[i].math=t;
strcpy(c,z[j].name);strcpy(z[j].name,z[i].name);strcpy(z[i].name,c);
strcpy(c,z[j].num);strcpy(z[j].num,z[i].num);strcpy(z[i].num,c);
}
}
}

for(j=0;j<n;j++){
z[j].order = j+1;
printf("|\t%d\t|\t%s\t|\t%s\t|\t%.1f\t",z[i].order,z[j].num,z[j].name,z[j].c_prog);
printf("|\t%.1f\t|\t%.1f\t|\t%.1f\t|\n",z[j].eng,z[j].math,z[j].sum);
}

system("pause");
system("cls");

}

void find() //查找
{
void find1();
void find2();
if(n!=0)
{
int a;
system("cls");
printf("1.按姓名查找\n2.按学号查询\n");
scanf("%d",&a);
switch(a)
{
case 1:
find1();
break;
case 2:
find2();
break;
}
}
else
{printf("******您还没有添加数据哟!\n");system("pause");}
}
void Delete()
{
if(n!=0)
{
struct student *f,*l; //定义新的指针 f使用来指向要删除的数据用来释放内存!
char a[20];
printf("请输入要删除的姓名:");
scanf("%s",&a);
p=head;
if(strcmp(head->name,a)==0)
{f=head;head=head->next;free(f);}
else
{
do
{
if(strcmp(p->name,a)==0)
{f=p;l->next=p->next;free(f);break;}
l=p; //不满足if表示这不是要删除的那一个节点,l暂时指向p 之后p再指向下一个节点,如果这个是要删除的节点那么l指向这个节点的next的地址
p=p->next;
}while(p!=NULL);
}
}
else
printf("******您还没有添加数据哟!\n");
printf("数据已经被删除\n");
system("pause"); //等待命令
system("cls");
}
void amend()
{
if(n!=0)
{
int c;
char a[20];
printf("请输入要修改的姓名:");
scanf("%s",&a);
p=head;
do
{
if(strcmp(a,p->name)==0)
{
printf("被修改的信息如下:|\t学号\t|\t姓名\t|\tC语言\t|\t英语\t|\t数学\t|\t总分\t|\t排名\t|\n");
printf("|\t%s\t|\t%s\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%d\t|\n",p->num,p->name,p->c_prog,p->eng,p->math,p->sum,p->order);
break;
}
p=p->next; 指针指向下一个节点
}while(p!=NULL);
printf("\n\n1.修改姓名\n2.修改学号\n3.C语言\n4.英语\n5.数学\n6.总分\n7.退出修改\n\n");
scanf("%d",&c);
switch(c)
{
case 1:
printf("姓名修改为:");
scanf("%s",&p->name);break;
case 2:
printf("学号修改为:");
scanf("%s",&p->num);break;
case 3:
printf("C语言修改为:");
scanf("%lf",&p->c_prog);break;
case 4:
printf("英语修改为:");
scanf("%lf",&p->eng);break;
case 5:
printf("数学修改为:");
scanf("%lf",&p->math);break;
case 6:
printf("总分修改为:");
scanf("%lf",&p->sum);break;
case 7:
break;
}
printf("\n\n操作成功!\n\n");
}
else
printf("******您还没有添加数据哟!\n");
system("pause");
system("cls");
}

 

void save()
{
FILE *fp;
struct student *p;
if((fp=fopen("student.txt","ab+"))==NULL)
printf("Can not open the file!");
p=head;
while(p!=NULL)
{
if(fwrite(p,Length,1,fp)!=1)
{
printf("写入数据出错\n");
fclose(fp);
break;
}
p=p->next;
}
fclose(fp);
printf("存储完成\n");
system("pause");
system("cls");
}

void read()
{
FILE *fp;
if((fp=fopen("student.txt","rb+"))==NULL)
{printf("Can not open file!");exit(0);}
do
{
p1=(struct student*)malloc(Length);
if(n==0) //判断链表开头
head=p1; //n=0代表输入的是第一个数据 //p2的结尾所指向的地址是p1
else
p2->next=p1;
fread(p1,Length,1,fp);
p2=p1;
n+=1;
}while(p2->next!=NULL);
fclose(fp);
printf("读取完成!\n\n");
system("pause");
system("cls");
}

int isAdmin()
{
char passward[6] = "12345";
char pwd[6];
while(1)
{
printf("\n进入学生成绩管理系统之前请先输入密码\n");
printf("请输入正确的密码:");
scanf("%s",pwd);
if(strcmp(passward,pwd) == 0)return 1;
else printf("这个密码是错误的!\n");
}


}

void adminSystem()
{
int a=1;
while(a!=0)
{
system("cls"); //vc++清屏函数,包含在#include<stdlib.h>中
printf(" 欢迎进入学生管理系统!\n");
printf("*******************主菜单*****************\n");
printf("*\t\t1.添加学生成绩\t\t *\n");
printf("*\t\t2.查找学生成绩\t\t *\n");
printf("*\t\t3.删除学生成绩\t\t *\n");
printf("*\t\t4.修改学生成绩\t\t *\n");
printf("*\t\t5.总分排序信息\t\t *\n");
printf("*\t\t6.查看全部信息\t\t *\n");
printf("*\t\t7.统计学生人数\t\t *\n");
printf("*\t\t8.保存学生信息\t\t *\n");
printf("*\t\t9.读取文件信息\t\t *\n");
printf("*\t\t0.停止程序运行\t\t *\n");
printf("******************************************\n");
scanf("%d",&a);
if(a == 0)break;
if(a >=0 &&a <= 9)
{
switch(a)
{
case 1:
add();
break;
case 2:
find();

break;
case 3:
Delete();
break;
case 4:
amend();
break;
case 5:
sort();
break;
case 6:
print();
break;
case 7:
printf("总人数为:%d\n",n);

case 8:
save();
break;

case 9:
read();
break;
}
}
else
{
printf(" 您输入的不符合要求,将返回主菜单!\n");
system("pause");
}
}
}

void stuSystem()
{
int a=1;
while(a!=0)
{
system("cls"); //vc++清屏函数,包含在#include<stdlib.h>中
printf(" 欢迎进入学生管理系统!\n");
printf("*******************主菜单*****************\n");
printf("*\t\t1.查找学生成绩\t\t *\n");
printf("*\t\t2.总分排序信息\t\t *\n");
printf("*\t\t3.查看全部信息\t\t *\n");
printf("*\t\t4.统计学生人数\t\t *\n");
printf("*\t\t5.停止程序运行\t\t *\n");
printf("******************************************\n");
scanf("%d",&a);
if(a == 5)break;
if(a>=1&&a<=4)
{
switch(a)
{
case 1:
find();

break;
case 2:


break;
case 3:

print();
break;
case 4:
printf("总人数为:%d\n",n);
break;

}
}
else
{
printf(" 您输入的不符合要求,将返回主菜单!\n");
system("pause");
}
}
}

void mainMenu()
{
int select = 1;
while(select)
{
printf("****************************************************\n");
printf(" 教务管理系统欢迎您!\n");
printf(" 请选择您要进入的管理系统\n");
printf(" 1.管理员管理系统。\n");
printf(" 2.学生管理系统。\n");
printf(" 3.退出系统!\n");
printf("****************************************************\n");

printf("请您选择:\n");
scanf("%d",&select);
if(select == 3)
{
printf("退出成功!!!");
break;
}

else if(select == 1)
{
if(isAdmin())
adminSystem();
break;
}

else if(select == 2)
{
stuSystem();
}

else
printf("输入有误,请重新输入!!!\n");

}


}


int main() //主函数
{

mainMenu();


}
void find1 ()
{
char a[20];
printf("请输入要查找的姓名:");
scanf("%s",&a);
p=head;
do
{
if(strcmp(a,p->name)==0)
{
printf("|\t学号\t|\t姓名\t|\tC语言\t|\t英语\t|\t数学\t|\t总分\t|\t排名\t|\n");
printf("|\t%s\t|\t%s\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%d\t|\n",p->num,p->name,p->c_prog,p->eng,p->math,p->sum,p->order);
}
p=p->next; 指针指向下一个节点
}while(p!=NULL);
system("pause");
system("cls");

}
void find2 ()
{
char a[20];
printf("请输入要查找的学号:");
scanf("%s",&a);
p=head;
do
{
//指针指向开头
if(strcmp(a,p->num)==0)
{
printf("|\t学号\t|\t姓名\t|\tC语言\t|\t英语\t|\t数学\t|\t总分\t|\t排名\t|\n");
printf("|\t%s\t|\t%s\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%.1f\t|\t%d\t|\n",p->num,p->name,p->c_prog,p->eng,p->math,p->sum,p->order);
}
p=p->next; //指针指向下一个节点
}while(p!=NULL);
system("pause");
system("cls");
}

 

转载于:https://www.cnblogs.com/CoolClare/p/11058849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值