用c++编一个学生信息管理系统设计

已知有20个学生记录(包括学号、姓名、成绩)的文件student.dat,所有学生以学号从小到大排序(该文件自行建立)。要求编程序实现查询、排序、插入、删除诸功能。
系统的基本功能:A.要求显示如下界面****************************************
1--------------查询
2--------------排序
3--------------插入
4--------------删除
****************************************
通过选择1-4来确定要做哪一个操作。B.若选1,则出现如下界面****************************************
1.1----------按学号查询
1.2----------按姓名查询
1.3----------按成绩查询
****************************************
通过选择1.1-1.3来确定要做哪一个操作,其中:按学号查询用二分法实现;按姓名查询用顺序法实现;按成绩查询实现查询成绩小于m分的学生;找到该生将学生记录输出到屏幕,若查无此人,输出相关信息。C.若选2,则按成绩从大到小排序,姓名,学号顺序也随之调整。D.若选3,将一个新学生记录按学号顺序插入,并把结果保存到文件student.dat中。E.若选4,删除指定学生的记录,并把结果保存到文件student.dat中。F.以上各个功能均编写成子函数,由主函数调用实现。

用C语言编的.凑和着看,以前写的.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
int number;
char name[10];
float yuwen;
float yingyu;
float shuxue;
float aver;
struct student *next;
};
typedef struct student node;
typedef node *link;
int n;
/*建立菜单*/
void menu(void)
{printf("---------------主菜单---------------\n");
printf("-------输入'1',输入学生成绩---------\n");
printf("-------输入'2',查询学生成绩---------\n");
printf("-------输入'3',修改学生成绩---------\n");
printf("-------输入'4',添加学生成绩---------\n");
printf("-------输入'5',删除学生成绩---------\n");
printf("-------输入'6',按照平均分排序-------\n");
printf("-------输入'7',显示学生成绩---------\n");
printf("-------输入'8',显示全班总平均分-----\n");
printf("-------输入'9',退出-----------------\n");
}

/*建立数据信息即链表*/
link creat(void)
{
link head,p1,p2;
head=NULL;
n=0;
p1=p2=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
while(p1->number)
{
printf("姓名:");
scanf("%s",p1->name);
printf("语文成绩:");
scanf("%f",&p1->yuwen);
printf("英语成绩:");
scanf("%f",&p1->yingyu);
printf("数学成绩:");
scanf("%f",&p1->shuxue);
p1->aver=(p1->yuwen+p1->yingyu+p1->shuxue)/3;
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
}
p2->next=NULL;
return(head);
}

/*查找并显示信息按照学号*/
void find(link head)
{
link p;
int number;
int flag=1;
char c;
if(head==NULL)printf("信息系统为空!无法查询!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要查询学生的学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要查找的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生不存在!\n",number);
printf("是否继续查询?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}

/*修改学生成绩信息*/
void modi(link head)
{
link p;
int number;
int tnumber;
char tname[10];
float tyuwen,tyingyu,tshuxue,taver;
int flag=1;
char c;
if(head==NULL)printf("学生成绩系统为空!无法修改!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要修改的学生学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("学号: ");
scanf("%d",&tnumber);
printf("姓名:");
scanf("%s",tname);
printf("语文成绩:");
scanf("%f",&tyuwen);
printf("英语成绩:");
scanf("%f",&tyingyu);
printf("数学成绩:");
scanf("%f",&tshuxue);
getchar();
taver=(tyuwen+tyingyu+tshuxue)/3;
printf("是否保存?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
p->number=tnumber;
strcpy(p->name,tname);
p->yuwen=tyuwen;
p->yingyu=tyingyu;
p->shuxue=tshuxue;
p->aver=taver;
printf("保存成功!\n");
}
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生成绩信息不存在!!!\n",number);
printf("是否继续修改?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}

/*插入学生信息*/
link insert(link head)
{
link p,p1;
int flag=1;
char c;
while(flag)
{
p=(link)malloc(sizeof(node));
printf("输入学号: ");
scanf("%d",&p->number);
printf("姓名:");
scanf("%s",p->name);
printf("语文成绩:");
scanf("%f",&p->yuwen);
printf("英语成绩:");
scanf("%f",&p->yingyu);
printf("数学成绩:");
scanf("%f",&p->shuxue);
getchar();
p->aver=(p->yuwen+p->yingyu+p->shuxue)/3;
if(head==NULL)head=p;
else
{
p1=head;
while(p1->next!=NULL)p1=p1->next;
p1->next=p;
}
p->next=NULL;
n++;
printf("插入学生信息如下:\n");
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否继续插入?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}

/*删除学生信息*/
link del(link head)
{
link p,p2;
int flag=1;
int number;
char c;
if(head==NULL)printf("信息系统为空!无法删除!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("输入要删除的学生学号: ");
scanf("%d",&number);
getchar();
p2=p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要删除的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否确定删除?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
if(p==head)head=p->next;
else p2->next=p->next;
n--;
printf("删除成功!!\n");
}
break;
}
else
{
p2=p;
p=p->next;
}
}
if(p==NULL)printf("学号为%d的学生信息不存在!!!\n",number);
if(head==NULL)
{
printf("信息系统为空,无法继续删除!\n");
getchar();
break;
}
printf("是否继续删除?(y/n )");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}

/*输出学生成绩信息*/
void print(link head)
{
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
printf("一共有%d个学生的信息:\n",n);
p=head;
while(p)
{
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
p=p->next;
}
printf("按任意键回到主菜单!\n");
}
}

/*用选择法排序*/
link sort(link head)
{
link beforep,p,p1,k,beforek,temp;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{p=head;
while(p->next!=NULL)
{
k=p;
p1=p->next;
while(p1!=NULL)
{
if(k->aver<p1->aver)k=p1;
p1=p1->next;
}
if(k!=p)
{
beforek=head;
while(beforek->next!=k)beforek=beforek->next;
if(p==head)head=k;
else beforep->next=k;
beforek->next=p;
temp=k->next;
k->next=p->next;
p->next=temp;
p=k;
}
beforep=p;
p=p->next;
}
printf("排序成功,按任意键回到主菜单!\n");
}
return(head);
}

/*求全班总平均分并显示*/
void average(link head)
{
float toaver,sum=0;
int num=0;
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
p=head;
while(p!=NULL)
{
sum+=p->aver;
num++;
p=p->next;
}
toaver=sum/num;
printf("全班总平均分是:%7.2f\n",toaver);
printf("按任意键回到主菜单!\n");
}
}

void main()
{
int k;
int flag=1;
link head=NULL;
while(1)
{
menu();
flag=1;
while(flag)
{
printf("请输入:(1~9) ");;
scanf("%d",&k);
getchar();
if(k>=1&&k<=9)flag=0;
else printf("输入错误!\n");
}
switch(k)
{
case 1:head=creat();break;
case 2:find(head);break;
case 3:modi(head);break;
case 4:head=insert(head);break;
case 5:head=del(head);break;
case 6:head=sort(head);break;
case 7:print(head);break;
case 8:average(head);break;
case 9:return;
}
getch();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-14
下面是我以前写的一个,你自己在上面改一下吧,主要是查询的地方,我只写了按学号查询的代码,其它的你要自己写了,其它方面的都有

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 10

typedef struct //将学生信息定义为结构体
{
char number[20];
char name[20];
int age;
float grade[3]; //3个数组元素分别代表数学、英语、物理成绩
}student;

student whole[N]; //储存学生信息
int row=0;
FILE *fp;

void FileWrite() //输出到文件中
{
int i;
fclose(fp);
if((fp=fopen("student.txt","w"))==0)
{
printf("can't open student.txt");
exit(1);
}
for(i=0;i<row-1;i++)
fprintf(fp,"%-16s%-16s%d\t%3.1f\t%3.1f\t%3.1f\n",whole[i].number,whole[i].name,whole[i].age,whole[i].grade[0],whole[i].grade[1],whole[i].grade[2]);
fprintf(fp,"%-16s%-16s%d\t%3.1f\t%3.1f\t%3.1f",whole[i].number,whole[i].name,whole[i].age,whole[i].grade[0],whole[i].grade[1],whole[i].grade[2]);
fclose(fp);
if((fp=fopen("student.txt","r"))==0)
{
printf("can't open student.txt");
exit(1);
}
return;
}

void CopyAll(student *to,student from) //复制学生信息
{
int i;
strcpy(to->name,from.name);
strcpy(to->number,from.number);
to->age=from.age;
for(i=0;i<3;i++)
to->grade[i]=from.grade[i];
}

int Find(char *number) //查找学生
{
int i;
for(i=0;i<row;i++)
if(strcmp(whole[i].number,number)==0)
return i;
return -1;
}

void Modify(student change) //修改学生信息
{
int n;
n=Find(change.number);
if(n<0)
{
printf("can't find the student of the number\n");
return;
}
CopyAll(&whole[n],change);
puts("Modify the information successful");
}

void Insert(student add) //插入学生信息
{
int i,n;
char choose;
if(Find(add.number)>=0)
{
printf("The student is exist.Do you want to Modify the student's information? Y/N : ");
fflush(stdin);
scanf("%c",&choose);
if(choose=='Y')
Modify(add);
return ;
}
for(i=0;i<row&&strcmp(add.number,whole[i].number)>0;i++);
n=i;
for(i=row;i>n;i--)
CopyAll(&whole[i],whole[i-1]);
CopyAll(&whole[n],add);
printf("Add the information seccessful\n");
row++;
}

void Delete(char *number) //删除学生信息
{
char choose;
int n,i;
n=Find(number);
if(n<0)
{
printf("can't find the student of the number\n");
return;
}
puts("the information of the student:\n");
puts("\tnumber\t\tname\t\tage\tmath\tenglish\tphysics\n");
printf("\t%-16s%-16s%d\t%3.1f\t%3.1f\t%3.1f\n",whole[n].number,whole[n].name,whole[n].age,whole[n].grade[0],whole[n].grade[1],whole[n].grade[2]);
printf("Are you sure to delete the student.Y/N : ");
fflush(stdin);
scanf("%c",&choose);
if(choose=='Y')
{
for(i=n;i<row-1;i++)
CopyAll(&whole[i],whole[i+1]);
printf("the student is delete successful\n");
row--;
}
}

void Score(char *number,float grade[3]) //改变成绩
{
int n,i;
student change;
n=Find(number);
strcpy(change.number,number);
strcpy(change.name,whole[n].name);
change.age=whole[n].age;
for(i=0;i<3;i++)
change.grade[i]=grade[i];
CopyAll(&whole[n],change);
}

void RegisterScore(char *number,float grade[3]) //登记成绩
{
int n;
n=Find(number);
if(n<0)
{
printf("can't find the student of the number\n");
return;
}
Score(number,grade);
puts("Register the information successful");
}
void ModifyScore(char *number,float grade[3]) //修改成绩
{
int n;
n=Find(number);
if(n<0)
{
printf("can't find the student of the number\n");
return;
}
Score(number,grade);
puts("Modify the information successful");
}

void BrowseScore() //浏览全班学生成绩
{
int i;
puts("the information of the score:\n");
puts("\tnumber\t\tmath\tenglish\tphysics\n");
for(i=0;i<row;i++)
printf("\t%-16s%3.1f\t%3.1f\t%3.1f\n\n",whole[i].number,whole[i].grade[0],whole[i].grade[1],whole[i].grade[2]);
}

void CountScore(student *all,float *total) //计算学生总成绩
{
int i,j;
for(i=0;i<row;i++)
{
total[i]=0;
for(j=0;j<3;j++)
total[i]+=all[i].grade[j];
}
puts("the information of the score:\n");
puts("\tnumber\t\tmath\tenglish\tphysics\ttotal\n");
for(i=0;i<row;i++)
printf("\t%-16s%3.1f\t%3.1f\t%3.1f\t%3.1f\n\n",all[i].number,all[i].grade[0],all[i].grade[1],all[i].grade[2],total[i]);
}

void PrintTotal() //输出所有学生信息
{
int i;
puts("the information of the student:\n");
puts("\tnumber\t\tname\t\tage\tmath\tenglish\tphysics\n");
for(i=0;i<row;i++)
printf("\t%-16s%-16s%d\t%3.1f\t%3.1f\t%3.1f\n\n",whole[i].number,whole[i].name,whole[i].age,whole[i].grade[0],whole[i].grade[1],whole[i].grade[2]);
}

void Menu() //菜单
{
puts("*****************************************************\n");
puts("please select a choose:(End by 0)\n");
puts("A:\n\n\tInsert a new recode.");
puts("B:\n\n\tModify a recode.");
puts("C:\n\n\tDelete a recode.");
puts("D:\n\n\tRegister score.");
puts("E:\n\n\tModify score.");
puts("F:\n\n\tBrowse all the score of the class.");
puts("\n*****************************************************\n");
}

int main() //主函数
{
char choose,number[20];
float total[N];
int i=0;
float NewScore[3],MdScore[3];
student NewRecode,ModifyRecode;
if((fp=fopen("student.txt","r"))==0)
{
printf("can't open the file student.txt\n");
exit(1);
}
while(!feof(fp)) //将文件信息读入数组whole
{
fscanf(fp,"%s%s%d%f%f%f",whole[i].number,whole[i].name,&whole[i].age,&whole[i].grade[0],&whole[i].grade[1],&whole[i].grade[2]);
row++; //记录行数(即学生数)
i++;
}
PrintTotal();
Menu();
while(scanf("%c",&choose)) //选择操作
{
if(choose=='0')
break;
system("cls");
switch(choose)
{
case 'A':
puts("please enter the information of the new student like this:\n");
puts("number name age math english physycs\n");
fflush(stdin);
scanf("%s%s%d%f%f%f",NewRecode.number,NewRecode.name,&NewRecode.age,&NewRecode.grade[0],&NewRecode.grade[1],&NewRecode.grade[2]);
Insert(NewRecode);
break;
case 'B':
puts("please enter the new information of the student you want to Modify like this:\n");
puts("number name age math english physycs\n");
fflush(stdin);
scanf("%s%s%d%f%f%f",ModifyRecode.number,ModifyRecode.name,&ModifyRecode.age,&ModifyRecode.grade[0],&ModifyRecode.grade[1],&ModifyRecode.grade[2]);
Modify(ModifyRecode);
break;
case 'C':
puts("please enter the number of the student you want to delete:\n");
fflush(stdin);
scanf("%s",number);
Delete(number);
break;
case 'D':
puts("please enter the number and the score of the new student like this:\n");
puts("number math english physycs\n");
fflush(stdin);
scanf("%s%f%f%f",number,&NewScore[0],&NewScore[1],&NewScore[2]);
RegisterScore(number,NewScore);
break;
case 'E':
puts("please enter the number and the score of the student like this:\n");
puts("number math english physycs\n");
fflush(stdin);
scanf("%s%f%f%f",number,&MdScore[0],&MdScore[1],&MdScore[2]);
ModifyScore(number,MdScore);
break;
case 'F':
BrowseScore();
break;
default:
printf("please attention to the Case\n");
break;
}
FileWrite();
fflush(stdin); //清空缓存
system("pause");
system("cls");
Menu();
puts("please select a choose:(End by 0)\n");
}
CountScore(whole,total);
PrintTotal();
fclose(fp);
return 0;
}
第2个回答  2008-04-14
.....又见广告

稍微对这个题目有点兴趣,如果今天写完的话发上来