课程设计--学生成绩管理系统

来源:互联网 发布:linux tar zcvf命令 编辑:程序博客网 时间:2024/05/03 22:05

问题描述:本系统实现了学生成绩管理的功能,具有学生成绩的输入、读取、查询、修改、插入、删除、排序,统计等功能。


代码:

头文件student.h:

#ifndef LINKLIST_H_INCLUDED


#define LINKLIST_H_INCLUDED


struct Student    //结构体
{
int term;  //学期
int num;  //学号
char name[12]; //姓名
float mark1;  //成绩1
float mark2;  //成绩2
float mark3;  //成绩3
float sum;  //总分
float average; //平均分
};
void input(Student *r);       //输入
void output(Student *r);      //输出
void searchnum(Student *r);   //按  学号及学期  查找
void searchname(Student *r);  //按  姓名及学期  查找


void change(Student *r);      //按  学号及学期  修改信息


Student *insert(Student *r);  //插入信息


void shanchu(Student *r);     //按  学号及学期  删除信息


void maopao(Student *r);      //按数据结构降序(冒泡)排序
void xuanze(Student *r);      //按总分降序(选择)排序


void tongji(Student *r);      //统计各科总分和平均分信息
void put(int a);

#endif 

//stu.cpp:

#include <iostream.h>
#include"student.h"
#include <stdlib.h>
#include <iomanip.h>  
#include <conio.h>     
#include <stdio.h> 
int num;
void put(int a)
{
num=a;
}
void input(Student *r)
{
FILE *fp;
int n=0;
int i;
int t=0; //t为标志位,1为找到,0为未找到 

cout<<endl<<"----------> 请输入学生信息 <---------"<<endl;
for(i=0;i<num;i++)
{
cout<<"请输入学期:";
cin>>r[i].term;
cout<<"请输入第"<<i+1<<"个人的学号:";
cin>>r[i].num;  
if(i>=1)
{
for(n=0;n<i;n++)
{
if(r[n].num==r[i].num)
{   
cout<<"该学号已存在!!"<<endl;
t=1;
}
}
}
if(t==1) //表示有重复
{
i--;
t=0;
continue;
}
cout<<"请输入姓名:";
cin>>r[i].name;
cout<<"请输入 高等数学 成绩:";
cin>>r[i].mark1;
cout<<"请输入 数据结构 成绩:";
cin>>r[i].mark2;
cout<<"请输入 大学英语 成绩:";
cin>>r[i].mark3;
r[i].sum=r[i].mark1+r[i].mark2+r[i].mark3;
r[i].average=(r[i].mark1+r[i].mark2+r[i].mark3)/3;
}
fp=fopen("student.txt","w+");
if(!fp) 
{
cout<<"文件不能打开"<<endl;
exit(0); 
}


for(n=0;n<i;n++)
{
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}

fclose(fp);
cout<<"文件已经写入"<<endl;
}


//输出信息
void output(Student *r)  
{
int m;
system("cls");                   //清屏
if(num>0)
{
FILE *fp;
if((fp=fopen("student.txt","r"))==NULL) //r只读
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(int n=0;n<num;n++)
{
fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,
&r[n].average);
}
fclose(fp);                            //关闭文件


cout<<"文件已经读入"<<endl;
cout<<"----------------------------> 学生信息如下 <------------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"<<setw(10) //setw(6) 设置输出宽度
<<"大学英语"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;
cout<<"---------------------------------------------------------------"<<endl;
for(m=0;m<num;m++)
{
cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)
<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)
<<r[m].sum<<setw(6)<<r[m].average<<endl;
}
cout<<"\0\0"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}


//按学号及学期查找
void searchnum(Student *r)
{
int n,k;
system("cls");                              //清屏
if(num>0)
{
cout<<"请输入要查找学生的学号:";
cin>>n;
cout<<"请输入学期号:";
cin>>k;
for(int m=0;m<num;m++)
{
if(r[m].num==n&&r[m].term==k)//如果找到了输出并跳出循环
{
cout<<endl;
cout<<"-------------------------> 要查找的信息如下 <-----------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"
<<setw(10)<<"大学英语"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;

cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2
<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(8)
<<r[m].average<<endl;
break;
}
}


if(r[m].num!=n&&r[m].term!=k)//若没找到提示不存在
cout<<"该学号不存在,或没有这个学期的成绩!"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}


//按姓名及学期查找
void searchname(Student *r)
{
char n[12];
int k;
system("cls");                             //清屏
if(num>0)                                  //如果没输入就查找提示
{
cout<<"请输入要查找学生的姓名:";
cin>>n;
cout<<"请输入学期号:";
cin>>k;
for(int m=0;m<num;m++)
{
if((r[m].name[0] == n[0]) && (r[m].term == k)) //如果找到了输出并跳出循环
{
cout<<endl;
cout<<"-------------------------> 要查找的信息如下 <---------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"
<<setw(10)<<"大学英语"<<setw(6)<<"学期"<<setw(6)<<"总分"
<<setw(8)<<"平均分"<<endl;
cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2
<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(8)
<<r[m].average<<endl;
break;
}
}
if(r[m].name[0]!=n[0]&&r[m].term!=k)    //若没找到提示不存在
cout<<"该姓名不存在,或没有这个学期的成绩!"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}


//按学号及学期修改信息     
void change(Student *r)    
{
FILE *fp;
int n=0;
char chiose ='Y';

if(num>0)
{
int n,k;
int t=0;
system("cls");                                  //清屏
cout<<"输入要修改成绩的学生学号:";
cin>>n;
cout<<"所需修改的学期:";
cin>>k;


for(int m=0;m<num;m++)
{
if(r[m].num==n && r[m].term==k)
{
int j;
cout<<endl;
cout<<"-------------------------> 修改前的信息如下 <--------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"
<<setw(10)<<"大学英语"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;

cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)
<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)
<<r[m].sum<<setw(8)<<r[m].average<<endl;
cout<<endl;

while (chiose=='Y'||chiose=='y')
{
cout<<"\t\t\t--------> 可以修改的项目如下 <-------\n"<<endl;
cout<<"\t\t\t 1.修改学生的 高等数学 成绩记录\n"<<endl;
cout<<"\t\t\t 2.修改学生的 数据结构 成绩记录\n"<<endl;
cout<<"\t\t\t 3.修改学生的 大学英语 成绩记录\n"<<endl;
                    cout<<"请选择:";
cin>>j;
switch(j)
{
case 1:
cout<<"输入新的 高等数学 成绩:";
cin>>r[m].mark1;
break;
case 2:
cout<<"输入新的 数据结构 成绩:";
cin>>r[m].mark2;
break;
case 3:        
cout<<"输入新的 大学英语 成绩:";
cin>>r[m].mark3;
break;
}
t=1;
cout<<"是否要继续修改此学生的其他成绩记录?(Y/N)";
fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取
cin>>chiose;
}
}
}
}
else
cout<<"未输入任何信息!!"<<endl;

if((fp=fopen("student.txt","w"))==NULL) 
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(n=0;n<num;n++)
{
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已修改并写入"<<endl;
}


//插入
Student *insert(Student *r)                       
{
FILE *fp;
int m;
char n;
do{
if((fp=fopen("student.txt","r"))==NULL) 
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(int o=0;o<num;o++)
{
fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].num,r[o].name,&r[o].mark1,&r[o].mark2,&r[o].mark3,&r[o].term,&r[o].sum,
&r[o].average);
}
Student *y = (Student *)new Student[num+1];//定义另一个数组,用于存放新添加的记录
for(m=0;m<num;m++)
{
y[m]=r[m];
}


r=y;
cout<<"请输入学期:";
cin>>r[num].term;
cout<<"请输入学号:";
cin>>r[num].num;
cout<<"请输入姓名:";
cin>>r[num].name;
cout<<"请输入 高等数学 成绩:";
cin>>r[num].mark1;
cout<<"请输入 数据结构 成绩:";
cin>>r[num].mark2;
cout<<"请输入 大学英语 成绩:";
cin>>r[num].mark3;
r[num].sum=r[num].mark1+r[num].mark2+r[num].mark3;//计算总分
r[num].average=(r[num].mark1+r[num].mark2+r[num].mark3)/3;

num++;
cout<<"是否继续输入?(继续,输入y,否则输入其他)"<<endl;
cin>>n;
}while(n=='y');


if((fp=fopen("student.txt","w+"))==NULL)
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(n=0;n<num;n++)
{
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}


fclose(fp);


cout<<"文件已经写入"<<endl;
return r;
}


//按学号及学期删除信息
void shanchu(Student *r)
{
FILE *fp;
if(num>0)
{
if((fp=fopen("student.txt","r"))==NULL) 
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(int o=0;o<num;o++)
{
fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].num,r[o].name,&r[o].mark1,&r[o].mark2,&r[o].mark3,&r[o].term,&r[o].sum,
&r[o].average);
}


int n,k,t=0;
cout<<"请输入要删除学生的学号:";
cin>>n;
cout<<"请输入要删除成绩的学期:";
cin>>k;
for(int m=0;m<num;m++)
if(r[m].num==n&&r[m].term==k)

for(int k=m;k<num;k++)//循环把后一位的信息提前一位
{
r[k]=r[k+1];
}
num--; //整体数量减一
t=1; //标志变量 1为找到0为未找到

if((fp=fopen("student.txt","w+"))==NULL) 
{
cout<<"对不起,文件不能打开!"<<endl;
exit(0); 
}
for(n=0;n<num;n++){
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark3,
r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
if(t==0)
cout<<"对不起,该学号不存在!"<<endl;
}
else
cout<<"未输入任何信息!"<<endl;
}


//按数据结构成绩冒泡降序排序
void maopao(Student *r)    
{
FILE *fp;
if(num>0)
{
if((fp=fopen("student.txt","r"))==NULL) 
{
cout<<"对不起,文件不能打开!"<<endl;
exit(0); 
}
for(int n=0;n<num;n++)
{
fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,
&r[n].average);
}
//算法
for(int k=0;k<num-1;k++)
{
for(int m=0;m<num-k;m++)

Student max;
if(r[m].mark2<r[m+1].mark2) 
{
max=r[m+1];
r[m+1]=r[m];
r[m]=max;
}  
}
}
cout<<"排序完毕"<<endl;
if((fp=fopen("student.txt","w"))==NULL) 
{
cout<<"对不起,文件不能打开!"<<endl;
exit(0); 
}
for(n=0;n<num;n++){
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f    %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
}
else
cout<<"对不起,未输入任何信息!"<<endl;
}


//按总分  选择降序  排序
void xuanze(Student *r)  
{
FILE *fp;
if(num>0)
{
if((fp=fopen("student.txt","r"))==NULL) 
{
cout<<"文件不能打开"<<endl;
exit(0); 
}
for(int n=0;n<num;n++)
{
fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,
&r[n].average);
}
//算法
for(int i=0;i<num;i++)
{
int max=i;
for(int j=i+1;j<num;j++)
{
if(r[max].sum<r[j].sum)
{
max=j;
}
}
Student temp;
temp=r[max];
r[max]=r[i];
r[i]=temp;
}
cout<<"排序完毕!"<<endl;
if((fp=fopen("student.txt","w+"))==NULL) 
{
cout<<"对不起,文件不能打开!"<<endl;
exit(0); 
}
for(n=0;n<num;n++){
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
}
else
cout<<"对不起,未输入任何信息!"<<endl;
}


//统计各科总分及平均分
void tongji(Student *r)
{
float summark1=0,summark2=0,summark3=0;
float avemark1=0,avemark2=0,avemark3=0;
FILE *fp;
system("cls");                              //清屏
if(num>0)
{
for(int m=0;m<num;m++)
{  
summark1=summark1+r[m].mark1;
summark2=summark2+r[m].mark2;
summark3=summark3+r[m].mark3;
}  
avemark1=summark1/num;
avemark2=summark2/num;
avemark3=summark3/num;
cout<<endl;
cout<<"高等数学 总分为:"<<summark1<<"平均分为:"<<avemark1<<endl;
cout<<endl;
cout<<"数据结构 总分为:"<<summark2<<"平均分为:"<<avemark2<<endl;
cout<<endl;                                  
cout<<"大学英语 总分为:"<<summark3<<"平均分为:"<<avemark3<<endl;
cout<<endl;
if((fp=fopen("student.txt","w"))==NULL) 
{
cout<<"对不起,文件不能打开!"<<endl;
exit(0); 
}
for(int n=0;n<num;n++)

{
fprintf(fp,"%d   %s   %.1f   %.1f   %.1f   %d   %.1f   %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,
r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
cout<<"高等数学 总分为:"<<summark1<<endl;
cout<<"数据结构 总分为:"<<summark2<<endl;
cout<<"大学英语 总分为:"<<summark3<<endl;
}
else
cout<<"对不起,未输入任何信息!"<<endl;
}

//主函数main.cpp:

#include <iostream.h>
#include"student.h"
#include <stdlib.h>
#include <iomanip.h>   
#include <conio.h>      
#include <stdio.h> 


//数组、结构体


//int num=0;
//声明


void main()
{
int num;
cout<<"输入学生的个数:";
cin>>num;                 //全局变量
put(num);
Student *p=(Student *)new Student[num];//定义指针数组,存放学生个数
int m;
do{
cout<<endl;
cout<<endl;
cout<<"\t*----------------------------->菜单栏<-----------------------------*\n"<<endl;
cout<<"\t* <1> 输入学生信息并保存到文件      <2> 读取文件并输出学生信息     *"<<endl;
cout<<"\t* <3> 按学号及学期查询              <4> 按姓名及学期查询           *"<<endl;
cout<<"\t* <5> 按学号及学期修改信息          <6> 插入信息                   *"<<endl;
cout<<"\t* <7> 按学号及学期删除信息          <8> 按数据结构降序(冒泡)排序   *"<<endl;
cout<<"\t* <9> 按总分降序(选择)排序          <10> 统计各科成绩的总分和平均分*"<<endl;
cout<<"\t*                           <11> 退出                              *"<<endl;
cout<<"\t*------------------------------------------------------------------*\n"<<endl;
cout<<"请选择:";
cin>>m;
switch(m)
{
case 1: 
input(p);     //输入
break;
case 2:
output(p);
break;
case 3: 
searchnum(p);
break;
case 4: 
searchname(p);
break;
case 5: 
change(p);
break;
case 6: 
p=insert(p);
break;
case 7: 
shanchu(p);
break;
case 8: 
maopao(p);
break;
case 9:
xuanze(p);
break;
case 10: 
tongji(p);
break;
case 11:                    //退出
break;
}
}while(m!=11);   
}

运行结果截图:




0 0
原创粉丝点击