求解C++程序设计-学生信息管理系统

lelequan 2011-01-02 06:48:01
主要还是实现增删查改功能(多了一个按学号排序)。我只做出前面的一部分,接下来的不会做了,主要是:No1.不会把学生信息从文件中取出并存入链表中。No2.不会在链表中修改学生信息再存入txt文件中。

要求用到链表,和文件存储(将学生数据存入链表再保存到txt文件中,读取信息时将txt文件中的信息取出存入链表,修改时在链表上改,完成录入后点‘文件保存功能’)基本功能有:1.增加一条学生信息,2.删除一条学生信息,3.按学号排序并显示每个学生的信息,4.按宿舍号,学号,姓名查找学生信息并显示,5.删除一名学生信息,6.文件保存,7.退出系统

希望大侠们指点~字段在程序中有,共八个
界面 :

cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"┃**************** ☆ 学 生 成 绩 管 理 系 统 ☆ ****************** ┃";
cout<<"┃********** ★★★★★ ★★★★★★★ ★★★★★ *********** ┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
cout<<"┃****************★ ☆ 1.增加学生信息 ☆ ★****************┃";
cout<<"┃****************★ ☆ 2.显示学生信息 ☆ ★****************┃";
cout<<"┃****************★ ☆ 3.排序统计信息 ☆ ★****************┃";
cout<<"┃****************★ ☆ 4.查找学生信息 ☆ ★****************┃";
cout<<"┃****************★ ☆ 5.删除学生成绩 ☆ ★****************┃";
cout<<"┃****************★ ☆ 6.清空所有数据 ☆ ★****************┃";
cout<<"┃****************★ ☆ 7.安全退出系统 ☆ ★****************┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";


以下是我没做完的(用的是V C++):

#include <string>
#include <iostream> //标准的输入输出流头文件
#include <iomanip>
#include <fstream> //需要包含此文件以使用C++的文件输入/输出函数

using namespace std;

class stud
{
private:
student *p1,*p2,*hrad;

char name[15]; //姓名
char id[18]; //学号
char sex[6]; //性别
char snum[6]; //宿舍号
char qq[15]; //qq号
char tel[13]; //手机号
char email[30]; //电子邮件
string addr; //家庭地址
public:

void output(); //输出学生信息
void input(); //输入学生信息
void remove(); //删除学生信息
void search(); //查找学生信息(可查找多个同名数据)
//stat(); //排序按学生学号
void Tj(int m); //统计总人数
};

////---------用于添加学生数据的子函数-------///////
void stud::inputs(student*p)
{

ofstream fout("student.txt",ios::app);//创建文件,存放联系人信息
if(!fout)
cerr<<"Cannot open ! "<<endl;
else
{
cout<<setw(6)<<"姓名"<<setw(8)<<" 学号"
<<setw(8)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(8)<<"手机号"<<setw(8)<<"电子邮件"
<<setw(8)<<"家庭地址"<<endl;

cin>>p->name>>p->id>>p->sex>>
p->snum>>p->qq>>p->tel>>p->email>>p->addr;
fout<<"\n"<<name<<" "<<id<<" "<<sex<<" "<<snum<<" "
<<qq<<" "<<tel<<" "<<email<<" "<<addr;
fout.close();
}

}
////////-----输出学生信息-----------------/////////////////////
void stud::output(student *head)
{
ifstream fin("student.txt",ios::in);
if(!fin)
cerr<<"Cannot open !"<<endl;
else
while(!fin.eof())
{
fin>>name>>ip>>sex>>snum>>qq>>tel>>email>>addr;
cout<<"姓名:"<<name<<endl
<<"学号:"<<ip<<endl
<<"性别:"<<sex<<endl
<<"宿舍号:"<<snum<<endl
<<"qq号:"<<qq<<endl
<<"手机号:"<<tel<<endl
<<"电子邮件:"<<email<<endl
<<"家庭地址:"<<addr<<endl<<endl;
}
fin.close();
}
...全文
2231 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
noah_L 2011-02-13
  • 打赏
  • 举报
回复
由此可见我还有很多很多要学的。。。掩面泪奔
lelequan 2011-01-09
  • 打赏
  • 举报
回复
我的程序交了,但用链表实现从文件输出,只能输出一行。实际上是被覆盖了,大家可以看一下~

#include <iomanip>
#include <iostream>
#include <fstream>
#include <vector>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

struct student
{
char name[15]; //姓名
char id[6]; //学号
char sex[6]; //性别
char snum[6]; //宿舍号
char qq[15]; //qq号
char tel[13]; //手机号
string addr; //家庭地址


student *next;
};//定义结构体


class stud
{
student *p1,*p2,*head;
public:

~stud() // 析构函数
{

while(head)
{
p1=head->next;
delete head;
head=p1;
}
}
// 成员函数
void output(student *head); // 输出学生信息
student* input(student *head); // 增加学生记录
student* del(student *head, char*p); // 删除记录
student* findn(student *head,char *p,int &n); // 按姓名查找学生信息记录(可查找多个同名数据)
student* findi(student *head,char *p,int &n); // 按学号查找学生信息记录
student* finds(student *head,char *p,int &n); // 按宿舍号查找学生信息记录
void infile(student *head); //存入文件
student *outfile(student *head); //将文件导出表
student* stat(student *head); //排序统计学生信息
student* clear(student *head); // 删除当前表
void Inputs(student *p); //用于添加数据的子函数
};


// 用于添加数据的子函
void stud::Inputs(student*p)
{
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

cin>>p->name>>p->id>>p->sex>>
p->snum>>p->qq>>p->tel>>p->addr;
}

// 输出学生成绩
void stud::output (student *head)
{ p1=head;
while(p1!=NULL)
{
cout<<setw(6)<<p1->name<<setw(6)
<<p1->id<<setw(6)<<p1->sex<<setw(8)<<p1->snum<<setw(8)
<<p1->qq<<setw(12)<<p1->tel<<setw(12)<<p1->addr<<endl;
p1=p1->next;
}
}

void stud::infile(student *head)//存入文件
{
p1=head;
ofstream fout("student.txt",ios::app);//创建文件,存放联系人信息
if(!fout)
cerr<<"Cannot open ! "<<endl;
else
while(p1=NULL)
{
cin>>p1->name>>p1->id>>p1->sex>>
p1->snum>>p1->qq>>p1->tel>>p1->addr;

fout<<"\n"<<name<<" "<<id<<" "<<sex<<" "<<snum<<" "<<qq<<" "<<tel<<" "<<addr;
p1=p1->next;
}
fout.close();
}

student *stud::outfile(student *head)//将文件导出表
{


p1=new student;
p2=head;
ifstream fin("student.txt",ios::in);
if(!fin)
cerr<<"Cannot open !"<<endl;
else
while(!fin.eof())
{
fin>>p1->name>>id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>p1->email>>p1->addr;

}
fin.close();//向p1中增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}





// 清空数据
student* stud::clear(student*head)
{
while(head)
{ p1=head->next ;
delete head;
head=p1;
}
return head;
}
// 排序统计函数
student *stud::stat(student *head)
{
p2=head;
p1=p2->next;

while(p2->next) //用冒泡法实现排序
{

if(p2->id > p1->id)
{ // 把头指针指向当前比较小的节点
p2->next=p1->next;
p1->next=head;
head=p1;

// 把用于比较的两个指针复位

p1=p2->next ;
}
else
{ // 指向下一个节点
p2=p2->next ;
p1=p2->next ;
}

}
cout<<"当前表以按学号排序完成"<<endl;
return head;
}

// 删除记录
student* stud::del (student *head,char *p)
{
p1=head;
p2=NULL;

while(strcmp(p1->name ,p)&& p1->next !=NULL)
{ p2=p1;
p1=p1->next ;
}

if(!strcmp(p1->name ,p))
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next ;

cout<<"删除成功,OK"<<endl;
delete p1;
}
else
cout<<" 没找到姓名"<<p<<"的学生.\n"; //结点没找到

return head ;
}

// 按姓名查找函数
student* stud::findn (student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->name,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按学号查找学生信息记录
student* stud::findi(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->id ,p) !=0 && p2->next !=NULL)
p2=p2->next ;
if(0==strcmp(p2->id,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按宿舍号查找学生信息记录
student* stud::finds(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->snum ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->snum,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 增加学生记录
student *stud::input (student *head)
{ p1=new student;
p2=head;
Inputs(p1); //调用子函数 增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}



// 输出错误
void error()
{
cout<<"错误,这还是一张空表,请输入数据"<<endl;
getch();

}
// 主函数
int main(void)
{
{
system("color 8e");//————添加背景颜色
}
stud stus;
student *head=NULL;
student *pd; //临时指针, 用于查找函数
char choice; //用于存放用户的选择项
char choice2,choice3;//用于细节选择
char name[10]; //查找,删除记录的 key
char snum[8];
char id[10];

while(1)
{ system("cls");

cout<<" ┏┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┓"<<endl;
cout<<" ┢ 学 生 信 息 管 理 系 统 ┪"<<endl;
cout<<" ┡━━━━━━━━━━━━━━━━━━━━┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┡ 1.增加学生信息 2.显示学生信息 ┩"<<endl;
cout<<" ┢ 3.排序统计信息 4.查找学生信息 ┪"<<endl;
cout<<" ┡ 5.删除学生信息 6.清空所有数据 ┩"<<endl;
cout<<" ┢ 7.保存学生信息 8.安全退出系统 ┪"<<endl;
cout<<" ┡ ┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┖┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┚"<<endl;
cout<<" 请输入您的选择(0--7):";cout<<endl;


int n=0; //计数器,用于在查找时计算有没有同名学生
cin>>choice;
fflush(stdin);

if(choice=='7') //退出程序
{ cout<<"谢谢使用,再见"<<endl;
exit(0);
}
switch(choice)
{
case '1': //增加学生信息
head=stus.input (head);
break;
case '2': //显示学生信息
if(head==NULL)
{
error();
break;
}
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);
getch();
break;
case '3': //排序学生信息
if(head==NULL)
{
error();
break;
}
head=stus.stat(head);
getch();
break;

case '4': //查找学生信息
if(head ==NULL)
{
error(); //调用函数输出错误信息
break;
}

cout<<"请选择:"<<endl;
cout<<"a.按姓名查找"<<endl;
cout<<"b.按学号查找"<<endl;
cout<<"c.宿舍号查找"<<endl;
cin>>choice2;

switch(choice2)//选择a,b,c
{
case 'a'://按姓名查找
{
cout<<"请输入要查找的学生姓名(可查找相同姓名的学生)"<<endl;
cin>>name;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"<<setw(6)
<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findn (pd,name,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点,可以查找同名学生
}
getch();
break;
}

case 'b'://按学号查找
{
cout<<"请输入要查找的学生学号"<<endl;
cin>>id;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findi (pd,id,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}

case 'c'://按宿舍号查找
{
cout<<"请输入要查找的宿舍号"<<endl;
cin>>snum;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个相同宿舍学生的信息
{
pd=stus.finds (pd,snum,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}
}//choice2选择结束

break;
//case'4'结束

case '5': //删除学生信息
if(head==NULL)
{
error();
break;
}
cout<<"学生数据如下"<<endl;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);

cout<<"请输入想要删除学生姓名"<<endl;

cin>>name;
head=stus.del(head,name);
getch();
break;

case '6':
if(head==NULL)
{
error();
break;
}
cout<<"确定要保存数据吗?"<<endl;
cout<<"选择y/n:"
cin>>choice3;
switch (choice3)
{ case 'y':
stus.infile(head);
break;
case 'n':
cout<<"按任意键继续"<<endl;
break;
}


break;

case '7':
if(head==NULL)
{
error();
break;
}
head=stus.clear(head);
cout<<"删除表成功~"<<endl;
getch();
break;
default :
cout<<" 对不起,您的输入有误,请重新输入。\n";
getch();
break;
}
}
getch();
return 0;
}
lelequan 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 p569354158 的回复:]

每次到期末的时候总有人发这样的大作业我们一块探讨
[/Quote]

嘿嘿
lelequan 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 guandq2106 的回复:]

这个程序我已经差不多在学校做过3次了,我劝楼主最好自己写,对于不会的在问。。。有助于提高自己
[/Quote]
恩 好的 谢谢你哈~
lucky-lucky 2011-01-08
  • 打赏
  • 举报
回复
每次到期末的时候总有人发这样的大作业我们一块探讨
liyaobinRyan 2011-01-08
  • 打赏
  • 举报
回复
这一个系统经典啊!
管哥的天下 2011-01-07
  • 打赏
  • 举报
回复
这个程序我已经差不多在学校做过3次了,我劝楼主最好自己写,对于不会的在问。。。有助于提高自己
lelequan 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yiyefangzhou24 的回复:]

这个贴我已经回了好多次了,作业题啊C/C++ code
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
struct stu_score
{
int num;
int mark[3];
string name;
stu_score *next;
floa……
[/Quote]
好长啊~~
lelequan 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaoxiao880919 的回复:]

我的也是要求课程设计,不过我基本上已经完成了,好像比你的要简单些,最后还有点错误,如果可以帮忙看下。http://topic.csdn.net/u/20110106/10/68b124f2-59cc-441e-94db-21825d290ae9.html
[/Quote]

恩。
lelequan 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaoxiao880919 的回复:]

引用 12 楼 yiyefangzhou24 的回复:
这个贴我已经回了好多次了,作业题啊

C/C++ code
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
struct stu_score
{
int num;
int mark[3];
string name;
……
[/Quote]
呵呵,多用点心多花点时间吧~~
xiaoxiao880919 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yiyefangzhou24 的回复:]
这个贴我已经回了好多次了,作业题啊

C/C++ code
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
struct stu_score
{
int num;
int mark[3];
string name;
stu_score *ne……
[/Quote]这样直接贴出来一点意思也没有。
yiyefangzhou24 2011-01-06
  • 打赏
  • 举报
回复
这个贴我已经回了好多次了,作业题啊
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
struct stu_score
{
int num;
int mark[3];
string name;
stu_score *next;
float aver;
};
class student
{
private:
int i;
stu_score *head;
void swap(stu_score *,stu_score *);
void print(stu_score *);
stu_score *find(int);
public:
student() {head=NULL;}
stu_score *get_head() {return head;}
int listcount();
void additem(int num,string name,int mark[3]);
void removeitem(int);
void list();
void sort_by_num();
void sort_by_aver();
void search(int);
int average();
};
int student::listcount()
{
if(!head) return 0;
stu_score *p=head;
int n=0;
while(p)
{
n++;
p=p->next;
}
return n;
}
void student::additem(int num,string name,int mark[3])
{
if(!head)
{
head=new stu_score;
for(i=0;i<3;i++)
head->mark[i]=mark[i];
head->num=num;
head->name=name;
head->next=NULL;
return;
}
stu_score *t=head;
while(t && t->num!=num)
t=t->next;
if(t)
{
cout<<"操作失败:学号为:"<<num<<"的记录已存在!"<<endl;
return;
}
stu_score *p=head;
while(p->next)
p=p->next;
stu_score *p1=new stu_score;
p1->num=num;
for(int i=0;i<3;i++)
p1->mark[i]=mark[i];
p1->name=name;
p1->next=NULL;
p->next=p1;
return;
}
void student::removeitem(int num)
{
stu_score *t=find(num);
if(!t) return;
stu_score *p=head;
if(head==t)
{
head=head->next;
delete p;
cout<<"成功删除学号为"<<num<<"的记录"<<endl<<endl;
return;
}
while(p->next!=t) p=p->next;
stu_score *p1=p->next;
p->next=p1->next;
delete p1;
cout<<"成功删除学号为:"<<num<<"的记录!"<<endl<<endl;
return;
}
void student::print(stu_score *p)
{
cout.precision(3);
cout<<p->num<<"\t\t";
cout<<p->name<<"\t\t";
cout<<p->mark[0]<<"\t"<<p->mark[1]<<"\t"<<p->mark[2]<<"\t"<<p->aver<<endl;
return;
}
void student::list()
{
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return;
}
stu_score *p=head;
cout<<"共有记录:"<<listcount()<<endl;
cout<<"学号\t\t姓名\t\t英语\t数学\t化学\t平均分" <<endl;
while(p)
{
print(p);
p=p->next;
}
cout<<endl;
return;
}
void student::search(int num)
{
cout<<"searching..."<<endl;
stu_score *p=find(num);
if(p)
{
cout<<"学号\t\t姓名\t\t英语\t数学\t化学\t平均分" <<endl;
print(p);
}
cout<<endl;
}
stu_score *student::find(int num)
{
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return NULL;
}
stu_score *p=head;
while(p)
{
if(p->num==num) break;
p=p->next;
}
if(!p)
{
cout<<"错误:找不到该记录!\n";
return NULL;
}
return p;
}
void student::swap(stu_score *p1, stu_score *p2)
{
int i;
stu_score *temp=new stu_score;
temp->num=p1->num;
p1->num=p2->num;
p2->num=temp->num;
for(i=0;i<3;i++)
temp->mark[i]=p1->mark[i];
for(i=0;i<3;i++)
p1->mark[i]=p2->mark[i];
for(i=0;i<3;i++)
p2->mark[i]=temp->mark[i];
temp->name=p1->name;
p1->name=p2->name;
p2->name=temp->name;
temp->aver=p1->aver;
p1->aver=p2->aver;
p2->aver=temp->aver;
}
void student::sort_by_num()
{
cout<<"sorting..."<<endl;
if(listcount()<2) return;
stu_score *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=listcount(),i,j;
p=head;
for(i=1;i<n;i++)
{
k=p;
p1=p->next;
for(j=0;j<n-i;j++)
{
if(k->num>p1->num){
k=p1;
}
p1=p1->next;
}
if(p!=k)swap(k,p);
p=p->next;
}
cout<<"complete successfully!"<<endl<<endl;
return;
}
void student::sort_by_aver()
{
cout<<"sorting..."<<endl;
if(listcount()<2) return;
stu_score *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=listcount(),i,j;
p=head;
for(i=1;i<n;i++)
{
k=p;
for(j=0;j<n-i;j++)
{
p1=k->next;
if(k->aver<p1->aver)
{
swap(k,p1);
}
k=k->next;
}
}
cout<<"complete successfully!"<<endl<<endl;
return;
}
int student::average()
{
int i;
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return -1;
}
float sum, n=0;
stu_score *p=head;
while(p)
{
sum=0;
for(i=0;i<3;i++)
sum+=p->mark[i];
p->aver=sum/3;
p=p->next;
n++;
}
return 0;
}
student student;
int menu()
{
cout<<"==========主菜单=========="<<endl;
int n=1,select=-1;
cout<<n++<<".请输入学生成绩;"<<endl<<endl;
cout<<n++<<".按学号排序;"<<endl<<endl;
cout<<n++<<".按学号查找记录;"<<endl<<endl;
cout<<n++<<".删除由学号指定的记录;"<<endl<<endl;
cout<<n++<<".列出所有记录;"<<endl<<endl;
cout<<n++<<".按平均成绩排序输出;"<<endl<<endl;
cout<<n++<<".从数据文件导入成绩;"<<endl<<endl;
cout<<n++<<".将成绩导出到磁盘文件;"<<endl<<endl;
cout<<"0.退出;"<<endl<<endl;
cout<<"【请选择(相应的数字)】:";
cin>>select;
return select;
}
char exit()
{
char s;
cout<<"确定要退出程序吗?[Y/N]:";
cin>>s;
return s;
}
void input(int *num,string *name,int mark[3])
{
cout<<"请输入 学号 姓名 英语 数学 化学:"<<endl;
cin>>*num;
if(*num==-1) return;
cin>>*name>>mark[0]>>mark[1]>>mark[2];
return;
}
void sort_by_num()
{
student.sort_by_num();
}
void addnew()
{
int num=0,mark[3]={0};
string name="";
cout<<endl<<"当输入学号为-1时表示结束输入。"<<endl;
input(&num,&name,mark);
while(num!=-1)
{
student.additem(num,name,mark);
student.average();
input(&num,&name,mark);
}
return;
}
void dofind()
{
int num;
cout<<endl<<"当输入学号为-1时表示结束输入。"<<endl;
do{
cout<<"请输入要查找的学生学号:";
cin>>num;
if(num==-1) continue;
student.search(num);
}while(num!=-1);
return;
}
void dodelete()
{
cout<<endl<<"当输入学号为-1时表示输入结束。"<<endl;
int num;
do
{
cout<<"请输入要删除学生学号:";
cin>>num;
if(num==-1) continue;
student.removeitem(num);
}while(num!=-1);
return;
}
void list()
{
student.list();
}
void showaverage()
{
student.sort_by_aver();
if(student.listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return;
}
int n=0;
cout.precision(3);
stu_score *p=student.get_head();
cout<<"学号"<<"\t姓名"<<"\t平均分"<<"\t排名"<<endl;
while(p)
{
cout<<p->num<<"\t"<<p->name<<":\t"<<p->aver<<"\t"<<++n<<endl;
p=p->next;
}
return;
}
void loadfromfile()
{
int num,mark[3];
char name[20]="";
fstream iofile;
int i=0;
iofile.open("stud.dat",ios::in|ios::binary);
if(!iofile)
{
cout<<"数据文件不存在,请先建立该文件!"<<endl;
return;
}
if(iofile.eof())
{
cout<<"数据库为空,请添加数据"<<endl;
iofile.close();
}
else
{
while(iofile.peek()!=EOF)
{
iofile.read((char *) &num,sizeof(int));
iofile.read((char *) name,20);
iofile.read((char *) &mark[0],sizeof(int));
iofile.read((char *) &mark[1],sizeof(int));
iofile.read((char *) &mark[2],sizeof(int));
student.additem(num,name,mark);
}
student.average();
iofile.close();
}
}
void savetofile()
{
stu_score *p;
char name[20];
fstream iofile;
int i=0;
iofile.open("stud.dat",ios::out|ios::binary);
if(!iofile)
{
cerr<<"open error"<<endl;
abort();
}
p=student.get_head();
while(p)
{
p->name.copy(name,20,0);
name[p->name.length()]=0;
iofile.write((char *) &p->num,sizeof(int));
iofile.write((char *) name,20);
iofile.write((char *) &p->mark[0],sizeof(int));
iofile.write((char *) &p->mark[1],sizeof(int));
iofile.write((char *) &p->mark[2],sizeof(int));
p=p->next;
}
iofile.close();
}
int main()
{
cout<<"Welcome!\n学生成绩管理系统\nVer 1.01\n \n\n";
int select;
char s;
while(1)
{
select=menu();
switch(select)
{
case 0:
s=exit();
if(s=='y'||s=='Y') return 0;
break;
case 1:
addnew();
break;
case 2:
sort_by_num();
break;
case 3:
dofind();
break;
case 4:
dodelete();
break;
case 5:
list();
break;
case 6:
showaverage();
break;
case 7:
loadfromfile();
break;
case 8:
savetofile();
break;
default:
cout<<"无效输入!"<<endl;
}
}
return 0;
}







xiaoxiao880919 2011-01-06
  • 打赏
  • 举报
回复
我的也是要求课程设计,不过我基本上已经完成了,好像比你的要简单些,最后还有点错误,如果可以帮忙看下。http://topic.csdn.net/u/20110106/10/68b124f2-59cc-441e-94db-21825d290ae9.html
smartlean 2011-01-06
  • 打赏
  • 举报
回复
在像VS05这样的IDE中,这些错误应该好发现。。
#include <iomanip>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

struct student
{
char name[15]; //姓名
char id[6]; //学号
char sex[6]; //性别
char snum[6]; //宿舍号
char qq[15]; //qq号
char tel[13]; //手机号
string addr; //家庭地址


student *next;
};//定义结构体


class stud
{
student *p1,*p2,*head;
public:

~stud() // 析构函数
{

while(head)
{
p1=head->next;
delete head;
head=p1;
}
}
// 成员函数
void output(student *head); // 输出学生信息
student* input(student *head); // 增加学生记录
student* del(student *head, char*p); // 删除记录
student* findn(student *head,char *p,int &n); // 按姓名查找学生信息记录(可查找多个同名数据)
student* findi(student *head,char *p,int &n); // 按学号查找学生信息记录
student* finds(student *head,char *p,int &n); // 按宿舍号查找学生信息记录
void infile(student *head); //存入文件
student *outfile(student *head); //将文件导出表
student* stat(student *head); //排序统计学生信息
student* clear(student *head); // 删除当前表
void Inputs(student *p); //用于添加数据的子函数
};


// 用于添加数据的子函
void stud::Inputs(student*p)
{
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

cin>>p->name>>p->id>>p->sex>>
p->snum>>p->qq>>p->tel>>p->addr;
}

// 输出学生成绩
void stud::output (student *head)
{ p1=head;
while(p1!=NULL)
{
cout<<setw(6)<<p1->name<<setw(6)
<<p1->id<<setw(6)<<p1->sex<<setw(8)<<p1->snum<<setw(8)
<<p1->qq<<setw(12)<<p1->tel<<setw(12)<<p1->addr<<endl;
p1=p1->next;
}
}

void stud::infile(student *head)//存入文件
{
p1=head;
ofstream fout("student.txt",ios::app);//创建文件,存放联系人信息
if(!fout)
cerr<<"Cannot open ! "<<endl;
else
while(p1=NULL)
{
//cin>>p1->name>>p1->id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>p1->addr;
//这儿为啥要用cin??不是从链表中获取存入文件?
fout<<"\n"<<p1->name<<" "<<p1->id<<" "<<p1->sex<<" "<<p1->snum<<" "<<p1->qq<<" "<<p1->tel<<" "<<p1->addr;
p1=p1->next;
}
fout.close();
}

student *stud::outfile(student *head)//将文件导出表
{


p1=new student;
p2=head;
ifstream fin("student.txt",ios::in);
if(!fin)
cerr<<"Cannot open !"<<endl;
else
while(!fin.eof())
{
fin>>p1->name>>p1->id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>/*p1->email>>*/p1->addr;

}
fin.close();//向p1中增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}





// 清空数据
student* stud::clear(student*head)
{
while(head)
{ p1=head->next ;
delete head;
head=p1;
}
return head;
}
// 排序统计函数
student *stud::stat(student *head)
{
p2=head;
p1=p2->next;

while(p2->next) //用冒泡法实现排序
{

if(p2->id > p1->id)
{ // 把头指针指向当前比较小的节点
p2->next=p1->next;
p1->next=head;
head=p1;

// 把用于比较的两个指针复位

p1=p2->next ;
}
else
{ // 指向下一个节点
p2=p2->next ;
p1=p2->next ;
}

}
cout<<"当前表以按学号排序完成"<<endl;
return head;
}

// 删除记录
student* stud::del (student *head,char *p)
{
p1=head;
p2=NULL;

while(strcmp(p1->name ,p)&& p1->next !=NULL)
{ p2=p1;
p1=p1->next ;
}

if(!strcmp(p1->name ,p))
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next ;

cout<<"删除成功,OK"<<endl;
delete p1;
}
else
cout<<" 没找到姓名"<<p<<"的学生.\n"; //结点没找到

return head ;
}

// 按姓名查找函数
student* stud::findn (student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->name,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按学号查找学生信息记录
student* stud::findi(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->id ,p) !=0 && p2->next !=NULL)
p2=p2->next ;
if(0==strcmp(p2->id,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按宿舍号查找学生信息记录
student* stud::finds(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->snum ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->snum,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 增加学生记录
student *stud::input (student *head)
{ p1=new student;
p2=head;
Inputs(p1); //调用子函数 增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}



// 输出错误
void error()
{
cout<<"错误,这还是一张空表,请输入数据"<<endl;
getch();

}
// 主函数
int main(void)
{
{
system("color 8e");//————添加背景颜色
}
stud stus;
student *head=NULL;
student *pd; //临时指针, 用于查找函数
char choice; //用于存放用户的选择项
char choice2,choice3;//用于细节选择
char name[10]; //查找,删除记录的 key
char snum[8];
char id[10];

while(1)
{ system("cls");

cout<<" ┏┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┓"<<endl;
cout<<" ┢ 学 生 信 息 管 理 系 统 ┪"<<endl;
cout<<" ┡━━━━━━━━━━━━━━━━━━━━┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┡ 1.增加学生信息 2.显示学生信息 ┩"<<endl;
cout<<" ┢ 3.排序统计信息 4.查找学生信息 ┪"<<endl;
cout<<" ┡ 5.删除学生信息 6.清空所有数据 ┩"<<endl;
cout<<" ┢ 7.保存学生信息 8.安全退出系统 ┪"<<endl;
cout<<" ┡ ┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┖┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┚"<<endl;
cout<<" 请输入您的选择(0--7):";cout<<endl;


int n=0; //计数器,用于在查找时计算有没有同名学生
cin>>choice;
fflush(stdin);

if(choice=='7') //退出程序
{ cout<<"谢谢使用,再见"<<endl;
exit(0);
}
switch(choice)
{
case '1': //增加学生信息
head=stus.input (head);
break;
case '2': //显示学生信息
if(head==NULL)
{
error();
break;
}
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);
getch();
break;
case '3': //排序学生信息
if(head==NULL)
{
error();
break;
}
head=stus.stat(head);
getch();
break;

case '4': //查找学生信息
if(head ==NULL)
{
error(); //调用函数输出错误信息
break;
}

cout<<"请选择:"<<endl;
cout<<"a.按姓名查找"<<endl;
cout<<"b.按学号查找"<<endl;
cout<<"c.宿舍号查找"<<endl;
cin>>choice2;

switch(choice2)//选择a,b,c
{
case 'a'://按姓名查找
{
cout<<"请输入要查找的学生姓名(可查找相同姓名的学生)"<<endl;
cin>>name;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"<<setw(6)
<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findn (pd,name,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点,可以查找同名学生
}
getch();
break;
}

case 'b'://按学号查找
{
cout<<"请输入要查找的学生学号"<<endl;
cin>>id;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findi (pd,id,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}

case 'c'://按宿舍号查找
{
cout<<"请输入要查找的宿舍号"<<endl;
cin>>snum;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个相同宿舍学生的信息
{
pd=stus.finds (pd,snum,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}
}//choice2选择结束

break;
//case'4'结束

case '5': //删除学生信息
if(head==NULL)
{
error();
break;
}
cout<<"学生数据如下"<<endl;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);

cout<<"请输入想要删除学生姓名"<<endl;

cin>>name;
head=stus.del(head,name);
getch();
break;

case '6':
if(head==NULL)
{
error();
break;
}
cout<<"确定要保存数据吗?"<<endl;
cout<<"选择y/n:"; //少个分号
cin>>choice3;
switch (choice3)
{ case 'y':
stus.infile(head);
break;
case 'n':
cout<<"按任意键继续"<<endl;
break;
}


break;

case '7':
if(head==NULL)
{
error();
break;
}
head=stus.clear(head);
cout<<"删除表成功~"<<endl;
getch();
break;
default :
cout<<" 对不起,您的输入有误,请重新输入。\n";
getch();
break;
}






}
getch();
return 0;
}
lelequan 2011-01-06
  • 打赏
  • 举报
回复
程序做到这里本来没涉及文件存储时还可以运行,但加了两个方法 infile()和 outfile()后就不对了,大虾们帮我看看那错了?

#include <iomanip>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

struct student
{
char name[15]; //姓名
char id[6]; //学号
char sex[6]; //性别
char snum[6]; //宿舍号
char qq[15]; //qq号
char tel[13]; //手机号
string addr; //家庭地址


student *next;
};//定义结构体


class stud
{
student *p1,*p2,*head;
public:

~stud() // 析构函数
{

while(head)
{
p1=head->next;
delete head;
head=p1;
}
}
// 成员函数
void output(student *head); // 输出学生信息
student* input(student *head); // 增加学生记录
student* del(student *head, char*p); // 删除记录
student* findn(student *head,char *p,int &n); // 按姓名查找学生信息记录(可查找多个同名数据)
student* findi(student *head,char *p,int &n); // 按学号查找学生信息记录
student* finds(student *head,char *p,int &n); // 按宿舍号查找学生信息记录
void infile(student *head); //存入文件
student *outfile(student *head); //将文件导出表
student* stat(student *head); //排序统计学生信息
student* clear(student *head); // 删除当前表
void Inputs(student *p); //用于添加数据的子函数
};


// 用于添加数据的子函
void stud::Inputs(student*p)
{
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

cin>>p->name>>p->id>>p->sex>>
p->snum>>p->qq>>p->tel>>p->addr;
}

// 输出学生成绩
void stud::output (student *head)
{ p1=head;
while(p1!=NULL)
{
cout<<setw(6)<<p1->name<<setw(6)
<<p1->id<<setw(6)<<p1->sex<<setw(8)<<p1->snum<<setw(8)
<<p1->qq<<setw(12)<<p1->tel<<setw(12)<<p1->addr<<endl;
p1=p1->next;
}
}

void stud::infile(student *head)//存入文件
{
p1=head;
ofstream fout("student.txt",ios::app);//创建文件,存放联系人信息
if(!fout)
cerr<<"Cannot open ! "<<endl;
else
while(p1=NULL)
{
cin>>p1->name>>p1->id>>p1->sex>>
p1->snum>>p1->qq>>p1->tel>>p1->addr;

fout<<"\n"<<name<<" "<<id<<" "<<sex<<" "<<snum<<" "<<qq<<" "<<tel<<" "<<addr;
p1=p1->next;
}
fout.close();
}

student *stud::outfile(student *head)//将文件导出表
{


p1=new student;
p2=head;
ifstream fin("student.txt",ios::in);
if(!fin)
cerr<<"Cannot open !"<<endl;
else
while(!fin.eof())
{
fin>>p1->name>>id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>p1->email>>p1->addr;

}
fin.close();//向p1中增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}





// 清空数据
student* stud::clear(student*head)
{
while(head)
{ p1=head->next ;
delete head;
head=p1;
}
return head;
}
// 排序统计函数
student *stud::stat(student *head)
{
p2=head;
p1=p2->next;

while(p2->next) //用冒泡法实现排序
{

if(p2->id > p1->id)
{ // 把头指针指向当前比较小的节点
p2->next=p1->next;
p1->next=head;
head=p1;

// 把用于比较的两个指针复位

p1=p2->next ;
}
else
{ // 指向下一个节点
p2=p2->next ;
p1=p2->next ;
}

}
cout<<"当前表以按学号排序完成"<<endl;
return head;
}

// 删除记录
student* stud::del (student *head,char *p)
{
p1=head;
p2=NULL;

while(strcmp(p1->name ,p)&& p1->next !=NULL)
{ p2=p1;
p1=p1->next ;
}

if(!strcmp(p1->name ,p))
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next ;

cout<<"删除成功,OK"<<endl;
delete p1;
}
else
cout<<" 没找到姓名"<<p<<"的学生.\n"; //结点没找到

return head ;
}

// 按姓名查找函数
student* stud::findn (student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->name,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按学号查找学生信息记录
student* stud::findi(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->id ,p) !=0 && p2->next !=NULL)
p2=p2->next ;
if(0==strcmp(p2->id,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 按宿舍号查找学生信息记录
student* stud::finds(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->snum ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->snum,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}

// 增加学生记录
student *stud::input (student *head)
{ p1=new student;
p2=head;
Inputs(p1); //调用子函数 增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;

return head;
}



// 输出错误
void error()
{
cout<<"错误,这还是一张空表,请输入数据"<<endl;
getch();

}
// 主函数
int main(void)
{
{
system("color 8e");//————添加背景颜色
}
stud stus;
student *head=NULL;
student *pd; //临时指针, 用于查找函数
char choice; //用于存放用户的选择项
char choice2,choice3;//用于细节选择
char name[10]; //查找,删除记录的 key
char snum[8];
char id[10];

while(1)
{ system("cls");

cout<<" ┏┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┓"<<endl;
cout<<" ┢ 学 生 信 息 管 理 系 统 ┪"<<endl;
cout<<" ┡━━━━━━━━━━━━━━━━━━━━┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┡ 1.增加学生信息 2.显示学生信息 ┩"<<endl;
cout<<" ┢ 3.排序统计信息 4.查找学生信息 ┪"<<endl;
cout<<" ┡ 5.删除学生信息 6.清空所有数据 ┩"<<endl;
cout<<" ┢ 7.保存学生信息 8.安全退出系统 ┪"<<endl;
cout<<" ┡ ┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┖┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┚"<<endl;
cout<<" 请输入您的选择(0--7):";cout<<endl;


int n=0; //计数器,用于在查找时计算有没有同名学生
cin>>choice;
fflush(stdin);

if(choice=='7') //退出程序
{ cout<<"谢谢使用,再见"<<endl;
exit(0);
}
switch(choice)
{
case '1': //增加学生信息
head=stus.input (head);
break;
case '2': //显示学生信息
if(head==NULL)
{
error();
break;
}
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);
getch();
break;
case '3': //排序学生信息
if(head==NULL)
{
error();
break;
}
head=stus.stat(head);
getch();
break;

case '4': //查找学生信息
if(head ==NULL)
{
error(); //调用函数输出错误信息
break;
}

cout<<"请选择:"<<endl;
cout<<"a.按姓名查找"<<endl;
cout<<"b.按学号查找"<<endl;
cout<<"c.宿舍号查找"<<endl;
cin>>choice2;

switch(choice2)//选择a,b,c
{
case 'a'://按姓名查找
{
cout<<"请输入要查找的学生姓名(可查找相同姓名的学生)"<<endl;
cin>>name;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"<<setw(6)
<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findn (pd,name,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点,可以查找同名学生
}
getch();
break;
}

case 'b'://按学号查找
{
cout<<"请输入要查找的学生学号"<<endl;
cin>>id;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findi (pd,id,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}

case 'c'://按宿舍号查找
{
cout<<"请输入要查找的宿舍号"<<endl;
cin>>snum;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;

while(pd) //循环调用函数, 用于输出多个相同宿舍学生的信息
{
pd=stus.finds (pd,snum,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}
}//choice2选择结束

break;
//case'4'结束

case '5': //删除学生信息
if(head==NULL)
{
error();
break;
}
cout<<"学生数据如下"<<endl;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);

cout<<"请输入想要删除学生姓名"<<endl;

cin>>name;
head=stus.del(head,name);
getch();
break;

case '6':
if(head==NULL)
{
error();
break;
}
cout<<"确定要保存数据吗?"<<endl;
cout<<"选择y/n:"
cin>>choice3;
switch (choice3)
{ case 'y':
stus.infile(head);
break;
case 'n':
cout<<"按任意键继续"<<endl;
break;
}


break;

case '7':
if(head==NULL)
{
error();
break;
}
head=stus.clear(head);
cout<<"删除表成功~"<<endl;
getch();
break;
default :
cout<<" 对不起,您的输入有误,请重新输入。\n";
getch();
break;
}






}
getch();
return 0;
}
***********************************************************************
***********************************************************************
大虾们帮我看看是哪错了~
lelequan 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bdmh 的回复:]

自己写的,当个参考吧
http://blog.csdn.net/bdmh/archive/2011/01/02/6112631.aspx
[/Quote]

我们让用C++做,我没学C,基础薄弱。。。但你的程序很漂亮哈~
lelequan 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhoutanliang 的回复:]

作业么。。
[/Quote]

但是我快“改”出来了,汗~~ 是课程设计,除了用链表存入文件和把文件数据输出链表,这个地方做得有错误但改不出来~晕呐
AlanBruce 2011-01-03
  • 打赏
  • 举报
回复
作业么。。
bdmh 2011-01-03
  • 打赏
  • 举报
回复
lelequan 2011-01-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yangglemu 的回复:]
写文件的时候将结构挨个写进去就行了,next那个指针就不要写了(链表在磁盘上类似数组排列)
读出来的时候文件指针要按结构大小移动,直到文件尾,每读取一个结构(固定字节大小数据块)出来,就建立一个结点,后一个的地址赋给前一个的next,每个读取出来的当然是表头了
[/Quote]
可不可以具体点~~Orz。。。。
加载更多回复(3)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧