某班学生成绩管理,包括以下功能:1.从键盘输入包括学号、姓名、各门课程成绩,并将其保存在磁盘文件student里2.打开文件后,计算每个人的总分和平均分,排序并保存3.具有在文件中进行单项查询或多项查询的功能(即能够按照给定的关键字姓名等找出满足条件的纪录)4.具有输出文件数据信息的功能
希望对你有帮助。将职工改成学生。 /************************************************** 内容及要求: 1注册新职工,添加新职工的详细信息, 如:职工号,姓名,出生年份,性别,职称,部门,工资等; 2按姓名,部门等条件进行查询; 3修改和删除职工信息; 4按工资高低进行排序; 5把各项纪录存储在文本文件中。 ----ky kuaidh00, 2008/01/05.------------------- 评说:有删除和增加的操作,最好选取链表来做。 **************************************************/ #include <string> #include <iostream> #include <fstream> #include <iomanip> #include <memory.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> using namespace std; struct Employee {//声明职工的结构作为链表节点。 //-----数据域----- string m_Code; string m_Name; unsigned short int m_Year; string m_Sex; string m_Post; string m_Department; unsigned int m_Wage; //链表节点的指针域--- struct Employee* Next; }; //-----个人习惯:取别名------- typedef struct Employee Node; typedef Node* Link; //-------函数声明------------- Link Create(Link Head); void Release(Link Head); Link Add(Link Head); bool Search(Link Head); Link Search_Unique(Link Head); void Display_List(Link Head); void Display_Node(Link pNode); Link Modify(Link Head); Link Del(Link Head); void Save_ByFile(Link Head,fstream& ofile); Link Sort(Link Head); //-------函数实现-------------------------- Link Create(Link Head) {//创建一个带头节点的空链表。 Head=(Link)new Node; if(!Head) { cout<<"分配内存失败!"<<endl; return NULL; } Head->m_Code=""; Head->m_Name=""; Head->m_Year=0; Head->m_Sex=""; Head->m_Post=""; Head->m_Department=""; Head->m_Wage=0; Head->Next=NULL; return Head; } void Release(Link Head) {//释放链表。 Link ptr;//声明一个操作用的指针。 while(Head!=NULL) { ptr=Head; Head=Head->Next; delete ptr;//释放节点资源。 } } Link Add(Link Head) {//前插法添加数据。 Link pNew;// 声明一个新节点。 char again; string code,name,sex,post,department; unsigned short int year; unsigned int wage; do { pNew=(Link)new Node; //数据域。 cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"请输入职工姓名:"; cin>>name; cout<<endl<<"请输入职工出生年份:"; cin>>year; while(cin.fail()) { cout<<"请输入正确的年份格式。"<<endl; cin.clear(); fflush(stdin); cin>>year; } cout<<endl<<"请输入职工性别:"; cin>>sex; cout<<endl<<"请输入职工职称:"; cin>>post; cout<<endl<<"请输入职工部门:"; cin>>department; cout<<endl<<"请输入职工工资:"; cin>>wage; while(cin.fail()) { cout<<"请输入正确的工资数据。"<<endl; cin.clear(); fflush(stdin); cin>>wage; } cout<<endl; pNew->m_Code=code; pNew->m_Name=name; pNew->m_Year=year; pNew->m_Sex=sex; pNew->m_Post=post; pNew->m_Department=department; pNew->m_Wage=wage; //指针域。 pNew->Next=Head->Next; Head->Next=pNew; cout<<"数据添加成功!是否继续添加?(Y/N)"<<endl; cin>>again; }while(again=='Y'||again=='y'); return Head; } bool Search(Link Head) {//查询同时满足“姓名”和“部门”的职工信息。 Link ptr; string department; string name; ptr=Head->Next; cout<<"请输入部门:"; cin>>department; cout<<endl<<"请输入姓名:"; cin>>name; cout<<endl<<"----------------查询结果------------------"<<endl; while(ptr) { if((ptr->m_Name==name)&&(ptr->m_Department==department)) { Display_Node(ptr);//打印满足条件的节点。 return true; } ptr=ptr->Next;//查询下一节点。 } cout<<"无此职工的信息。"<<endl; return false; } Link Search_Unique_Front(Link Head) {//查询满足“职工代码“的职工信息(职工代码必需唯一)。 Link ptr; string code; ptr=Head; cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"----------------查询结果------------------"<<endl; while(ptr->Next) { if(ptr->Next->m_Code==code) //Display_Node(ptr);//打印满足条件的节点。 return ptr;//注意,是返回的查询到的节点的直接前趋节点。 ptr->Next=ptr->Next->Next;//查询下一节点。 } return ptr; } void Display_List(Link Head) { Link ptr; ptr=Head->Next; cout<<"==================所有职工信息=================="<<endl; while(ptr) { Display_Node(ptr); ptr=ptr->Next; } } void Display_Node(Link pNode) {//在标准输出设备上输出。 cout<<setw(10)<<left<<pNode->m_Code <<setw(10)<<left<<pNode->m_Name <<setw(10)<<left<<pNode->m_Year <<setw(10)<<left<<pNode->m_Sex <<setw(10)<<left<<pNode->m_Post <<setw(10)<<left<<pNode->m_Department <<setw(10)<<left<<pNode->m_Wage<<endl;//setw(10)表示占10个字符位置。 } Link Modify(Link Head) {// 修改单一个节点。 Link ptr; ptr=Search_Unique_Front(Head); string code,name,sex,post,department; unsigned short int year; unsigned int wage; if(ptr->Next) { cout<<"-------你现在可以修改此职工的信息了-------"<<endl; //数据域。 cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"请输入职工姓名:"; cin>>name; cout<<endl<<"请输入职工出生年份:"; cin>>year; while(cin.fail()) { cout<<"请输入正确的年份格式。"<<endl; cin.clear(); fflush(stdin); cin>>year; } cout<<endl<<"请输入职工性别:"; cin>>sex; cout<<endl<<"请输入职工职称:"; cin>>post; cout<<endl<<"请输入职工部门:"; cin>>department; cout<<endl<<"请输入职工工资:"; cin>>wage; while(cin.fail()) { cout<<"请输入正确的工资数据。"<<endl; cin.clear(); fflush(stdin); cin>>wage; } cout<<endl; ptr->Next->m_Code=code;//因ptr是前趋节点,所以要用ptr->Next; ptr->Next->m_Name=name; ptr->Next->m_Year=year; ptr->Next->m_Sex=sex; ptr->Next->m_Post=post; ptr->Next->m_Department=department; ptr->Next->m_Wage=wage; } cout<<"没找到此职工的记录,无法修改。"<<endl; return Head; } Link Del(Link Head) { Link ptr; Link ptr_front; ptr_front=Search_Unique_Front(Head); ptr=ptr_front->Next; if(ptr) { ptr_front->Next=ptr->Next; delete ptr;//删除此节点。 } cout<<"没找到此职工的记录,无法删除。"<<endl; return Head; } void Save_ByFile(Link Head,fstream& ofile) { Link pNode; pNode=Head->Next; ofile.clear();//清除文件结束状态。 while(pNode) { ofile<<setw(10)<<left<<pNode->m_Code <<setw(10)<<left<<pNode->m_Name <<setw(10)<<left<<pNode->m_Year <<setw(10)<<left<<pNode->m_Sex <<setw(10)<<left<<pNode->m_Post <<setw(10)<<left<<pNode->m_Department <<setw(10)<<left<<pNode->m_Wage<<endl;//setw(10)表示占10个字符位置。 pNode=pNode->Next; } cout<<"数据文件保存成功!"<<endl; } Link Sort(Link Head) {//我创建的是带头节点的链表。用直接插入法。 if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。 { cout<<"数据节点数少于2个,不用排序!"<<endl; return Head; } //-----------第二步; Link ptr; Link ptr_F; Link ptr_N; ptr=Head->Next->Next; ptr_F=Head; Head->Next->Next=NULL;//到此,分成了两个链表。 //第三步。 while(ptr) { ptr_N=ptr->Next; ptr_F=Head;//ptr_F的归位。 while(ptr_F->Next) { if(ptr->m_Wage>ptr_F->Next->m_Wage) { ptr->Next=ptr_F->Next; ptr_F->Next=ptr; break; }//if else { ptr_F=ptr_F->Next; } }//while(ptr_F->Next) if(ptr_F->Next==NULL) { ptr->Next=ptr_F->Next; ptr_F->Next=ptr;//表示插到有序链表的最后面了。 } ptr=ptr_N;//归位,准备下一次排序。 }//while(ptr) cout<<"从高到低,排序成功!"<<endl; return Head; } int main() { Link Head=0; Head=Create(Head); fstream iofile; iofile.open("d:\\iofile.txt",ios_base::in|ios_base::out|ios_base::app);//文件以三种方式打开。 if(!iofile) { cout<<"打开文件失败!"<<endl; return -1; } int menu; while(1) { cout<<"*****************************************************"<<endl; cout<<"*====================菜单选顶=======================*"<<endl; cout<<"*===================================================*"<<endl; cout<<"* 1.注册职工 2.修改信息 3.删除信息 4.信息查询 *"<<endl; cout<<"* 5.保存文件 6.工资排行 7.信息显示 0.退出系统 *"<<endl; cout<<"*****************************************************"<<endl; cout<<endl<<"请选择相应操作菜单项:"; cin>>menu; while(cin.fail()) { cout<<"请选择正确的菜单选项。"<<endl; cin.clear(); fflush(stdin); cin>>menu; } switch(menu) { case 0: cout<<"成功退出系统!"<<endl; return 0; case 1: Head=Add(Head); break; case 2: Head=Modify(Head); break; case 3: Head=Del(Head); break; case 4: Search(Head); break; case 5: Save_ByFile(Head,iofile); break; case 6: Sort(Head); break; case 7: Display_List(Head); break; default: cout<<"请选择正确的菜单项进行操作。多谢合作!"<<endl; } } Release(Head); iofile.close(); return 0; }
这是我在大学时做的,你看看:/* 程序功能: 能完成每位学生的某门课程的平时成绩和期末考试成绩的录入, 完成每位学生的总评成绩计算(平时成绩*30%+期末考试成绩*70%)并生成数据文件, 生成分数段统计文件(不及格人数,60-69数,70-79人数,80-89人数,90-100人数,及格 率), 通过学生成绩的数据文件查询学生成绩(查询条件自定)。 通过学生成绩的分段统计文件输出学生成绩分段情况和及格率。 程序要求: (1)能够完成300人以内任何人数的成绩处理。 (2)程序要有主控菜单 */ #include<stdio.h> #include<stdlib.h> #include<string.h> struct stud { long num; char name[20]; double score; }; typedef struct stucode { struct stud student ; struct stucode *next; }L; void menu(); void createlist(struct stucode **r); void out(struct stucode *r); void search1(struct stucode *r); void search2(struct stucode *r); void del(struct stucode **r); void insert(struct stucode **r); void sort(struct stucode **r); void main() { char choose; int flag=1; struct stucode *r=NULL; while(flag) { system("cls"); menu(); choose=getchar(); switch(choose) { case '1': createlist(&r); out(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '2': search1(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '3': search2(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '4': del(&r); out(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '5': insert(&r); out(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '6': sort(&r); out(r); printf("Testing function 1\nPress any key to continue\n"); getchar(); getchar(); break; case '7': out(r); printf("Testing function 7\nPress any key to continue\n"); getchar(); getchar(); break; case '0': flag=0; printf("The end.\n"); break; default: printf("\nWrong Selection!(选择错误,请重选!)\n");getchar();getchar(); } } } void createlist(struct stucode **r) { struct stucode *p,*t; long n; char a[20]; double s; if(*r) *r=NULL; printf(" \n请输入:\n 学号(请按学号升序排列) 姓名 分数 (若要结束请输入三个为零) \n"); scanf("%ld%s%lf",&n,a,&s); if(n==0) return; p=(L *)malloc(sizeof(L)); p->student.num=n; strcpy(p->student.name,a); p->student.score=s; p->next=NULL; *r=p; scanf("%ld%s%lf",&n,a,&s); while(n) { t=p; p=(L *)malloc(sizeof(L)); p->student.num=n; strcpy(p->student.name,a); p->student.score=s; p->next=NULL; t->next=p; scanf("%ld%s%lf",&n,a,&s); } } void search1(struct stucode *r) { long x; if(!r) { printf("没有学生信息可查询!\n"); return ; } printf(" 请输入要查询的学生信息的学生学号:\n"); scanf("%ld",&x); while(r&&r->student.num!=x) r=r->next; if(r==NULL) printf("Error! No such student !\n"); else printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score); } void search2(struct stucode *r) { char m[20]; if(!r) { printf("没有学生信息可查询!\n"); return ; } printf(" 请输入要查询的学生信息的学生姓名:\n"); scanf("%s",m); while(r&&strcmp(r->student.name,m)) r=r->next; if(r==NULL) printf("Error! No such student !\n"); else printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score); } void del(struct stucode **r) { long k; struct stucode *p=*r,*t; if(!(*r)) { printf("没有学生信息可删除 !\n"); return ; } printf(" 请输入要删除的学生信息的学生学号:\n"); scanf("%ld",&k); if(p->student.num==k) *r=(*r)->next,free(p); else { while(p->next&&p->next->student.num!=k) p=p->next; if(p->next==NULL) printf("Error! No such student !\n"); else { t=p->next; p->next=p->next->next; free(t); } } } void insert(struct stucode **r) { long n; char a[20]; double s; L *p,*t,*k; printf(" 请输入要插入的学生信息的学生学号 姓名 分数:\n"); scanf("%ld%s%lf",&n,a,&s); p=(L *)malloc(sizeof(L)); p->student.num=n; p->student.score=s; strcpy(p->student.name,a); if(!(*r)) { *r=p; (*r)->next=NULL; return ; } if(p->student.num<(*r)->student.num) p->next=(*r),(*r)=p; else { t=*r; k=t; while(t->next&&t->next->student.num<=p->student.num) t=t->next; p->next=t->next; t->next=p; *r=k; } } void sort(struct stucode **r) { struct stucode *t,*p,*q,*z; if(!r) { printf("没有学生信息可排序!\n"); return ; } if(!(*r)||!(*r)->next) return; t=*r; p=t->next; t->next=NULL; while(p) { q=p->next; if(p->student.score>t->student.score) { p->next=t; t=p; } else { z=t; while(z->next&&z->next->student.score>=p->student.score) z=z->next; p->next=z->next; z->next=p; } p=q; } *r=t; } void out(struct stucode *r) { printf("\n\n"); if(!r) { printf("没有学生信息可输出!\n"); return ; } while(r) { printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score); r=r->next; } printf("\n\n"); } void menu() { printf("\n 学生信息管理系统\n"); printf("\n 菜单\n\n"); printf("\n 1建立链表并显示\n"); printf("\n 2查找某学号的学生信息\n"); printf("\n 3查找某姓名的学生信息\n"); printf("\n 4删除某学号的学生信息\n"); printf("\n 5插入新的学生信息\n"); printf("\n 6按分数降序排列输出\n"); printf("\n 7输出\n"); printf("\n 0退出\n"); printf("\n 请选择您要执行的选项:\n"); }