You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pao2qcxlw/课程设计(学生学籍管理系统).c

549 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}