千行代码实现学生管理系统(C++源码文件操作+注释)

2024-01-28 21:20

本文主要是介绍千行代码实现学生管理系统(C++源码文件操作+注释),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在这里插入图片描述


/*************************************************/
/*对库函数的定义*/ 
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <math.h>
#include<iostream>
using namespace std;
#include<string>
#define COURSENUM 3//课程门数 
#define STRLENGTH 90//字符串长度 
#define STUDENTNUM 100//学生人数 
#define FILENAME "studentlist.txt"//缺省数据文件名 
#define FILEFLAG1  "STL" //数据文件格式标记,基本学生数据表
#define  FILEFLAG2 "STLSA" //数据文件格式标记,基本学生数据表+总成绩和平均成绩 /* 学生结构体定义 */ 
struct student   
{int nNumber;  	//学号,4位char szName[STRLENGTH];	//姓名,2-3个汉字float fScore[COURSENUM];//学生几门课的成绩float fAveScore;	//平均分  float fSumScore;	//总成绩 
};
// 函数的声明 ,加主函数,共计20个函数*/ /*菜单相关函数 共计5个*/ 
//一级主菜单选项显示
void Select_MainMenu(struct student stu[],char szCourseName[][STRLENGTH],int* pNum);	
/* 二级菜单:信息管理模块菜单选项显示  */
void Select_ManageMenu(struct student stu[],char szCourseName[][STRLENGTH],int* pNum);
/* 二级菜单:排序计算菜单选项显示 */ 
void Select_SortMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum);
/* 二级菜单:条件查询菜单选项显示 */ 
void Select_QueryMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum);
/* 二级菜单:文件保存菜单选项显示 */ 
void Select_SaveMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum);
/*文件相关函数,共计4个*/
//创建文件,并将现有的数据写入文件				
int CreateFile(struct student stu[],int nStudentNum,int nFlag);
//创建另存为其它文件名 
int CreateFileAs(struct student stu[],int nStudentNum,int nFlag);
//读取文件,并提取文件中的元素信息保存到学生结构体中				
int ReadFromFile(FILE* fp,struct student stu[]);
//将当前的学生信息写入文件 
void WriteToFile(FILE* fp,struct student stu[],int nStudentNum,int nFlag);
/*信息管理相关函数,共计4个*/ 
//添加个学生信息 
int AddStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int*npStudentNum);
//输出学生信息				
void OutputStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int num,int flag,int nFrom,int nTo);
// 删除1个学生信息,返回正常删除了还是没有删除 
int DeleteStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int* npStudentNum); 
/* 修改指定学生的成绩信息 */ 
int ModifyStudentScore(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum);  
//* 排序计算相关函数,共计4个  */ 
//按学号升序排序 
void SortOnNumAs(struct student stu[],int nStudentNum,char szCourseName[][STRLENGTH]);
// 选择法实现按总成绩降序排序   
void SortOnSumDs(struct student stu[],int nStudentNum,char szCourseName[][STRLENGTH]);
// 计算各科平均分 */ 
void ComputeAverageScore(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum); 
//计算各科的成绩分布
void ComputeDistribution(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum); 
//*查询相关函数,共计2个*/
/*按学号查找 */
void FindByNumber(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) ; 
/*按姓名查找 */
void FindByName(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) ;
//* 系统主函数,初始化,调用等功能 */ 
int main() 
{	/* 基本数据结构 */ //定义学生结构体数组,这个数组一直作为参数在需要的函数之间传递 struct student stu[STUDENTNUM];//存储学生个数 ,这个个数一直作为参数在需要的函数之间传递 int nStudentNum=0;//定义课程名称 char szCourseName[COURSENUM][STRLENGTH]={"语文","数学","英语"};///	/* 显示菜单前的准备 */ 	system("color 5e") ;//改变背景前景色//打开学生数据文件 FILE * fp=fopen(FILENAME,"r"); //为简化系统,文件名在宏定义里面给定 //若数据文件不存在,新建数据文件 if(fp==NULL){	printf("\t\t系统指定数据文件: %s 不存在,需要手工输入数据\n",FILENAME);	//调用添加学生信息函数	AddStudentInfo(stu,szCourseName,&nStudentNum);printf("\t\t已成功添加%d个学生数据.......\n",nStudentNum);//调用创建数据文件函数 if(!CreateFile(stu,nStudentNum,0))printf("\t\t创建数据文件: %s 失败,添加的数据没有保存在数据文件中\n",FILENAME);	//创建数据文件失败不影响数据添加,只是告知用户没有保存在数据文件中就行啦。 }//创建文件结束 //若数据文件现成有,读取现有数据文件信息else {	//调用读取数据文件函数 nStudentNum=ReadFromFile(fp,stu);//输出读取文件状态 if(nStudentNum>0)printf("\t\t已成功从数据文件中%s读取了%d个学生的数据.......\n\t\t",FILENAME,nStudentNum);elseprintf("\t\t数据文件%s没有数据或格式不对,请使用信息管理功能添加数据.......\n\t\t",FILENAME);fclose(fp); }//关闭文件//让用户看完回车反馈后继续进行 system("pause");
///   /*给用户显示主菜单,将程序控制交给主菜单控制程序*///printf("%s",stu[0].szName);Select_MainMenu(stu,szCourseName,&nStudentNum); 	 
} /*菜单相关函数*//* 
函数功能:一级主菜单选项显示 
输入参数:学生结构体数组,课程名数组
返回参数:学生人数(因为可能一直改变,用指针变量实现)
*/ 
void Select_MainMenu(struct student stu[],char szCourseName[][STRLENGTH],int*npStudentNum) 
{	int nMainchoose;//主菜单无限循环 while(1){system("CLS"); //系统屏幕清空 //输出菜单主界面 printf("\t\t   ------------------------  \n");printf("\t\t|      学生成绩管理系统      |\n");printf("\t\t|                            |\n");printf("\t\t|  1.信息显示   2.信息管理   |\n");printf("\t\t|                            |\n");printf("\t\t|  3.排序计算   4.条件查询   |\n");printf("\t\t|                            |\n");printf("\t\t|  5.文件保存   0.退出系统   |\n");printf("\t\t   ------------------------  \n");//根据宏定义的文件名和学生数额显示 printf("\n\t数据文件%s中目前共有%d名学生 \n\n",FILENAME,*npStudentNum);//请用户输入选择的数字 printf("\t\t   请选择功能序号(0~5):");//用户根据界面提示输入数字 scanf("%d",&nMainchoose);	//根据用户输入的数字看如何行动					switch(nMainchoose){//信息显示 case 1: printf("\n");//调用输出学生信息函数 OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);	//转到输出显示函数 system("PAUSE");break;//转到二级菜单:信息管理模块菜单选项显示 case 2: Select_ManageMenu(stu,szCourseName,npStudentNum);break;//转到二级菜单:条件排序模块菜单选项显示case 3:Select_SortMenu(stu,szCourseName,*npStudentNum);	break;//转到二级菜单:条件查询模块菜单选项显示case 4:Select_QueryMenu(stu,szCourseName,*npStudentNum);break;//转到二级菜单:文件保存模块菜单选项显示case 5:Select_SaveMenu(stu,szCourseName,*npStudentNum);break;//用户选择退出		case 0: printf("\n\n\t\t感谢使用我们的软件,欢迎下次再来!") ;exit(0);break; //用户选择有误 default:printf("选择有误,请重选!\n");}//switch结束 }//while(1)函数结束 
}//Select_MainMenu函数结束 /* 
函数功能:一级菜单:信息管理模块菜单选项显示  
输入参数:学生结构体数组,课程名数组
返回参数:学生人数(因为可能一直改变,用指针变量实现)
*/ 
void Select_ManageMenu(struct student stu[],char szCourseName[][STRLENGTH],int* npStudentNum)
{int nManageChoose;while(1){   system("CLS");printf("\t\t------------------------------\n");printf("\t\t|********信息管理模块********|\n");printf("\t\t|                            |\n");printf("\t\t|        1.增加学生信息      |\n");printf("\t\t|                            |\n");printf("\t\t|        2.删除学生信息      |\n");printf("\t\t|                            |\n");printf("\t\t|        3.修改学生信息      |\n");printf("\t\t|                            |\n");printf("\t\t|        0.返回上级菜单      |\n");printf("\t\t|                            |\n");printf("\t\t   ------------------------  \n");printf("\n\t数据文件%s中目前共有%d名学生 \n\n",FILENAME,*npStudentNum);printf("\t\t   请选择功能序号(0~3):");//读入用户选择 scanf("%d",&nManageChoose);switch(nManageChoose){case 1:AddStudentInfo(stu,szCourseName,npStudentNum);//转到增加学生信息函数 //OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);//输出给用户看一下 system("PAUSE");break;case 2:DeleteStudentInfo(stu,szCourseName,npStudentNum);//转到删除学生信息函数//OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);//输出给用户看一下 system("PAUSE");break;case 3:ModifyStudentScore(stu,szCourseName,*npStudentNum);//转到修改学生信息函数//OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);//输出给用户看一下 system("PAUSE");break;case 0: Select_MainMenu(stu,szCourseName,npStudentNum);			//返回一级主菜单函数 break;default:printf("\t\t选择有误,请重选!\n");}//switch结束 */}//while(1)结束 }//Select_ManageMenu函数结束 /* 
函数功能:二级菜单:排序和计算菜单选项显示  
输入参数:学生结构体数组,课程名数组,学生人数
返回值:无 
*/ 
void Select_SortMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum)
{int nSortChoose;while(1){	system("CLS");printf("\t\t------------------------------\n");printf("\t\t|********排序计算模块********|\n");printf("\t\t|                            |\n");printf("\t\t|   1.按学号升序排序         |\n");printf("\t\t|                            |\n");printf("\t\t|   2.总成绩计算及降序排序   |\n");printf("\t\t|                            |\n");printf("\t\t|   3.各科平均成绩计算           |\n");printf("\t\t|                            |\n");printf("\t\t|   4.各科成绩分布计算       |\n");printf("\t\t|                            |\n");printf("\t\t|   0.返回上级菜单           |\n");printf("\t\t|                            |\n");printf("\t\t------------------------------  \n");printf("\n\t数据文件%s中目前共有%d名学生 \n\n",FILENAME,nStudentNum);printf("\t\t   请选择功能序号(0~4):");	//读入用户选择 scanf("%d",&nSortChoose);switch(nSortChoose){case 1:SortOnNumAs(stu,nStudentNum,szCourseName);//按学号升序排序 //添加完函数后这里就可以解开注释了	//OutputStudentInfo(stu,szCourseName,nStudentNum,0,0,nStudentNum);//输出给用户看一下 system("PAUSE");break;case 2: SortOnSumDs(stu,nStudentNum,szCourseName);//按总成绩降序排序	//添加完函数后这里就可以解开注释了	//printf("\n\t\t\t计算各人总成绩及平均成绩......\n");//OutputStudentInfo(stu,szCourseName,nStudentNum,1,0,nStudentNum);//输出给用户看一下 system("PAUSE");break;case 3: //添加完函数后这里就可以解开注释了	//printf("\n\t\t\t计算总成绩及平均成绩......\n");ComputeAverageScore(stu,szCourseName,nStudentNum);//按总成绩降序排序	system("PAUSE");break;case 4: //添加完函数后这里就可以解开注释了	//printf("\n\t\t\t计算各科平均成绩及分布......\n");ComputeDistribution(stu,szCourseName,nStudentNum);//按总成绩降序排序	system("PAUSE");break;case 0:Select_MainMenu(stu,szCourseName,&nStudentNum);//返回一级主菜单选项显示 break;default:printf("\t\t选择有误,请重选!\n");}//switch结束 }//while(1)结束 
}//Select_SortMenu函数结束 /* 
函数功能:二级菜单:信息查询菜单选项显示  
输入参数:学生结构体数组,课程名数组,学生人数
返回值:无 
*/ void Select_QueryMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) 
{	int nQueryChoose;while(1){system("CLS");printf("\t\t---------------------------------------\n");printf("\t\t|*************信息查询模块************|\n");printf("\t\t|                                     |\n");printf("\t\t|         1.根据学号查询信息          |\n");printf("\t\t|                                     |\n");printf("\t\t|         2.根据姓名查询信息          |\n");printf("\t\t|                                     |\n");printf("\t\t|         0.返回上级菜单              |\n");printf("\t\t|                                     |\n");printf("\t\t---------------------------------------\n");printf("\t\t                            \n");printf("\t\t   请选择功能序号(0~2):");scanf("%d",&nQueryChoose);switch(nQueryChoose){case 1: FindByNumber(stu,szCourseName,nStudentNum);	//按学号查询学生信息 system("PAUSE");break;case 2: FindByName(stu,szCourseName,nStudentNum); //按姓名查询学生信息 system("PAUSE");break;case 0: Select_MainMenu(stu,szCourseName,&nStudentNum); 	//返回一级主菜单选项 break;default:printf("\t\t选择有误,请重选!\n");}//switch结束 }//while结束 
}//信息查询菜单结束 /* 
函数功能:二级菜单:文件保存选项显示  
输入参数:学生结构体数组,课程名数组,学生人数
返回值:无 
*/ 
void Select_SaveMenu(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) 
{	int nSaveChoose;while(1){system("CLS");printf("\t\t---------------------------------------\n");printf("\t\t|*************文件保存模块************|\n");printf("\t\t|                                     |\n");printf("\t\t|         1.当前文件保存              |\n");printf("\t\t|                                     |\n");printf("\t\t|         2.另存其它文件              |\n");printf("\t\t|                                     |\n");printf("\t\t|         3.保存平均和总成绩          |\n");printf("\t\t|                                     |\n");printf("\t\t|         0.返回上级菜单              |\n");printf("\t\t|                                     |\n");printf("\t\t---------------------------------------\n");printf("\t\t                            \n");printf("\t\t   请选择功能序号(0~3):");scanf("%d",&nSaveChoose);switch(nSaveChoose){case 1://重新创建数据文件CreateFile(stu,nStudentNum,0);break;case 2:	//另存为其它文件 CreateFileAs(stu,nStudentNum,0);break;case 3:	//另存为其它文件并保存总成绩和其它成绩 CreateFileAs(stu,nStudentNum,1);break;case 0:Select_MainMenu(stu,szCourseName,&nStudentNum); 				//返回一级主菜单选项 break;default:printf("\t\t选择有误,请重选!\n");}//switch结束 system("PAUSE");}//while结束 
}//文件保存菜单结束 // /*文件相关函数*//* 
函数功能:创建文件,并将现有的数据写入文件 
输入参数:学生结构体数组,学生人数,文件格式标志 注意有两种存储文件格式,1种是没有平均成绩和总成绩的,1种是有的为了区分两种文件格式,将文件格式标志写到数据文件里面 文件格式标志:0 表示 "STL" 是存储为基本学生数据表信息文件 (无总成绩和平均成绩) 1 表示 "STLSA" 是基本学生数据表+总成绩和平均成绩 ***文件格式标志为程序员自己定义的,用记事本打开studentlist.txt可以看到存储数据内容 
返回值:0: 创建成功,1,创建不成功 
*/ int CreateFile(struct student stu[],int nStudentNum,int nFlag)
{//数据写入文件FILE* fp=fopen(FILENAME,"w");if(fp!=NULL){	WriteToFile(fp,stu,nStudentNum,nFlag);printf("\t\t已成功将%d个学生数据写入数据文件%s.......\n",nStudentNum,FILENAME);//给用户显示目前的信息return 1;}else //文件创建不成功 return 0;}//创建文件结束 /* 
函数功能:另存为文件,并将现有的数据写入文件 
输入参数:学生结构体数组,学生人数,文件格式标志 文件格式标志:0 表示 "STL" 是存储为基本学生数据表信息文件 1 表示 "STLSA" 是基本学生数据表+总成绩和平均成绩 ***文件格式标志为程序员自己定义的,用记事本打开dd.txt,和  Studentscore.data可以看到存储数据内容 
返回值:0: 创建成功,1,创建不成功 
*/ int CreateFileAs(struct student stu[],int nStudentNum,int nFlag)
{char szFileName[STRLENGTH];if(nStudentNum<1){printf("\t\t当前没有学生数据,请到信息管理模块添加数据!\n");return 0;}if(nFlag==1&&stu[0].fSumScore<1){printf("\t\t当前没有总成绩和平均成绩信息,请到排序计算模块计算成绩!\n");return 0;}while(1){printf("\n\t\t请输入拟保存的文件名: ");scanf("%s",szFileName);if(strcmp(szFileName,FILENAME)==0)printf("\n\t\t该文件名为系统文件名,不可使用!\n");elsebreak; }//数据写入文件FILE* fp=fopen(szFileName,"w");if(fp!=NULL){WriteToFile(fp,stu,nStudentNum,nFlag);printf("\t\t已成功将%d个学生数据写入数据文件%s.......\n",nStudentNum,szFileName);fclose(fp);//给用户显示目前的信息return 1;}else //文件创建不成功 return 0;}//创建另存为文件结束 /* 
函数功能:读取文件,并提取文件中的元素信息保存到学生结构体中注意:如果从数据文件中读到的起始字符串是"STL" 表示是基本学生数据表信息文件 读到 "STLSA" 是基本学生数据表+总成绩和平均成绩 ***文件格式标志为程序员自己规定的,用记事本打开dd.txt,和  Studentscore.data可以看到存储数据内容  
输入参数:文件指针,学生结构体数组返回值:读到的学生数 
*/ int ReadFromFile(FILE *fp,struct student stu[])
{int i=0;char szFileFlag[STRLENGTH];//先读文件标记fscanf(fp,"%s",szFileFlag) ;int nFlag=-1;if(strcmp(szFileFlag,FILEFLAG1)==0)nFlag=0;if(strcmp(szFileFlag,FILEFLAG2)==0)nFlag=1;if (nFlag==-1)return 0; //如果是未知的文件头,返回0 do{int nReadNum=0;//读学号和姓名 nReadNum+=fscanf(fp,"%d%s",&stu[i].nNumber,&stu[i].szName);//读各科成绩 int j=0;for( j=0;j<COURSENUM;j++)nReadNum+=fscanf(fp,"%f",&stu[i].fScore[j]);//如果是STLSA,读总成绩和平均成绩if(nFlag==1)fscanf(fp,"%f%f",&stu[i].fSumScore,&stu[i].fAveScore); //成功读取,计数器+1 if (nReadNum==(COURSENUM+2))i++;elsebreak;}while(1);return i;//返回读到的学生数 }
//ReadFromFile 函数结束		/* 
函数功能:将目前学生结构体的数据,写入一个文件
输入参数:文件指针,学生结构体数组,学生人数,文件格式标志 文件格式标志:0 表示 "STL" 是存储为基本学生数据表信息文件 1 表示 "STLSA" 是基本学生数据表+总成绩和平均成绩 ***文件格式标志为程序员自己定义的,用记事本打开dd.txt,和  Studentscore.data可以看到存储数据内容 返回值:读到的学生数 
*/ void WriteToFile(FILE* fp,struct student stu[],int nStudentNum,int nFlag)
{//输出标题 if(nFlag==0)fprintf(fp,FILEFLAG1);else if(nFlag==1)fprintf(fp,FILEFLAG2);fprintf(fp,"\n");int i;for(i=0;i<nStudentNum;i++)	{//写入数据文件 fprintf(fp,"%d %s ",stu[i].nNumber,stu[i].szName);//写各科成绩 int j;for( j=0;j<COURSENUM;j++)fprintf(fp,"%.2f ",stu[i].fScore[j]);if(nFlag==1) fprintf(fp,"%.2f %.2f",stu[i].fSumScore,stu[i].fAveScore);fprintf(fp,"\n");  		}//for循环结束  }//Write to File 函数结束/// /*学生信息处理函数---增加,删除,修改*/ /* 
函数功能:将输入N个学生信息,返回增加的学生数,并修改学生目前的数目 
输入参数:学生结构体数组,课程名称数组
返回值:学生人数(用指针变量返回,因为这个人数会变化      
返回值:添加的学生人数 
*/ 
int AddStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int* npStudentNum)
{printf("\n\t\t\t这里是增加学生信息模块\n"); //待你添加代码 1printf("请输入添加的学生人数:");int n;scanf("%d", &n);int i;int num=*npStudentNum;//num记录原来的学生人数 for (i = num + 1; i <= num + n; i++){printf("请输入第 %d 个学生学号:", i);scanf("%s", &stu[i].nNumber);printf("姓名:");scanf("%s", stu[i].szName);printf("语文成绩:");scanf("%f", &stu[i].fScore[0]);printf("数学成绩:");scanf("%f", &stu[i].fScore[1]);printf("英语成绩:");scanf("%f", &stu[i].fScore[2]);printf("=================================\n");npStudentNum++;}return *npStudentNum;//返回添加的学生数 }//AddSudentInfo函数结束 /* 
函数功能:输出学生信息函数 ,可以输出两种,1种是有平均成绩和总成绩的,1种是没有 
输入参数:学生结构体数组,课程名称数组,学生人数,文件格式标志(是否有平均成绩和总成绩)没有平均成绩和总成绩文件标志为 0,有平均成绩和总成绩文件标志为 1 nFrom 表示从第几个开始输出,nTo表示输到第几个结束  
返回值:无      
*/ 
//OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);	//转到输出显示函数 
void OutputStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum,int nFlag,int nFrom,int nTo)
{if(nFlag==0){printf("\n\t\t\t这里是显示学生信息模块\n"); //待你添加代码 2printf("STL\t\t学号\t 姓名 \t\t语文\t数学\t英语\n");printf("\t\t=============================================\n");for(int i=0;i<nStudentNum;i++){//cout<<stu[i].szName<<endl;printf("   \t\t%d\t%s\t\t%.2f\t%.2f\t%.2f\n",stu[i].nNumber,stu[i].szName,stu[i].fScore[0],stu[i].fScore[1],stu[i].fScore[2]);}printf("\t\t=============================================\n");}if(nFlag==1){for(int i=0;i<nStudentNum;i++){stu[i].fSumScore=stu[i].fScore[0]+stu[i].fScore[1]+stu[i].fScore[2];stu[i].fAveScore=(stu[i].fSumScore)/3.0;}printf("\n\t\t\t这里是显示学生信息模块\n"); //待你添加代码 2printf("STL\t\t学号\t 姓名 \t\t语文\t数学\t英语\t总成绩\t平均成绩\n");printf("\t\t================================================================\n");for(int i=0;i<nStudentNum;i++){//cout<<stu[i].szName<<endl;printf("   \t\t%d\t%s\t\t%.2f\t%.2f\t%.2f\t%.2f\t %.2f\n",stu[i].nNumber,stu[i].szName,stu[i].fScore[0],stu[i].fScore[1],stu[i].fScore[2],stu[i].fSumScore,stu[i].fAveScore);}printf("\t\t=================================================================\n");}
} 
//输出学生信息函数结束 /* 
函数功能:删除某位学生信息的函数,函数内部自带输入 
输入参数:学生结构体数组,课程名称数组
返回值:学生人数(以指针变量形式,因为人数会变化) nFrom 表示从第几个开始输出,nTo表示输到第几个结束  
返回值:是否成功删除,0为没成功删除,1为成功删除      
*/ 
int DeleteStudentInfo(struct student stu[],char szCourseName[][STRLENGTH],int* npStudentNum)
{printf("\n\t\t\t这里是删除学生信息模块\n"); //待你添加代码 3OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);printf("\t\t请输入要删除学生的学号:");int num;cin>>num;for(int i=0;i<*npStudentNum;i++){if(num==stu[i].nNumber){for(int j=i;j<*npStudentNum;j++){stu[j]=stu[j+1];}printf("\n\t\t******已删除%d号学生数据********\n",num);(*npStudentNum)--;OutputStudentInfo(stu,szCourseName,*npStudentNum,0,0,*npStudentNum);return 1;}} printf("没有您输入的学号,请输入正确的学号\n");return 0;
}//DeleteStudentInfo函数结束 /* 
函数功能:修改某位学生的成绩信息,函数内部自带输入 
输入参数:学生结构体数组,课程名称数组,学生人数 
返回值:是否成功修改,0为没成功修改,1为成功修改     
*/ 
int ModifyStudentScore(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum)   
{printf("\n\t\t\t 这里是修改学生信息模块\n"); //待你添加代码 4OutputStudentInfo(stu,szCourseName,nStudentNum,0,0,nStudentNum);printf("请输入要修改学生的学号:");int num;cin>>num;for(int i=0;i<nStudentNum;i++){if(num==stu[i].nNumber){printf("请选择你要修改的科目编号:\n");printf("\t\t\t*****************\n"); printf("\t\t\t*****0.语文******\n");printf("\t\t\t*****1.数学******\n");printf("\t\t\t*****2.英语******\n");printf("\t\t\t*****************\n");int t;L:	cin>>t;int k;switch(t){case 0:printf("\t\t请输入修改后的成绩(0-100):");cin>>k;stu[i].fScore[0]=k;break;case 1:printf("\t\t请输入修改后的成绩(0-100):");cin>>k;stu[i].fScore[1]=k;break;case 2:printf("\t\t请输入修改后的成绩(0-100):");cin>>k;stu[i].fScore[2]=k;break;default:printf("\t\t,---没有您输的成绩类别,请输入正确的类别---\n\t\t  请重新输入:");goto L;}printf("\t\t......已修改%d号学生的语文成绩......\n",num);OutputStudentInfo(stu,szCourseName,nStudentNum,0,0,nStudentNum);return 1; }}printf("没有您输入的学号,请输入正确的学号\n");return 0;
}//ModifyScore函数结束 // /*排序计算相关函数*/ 
/* 
函数功能:选择法实现按学号升序排序 
输入参数:学生结构体数组,学生人数 
返回值:修改共用的学生结构体数组每个学生的顺序     
*/ void SortOnNumAs(struct student stu[],int nStudentNum,char szCourseName[][STRLENGTH])
{printf("\n\t\t\t这里是按学号升序排序模块\n"); //待你添加代码 5for(int i=0;i<nStudentNum;i++){for(int j=i+1;j<nStudentNum;j++){if(stu[i].nNumber>stu[j].nNumber){struct student p=stu[i];stu[i]=stu[j];stu[j]=p;}}}OutputStudentInfo(stu,szCourseName,nStudentNum,0,0,nStudentNum);
}
//按学号升序排序结束/* 
函数功能:选择法实现按总成绩降序排序 
输入参数:学生结构体数组,学生人数 
返回值:修改共用的学生结构体数组每个学生的顺序    
*/ 
void SortOnSumDs(struct student stu[],int nStudentNum,char szCourseName[][STRLENGTH])
{printf("\n\t\t\t这里是计算总成绩,并按总成绩降序排序模块\n"); for(int i=0;i<nStudentNum;i++){stu[i].fSumScore=stu[i].fScore[0]+stu[i].fScore[1]+stu[i].fScore[2];}for(int i=0;i<nStudentNum;i++){for(int j=i+1;j<nStudentNum;j++){if(stu[i].fSumScore>stu[j].fSumScore){struct student p=stu[i];stu[i]=stu[j];stu[j]=p;}}}OutputStudentInfo(stu,szCourseName,nStudentNum,1,0,nStudentNum);//待你添加代码 6
}
//总成绩降序排序结束 /* 
函数功能:计算各科平均分 
输入参数:学生结构体数组,课程名字数据,学生人数 
返回值:修改共用的学生结构体数组的每个成员的平均分    
*/ void ComputeAverageScore(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum)
{printf("\n\t\t\t这里是计算学生各科平均分数模块\n"); //待你添加代码 7float sum1=0,sum2=0,sum3=0;for(int i=0;i<nStudentNum;i++){sum1+=stu[i].fScore[0];sum2+=stu[i].fScore[1];sum3+=stu[i].fScore[2];} printf("\t\t*****************************\n");printf("\t\t**班级的语文平均分为:%.2f**\n",sum1/nStudentNum);printf("\t\t**班级的数学平均分为:%.2f**\n",sum2/nStudentNum);printf("\t\t**班级的英语平均分为:%.2f**\n",sum3/nStudentNum);printf("\t\t*****************************\n");
}/* 
函数功能:计算并输出班级语文成绩各分数段分布情况 定义学生成绩分布等级如下:60分以下:fail60~70分 :pass70~80分 :good80~90分 :great90分以上:excellent 
输入参数:学生结构体数组,课程名字数据,学生人数 
返回值:无  
*/ 
void ComputeDistribution(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum)
{printf("\n\t\t\t 这里是计算各分数段分布模块\n"); //待你添加代码 8int a[5]={0};double b[5];for(int i=0;i<nStudentNum;i++){if(stu[i].fScore[0]<=100&&stu[i].fScore[0]>=90)a[0]++;else if(stu[i].fScore[0]<90&&stu[i].fScore[0]>=80)a[1]++;else if(stu[i].fScore[0]<80&&stu[i].fScore[0]>=70)a[2]++;else if(stu[i].fScore[0]<70&&stu[i].fScore[0]>=60)a[3]++;else if(stu[i].fScore[0]<60&&stu[i].fScore[0]>=0)a[4]++;}for(int i=0;i<5;i++){b[i]=(100.0*a[i]/nStudentNum);a[i]=0;}printf("**************************************************************************\n"); printf("\t\t\t班级语文成绩分布为:\n");printf("\t\t\t90~100分数段人数:%d人,占比%.1lf%;\n",a[0],b[0]);printf("\t\t\t80~90分数段人数:%d人,占比%.1lf%;\n",a[1],b[1]);printf("\t\t\t70~80分数段人数:%d人,占比%.1lf%;\n",a[2],b[2]);printf("\t\t\t60~70分数段人数:%d人,占比%.1lf%;\n",a[3],b[3]);printf("\t\t\t60分以下不及格人数:%d人,占比%.1lf%;\n",a[4],b[4]);for(int i=0;i<nStudentNum;i++){if(stu[i].fScore[1]<=100&&stu[i].fScore[1]>=90)a[0]++;else if(stu[i].fScore[1]<90&&stu[i].fScore[1]>=80)a[1]++;else if(stu[i].fScore[1]<80&&stu[i].fScore[1]>=70)a[2]++;else if(stu[i].fScore[1]<70&&stu[i].fScore[1]>=60)a[3]++;else if(stu[i].fScore[1]<60&&stu[i].fScore[1]>=0)a[4]++;}for(int i=0;i<5;i++){b[i]=(100.0*a[i]/nStudentNum);a[i]=0;}printf("**************************************************************************\n"); printf("\t\t\t班级数学成绩分布为:\n");printf("\t\t\t90~100分数段人数:%d人,占比%.1lf %;\n",a[0],b[0]);printf("\t\t\t80~90分数段人数:%d人,占比%.1lf %;\n",a[1],b[1]);printf("\t\t\t70~80分数段人数:%d人,占比%.1lf %;\n",a[2],b[2]);printf("\t\t\t60~70分数段人数:%d人,占比%.1lf %;\n",a[3],b[3]);printf("\t\t\t60分以下不及格人数:%d人,占比%.1lf %;\n",a[4],b[4]);for(int i=0;i<nStudentNum;i++){if(stu[i].fScore[2]<=100&&stu[i].fScore[2]>=90)a[0]++;else if(stu[i].fScore[2]<90&&stu[i].fScore[2]>=80)a[1]++;else if(stu[i].fScore[2]<80&&stu[i].fScore[2]>=70)a[2]++;else if(stu[i].fScore[2]<70&&stu[i].fScore[2]>=60)a[3]++;else if(stu[i].fScore[2]<60&&stu[i].fScore[2]>=0)a[4]++;}for(int i=0;i<5;i++){b[i]=(100.0*a[i]/nStudentNum);}printf("**************************************************************************\n"); printf("\t\t\t班级英语成绩分布为:\n");printf("\t\t\t90~100分数段人数:%d人,占比%.1lf%;\n",a[0],b[0]);printf("\t\t\t80~90分数段人数:%d人,占比%.1lf%;\n",a[1],b[1]);printf("\t\t\t70~80分数段人数:%d人,占比%.1lf%;\n",a[2],b[2]);printf("\t\t\t60~70分数段人数:%d人,占比%.1lf%;\n",a[3],b[3]);printf("\t\t\t60分以下不及格人数:%d人,占比%.1lf%;\n",a[4],b[4]);
}// 计算成绩分布情况函数结束 / //查询相关函数 共有2个:按学号,按姓名查找 /* 
函数功能:按学号查找并输出一个学生的具体信息 
输入参数:学生结构体数组,课程名字数据,学生人数 
返回值:无  
*/ void FindByNumber(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) 
{printf("\n\t\t\t 这里是按学号查找一个学生模块\n"); //待你添加代码 9int num;printf("请输入要查询学生的学号:");K:	cin>>num;for(int i=0;i<nStudentNum;i++){if(stu[i].nNumber==num){printf("STLSA\t\t学号  姓名      语文    数学    英语    总成绩    平均成绩\n");printf("\t\t==========================================================\n");printf("\t\t%d  %s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t  %.1lf\n",stu[i].nNumber,stu[i].szName,stu[i].fScore[0],stu[i].fScore[1],stu[i].fScore[2],stu[i].fSumScore,stu[i].fAveScore);printf("\t\t==========================================================\n");if(stu[i].fSumScore==0&&stu[i].fAveScore==0)printf("您还没有计算总成绩和平均成绩,请到排序计算模块进行计算!\n");printf("查询完毕\n");return ;}}printf("查询失败,请重新输入正确的学号: ");goto K;
}//按学号查询结束 /* 
函数功能:按姓名查找并输出一个学生的具体信息 
输入参数:学生结构体数组,课程名字数据,学生人数 
返回值:无  
*/ 
void FindByName(struct student stu[],char szCourseName[][STRLENGTH],int nStudentNum) 
{printf("\n\t\t\t这里是按姓名查找学生信息模块\n"); //待你添加代码 10char ch[STRLENGTH];printf("请输入要查询学生的姓名:");P:	cin>>ch;for(int i=0;i<nStudentNum;i++){if(strcmp(stu[i].szName,ch)==0){printf("STLSA\t\t学号  姓名      语文    数学    英语    总成绩    平均成绩\n");printf("\t\t==========================================================\n");printf("\t\t%d  %s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t  %.1lf\n",stu[i].nNumber,stu[i].szName,stu[i].fScore[0],stu[i].fScore[1],stu[i].fScore[2],stu[i].fSumScore,stu[i].fAveScore);printf("\t\t==========================================================\n");if(stu[i].fSumScore==0&&stu[i].fAveScore==0)printf("您还没有计算总成绩和平均成绩,请到排序计算模块进行计算!\n");printf("查询完毕\n");return ;}}printf("查询失败,请重新输入正确的学生姓名: ");goto P;}//按姓名查询结束 

这篇关于千行代码实现学生管理系统(C++源码文件操作+注释)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654805

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi