![]() |
#2
li_danwang2011-01-10 09:36
发个类似的学生系统 改下对应结构体成员
#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[10]; /// 姓名 char id[10]; /// 学号 float Ynum; /// 语文分数 float Snum; /// 数学分数 float Enum; /// 英语分数 float number; /// 总分 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* find(student *head,char *p,int &n); // 查找学生记录(可查找多个同名数据) student* stat(student *head); //排序统计学生总分 friend void total(student*head); //统计学生总分 student* insert(student *head); //按学生总分插入记录 student* clear(student *head); // 删除当前表 void Inputs(student *p); //用于添加数据的子函数 };//---------------------------------------------------- ////---------用于添加数据的子函数-------/////// void stud::Inputs(student*p) { cout<<setw(6)<<"姓名"<<setw(8)<<" 学号" <<setw(8)<<"语文"<<setw(8)<<"数学" <<setw(8)<<"英语"<<endl; cin>>p->name >>p->id; cin >>p->Ynum; while(cin.fail()) { cerr<<"您的输入有误,请重新输入"<<endl; cin.clear (); cin.sync (); cin>>p->Ynum; } cin>>p->Snum; while(cin.fail()) { cerr<<"您的输入有误,请重新输入"<<endl; cin.sync (); cin.clear (); cin>>p->Snum; } cin>>p->Enum; while(cin.fail()) { cerr<<"您的输入有误,请重新输入"<<endl; cin.clear (); cin.sync (); cin>>p->Enum; } total(p); //计算出总分 } ////////-----输出学生成绩-----------------///////////////////// void stud::output (student *head) { p1=head; while(p1!=NULL) { cout<<setw(6)<<p1->name<<setw(8) <<p1->id<<setw(8)<<p1->Ynum <<setw(8)<<p1->Snum <<setw(8) <<p1->Enum <<setw(7)<<p1->number <<endl; p1=p1->next ; } } /////////------------插入学生成绩记录--------//////////////// student* stud::insert(student *head) { p1=new student; Inputs(p1); //调用子函数 增加数据 p2=head; student* p3=NULL; while((p2->number < p1->number ) && p2->next !=NULL) { p3=p2; p2=p2->next; } if(p2->number > p1->number) { p1->next=p2; if(p3==NULL) // 若当前值是最小的 return p1; p3->next =p1; return head; } else { 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->number > p1->number) { // 把头指针指向当前比较小的节点 p2->next=p1->next; p1->next=head; head=p1; // 把用于比较的两个指针复位 p2=head; 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 ; } ///////----------统计总分---------------/////////////// void total(student *p) { p->number = p->Ynum + p->Snum + p->Enum; } ///////-------------查找函数----------/////////////////// student* stud::find (student *head,char *p,int& n) { p2=head; while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) p2=p2->next ; if(0==strcmp(p2->name,p)) { cout<<setw(6)<<p2->name<<setw(8) <<p2->id<<setw(8)<<p2->Ynum <<setw(8)<<p2->Snum <<setw(8) <<p2->Enum <<setw(7)<<p2->number <<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(); } ///////////////////------------main函数--------////////////// int main(void) { stud stus; student *head=NULL; student *pd; //临时指针, 用于查找函数 char choice; //用于存放用户的选择项 char name[10]; //查找,删除记录的 key while(1) { system("cls"); cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"; cout<<"┃**************** ☆ 学 生 成 绩 管 理 系 统 ☆ ****************** ┃"; cout<<"┃********** ★★★★★ ★★★★★★★ ★★★★★ *********** ┃"; cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫"; cout<<"┃****************★ ☆ 1.增加学生成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 2.显示学生成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 3.排序统计成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 4.查找学生成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 5.删除学生成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 6.插入学生成绩 ☆ ★****************┃"; cout<<"┃****************★ ☆ 7.清空所有数据 ☆ ★****************┃"; cout<<"┃****************★ ☆ 8.安全退出系统 ☆ ★****************┃"; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"; cout<<" 请输入您的选择(0--8):";cout<<endl; int n=0; //计数器,用于在查找时计算有没有同名学生 cin>>choice; fflush(stdin); if(choice=='8') //安全退出 { cout<<"谢谢使用,再见"<<endl; exit(0); }//------------------------------------------------ switch(choice) { case '1': head=stus.input (head); break;//------------------------------------------------ case '2': if(head==NULL) { error(); break; } cout<<setw(6)<<"姓名"<<setw(8)<<" 学号" <<setw(8)<<"语文"<<setw(8)<<"数学" <<setw(8)<<"英语"<<setw(13)<<"总分!!!"<<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; cin>>name; pd=head; cout<<setw(6)<<"姓名"<<setw(8)<<" 学号" <<setw(8)<<"语文"<<setw(8)<<"数学" <<setw(8)<<"英语"<<setw(13)<<"总分!!!"<<endl; while(pd) // 循环调用函数, 用于输出多个的同名学生成绩 { pd=stus.find (pd,name,n); if(pd==NULL) break; pd=pd->next ; //指针指向当前以找到的下一个节点,用于查找多个同名学生 } getch(); break;//------------------------------------------------ case '5': if(head==NULL) { error(); break; } cout<<"请输入想要删除学生姓名"<<endl; cin>>name; head=stus.del(head,name); getch(); break;//------------------------------------------------ case '6': if(head==NULL) { error(); break; } head=stus.stat (head); head=stus.insert(head); break;//----------------------------------------------- case '7': if(head==NULL) { error(); break; } head=stus.clear(head); cout<<"删除表成功~"<<endl; getch(); break;//----------------------------------------------- default : cout<<" 对不起,您的输入有误,请重新输入。\n"; getch(); break; }//------------------------------------------------------ } getch(); return 0; } |
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。编写一个菜单驱动的程序。实现如下管理功能:
学生信息录入功能---输入
学生信息浏览功能---输出
排序
按学号查询
按姓名查询
学生信息的删除与修改