c语言编学生成绩管理

某班学生成绩管理,包括以下功能:
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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-01-21
这是我在大学时做的,你看看:
/*
程序功能:
能完成每位学生的某门课程的平时成绩和期末考试成绩的录入,
完成每位学生的总评成绩计算(平时成绩*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");
}
相似回答