收藏 分销(赏)

简单学生管理系统设计.doc

上传人:a199****6536 文档编号:1506029 上传时间:2024-04-29 格式:DOC 页数:20 大小:165KB 下载积分:10 金币
下载 相关 举报
简单学生管理系统设计.doc_第1页
第1页 / 共20页
简单学生管理系统设计.doc_第2页
第2页 / 共20页


点击查看更多>>
资源描述
广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2011 年12月28日 学院 计算机科学于教育软件学院 年级/专业/班 计算机02 姓名 杨华奇 学号 1006100096 实验课程名称 程序设计课程设计 成绩 实验项目名称 简单学生管理系统设计 指导老师 田际平 王建雄 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 一、实验目的 通过本课程的教学实践,使学生达到加深对计算机高级语言程序设计特点、结构化程 序设计方法和面向对象程序设计的理解、提高学生对可视化编程的动手能力之目的 二、 实验内容 “简单学生管理系统设计” 1. 系统功能简介:本系统有包括7个主要功能供给用户,用于管理学生信息。输入和储存学生信息 用户可以使用系统储存学生信息,包括学生姓名,学号,性别,成绩(物理,英语,数学,计算机导论,C程序) 2. 查看学生信息 通过使用系统可以查看已统计好的学生信息 3. 学生成绩统计: 使用系统可以浏览学生已排好的成绩统计,包括名次,总分,平均分,最高和最低分。 4. 查找学生信息: 使用系统可以浏览单个学生的信息,分为按学号和姓名查找。 5. 修改学生信息:当学生信息有误时就可以通过系统来修改。 6. 删除学生信息:使用系统可以要删除某个学生信息。 7. 增加学生信息:不能在第一个功能上增加学生信息,只能在这个功能上实现。 8. 退出。 系统主程序 退 出 输入和储存学生信息 查 看 学 生 信 息 学 生 成 绩 统 计 查 找 学 生 信 息 修 改 学 生 信 息 删 除 学 生 信 息 增 加 学 生 信 息 按学生学号查找 按学生姓名查找 三、实验原理 本设计内容可用程序设计基础方法完成,参考程序设计课程设计实验指导书 四、实验设备 软件Visual Studio 2010 五、实验要求 必修 六、 实验程序 #include "StdAfx.h" #include <iostream> #include <fstream> #include <cstring> using namespace std; //全局量 int n=0; int nk=0; char *filename; long num[1000]; int work_l=0; int level = 1; int build = 0; fstream f; //成绩类 struct student { public: //个人信息 char name[20]; char sex[10]; long number; //各科成绩变量 float m_english; float m_math; float m_computer; float m_programming; float m_phisic; float m_total; float m_reverage; float m_highest; float m_lowest; }s; // 1.11 求平均分 void reverage(student &st) { st.m_reverage = st.m_total/5; } //1.12 求总分 void total(student &st) { st.m_total = st.m_math + st.m_english + st.m_computer + st.m_programming + st.m_phisic; reverage(st); } //1.13 显示各科成绩 void s_show(student &st) { cout << "\t英语\t数学\t物理\t导论\t程序\t"<< "总分\t" << "平均分\n";; cout << "\t" << st.m_english << '\t' << st.m_math << '\t' << st.m_phisic << '\t' << st.m_computer << '\t' << st.m_programming <<'\t'; cout << st.m_total << "\t" << st.m_reverage <<endl<<endl<<endl; } //1.2 显示数据函数 void show(student &st) { if(work_l==1&&level<=n) { cout << "名次:" << level << endl; ++level; } cout << "\t姓名\t性别\t学号\n"; cout << "\t"<< st.name << "\t" << st.sex << "\t" << st.number<<endl <<endl; s_show(st); } //1.3 判断成绩十分符合逻辑 float judge(float grade ) { if(!(grade>=0&&grade<=150)) { cout << "成绩不符合要求!请输入0~150之间的数。\n"; cin >> grade; } return grade; } //判断学号是否重复 long judge1(long s_num) { if(nk) { int work01 = 1; int l = 0; for(;l<nk;++l) { if(s_num==num[l]) { cout << "学号重复!重新输入学号:"; cin >> s_num; num[nk] = s_num; s_num = judge1(s_num); work01 = 0; } else work01 = 1; } if(work01==1) { return s_num; } } return s_num; } //1.4 输入 void input(student &st) { int sex; char *ss; //输入各项信息 cout << "姓名:"; cin >> st.name; cout << "学号:"; //输入学号。 cin >> st.number; num[nk] = st.number; st.number = judge1(st.number); cout << "性别(男:1,女:0):"; cin >> sex; if(sex==1) ss = "男"; else if(sex==0) ss = "女"; else ss ="未知"; strcpy_s(st.sex,ss); cout << "英语:"; cin >> st.m_english; st.m_english = judge(st.m_english); cout << "数学:"; cin >> st.m_math; st.m_math = judge(st.m_math); cout << "物理:"; cin >> st.m_phisic; st.m_phisic = judge(st.m_phisic); cout << "导论:"; cin >> st.m_computer; st.m_computer = judge(st.m_computer); cout << "程序:"; cin >> st.m_programming; st.m_programming = judge(st.m_programming); cout << endl << endl; total(st); f.write((char*)&st,sizeof(student)); } //1.5 判断是否已经创建操作员输入的文件名的文件 int judge() { if(!build) { cout << "还未创建文件!请重新选择操作!" << endl; return 0; } else return 1; } //1.5 写入信息 void set() { cout << "人数:"; cin >> n; //打开文件 f.open(filename,ios::out); for(int i = 0;i<n;++i) { nk = i; input(s); } //表明已经创建了文件 build = 1; //关闭文件 f.close(); } //2 浏览 void skim(student &st) { int work0 = 1; work0 = judge(); if(work0==0) { return; } f.open(filename,ios::in); if(!f) { cerr << "打不开文件。\n"; abort(); } //移动流指针到文件头 f.seekg( 0,ios::beg ); for(int i = 0;i<n;++i) { f.read((char*)&st,sizeof(student)); cout << "第" << i+1 <<"个人\n"; show(st); } f.close(); } //3 统计 void manage() { int work0 = 1; work0 = judge(); if(work0 == 0) { return; } f.open(filename,ios::in|ios::out); if(!f) { cerr << "打不开文件。\n"; abort(); } //将真值赋给名次工作机制判断变量 work_l = 1; //移动流指针到文件头 f.seekg( 0,ios::beg ); student *temp = new student[n]; int work; for(int i = 0;i<n;++i) { f.read((char*)&temp[i],sizeof(student)); } //对数组排序 for(int pass = 1;pass < n;++pass) { work = 0; int p =0; for(p;p < n-pass;++p) if(temp[p].m_total<temp[p+1].m_total) { student st; //比较总分,进行相应操作 st = temp[p]; temp[p] = temp[p+1]; temp[p+1] = st; work = 0; } //若没有重新排序则证明已排序好,退出当前操作 if(work) break; } f.seekp(0,ios::beg); for(int p = 0;p<n;++p) f.write((char*)&temp[p],sizeof(student)); f.close(); //浏览统计后的数据信息 skim(s); if(n) { cout << "最高分为:" <<endl<<endl; show(temp[0]); cout << "最低分为:" <<endl<<endl; show(temp[n-1]); } delete (temp); } //4 查找 void find() { //judge(); int work0 = 1; work0 = judge(); if(work0 == 0) { return; } f.open(filename,ios::in); if(!f) { cerr << "打不开文件。\n"; abort(); } //声明本函数需要用到的变量 int work = 0; char name[20]; unsigned long num; int choice; cout << "---按姓名查找:0---" << endl << "---按学号查找: 1---" << endl; cin>>choice; //选择用户及其信息来操作 if(choice==0) { cout << "输入目标学生姓名:"; cin >> name; } else if(choice==1) { cout << "输入目标学生学号:"; cin >> num; } else {cout << "操作错误!\n";f.close();return;} //移动流指针到文件头 f.seekg( 0,ios::beg ); for(int i = 0;i<n;++i) { f.read((char*)&s,sizeof(student)); switch(choice) { case 0: if(!strcmp(name,s.name)) { cout << "信息找到!\n"; show(s); work = 1; break; case 1: if(num==s.number) { cout << "信息找到!\n"; show(s); work = 1; break; } default:;break; } } } if(!work) { cout << "找不到该学生信息!\n"; } f.close(); } //5 修改 void correct() { int work0 = 1; work0 = judge(); if(work0==0) { return; } f.open(filename,ios::in); if(!f) { cerr << "打不开文件。\n"; abort(); } int work = 0; int work_correct = 0; int ch; int i = 0; unsigned long num1; student *temp = new student[n]; //移动流指针到文件头 f.seekg( 0,ios::beg ); for(i;i<n;++i) { f.read((char*)&temp[i],sizeof(student)); } f.close(); cout << "输入目标学生学号:"; cin >> num1; //已删除现有内容的方式打开文本 f.open(filename,ios::trunc|ios::out); if(!f) { cerr << "打不开文件。\n"; abort(); } for(i=0;i<n;++i) { if(temp[i].number == num1) { work_correct = 1; cout << "信息找到!\n"; work = 1; cout<< "*****选择需要修改的数据***** \n" << "***** 1: 姓 名 ***** ***** \n" << "***** 2: 学 号 ***** ***** \n" << "***** 3: 性 别(男:1,女:0) \n" << "***** 4: 英 语 ***** ***** \n" << "***** 5: 数 学 ***** ***** \n" << "***** 6: 物 理 ***** ***** \n" << "***** 7: 导 论 ***** ***** \n" << "***** 8: 程 序 ***** ***** \n" << endl; cin >> ch; int sex; char *s; //重新输入需要修改的数据 switch(ch) { case 1:cin >> temp[i].name;break; case 2: { for(int m = 0;m<n;++m) if(num[m] == temp[i].number) num[m] = -1000; nk = n; cin >> temp[i].number; num[n] = temp[i].number; temp[i].number = judge1(temp[i].number); break; } case 3: { cin >> sex; if(sex) s = "男"; else s = "女"; strcpy_s(temp[i].sex,s); break; } case 4:cin >> temp[i].m_english;break; case 5:cin >> temp[i].m_math;break; case 6:cin >> temp[i].m_phisic;break; case 7:cin >> temp[i].m_computer;break; case 8:cin >> temp[i].m_programming;break; default :cout << "操作错误!\n";break; } total(temp[i]); } f.write((char*)&temp[i],sizeof(student)); } if(!work) { cout << "找不到该学生信息!\n"; } delete(temp); f.close(); } //6 删除 void del() { int work0 = 1; work0 = judge(); if(work0==0) { return; } f.open(filename,ios::in); if(!f) { cerr << "打不开文件。\n"; abort(); } //声明该函数需要的一些变量 int work = 0; unsigned long num1; int i = 0; student *temp = new student[n]; //移动流指针到文件头 f.seekg( 0,ios::beg ); for(i;i<n;++i) { //读出信息给一个结构数组中 f.read((char*)&temp[i],sizeof(student)); } f.close(); cout << "输入目标学生学号:"; cin >> num1; //已删除现有内容的方式打开文本 f.open(filename,ios::trunc|ios::out); if(!f) { cerr << "打不开文件。\n"; abort(); } //重新写入 int nn = n; for(i=0;i<nn;++i) { if(temp[i].number == num1) { char ch2; cout << "要删除的信息找到了,是否要删除?\n"; show(temp[i]); cout << "是:Y,否:N:"; cin >> ch2; if(ch2=='y'||ch2=='Y') { num[i] = -1000; cout << "信息已删除!\n"; --n; nk = n; } else f.write((char*)&temp[i],sizeof(student)); work = 1; } else f.write((char*)&temp[i],sizeof(student)); } if(!work) { cout << "找不到该学生信息!\n"; } //取消名次操作变量的真值状态 work_l = 0; delete(temp); f.close(); } //7 增加 void add() { int work0 = 1; work0 = judge(); if(work0==0) { return; } f.open(filename,ios::app); if(!f) { cerr << "打不开文件。\n"; abort(); } student st; f.seekp(0,ios::end); //调用输入信息函数 nk = n; input(st); ++n; //取消名次操作变量的真值状态 work_l = 0; f.close(); } int _tmain() { cout<< "\t\t\t********************\n" << "\t\t\t* *\n" << "\t\t\t* 学生管理系统 *\n" << "\t\t\t* *\n" << "\t\t\t********************\n" << endl; char choice; filename = "E:\\student.txt"; cout << filename << endl; //输入信息 while(1) { cout<< "\t\t\t*******选择操作*******\n\n" << "\t\t\t*i: 输入&储存学生信息*\n" << "\t\t\t*s: 查 看 学 生 信 息*\n" << "\t\t\t*m: 学 生 成 绩 统 计*\n" << "\t\t\t*f: 查 找 学 生 信 息*\n" << "\t\t\t*c: 修 改 学 生 信 息*\n" << "\t\t\t*d: 删 除 学 生 信 息*\n" << "\t\t\t*a: 增 加 学 生 信 息*\n" << "\t\t\t*q: 退 出*************\n"; cin >> choice; if(choice>=65&&choice<=90) choice +=32; switch(choice) { case 'i':set();break; case 's':skim(s);break; case 'm':manage();break; case 'f':find();break; case 'c':correct();break; case 'd':del();break; case 'a':add();break; case 'q':exit(0);break; default:cout << "操作错误!" << endl;break; } } return 0; } 截图: 写入:void set(); 查看:void skim(); 统计:void manage(); 姓名查找:void find(); 学号查找:void find(); 修改:void correct(); 修改后再查看 删除:void del(); 增加:void add(); 退出: 七、总结心得 1:对IO流的操作中,要时刻注意是否打开的文本在用完后是否关闭了,否则很容易出错。 2:对IO流指针的赋值和流对象的引用要谨慎,否则会导致数据传输的乱码和错误。就比如这个程序中,刚开始时的查找信息函数由于流对象f的传输不仔细,把f引用到输出函数后不知道在哪里出错了,导致了查找并判断信息是否符合要求时,输出的数据并不是要查找的数据。 3. 对输入相同数据的删除处理不好会出现乱码。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服