学生成绩管理系统的设计与实现

1,数据类型的定义。

定义所需变量。成绩,姓名,年龄,等等

2.为结构体类型定制的基本操作。

/* ①student.h文件的完整内容 */
#ifndef _STUDENT                /*条件编译,防止重复包含的错误*/
#define _STUDENT
#define NUM 20                   /*定义学生人数常量,根据实际需要修改值*/
struct Student                      /*学生记录所属结构体类型的定义*/
{	
           long num;                /*学号*/
           char name[20];         /*姓名*/
           char sex[10];             /*性别*/
           int score[3];              /*3门课成绩*/
           int total;                   /*总分*/
           int rank;                    /*名次*/
};
typedef struct Student Student;           /*定义类型的别名Student*/ 
#define sizeStu sizeof(Student)           /*一个学生记录所需要的内存空间大小*/
int readStu(Student *stu,int n);            /*读入学生记录,学号为0或读满停止*/
void printStu(Student  *stu , int n);        /*屏幕输出所有学生记录的值*/
int equal(Student s1,Student s2,int condition); /*根据condition判断s1与s2相等否*/
int larger(Student s1,Student s2,int condition);/*根据condition比较s1与s2的大小*/
void reverse(Student *stu,int n);            /*学生记录数组元素逆置*/
void calcuTotal(Student *stu,int n) ;         /*计算所有学生的总分*/
void calcuRank(Student *stu,int n) ;         /*根据总分计算学生的名次允许并列*/
void calcuMark(double m[3][3],Student *stu,int n);  /*求3门课的最高最低平均分*/
void sortStu(Student *stu,int n,int condition);  /*根据条件用选择法从小到大排序*/
int searchStu(Student *stu,int n,Student s,int condition,int *f) ;  /*根据条件查找数组*/
/*中与s相等的各元素,每一个与s相等元素的下标置于f数组中*/
int insertStu(Student *stu,int n,Student s);     /*向数组中插入一个元素按学号有序*/
int deleteStu(Student *stu,int n,Student s) ;    /*从数组中删除一个指定学号的元素*/
#endif
/*②student.c文件的完整内容*/
#include "student.h"
#include 
#include 
/*函数功能:从键盘读入学生的初始数据值
函数参数: 两个形式参数分别为结构体指针和预设记录条数
函数返回值:从键盘上实际读入的记录条数
*/
int readStu(Student  *stu ,int n)   
{	int i,j;
	for (i=0;is2.num;
	else if (condition==2)               /*若condition的值为2,则比较总分*/
		return s1.total>s2.total;	
	else return 1;                      /*其余情况返回1*/
}
/*函数功能:数组的元素逆置
函数参数: 两个形式参数分别为结构体指针和记录条数
函数返回值:无返回值
*/
void reverse(Student *stu,int n)          
{
	int i;
	Student temp;
	for (i=0;istu[j].score[i])
				m[i][1]=stu[j].score[i];
	}
	for (i=0;i<3;i++)                    /*求三门课的平均分*/
	{
        m[i][2]=stu[0].score[i];     
		for (j=1;j=0;i--)                        /*按学号从小到大有序*/
	{
		if (!larger(stu[i],s,1))                  /*若s大于当前元素则退出循环*/
		break;
		stu[i+1]=stu[i];                       /*否则元素stu[i]后移一个位置*/
	}
	stu[i+1]=s;                              /*在下标i+1处插入元素s*/                                   
	n++;                                   /*元素个数增加1*/
	return n;                                /*返回现有元素个数*/
}
/*函数功能:从结构体数组中删除指定学号的一条记录
函数参数:3个形参分别是结构体指针、原来的记录条数、待删除的记录
函数返回值:删除后的实际记录条数
*/
int deleteStu(Student *stu,int n,Student s)          
{
	int i,j;
	for (i=0;i

3.二进制文件实现数据的保存

/*③file.h文件的内容如下:*/
#ifndef _FILE                   /*条件编译,防止重复包含的错误*/
#define _FILE
#include "student.h"        
int createFile(Student *stu);       /*建立初始的数据文件*/
int readFile(Student *stu);        /*将文件中的内容读出置于结构体数组stu中*/
void saveFile(Student *stu,int n) ;   /*将结构体数组的内容写入文件*/
#endif	

/*④ file.c文件的内容如下:*/
#include 
#include 
#include "student.h"
#include "file.h"
/*函数功能:将文件中内容读出置于数组中
函数参数:形参是结构体指针
函数返回值:从文件中读出的实际记录条数
*/
int readFile(Student *stu )                 
{
   	FILE *fp;
	int i=0;
	if((fp=fopen("d:\\student.dat", "rb")) == NULL)   /*以读方式打开指定文件*/
	{   printf("file does not exist,create it first:\n");   /*若打开失败输出提示信息*/
	    return 0;                               /*然后返回0*/
	}	 
    fread(&stu[i],sizeStu,1,fp);                   /*读出第一条记录*/
   	while(!feof(fp))                            /*文件未结束时循环*/
	{	
        i++;
	   	fread(&stu[i],sizeStu,1,fp);               /*再读出下一条记录*/
    }
	fclose(fp);                                /*关闭文件*/
	return i;                                  /*返回记录条数*/
}
/*函数功能:将结构体数组内容写入文件
函数参数:两个形参分别是结构体指针、实际记录条数
函数返回值:无返回值
*/
void saveFile(Student *stu,int n)               
{  	FILE *fp;	
   	if((fp=fopen("d:\\student.dat", "wb")) == NULL) /*以写方式打开指定文件*/
	{	
         printf("can not open file !\n");            /*若打开失败,输出提示信息*/
         exit(0);                              /*然后退出*/
	}
	fwrite(stu,sizeStu,n,fp);                     /*一次性向文件写入n条记录*/
	fclose(fp) ;                               /*关闭文件*/
}
/*函数功能:建立初始的数据文件
函数参数:形参分别为结构体指针
函数返回值:返回写入文件的记录条数
*/
int  createFile(Student *stu)                    
{	FILE *fp;
	int n;
   	if((fp=fopen("d:\\student.dat", "wb")) == NULL) /*指定文件名,以写方式打开*/
	{   printf("can not open file !\n");            /*若打开失败,输出提示信息*/
	    exit(0);                              /*然后退出*/
    }
	printf("input students\' information:\n");
	n=readStu (stu,NUM);                    /*调用student.h中的函数读数据*/
    fwrite(stu,sizeStu,n,fp);                   /*将读入的所有记录全写入文件*/
 	fclose(fp);                              /*关闭文件*/
	return n;                               /*返回记录条数*/
}	

4.两级菜单提示用户选择。

/*⑤menu.h*/
#ifndef _MENU       /*条件编译,防止重复包含的错误*/
#define _MENU
void menu( );         /*顶层菜单函数*/
void menuBase( );     /*2、基本信息管理菜单函数*/
void menuScore( );    /*3、学生成绩管理菜单函数*/
void menuCount( );    /*4、考试成绩统计菜单函数*/
void menuSearch( );   /*5、根据条件查询菜单函数*/
#endif
/*⑥menu.c*/
#include 
#include "menu.h"
void menu( )         /*顶层菜单函数*/
{
		printf("******** 1. 显示基本信息 ********\n");
		printf("******** 2. 基本信息管理 ********\n");
		printf("******** 3. 学生成绩管理 ********\n");
		printf("******** 4. 考试成绩统计 ********\n");
        printf("******** 5. 根据条件查询 ********\n");
		printf("******** 0. 退出         ********\n");
}

void menuBase( )     /*2、基本信息管理菜单函数*/
{
		printf("%%%%%%%% 1. 插入学生记录 %%%%%%%%\n");
		printf("%%%%%%%% 2. 删除学生记录 %%%%%%%%\n");
		printf("%%%%%%%% 3. 修改学生记录 %%%%%%%%\n");
		printf("%%%%%%%% 0. 返回上层菜单 %%%%%%%%\n");
}

void menuScore( )     /*3、学生成绩管理菜单函数*/
{
		printf("@@@@@@@@ 1. 计算学生总分 @@@@@@@@\n");
		printf("@@@@@@@@ 2. 根据总分排名 @@@@@@@@\n");
		printf("@@@@@@@@ 0. 返回上层菜单 @@@@@@@@\n");
}
 
void menuCount( )    /*4、考试成绩统计菜单函数*/
{
		printf("&&&&&&&& 1. 求课程最高分 &&&&&&&&\n");
		printf("&&&&&&&& 2. 求课程最低分 &&&&&&&&\n");
		printf("&&&&&&&& 3. 求课程平均分 &&&&&&&&\n");
		printf("&&&&&&&& 0. 返回上层菜单 &&&&&&&&\n");
}

void menuSearch()    /*5、根据条件查询菜单函数*/
{
		printf("######## 1. 按学号查询   ########\n");
		printf("######## 2. 按姓名查询   ########\n");
		printf("######## 3. 按名次查询   ########\n");
		printf("######## 0. 返回上层菜单 ########\n");
}

5.主控模块的设计与实现。

/*⑦mainControl.h*/
#ifndef _MAINCONTROL
#define _MAINCONTROL
void printHead( );                   /*打印学生信息的表头*/
int baseManage(Student stu[],int n);     /*基本信息管理,按唯一学号插入删除修改*/
void scoreManage(Student stu[],int n) ;  /*学生成绩管理*/
void printMarkCourse(char *s,double m[3][3],int k);  /*打印分数通用函数*/
void countManage(Student stu[],int n);   /*考试成绩统计*/
void searchManage(Student stu[],int n);   /*该函数完成根据条件查询功能*/
int runMain(Student stu[],int n,int choice);  /*主控模块,选择执行于一级菜单功能*/
#endif
/*⑧mainControl.c*/
#include
#include"file.h"
#include"student.h"
#include "menu.h"
#include "mainControl.h"
/*函数功能:打印学生信息的表头
函数参数:无形参
函数返回值:无返回值
*/
void printHead( )                  
{    
printf("%8s%10s%8s%6s%6s%8s%6s%6s\n","学号","姓名","性别","数学",
"英语","计算机","总分","名次"); 
}
/*函数功能:基本信息管理,按唯一学号插入、删除、修改
函数参数:两个形参分别为结构体指针和记录条数
函数返回值:某种操作结束之后实际的记录条数
*/
int baseManage(Student *stu,int n)   
{  	int choice,t,find[NUM];
    Student s;
    do
    {   menuBase( );                     /*显示对应的二级菜单*/
        printf("choose one operation you want to do:\n");
		scanf("%d",&choice);	            /*读入选项*/
		switch(choice)
		{
            case 1: readStu(&s,1);       /*读入一条待插入的学生记录*/
			n=insertStu(stu,n,s);   /*调用函数插入学生记录*/
			 break;
			case 2:  printf("Input the number deleted\n");
					 scanf("%ld",&s.num);  /*读入一个待删除的学生学号*/
					 n=deleteStu(stu,n,s);   /*调用函数删除该学号学生记录*/
					 break;
			case 3:  printf("Input the number modified\n");
					 scanf("%ld",&s.num);  /*读入一个待修改的学生学号*/
				     t=searchStu(stu,n,s,1,find) ; /*调用函数查找该学号记录*/
				     if (t)                 /*如果该学号的记录存在*/
					 {	  readStu(&s,1);    /*读入一条完整的学生记录信息*/
					      stu[find[0]]=s;    /*刚读入的记录赋给需改的记录*/			     	  }					 
					 else                 /*如果该学号的记录不存在提示*/ 
                          printf("this student is not in,can not be modified.\n"); 
					 break;
			 case 0: break;
		}
	}while(choice);
return n;                              /*返回实际记录条数*/
}
/*函数功能:学生成绩管理,包括求总分及排名
函数参数:两个形参分别为结构体指针和记录条数
函数返回值:无返回值
*/
void scoreManage(Student *stu,int n)             
{  	int choice;
    do
	{	menuScore( );                        /*显示对应的二级菜单*/
		printf("choose one operation you want to do:\n");
		scanf("%d",&choice);	               /*读入二级选项*/
		switch(choice)
		{	case 1:   calcuTotal(stu,n);break;   /*求所有学生的总分*/ 
			case 2:  calcuRank(stu,n); break;  /*根据所有学生的总分排名次*/			case 0:   break;
		}
	}while(choice);
}
/*函数功能:打印分数
函数参数:第1个形参是输出分数的提示信息串,第2个形参表示3门课最高、最低、平均分的数组,
第3个形参代表选项,0、1、2对应最高、最低、平均分
函数返回值:无返回值
*/
void printMarkCourse(char *s,double m[3][3],int k)   
{ 
    int i;
    printf(s);                              /*s是输出分数的提示信息*/
    for (i=0;i<3;i++)                        /*i控制哪一门课*/
		  printf("%10.2lf",m[i][k]);
	printf("\n");
}
/*函数功能:考试成绩统计,求3门课的最高、最低、平均值
函数参数:两个形参分别为结构体指针和记录条数
函数返回值:无返回值
*/
void countManage(Student *stu,int n)          
{
	int choice;
	double mark[3][3];
	do
	{	menuCount( ) ;                     /*显示对应的二级菜单*/
		calcuMark(mark,stu,n);              /*求3门课的最高、最低、平均值*/
		printf("choose one operation you want to do:\n");
		scanf("%d",&choice);
		switch(choice)
		{	case 1:   printMarkCourse("三门课的最高分分别是:\n",mark,0); 
				      break;
			case 2:   printMarkCourse("三门课的最低分分别是:\n",mark,1);  
				      break;
			case 3:   printMarkCourse("三门课的平均分分别是:\n",mark,2);  
				      break;
			case 0:   break;
		}
	}while (choice);
}
/*函数功能:根据条件查询
函数参数:两个形参分别为结构体指针和记录条数
函数返回值:无返回值
*/
void searchManage(Student *stu,int n)          
{
    int i,choice,findnum,f[NUM];
    Student s;
	do
	{	menuSearch( );                       /*显示对应的二级菜单*/
		printf("choose one operation you want to do:\n");
		scanf("%d",&choice);
		switch(choice)
		{
	    	case 1:   printf("Input a student\'s num will be searched:\n");
				      scanf("%ld",&s.num);    /*输入待查询学生的学号*/
					  break;
			case 2:   printf("Input a student\'s name will be searched:\n");
				      scanf("%s",s.name);	    /*输入待查询学生的姓名*/	
				      break;   
			case 3:   printf("Input a rank will be searched:\n");
				      scanf("%d",&s.rank);     /*输入待查询学生的名次*/
					  break;
			case 0:   break;
		}
		if (choice>=1&&choice<=3)
		{ 
			findnum=searchStu(stu,n,s,choice,f);   /*符合条件元素的下标存于f*/
			if (findnum)				        /*如果查找成功*/
			{
			  	 printHead( );                 /*打印表头*/
				 for (i=0;i=0&&choice<=5)
	       n=runMain(stu,n,choice);   /*选择一级菜单对应的功能*/
	    else 
		   printf("error input,please input your choice again!\n");
	 } while (choice);
	 sortStu(stu,n,1);                 /*存入文件前按学号由小到大排序*/ 
	 saveFile(stu,n);                  /*将结果存入文件*/
     return 0;
}

你可能感兴趣的:(c语言,其他,经验分享,开发语言)