您现在的位置是: 首页 > 教育改革 教育改革

高考成绩管理系统c,高考成绩登录入口

tamoadmin 2024-07-09 人已围观

简介1.c++ 学生成绩管理系统2.C语言学生管理系统3.用C++编写一个学生成绩管理系统,并编写一个友元函数能完成对成绩进行从高到低排序4.求以下c语言编程:一个简单的学生成绩管理系统。其中每个学生信息包括学号、姓名、数学成绩、英语成绩5.有关C语言程序(学生成绩管理程序)呵呵,刚好我们有一个c++大型作业,学生成绩管理系统,就把我的代码帖给你,可以运行。#include<iostream.h

1.c++ 学生成绩管理系统

2.C语言学生管理系统

3.用C++编写一个学生成绩管理系统,并编写一个友元函数能完成对成绩进行从高到低排序

4.求以下c语言编程:一个简单的学生成绩管理系统。其中每个学生信息包括学号、姓名、数学成绩、英语成绩

5.有关C语言程序(学生成绩管理程序)

高考成绩管理系统c,高考成绩登录入口

呵呵,刚好我们有一个c++大型作业,学生成绩管理系统,就把我的代码帖给你,可以运行。

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

#include<string.h>

#include<stdio.h>

classStu?//构建学生类

{

public:

friend?void?Input(Stu?stud[])?;

friend?void?Statistic(Stu?stud[]);

friend?void?Lookup(Stu?stud[])?;

friend?void?Modify(Stu?stud[])?;

friend?void?Delete(Stu?stud[])?;

friend?void?Output(Stu?stud[])?;

friend?void?Sort(Stu?stud[])?;

friend?void?Insert(Stu?stud[])?;

friend?void?Write(Stu?stud[],int?n);

friend?int?Read(Stu?stud[]);

private:

char?class_0[20];

intnum;

char?name[8];

float?elec;

float?c_program;

float?media;

float?english;

float?math;

float?sport;

float?polity;

float?average;

int?order;

}stud[100];

void?Write(Stu?stud[],int?n)//向文件中写入数据

{

fstream?myFile;

myFile.open("student.dat",ios::out|ios::binary);

if(!myFile)

{

cout<<"student.dat?can't?open!"<<endl;

abort();

}

int?count=n;

myFile<<count<<endl<<endl;

for(int?i=0;i<=count;i++)

{

myFile<<stud[i].class_0<<"?"<<stud[i].num<<"?"<<stud[i].name<<"?"<<stud[i].elec<<"?"<<stud[i].c_program<<"?"<<stud[i].media<<"?"<<stud[i].english

<<"?"<<stud[i].math<<"?"<<stud[i].sport<<"?"<<stud[i].polity<<"?"<<stud[i].average<<endl;

}

myFile.close();

}

int?Read(Stu?stud[])//从文件中读数据

{

fstream?myFile;

myFile.open("student.dat",ios::in|ios::binary);

if(!myFile)

{

cout<<"student.dat?can't?open!"<<endl;

abort();

}

int?count;

myFile.seekg(0);

myFile>>count;

for(int?i=0;i<=count;i++)

{?

myFile>>stud[i].class_0>>stud[i].num>>stud[i].name>>stud[i].elec>>stud[i].c_program>>stud[i].media>>stud[i].english>>stud[i].math>>stud[i].sport>>stud[i].polity>>stud[i].average;

}

myFile.close();

return?count?;

}

void?Input(Stu?stud[])//---------------输入学生成绩

{

system("cls");?/*运行前清屏*/

int?i=0;

int?flag;

char?sign;

cout<<endl<<"====>>?请输入学生成绩?<<===="<<endl;

while(sign!='n'&&sign!='N')?/*判断*/?

{?

cout<<"?班级:";?/*交互输入*/?

cin>>stud[i].class_0;?

loop:

cout<<"?学号:";?

cin>>stud[i].num;

int?c=0;

while(c<i)

{

c++;

if(stud[i].num==stud[i-c].num)

{

cout<<"?你输入的学号已经存在!请重新输入。"<<endl;

goto?loop;

}

}

cout<<"?姓名:?";?

cin>>stud[i].name;?

do{

flag=0;

cout<<"?模拟电路:";?

cin>>stud[i].elec;?

if(stud[i].elec>100?||stud[i].elec<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{

flag=0;

cout<<"?C++程序设计成绩:";?

cin>>stud[i].c_program;?

if(stud[i].c_program>100?||stud[i].c_program<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{?

flag=0;

cout<<"?软件工程成绩:";?

cin>>stud[i].media;?

if(stud[i].media>100?||stud[i].media<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{?

flag=0;

cout<<"?大学英语成绩:";?

cin>>stud[i].english;?

if(stud[i].english>100?||stud[i].english<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{?

flag=0;

cout<<"?大学物理成绩:";?

cin>>stud[i].math;

if(stud[i].math>100?||stud[i].math<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{?

flag=0;

cout<<"?大学体育成绩:";?

cin>>stud[i].sport;?

if(stud[i].sport>100?||stud[i].sport<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

do{?

flag=0;

cout<<"?民族理论:";?

cin>>stud[i].polity;?

if(stud[i].polity>100?||stud[i].polity<1)?

cout<<"对不起,请输入1-100之间的数字!!\n";?

else?

flag=1;

}while(flag==0);?

stud[i].average=(stud[i].elec+stud[i].c_program+stud[i].media+stud[i].english+stud[i].math+stud[i].sport+stud[i].polity)/7;?

cout<<"?平均分为:"<<stud[i].average<<endl;?

cout<<"====>提示:是否继续写入学生成绩?(Y/N)";?

cin>>sign;?/*输入判断*/?

i++;?

}?

Write(stud,i);

}

void?Statistic(Stu?stud[])?//---------------统计学生数据

{

system("cls");?/*运行前清屏*/

int?n=Read(stud);

cout<<endl<<"====>>?输出学生统计数据?<<===="<<endl;

cout<<"班级"<<"\t"<<"学号"<<"\t"<<"?姓名"<<"\t"<<"?平均分"<<endl;

for(int?i=0;i<n;i++)

cout<<stud[i].class_0<<"\t"<<stud[i].num<<"\t"<<stud[i].name<<"\t"<<stud[i].average<<endl;

system("pause");?

}

void?Lookup(Stu?stud[])?//---------------查找学生成绩?

{?

system("cls");?/*运行前清屏*/

int?n=Read(stud);

int?s;?

int?i=0;

cout<<endl<<"====>>?查找学生成绩?<<===="<<endl;

cout<<"请输入需要查找学生的学号:"<<endl;?

cin>>s;?

while((stud[i].num-s)!=0&&i<n)?i++;?/*查找判断*/?

if(i==n)?

{?

cout<<"=====>提示:对不起,无法找到该学生的信息!"<<endl;?/*输入失败信息*/?

}?

else

{

cout<<"---------------------------"<<endl;?

cout<<"班级:"<<stud[i].class_0<<endl;?/*输出该学生信息*/?

cout<<"学号:"<<stud[i].num<<endl;?

cout<<"姓名:"<<stud[i].name<<endl;?

cout<<"模拟电路:"<<stud[i].elec<<endl;?

cout<<"C++程序设计:"<<stud[i].c_program<<endl;?

cout<<"软件工程:"<<stud[i].media<<endl;?

cout<<"大学英语:"<<stud[i].english<<endl;?

cout<<"大学物理:"<<stud[i].math<<endl;?

cout<<"大学体育:"<<stud[i].sport<<endl;?

cout<<"民族理论:"<<stud[i].polity<<endl;?

cout<<"平均分:"<<stud[i].average<<endl;

}

}

void?Modify(Stu?stud[])?//---------------修改学生成绩

{?

system("cls");?/*运行前清屏*/

int?n=Read(stud);

int?s;?

int?i=0;

cout<<endl<<"====>>?修改学生成绩?<<===="<<endl;

cout<<"请输入需要修改成绩学生的学号:"<<endl;?

cin>>s;?

while((stud[i].num-s)!=0&&i<n)?i++;?/*查找判断*/?

if(i==n)?

{?

cout<<"=====>提示:对不起,无该学生的成绩……"<<endl;?/*输入失败信息*/

}?

else

{

cout<<"----------该学生的信息----------"<<endl;?/*格式头*/?

cout<<"班级"<<"\t"<<"学号"<<"\t"<<"姓名"<<"\t"<<"电子"<<"\t"<<"c++"<<"\t"<<"?多媒体"<<"\t"<<"英语"<<"\t"<<"数学"<<"\t"<<"体育"<<"\t"<<"政治"<<"\t"<<"平均分"<<endl;

cout<<"---------------------------------"<<endl;?

cout<<stud[i].class_0<<"\t"<<stud[i].num<<"\t"<<stud[i].name<<"\t"<<stud[i].elec<<"\t"<<stud[i].c_program<<"\t"<<stud[i].media<<"\t"<<stud[i].english<<"\t"<<stud[i].math<<"\t"<<stud[i].sport<<"\t"<<stud[i].polity<<"\t"<<stud[i].average<<endl;

cout<<"请重新输入该学生的信息"<<endl;

cout<<"班级:"<<endl;?/*交互输入*/?

cin>>stud[i].class_0;?

cout<<"学号:"<<endl;?

cin>>stud[i].num;?

cout<<"姓名:"<<endl;?

cin>>stud[i].name;?

cout<<"模拟电路成绩:"<<endl;?

cin>>stud[i].elec;

cout<<"C++程序设计成绩:"<<endl;?

cin>>stud[i].c_program;?

cout<<"软件工程成绩:"<<endl;?

cin>>stud[i].media;?

cout<<"大学英语成绩:"<<endl;?

cin>>stud[i].english;?

cout<<"大学物理成绩:"<<endl;?

cin>>stud[i].math;

cout<<"大学体育成绩:"<<endl;?

cin>>stud[i].sport;?

cout<<"民族理论成绩:"<<endl;?

cin>>stud[i].polity;?

stud[i].average=(stud[i].elec+stud[i].c_program+stud[i].media+stud[i].english+stud[i].math+stud[i].sport+stud[i].polity)/7;?

cout<<"平均分为:"<<stud[i].average<<endl;

char?c;

cout<<"是否保存数据?(y/n)"<<endl;

cin>>c;

if(c!='n'&&c!='N')

Write(stud,n);

}

}

void?Delete(Stu?stud[])?//---------------按学号查找,删除学生信息?

{

system("cls");?/*运行前清屏*/?

int?n=Read(stud);

int?s;?

int?i=0,j;

cout<<endl<<"====>>?删除学生成绩?<<===="<<endl;

cout<<"请输入需要删除学生的学号:"<<endl;?/*交互式问寻*/?

cin>>s;?

while((stud[i].num-s)!=0&&i<n)?i++;?/*查找判断*/?

if(i==n)?

{?

cout<<"====>提示:对不起,无法找到该学生……"<<endl;?/*返回失败信息*/?

}?

else

{

for(j=i;j<n-1;j++)?/*删除操作*/?

{?

strcpy(stud[j].class_0,stud[j+1].class_0);?

stud[j].num=stud[j+1].num;?

strcpy(stud[j].name,stud[j+1].name);?

stud[j].elec=stud[j+1].elec;?

stud[j].c_program=stud[j+1].c_program;?

stud[j].media=stud[j+1].media;?

stud[j].english=stud[j+1].english;?

stud[j].math=stud[j+1].math;?

stud[j].sport=stud[j+1].sport;?

stud[j].polity=stud[j+1].polity;

stud[j].average=stud[j+1].average;

}

cout<<"====>提示:已成功删除!"<<endl;?/*返回成功信息*/

}?

Write(stud,n-1);

}?

void?Insert(Stu?stud[])//---------------增加学生成绩?

{?

system("cls");?/*运行前清屏*/

int?n=Read(stud);

char?s;

cout<<endl<<"====>>?增加学生成绩<<===="<<endl;

while(s!='n'&&s!='N')

{

cout<<"班级:"<<endl;?/*交互输入*/?

cin>>stud[n].class_0;?

cout<<"学号:";?

cin>>stud[n].num;?

cout<<"姓名:";?

cin>>stud[n].name;?

cout<<"模拟电路成绩:";?

cin>>stud[n].elec;?

cout<<"C++程序设计成绩:";?

cin>>stud[n].c_program;?

cout<<"软件工程成绩:";?

cin>>stud[n].media;?

cout<<"大学英语成绩:";?

cin>>stud[n].english;?

cout<<"大学物理成绩:";?

cin>>stud[n].math;?

cout<<"大学体育成绩:";?

cin>>stud[n].sport;?

cout<<"民族理论成绩:";?

cin>>stud[n].polity;?

stud[n].average=(stud[n].elec+stud[n].c_program+stud[n].media+stud[n].english+?stud[n].math+stud[n].sport+stud[n].polity)/7;?

cout<<"平均分"<<stud[n].average;

n++;?

cout<<"=====>提示:插入成功!"<<endl;?/*返回成功信息*/

cout<<"是否继续输入(y/n)"<<endl;

cin>>s;

}

Write(stud,n);?

}

void?Sort(Stu?stud[])?//---------------按平均分对学生成绩记录项进行降序排序?

{

system("cls");?/*运行前清屏*/?

int?i,j,k;?

float?s;?

char?t[20];

cout<<endl<<"====>>?降序排序成绩?<<===="<<endl;

int?n=Read(stud);

for(i=0;i<n-1;i++)?/*冒泡法排序*/?

for(j=0;j<n-1-i;j++)?

if(stud[j].average<stud[j+1].average)?

{?

strcpy(t,stud[j+1].class_0);?

strcpy(stud[j+1].class_0,stud[j].class_0);?

strcpy(stud[j].class_0,t);?

k=stud[j+1].num;?

stud[j+1].num=stud[j].num;?

stud[j].num=k;?

strcpy(t,stud[j+1].name);?

strcpy(stud[j+1].name,stud[j].name);?

strcpy(stud[j].name,t);?

s=stud[j+1].elec;?

stud[j+1].elec=stud[j].elec;?

stud[j].elec=s;?

s=stud[j+1].c_program;?

stud[j+1].c_program=stud[j].c_program;?

stud[j].c_program=s;?

s=stud[j+1].media;?

stud[j+1].media=stud[j].media;?

stud[j].media=s;?

s=stud[j+1].english;?

stud[j+1].english=stud[j].english;?

stud[j].english=s;?

s=stud[j+1].math;?

stud[j+1].math=stud[j].math;?

stud[j].math=s;?

s=stud[j+1].sport;?

stud[j+1].sport=stud[j].sport;?

stud[j].sport=s;?

s=stud[j+1].polity;?

stud[j+1].polity=stud[j].polity;?

stud[j].polity=s;?

s=stud[j+1].average;?

stud[j+1].average=stud[j].average;?

stud[j].average=s;?

}?

cout<<"----------------------------------------------------"<<endl;?/*格式头*/?

cout<<"班级"<<"\t"<<"学号"<<"\t"<<"姓名"<<"\t"<<"电子"<<"\t"<<"C++"<<"\t"<<"多媒体"<<"\t"<<"英语"<<"\t"<<"数学"<<"\t"<<"体育"<<"\t"<<"政治"<<"\t"<<"平均分"<<"\t"<<"名次"<<endl;?

cout<<"----------------------------------------------------"<<endl;?

for(i=0;i<n;i++)?/*循环输入*/?

{?stud[i].order=i+1;

cout<<stud[i].class_0<<"\t"<<stud[i].num<<"\t"<<stud[i].name<<"\t"<<stud[i].elec<<"\t"<<stud[i].c_program<<"\t"<<stud[i].media<<"\t?"<<stud[i].english<<"?\t"<<?stud[i].math<<"\t"<<stud[i].sport<<"\t?"<<stud[i].polity<<"\t"<<stud[i].average<<"\t"<<stud[i].order<<endl;?

}?

Write(stud,n);

}

void?Output(Stu?stud[])?//---------------显示全部学生成绩?

{?

system("cls");?/*运行前清屏*/

int?n=Read(stud);

cout<<endl<<"====>>?显示全部学生成绩?<<===="<<endl;

if(!stud)

cout<<"没有记录";?

else

{

cout<<"----------------------------------------------------"<<endl;?/*格式头*/?

cout<<"班级"<<"\t"<<"学号"<<"\t"<<"姓名"<<"\t"<<"电子"<<"\t"<<"c++"<<"\t"<<"多媒体"<<"\t"<<"英语"<<"\t"<<"数学"<<"\t"<<"体育"<<"\t"<<"政治"<<"\t"<<"平均分"<<endl;

cout<<"------------------------------------------------"<<endl;?

for(int?i=0;i<n;i++)?/*循环输入*/?

{?

cout<<stud[i].class_0<<"\t?"<<stud[i].num<<"\t?"<<stud[i].name<<"\t?"<<stud[i].elec<<"?\t"<<stud[i].c_program<<"\t?"<<stud[i].media<<"\t?"<<stud[i].english<<"\t?"<<?stud[i].math<<"?\t"<<stud[i].sport<<"\t"<<stud[i].polity<<"\t"<<stud[i].average<<endl;?

}?

cout<<"--------------------------------------------------------"<<endl;

}?

}

int?menu()?/*菜单函数*/?

{

char?c;?

do?

{?

system("cls");?/*运行前清屏*/?

cout<<"?-----------------<<欢迎您使用学生成绩管理系统--------------\n"<<endl;?

cout<<"?*******************************************\n\n"<<endl;/*菜单选择*/

cout<<"1、输入学生成绩?"<<endl;?

cout<<"2、显示统计数据?"<<endl;?

cout<<"3、查找学生成绩?"<<endl;?

cout<<"4、修改学生成绩?"<<endl;?

cout<<"5、删除学生成绩?"<<endl;?

cout<<"6、插入学生成绩?"<<endl;?

cout<<"7、按平均分降序排列?"<<endl;?

cout<<"8、显示全部学生成绩?"<<endl;?

cout<<"0、退出本系统"<<endl<<endl;?

cout<<"*********************************************"<<endl;?

cout<<"请你选择操作(0-8):"<<endl;?

c=getchar();?/*读入选择*/?

}?

while(c<'0'||c>'8');?

return(c-'0');?/*返回选择*/?

}?

void?main()?/*主函数*/?

{?

for(;;)?

{?

switch(menu())?/*选择判断*/?

{?

case?1:?

Input(stud);/*输入学生成绩*/?

break;?

case?2:?

Statistic(stud);?/*输出学生统计数据*/?

break;

case?3:?

Lookup(stud);?/*查找学生成绩*/

cout<<"\t\t\t";?

system("pause");?

break;?

case?4:

Modify(stud);?/*修改学生成绩*/

cout<<"\t\t\t";?

system("pause");?

break;?

case?5:?

Delete(stud);?/*按学号查找,删除学生信息*/?

cout<<"\t\t\t";?

system("pause");?

break;?

case?6:

Insert(stud);/*增加学生成绩*/?

cout<<"\t\t\t";?

system("pause");?

break;?

case?7:

Sort(stud);?/*按平均分对成绩记录项进行降序排序*/

cout<<"\t\t\t";?

system("pause");?

break;?

case?8:?

Output(stud);/*显示全部学生成绩*/

cout<<"\t\t\t";?

system("pause");?

break;?

case?0:?

cout<<endl<<"?================================<<感谢您使用学生成绩管理系统>>===============================\n"<<endl;?/*结束程序*/?

cout<<"\t\t\t";?

system("pause");?

exit(0);?

}?

}?

}

c++ 学生成绩管理系统

#include<stdio.h>

#include<stdlib.h>

#include<string.h>struct record

{

char xuehao[10];//学号

char name[20]; //姓名

char sex[3];//性别

int ke1;//数学

int ke2 ;//语文

int ke3;//英语

int pin;

}stu[50];

int k=1,n,m;void readfile();

void seek();

void insert();

void del();

void save();

void menu();

void seek()

{int i,j,item,flag;<br>char s1[20];<br>printf("------------------\n");<br>printf("1.按学号查询\n");<br>printf("2.退出本菜单\n");<br>printf("------------------\n");<br>while(1)<br>{ printf("请选择子菜单编号:");<br>scanf("%d",&item);<br>flag=0;<br>switch(item)<br>{<br>case 1:<br>printf("请输入要查询的学生的学号:\n");<br>scanf("%s",s1);<br>for(i=0;i<n;i++)<br>if(strcmp(stu[i].xuehao,s1)==0)<br>{ flag=1;<br>printf("该学生学号,姓名,性别,数学,语文,英语 分别为:\n");<br>printf(" %s %s %s %d %d %d",stu[i].xuehao,stu[i].name,<br>stu[i].sex,stu[i].ke1,stu[i].ke2,stu[i].ke3);<br>}

if(flag==0)

printf("该学号不存在!\n"); break;

case 2:return;

default:printf("请在1-2之间选择\n");

}

}

}

void insert()

{ int i=n,j,flag;

printf("请输入待增加的学生数:\n");

scanf("%d",&m);

do

{ flag=1;

while(flag)

{ flag=0;

printf("请输入第 %d 个学生的学号:\n",i+1);

scanf("%s",stu[i].xuehao);

for(j=0;j<i;j++)

if(strcmp(stu[i].xuehao,stu[j].xuehao)==0)

{ printf("已有该学号,请检查后重新录入!\n");

flag=1;

break;

}

}

printf("请输入第 %d 个学生的姓名:",i+1);

scanf("%s",stu[i].name);

printf("\n请输入第 %d 个学生的性别:",i+1);

scanf("%s",stu[i].sex);

printf("\n请输入第 %d 个学生的数学成绩:",i+1);

scanf("%d",&stu[i].ke1);

printf("\n请输入第 %d 个学生的语文成绩:",i+1);

scanf("%d",&stu[i].ke2);

printf("\n请输入第 %d 个学生的英语成绩:",i+1);

scanf("%d",&stu[i].ke3);if(flag==0)

{ i=i;

i++;

}

}while(i<n+m);

n+=m;

printf("录入完毕!\n\n");

}void del()

{ int i,j,flag=0;

char s1[20];

printf("请输入要删除学生的学号:\n");

scanf("%s",s1);

for(i=0;i<n;i++)

if(strcmp(stu[i].xuehao,s1)==0)

{ flag=1;

for(j=i;j<n-1;j++)

stu[j]=stu[j+1];

}

if(flag==0)

printf("该学号不存在!\n");

if(flag==1)

{ printf("删除成功,显示结果请选择菜单6\n");

n--;

}

}

void readfile()

{

char buf[80],*p="student.dat";

FILE *fp;

int i=0;

if ((fp=fopen("student.dat","r"))==NULL)

{ printf("Open file %s error! Strike any key to exit!",p);

system("pause");

exit(0);

}

while(fscanf(fp,"%s%s%s%d%d%d",stu[i].xuehao,stu[i].name,

stu[i].sex,&stu[i].ke1,&stu[i].ke2,&stu[i].ke3)==6)

{ i++;

i=i;

}

fclose(fp);

n=i;

printf("录入完毕!\n");

}void save()

{ int i,j,k,flag=0;

FILE *fp;

fp=fopen("student.dat","w");

for(i=0;i<m;i++)

{

fprintf(fp,"%s%s%d%d%d",stu[i].xuehao,stu[i].name,stu[i].sex,&stu[i].ke1,

&stu[i].ke2,&stu[i].ke3);

fclose(fp);

printf("已储存");

}

}

void paixu()

{

int i,j,k,t;

for(i=0;i<m;i++)

{

stu[i].pin=(stu[i].ke1+stu[i].ke2+stu[i].ke3)/3;

}

for(i=0;i<=m-2;i++)

{

k=i;

for(j=i+1;j<=m-1;j++)

if(stu[j].pin<stu[k].pin)

k=j;

if(k!=i)

{

t=stu[k].pin;

stu[k].pin=stu[i].pin;

stu[i].pin=t;

}

}

for(i=0;i<m;i++)

{printf("第 %d 个学生的姓名%s:",i+1,stu[i].name);<br> printf("\n第 %d 个学生的性别:%s",i+1,stu[i].sex);<br> printf("\n第 %d 个学生的数学成绩:%d",i+1,stu[i].ke1);<br> printf("\n第 %d 个学生的语文成绩:%d",i+1,stu[i].ke2);<br> printf("\n第 %d 个学生的英语成绩:%d",i+1,stu[i].ke3);<br> printf("\n第 %d 个学生的平均成绩:%d",i+1,stu[i].pin);<br> }

}

void menu()

{ int nub;

printf(" \n\n学生成绩管理系统\n\n");

printf("*****系统功能菜单*****\n");

printf("----------------------\n");

printf("1.输入学生信息\n");

printf("2.查询学生信息\n");

printf("3.按学号删除信息\n");

printf("4.读入学生信息\n");

printf("5.保存信息(要把修改保存到文件,退出程序前必须执行本项)\n");

printf("6.查询学生平均成绩信息\n");

printf("0.退出系统\n");

printf("----------------------\n");

printf("请选择菜单编号:");

scanf("%d",&nub);

switch(nub)

{

case 1:insert();break;

case 2:seek();break;

case 3:del();break;

case 4:readfile();break;

case 5:save();break;

case 6:paixu();break;

case 0:k=0;break;

default:printf("请在0-6之间选择\n");

}}

void main()

{

while(k)

menu();

}

//平均数是排序后,输出的,如果你不想直接输入,那就不要对每个学生进行选择排序了

C语言学生管理系统

这是我刚改过的代码,还添加了求平均分的功能

#include<iostream.h>

#include<string.h>

#include<fstream.h>

class stu

{

char name[20];

int ba;

double math,number,chinese,english,average,sum;

public:

stu()

{

}

stu(char n[20],int ban,double nu,double ma,double chin,double eng)

{

strcpy(name,n);

ba=ban;

number=nu;

math=ma;

chinese=chin;

english=eng;

}

double getsum()

{

sum=chinese+english+math;

return sum;

}

double getaver()

{

average=getsum()/3;

return average;

}

friend void main();

};

void main()

{

cout<<"(0)数据录入 (1)增加人员"<<endl;

cout<<"(2)删除人员 (3)修改数据"<<endl;

cout<<"(4)按学号查询 (5)按姓名查询"<<endl;

cout<<"(6)输出所有学生的数据 (7)按总分查询排名"<<endl;

cout<<"(8)按语文查询排名 (9)按数学查询排名"<<endl;

cout<<"(y)按英语查询排名 "<<endl;

cout<<"选择相关操作请输入相对的括号里的阿拉伯数字或字母!"<<endl;

char p;char w;

stu *s[50];

ofstream *file[50];

int i=0;

int j=0;

bool flag2=0;

do

{

cin>>p;

if((p>='0'&&p<='9'))

flag2=1;

else

cout<<"指令错误!请重新输入:"<<endl;

}while(flag2==0);

do{

switch(p)

{

case '0':

{

char c;

char name[20];int ba ;double number, math,chinese,english;

do{

cout<<"请输入姓名"<<endl;

cin>>name;

cout<<"请输入班级:"<<endl;

cin>>ba;

cout<<"请输入您要增加的学生的学号:"<<endl;

cin>>number;

cout<<"请输入数学成绩:"<<endl;

cin>>math;

cout<<"请输入语文成绩:"<<endl;

cin>>chinese;

cout<<"请输入外语成绩:"<<endl;

cin>>english;

file[j]=new ofstream("d:\\document",ios::ate);

*file[j]<<"姓名"<<name<<"班级"<<ba<<"学号"<<number<<"数学成绩"<<math<<"语文成绩"<<chinese<<"外语成绩"<<english<<endl;

j++;

s[i]=new stu(name,ba,number, math, chinese, english);

i++;

cout<<"数据录入成功,想继续录入吗(y/n)"<<endl;

cin>>c;

do

{

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

else

flag2=1;

}while(flag2==0);

}while(c=='y');

break;

}

case '1':

{

char name[20];int ba;double number,math,chinese,english;

char c;

do

{

cout<<"请输入您要增加的学生的姓名:"<<endl;

cin>>name;

cout<<"请输入要增加的学生的班级:"<<endl;

cin>>ba;

cout<<"请输入您要增加的学生的学号:"<<endl;

cin>>number;

cout<<"请输入数学成绩:"<<endl;

cin>>math;

cout<<"请输入语文成绩:"<<endl;

cin>>chinese;

cout<<"请输入外语成绩:"<<endl;

cin>>english;

file[j]=new ofstream("d:\\document",ios::ate);

*file[j]<<"姓名"<<name<<"班级"<<ba<<"学号"<<number<<"数学成绩"<<math<<"语文成绩"<<chinese<<"外语成绩"<<english<<endl;

j++;

s[i]=new stu(name, ba,number,math, chinese, english);

i++;

cout<<"数据录入成功,想继续录入吗(y/n)"<<endl;

cin>>c;

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

}while(c=='y');

break;

}

case '2':

{

char name[20];bool flag3=0;char c;

do{

cout<<"请输入您要删除的学生姓名:"<<endl;

cin>>name;

for(int h=0;h<i;h++)

{

if(strcmp(name,s[h]->name)==0)

{

flag3=1;

i--;

do{

s[h]=s[h+1];

h++;

}while(h<=i);

}

}

if(flag3==0)

cout<<"您要求删除的对象本来就不存在!请检查输入的正确性!";

cout<<"要继续删除吗?(y/n)"<<endl;

cin>>c;

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

}while(c=='y');

break;

}

case '3':

{

char name[20];double mat,chin,eng;flag2=0;

char c;

do

{

cout<<"请输入您要修改的学生的姓名:"<<endl;

cin>>name;

for(int h=0;h<i;h++)

{

if(strcmp(name,s[h]->name)==0)

{

flag2=1;

cout<<"请输入新的数学成绩:"<<endl;

cin>>mat;

cout<<"请输入新的语文成绩:"<<endl;

cin>>chin;

cout<<"请输入新的外语成绩:"<<endl;

cin>>eng;

s[h]->chinese=chin;

s[h]->math=mat;

s[h]->english=eng;

cout<<"数据修改成功!";

}

}

if(flag2==0)

{

cout<<"您要修改的学生本来就不存在!请检查重新输入!"<<endl;

}

cout<<"想继续修改吗(y/n)"<<endl;

cin>>c;

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

}while(c=='y');

break;

}

case '4':

{

double t;char c;

do

{

int flag1=0;

cout<<"请输入你要查询学生的学号"<<endl;

cin>>t;

for(int q=0;q<i;q++)

{

if(s[q]->number==t)

{

flag1=1;

cout<<"您要查询的学生是:"<<(*s[q]).name

<<"数学成绩为:"<<s[q]->math

<<"语文成绩为:"<<s[q]->chinese

<<"英语成绩为:"<<s[q]->english

<<"总分为:"<<s[q]->getsum()

<<endl;

}

}

if(flag1==0)

cout<<"对不起!您要查询的学生不存在!"<<endl;

cout<<"您想继续查询吗?(y/n)"<<endl;

cin>>c;

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

}

while(c=='y');

break;

}

case '5':

{

char n[20];int j=0;char c;

do{

int flag=0;

cout<<"请输入你要查询的学生姓名"<<endl;

cin>>n;

for(int j=0;j<i;j++)

{

if(strcmp(n,(*s[j]).name)==0)

{

flag=1;

cout<<"您要查询的学生是:"<<(*s[j]).name

<<endl;

cout<<(*s[j]).name<<"的总成绩成绩是"<<(*s[j]).getsum()

<<"班级:"<<" "<<s[j]->ba

<<"语文:"<<" "<<s[j]->chinese

<<"数学:"<<" "<<s[j]->math

<<"外语:"<<" "<<s[j]->english

<<"平均成绩是:"<<(*s[j]).getaver()

<<endl;

}

}

if(flag==0)

cout<<"对不起!您要查询的学生不存在!"<<endl;

cout<<"您想继续查询吗?(y/n)"<<endl;

cin>>c;

if(c!='y'&&c!='n')

{

cout<<"指令错误!请重新输入!"<<endl;

cin>>c;

}

}

while(c=='y');

break;

}

case '6':

{

cout<<"本系统所有学生数据如下:"<<endl;

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!"<<endl;

for(int k=0;k<i;k++)

{

cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name

<<"班级"<<s[k]->ba

<<"学号"<<s[k]->number

<<"语文:"<<" "<<s[k]->chinese<<"数学:"

<<" "<<s[k]->math

<<"外语:"<<" "<<s[k]->english

<<"总分:"<<" "<<(*s[k]).getsum()

<<"平均分:"<<" "<<(*s[k]).getaver()

<<endl;

}

break;

}

case '7':

{

int t;stu b;

cout<<"本系统所有学生总分排名如下:"<<endl;

for(int x=0;x<i-1;x++)

{

t=x;

for(int y=x+1;y<i;y++)

{

if((s[t]->getsum())<(s[y]->getsum()))

t=y;

if(t!=x)

{

b=*s[x];

*s[x]=*s[t];

*s[t]=b;

}

}

}

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!";

double o1,o2;

for(int k=0;k<i;k++)

{

cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name

<<"班级"<<s[k]->ba

<<"学号"<<s[k]->number

<<"语文:"<<" "<<s[k]->chinese

<<"数学:"<<" "<<s[k]->math

<<"外语:"<<" "<<s[k]->english

<<"总分:"<<" "<<s[k]->getsum()

<<"平均分:"<<" "<<s[k]->getaver()

<<endl;

o1=s[k]->sum;

o2=s[0]->sum;

}

cout<<"总分最高分"<<o2<<endl

<<"总分最低分"<<o1<<endl

<<endl;

break;

}

case '8':

{

int t;stu b;

cout<<"本系统所有学生语文排名如下:"<<endl;

for(int x=0;x<i-1;x++)

{

t=x;

for(int y=x+1;y<i;y++)

{

if((s[t]->chinese)<(s[y]->chinese))

t=y;

if(t!=x)

{

b=*s[t];

*s[t]=*s[x];

*s[x]=b;

}

}

}

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!";

double o1 ,o2;

for(int k=0;k<i;k++)

{

cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name

<<"班级"<<s[k]->ba

<<"学号"<<s[k]->number

<<"语文:"<<" "<<s[k]->chinese

<<"数学:"<<" "<<s[k]->math

<<"外语:"<<" "<<s[k]->english

<<"总分:"<<" "<<s[k]->getsum()

<<"平均分:"<<" "<<s[k]->getaver()

<<endl;

o1=s[k]->chinese;

o2=s[0]->chinese;

}

int v1=0,v2=0;double v3;

for(v2=0;v2<=i-1;v2++)

{

if(s[v2]->english>=60)

v1++;

}

v3=(v1*100)/v2;

cout<<"语文最高分"<<o2<<endl

<<"语文最低分"<<o1<<endl

<<"语文及格率"<<v3<<"%"

<<endl;

break;

}

case '9':

{

int t;stu b;

cout<<"本系统所有学生数学排名如下:"<<endl;

for(int x=0;x<i-1;x++)

{

t=x;

for(int y=x+1;y<i;y++)

{

if((s[t]->math)<(s[y]->math))

t=y;

if(t!=x)

{

b=*s[t];

*s[t]=*s[x];

*s[x]=b;

}

}

}

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!";

double o1,o2;

for(int k=0;k<i;k++)

{

cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name

<<"班级"<<s[k]->ba

<<"学号"<<s[k]->number

<<"语文:"<<" "<<s[k]->chinese

<<"数学:"<<" "<<s[k]->math

<<"外语:"<<" "<<s[k]->english

<<"总分:"<<" "<<s[k]->getsum()

<<"平均分:"<<" "<<s[k]->getaver()

<<endl;

o1=s[k]->math;

o2=s[0]->math;

}

int v1=0,v2=0;double v3;

for(v2=0;v2<=i-1;v2++)

{

if(s[v2]->english>=60)

v1++;

}

v3=(v1*100)/v2;

cout<<"数学最高分"<<o2<<endl

<<"数学最低分"<<o1<<endl

<<"数学及格率"<<v3<<"%"

<<endl;

break;

}

case 'y':

{

int t;stu b;

cout<<"本系统所有学生英语排名如下:"<<endl;

for(int x=0;x<i-1;x++)

{

t=x;

for(int y=x+1;y<i;y++)

{

if((s[t]->english)<(s[y]->english))

t=y;

if(t!=x)

{

b=*s[t];

*s[t]=*s[x];

*s[x]=b;

}

}

}

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!";

double o1,o2;

for(int k=0;k<i;k++)

{

cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name

<<"班级"<<s[k]->ba

<<"学号"<<s[k]->number

<< "语文:"<<" "<<s[k]->chinese

<<"数学:"<<" "<<s[k]->math

<<"外语:"<<" "<<s[k]->english

<<"总分:"<<" "<<s[k]->getsum()

<<"平均分:"<<" "<<s[k]->getaver()

<<endl;

o1=s[k]->english;

o2=s[0]->english;

}

int v1=0,v2=0;double v3;

for(v2=0;v2<=i-1;v2++)

{

if(s[v2]->english>=60)

v1++;

}

v3=(v1*100)/v2;

cout<<"英语最高分"<<o2<<endl

<<"英语最低分"<<o1<<endl

<<"英语及格率"<<v3<<"%"

<<endl;

}

break;

}

cout<<"您想继续进行其他操作吗?(y/n)"<<endl;

bool flag4=0;

do

{

cin>>w;

if(w!='y'&&w!='n')

cout<<"指令错误!请重新输入!"<<endl;

else

flag4=1;

}while(flag4==0);

if(w=='y')

cout<<" 请输入操作代码: "<<endl;

cout<<"0 录入 1 增加人员 2 删除人员"<<endl;

cout<<"3 修改数据 4 按学号查询 5 按姓名查询"<<endl;

cout<<"6 显示所有成员数据 7 按总分排名 8 按语文排名"<<endl;

cout<<"9 按数学排名 y按英语排名"<<endl;

cin>>p;

}while(w=='y');

}

用C++编写一个学生成绩管理系统,并编写一个友元函数能完成对成绩进行从高到低排序

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<conio.h>

#define max 20

typedef struct student //学生

{

char sno[max]; // 学号

char sname[max]; //姓名

char sex[max]; //性别

char age[max]; //年龄

char depart[max]; //系

char classs[max]; //班

char grade[max]; //年级

struct student* next;

} student;

student* head;

int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输

{

char username[max],password[max];

printf("\n请输入用户名:");

scanf("%s",username);

printf("\n请输入密码(最多15位):");

//开始以不回显且支持退格方式获取输入密码

int i=0;

while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围

{

if(password[i-1]=='\b')//对退格键的处理

{

printf("%c%c%c",'\b','\0','\b');

i=i-2;

}

else

printf("*");

}

password[--i]='\0';

//已获取密码。验证用户身份

if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))

{

printf("\n登录成功!");

return 1;

}

else

return 0;

}

void regist()

{

char ch;

student *s,*ptr; //s用来建新结点,ptr用来暂存头结点

do

{

s=(student*)malloc(sizeof(student)); // 新建一个学生结点

printf("\n开始注册..."); //开始注册

printf("\n请输入该学生的学号:");

scanf("%s",s->sno);

printf("\n请输入该学生的姓名:");

scanf("%s",s->sname);

printf("\n请输入该学生的性别:");

scanf("%s",s->sex);

printf("\n请输入该学生的年龄:");

scanf("%s",s->age);

printf("\n请输入该学生的系:");

scanf("%s",s->depart);

printf("\n请输入该学生所在的班:");

scanf("%s",s->classs);

printf("\n请输入该学生所在的年级");

scanf("%s",s->grade);

ptr=head;

head=s;//将新结点插入队头

s->next=ptr;

fflush(stdin);

printf("\n请问是否继续注册?(Y/N)");

scanf("%c",&ch);

}while(ch=='Y'||ch=='y');

return;

}

void ElePrint(char str[]) //输出单个元素

{

if(str==NULL) exit(0);

printf("%s",str);

for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格

return;

}

int LinePrint(student *ptr) //输出一行

{

if(ptr==NULL) //检查传进来的指针

return 0;

printf("\n");

ElePrint(ptr->sno);

ElePrint(ptr->sname);

ElePrint(ptr->age);

ElePrint(ptr->sex);

ElePrint(ptr->depart);

ElePrint(ptr->classs);

ElePrint(ptr->grade);

return 1;

}

void print() //输出全部学生信息

{

student *ptr=head;

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

while(ptr)

{

LinePrint(ptr);

ptr=ptr->next;

}

printf("\n");

return;

}

void search()//查询模块

{

int method;//查询方式

char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字

while(1)

{

printf("\n请选择查询方式");

printf("\n1.按学号查询");

printf("\n2.按姓名查询");

printf("\n3.按所在系查询");

printf("\n4.按所在班级查询");

printf("\n5.按所在年级查询");

printf("\n6.打印全部学生信息");

printf("\n7.返回主菜单\n");

scanf("%d",&method);

student *p=head,*temp;

switch(method)

{

case 1:

printf("\n请输入要查询的学号:");

scanf("%s",no);

while(p)

{

if(!strcmp(p->sno,no))

break;

else

{

temp=p;

p=p->next;

}

}

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

LinePrint(p);

break;

case 2:

printf("\n请输入要查询的姓名:");

scanf("%s",name);

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

while(p)

{

if(!strcmp(p->sname,name))

LinePrint(p);

p=p->next;

}

break;

case 3:

printf("\n请输入学生所在的系:");

scanf("%s",departm);

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

while(p)

{

if(!strcmp(p->depart,departm))

LinePrint(p);

p=p->next;

}

break;

case 4:

printf("\n请输入学生所在的班:");

scanf("%s",clss);

printf("\n请输入学生所在的年级:");

scanf("%s",grades);

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

while(p)

{

if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))

LinePrint(p);

p=p->next;

}

break;

case 5:

printf("\n请输入学生所在的年级:");

scanf("%s",grades);

printf("\n学号 姓名 年龄 性别 系 班 年级 ");

while(p)

{

if(!strcmp(p->grade,grades))

LinePrint(p);

p=p->next;

}

break;

case 6:

print();

break;

case 7:

return;

default:

printf("很抱歉,暂无此查询方式!");

break;

}

}

}

void modify()//修改学生信息

{

char num[max];

student *p=head;

printf("\n请输入要修改的学生的学号:");

scanf("%s",num);

while(p)

{

if(!strcmp(p->sno,num))

break;

else

p=p->next;

}

if(p==NULL)

{

printf("\n错误:没有此学生的信息!\n");

return;

}

LinePrint(p);

printf("\n请输入要修改的该学生的信息:");

printf("\n1.姓名");

printf("\n2.性别");

printf("\n3.年龄");

printf("\n4.所在的系");

printf("\n5.所在的班");

printf("\n6.所在的年级");

char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];

int select;

fflush(stdin);

scanf("%d",&select);

printf("\n请输入新的信息:");

switch(select)

{

case 1:

scanf("%s",name1);

strcpy(p->sname,name1);

break;

case 2:

scanf("%s",sex1);

strcpy(p->sex,sex1);

break;

case 3:

scanf("%s",age1);

strcpy(p->age,age1);

break;

case 4:

scanf("%s",depart1);

strcpy(p->depart,depart1);

break;

case 5:

scanf("%s",class1);

strcpy(p->classs,class1);

break;

case 6:

scanf("%s",grade1);

strcpy(p->grade,grade1);

break;

default:

printf("\nError!");

break;

}

LinePrint(p);

return;

}

void del()// 删除某学生的信息

{

student *p=head,*temp=head,*s;

char num1[max];

printf("\n请输入要删除的学生的学号:");

scanf("%s",num1);

while(p)//查找该学生所在的结点

{

if(!strcmp(p->sno,num1))

break;

else

{

temp=p;

p=p->next;

}

}//while

if(!p)

{

printf("\n不存在此学生的信息.");

return;

}

LinePrint(p);//输出该学生的信息

printf("\n请问真的要删除该学生的信息吗?(Y/N)");

char ch;

fflush(stdin);

scanf("%c",&ch);

if(ch=='Y'||ch=='y')

{

s=p->next;

temp->next=s;

free(p);

printf("\n已经删除该学生的信息.");

}

return;

}

void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现

{

student *ptr,*s=head,*p;

int count=0,count1;

while(s)//统计链表结点个数

{

count++;

s=s->next;

}

for(int i=1;i<count;i++)

{

ptr=head;

p=NULL;

count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点

while(ptr&&ptr->next&&(count1--))

{

if(strcmp(ptr->sno,ptr->next->sno)>0)

{

s=ptr->next;

ptr->next=s->next;

if(p==NULL) //ptr处于队头时

head=s;

else

p->next=s;

s->next=ptr;

p=s;

}

else

{

ptr=ptr->next;

if(p==NULL) //ptr处于队头时

p=head;

else

p=p->next;

}

}

}

return;

}

void quit()

{

char ch;

printf("\n真的要退出?(Y/N)");

fflush(stdin);

scanf("%c",&ch);

if(ch=='Y'||ch=='y')

exit(0);

return;

}

int main()

{

int option;

printf("\nCopyright@2005 KongXinCai All rights reserved.");

printf("\n欢迎使用学生信息管理系统!\n");

//登录模块

int icheck=0;

while(icheck<3)

{

if(LogOn()==0)

icheck++;

else

break;

}

if(icheck==3)

{

printf("\n连续登录三次不成功,退出!");

exit(0);

}

//系统界面

while(1)

{

printf("\n\n请选择需要的服务:");

printf("\n1.注册");

printf("\n2.查询");

printf("\n3.修改");

printf("\n4.删除");

printf("\n5.排序");

printf("\n7.求平均");

printf("\n6.退出\n");

scanf("%d",&option);

switch(option)

{

case 1:

regist();

break;

case 2:

search();

break;

case 3:

modify();

break;

case 4:

del();

break;

case 5:

sort();

break;

case 6:

quit();

break;

}

}

return 0;

}

求以下c语言编程:一个简单的学生成绩管理系统。其中每个学生信息包括学号、姓名、数学成绩、英语成绩

#include<iostream>

#include<fstream>

#include<string> //控制字符串的头文件

using namespace std;

class student//建立同学录的一个类

{

//头接点

public:

char name[20];

int num;

int age;

char sex;

double en;

double ma;

double com;

double ave;

student *next;

student *stu;

student(); //构造函数

void display()

{

cout<<"名字: "<<name<<" "<<"学号: "<<num<<" "<<"性别: "<<sex<<"年龄: "<<age<<"英语: "<<en<<" "<<"数学: "<<ma<<" "<<"计算机: "<<com<<endl;

}

student (char n[20],int nu, int ag, char se,double e,double m,double c,double av);

~ student ();

void Set();//添加

void Delete();//删除

void Alter();//修改

void List();//显示

void aver();

void ssearch();//查询

// void RearchN();

// void RearchNU();

void staxis(); //排序

void ssave(); //保存

void sload(); //读取

//排序函数

void pnumb();

void peng();

void pmat();

void pcomp();

friend void caozuo(int);

};

void student::aver()

{

double z;

z=en+ma+com;

ave=z/3;

}

student::student()//构造函数

{

strcpy(name, "nomame");

num=0;

sex='M';

age=0;

double en=0;

double ma=0;

double com=0;

double ave=0;

}

student::student (char n[20],int nu, int ag, char se,double e,double m,double c,double av)

{

strcpy(name, n);

num=nu;

sex=se;

age=ag;

en=e;

ma=m;

com=c;

ave=av;

}

student::~student(){};

student *s[50];

int i=0;

int j=0;

void student::Set()

{

cout<<"请输入姓名:"<<endl;

cin>>name;

cout<<"请输入学号:"<<endl;

cin>>num;

cout<<"请输入年龄:"<<endl;

cin>>age;

cout<<"请输入性别:"<<endl;

cin>>sex;

cout<<"请输入英语成绩:"<<endl;

cin>>en;

cout<<"请输入数学成绩:"<<endl;

cin>>ma;

cout<<"请输入计算机成绩:"<<endl;

cin>>com;

j++;

s[i]=new student(name,num, age, sex,en,ma,com,ave);

i++;

}

void student:: Delete() //(2)删除人员(Delete)

{

cout<<"请输入您要删除的学生姓名:"<<endl;

cin>>name;

for(int h=0;h<i;h++)

{

if(strcmp(name,s[h]->name)==0)

{

i--;

s[h]=s[h+1];

h++;

}

else cout<<"您要求删除的对象本来就不存在!请检查输入的正确性!";

}

}

void student::Alter() //(3)修改数据(Alter)

{

cout<<"请输入您要修改的学生的姓名:"<<endl;

cin>>name;

for(int h=0;h<i;h++)

{

if(strcmp(name,s[h]->name)==0)

{

int nu;

int ag;

char se;

double e;

double m;

double c;

cout<<"请输入学号: "<<endl;

cin>>nu;

cout<<"请输入年龄:"<<endl;

cin>>ag;

cout<<"请输入性别:"<<endl;

cin>>se;

cout<<"请输入英语成绩:"<<endl;

cin>>e;

cout<<"请输入数学成绩:"<<endl;

cin>> m;

cout<<"请输入计算机成绩:"<<endl;

cin>>c;

s[h]->num=nu;

s[h]->age=ag;

s[h]->sex=se;

s[h]->en=e;

s[h]->ma=m;

s[h]->com=c;

cout<<"数据修改成功!";

break;

}

if (i == j)

{

cout<<"对不起!您要查询的学生不存在!"<<endl;

break;

}

}

}

void student::List() //(4)显示记录(List)

{

cout<<"本系统所有通讯录的数据如下:"<<endl;

if(i==0)

cout<<"管理系统中没有录入数据或者数据已经被删除!"<<endl;

for(int k=0;k<i;k++)

{

s[k]->display();

}

}

void student::ssearch()//查询

{

//system("cls");

cout<<"\n** 查询学生信息 **\n"<<endl;

cout<<"请输入查询方式:"<<endl;

cout<<"1.按学号查询"<<endl;

cout<<"2.按姓名查询"<<endl;

cout<<"3.返回"<<endl;

char c;

cin>>c;

switch (c)

{

case '1':

{ int n;

if(i==0)

{

cout<<"管理系统中没有输入数据!"<<endl; exit(0);

}

cout<<"请输入你要查询的学生的学号"<<endl;

cin>>n;

for(int j=0;j<i;j++)

{

if(s[j]->num==n)

{

cout<<"您要查询的学生是:"<<s[j]->name<<endl;

cout<<"年龄: "<<s[j]->age<<" "<<"性别: "<<s[j]->sex<<" "<<"英语:"<<s[j]->en<<" "<<"数学:"<<s[j]->ma<<" "<<"计算机:"<<s[j]->com<<"平均分:"<<endl;

break;

}

}

if (i == j)

{

cout<<"对不起!您要查询的学生不存在!"<<endl;

}

break;

}

case '2':

{ if(i==0)

{ cout<<"管理系统中没有录入数据或者数据已经被删除!"<<endl; exit(0); }

cout<<"请输入你要查询的学生姓名"<<endl;

cin>>name;

for(int j=0;j<i;j++)

{

if(strcmp(name,s[j]->name)==0)

{

cout<<"您要查询的学生是:"<<stu[j].name<<endl;

//cout<<"学号:"<<stu[j].num

cout<<"学号:"<<stu[j].num<<" "<<"年龄: "<<stu[j].age<<" "<<"性别: "<<stu[j].sex<<" "<<"英语:"<<stu[j].en<<" "<<"数学:"<<stu[j].ma<<" "<<"计算机:"<<stu[j].com<<"平均分:"<<endl;

break;

};

if (i == j)

{

cout<<"对不起!您要查询的学生不存在!"<<endl;

}

}

break;}

case '3':

return ;

}

}

void student::pnumb()//按学号排序

{

student *p1,*p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息..."<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{

p1=stu;

if (p1->num>p1->next->num) // 如果头结点大于第二个的

{

p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->num) //中间的交换

{

p2=p1;

p1=p1->next;

if(p1->num>p1->next->num)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{

p1->display();

p1=p1->next;

}while(p1);

}

void student::pmat() //按数学成绩排序

{

student *p1,*p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息..."<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{

p1=stu;

if (p1->ma>p1->next->ma) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->ma>p1->next->ma)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->display();

p1=p1->next;

}while(p1);

}

void student::pcomp()//按语文成绩排序

{

student *p1,*p2;

int n;

p1=stu;

n=1;

while(p1->next)

{n++; p1=p1->next;}

cout<<"共有"<<n<<"条信息..."<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{

p1=stu;

if (p1->com>p1->next->com) // 如果头结点大于第二个的

{

p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{

p2=p1;

p1=p1->next;

if(p1->com>p1->next->com)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{

p1->display();

p1=p1->next;

}while(p1);

}

void student::peng()//按英语成绩排序

{

student *p1,*p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息..."<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{ p1=stu;

if (p1->en>p1->next->en) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->en>p1->next->en)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->display();

p1=p1->next;

}while(p1);

}

void student::staxis()//排序

{

char c;

cout<<"请选择以何种方式排序:"<<endl;

cout<<"1:以学号排序"<<endl;

cout<<"2:以英语成绩排序"<<endl;

cout<<"3:以数学成绩排序"<<endl;

cout<<"4:以计算机成绩排序"<<endl;

cout<<"5:返回"<<endl;

cout<<"请选择(1-5):"<<endl;

cin>>c;

switch (c)

{

case '1':pnumb(); break;

case '2':peng(); break;

case '3':pmat(); break;

case '4':pcomp(); break;

case '5':return;

}

}

void student::ssave() //保存到文件

{

char c;

cout<<"\n保存学生信息(将覆盖原文件),是否继续?[Y/N]:"; cin>>c;

if(toupper(c)!='Y') return;

ofstream tfile("date.txt",ios::binary);

student *p=stu;

while(p)// 写入文件

{

tfile<<p->name<<"\t"<<p->num<<"\t"<<p->en<<"\t"<<p->ma<<"\t"<<p->com<<"\t"<<p->ave;

tfile<<endl;

p=p->next;

}

tfile.close();

cout<<"保存完毕..."<<endl;

}

void student::sload() //读取

{

student *p;

p=stu;

while(p)

{

stu=p->next;

delete p;

p=stu;

}

ifstream tfile("date.txt",ios::binary);

char name1[20];

int num1;

char sex;

double en1,ma1,com1,ave1,age1;

tfile>>name1>>num1>>en1>>ma1>>com1>>ave1>>sex>>age1;

while(tfile.good())

{

//创建学生接点

student *s;

s=stu;

s=new student(name1,num1,age1,sex,en1,ma1,com1,ave1);

s->next=0;

s->ave=stu->ave;

if(stu) //若已经存在结点

{

student *p2;

p2=stu;

while(p2->next) //查找尾结点

{

p2=p2->next;

}

p2->next=s; //连接

}

else //若不存在结点(表空)

{

stu=s; //连接

}

tfile>>name1>>num1>>en1>>ma1>>com1>>ave1;

}

tfile.close();

cout<<"\n学生信息已经装入...\n";

}

void caozuo(int p)

{

student t;

switch(p)

{

case 0:t.Set();break;

case 1:t.Set();break;

case 2:t.Delete();break;

case 3:t.Alter();break;

case 4:t.List();break;

case 5:t.ssearch();//查询

case 6:t.staxis(); //排序

case 7:exit(0);break;

}

}

void main()

{

char w;

do

{

cout<<"请输入操作代码( 成绩录入/0 增加人员/1 删除人员/2 修改数据/3 显示记录/4 查询/5 排序/6 退出/7)"<<endl;

int a;

cin>>a;

caozuo(a);

cout<<"您想继续进行其他操作吗?(y/n)"<<endl;

cin>>w;

}while(w=='y');

} //利用while语句又回到了前面的循环

以前帮同学写的,贴出来供大家参考,基本满足楼主要求,希望对楼主有帮助,呵呵...

有关C语言程序(学生成绩管理程序)

已调通,大致功能相当

#include <stdio.h>

#include <stdlib.h> /*其它说明*/

#include <string.h> /*字符串函数*/

#include <time.h>

#define LEN sizeof(STUDENT)

typedef struct stu /*定义结构体数组用于缓存数据*/

{

char num[6];

char name[5];

int score[3];

int sum;

float average;

int order;

struct stu *next;

}STUDENT;

/*初始化函数*/

STUDENT *Init()

{

return NULL; /*返回空指针*/

}

/*菜单选择函数*/

int Menu_Select()

{

int n;

struct tm *pt; /*定义时间结构体*/

time_t t;

t=time(NULL);

pt=localtime(&t); /*读取系统日期并把它放到结构体中*/

printf("\n按任一键进入主菜单...... \n"); /*按任一键进入主菜单*/

//getch(); /*从键盘读取一个字符,但不显示于屏幕*/

system("pause");

system("cls"); /*清屏*/

printf("********************************************************************************\n");

printf("\t\t 欢迎 Welcome to\n");

printf("\n\t\t\t 使用学生管理系统1.0\n");

printf("*************************************MENU***************************************\n");

printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/

printf("\t\t\t2. 显示 Print the record\n"); /*显示*/

printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/

printf("\t\t\t4. 删除 Delete a record\n"); /*删除*/

printf("\t\t\t5. 排序 Sort to make New a file\n"); /*排序*/

printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/

printf("\t\t\t7. 保存 Save the file\n"); /*保存*/

printf("\t\t\t8. 读取 Load the file\n"); /*读取*/

printf("\t\t\t9. 退出 Quit\n"); /*退出*/

printf("\n********************************************************************************\n");

printf("\t\t\t\t当前系统日期:%d-%d-%d\n",pt->tm_year+1900,pt->tm_mon+1,pt->tm_mday); /*显示当前系统日期*/

do

{

printf("\n\t\t\t输入你的选择Enter your choice(1~9):");

fflush(stdin);

scanf("%d",&n);

}while(n<1||n>9); /*如果选择项不在1~9之间则重输*/

return(n); /*返回选择项,主函数根据该数调用相应的函数*/

}

/*输入函数*/

STUDENT *Create()

{

int i,s;

STUDENT *head=NULL,*p; /* 定义函数.此函数带回一个指向链表头的指针*/

system("cls");

for(;;)

{

p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/

if(!p) /*如果指针p为空*/

{

printf("\n输出内存溢出. Out of memory."); /*输出内存溢出*/

return (head); /*返回头指针,下同*/

}

printf("输入学号Enter the num(0:list end):");

scanf("%s",p->num);

if(p->num[0]=='0') break; /*如果学号首字符为0则结束输入*/

printf("输入名字Enter the name:");

scanf("%s",p->name);

printf("请输入3门成绩Please enter the %d scores\n",3); /*提示开始输入成绩*/

s=0; /*计算每个学生的总分,初值为0*/

for(i=0;i<3;i++) /*3门课程循环3次*/

{

do

{

printf("成绩score%d:",i+1);

scanf("%d",&p->score[i]);

if(p->score[i]<0 || p->score[i]>100) /*确保成绩在0~100之间*/

printf("数据错误,请重新输入 Data error,please enter again.\n");

}while(p->score[i]<0 || p->score[i]>100);

s=s+p->score[i]; /*累加各门成绩*/

}

p->sum=s; /*将总分保存*/

p->average=(float)s/3; /*先用强制类型转换将s转换成float型,再求平均值*/

p->order=0; /*未排序前此值为0*/

p->next=head; /*将头结点做为新输入结点的后继结点*/

head=p; /*新输入结点为新的头结点*/

}

return(head);

}

/* 显示全部记录函数*/

void Print(STUDENT *head)

{

int i=0; /* 统计记录条数*/

STUDENT *p; /*移动指针*/

system("cls");

p=head; /*初值为头指针*/

printf("\n************************************STUDENT************************************\n");

printf("-------------------------------------------------------------------------------\n");

printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n");

printf("-------------------------------------------------------------------------------\n");

while(p!=NULL)

{

i++;

printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

p=p->next;

}

printf("-------------------------------------------------------------------------------\n");

printf("**************************************END**************************************\n");

}

/*查找记录函数*/

void Search(STUDENT *head)

{

STUDENT *p; /* 移动指针*/

char s[5]; /*存放姓名用的字符数组*/

system("cls");

printf("请输入个姓名来查找. Please enter name for searching.\n");

scanf("%s",s);

p=head; /*将头指针赋给p*/

while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/

p=p->next; /*移动指针,指向下一结点*/

if(p!=NULL) /*如果指针不为空*/

{

printf("\n*************************************FOUND************************************\n");

printf("-------------------------------------------------------------------------------\n");

printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");

printf("-------------------------------------------------------------------------------\n");

printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

printf("-------------------------------------------------------------------------------\n");

printf("***************************************END**************************************\n");

}

else

printf("\n没有该学生 There is no num %s student on the list.\n",s); /*显示没有该学生*/

}

/*删除记录函数*/

STUDENT *Delete(STUDENT *head)

{

//int n;

STUDENT *p1,*p2; /*p1为查找到要删除的结点指针,p2为其前驱指针*/

char c,s[6]; /*s[6]用来存放学号,c用来输入字母*/

system("cls");

printf("请输入要删除的学号 Please enter the Deleted num: ");

scanf("%s",s);

p1=p2=head; /*给p1和p2赋初值头指针*/

while(strcmp(p1->num,s) && p1 != NULL) /*当记录的学号不是要找的,或指针不为空时*/

{

p2=p1; /*将p1指针值赋给p2作为p1的前驱指针*/

p1=p1->next; /*将p1指针指向下一条记录*/

}

if(strcmp(p1->num,s)==0) /*学号找到了*/

{

printf("**************************************FOUND************************************\n");

printf("-------------------------------------------------------------------------------\n");

printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");

printf("-------------------------------------------------------------------------------\n");

printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);

printf("-------------------------------------------------------------------------------\n");

printf("***************************************END**************************************\n");

printf("\n是否要删除,输入Y删除,N则退出\nAre you sure to Delete the student Y/N ?"); /*提示是否要删除,输入Y删除,N则退出*/

for(;;)

{

scanf("%c",&c);

if(c=='n'||c=='N') break; /*如果不删除,则跳出本循环*/

if(c=='y'||c=='Y')

{

if(p1==head) /*若p1==head,说明被删结点是首结点*/

head=p1->next; /*把第二个结点地址赋予head*/

else

p2->next=p1->next; /*否则将一下结点地址赋给前一结点地址*/

//n=n-1;

printf("\n学号为(Num): %s 学生以被删除(student have been Deleted.)\n",s);

printf("别忘了保存. Don't forget to Save.\n");break; /*删除后就跳出循环*/

}

}

}

else

printf("\n没有这个学生在表上\nThere is no num %s student on the list.\n",s); /*找不到该结点*/

return(head);

}

/*排序函数*/

STUDENT *Sort(STUDENT *head)

{

int i=0; /*保存名次*/

STUDENT *p1,*p2,*t,*temp; /*定义临时指针*/

temp=head->next; /*将原表的头指针所指的下一个结点作头指针*/

head->next=NULL; /*第一个结点为新表的头结点*/

while(temp!=NULL) /*当原表不为空时,进行排序*/

{

t=temp; /*取原表的头结点*/

temp=temp->next; /*原表头结点指针后移*/

p1=head; /*设定移动指针p1,从头指针开始*/

p2=head; /*设定移动指针p2做为p1的前驱,初值为头指针*/

while(t->average<p1->average&&p1!=NULL) /*作成绩平均分比较*/

{

p2=p1; /*待排序点值小,则新表指针后移*/

p1=p1->next;

}

if(p1==p2) /*p1==p2,说明待排序点值大,应排在首位*/

{

t->next=p1; /*待排序点的后继为p*/

head=t; /*新头结点为待排序点*/

}

else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/

{

t->next=p1; /*t的后继是p1*/

p2->next=t; /*p2的后继是t*/

}

}

p1=head; /*已排好序的头指针赋给p1,准备填写名次*/

while(p1!=NULL) /*当p1不为空时,进行下列操作*/

{

i++; /*结点序号*/

p1->order=i; /*将结点序号赋值给名次*/

p1=p1->next; /*指针后移*/

}

printf("排序成功 Sorting is sucessful.\n"); /*排序成功*/

return (head);

}

/*插入记录函数*/

STUDENT *Insert(STUDENT *head,STUDENT *New)

{

STUDENT *p0,*p1,*p2;

//int n;

int sum1,i;

p1=head; /*使p1指向第一个结点*/

p0=New; /*p0指向要插入的结点*/

printf("\nPlease enter a New record.\n"); /*提示输入记录信息*/

printf("输入学号Enter the num:");

scanf("%s",New->num);

printf("输入名字Enter the name:");

scanf("%s",New->name);

printf("Please enter the %d scores.\n",3);

sum1=0; /*保存新记录的总分,初值为0*/

for(i=0;i<3;i++)

{

do

{

printf("成绩score%d:",i+1);

scanf("%d",&New->score[i]);

if(New->score[i]>100||New->score[i]<0)

printf("数据错误Data error,please enter again.\n");

}while(New->score[i]>100||New->score[i]<0);

sum1=sum1+New->score[i]; /*累加各门成绩*/

}

New->sum=sum1; /*将总分存入新记录中*/

New->average=(float)sum1/3;

New->order=0;

if(head==NULL) /*原来的链表是空表*/

{

head=p0;

p0->next=NULL;

} /*使p0指向的结点作为头结点*/

else

{

while((p0->average<p1->average)&&(p1->next!=NULL))

{

p2=p1; /*使p2指向刚才p1指向的结点*/

p1=p1->next; /*p1后移一个结点*/

}

if(p0->average>=p1->average)

{

if(head==p1)head=p0; /*插到原来第一个结点之前*/

else p2->next=p0; /*插到p2指向的结点之后*/

p0->next=p1;

}

else

{

p1->next=p0;

p0->next=NULL;

} /*插到最后的结点之后*/

}

//n=n+1; /*结点数加1*/

head=Sort(head); /*调用排序的函数,将学生成绩重新排序*/

printf("\n学生Student %s 已被更新have been inserted.\n",New->name);

printf("不要忘了保存Don't forget to Save the New file.\n");

return(head);

}

/*保存数据到文件函数*/

void Save(STUDENT *head)

{

FILE *fp; /*定义指向文件的指针*/

STUDENT *p; /* 定义移动指针*/

char outfile[10];

printf("输出文件例如:c:\\score Enter outfile name,for example c:\\score\n");

scanf("%s",outfile);

if((fp=fopen(outfile,"w"))==NULL) /*为输出打开一个二进制文件,为只写方式*/

{

printf("打不开文件Cannot open the file\n");

return; /*若打不开则返回菜单*/

}

printf("\n保存中...Saving the file......\n");

p=head; /*移动指针从头指针开始*/

while(p!=NULL) /*如p不为空*/

{

fwrite(p,LEN,1,fp); /*写入一条记录*/

p=p->next; /*指针后移*/

}

fclose(fp); /*关闭文件*/

printf("保存成功....Save the file successfully!\n");

}

/* 从文件读数据函数*/

STUDENT *Load()

{

STUDENT *p1,*p2,*head=NULL; /*定义记录指针变量*/

FILE *fp; /* 定义指向文件的指针*/

char infile[10];

printf("倒入文件例如:c:\\score Enter infile name,for example c:\\score\n");

scanf("%s",infile);

if((fp=fopen(infile,"r"))==NULL) /*打开一个二进制文件,为只读方式*/

{

printf("打不开文件Can not open the file.\n");

return(head);

}

printf("\n寻找文件...Loading the file!\n");

p1=(STUDENT *)malloc(LEN); /*开辟一个新单元*/

if(!p1)

{

printf("内存溢出!Out of memory!\n");

return(head);

}

head=p1; /*申请到空间,将其作为头指针*/

while(!feof(fp)) /*循环读数据直到文件尾结束*/

{

if(fread(p1,LEN,1,fp)!=1) break; /*如果没读到数据,跳出循环*/

p1->next=(STUDENT *)malloc(LEN); /*为下一个结点开辟空间*/

if(!p1->next)

{

printf("Out of memory!\n");

return (head);

}

p2=p1; /*使p2指向刚才p1指向的结点*/

p1=p1->next; /*指针后移,新读入数据链到当前表尾*/

}

p2->next=NULL; /*最后一个结点的后继指针为空*/

fclose(fp);

printf("\n你成功的从文件中读取了数据!\nYou have success to read data from the file!\n");

return (head);

}

/*主函数界面*/

int main()

{

STUDENT *head,New;

head=Init(); //链表初始化,使head的值为NULL

for(;;) //循环无限次

{

switch(Menu_Select())

{

case 1:head=Create();break;

case 2:Print(head);break;

case 3:Search(head);break;

case 4:head=Delete(head);break;

case 5:head=Sort(head);break;

case 6:head=Insert(head,&New);break; //&New表示返回地址

case 7:Save(head);break;

case 8:head=Load(); break;

case 9:exit(0); //如菜单返回值为9则程序结束

}

}

return 0;

}

可以编译运行通过 可惜不能发附件 只能贴代码了

#include "stdio.h" /*标准输入输出函数库*/

#include "stdlib.h" /*标准函数库*/

#include "string.h" /*字符串函数库*/

#define HEADER1 " ----------------------------STUDENT---------------------------------- \n"

#define HEADER2 " | number | name |Comp|Math|Eng | sum | ave |mici | \n"

#define HEADER3 " |---------------|---------------|----|----|----|--------|-------|-----| "

#define FORMAT " | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |%4d |\n"

#define DATA p->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci

#define END " --------------------------------------------------------------------- \n"

int saveflag=0; /*是否需要存盘的标志变量*/

/*定义与学生有关的数据结构*/

typedef struct student /*标记为student*/

{

char num[10]; /*学号*/

char name[15]; /*姓名*/

int cgrade; /*C语言成绩*/

int mgrade; /*数学成绩*/

int egrade; /*英语成绩*/

int total; /*总分*/

float ave; /*平均分*/

int mingci; /*名次*/

};

/*定义每条记录或结点的数据结构,标记为:node*/

typedef struct node

{

struct student data; /*数据域*/

struct node *next; /*指针域*/

}Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/

void menu() /*主菜单*/

{

printf(" The Students' Grade Management System \n");

printf(" *************************Menu********************************\n");

printf(" * 1 input record 2 delete record *\n");

printf(" * 3 search record 4 modify record *\n");

printf(" * 5 insert record 6 count record *\n");

printf(" * 7 sort reord 8 save record *\n");

printf(" * 9 display record 0 quit system *\n");

printf(" *************************************************************\n");

/*cprintf()送格式化输出至文本窗口屏幕中*/

}

void printheader() /*格式化输出表头*/

{

printf(HEADER1);

printf(HEADER2);

printf(HEADER3);

}

void printdata(Node *pp) /*格式化输出表中数据*/

{

Node* p;

p=pp;

printf(FORMAT,DATA);

}

void Wrong() /*输出按键错误信息*/

{

printf("\n\n\n\n\n***********Error:input has wrong! press any key to continue**********\n");

getchar();

}

void Nofind() /*输出未查找此学生的信息*/

{

printf("\n=====>Not find this student!\n");

}

void Disp(Link l) /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/

{

Node *p;

p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/

if(!p) /*p==NULL,NUll在stdlib中定义为0*/

{

printf("\n=====>Not student record!\n");

getchar();

return;

}

printf("\n\n");

printheader(); /*输出表格头部*/

while(p) /*逐条输出链表中存储的学生信息*/

{

printdata(p);

p=p->next; /*移动直下一个结点*/

printf(HEADER3);

}

getchar();

}

/*************************************************************

作用:用于定位链表中符合要求的节点,并返回指向该节点的指针

参数:findmess[]保存要查找的具体内容; nameornum[]保存按什么查找;

在单链表l中查找;

**************************************************************/

Node* Locate(Link l,char findmess[],char nameornum[])

{

Node *r;

if(strcmp(nameornum,"num")==0) /*按学号查询*/

{

r=l->next;

while(r)

{

if(strcmp(r->data.num,findmess)==0) /*若找到findmess值的学号*/

return r;

r=r->next;

}

}

else if(strcmp(nameornum,"name")==0) /*按姓名查询*/

{

r=l->next;

while(r)

{

if(strcmp(r->data.name,findmess)==0) /*若找到findmess值的学生姓名*/

return r;

r=r->next;

}

}

return 0; /*若未找到,返回一个空指针*/

}

/*输入字符串,并进行长度验证(长度<lens)*/

void stringinput(char *t,int lens,char *notice)

{

char n[255];

do{

printf(notice); /*显示提示信息*/

scanf("%s",n); /*输入字符串*/

if(strlen(n)>lens)printf("\n exceed the required length! \n"); /*进行长度校验,超过lens值重新输入*/

}while(strlen(n)>lens);

strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/

}

/*输入分数,0<=分数<=100)*/

int numberinput(char *notice)

{

int t=0;

do{

printf(notice); /*显示提示信息*/

scanf("%d",&t); /*输入分数*/

if(t>100 || t<0) printf("\n score must in [0,100]! \n"); /*进行分数校验*/

}while(t>100 || t<0);

return t;

}

/*增加学生记录*/

void Add(Link l)

{

Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/

char ch,flag=0,num[10];

r=l;

s=l->next;

Disp(l); /*先打印出已有的学生信息*/

while(r->next!=NULL)

r=r->next; /*将指针移至于链表最末尾,准备添加记录*/

while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/

{

while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/

{

stringinput(num,10,"input number(press '0'return menu):"); /*格式化输入学号并检验*/

flag=0;

if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/

{return;}

s=l->next;

while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/

{

if(strcmp(s->data.num,num)==0)

{

flag=1;

break;

}

s=s->next;

}

if(flag==1) /*提示用户是否重新输入*/

{ getchar();

printf("=====>The number %s is not existing,try again?(y/n):",num);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

continue;

else

return;

}

else

{break;}

}

p=(Node *)malloc(sizeof(Node)); /*申请内存空间*/

if(!p)

{

printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/

return ; /*返回主界面*/

}

strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/

stringinput(p->data.name,15,"Name:");

p->data.cgrade=numberinput("C language Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.mgrade=numberinput("Math Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.egrade=numberinput("English Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade; /*计算总分*/

p->data.ave=(float)(p->data.total/3); /*计算平均分*/

p->data.mingci=0;

p->next=NULL; /*表明这是链表的尾部结点*/

r->next=p; /*将新建的结点加入链表尾部中*/

r=p;

saveflag=1;

}

return ;

}

void Qur(Link l) /*按学号或姓名,查询学生记录*/

{

int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/

char searchinput[20]; /*保存用户输入的查询内容*/

Node *p;

if(!l->next) /*若链表为空*/

{

printf("\n=====>No student record!\n");

getchar();

return;

}

printf("\n =====>1 Search by number =====>2 Search by name\n");

printf(" please choice[1,2]:");

scanf("%d",&select);

if(select==1) /*按学号查询*/

{

stringinput(searchinput,10,"input the existing student number:");

p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/

if(p) /*若p!=NULL*/

{

printheader();

printdata(p);

printf(END);

printf("press any key to return");

getchar();

}

else

Nofind();

getchar();

}

else if(select==2) /*按姓名查询*/

{

stringinput(searchinput,15,"input the existing student name:");

p=Locate(l,searchinput,"name");

if(p)

{

printheader();

printdata(p);

printf(END);

printf("press any key to return");

getchar();

}

else

Nofind();

getchar();

}

else

Wrong();

getchar();

}

/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/

void Del(Link l)

{

int sel;

Node *p,*r;

char findmess[20];

if(!l->next)

{ system("cls");

printf("\n=====>No student record!\n");

getchar();

return;

}

system("cls");

Disp(l);

printf("\n =====>1 Delete by number =====>2 Delete by name\n");

printf(" please choice[1,2]:");

scanf("%d",&sel);

if(sel==1)

{

stringinput(findmess,10,"input the existing student number:");

p=Locate(l,findmess,"num");

if(p) /*p!=NULL*/

{

r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;/*将p所指节点从链表中去除*/

free(p); /*释放内存空间*/

printf("\n=====>delete success!\n");

getchar();

saveflag=1;

}

else

Nofind();

getchar();

}

else if(sel==2) /*先按姓名查询到该记录所在的节点*/

{

stringinput(findmess,15,"input the existing student name");

p=Locate(l,findmess,"name");

if(p)

{

r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;

free(p);

printf("\n=====>delete success!\n");

getchar();

saveflag=1;

}

else

Nofind();

getchar();

}

else

Wrong();

getchar();

}

/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/

void Modify(Link l)

{

Node *p;

char findmess[20];

if(!l->next)

{

printf("\n=====>No student record!\n");

getchar();

return;

}

printf("modify student recorder");

Disp(l);

stringinput(findmess,10,"input the existing student number:"); /*输入并检验该学号*/

p=Locate(l,findmess,"num"); /*查询到该节点*/

if(p) /*若p!=NULL,表明已经找到该节点*/

{

printf("Number:%s,\n",p->data.num);

printf("Name:%s,",p->data.name);

stringinput(p->data.name,15,"input new name:");

printf("C language score:%d,",p->data.cgrade);

p->data.cgrade=numberinput("C language Score[0-100]:");

printf("Math score:%d,",p->data.mgrade);

p->data.mgrade=numberinput("Math Score[0-100]:");

printf("English score:%d,",p->data.egrade);

p->data.egrade=numberinput("English Score[0-100]:");

p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=(float)(p->data.total/3);

p->data.mingci=0;

printf("\n=====>modify success!\n");

Disp(l);

saveflag=1;

}

else

Nofind();

getchar();

}

/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/

void Insert(Link l)

{

Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/

char ch,num[10],s[10]; /*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/

int flag=0;

v=l->next;

system("cls");

Disp(l);

while(1)

{ stringinput(s,10,"please input insert location after the Number:");

flag=0;v=l->next;

while(v) /*查询该学号是否存在,flag=1表示该学号存在*/

{

if(strcmp(v->data.num,s)==0) {flag=1;break;}

v=v->next;

}

if(flag==1)

break; /*若学号存在,则进行插入之前的新记录的输入操作*/

else

{ getchar();

printf("\n=====>The number %s is not existing,try again?(y/n):",s);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

{continue;}

else

{return;}

}

}

/*以下新记录的输入操作与Add()相同*/

stringinput(num,10,"input new student Number:");

v=l->next;

while(v)

{

if(strcmp(v->data.num,num)==0)

{

printf("=====>Sorry,the new number:'%s' is existing !\n",num);

printheader();

printdata(v);

printf("\n");

getchar();

return;

}

v=v->next;

}

newinfo=(Node *)malloc(sizeof(Node));

if(!newinfo)

{

printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/

return ; /*返回主界面*/

}

strcpy(newinfo->data.num,num);

stringinput(newinfo->data.name,15,"Name:");

newinfo->data.cgrade=numberinput("C language Score[0-100]:");

newinfo->data.mgrade=numberinput("Math Score[0-100]:");

newinfo->data.egrade=numberinput("English Score[0-100]:");

newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;

newinfo->data.ave=(float)(newinfo->data.total/3);

newinfo->data.mingci=0;

newinfo->next=NULL;

saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/

/*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着学生的记录*/

p=l->next;

while(1)

{

if(strcmp(p->data.num,s)==0) /*在链表中插入一个节点*/

{

newinfo->next=p->next;

p->next=newinfo;

break;

}

p=p->next;

}

Disp(l);

printf("\n\n");

getchar();

}

/*统计该班的总分第一名和单科第一,和各科不及格人数*/

void Tongji(Link l)

{

Node *pm,*pe,*pc,*pt; /*用于指向分数最高的节点*/

Node *r=l->next;

int countc=0,countm=0,counte=0; /*保存三门成绩中不及格的人数*/

if(!r)

{

printf("\n=====>Not student record!\n");

getchar();

return ;

}

Disp(l);

pm=pe=pc=pt=r;

while(r)

{

if(r->data.cgrade<60) countc++;

if(r->data.mgrade<60) countm++;

if(r->data.egrade<60) counte++;

if(r->data.cgrade>=pc->data.cgrade) pc=r;

if(r->data.mgrade>=pm->data.mgrade) pm=r;

if(r->data.egrade>=pe->data.egrade) pe=r;

if(r->data.total>=pt->data.total) pt=r;

r=r->next;

}

printf("\n------------------------------the TongJi result--------------------------------\n");

printf("C Language<60:%d (ren)\n",countc);

printf("Math <60:%d (ren)\n",countm);

printf("English <60:%d (ren)\n",counte);

printf("-------------------------------------------------------------------------------\n");

printf("The highest student by total scroe name:%s totoal score:%d\n",pt->data.name,pt->data.total);

printf("The highest student by English score name:%s totoal score:%d\n",pe->data.name,pe->data.egrade);

printf("The highest student by Math score name:%s totoal score:%d\n",pm->data.name,pm->data.mgrade);

printf("The highest student by C score name:%s totoal score:%d\n",pc->data.name,pc->data.cgrade);

printf("\n\npress any key to return");

getchar();

}

/*利用插入排序法实现单链表的按总分字段的降序排序,从高到低*/

void Sort(Link l)

{

Link ll;

Node *p,*rr,*s;

int i=0;

if(l->next==NULL)

{ system("cls");

printf("\n=====>Not student record!\n");

getchar();

return ;

}

ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/

if(!ll)

{

printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/

return ; /*返回主界面*/

}

ll->next=NULL;

Disp(l); /*显示排序前的所有学生记录*/

p=l->next;

while(p) /*p!=NULL*/

{

s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/

if(!s) /*s==NULL*/

{

printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/

return ; /*返回主界面*/

}

s->data=p->data; /*填数据域*/

s->next=NULL; /*指针域为空*/

rr=ll;

/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/

while(rr->next!=NULL && rr->next->data.total>=p->data.total)

{rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/

if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部*/

rr->next=s;

else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/

{

s->next=rr->next;

rr->next=s;

}

p=p->next; /*原链表中的指针下移一个节点*/

}

l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/

p=l->next; /*已排好序的头指针赋给p,准备填写名次*/

while(p!=NULL) /*当p不为空时,进行下列操作*/

{

i++; /*结点序号*/

p->data.mingci=i; /*将名次赋值*/

p=p->next; /*指针后移*/

}

Disp(l);

saveflag=1;

printf("\n =====>sort complete!\n");

}

/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时, 会提示用户存盘*/

void Save(Link l)

{

FILE* fp;

Node *p;

int count=0;

fp=fopen("c:\\student","wb");/*以只写方式打开二进制文件*/

if(fp==NULL) /*打开文件失败*/

{

printf("\n=====>open file error!\n");

getchar();

return ;

}

p=l->next;

while(p)

{

if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/

{

p=p->next;

count++;

}

else

{

break;

}

}

if(count>0)

{

getchar();

printf("\n\n\n\n\n=====>save file complete,total saved's record number is:%d\n",count);

getchar();

saveflag=0;

}

else

{

printf("the current link is empty,no student record is saved!\n");

getchar();

}

fclose(fp); /*关闭此文件*/

}

void main()

{

Link l; /*定义链表*/

FILE *fp; /*文件指针*/

int select; /*保存选择结果变量*/

char ch; /*保存(y,Y,n,N)*/

int count=0; /*保存文件中的记录条数(或结点个数)*/

Node *p,*r; /*定义记录指针变量*/

l=(Node*)malloc(sizeof(Node));

if(!l)

{

printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/

return ; /*返回主界面*/

}

l->next=NULL;

r=l;

fp=fopen("C:\\student","ab+"); /*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/

if(fp==NULL)

{

printf("\n=====>can not open file!\n");

exit(0);

}

while(!feof(fp))

{

p=(Node*)malloc(sizeof(Node));

if(!p)

{

printf(" memory malloc failure!\n"); /*没有申请成功*/

exit(0); /*退出*/

}

if(fread(p,sizeof(Node),1,fp)==1) /*一次从文件中读取一条学生成绩记录*/

{

p->next=NULL;

r->next=p;

r=p; /*r指针向后移一个位置 r指向最后一个结点 也就是说在完成文件的所有记录读之后,r指向尾 如l->next->next->......r->NULL;*/

count++;

}

}

fclose(fp); /*关闭文件*/

printf("\n=====>open file sucess,the total records number is : %d.\n",count);

menu();

while(1)

{

menu();

p=r;

printf("\n Please Enter your choice(0~9):"); /*显示提示信息*/

scanf("%d",&select);

if(select==0)

{

if(saveflag==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/

{ getchar();

printf("\n=====>Whether save the modified record to file?(y/n):");

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

Save(l);

}

printf("=====>thank you for useness!");

getchar();

break;

}

switch(select)

{

case 1:Add(l);break; /*增加学生记录*/

case 2:Del(l);break; /*删除学生记录*/

case 3:Qur(l);break; /*查询学生记录*/

case 4:Modify(l);break; /*修改学生记录*/

case 5:Insert(l);break; /*插入学生记录*/

case 6:Tongji(l);break; /*统计学生记录*/

case 7:Sort(l);break; /*排序学生记录*/

case 8:Save(l);break; /*保存学生记录*/

case 9:Disp(l);break; /*显示学生记录*/

default: Wrong();getchar();break; /*按键有误,必须为数值0-9*/

}

}

}

文章标签: # lt # gt # -&