1、广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2011 年12月28日 学院 计算机科学于教育软件学院 年级/专业/班 计算机02 姓名 杨华奇 学号 1006100096 实验课程名称 程序设计课程设计 成绩 实验项目名称 简单学生管理系统设计 指导老师 田际平 王建雄 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 一、实验目的 通过本课程的教学实践,使学生达到加深对计算机高级语言程序设计特点、结构化程 序设计方法和面向对象程序设
2、计的理解、提高学生对可视化编程的动手能力之目的 二、 实验内容 “简单学生管理系统设计” 1. 系统功能简介:本系统有包括7个主要功能供给用户,用于管理学生信息。输入和储存学生信息 用户可以使用系统储存学生信息,包括学生姓名,学号,性别,成绩(物理,英语,数学,计算机导论,C程序) 2. 查看学生信息 通过使用系统可以查看已统计好的学生信息 3. 学生成绩统计: 使用系统可以浏览学生已排好的成绩统计,包括名次,总分,平均分,最高和最低分。 4. 查找学生信息: 使用系统可以浏览单个学生的信息,分为按学号和姓名查找。 5. 修改学生信息:当学生信息有误时就可以通过系
3、统来修改。 6. 删除学生信息:使用系统可以要删除某个学生信息。 7. 增加学生信息:不能在第一个功能上增加学生信息,只能在这个功能上实现。 8. 退出。 系统主程序 退 出 输入和储存学生信息 查 看 学 生 信 息 学 生 成 绩 统 计 查 找 学 生 信 息 修 改 学 生 信 息 删 除 学 生 信 息 增 加 学 生 信 息 按学生学号查找 按学生姓名查找 三、实验原理 本设计内容可用程序设计基础方法完成,参考程序设计课程设计实
4、验指导书
四、实验设备
软件Visual Studio 2010
五、实验要求
必修
六、 实验程序
#include "StdAfx.h"
#include
5、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 reverag
6、e(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" << "平均分
7、\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 < 8、 << level << endl;
++level;
}
cout << "\t姓名\t性别\t学号\n";
cout << "\t"<< st.name << "\t" << st.sex << "\t" << st.number< 9、
return grade;
}
//判断学号是否重复
long judge1(long s_num)
{
if(nk)
{
int work01 = 1;
int l = 0;
for(;l 10、 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);
11、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 << "物理: 12、";
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(stu 13、dent));
}
//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 14、nput(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 << "打不开文件。\ 15、n";
abort();
}
//移动流指针到文件头
f.seekg( 0,ios::beg );
for(int i = 0;i 16、
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 17、p[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 18、
//若没有重新排序则证明已排序好,退出当前操作
if(work)
break;
}
f.seekp(0,ios::beg);
for(int p = 0;p 19、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、[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.cl 21、ose();return;}
//移动流指针到文件头
f.seekg( 0,ios::beg );
for(int i = 0;i 22、 {
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); 23、
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 24、sizeof(student));
}
f.close();
cout << "输入目标学生学号:";
cin >> num1;
//已删除现有内容的方式打开文本
f.open(filename,ios::trunc|ios::out);
if(!f)
{
cerr << "打不开文件。\n";
abort();
}
for(i=0;i 25、
cout << "信息找到!\n";
work = 1;
cout<< "*****选择需要修改的数据***** \n"
<< "***** 1: 姓 名 ***** ***** \n"
<< "***** 2: 学 号 ***** ***** \n"
<< "***** 3: 性 别(男:1,女:0) \n"
<< "***** 4: 英 语 ***** ***** \n"
<< "***** 5: 数 学 ***** ***** \n"
<< "***** 6: 物 理 ***** * 26、 \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 27、ber)
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; 28、
}
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.wr 29、ite((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" 30、
abort();
}
//声明该函数需要的一些变量
int work = 0;
unsigned long num1;
int i = 0;
student *temp = new student[n];
//移动流指针到文件头
f.seekg( 0,ios::beg );
for(i;i 31、
cin >> num1;
//已删除现有内容的方式打开文本
f.open(filename,ios::trunc|ios::out);
if(!f)
{
cerr << "打不开文件。\n";
abort();
}
//重新写入
int nn = n;
for(i=0;i 32、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(!w 33、ork)
{
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(); 34、
}
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* 35、 *\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"
36、 << "\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':s 37、kim(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(); 38、
姓名查找:void find();
学号查找:void find();
修改:void correct();
修改后再查看
删除:void del();
增加:void add();
退出:
七、总结心得
1:对IO流的操作中,要时刻注意是否打开的文本在用完后是否关闭了,否则很容易出错。
2:对IO流指针的赋值和流对象的引用要谨慎,否则会导致数据传输的乱码和错误。就比如这个程序中,刚开始时的查找信息函数由于流对象f的传输不仔细,把f引用到输出函数后不知道在哪里出错了,导致了查找并判断信息是否符合要求时,输出的数据并不是要查找的数据。
3. 对输入相同数据的删除处理不好会出现乱码。






