记录我在大一第二学期期末做的C语言课程毕业设计
1. 班级档案管理系统运用到的主要结构体
typedef struct birthday //出生日期
{
int year;
int month;
int day;
}Birthday;
struct file //学生档案信息
{
char id[20];//学号
char name[20];//姓名
char sex[2];//性别
int age;//年龄
Birthday birthday;//出生日期
char desc[20];//备注
}File[N];
2.班级档案管理系统任务目标
对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。
功能要求:
(1)本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:学号、姓名、性别、年龄、备注。
(2)本系统显示这样的菜单:
请选择系统功能项:
a 学生基本信息录入
b 学生基本信息显示
c 学生基本信息保存
d 学生基本信息删除
e 学生基本信息修改(要求先输入密码)
f 学生基本信息查询
(1)按学号查询
(2)按姓名查询
(3)按性别查询
(4)按年龄查询
g. 退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生基本信息保存到文件中。
(5)进入系统之前要先输入密码。
3.程序框图或流程图,程序清单与调用关系
(1)系统结构程序框图
2)程序清单
各函数的主要功能:
函数 |
功能 |
void load() |
系统登陆验证 |
save_password(charstr[]) |
保存密码 |
void menu() |
菜单功能 |
void input(int n) |
录入学生信息 |
void output() |
显示学生信息 |
void save(int n) |
保存学生信息 |
void dele() |
删除学生信息 |
void change() |
修改学生信息 |
void invest() |
查询学生信息 |
void change_password() |
修改密码 |
void over() |
退出系统 |
(3)函数调用关系图
4.c程序源码
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define N 200 typedef struct birthday { int year; int month; int day; }Birthday; struct file { char id[20];//学号 char name[20];//姓名 char sex[2];//性别 int age;//年龄 Birthday birthday;//出生日期 char desc[20];//备注 }File[N]; void toxy(int x, int y) //将光标移动到X,Y坐标处 { COORD pos = { x , y }; HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out, pos); } void load();//系统登陆页面 void save_password(char str[]);//保存密码 void menu();//系统主菜单 void input(int n);//学生信息录入 void output();//学生信息显示 void save(int n);//学生信息保存 void dele();//学生信息删除 void change();//学生信息修改 void invest();//学生信息查询 void change_password();//修改密码 void over();//退出系统 void input(int n)//信息录入,录入学生的基本信息 { int i; for(i=0;i<n;i++) { system("cls");//清屏 toxy(15,6); printf("请输入学生学号:"); scanf("%s",File[i].id); toxy(15,7); printf("请输入学生姓名:"); scanf("%s",File[i].name); toxy(15,8); printf("请输入学生性别(男/女):"); scanf("%s",File[i].sex); toxy(15,9); printf("请输入学生年龄:"); scanf("%d",&File[i].age); toxy(15,10); printf("请输入学生的出生日期(年月日,以空格隔开):"); scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day); toxy(15,11); printf("请输入备注:"); scanf("%s",File[i].desc); } system("cls");//清屏 toxy(15,6); printf("录入完毕,请记得返回保存(*^▽^*)"); toxy(15,8); printf("按任意键可返回主菜单!"); getch(); } void output()//信息显示,将学生的基本信息显示到屏幕上 { system("cls");//清屏 system("color F");//字体颜色为亮白色 int i; FILE*fp; toxy(15,6); printf("***********学生基本信息*************\n"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,10); if((fp=fopen("stu","r"))==NULL)//只用读,用r打开stu文件 { system("cls"); toxy(15,6); printf("cannot open file"); toxy(15,8); exit(0); } else { for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp);//从文件中读取数据到File中 if(feof(fp))//判断文件是否读到了最后 break; printf("%-10s %-10s%-s %7d %d-%d-%d %7s\n",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,11+i); } memset(File,NULL,sizeof(File));//重置File } printf("显示完毕,请按任意键返回主菜单"); getch(); } void save(int n) //信息保存,将录入的学生信息保存到文件中 { system("cls");//清屏 system("color F");//字体颜色为亮白色 FILE*fp; fp=fopen("stu","a+");//以追加的方式打开文件,结束时指针停在文件尾 int i; for(i=0;i<n;i++) { if(File[i].age==NULL) continue;//避免空白数据 fwrite(&File[i],sizeof(struct file),1,fp);//向指定的文件中写入数据 } fclose(fp); n=NULL;//重置 memset(File,NULL,sizeof(File));//重置结构体数组File toxy(15,8); printf("档案保存成功!即将返回主菜单……"); Sleep(800); } void dele()//信息删除,把不要的学生基本信息删除 { system("cls");//清屏 system("color F");//字体颜色为亮白色 int i,flag=0;//flag是否找到删除学生的标志 char number[20]; char name[20]; char c; do { toxy(15,6); printf("请输入要删除学生的学号和姓名:"); toxy(15,8); scanf("%s%s",number,name); FILE*fp1,*fp2; fp1=fopen("stu","r+");//为了读和写,用r+打开stu文本文件 fp2=fopen("linshi","w+");//用w+打开一个临时的文本文件 if(fp1==NULL||fp2==NULL) { toxy(15,10); printf("cannot open file!"); toxy(15,12); exit(0); } for(i=0;i<N;i++) { while(fread(&File[i],sizeof(struct file),1,fp1))//从文件中读取数据到File { if(feof(fp1))// 判断文件是否读到了最后 break; if(strcmp(number,File[i].id)==0&&strcmp(name,File[i].name)==0)//判断要删除的学号和姓名是否与文件数据有相同,若相同则跳过这次循环 { flag=1; continue; } else { fwrite(&File[i],sizeof(struct file),1,fp2);//将File的信息写入文件 } } } fclose(fp1); fclose(fp2); if(system("copy linshi stu")==0)//将linshi文件的内容复制覆盖到stu文件,若成功则返回0 { system("cls");//清屏 system("DEL linshi");//删除linshi文件 system("cls");//清屏 } if(flag==1)//找到删除学生 { toxy(15,10); printf("成功删除该学生,系统将自动帮您更新并保存档案\n"); Sleep(800); menu(); } if(flag==0)//无法找到被删除学生 { toxy(15,10); printf("删除失败!学号或姓名输入错误"); toxy(15,11); printf("按1返回主菜单,按2重新输入\n"); toxy(15,11); while(1) { c=getch(); if(c==\'1\') { menu(); } else if(c==\'2\') dele(); } } }while(1); } void change()//修改信息,修改错误的学生信息 { int sign=0;//用来标志密码验证成功或否 int j=3;//每次进入此功能,用户有3次验证密码机会 do { system("cls");//清屏 system("color F");//字体颜色为亮白色 char str[18]; FILE*fp; if((fp=fopen("password","r"))==NULL) { printf("cannot open file\n"); exit(0); } fgets(str,18,fp);//从文件中读取密码数据保存到str数组中 fclose(fp); toxy(15,6); printf("进入该功能,须再次验证登陆密码:\n"); toxy(15,8); char c; char password[18]; int i=0; for(;;)//此处为输入密码不回显操作 { c=getch();//输入c if(c==\'\r\')//如果输入c为回车,则跳出循环 { break; } if(c==\'\b\') //如果输入c为删除键 { printf("\b"); printf(" "); printf("\b"); } else { password[i]=c; printf("*"); i++; } } password[i]=\'\0\';//在字符串结尾作结束符标记 if(strcmp(str,password)==0)//验证密码是否正确 { system("cls");//清屏 toxy(15,10); printf("验证成功!即将进入修改功能!"); Sleep(600); sign=1; break; } else { toxy(15,10); j--; printf("密码错误!您还有%d次验证机会",j); Sleep(600); } }while(j>0);//验证机会不为0 if(j==0) { system("cls"); toxy(15,6); printf("验证机会已用完,即将返回主菜单……"); Sleep(600); menu(); } int select,i; char number[20]; int count=0; if(sign) { system("cls"); while(select!=7) { system("cls"); toxy(15,6); printf("--------------1.修改学号-------------"); toxy(15,7); printf("--------------2.修改姓名-------------"); toxy(15,8); printf("--------------3.修改性别-------------"); toxy(15,9); printf("--------------4.修改年龄-------------"); toxy(15,10); printf("--------------5.修改出生日期---------"); toxy(15,11); printf("--------------6.修改备注 ------------"); toxy(15,12); printf("--------------7. 退出 ---------------"); toxy(15,13); printf("请输入1~6进行选择:"); toxy(15,14); scanf("%d",&select); FILE*fp1; toxy(15,15); if((fp1=fopen("stu","r+"))==NULL)//为了读和写,用r+打开stu文件 { system("cls");//清屏 toxy(15,6); printf("cannot open file!"); toxy(15,8); exit(0); } for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp1);//从文件中读取数据到File if(feof(fp1))//判断文件是否读到了最后 break; count++;//每次成功从stu文件中读取信息,则学生数据个数加1 } int flag=0; switch(select) { case 1://修改学号 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的学号进行修改:"); toxy(15,11); scanf("%s",File[i].id); flag=1; break; } } fclose(fp1); if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 2://修改姓名 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的姓名进行修改:"); toxy(15,11); scanf("%s",File[i].name); flag=1; break; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 3://修改性别 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的性别进行修改:"); toxy(15,11); scanf("%s",File[i].sex); flag=1; break; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 4://修改年龄 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的年龄进行修改:"); toxy(15,11); scanf("%d",&File[i].age); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 5://修改出生日期 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的出生日期(年 月 日)进行修改:"); toxy(15,11); scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 6://修改备注 system("cls");//清屏 toxy(15,5); printf("请输入要修改学生的学号:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************学生基本信息*********************"); toxy(15,8); printf(" 学号 姓名 性别 年龄 出生日期 备注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新输入该学生的备注进行修改:"); toxy(15,11); scanf("%s",&File[i].desc); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系统已自动保存!"); toxy(15,13); printf("正在自动跳转到主菜单...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("该学生不存在!"); toxy(15,13); char c; printf("1.返回上一级 2.返回主菜单"); toxy(15,14); c=getch(); if(c==\'1\') break; if(c==\'2\') menu(); } case 7:system("cls");//清屏 default:break; } } } } void invest()//查询信息,可按学号、姓名、性别、年龄、出生日期查询学生的基本信息 { system("cls");//清屏 system("color F");//字体颜色为亮白色 int i,x,flag,year,month,day,age; char number[20]; char name[20]; char sex[5]; while(x!=6) { system("cls"); toxy(15,6); printf("请选择查询功能:\n"); toxy(15,7); printf("\t1.查询学号\n"); toxy(15,8); printf("\t2.查询姓名\n"); toxy(15,9); printf("\t3.查询性别\n"); toxy(15,10); printf("\t4.查询出生日期\n"); toxy(15,11); printf("\t5.查询年龄\n"); toxy(15,12); printf("\t6.退出\n"); toxy(15,13); printf("请输入选择:"); scanf("%d",&x); FILE*fp; if((fp=fopen("stu","r"))==NULL)//只用读,用r打开stu文件 { system("cls");//清屏 toxy(15,6); printf("cannot open file\n"); toxy(15,8); exit(0); } int count=0;//用来记录文件中学生数据的个数 for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp);//将stu文件信息传到File中 if(feof(fp))//判断文件是否读到了最后 break; count++;//每次成功从stu文件中读取信息,则学生数据个数加1 } fclose(fp); switch(x) { case 1: system("cls");//清屏 toxy(15,6); printf("请输入学号:"); toxy(15,8); scanf("%s",number); system("cls");//清屏 flag=0; toxy(15,6); printf("学号为%s的学生信息如下:",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("无法找到你要找的学生!"); } toxy(15,11+count); printf("按任意键后可返回……"); getch(); break; case 2: system("cls");//清屏 toxy(15,6); printf("请输入姓名:"); toxy(15,8); scanf("%s",name); flag=0; system("cls");//清屏 toxy(15,6); printf("姓名为%s的学生信息如下:",name); for(i=0;i<count;i++) { if(strcmp(name,File[i].name)==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("无法找到你要找的学生!"); } toxy(15,11+count); printf("按任意键后可返回……"); getch(); break; case 3: system("cls");//清屏 toxy(15,6); printf("请输入性别(男/女):"); toxy(15,8); scanf("%s",sex); system("cls");//清屏 flag=0; toxy(15,6); printf("性别为%s的学生信息如下:",sex); for(i=0;i<count;i++) { if(strcmp(sex,File[i].sex)==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("无法找到你要找的学生!"); } toxy(15,11+count); printf("按任意键后可返回……"); getch(); break; case 4: system("cls");//清屏 toxy(15,6); printf("请输入出生日期(年 月 日):"); toxy(15,8); scanf("%d%d%d",&year,&month,&day); system("cls");//清屏 flag=0; toxy(15,6); printf("出生日期为%d年%d月%d日的学生信息如下:",year,month,day); for(i=0;i<count;i++) { if(year==File[i].birthday.year&&year==File[i].birthday.month&&year==File[i].birthday.day) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("无法找到你要找的学生!"); } toxy(15,11+count); printf("按任意键后可返回……"); getch(); break; case 5: system("cls");//清屏 toxy(15,6); printf("请输入年龄:"); toxy(15,8); scanf("%d",&age); system("cls");//清屏 flag=0; toxy(15,6); printf("年龄为%d的学生信息如下:",age); for(i=0;i<count;i++) { if(age==File[i].age) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("无法找到你要找的学生!"); } toxy(15,11+count); printf("按任意键后可返回……"); getch(); break; case 6:system("cls");//清屏 toxy(15,8); printf("即将返回主菜单……"); Sleep(700); break; } } } void over()//退出功能,显示退出软件的提示 { char t; system("color F");//字体颜色为亮白色 toxy(15,11); printf("--------------------------"); toxy(15,12); printf("| 您确定要退出吗? |"); toxy(15,14); printf("| 1.确定 2.取消 |"); toxy(15,15); printf("--------------------------"); while(1) { t=getch(); //输入t switch(t) { case \'1\': system("cls");//清屏 system("color F");//字体颜色为亮白色 toxy(15,10); printf("正在安全退出...."); Sleep(1000); //暂停1秒 system("cls"); system("color F");//字体颜色为亮白色 toxy(15,10); printf("已安全退出软件"); toxy(15,12); printf("谢谢使用!"); toxy(15,14); printf("bye-bye^_^"); toxy(15,16); exit(0); break; //终止程序 case \'2\': menu(); break; //调用函数,进入菜单 default :break; } } } void menu()//菜单功能,显示各种操作功能 { system("cls");//清屏 fflush(stdin);//清空缓存 char x; int n; while(x!=\'h\') { system("color F");//字体颜色为亮白色 system("cls"); toxy(15,4); printf("-----班级档案管理系统-----"); toxy(15,5); printf("| |"); toxy(15,6); printf("| a.学生基本信息录入 |"); toxy(15,7); printf("| |"); toxy(15,8); printf("| b.学生基本信息显示 |"); toxy(15,9); printf("| |"); toxy(15,10); printf("| c.学生基本信息保存 |"); toxy(15,11); printf("| |"); toxy(15,12); printf("| d.学生基本信息删除 |"); toxy(15,13); printf("| |"); toxy(15,14); printf("| e.学生基本信息修改 |"); toxy(15,15); printf("| |"); toxy(15,16); printf("| f.学生基本信息查询 |"); toxy(15,17); printf("| |"); toxy(15,18); printf("| g.修 改 密 码 |"); toxy(15,19); printf("| |"); toxy(15,20); printf("| h.退 出 系 统 |"); toxy(15,21); printf("| |"); toxy(15,22); printf("--------------------------"); toxy(15,23); printf("请输入选择:"); x=getch(); if(x<\'A\'||x>\'H\'&&x<\'a\'||x>\'h\')//如果输入的范围不是在A-H或a-h { toxy(15,25); printf("输入选项有误,请重新输入"); Sleep(700); continue; } if(x>=\'A\'&&x<=\'H\') x=x+32;//将大写转换为小写 switch(x) { case \'a\': system("cls"); system("color F");//字体颜色为亮白色 toxy(15,8); printf("请输入录入学生人数:"); scanf("%d",&n); input(n); break; case \'b\': output(); break; case \'c\': save(n); break; case \'d\':dele(); break; case \'e\': change(); break; case \'f\':invest();break; case \'g\':change_password(); break; case\'h\': over(); break; default:break; } } } void save_password(char str[])//保存密码到password文本文件中 { FILE*fp; fp=fopen("password","w");//打开文本文件 if(fp==NULL) { printf("cannot open file"); } if(fputs(str,fp)!=0)//使用fputs将密码写入密码文件,成功则返回0,否则返回非0值 { printf("write error!"); } fclose(fp); } void load()//密码登陆,通过验证读取文件的密码与用户输入的密码是否一致,从而进入系统 { char _password[18]; int p=3;//有3次验证密码机会 do { system("cls");//清屏 system("color F");//字体颜色为亮白色 int i=0; char password[18]; char str[]="hstc2018";//第一次登陆的初始密码 char k; FILE*fp; if((fp=fopen("password","a+"))==NULL) { printf("cannot open file"); exit(0); } fseek(fp,0L,SEEK_END);//把文件指针移到最后 int size=ftell(fp);//用ftell函数测定文件位置标记的当前位置 rewind(fp);//使文件位置标记重新返回文件的开头 if(size==0)//如果文件的长度为空,则说明是第一次登陆使用 { strcpy(password,str);//将初始密码复制到password数组 save_password(password);//保存密码到文件中 } else fgets(password,18,fp);//从文件中读取密码 toxy(15,6); printf("----------学生档案管理系统---------\n"); toxy(15,8); printf("请输入管理者密码:"); for(;;)//此处为输入密码不回显操作 { k=getch();//输入k if(k==\'\r\') //如果输入k为回车,则跳出循环 { break; } if(k==\'\b\')//如果输入k为删除键 { if(i>0)//如果密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果输入的k既不是删除键,也不是回车键 { _password[i]=k; printf("*"); i++; } } _password[i]=\'\0\';//在字符串结尾作结束符标记 if(strcmp(password,_password)==0)//判断密码是否输入正确 { system("cls");//清屏 toxy(15,10); printf("正在登陆……"); Sleep(500); menu(); } else { toxy(15,10); p--; printf("密码错误!您还有%d次机会",p); Sleep(600); } }while(p>0);//验证机会不为0 if(p==0) { system("cls");//清屏 toxy(15,6); printf("机会已用完!"); toxy(15,8); } } void change_password()//修改密码,需要输入旧密码和新密码,如果旧密码验证正确则可成功修改 { system("cls");//清屏 system("color F");//字体颜色为亮白色 char str[18]; FILE*fp; if((fp=fopen("password","r"))==NULL)//只用读,用r打开stu文件 { printf("cannot open file"); exit(0); } fgets(str,18,fp);//从fp指向的password文件读入字符串,存放到字符数组str中 fclose(fp); do { system("cls");//清屏 char password[18],newpassword[18],c,t; int i=0; toxy(15,6); printf("学生管理系统"); toxy(15,8); printf("修改密码"); toxy(15,10); printf("请输入旧密码:"); for(;;)//此处为密码不回显操作 { c=getch(); if(c==\'\r\')//如果输入为回车键 { break; } else if(c==\'\b\')//如果输入c为删除键 { if(i>0) //如果密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果输入的c既不是删除键,也不是回车键 { password[i]=c; printf("*"); i++; } } password[i]=\'\0\';//在字符串结尾作结束符标记 i=0; toxy(15,12); printf("请输入新密码:"); for(;;)//此处为输入密码不回显操作 { c=getch(); if(c==\'\r\') //如果输入c为回车,则跳出循环 { break; } else if(c==\'\b\')//如果输入c为删除键 { if(i>0)//如果密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i--; } } else { newpassword[i]=c; printf("*"); i++; } } newpassword[i]=\'\0\';//在字符串结尾作结束符标记 if(strcmp(str,password)==0)//如果旧密码与原来密码验证成功 { save_password(newpassword);//保存新密码 system("cls");//清屏 toxy(15,6); printf("修改成功,即将返回主菜单……"); Sleep(600); menu(); } else { system("cls");//清屏 toxy(15,8); printf("-------------------------------------"); toxy(15,9); printf("| |"); toxy(15,10); printf("| 密码错误!是否继续? |"); toxy(15,11); printf("| |"); toxy(15,12); printf("| 1.是 2.否 |"); toxy(15,13); printf("| |"); toxy(15,14); printf("-------------------------------------"); while(1) { t=getch(); if(t==\'1\') { system("cls");//清屏 break; } else if(t==\'2\') { menu(); } } } }while(1); } int main() { load(); return 0; }
5.程序的运行效果图
6.总结与展望
完成了该课程设计后,对文件的输入输出有了更深一层的了解。还学会了利用windows.h函数库里的system函数去进行
清屏-system("cls"),
延时-Sleep(),
设置字体颜色-system("color X")
删除文件-system("DEL XX")
复制文件-system("copy X1 X2")
虽然较为成功地完成了课程设计,但由于知识和时间的局限性,系统仍然存在缺陷。我认为此系统还可以链接数据库,增加用户权限等,这样能够使系统更具有实用性。