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