|
|
#include<stdio.h>
|
|
|
#include<string.h>
|
|
|
#include<stdlib.h>
|
|
|
#include<conio.h>
|
|
|
#define N 50000 /*存储50000个工大学子的学籍信息*/
|
|
|
|
|
|
struct student
|
|
|
{
|
|
|
int age; /*年龄*/
|
|
|
char num[20]; /*学号*/
|
|
|
char name[25]; /*姓名*/
|
|
|
char sex[10]; /*性别*/
|
|
|
char addr[50]; /*籍贯*/
|
|
|
char dept[50]; /*系别*/
|
|
|
char major[30]; /*专业*/
|
|
|
char classs[30]; /*班级*/
|
|
|
char phone[20]; /*学籍改变*/
|
|
|
}stu[N];
|
|
|
|
|
|
int flag; /*定义一个小flag判断其是否登录*/
|
|
|
|
|
|
void login() /*注册函数*/
|
|
|
{
|
|
|
void menu();
|
|
|
system("cls");
|
|
|
int load(); /*用于打开文件*/
|
|
|
int n,i,m,w;
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/
|
|
|
n=load(); /*打开文件*/
|
|
|
else
|
|
|
n=0;
|
|
|
struct student s; /*定义一个为密码而设置的结构体*/
|
|
|
char password[20]; /*定义一个初始密码存储数组*/
|
|
|
int d,q;
|
|
|
printf("\n\t请选择登录身份:1.管理员 ");
|
|
|
scanf("%d",&d);
|
|
|
if(d==1) /*判断登录身份*/
|
|
|
{
|
|
|
printf("\n\t\t\t请输入密码:");
|
|
|
getchar();
|
|
|
int j=0; /*j为密码字符数*/
|
|
|
while(1)
|
|
|
{
|
|
|
password[j]=getch(); /*得到一个密码字符*/
|
|
|
if(password[j]=='\r') /*如果输入是回车,退出循环,密码设置成功*/
|
|
|
break;
|
|
|
printf("*"); /*遮挡密码的作用*/
|
|
|
j++;
|
|
|
}
|
|
|
password[j]='\0';
|
|
|
if(!strcmp(password,"1")) /*判断密码是否正确*/
|
|
|
{
|
|
|
flag=1;
|
|
|
printf("\n\t登录成功!\n");
|
|
|
printf("\tPress [ Enter ] key to continue…");
|
|
|
getchar();
|
|
|
system("cls");
|
|
|
menu();
|
|
|
}
|
|
|
if(!flag)
|
|
|
{
|
|
|
printf("\t\n密码错误!\n");
|
|
|
printf("What do you want to do next? 1.继续登录 2.返回菜单 ");
|
|
|
scanf("%d",&q);
|
|
|
if(q==1) /*继续登录*/
|
|
|
{
|
|
|
system("cls");
|
|
|
login();
|
|
|
}
|
|
|
else if(q==2) /*返回主菜单*/
|
|
|
{
|
|
|
system("cls");
|
|
|
menu();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void printf_one(int k) /*输出一个工大学子的信息*/
|
|
|
{
|
|
|
system("color f1");
|
|
|
printf("学号:%s\n",stu[k].num);
|
|
|
printf("姓名:%s\n",stu[k].name);
|
|
|
printf("性别:%s\n",stu[k].sex);
|
|
|
printf("年龄:%d\n",stu[k].age);
|
|
|
printf("籍贯:%s\n",stu[k].addr);
|
|
|
printf("系别:%s\n",stu[k].dept);
|
|
|
printf("专业:%s\n",stu[k].major);
|
|
|
printf("班级:%s\n",stu[k].classs);
|
|
|
printf("学籍变化:%s\n",stu[k].phone);
|
|
|
}
|
|
|
|
|
|
void printf_n(int n) /*浏览时输出所有工大学子的信息*/
|
|
|
{
|
|
|
system("color f1");
|
|
|
int j,i=1; /*j为循环输出工大学子的学籍信息变量,i是表示第N个学生*/
|
|
|
for(j=0;j<n;j++)
|
|
|
{
|
|
|
printf("第%d个学生:\n",i++);
|
|
|
printf_one(j); /*输出工大学子学籍信息*/
|
|
|
printf("\n");
|
|
|
}
|
|
|
getchar();
|
|
|
}
|
|
|
|
|
|
int load() /*定义了一个用于打开文件的函数*/
|
|
|
{
|
|
|
FILE *fp;
|
|
|
int i;
|
|
|
if((fp=fopen("D:\\file.txt","rb"))==NULL) /*读入空文件,rb表示打开一个二进制文件,只允许读数据*/
|
|
|
{
|
|
|
printf("\n文件不存在~请输入:\n");
|
|
|
return 0;
|
|
|
}
|
|
|
for(i=0;!feof(fp);i++) /*处理到文件结尾*/
|
|
|
fread(&stu[i],sizeof(struct student),1,fp); /*一次性读取所以工大学子学籍信息*/
|
|
|
fclose(fp);
|
|
|
return(i-1); /*返回所读取的工大学子学籍信息*/
|
|
|
}
|
|
|
|
|
|
void input(int k) /*输入工大学子学籍信息*/
|
|
|
{
|
|
|
//getchar();
|
|
|
printf("学号:");
|
|
|
gets(stu[k].num);
|
|
|
printf("姓名:");
|
|
|
gets(stu[k].name);
|
|
|
printf("性别:");
|
|
|
gets(stu[k].sex);
|
|
|
printf("年龄:");
|
|
|
scanf("%d",&stu[k].age);
|
|
|
getchar();
|
|
|
printf("籍贯:");
|
|
|
gets(stu[k].addr);
|
|
|
printf("系别:");
|
|
|
gets(stu[k].dept);
|
|
|
printf("专业:");
|
|
|
gets(stu[k].major);
|
|
|
printf("班级:");
|
|
|
gets(stu[k].classs);
|
|
|
printf("学籍变化:");
|
|
|
gets(stu[k].phone);
|
|
|
}
|
|
|
|
|
|
void save(int n) /*保存工大学子学籍函数 n 表示要保存多少位学子*/
|
|
|
{
|
|
|
void exit();
|
|
|
FILE *fp;
|
|
|
int i; /*用来录取数据时用*/
|
|
|
if((fp=fopen("D:\\file.txt","wb"))==NULL) /*Wb,只打开或建立一个二进制文件,只允许写数据*/
|
|
|
{
|
|
|
printf("\n文件无法打开~\n");
|
|
|
exit();
|
|
|
}
|
|
|
for(i=0;i<n;i++) /*依次把工大学子信息录入进文件*/
|
|
|
if(stu[i].name[0]!='\0')
|
|
|
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) /*将定义的结构体内数据一次性写入磁盘文件*/
|
|
|
printf("文件写入错误!\n");
|
|
|
fclose(fp);
|
|
|
}
|
|
|
|
|
|
void printf_back() /*添加工大学子学籍信息后浏览、返回判断(花里胡哨)*/
|
|
|
{
|
|
|
int w,k=0; /*w为选择下一步、k为循环开关*/
|
|
|
void browse();
|
|
|
void menu();
|
|
|
printf("\n\n\t^_^.插入成功. ^_^\n\n");
|
|
|
do
|
|
|
{
|
|
|
printf("您下一步想做什么呢~ \n\n\t1).浏览湖工大学子学籍信息\t2).返回: [ ]\b\b");
|
|
|
scanf("%d",&w);
|
|
|
if(w==1)
|
|
|
{
|
|
|
system("cls");
|
|
|
browse(); /*浏览全部工大学子学籍*/
|
|
|
}
|
|
|
else if(w==2)
|
|
|
{
|
|
|
system("cls");
|
|
|
menu(); /*返回主菜单*/
|
|
|
}
|
|
|
else
|
|
|
printf(" 选择错误~请重新选择~.~\n");
|
|
|
}while(k==0);
|
|
|
}
|
|
|
|
|
|
void insert() /*添加工大学子学籍信息*/
|
|
|
{
|
|
|
int i,n,k,t; /*t为输入要录入的工大学子数,k位已经录入第k位学子*/
|
|
|
FILE *fp;
|
|
|
|
|
|
n=load(); /*打开文件录入*/
|
|
|
printf("准备录入多少位湖工大优秀学子的学籍信息呢(1-%d)?:",N);
|
|
|
|
|
|
scanf("%d",&t);
|
|
|
k=n+t;
|
|
|
for(i=n;i<k;i++) /*i<t就是小于输入的数*/
|
|
|
{
|
|
|
printf("\n输入第 %d 个湖工大优秀学子学籍信息.\n",i-n+1); /*计算第几位*/
|
|
|
input(i);
|
|
|
}
|
|
|
save(k); /*保存第k位工大学子学籍信息在文件中*/
|
|
|
printf_back(); /*保存好后返回判断下一步做什么*/
|
|
|
}
|
|
|
|
|
|
void deleter() /*删除函数*/
|
|
|
{
|
|
|
void menu();
|
|
|
if(!flag) /*未登录*/
|
|
|
{
|
|
|
printf("\n\n\t请先登录~\n");
|
|
|
printf("\n\t请按 Enter 键进入登录界面~");
|
|
|
getchar();
|
|
|
getchar();
|
|
|
login();
|
|
|
}
|
|
|
else /*已经登录*/
|
|
|
{
|
|
|
struct student s;
|
|
|
int i,n,k,w0,w1; /*K为“选择按钮”,w1为do-while大循环变量,w0为判断是否删除*/
|
|
|
n=load(); /*打开文件*/
|
|
|
do
|
|
|
{
|
|
|
k=-1;
|
|
|
//printf_n(n); /*删除之前先显示所有学生的信息*/
|
|
|
do
|
|
|
{
|
|
|
printf("\n\n请输入您想要删除的湖工大学子学号~\n Num:");
|
|
|
scanf("%s",s.name);
|
|
|
for(i=0;i<n;i++)
|
|
|
if(strcmp(s.name,stu[i].num)==0)
|
|
|
{
|
|
|
k=i;
|
|
|
s=stu[i];
|
|
|
}
|
|
|
if(k==-1)
|
|
|
{
|
|
|
int m;
|
|
|
printf("\n\n没有位湖工大学子的信息\n");
|
|
|
printf("您下一步想做什么~ 1.继续输入 2.返回主菜单 [ ]\b\b");
|
|
|
scanf("%d",&m);
|
|
|
if(m==1)
|
|
|
deleter(); /*返回自身再次选择*/
|
|
|
else
|
|
|
{
|
|
|
k=0;
|
|
|
menu();
|
|
|
}
|
|
|
}
|
|
|
}while(k==-1);
|
|
|
printf_one(k); /*输入一个湖工大学子学籍信息*/
|
|
|
printf("\n\t确定删除?\n\t1).是 2).返回 [ ]\b\b"); /*再次询问是否删除*/
|
|
|
scanf("%d",&w0);
|
|
|
if(w0==1)
|
|
|
{
|
|
|
stu[k].name[0]='\0'; /*表示清空结构体内该元素*/
|
|
|
save(n); /*删除后刷新保存*/
|
|
|
}
|
|
|
else
|
|
|
break;
|
|
|
printf("\n\t^_^.成功删除^_^.\n ");
|
|
|
printf("您接下来想做什么~\n\t1).继续 2).返回 [ ]\b\b");
|
|
|
scanf("%d",&w1);
|
|
|
}while(w1==1);
|
|
|
system("cls");
|
|
|
menu(); /*不再删除时返回主菜单,w1!=1*/
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void search() /*查找函数*/
|
|
|
{
|
|
|
void menu();
|
|
|
int w0,k,i,n,w1,w2; /*w1为查找类别选择变量、w0,w2k为控制do-while循环、i表示结构体变量*/
|
|
|
struct student s;
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/
|
|
|
n=load();
|
|
|
do
|
|
|
{
|
|
|
printf("请选择查找类别: 1.姓名 2.学号 [ ]\b\b");
|
|
|
scanf("%d",&w1);
|
|
|
if(w1<1||w1>2)
|
|
|
{
|
|
|
printf("输入错误~请重新输入!\n");
|
|
|
w2=1;
|
|
|
}
|
|
|
else
|
|
|
w2=0; /*这里要注意:不加这句话会陷入死循环,跳不出来*/
|
|
|
}while(w2==1);
|
|
|
if(w1==1) /*按姓名查找*/
|
|
|
{
|
|
|
do
|
|
|
{
|
|
|
k=-1;
|
|
|
do
|
|
|
{
|
|
|
printf("\n请输入您想要查找的学生的姓名~\nName:");
|
|
|
scanf("%s",s.name);
|
|
|
for(i=0;i<n;i++)
|
|
|
if(strcmp(s.name,stu[i].name)==0) /*如果输入姓名对上号了则输出该学子信息,如果没有对上号则重新选择*/
|
|
|
{
|
|
|
k=i;
|
|
|
s=stu[i];
|
|
|
}
|
|
|
if(k==-1) /*没有找到*/
|
|
|
{
|
|
|
int o; /*o为选择变量*/
|
|
|
printf("\n\n没有这位湖工大学子学籍信息!\n!");
|
|
|
printf("您下一步想做什么~\n\t1.继续 2.返回菜单 [ ]\b\b");
|
|
|
scanf("%d",&o);
|
|
|
if(o==1)
|
|
|
{
|
|
|
system("cls");
|
|
|
search(); /*继续查找*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
system("cls");
|
|
|
menu();
|
|
|
}
|
|
|
}
|
|
|
}while(k==-1);
|
|
|
system("cls");
|
|
|
printf_one(k); /*找到以后输出这位湖工大学子学籍信息*/
|
|
|
printf("\n您下一步想做什么~\n\t1).继续 2).返回菜单 [ ]\b\b");
|
|
|
scanf("%d",&w0);
|
|
|
}while(w0==1);
|
|
|
system("cls");
|
|
|
menu(); /*不再查找时返回主菜单*/
|
|
|
}
|
|
|
else /*按学号查找*/
|
|
|
{
|
|
|
do
|
|
|
{
|
|
|
k=-1;
|
|
|
do
|
|
|
{
|
|
|
printf("\n请输入您想要查找的湖工大学子的学号~\nNum:");
|
|
|
scanf("%s",s.num);
|
|
|
for(i=0;i<n;i++)
|
|
|
if(strcmp(s.num,stu[i].num)==0) /*输入对上号了,找到*/
|
|
|
{
|
|
|
k=i;
|
|
|
s=stu[i];
|
|
|
}
|
|
|
if(k==-1) /*没有找到*/
|
|
|
{
|
|
|
int o;
|
|
|
printf("\n\n没有这个学生的信息!\n!");
|
|
|
printf("您下一步想做什么~\n\t1.继续 2.返回菜单 [ ]\b\b");
|
|
|
scanf("%d",&o);
|
|
|
if(o==1)
|
|
|
{
|
|
|
system("cls");
|
|
|
search(); /*继续查找*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
system("cls");
|
|
|
menu();
|
|
|
}
|
|
|
}
|
|
|
}while(k==-1);
|
|
|
system("cls");
|
|
|
printf_one(k); /*找到以后输出这个学生的学籍信息*/
|
|
|
printf("\n您下一步想做什么~\n\t1).继续 2).返回菜单 [ ]\b\b");
|
|
|
scanf("%d",&w0);
|
|
|
}while(w0==1);
|
|
|
system("cls");
|
|
|
menu(); /*不再查找就返回主菜单*/
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int modify_data(int i) /*修改信息函数,w1为1时修改成功*/
|
|
|
{
|
|
|
int c,w1; /*c为选择修改开关变量,w1是修改信息后的选择变量*/
|
|
|
void menu();
|
|
|
do
|
|
|
{
|
|
|
puts("\n请选择要修改的选项:\n\n1.学号 2.姓名 3.性别 5.年龄 6.籍贯 7.系别 8.专业 9.班级 10.学籍变化 11.所有信息 12.取消并返回");
|
|
|
printf("请选择?: [ ]\b\b\b");
|
|
|
scanf("%d",&c);
|
|
|
if(c>12||c<1)
|
|
|
{
|
|
|
puts("\n选择错误~请重新选择!");
|
|
|
getchar();
|
|
|
}
|
|
|
}while(c>12||c<1);
|
|
|
do
|
|
|
{
|
|
|
switch(c)
|
|
|
{
|
|
|
case 1: printf("学号:"); scanf("%s",stu[i].num); break;
|
|
|
case 2: printf("姓名:"); scanf("%s",stu[i].name); break;
|
|
|
case 3: printf("性别:"); scanf("%s",stu[i].sex); break;
|
|
|
case 5: printf("年龄:"); scanf("%d",&stu[i].age);break;
|
|
|
case 6: printf("籍贯:"); scanf("%s",stu[i].addr);break;
|
|
|
case 7: printf("系别:"); scanf("%s",stu[i].dept);break;
|
|
|
case 8: printf("专业:"); scanf("%s",stu[i].major);break;
|
|
|
case 9: printf("班级:"); scanf("%s",stu[i].classs);break;
|
|
|
case 10: printf("学籍变化:"); scanf("%s",stu[i].phone);break;
|
|
|
case 11: input(i); break; /*修改这位湖工大学子的所有信息*/
|
|
|
case 12: system("cls"); menu(); /*返回主菜单*/
|
|
|
}
|
|
|
puts("\nNow:\n");
|
|
|
printf_one(i); /*输出 修改后这位湖工大学子学籍信息*/
|
|
|
printf("\n确定?\n\n\t1).是 2).不,重新修改 3).返回不保存 ");
|
|
|
scanf("%d",&w1);
|
|
|
}while(w1==2);
|
|
|
return(w1); /*修改成功并选择1后返回1*/
|
|
|
}
|
|
|
|
|
|
void modify() /*修改函数*/
|
|
|
{
|
|
|
void menu();
|
|
|
if(!flag) /*提示未登录*/
|
|
|
{
|
|
|
printf("\n\\t请先登录~\n");
|
|
|
printf("\n\t请按 Enter 键进入登录界面~");
|
|
|
getchar();
|
|
|
getchar();
|
|
|
login();
|
|
|
}
|
|
|
else /*显示已登录*/
|
|
|
{
|
|
|
struct student s;
|
|
|
int i,n,k,w0=1,w1,w2=0; /*w1判断是否修改成功k、w0为循环开关*/
|
|
|
n=load();
|
|
|
do
|
|
|
{
|
|
|
k=-1;
|
|
|
do
|
|
|
{
|
|
|
printf("\n请输入您想要修改的工大学子的学号~\nNum:");
|
|
|
scanf("%s",s.num);
|
|
|
for(i=0;i<n;i++)
|
|
|
if(strcmp(s.num,stu[i].num)==0) /*与其中一位湖工大学子匹配*/
|
|
|
{
|
|
|
k=i;
|
|
|
s=stu[i];
|
|
|
}
|
|
|
if(k==-1) /*没有找到*/
|
|
|
{
|
|
|
int o;
|
|
|
printf("\n没有这位工大学子的学籍信息\n");
|
|
|
printf("您想做什么~\n\t1.继续 2.返回菜单 ");
|
|
|
scanf("%d",&o); /*进行选择*/
|
|
|
if(o==1)
|
|
|
{
|
|
|
system("cls");
|
|
|
modify(); /*继续修改,返回本函数自身*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
system("cls");
|
|
|
menu();
|
|
|
}
|
|
|
}
|
|
|
}while(k==-1);
|
|
|
system("cls");
|
|
|
printf_one(k); /*输出这位工大学子的学籍信息*/
|
|
|
w1=modify_data(k);
|
|
|
if(w1==1) /*判断是否修改成功修改,若成功则返回1*/
|
|
|
{
|
|
|
printf("\n\t 修改成功~ \n是否继续呢?\n\t 1).是 2).保存返回\t");
|
|
|
scanf("%d",&w0);
|
|
|
w2=1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
w0=0;
|
|
|
if(w2==0)
|
|
|
stu[k]=s;
|
|
|
}
|
|
|
if((w0!=1)&&(w2==1)) /*修改成功保存*/
|
|
|
save(n);
|
|
|
}while(w0==1); /*w0为1时继续循环*/
|
|
|
system("cls");
|
|
|
menu(); /*不再修改返回主菜单*/
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void browse() /*查看湖工大学子学籍*/
|
|
|
{
|
|
|
system("color f3");
|
|
|
void menu(); /*声明子函数,后面使用*/
|
|
|
int n; /*定义一个打开文件的数*/
|
|
|
n=load(); /*打开文件,有n个学子学籍信息*/
|
|
|
printf_n(n); /*输出n个学子学籍信息*/
|
|
|
printf("这里有湖工大%d 个学子的记录~\n",n);
|
|
|
printf("\n请按下任意键退出~~~");
|
|
|
getchar();
|
|
|
system("cls"); /*清除上一次运行结果*/
|
|
|
menu(); /*返回菜单~*/
|
|
|
}
|
|
|
|
|
|
void exit() /*退出函数~*/
|
|
|
{
|
|
|
exit(0);
|
|
|
}
|
|
|
|
|
|
void menu() /*^(* ̄(oo) ̄)^主菜单~*/
|
|
|
{
|
|
|
system("color f2");
|
|
|
printf("\n\t\t 欢迎进入湖工大学子学籍管理系统~\n");
|
|
|
printf("\n");
|
|
|
int n,w1; /*w1用于循环,n用于选择*/
|
|
|
do
|
|
|
{
|
|
|
puts("\t\t★★★★★★★★★~~~菜单~~~ ★★★★★★★★★★");
|
|
|
puts("\t\t|| 1.登--录 ||");
|
|
|
puts("\t\t|| 2.注--册 ||");
|
|
|
puts("\t\t|| :) 3.删--除 ( : ||");
|
|
|
puts("\t\t|| 4.查--找 ||");
|
|
|
puts("\t\t|| 5.修--改(制作人:1810陈俊朋) ||");
|
|
|
puts("\t\t|| 6.浏--览(完成日期:2019/1/11) ||");
|
|
|
puts("\t\t|| 7.退--出 ||");
|
|
|
puts("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
|
|
printf("请选择服务种类(1-7):");
|
|
|
scanf("%d",&n);
|
|
|
if(n<1||n>7) /*判断是否在菜单内~*/
|
|
|
{
|
|
|
system("cls");
|
|
|
printf("选择错误~.~ 请重新选择!\n");
|
|
|
w1=1;
|
|
|
}
|
|
|
else
|
|
|
w1=0;
|
|
|
}while(w1==1);
|
|
|
switch(n)
|
|
|
{
|
|
|
case 1: login(); break; /*登录~*/
|
|
|
case 2: system("cls"); insert(); break; /*注册~*/
|
|
|
case 3: system("cls"); deleter(); break; /*删除~*/
|
|
|
case 4: system("cls"); search(); break; /*查找~*/
|
|
|
case 5: system("cls"); modify(); break; /*修改~*/
|
|
|
case 6: system("cls"); browse(); break; /*浏览~*/
|
|
|
case 7: exit(); break; /*退出~*/
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int main() /*主函数~*/
|
|
|
{
|
|
|
|
|
|
menu();
|
|
|
return 0;
|
|
|
}
|