从开学到现在,老师叫我们用C++编写了几个程序,现在贴一个上来,是关于学生信息管理的。其中代码的“骨架”是从网上找的,自己也加工了下,里面也有很多自己的心血,主要是增加了输入数据的合法性,还有变得更加人性化吧。代码如下:
# include
# include
# include
# include
# include
# include
using namespace std;
//*****定义一个学生原子的的数据结构*****//
struct stuatom
{
char *name;
int id;
char sex;
float math, eng, comp, totll, aver;
void show();
void setup();
};
//*********定义一系列对学生的操作**********//
class student
{
private:
stuatom ob[100];
int stulen;
public:
student();
void input();
void order();
void save();
void check();
void clean();
void query();
void read();
void add();
void del();
void modify();
};
//********对学生数据的初始化(类的构造函数)**********//
student::student()
{
//用for循环对全部数组中的数据初始化
for(int i=0;i <100;i++)
{
ob[i].math=ob[i].eng=ob[i].comp =ob[i].totll =ob[i].aver =0;
ob[i].id =0;
ob[i].sex =' ';
ob[i].name =NULL;
}
this->stulen =0;
}
//********输入学生的数据,并判断是否在规定数据域内*******//
void stuatom::setup()
{
char n[20]; char s;
int b;
//如果输入学号在数据域内,跳出循环并且赋值。
//如果不在数据域内,一直循环到输入数据符合数据域为止
do
{
cout<<" 学号(1001与1020之间): ";
cin>>b;
if(b>1020||b <1001)
cout<<" 数据有误!!重新输入.."<
id=b;
//如果输入姓名在数据域内,跳出循环并且赋值。
//如果不在数据域内,一直循环到输入数据符合数据域为止
do
{
name=new char[strlen(n)+1];
cout<<" 姓名: ";
cin>>n;
/*if( strlen(n)>6 || strlen(n) <4 )
cout<<"Bad data input!!" <
strcpy(name,n);
cout<<" 性别(m/f):" ;
cin>>s;
//如果输入性别在数据域内,跳出循环并且赋值。
//如果不在数据域内,一直循环到输入数据符合数据域为止
while (s!='m' && s!='f')
{
cout<<" 数据有误!!重新输入.."<
cin>>s;
}
sex=s;
float m, e, co;
cout<<" 数学(0-100): ";
cin>>m;
//如果输入成绩在数据域内,跳出循环并且赋值。
//如果不在数据域内,一直循环到输入数据符合数据域为止
while (m <0 || m>100)
{
cout<<" 数据有误!!重新输入.."<
cin>>m;
}
math=m;
cout<<" 英语(0-100): ";
cin>>e;
while (e <0 || e>100)
{
cout<<" 数据有误!!重新输入.."<
cin>>e;
}
eng=e;
cout<<" C++(0-100): ";
cin>>co;
while (co <0 || co>100)
{
cout<<" 数据有误!!重新输入.."<
cin>>co;
}
comp=co;
totll=math+eng+comp;
aver=(math+eng+comp)/3;
}
//*******按照规定格式把该学生的数据显示在屏幕上******//
void stuatom::show()
{
cout.setf(ios::left);
cout.width(6);
cout<<""<
cout<
cout<
cout<
//**************输入学生的数据***********************//
void student::input()
{
int n;
cout <
int j,i;
//通过循环输入要求输入学生个数的学生的数据。
for(j=(this->stulen+1) ; j <=(this->stulen+n); j++)
{
cout <<" 输入学生信息 " <
}
//检查学号是否有重复
int a[100];
int b=0,c=0,d;
char Y;
if(this->stulen!=0)
{
for (i=0;i
{
for(j=this->stulen ;j<(this->stulen+n);j++)
{
if (ob[i].id==ob[j].id)
{
if (c==0) //c只是为了美观而已。。
{
cout<<" 错误!系统检测到第"<<(j+1 )<<"位学生学号与第"<<(i+1)<<"位学生学号相同/n";
a[b]=j;
b++;c++;
}
else
{
cout<<" 第"<<(j+1 )<<"位学生学号与第"<<(i+1)<<"位学生学号相同/n";
a[b]=j;
b++;c++;
}
}
}
}
for(c=0;c {
cout << " 是否重新输入第" << (a[c]+1)<< "位学生成绩?(Y/N--选N则第" << (a[c]+1)<<"位学生成绩将不保存)";
cin>>Y;
while(Y!='y'&& Y!='Y'&& Y!='N'&& Y!='n')
{
cout<<" 无效的命令,请重新输入../n";
cout<<" 是否重新输入第"<<(a[c]+1)<<"位学生成绩?(Y/N--选N则第"<<(a[c]+1)<<"位学生成绩将不保存)";
cin>>Y;
}
if(Y=='y'||Y=='Y')
{
d=a[c];
ob[d].setup();
}
else
{
n--;
for(d=a[c];d<(this->stulen+n);d++)
ob[d]=ob[d+1];
for(d=(c+1);d a[d]--;
}
}
}
else
{
for(i=0;i
for(j=i+1;j
if(ob[i].id==ob[j].id)
{
if (c==0)
{
cout<<" 错误!系统检测到第"<<(j+1)<<"位学生学号与第"<<(i+1)<<"位学生学号相同/n";
a[b]=j;
b++;c++;
}
else
{
cout<<" 第"<<(j+1)<<"位学生学号与第"<<(i+1)<<"位学生学号相同/n";
a[b]=j;
b++;c++;
}
}
}
}
for(c=0;c {
cout << " 是否重新输入第" << (a[c]+1) << "位学生成绩?(Y/N--选N则第" << (a[c]+1)<<"位学生成绩将不保存)";
cin>>Y;
while(Y!='y'&& Y!='Y'&& Y!='N'&& Y!='n')
{
cout<<" 无效的命令,请重新输入../n";
cout<<" 是否重新输入第"<<(a[c]+1)<<"位学生成绩?(Y/N--选N则第"<<(a[c]+1)<<"位学生成绩将不保存)";
cin>>Y;
}
if(Y=='y'||Y=='Y')
{
d=a[c];
ob[d].setup();
}
else
{
n--;
for(d=a[c];d
for(d=(c+1);d a[d]--;
}
}
}
//学生数据显示格式 //通过循环输出所有学生数据。 /*cout < //***********把学生成绩排序******************// //通过循环把所有的学生数据保存在list.txt里边。 for(i=0; i <=d; i++) ofstream fout("list.txt",ios::app); if(!fout) //把添加的学生数据添加到list.txt里边去。 fout.close(); //通过for循环查找要删除学生的学号 //删除了之后,应该把后面的数据往前移,把要删除的数据覆盖,并且学生长度减1 //********************排序*****************// //排序算法。 } //如果输入成绩在数据域内,跳出循环并且赋值。 ob[p].math=m;break; while (e <0 || e>100) ob[p].eng=e; break; while (co <0 || co>100) ob[p].comp=co; //通过循环输出所有学生数据。 这段程序中个人感觉最重要的变量是stulen,一切程序的操作都离不开它,也希望有人可以提出更多的问题,让这个程序变得更完美。
system("cls");
cout <
for(j=this->stulen ; j <(this->stulen+n); j++)
{
ob[j].show();
}
this->stulen+=n; //学生个数赋值
char Y;
cin>>Y;
system("cls"); */
}
void student::query()
{
int x;
cout <
int i;
for(i=0;i
{
if (x==ob[i].id)
break;
/*{
cout <<" 学号 姓名 性别 数学 英语 C++ 总分 平均分" <
cout.width(6);
cout <<"" <
cout <
cout <
cout <
cout <
cout <
cout <
}
if(i
{
cout <<" 学号 姓名 性别 数学 英语 C++ 总分 平均分" <
cout.width(6);
cout <<"" <
cout <
cout <
cout <
cout <
cout <
cout <
else
cout<<" 没有找到该学生成绩...";
_getch();
}
//*******************保存学生数据**************************//
void student::save()
{
int i;
ofstream outfile;
outfile.open("list.txt",ios::trunc);
if(!outfile)
{
cout <<" 无法打开数据文件!/n";
}
for(i=0; i
{
outfile <
outfile.close();
ofstream outfile1;
outfile1.open("stulen.txt",ios::trunc );
outfile1<
outfile1.close();
}
//********重新初始化********//
void student::clean()
{
int i;
char b[20];
ifstream infile;
infile.open("list.txt",ios::in);
if(!infile)
{
for(int i=(this->stulen-1);i <100;i++)
{
ob[i].math=ob[i].eng=ob[i].comp =ob[i].totll =ob[i].aver =0;
ob[i].id =0;
ob[i].sex =' ';
ob[i].name =NULL;
}
this->stulen=0;
ifstream infile1;
infile1.open("stulen.txt",ios::in);
infile1>>this->stulen ;
infile1.close();
}
else
{
ifstream infile1;
infile1.open("stulen.txt",ios::in);
infile1>>this->stulen ;
infile1.close();
for(i=0;i
{
infile>>ob[i].id;
ob[i].name =new char[strlen(b)+1];
infile>>b;
strcpy(ob[i].name,b);
infile>>ob[i].sex ;
infile>>ob[i].math ;
infile>>ob[i].eng;
infile>>ob[i].comp;
infile>>ob[i].totll;
infile>>ob[i].aver ;
}
infile.close ();
}
}
//*************显示所有学生数据*********************//
void student::read()
{
int i;
float averm,avere,averc;
averm=avere=averc=0;
//system("cls");
cout <
for(i=0; i
{
ob[i].show();
}
cout <<"/n/n/n";
for(i=0; i
{
averm +=ob[i].math;
}
if(i!=0)
cout <<" 数学平均成绩为" <
cout <<" 数学平均成绩为0" <
{
avere +=ob[i].eng;
}
if(i!=0)
cout <<" 英语平均成绩为" <
cout <<" 英语平均成绩为0" <
{
averc +=ob[i].comp;
}
if(i!=0)
cout <<" C++平均成绩为" <
cout <<" C++平均成绩为0" <
}
//*******************一个学生的数据****************//
void student::add()
{
int i, d=this->stulen ;
int c=0;
cout <<" 输入要添加学生的信息:" <
{
cout<<"/n";
ob[d].setup();
for(i=0;i
if(ob[i].id==ob[d].id )
{
cout<<" 系统检测到此次输入的学号和已有学生学号相同,请核实再输..";
_getch();
ob[d].math=ob[d].eng=ob[d].comp =ob[d].totll =ob[d].aver =0;
ob[d].id =0;
ob[d].sex =' ';
ob[d].name =NULL;
c=1;
break;
}
else c=0;
}
}while(c!=0);
cout <
{
ob[i].show();
}
this->stulen++;
{
cout <<" 无法打开数据文件!/n,";
}
fout <
ofstream outfile1;
outfile1.open("stulen.txt",ios::trunc );
outfile1<
outfile1.close();
_getch();
}
//*********************删除指定名字学生的数据*******************//
void student::del()
{
int i,p;
int x;
p=-1;
if(this->stulen==0)
{
cout<<" 目前没有学生成绩!";
_getch();
}
else
{
cout <
for(i=0; i
{
ob[i].show();
}
char a;
cout <<"/n/n 输入要删除的学生学号:" ;
cin>>x;
for(i=0; i
if(x==ob[i].id )
{
p=i;
cout <
}
else
continue;
}
if(p==-1)
{
cout<<" 没有此学生成绩!";
_getch();
}
else
{
cout<<" 确定删除此学生成绩?
cin>> a;
if (a=='y'|| a=='Y')
{
cout <<" 删除成功!" <
stulen--;
for(i;i
ob[i]=ob[i+1];
}
ofstream outfile;
outfile.open("list.txt",ios::trunc);
for(i=0; i
{
outfile <
outfile.close();
ofstream outfile1;
outfile1.open("stulen.txt",ios::trunc );
outfile1<
outfile1.close();
this->read ();
//_getch();
}
else
{
cout<<" 回到主界面...";
_getch();
}
}
}
}
void student::order()
{
int k,j;
float t; char n[20];
cout <<" 成绩排名:" <
for(j = 0; j <=(stulen-2); j++)
{
for(k=j+1; k <=(stulen-1); k++)
{
if(ob[j].totll < ob[k].totll)
{
t = ob[j].totll;
ob[j].totll = ob[k].totll;
ob[k].totll = t;
strcpy(n, ob[j].name);
strcpy(ob[j].name, ob[k].name);
strcpy(ob[k].name, n);
}
}
for(k=0; k <=(stulen-1); k++)
{
cout <<" ";
cout.setf(ios::left);
cout.width(9);
cout <
cout <
_getch();
}
//********修改学生信息********//
void student::modify()
{
int a,i,p,b;
p=-1;
system("cls");
cout <
for(i=0; i
{
ob[i].show();
}
cout <<"/n/n 请输入要修改学生的学号:";
cin>>a;
for(i=0; i
if(a==ob[i].id)
{
p=i;
cout <
}
else
continue;
}
if(p==-1)
{
cout<<" 没有此学生成绩!";
_getch();
}
else
{
cout<<"/n/n 请输入要修改的课程名的编号(1.数学, 2.英语,3.C++):";
cin>>b;
while(b!=1 &&b!=2 &&b!=3)
{
cout<<" 无效输入,请重新输入!/n";
cout<<"/n/n 请输入要修改的课程名的编号(1.数学, 2.英语,3.C++):";
cin>>b;
}
switch(b)
{
case 1:
{
float m;
cout<<" 数学(0-100): ";
cin>>m;
//如果不在数据域内,一直循环到输入数据符合数据域为止
while (m <0 || m>100)
{
cout<<" 数据有误!!重新输入.."<
cin>>m;
}
}
case 2:
{
float e;
cout<<" 英语(0-100): ";
cin>>e;
{
cout<<" 数据有误!!重新输入.."<
cin>>e;
}
}
case 3:
{
float co;
cout<<" C++(0-100): ";
cin>>co;
{
cout<<" 数据有误!!重新输入.."<
cin>>co;
}
}
}
ob[p].totll=ob[p].math+ob[p].eng+ob[p].comp;
ob[p].aver=(ob[p].math+ob[p].eng+ob[p].comp)/3;
ofstream outfile;
outfile.open("list.txt",ios::trunc);
for(i=0; i
{
outfile <
outfile.close();
cout<<" 成绩修改成功!回车返回主界面...";
_getch();
}
}
//***************程序运行前先检查以前是否有数据存在*****************//
void student::check()
{
int i;
char b[20];
ifstream infile;
infile.open("list.txt",ios::in );
if(!infile)
{
cout<<" 系统没有检测到以前输入的数据,此次操作将建立一个新的数据文件...";
_getch();
}
else
{
ifstream infile1;
infile1.open("stulen.txt",ios::in);
infile1>>this->stulen ;
infile1.close();
for(i=0;i
{
infile>>ob[i].id;
ob[i].name =new char[strlen(b)+1];
infile>>b;
strcpy(ob[i].name,b);
infile>>ob[i].sex ;
infile>>ob[i].math ;
infile>>ob[i].eng;
infile>>ob[i].comp;
infile>>ob[i].totll;
infile>>ob[i].aver ;
}
infile.close ();
//学生数据显示格式
system("cls");
cout<<" 系统检测到以前输入过数据,数据内容如下:/n/n";
cout <
for(i=0; i
{
ob[i].show();
}
cout<<"/n/n/n";
cout<<" 原始数据是否覆盖?(Y/N)";
char q;
cin>>q;
while(q!='y'&& q!='Y'&& q!='N'&& q!='n')
{
cout<<" 无效的命令,请重新输入../n";
cout<<" 原始数据是否覆盖?(Y/N)";
cin>>q;
}
if(q=='y'||q=='Y')
{
for(int i=0;i <100;i++)
{
ob[i].math=ob[i].eng=ob[i].comp =ob[i].totll =ob[i].aver =0;
ob[i].id =0;
ob[i].sex =' ';
ob[i].name =NULL;
}
this->stulen =0;
ofstream outfile1;
outfile1.open("stulen.txt",ios::trunc);
outfile1<
outfile1.close();
system("del list.txt");
}
/* else*/
}
}
//**************按照一定格式显示所要查询学生的信息。**************//
void menu()
{
cout <<"/n/n";
cout <<"------------------ 学生成绩系统 -----------------" <
cout <<"/t2.读取学生成绩:/n";
cout <<"/t3.删除学生成绩:/n";
cout <<"/t4.追加学生成绩:/n";
cout <<"/t5.查询学生成绩:/n";
cout <<"/t6.修改学生成绩:/n";
cout <<"/t7.显示成绩名次./n";
cout <<"/t8.退出系统....../n/n/n";
cout <<"/t请选择要实现的功能: ";
}
//---------------------------------------------------------------------------------------
void main()
{
student a;
a.check();
while(1)
{
int SEL;
system("cls");
menu();
cin>>SEL;
switch(SEL)
{
case 1:
system("cls");
a.input();
cout <
char Y;
cin>>Y;
while(Y!='y'&& Y!='Y'&& Y!='N'&& Y!='n')
{
cout<<" 无效的命令,请重新输入../n";
cout<<" 是否保存? (Y/N)";
cin>>Y;
}
system("cls");
if(Y=='y'||Y=='Y')
a.save();
else/* if(Y=='n'||Y=='N')*/
a.clean();
break;
case 2:
system("cls"); a.read(); break;
case 3:
system("cls"); a.del(); break;
case 4:
system("cls"); a.add();break;
case 5:
system("cls"); a.query();break;
case 6:
system("cls"); a.modify();break;
case 7:
system("cls"); a.order();break;
case 8:
/*cout <
exit(0);
default:
cout <<" 无效的命令!";
_getch();
break;
}
}
}