怎么能让“学号 姓名 成绩”作为表头不随着循环呢?
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
struct student
{
char no[10];
char name[10];
int score;
};
typedef student elemtype;//自定义类型
struct sqlist
{
elemtype*elem;
int length;
int listsize;
int incrementsize;
};
void initlist(sqlist &l,int maxsize=5,int incresize=2) //顺序表初始化
{
l.elem=new elemtype[maxsize];//分配一个最大容量为maxsize的数组空间
l.length=0;//当前元素为零个
l.listsize=maxsize;//该表可容纳maxsize个数据元素
l.incrementsize=incresize;//需要时可扩容increase个元素空间
}
void increment(sqlist &l) //为顺序表扩大l.incrementsize个元素
{
elemtype *p=new elemtype[l.listsize+l.incrementsize]; //p是临时过渡的辅助数组
for(int i=0;i<l.length;i++)
p[i]=l.elem[i]; //复制原空间的数据
delete[]l.elem; //释放元空间
l.elem=p; //移交空间首地址
l.listsize+=l.incrementsize; //扩容后数据表最大空间
}
void listinsert(sqlist &l,int i,elemtype e)//插入元素
{
if(i<1||i>l.length+1)
{
cout<<"错误"<<endl;
exit(0);
}
if(l.length>=l.listsize){increment(l);}
for(int j=l.length-1;j>=i-1;j--)
l.elem[j+1]=l.elem[j];
l.elem[i-1]=e;
l.length++;
}
void printelem(elemtype e)
{
cout<<setw(7)<<"学号"<<setw(7)<<"姓名"<<setw(7)<<"成绩"<<endl;
cout<<setw(7)<<e.no<<setw(7)<<e.name<<setw(7)<<e.score<<endl;
}
void printlist(sqlist l)
{
for(int i=0;i<l.length;i++)
printelem(l.elem[i]);
}
void listedelete(sqlist &l,int i,elemtype &e)//删除
{
if(i<1||i>l.length)
cout<<"Error"<<endl;//判断是否合法
else
{
e=l.elem[i-1];//被删除元素的值赋给e
for(int j=i;j<l.length;j++)
l.elem[j-1]=l.elem[j];//被删除之后元素上移
l.length--;//表长减一
}
}
elemtype locateelem(sqlist l,int i)//查找
{
return l.elem[i-1];
}
int locateelem(sqlist l,elemtype e)
{
for(int i=0;i<l.length;i++)//从第一个位置依次开始判断
{
if(strcmp(l.elem[i].no,e.no)==0)//判定两个值是否相等,strcmp用于比较字符串
return i+1;
}
return 0;//表中不存在返回0
}
void save(sqlist l,char filename[])
{
ofstream file(filename,ios_base::binary);
for(int i=0;i<l.length;i++)
{
file.write((char*)&l.elem[i],sizeof(elemtype));
}
file.close();
}
void open(sqlist &l,char filename[])
{
cout<<"是否对现有的数据进行保存?y/n:"<<endl;
char yn;
cin>>yn;
if(yn=='Y'||yn=='y')
{
cout<<"输入要保存的文件名:";
char filename2[80];
cin>>filename2;
save(l,filename2 );
}
l.length=0;//清空原有表格
elemtype e;
int i=1;
ifstream file(filename,ios_base::binary);
while(file.peek()!=EOF)
{
file.read((char*)&e,sizeof(elemtype));
listinsert(l,i,e);
i++;
}
file.close();
}
void main()
{
sqlist l;
initlist(l,10,5);
int n,i;
elemtype e;
char yn;
char filename[80];
do
{
cout<<"1 输出"<<endl;
cout<<"2 查找"<<endl;
cout<<"3 插入"<<endl;
cout<<"4 删除"<<endl;
cout<<"5 保存"<<endl;
cout<<"6 打开"<<endl;
cout<<"请选择要进行的操作 1,2……6";
cin>>n;
switch(n)
{
case 1:
printlist(l);break;
case 2:
cout<<"放入要查找的元素";cin>>e.no ;
i=locateelem(l,e);
if(i==0)
cout<<"学号为"<<e.no <<"的学生不存在"<<endl;
else
{
cout<<"查找到得学生信息为:";
printelem( locateelem(l,i) );
}
break;
case 3:
cout<<"放入要插入的位置"; cin>>i;
cout<<"放入要插入学生的学号,姓名和成绩";
cin>>e.no >>e.name >>e.score ;
listinsert(l,i,e);
break;
case 4:
cout<<"放入要删除学生的学号";
cin>>e.no ;
i=locateelem(l,e);
if(i==0)
{
cout<<"学号为"<<e.no<<"的学生不存在"<<endl;
}
else
{
cout<<"确实要删除么y/n";
cin>>yn;
if(yn=='Y'||yn=='y')
{
listedelete(l,i,e);
cout<<"下面的学生信息被删除";
printelem(e);
}
}
break;
case 5:
cout<<"放入要保存的文件名";
cin>>filename;
save(l,filename);
break;
case 6:
cout<<"放入要打开的文件名";
cin>>filename;
open(l,filename);
break;
}
}while(n<=6);
}
[解决办法]
把那个东东写在循环外面不就OK了嘛
[解决办法]
不懂你说的哪个!