资源描述
广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室 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. 对输入相同数据的删除处理不好会出现乱码。
展开阅读全文