标签:
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp * 作 者:赵志君 * 完成时间:2016年6月30日 * 版 本 号:v1.0 * * 问题描述:学生信息管理系统 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <iostream> #include <fstream> using namespace std; #define N 50 //数据量 int m = 0; struct Student ///结构体 { int number; //学号 结构: 年纪-班级-编号 char name[20]; //姓名 int age; //年龄 char sex; //性别 char birthday[20]; //出生日期 char address[20]; //地址 char tel[20]; //电话 char eMail[20]; //E-mail }stu[N]; void sift(int *grade,int *classGrade,int *number) ///拆分学号 { for(int j=0;j<m;j++) { int temp=stu[j].number,t=0; for(int i=0;i<8;i++) //学号倒置 { t=temp%10+t*10; temp=temp/10; } //分离出年级 grade[j]=0; for(int i=0;i<4;i++) { grade[j]=grade[j]*10+t%10; t=t/10; } //分离出班级 classGrade[j]=0; for(int i=0;i<2;i++) { classGrade[j]=classGrade[j]*10+t%10; t=t/10; } //分离出编号 number[j]=0; for(int i=0;i<2;i++) { number[j]=number[j]*10+t%10; t=t/10; } } } void rank_information() ///信息按学号进行排序 { Student temp; for(int i=0; i<m-1; i++) { for(int j=i+1; j<m; j++) { if(stu[i].number>stu[j].number) { temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } } } } void showInfo(int i) ///信息显示 { printf("\n学号:%7d 姓名:%s\n",stu[i].number,stu[i].name); printf("年龄:%-7d 性别:%c\n",stu[i].age,stu[i].sex); printf("出生日期:%s\n",stu[i].birthday); printf("地址:%s\n",stu[i].address); printf("电话:%s\n",stu[i].tel); printf("E-mail:%s\n",stu[i].eMail); } void save() ///信息写入文件 先排序 后写入 { rank_information(); //排序 ofstream outfile("Student.txt"); for(int i=0; i<m; i++) { outfile<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].sex <<" "<<stu[i].birthday<<" "<<stu[i].address<<" "<<stu[i].tel<<" "<<stu[i].eMail; if(i!=m-1) outfile<<endl; if(m==0) break; } outfile.close(); } void input_information() ///信息录入 { printf("注:学号必须输入,没有的信息请用“ 0 ”替代。\n"); printf("请输入要录入的学生信息\n 学号 姓名 年龄 性别 出生日期 地址 电话 E-mail\n"); scanf("%d %s %d %c %s %s %s %s",&stu[m].number,stu[m].name,&stu[m].age,&stu[m].sex, stu[m].birthday,stu[m].address,stu[m].tel,stu[m].eMail); if(m==0) { m++; save(); printf("信息写入文件成功!\n"); printf("输入任意键继续:"); getch(); return; } for(int i=0; i<m; i++) { if(stu[i].number==stu[m].number) { printf("此学生已存在,请确认信息后再录入!\n"); return; } else if(i==m-1) { m++; save(); printf("信息写入文件成功!\n"); printf("输入任意键继续:"); getch(); return; } } } void showInformation() ///筛选查询信息 { int n,a,k1,k2,k3; char ch[2],c,dizhi[10]; while(1) { system("cls"); printf("\n\t\t\t***************************************************************\n"); printf("\t\t\t********* 1.学号筛选 4.性别筛选 *********\n"); printf("\t\t\t********* 2.姓名筛选 5.地址筛选 *********\n"); printf("\t\t\t********* 3.年龄筛选 6.全部显示 *********\n"); printf("\t\t\t********* 0.退出 *********\n"); printf("\t\t\t***************************************************************\n"); printf("请输入您要筛选的方式:"); while(1) { scanf("%d",&n); fflush(stdin); //防输错 if(n>=0 && n<=7) break; printf("输入有误,请重新输入筛选方式:"); } switch(n) { case 0: return; case 1: system("cls"); printf("\n\t\t\t***************************************************************\n"); printf("\t\t\t********* 1.年级 5.年级+编号 *********\n"); printf("\t\t\t********* 2.班级 6.年级+班级+编号 *********\n"); printf("\t\t\t********* 3.编号 7.范围筛选 *********\n"); printf("\t\t\t********* 4.年级+班级 0.退出 *********\n"); printf("\t\t\t***************************************************************\n"); printf("请输入您要筛选的方式:"); while(1) { scanf("%d",&a); fflush(stdin); //防输错 if(n>=0 && n<=7) break; printf("输入有误,请重新输入筛选方式:"); } int grade[N],classGrade[N],number[N]; sift(grade,classGrade,number); switch(a) { case 0: break; case 1: printf("请输入您要筛选的年级:"); scanf("%d",&k1); for(int i=0; i<m; i++) { if(grade[i]==k1) { showInfo(i); } } break; case 2: printf("请输入您要筛选的班级:"); scanf("%d",&k1); for(int i=0; i<m; i++) { if(classGrade[i]==k1) { showInfo(i); } } break; case 3: printf("请输入您要筛选的编号:"); scanf("%d",&k1); for(int i=0; i<m; i++) { if(number[i]==k1) { showInfo(i); } } break; case 4: printf("请输入您要筛选的年级和班级:"); scanf("%d%d",&k1,&k2); for(int i=0; i<m; i++) { if(grade[i]==k1 && classGrade[i]==k2) { showInfo(i); } } break; case 5: printf("请输入您要筛选的年级和编号:"); scanf("%d%d",&k1,&k2); for(int i=0; i<m; i++) { if(grade[i]==k1 && number[i]==k2) { showInfo(i); } } break; case 6: printf("请输入您要筛选的年级、班级和编号:"); scanf("%d%d%d",&k1,&k2,&k3); for(int i=0; i<m; i++) { if(grade[i]==k1 && classGrade[i]==k2 && number[i]==k3) { showInfo(i); } } break; case 7: printf("请输入您要筛选的范围(a<b):"); scanf("%d%d",&k1,&k2); for(int i=0; i<m; i++) { if(stu[i].number>=k1 && stu[i].number<=k2) { showInfo(i); } } break; default: printf("指令错误!"); } break; case 2: char ch[2]; printf("请输入您要筛选的姓氏:"); cin>>ch; for(int i=0; i<m; i++) { if(ch[0]==stu[i].name[0] && ch[1]==stu[i].name[1]) showInfo(i); } break; case 3: system("cls"); printf("\n\t\t\t***************************************************************\n"); printf("\t\t\t********* 1.具体年龄 2.年龄范围 *********\n"); printf("\t\t\t***************************************************************\n"); printf("请输入您要筛选类型:"); scanf("%d",&k1); if(k1==1) { printf("请输入您要筛选的年龄:"); scanf("%d",&k2); for(int i=0; i<m; i++) { if(k2==stu[i].age) showInfo(i); } } else if(k1==2) { printf("请输入您要筛选的年龄范围(a<b):"); scanf("%d%d",&k2,&k3); for(int i=0; i<m; i++) { if(stu[i].age>=k2 && stu[i].age<=k3) showInfo(i); } } break; case 4: printf("请输入您要筛选的性别:"); scanf("%c",&c); for(int i=0; i<m; i++) { if(c==stu[i].sex) { showInfo(i); } } break; case 5: printf("请输入您要筛选的地址:"); cin>>dizhi; for(int i=0; i<m; i++) { if(!strcmp(dizhi,stu[i].address)) { showInfo(i); } } break; case 6: for(int i=0; i<m; i++) { showInfo(i); } break; } printf("输入任意键继续:"); getch(); } } void query() ///精准查询信息 { int k,num; char nam[20]; if(m>0) { system("cls"); printf("\n\t\t\t***************************************************************\n"); printf("\t\t\t********* 1.按学号查询 4.按邮箱查询 *********\n"); printf("\t\t\t********* 2.按姓名查询 0.退出 *********\n"); printf("\t\t\t********* 3.按电话查询 *********\n"); printf("\t\t\t***************************************************************\n"); printf("请输入指令:"); while(1) { scanf("%d",&k); fflush(stdin); //防输错 if(k>=0 && k<=4) break; printf("输入指令有误,请重新输入指令:"); } while(1) { if(k==0) return; else if(k==1) //按学号查询学生信息 { printf("请输入要查询的学号:"); scanf("%d",&num); if(num==0) return; for(int i=0; i<m; i++) { if(stu[i].number==num) { showInfo(i); printf("输入任意键继续:"); getch(); return; } else if(i==m-1) printf("未查到该学生信息!\n"); } } else if(k==2) //按姓名查询学生信息 { printf("请输入要查询的学生姓名:"); scanf("%s",nam); if(nam[0]=='0') return; for(int i=0; i<m; i++) { if(!strcmp(nam,stu[i].name)) { showInfo(i); printf("输入任意键继续:"); getch(); return; } else if(i==m-1) printf("未查到该学生信息\n"); } } else if(k==3) //按电话查询学生信息 { printf("请输入要查询的学生电话:"); scanf("%s",nam); if(nam[0]=='0') return; for(int i=0; i<m; i++) { if(!strcmp(nam,stu[i].tel)) { showInfo(i); printf("输入任意键继续:"); getch(); return; } else if(i==m-1) printf("未查到该学生信息\n"); } } else if(k==4) //按邮箱查询学生信息 { printf("请输入要查询的学生邮箱:"); scanf("%s",nam); if(nam[0]=='0') return; for(int i=0; i<m; i++) { if(!strcmp(nam,stu[i].eMail)) { showInfo(i); printf("输入任意键继续:"); getch(); return; } else if(i==m-1) printf("未查到该学生信息\n"); } } else printf("请输入正确的指令!"); } } else printf("系统无数据!\n"); } void delate() ///删除学生信息 { int num,i,k; printf("请输入您要删除的学生学号:"); scanf("%d",&num); for(i=0; i<m; i++) { if(stu[i].number==num) { while(1) { showInfo(i); printf("确认删除此学生信息? 1.确认 2.取消\n"); scanf("%d",&k); if(k==1) { for(int j=i; j<m-1; j++) stu[j]=stu[j+1]; m--; save(); printf("学生信息删除成功!\n"); return; } else if(k==2) break; else printf("请输入正确的指令!\n"); } } else if(i==m-1) printf("不存在该学生信息!\n"); } } void information_changes() ///学生信息的修改 { int num,k; char ch[20],s; while(1) { printf("请输入您要修改的学生学号:"); scanf("%d",&num); fflush(stdin); if(num==0) return; for(int i=0; i<m; i++) { if(stu[i].number==num) { showInfo(i); printf("1、学号 2、姓名 3、年龄 4、性别\n"); printf("5、出生日期 6、地址 7、电话 8、E-mail 0、退出\n"); printf("请输入您要修改的内容:"); while(1) { scanf("%d",&k); fflush(stdin); //防输错 if(k>=0 && k<=5) break; printf("输入指令有误,请重新"); printf("输入您的指令:"); } switch(k) { case 0: return; case 1: printf("请输入要修改的学号:"); scanf("%d",&num); stu[i].number=num; break; case 2: printf("请输入要修改的姓名:"); scanf("%s",ch); strcpy(stu[i].name,ch); break; case 3: printf("请输入要修改的年龄:"); scanf("%d",&num); stu[i].age=num; break; case 4: printf("请输入要修改的性别:"); scanf("%c",&s); stu[i].sex=s; break; case 5: printf("请输入要修改的出生日期:"); scanf("%s",ch); strcpy(stu[i].birthday,ch); break; case 6: printf("请输入要修改的地址:"); scanf("%s",ch); strcpy(stu[i].address,ch); break; case 7: printf("请输入要修改的电话:"); scanf("%s",ch); strcpy(stu[i].tel,ch); break; case 8: printf("请输入要修改的E-mail:"); scanf("%s",ch); strcpy(stu[i].eMail,ch); break; } if(k>=0 && k<=8) { printf("信息修改成功!\n"); save(); printf("输入任意键继续:"); getch(); } return; } else if(i==m-1) { printf("不存在该学生信息!\n"); break; } } } } int main() { int n,z=1; ifstream infile("Student.txt"); ///文件内无内容会出错 if(!infile) { cout<<"没有数据文件!\n"; ofstream outfile("Student.txt"); outfile.close(); } else { int i = 0; while(!infile.eof()) { infile>>stu[i].number>>stu[i].name>>stu[i].age>>stu[i].sex >>stu[i].birthday>>stu[i].address>>stu[i].tel>>stu[i].eMail; m++; ++i; } infile.close(); save(); } while(1) //主系统部分 { if(z!=1) //第一次不出现 { system("cls"); //清空界面 } printf("\n\t\t\t***************************************************************\n"); printf("\t\t\t************ Student Management Information System ************\n"); printf("\t\t\t***************************************************************\n"); printf("\t\t\t********* 1.输入信息 4.删除信息 *********\n"); printf("\t\t\t********* 2.筛选查找信息 5.修改信息 *********\n"); printf("\t\t\t********* 3.精准查找信息 0.退出系统 *********\n"); printf("\t\t\t***************************************************************\n"); printf("\t\t\t********************* 系统已有学生数: %2d *********************\n",m); printf("\t\t\t***************************************************************\n"); printf("输入您的指令:"); z=2;//清屏 while(1) { scanf("%d",&n); fflush(stdin); //防输错 if(n>=0 && n<=5) break; printf("输入指令有误,请重新输入您的指令:"); } switch(n) { case 0: break; case 1: input_information(); break; case 2: showInformation(); break; case 3: query(); break; case 4: delate(); break; case 5: information_changes(); break; default: printf("请输入 0-5 命令\n"); } if(n==0) break; } return 0; }
附:测试数据
20153123 孙芳 20 F 1996.9.1 上海 17853539999 sun123@163.com
20164101 张三 18 F 1998.7.1 烟台 17853535555 zhang123@163.com
20154101 王五 18 F 1993.8.1 济南 17853535555 wang123@163.com
20165215 赵子琳 22 M 1994.10.1 潍坊 17853537777 zhao123@163.com
20153223 秦含含 20 M 1996.9.1 北京 17853539999 qin123@163.com
20155215 刘志 22 M 1994.10.1 临沂 17853531111 liu123@163.com
20164105 张也 19 M 1992.8.1 大连 17853542222 zhang1234@163.com
20154116 孙超 16 1998.11.11 南京 17853543333 sun1234@qq.com
20154105 李四 19 M 1997.9.1 德州 17853536666 li123@163.com
心得体会:
此程序最大的特点是运用C++将系统数据和本地文件实现了对等同步,但还存在很大的不足,需要后期的不断完善。
注:对错误指令的处理有待完善,错误数据无法检测。
在文件为空时会在文件中产生乱码,影响数据分析。
标签:
原文地址:http://blog.csdn.net/zhao960803/article/details/51790758