下面是我写的第二个管理系统,相对来说功能更完备一些:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
typedef struct student
{
char name[10];
char sex[4];
int age;
char num[10];
int score;
}STU;//定义存储学生信息的结构体
typedef struct jiedian
{
STU stu;
struct jiedian *next;
}JD;//定义结点
JD *inputstudent();
void hasnot_been_recorded();
void inputID(JD *h);
void guanliyuan();
void has_been_recorded();
JD *readstudent1(char *a);
void record();
void addstudent(JD *h);
void deletestudent(JD *h);
void outputstudent2(JD *h);
void changestudent(JD *h);
void checkstdent(JD *h);
void countstudent(JD *h);
void savestudent(JD *h);
void sortstudent(JD *h);
void gongneng_menu(JD *h);
JD *negetive_sequence(JD *h);
JD *num_order_sequence(JD *h);
JD *sortstudent2(JD *h);
JD *sortstudent1(JD *h);
void xuesheng();
void gotoxy(int x, int y);
void destorylist(JD *h);
void go_on_or_not(JD *h);
void outputstudent(JD *h);
void outputstudent1(JD *h);
void code(int i,char *b);
//1.直接输入信息函数
JD *inputstudent()
{
char n,a;
printf("请输入学生信息:姓名,性别,年龄,学号,分数\n");
printf("\n");
printf("\n");
printf("注意当输入的姓名为#时,结束录入!\n");
JD *h,*p,*q;
q=(JD *)malloc(sizeof(JD));
h=q;
while(1)
{
p=(JD *)malloc(sizeof(JD));
scanf("%s %s %d %s %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score);
q->next=p;
q=p;
if(strcmp(p->stu.name,"#")==0) break;
}
q->next=0;
return h;//return 要放在最后面!!!
}
//2.增
void addstudent(JD *h)
{
JD *q,*s,*p;int i,j=1;char a[10];
s=(JD *)malloc(sizeof(JD));
printf("请输入新纳入学生的相关信息:\n");
scanf("%s%s%d%s%d",s->stu.name,s->stu.sex,&s->stu.age,s->stu.num,&s->stu.score);
printf("请输入需要插入的位置后的学生学号:");
scanf("%s",a);
q=h;p=h->next;
while(p!=0)
{
if(strcmp(a,p->stu.num)==0) break;
q=p;p=p->next;
}
s->next=q->next;
q->next=s;
printf("\n");
printf("\n");
printf("添加信息成功!\n");
}
//3.删
void deletestudent(JD *h)
{
int i,j=1;char a[10];
printf("请输入将要删除的学生的学号:\n");
scanf("%s",a);
JD *p,*q;
q=h;p=h->next;
while(p!=0)
{
if(strcmp(a,p->stu.num)==0) break;
q=p;p=p->next;
}
q->next=p->next;
free(p);
printf("删除信息成功!\n");
}
//4.改
void changestudent(JD *h)
{
printf("请输入信息需要修改的学生的学号:\n");
int i,j=1;char a[10];
scanf("%s",a);
JD *p;
p=h->next;
while(p)
{
if(strcmp(a,p->stu.num)==0) break;
p=p->next;
}
printf("请按姓名,性别,年龄,学号,得分的顺序重新输入该生的信息:\n");
scanf("%s %s %d %s %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score);
printf("修改信息成功!\n");
}
//5.查
void checkstudent(JD *h)
{
printf("请输入需要查询的学生学号:");
int i,j=1;char a[10];
scanf("%s",a);
JD *p;
p=h->next;
while(p!=0)
{
if(strcmp(a,p->stu.num)==0) break;
p=p->next;
}
printf("查询结果:\n");
printf("\n");
printf("\t\t\t姓名 性别 年龄 学号 得分\n");
printf("\t\t\t%s %s %d %s %d",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
printf("\n");
printf("\n");
}
//6.计数
void countstudent(JD *h)
{
JD *p;int sum=0,count=0;double average;
p=h->next;
while(p)
{
count++;
sum+=p->stu.score;
p=p->next;
}
p=h->next;
while(p->next!=0)
{
p=p->next;
}
count=count-1;
sum=sum-p->stu.score;
average=sum/count;
printf("共%d人 总分:%d 平均分:%.2f",count,sum,average);
}
//7.打印
void outputstudent2(JD *h)
{
JD *p;
p=h->next;
printf("\t\t\t姓名 性别 年龄 学号 得分\n");
while(p!=0)
{
printf("\t\t\t%s %s %d %s %d\n",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
p=p->next;
}
}
void outputstudent(JD *h)
{
printf("\t\t\t输入1.只看学生及其成绩 2.输出所有信息\n");
char a=getch();
switch(a)
{
case '1':outputstudent1(h);break;
case '2':outputstudent2(h);break;
default :
{
printf("输入错误,请重新输入:\n");
outputstudent(h);
}
}
}
void outputstudent1(JD *h)
{
char a[10];int i,j=1;
printf("请输入学生学号:\n");
scanf("%s",a);
JD *p;
p=h->next;
while(p!=0)
{
if(strcmp(a,p->stu.num)==0) break;
p=p->next;
}
printf("\n");
printf("\n");
printf("\t\t\t姓名 成绩\n");
printf("\t\t\t%s %d",p->stu.name,p->stu.score);
}
//8.保存
void savestudent(JD *h)
{
FILE *fp;
JD *p;
p=h->next;
fp=fopen("students.txt","w");
if((fp=fopen("students.txt","w"))!=0)
{
fprintf(fp,"姓名 性别 年龄 学号 得分\n");
while(p!=0)
{
fprintf(fp,"%s %s %d %s %d\n",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
p=p->next;
}
fclose(fp);
printf("写入文件成功!\n");
}
else printf("写入文件失败!\n");
}
//10.排序
void sortstudent(JD *h)
{
JD *head;
printf("\n");
printf("请选择排序方式:\t\t\t1.成绩按由低到高排\t\t2.成绩按由高到低来排\n");
printf(" \t\t\t3.按学号排序 \t\t4.将当前顺序逆置\n");
char a=getch();
switch(a)
{
case '1':head=sortstudent1(h);outputstudent(head);break;
case '2':head=sortstudent2(h);outputstudent(head);break;
case '3':head=num_order_sequence(h);outputstudent(head);break;
case '4':head=negetive_sequence(h);outputstudent(head);break;
}
}
//排1
JD *sortstudent1(JD *h)
{
JD *q,*p,*r;
r=(JD *)malloc(sizeof(JD));
q=h->next;
while(q)
{
p=q->next;
while(p)
{
if(q->stu.score > p->stu.score)
{
strcpy(r->stu.name,q->stu.name);
strcpy(r->stu.sex,q->stu.sex);
r->stu.age=q->stu.age;
strcpy(r->stu.num,q->stu.num);
r->stu.score=q->stu.score;
strcpy(q->stu.name,p->stu.name);
strcpy(q->stu.sex,p->stu.sex);
q->stu.age=p->stu.age;
strcpy(q->stu.num,p->stu.num);
q->stu.score=p->stu.score;
strcpy(p->stu.name,r->stu.name);
strcpy(p->stu.sex,r->stu.sex);
p->stu.age=r->stu.age;
strcpy(p->stu.num,r->stu.num);
p->stu.score=r->stu.score;
}
p=p->next;
}
q=q->next;
}
printf("重排成功!下面是输出结果:\n");
return h;
}
//排2
JD *sortstudent2(JD *h)
{
JD *q,*p,*r;
r=(JD *)malloc(sizeof(JD));
q=h->next;
while(q)
{
p=q->next;
while(p)
{
if(q->stu.score < p->stu.score)
{
strcpy(r->stu.name,q->stu.name);
strcpy(r->stu.sex,q->stu.sex);
r->stu.age=q->stu.age;
strcpy(r->stu.num,q->stu.num);
r->stu.score=q->stu.score;
strcpy(q->stu.name,p->stu.name);
strcpy(q->stu.sex,p->stu.sex);
q->stu.age=p->stu.age;
strcpy(q->stu.num,p->stu.num);
q->stu.score=p->stu.score;
strcpy(p->stu.name,r->stu.name);
strcpy(p->stu.sex,r->stu.sex);
p->stu.age=r->stu.age;
strcpy(p->stu.num,r->stu.num);
p->stu.score=r->stu.score;
}
p=p->next;
}
q=q->next;
}
printf("重排成功!下面是输出结果:\n");
return h;
}
//排3
JD *num_order_sequence(JD *h)
{
JD *q,*p,*r;
r=(JD *)malloc(sizeof(JD));
q=h->next;
while(q)
{
p=q->next;
while(p)
{
if(strcmp(q->stu.num,p->stu.num)>0)
{
strcpy(r->stu.name,q->stu.name);
strcpy(r->stu.sex,q->stu.sex);
r->stu.age=q->stu.age;
strcpy(r->stu.num,q->stu.num);
r->stu.score=q->stu.score;
strcpy(q->stu.name,p->stu.name);
strcpy(q->stu.sex,p->stu.sex);
q->stu.age=p->stu.age;
strcpy(q->stu.num,p->stu.num);
q->stu.score=p->stu.score;
strcpy(p->stu.name,r->stu.name);
strcpy(p->stu.sex,r->stu.sex);
p->stu.age=r->stu.age;
strcpy(p->stu.num,r->stu.num);
p->stu.score=r->stu.score;
}
p=p->next;
}
q=q->next;
}
printf("重排成功!下面是输出结果:\n");
return h;
}
//排4
JD *negetive_sequence(JD *h)
{
JD *q,*p,*r;
p=h->next;
q=0;
while(p)
{
r=p->next;
p->next=q;
q=p;
p=r;
}
h->next=q;
printf("逆置成功!下面是输出结果:\n");
return h;
}
void has_been_recorded()
{
char a[20];
printf("请输入需要读取的文件名:\n");
gets(a);
JD *head=readstudent1(a);
gongneng_menu(head);
go_on_or_not(head);
}
void hasnot_been_recorded()
{
JD*head=inputstudent();
gongneng_menu(head);
go_on_or_not(head);
}
void inputID()
{
char a=getch();
switch(a)
{
case '1':guanliyuan();break;
case '2':xuesheng();break;
default :
{
printf("您输入的有误,请重新输入:\n");
inputID();
}
}
}
//光标
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x - 1;
pos.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void code(int i,char *b)
{
b[i]=getch();
if(b[i]=='\b')
{
gotoxy(52+i-1,26);
putchar(' ');
gotoxy(52+i-1,26);
code(i-1,b);
code(i,b);
}
else
{
gotoxy(52+i,26);
putchar('*');
gotoxy(52+i+1,26);
}
}
//管理员
void guanliyuan()
{
int i,j=1,k=1;char a[7],b[7],c[7]="master",d[7]="666666";
printf("\n");
printf("\n");
gotoxy(40, 19);
printf(" _____________\n");
gotoxy(40, 20);
printf(" 用户名: || ||\n");
gotoxy(40, 21);
printf(" ||_____________||\n");
gotoxy(52, 21);
gets(a);
printf("\n");
printf("\n");
gotoxy(42, 24);
printf(" _____________\n");
gotoxy(42, 25);
printf(" 密码: || ||\n");
gotoxy(42, 26);
printf(" ||_____________||\n");
gotoxy(52, 26);
for(i=0;i<6;i++)
{
code(i,b);
}
if(strcmp(a,c)==0&&strcmp(b,d)==0)
{
system("cls");
printf("\n");
printf("\n");
printf("\n");
printf(" 欢迎您: master 请根据提示进行选择: \n");
printf("\n");
printf("\n");
printf("\t\t\t1.已录入学生信息并将在此基础上进行下一步\t\t\t2.将要新纳入学生信息\n");
record();
}
else if(strcmp(a,c)!=0)
{
printf("\n");
printf("\n");
printf("\n用户名输入错误!请重新输入:\n");
Sleep(2000);
system("cls");
printf("\n");
printf("\n");
printf(" ╭︿︿︿ ╮ ╭︿︿︿ ╮ \n");
printf(" {/ @ @ /} {/ @ @ /} \n");
printf(" ( (oo) ) ( (oo) ) \n");
printf(" ︶︶︶ 欢迎使用地表最强管理系统! ︶︶︶ \n");
printf("\n");
printf("\n");
guanliyuan();
}
else if(strcmp(b,d)!=0)
{
printf("\n");
printf("\n");
printf("\n密码错误!请重新输入:\n");
Sleep(2000);
system("cls");
printf("\n");
printf("\n");
printf(" ╭︿︿︿ ╮ ╭︿︿︿ ╮ \n");
printf(" {/ @ @ /} {/ @ @ /} \n");
printf(" ( (oo) ) ( (oo) ) \n");
printf(" ︶︶︶ 欢迎使用地表最强管理系统! ︶︶︶ \n");
printf("\n");
printf("\n");
guanliyuan();
}
}
//学生
void xuesheng()
{
JD *head,*p;
char c[]="students.txt";
head=readstudent1(c);p=head->next;
printf("请输入你的学号:\n");
gotoxy(40, 19);
printf(" _____________\n");
gotoxy(40, 20);
printf(" 学号: || ||\n");
gotoxy(40, 21);
printf(" ||_____________||\n");
gotoxy(52, 21);
char a[10];
scanf("%s",a);
while(p)
{
if(strcmp(p->stu.num,a)==0) break;
p=p->next;
}
if(p)
{
printf("\t\t\t欢迎您%s同学,欢迎使用本系统!下面是你可以进行的信息查询:\n",p->stu.name);
printf("\n");
printf("\n");
outputstudent(head);
printf("按任意键继续:\n");
getch();
}
else
{
printf("未找到该生,请检查并重新输入:\n");
xuesheng();
}
}
void record()
{
char a=getch();
switch(a)
{
case '1':has_been_recorded();break;
case '2':hasnot_been_recorded();break;
default :
{
printf("您输入的有误:请重新输入:\n");
record();
}
}
}
JD *readstudent1(char *a)
{
JD *h,*p,*q;
q=(JD *)malloc(sizeof(JD));
h=q;
FILE *fp;
fp=fopen(a,"r");
if((fp=fopen(a,"r"))!=0)
{
fseek(fp,1L*sizeof("姓名 性别 年龄 学号 得分"),SEEK_SET);
while(1)
{
p=(JD *)malloc(sizeof(JD));
fscanf(fp,"%s %s %d %s %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score);
q->next=p;
q=p;
if(strcmp(p->stu.name,"#")==0) break;
}
q->next=0;
printf("打开文件成功!\n");
}
else printf("打开文件失败!\n");
fclose(fp);
return h;
}
//摧毁链表
void destorylist(JD *h)
{
JD *p,*r;
p=h->next;
while(p!=0)
{
r=p->next;
free(p);
p=r;
}
free(h);
printf("摧毁信息成功!按任意键继续:\n");
getch();
}
void gongneng_menu(JD *h)
{
printf("\n");
printf("请根据您的需要输入功能列表对应的序号:\n");
printf("\t\t\t1.添加学生\t\t2.删除学生信息\t\t3.修改学生信息\n");
printf("\n");
printf("\n");
printf("\t\t\t4.查询学生信息\t\t5.统计学生人数\t\t6.打印学生信息\n");
printf("\n");
printf("\n");
printf("\t\t\t7.将学生信息排序\t\t8.保存学生信息\t\t9.读取文件信息\n");
printf("\n");
printf("\n");
printf("\t\t\t0.摧毁信息并退出系统\n");
char b[]="students.txt";
char a=getch();
switch(a)
{
case '1':addstudent(h);break; case '2':deletestudent(h);break;
case '3':changestudent(h);break; case '4':checkstudent(h);break;
case '5':countstudent(h);break; case '6':outputstudent(h);break;
case '7':sortstudent(h);break; case '8':savestudent(h);break;
case '9':readstudent1(b);break; case '0':destorylist(h);break;
default :
{
printf("您输入的有误,请重新输入!\n");
system("cls");
gongneng_menu(h);
}
}
}
//是否继续函数
void go_on_or_not(JD *h)
{
printf("\t\t\t按1继续 按0退出\n");
char a=getch();
switch(a)
{
case '1':
{
system("cls");
gongneng_menu(h);
go_on_or_not(h);
break;
}
case '0': break;
default:
{
printf("输入错误,请重新输入:\n");
printf("\n");
go_on_or_not(h);
}
}
}
main()
{
int count=1;
system("color 70");
printf("\n");
printf("\n");
printf(" ╭︿︿︿ ╮ ╭︿︿︿ ╮ \n");
printf(" {/ @ @ /} {/ @ @ /} \n");
printf(" ( (oo) ) ( (oo) ) \n");
printf(" ︶︶︶ 欢迎使用地表最强管理系统! ︶︶︶ \n");
printf("\n");
printf("\n");
while(count<=120)
{
printf("==");
Sleep(30);
count++;
}
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("请选择身份: 1.管理员 2.学生\n");
inputID();
}