基于数组的学生管理系统

基于数组的学生管理系统

一、实验内容
编写并调试程序,实现学校各专业班级学生信息的管理。将10个学生的信息存储在文件studentInit.dat中;并定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩;和符号常量N(学生数)。
#define N 10
struct Student{
char num[15];//学号
char name[15];//姓名
char major[10];//专业(computer,software,network)
int classNo;//班级(1-2)
int score[3];//3门课的成绩(0-2)
};
typedef

struct Student STU;

二、实验要求

(1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 STU student[N]; //保存输入的N名学生信息
(2)定义函数void Input(STU *p, int n):从文件sutdentInit中输入n个学生的信息。
(3)定义函数void Output(STU *p):将p所指的某个学生信息表格化屏幕输出。
(4)定义函数STU Fetch(int studentIndex):从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生的信息。
(5)定义函数void Search(STU *p, int classNo, char s, int scoreSum);:实现班级和成绩的综合查找(如1班,总分>240的同学)。
(6)定义函数int Max(STU *p, int scoreIndex):求所有学生、下标为scoreIndex的课程分数最高的学生序号(在数组中的下标),学生序号作为返回值。
(7)定义函数void Sort_select(STU *p): 对所有学生,按平均成绩由低到高进行简单选择排序。
(8)定义函数void Sort_buble(STU *p, int n); 对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出。定义局部变量: STU stu_class_ave[N]; //按平均成绩排序后的某个班级的学生信息; int count;//实际元素个数
(9)定义函数void Sort_insert(STU *p, int n, char *major):对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出。 定义局部变量: STU stu_class_ subject [N]; //按某门课程成绩排序后的某个专业的学生信息; int count; //实际元素个数
(10)定义函数void Save(STU *p,int n) :将学生信息存入文件。
(11)定义函数void Welcome(),制作学生管理系统界面菜单。
(12)定义函数void Read() :从文件中读取所有学生信息到结构体中。 (13)定义函数void Revise(STU *p) :修改学生信息,其中可以选择修改学生的姓名、专业、班级、三门成绩中的任意某门成绩。
(14)定义函数void Delete(STU *p,int n) :从结构体中删除n个学生信息。
(15)定义函数void Add(STU *p,int n),添加n个学生信息到结构体中。
(16)定义函数void Sort_select_reverse(STU *p),对所有学生,按平均成绩由高到低进行简单选择排序。
(17) 定义函数void Sort_buble_reverse(STU *p,int n):某个班级的学生,按平均成绩由低到高进行起泡排序。并调用Output输出。
(18)定义函数voidSort_insert_reverse(STU *p,int n,char *major):对某个专业的学生,按某门课程成绩由高到低进行直接插入排序。并调用Output输出。

三、算法流程图(插入排序)

在这里插入图片描述

四、程序清单

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h> 
#include<conio.h>
#define N 10
struct Student{
	char num[15];            //学号
	char name[15];           //姓名
	char major[20];          //专业(computer,software,network)
	int classNo;             //班级(1-2)
	int score[3];            //3门课的成绩(0-2)
	int sum=0;                 //三门课的总成绩 
	double aver;             //三门课的平均成绩 
};
typedef struct Student STU;
int start=0;          //结构体数组的开头 
int end=10;           //结构体数组的结尾 
STU stu[N+10];              //定义结构体数组 
int mp[100];            //定义数组,记录某课程最高分的序号 
//以下为调用函数
void welcome();
void Input(STU *p,int n);                                 //从文件sutdentInit中输入n个学生的信息
void Read();                                              //从文件中读取学生信息 
void Output(STU *p);                                      //将文件里的全部学生信息表格化屏幕输出。
STU Fetch(int studentIndex);                              //从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生的信息。
void Search(STU *p,int classNo,int scoreSum);      //实现班级和成绩的综合查找(如1班,总分>240的同学)。
int Max(STU *p,int scoreIndex);                           //求所有学生、下标为scoreIndex的课程分数最高的学生序号(在数组中的下标),学生序号作为返回值。
void Sort_select(STU *p);                                 //对所有学生,按平均成绩由低到高进行简单选择排序。
void Sort_select_reverse(STU *p)  ;                        //对所有学生,按平均成绩由高到低进行简单选择排序。 
void Sort_buble(STU *p,int n);                            //对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出。
void Sort_buble_reverse(STU *p,int n);                               对某个班级的学生,按平均成绩由低到高进行起泡排序。并调用Output输出。
void Sort_insert(STU *p,int n,char *major);               //对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出。
void Sort_insert_reverse(STU *p,int n,char *major);               //对某个专业的学生,按某门课程成绩由高到低进行直接插入排序。并调用Output输出。
void Save(STU *p,int n);                                  //将学生信息存入文件。
void Revise(STU *p);                                      //修改学生信息
void Delete(STU *p,int n);                                    //删除n个学生信息    
void Add(STU *p,int n);                                             //添加学生信息 
int main(){                                             
	while(1)
	{
		welcome();
	}
	system("pause");
	return 0;
}

/*欢迎*/
void welcome() 
/* 界面*/
{
	int num;
	printf("  ***********************************************************\n");
	printf("  *                学生信息管理系统                         *\n");
	printf("  ***********************************************************\n\n");
	printf("  *******************系统功能菜单****************************\n");
	printf("     ----------------------   ------------------------------- \n");
	printf("     *****************************************************  \n");
	printf("     * 0.写入学生信息到文件里 * *  1.从文件中读取学生信息    * \n");
	printf("     *****************************************************     \n");
	printf("     * 2.输出全部学生信息     * *  3.文件中随机读取学生信息  * \n");
	printf("     *****************************************************     \n");
	printf("     * 4.班级成绩综合查询     * *  5.课程最高分成绩查询      * \n");
	printf("     *****************************************************     \n");
	printf("     * 6.全体学生平均分查询   * *  7.班级学生平均分查询      * \n");
	printf("     *****************************************************     \n");
	printf("     * 8.专业课程成绩查询     * *  9.添加学生信息            * \n");
	printf("     *****************************************************     \n");
	printf("     * 10.修改学生信息        * *  11.删除学生信息           * \n");
	printf("     *****************************************************     \n");
	printf("     * 12.保存学生信息到文件里* *  13.退出程序               * \n");
	printf("     *****************************************************     \n");
	printf("     ----------------------   ----------------------           \n");
	printf("请选择菜单编号:");
	scanf("%d", &num);
	switch (num)
	{
	case 0: 
	      Input(&stu[start],N);
		  break;
	case 1:
	      Read();
		  break; 
	case 2: 
	      printf("全部学生信息如下:\n");
	      printf("**********************************************************************************************************\n");
	      printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *   平均分   *   总分\n");
	     for(int i=0;i<end;i++){
	         Output(&stu[i]);
		  }
		  printf("**********************************************************************************************************\n\n\n\n");
		  system("pause");
		  break;
	case 3: 
		  printf("请输入需要查询的学生序号:\n");
	      int x;
	      scanf("%d",&x);
		  Fetch(x);
		  printf("\n\n\n"); 
		  system("pause");
		  printf("\n\n\n"); 
		  break;
	case 4: 
	      int n;
	      int grade;
	      printf("请输入需要查询的班级n以及班级总分grade:\n");
	      scanf("%d%d",&n,&grade);
	      Search(&stu[start],n,grade); 
	      printf("\n\n\n\n");
		  system("pause");
		  printf("\n\n\n\n"); 
	      break;
	case 5: 
	       int y;
	       printf("请输入课程序号(0是语文、1是数学、2是英语)\n");
		   scanf("%d",&y); 
		   printf("该课程最高分的学生序号和姓名为:\n"); 
		   for(int i=0;i<Max(stu,y);i++){
		   printf("%d %s\n",mp[i],stu[mp[i]].name);
		   } 
	       printf("\n\n\n\n\n\n");
		   break;
	case 6: 
	       printf("请选择\t\t升序查询(1)\t降序查询(2)\t\n\n");
	       int aa;
	       scanf("%d",&aa);
	       switch(aa)
		   {
	       	case 1:
			   Sort_select(stu);
			   break;
	       	case 2:
			   Sort_select_reverse(stu);
			   break;
		   }
	       printf("\n\n\n\n\n");
	       system("pause");
	       printf("\n\n\n\n");
	       break;
	case 7:
		   int p;
		   printf("请输入要查询的班级(1、2、3):\n");
		   scanf("%d",&p);
		   printf("请输入\t\t升序排序(1)\t降序排序(2)\n\n");
		   int bb;
		   scanf("%d",&bb);
		   switch(bb)
		   {
		   	case 1:
		   		Sort_buble_reverse(stu,p); 
		   		break;
		   	case 2:
		   		Sort_buble(stu,p);
				break; 
		   } 
		   printf("\n\n\n");
		   system("pause");
		   printf("\n\n\n");
	       break;
	case 8: 
	       int m;
	       char str[15];
	       printf("请输入查询课程(0是语文,1是数学,2是英语)和专业(computer、pilot、teacher、nurse、driver)\n");
	       scanf("%d%s",&m,str);
	       printf("请输入\t\t升序排序(1)\t降序排序(2)\t");
	       int cc;
	       scanf("%d",&cc);
	       switch(cc){
	       	    case 1:
	       	    	Sort_insert(stu,m,str);
	       	    	break; 
	       	    case 2:
	       	    	Sort_insert_reverse(stu,m,str);
	       	    	break;
		   }
		   printf("\n\n\n");
	       system("pause");
	       printf("\n\n\n");
	       break;
	case 9:	
	       int a;
	       printf("请输入要添加信息的学生个数:\n"); 
	       scanf("%d",&a);
		   Add(&stu[end],a);
		   printf("\n\n\n");
		   system("pause");
		   printf("\n\n\n");
		   break;
	case 10:
		   Revise(stu);
		   printf("\n\n\n");
		   system("pause");
		   printf("\n\n\n");
		   break;
	case 11: 
	       printf("请输入要删除信息的学生个数:\n"); 
	       int xx; 
	       scanf("%d",&xx);
	       Delete(stu,xx);
		   printf("\n\n\n");
		   system("pause");
		   printf("\n\n\n");
		   break; 
	case 12:
		  Save(stu,end);
		  printf("\n\n\n");
		  system("pause");
		  printf("\n\n\n");
		  break;
	case 13:
	    printf("即将退出程序!\n");
		exit(0);
	default:printf("请在0-12之间选择\n\n\n");
	}
}
/*向文件中输入学生信息*/ 
void Input(STU *p,int n){
	FILE *fp;
	if((fp=fopen("studentInit.dat","wb"))==NULL){     //打开文件  wb是写入二进制文件 给他一个权限 
		printf("cannot open file\n");
		exit(0);
	}
	for(int i=0;i<n;i++){
		printf("请输入十位学生的学号、姓名、专业、班级以及学生的三门课成绩:\n");
	    scanf("%s %s %s %d",stu[i].num,stu[i].name,stu[i].major,&stu[i].classNo);
	    for(int j=0;j<=2;j++){	
	    scanf("%d",&stu[i].score[j]);
	    stu[i].sum+=stu[i].score[j];
	}
	    stu[i].aver=stu[i].sum*1.0/3;
	    if((fwrite(&stu[i],sizeof(STU),1,fp))!=1){
	    	printf("file write error\n");
		}
	}
	fclose(fp);
	    printf("\n\n\n十位同学的信息已经输入成功!!!\n\n\n\n");

		system("pause"); 
		printf("\n\n\n");
}
/*从文件中读取全部学生信息*/
void Read(){
          FILE *fp;
	      if((fp=fopen("studentInit.dat","rb"))==NULL)
	      {
		  printf("cannot open file\n");
		  exit(0);
	      }
	      for(int i=0;i<end;i++){
	      	 fread(&stu[i],sizeof(STU),1,fp);
		  } 
		  printf("\n\n\n文件读取成功\n\n\n\n\n");
		  fclose(fp);
}
/*表格形式输出学生全部信息*/ 
void Output(STU *p){
         printf("*   %s   *   %s   *   %s\t *      %d   *   %d     *    %d   *   %d    *     %.2lf   *     %d\n\n",(*p).num,(*p).name,(*p).major,(*p).classNo,(*p).score[0],(*p).score[1],(*p).score[2],(*p).aver,(*p).sum);
         
}
/*从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生的信息。*/
STU Fetch(int studentIndex){
	FILE *fp;
	if((fp=fopen("studentInit.dat","rb"))==NULL){
		printf("can not open file\n");
		exit(0);
	}
     	printf("第%d个学生的基本信息与成绩:\n",studentIndex);
		fseek(fp,studentIndex*sizeof(STU),0);             //移动文件位置标记,从头开始 
		fread(&stu[studentIndex],sizeof(STU),1,fp);        //读一个数据块到数据块里 
		printf("%s  %s  %s  %d  %d  %d  %d",stu[studentIndex].num,stu[studentIndex].name,stu[studentIndex].major,stu[studentIndex].classNo,stu[studentIndex].score[0],stu[studentIndex].score[1],stu[studentIndex].score[2]);
	
}
/*班级成绩的综合查询*/
void Search(STU *p, int classNo,int scoreSum){

	printf("%d班里总分大于%d分的学生有:\n",classNo,scoreSum);
	for(int i=0;i<end;p++,i++){	    
		if((*p).classNo==classNo){ 
		int sum=0;
			for(int j=0;j<=2;j++)
			sum+=(*p).score[j];
			if(sum>=scoreSum){
				printf("%s\t其总分为:%d\n",(*p).name,sum);
			}
		}
	}
  

}
/*求某课程分数最高的学生序号*/
int Max(STU *p, int scoreIndex){
    memset(mp,0,sizeof(mp));
	int maxx=0;
	int j=0;
	for(int i=0;i<end;i++,p++) 
	{
		if((*p).score[scoreIndex]>=maxx)
		{
			maxx=(*p).score[scoreIndex];
		}	
	}
	for(int i=0;i<end;i++) 
	{
		if(stu[i].score[scoreIndex]==maxx){
			mp[j++]=i;
		}
	}
		return j;
}
/*对所有学生的平均分按从低到高进行选择排序*/
void Sort_select(STU *p){

	for(int i=0;i<end-1;i++){
		int k=i;
		for(int j=i+1;j<end;j++){
	if((*(p+k)).aver>(*(p+j)).aver){
				STU s=(*(p+k));
				(*(p+k))=(*(p+j));
				(*(p+j))=s;
			}
		}
	}
	printf("所有学生的平均成绩从低到高选择排序后的结果:\n");
	for(int i=0;i<end;i++){
		printf("%s\t%.2lf\t\n",stu[i].name,stu[i].aver);
	}
	
} 
/*对所有学生的平均分按从高到低进行选择排序*/
void Sort_select_reverse(STU *p){

	for(int i=0;i<end-1;i++){
		int k=i;
		for(int j=i+1;j<end;j++){
			if((*(p+k)).aver<(*(p+j)).aver){
				STU s=(*(p+k));
				(*(p+k))=(*(p+j));
				(*(p+j))=s;
			}
		}
	}
	printf("所有学生的平均成绩从高到低选择排序后的结果:\n");
	for(int i=0;i<end;i++){
		printf("%s\t%.2lf\t\n",stu[i].name,stu[i].aver);
	}
	
} 
/*对某个班级学生成绩由高到低进行冒泡排序*/ 
void Sort_buble(STU *p, int n){
	  printf("%d班里总成绩通过冒泡排序由高到低的学生成绩为:\n",n);
	  printf("**********************************************************************************************************\n");
	  printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *   平均分   *   总分\n");
      STU stu_class_ave[N+10];
	  for(int i=0;i<end-1;i++){		
			for(int j=0;j<end-i-1;j++){
					if(stu[j].aver<stu[j+1].aver){
						STU s=stu[j];
						stu[j]=stu[j+1];
						stu[j+1]=s;
					}
				}		
	}
	int count=0;
	for(int i=0;i<end;i++){
		if(stu[i].classNo==n)  stu_class_ave[count++]=stu[i];
	}
	for(int i=0;i<count;i++){
	 Output(&stu_class_ave[i]);
	}
	printf("**********************************************************************************************************\n");
}
/*对某个班级学生成绩由低到高进行冒泡排序*/ 
void Sort_buble_reverse(STU *p, int n){
	  printf("%d班里总成绩通过冒泡排序由低到高的学生成绩为:\n",n);
	  printf("**********************************************************************************************************\n");
	  printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *   平均分   *   总分\n");
      STU stu_class_ave[N+10];
	  for(int i=0;i<end-1;i++){		
			for(int j=0;j<end-i-1;j++){
					if(stu[j].aver>stu[j+1].aver){
						STU s=stu[j];
						stu[j]=stu[j+1];
						stu[j+1]=s;
					}
				}		
	}
	int count=0;
	for(int i=0;i<end;i++){
		if(stu[i].classNo==n)  stu_class_ave[count++]=stu[i];
	}
	for(int i=0;i<count;i++){
	 Output(&stu_class_ave[i]);
	}
	printf("**********************************************************************************************************\n");
}
/*对某个专业成绩通过插入排序从低到高*/
void Sort_insert(STU *p, int n, char *major){
	printf("插入排序后%s专业的该课程成绩由低到高为:\n",major);
    printf("**********************************************************************************************************\n");
    printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *   平均分   *   总分\n");
	STU stu_class_subject [N+10];
	STU cmp;
    int temp,j;   
	for(int i=1;i<end;i++){
			cmp=stu[i];
			temp=stu[i].score[n];
			for(j=i-1;stu[j].score[n]>temp,j>=0;j--){
				stu[j+1]=stu[j];
			}
			stu[j+1]=cmp;
		}
    int count=0;
	for(int i=0;i<end;i++,p++){
	if(!strcmp((*p).major,major))	stu_class_subject[count++]=*p;	
	}

	
	for(int i=0;i<count;i++,p++){
		Output(&stu_class_subject[i]);
	}
	printf("**********************************************************************************************************\n");
}
/*对某个专业成绩通过插入排序从高到低*/
void Sort_insert_reverse(STU *p, int n, char *major){
	printf("插入排序后%s专业的该课程成绩由高到低为:\n",major);
    printf("**********************************************************************************************************\n");
    printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *   平均分   *   总分\n");
	STU stu_class_subject [N+10];
	STU cmp;
    int temp,j;   
	for(int i=1;i<end;i++){
			cmp=stu[i];
			temp=stu[i].score[n];
			for(j=i-1;stu[j].score[n]<temp,j>=0;j--){
				stu[j+1]=stu[j];
			}
			stu[j+1]=cmp;
		}

    int count=0;
	for(int i=0;i<end;i++,p++){
	if(!strcmp((*p).major,major))	stu_class_subject[count++]=*p;	
	}

	
	for(int i=0;i<count;i++,p++){
		Output(&stu_class_subject[i]);
	}
	printf("**********************************************************************************************************\n");
}
/*添加学生的信息*/
void Add(STU *p,int n) {
	STU *pp=p;            //将曾删过的学生总分与平均分归零 
	for(int i=0;i<n;i++,pp++)
	{
	(*pp).sum=0;
	(*pp).aver=0; 
	}
	for(int i=0;i<n;i++,p++){ 
	printf("请输入学生的学号、姓名、专业、班级:\n");
	scanf("%s%s%s%d",(*p).num,(*p).name,(*p).major,&((*p).classNo));
    printf("请输入该学生的三门成绩,语文、数学、英语:\n");
    for(int j=0;j<=2;j++){
    	scanf("%d",&((*p).score[j]));
    	(*p).sum+=(*p).score[j];
	}
	(*p).aver=(*p).sum*(1.0)/3;
    }
    end+=n;
	printf("学生信息添加成功!!!\n\n");
} 
void Revise(STU *p){
	printf("\n\n请输入需要修改的学生学号:\n");
	char numm[20];
	int flag;
	bool pd;
	scanf("%s",numm);
	for(int i=0;i<end;i++,p++){
		if(!strcmp((*p).num,numm)){
			pd=true;
			flag=i;
		    printf("*     学号    *   姓名  *   专业\t *   班级   *   语文   *   数学   *   英语   *\n");
			printf("*   %s   *   %s   *   %s\t *      %d   *   %d     *    %d   *   %d    *\n",(*p).num,(*p).name,(*p).major,(*p).classNo,(*p).score[0],(*p).score[1],(*p).score[2]);
			break;
		}
		else{
			pd=false;
		}
	}
	    if(pd){
	    printf("\n请输入需要修改的信息\n");
	    printf("\t1.修改名字\t2.修改专业\t3.修改班级\t4.修改语文\t5.修改数学\t6.修改英语\n\n");
		int m;
		scanf("%d",&m);	
		switch(m){
			case 1:
				char newname[15];
				printf("请输入新名字:\n");
				scanf("%s",newname);
				strcpy(stu[flag].name,newname);
				break;
			case 2:
				char newmajor[20];
				printf("请输入新专业:\n");
				scanf("%s",newmajor);
				strcpy(stu[flag].major,newmajor);
				break;
			case 3:
				int newclass;
				printf("请输入新班级:\n");
				scanf("%d",&newclass);
				stu[flag].classNo=newclass;
				break;
			case 4:
				int grade1;
				printf("请输入新的语文成绩:\n");
				scanf("%d",&grade1);
				stu[flag].score[0]=grade1;
				break;
			case 5:
				int grade2;
				printf("请输入新的数学成绩:\n");
				scanf("%d",&grade2);
				stu[flag].score[1]=grade2;
				break;
			case 6:
				int grade3;
				printf("请输入新的英语成绩:\n");
				scanf("%d",&grade3);
				stu[flag].score[2]=grade3;
				break;
		    
		}
		printf("\n\n该学生信息修改成功!!!"); 
	}
	else{
		printf("该学生不存在!\n");
	}
	
	
}
void Delete(STU *p,int n){
	printf("请输入需要删除信息的%d个学生学号:\n",n);
	int bp=0;
	char str[20][20]; 
	for(int i=1;i<=n;i++){
		scanf("%s",str[i]);
	}
	for(int i=1;i<=n;i++){         //遍历每一个需要删除信息的学生学号 
		int flag=0; 
		for(int j=0;j<end;j++){	
			if(!strcmp(stu[j].num,str[i])){
				flag=1;
				bp=1;
				for(int k=j;k<end-1;k++){
					stu[k]=stu[k+1];
				}
				end-=1;
				break;
			}
		}
		if(!flag)  printf("学号为%s的学生信息因为不存在而无法删除!\n",str[i]);
	}
	if(bp) printf("学生信息删除成功!!!\n\n\n");
}	
void Save(STU *p,int n){
	FILE *fp;
	if((fp=fopen("studentInit.dat","wb"))==NULL){     //打开文件  wb是写入二进制文件 给他一个权限 
		printf("cannot open file\n");
		exit(0);
	}
	for(int i=0;i<n;i++){
	    if((fwrite(&stu[i],sizeof(STU),1,fp))!=1){
	    	printf("file write error\n");
		}
	}
	fclose(fp);
	printf("所有学生信息已经成功保存到文件里面!!!\n\n");
}
/*
2220934 xjy computer 2 90 100 56
2220935 zyy teacher 1 100 87 80
2220877 xdd nurse 2 69 45 89
2229823 fhb driver 2 86 90 98
2226754 kbs pilot 3 76 84 92
2229023 lkd nurse  3 76 86 73
2225733 kpf driver 1 78 69 55
2229042 gyh nurse 3 78 67 88
2220933 xyg teacher 1 100 99 97
2227543 dls computer 2 89 87 90
*/     

五、实验总结与分析(所设计系统的特色之处,实验过程中遇到的具体问题及解决方法)

1.特色:该程序在原有的十大函数九大功能基础上增添了八大函数四大新功能。分别是通过函数void Read();void Revise(STU *p);void Delete(STU *p,int n);void Add(STU *p,int n)实现了从文件中读取信息到结构体中,修改学生信息,删除学生信息,添加学生信息四大新功能。

对于新功能一:可以随时读取文件中的二进制信息到结构体中,利于用户保存或者修改信息到文件里以后的读档;
对于新功能二:利用学生学号的唯一性匹配学生学号,从而可以选择对学生的姓名、专业、班级、三门成绩进行修改。
对于新功能三:利用学生学号的唯一性匹配学生学号,从而在结构体在删除该学生信息,当然也可以一次性删除多个学生信息,利用的方法是覆盖法,即将要删除的学生后面的学生信息赋值给前面的学生从而将其覆盖掉。
对于新功能四:可以一次性添加多个学生信息到结构体中,增加了学生管理系统的合理性和灵活性。
当然,还扩展了排序的这个必须功能,可以使学生信息按照学号、姓名、专业的字典序或者班级、成绩的大小分别选择进行升序排序还是降序排序。

2.问题与解决方法

问题一:在文件里输入学生信息以后,每次调用函数对学生信息进行修改、查询、删除和增添时都需要先从文件里读取所有的二进制信息到结构体中,才能借助结构体来对学生的信息进行更改。
解决方法:定义了Read()函数,随时随地可以将文件里的学生信息读取到结构体中,从而只需要在文件里的信息有变更时读取一次就好。
问题二:用Fetch()函数从文件中随机读取某个学生信息时,因为文件里的信息是二进制数据,要想查询某个学生信息时需要找到它的结构体指针在文件里的位置。
解决方法:通过fseek()函数从文件的开头开始读取,跳到你需要查询的学生信息的数据,通过fread()读取这块信息到结构体中。
问题三:用函数Max()查询某课程最高分的学生序号时,由于返回值类型是int型,如果某课程最高分的学生有多个时,只能返回一个学生序号。
解决方法:定义一个int型变量j,用来记录第一个课程最高分的学生序号,并且将j作为该函数的返回值。若有其他学生也是该课程最高分,则直接在Max()函数里通过Output()函数输出该学生序号。
问题四:调用Save()函数保存结构体信息到文件里时,由于fwrite()写入信息会覆盖之前写入的信息,而不是添加,导致文件里的信息在每次调用函数Save()后都是崭新的,而不是在原来的文件上保存。
解决方法:为了解决这个方法,我选择了一个比较笨重的方法,就是每次调用Save()函数时,都将结构体里的所有学生信息重新写到文件里,而不是只将更改过的或者增减过的学生信息写到文件里。
问题五:调用Detele()函数删除学生信息时,如果删除了某个学生的信息,不知道如何将他的信息从结构体内存里清除,因为结构体不能像字符一样赋值为’\0’,也不能像指针一样赋值为NULL.
解决方法:从要删除信息的学生序号后一个开始,一直到结构体的最后一个学生,将他们的信息依次赋值给前一个学生,从而覆盖掉要删除的学生信息,使其信息在结构体里被删除。

  • 27
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
1.基于数组的“学生信息管理系统” 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。N定义为符号常量,定义N名学生信息的结构体数组。 实验要求: main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 功能: (1)定义函数Input:功能是可以从键盘输入任意个学生信息。 (2)定义函数Save:将输入的学生信息全部或者选择性的存入指定文件(如:输入5个学生信息,选择其中前3或者2个存入文件,或者全部存入文件)。 (3)定义函数Output:将某个学生信息格式化输出(学生信息从文件中读取,并且提供可选择的学号)。 (4)定义函数Fetch:从文件中随机读取某个学生的信息。 (5)定义函数Del:删除指定学号学生信息,并保存到原文件中。 (6)定义函数:实现输出所有学生信息的功能(包括学生的平均分和总分)。 (7)定义函数Max:求所有学生某门课程的最高分,并将此学生的分数以及学生姓名输出(注意:当有多名相同最高分数时,可将所有学生姓名输出)。 (8)定义函数Sort_select:对某个专业的学生,按总平均成绩由低到高进行简单选择排序。 (9)定义函数Sort_buble:对某个专业中某个班级的学生,按总平均成绩由高到低进行起泡排序。 (10)定义函数Sort_insert:对某个专业中某个班级的学生,按某门课程成绩由低到高进行直接插入排序。 (11)定义函数Search:实现某专业中某班级的成绩综合查找(如智能专业1班,总分240分以上同学)。 (12) 定义函数printmenu: 打印菜单 退出 2.基于链表的“学生信息管理系统” 实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。 实验要求: (1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 (2)定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。 (3)定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。 (4)定义函数Save:将某个学生信息存入文件。 (5)定义函数Fetch:从文件中随机读取某个学生的信息。 (6)定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。 (7)定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。 (8)定义函数Delete_num:从链表中删除指定学号的学生。 (9)定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。 (10)定义函数Delete_ major _subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
基于结构体数组学生信息管理系统主要利用结构体和数组的特性来实现对学生信息的管理。这个系统可以实现学生信息的录入、查询、删除、修改等功能。 首先,我们需要定义一个结构体来表示学生的信息。在这个例子中,结构体包含了学生的姓名、年龄、地址和联系电话等信息。 接下来,我们可以使用一个结构体数组来存储多个学生的信息。通过这个结构体数组,我们可以方便地对学生信息进行增删改查等操作。 系统的初始化函数可以用来初始化学生信息表,可以将结构体数组中的元素个数设置为0。这样,开始时学生信息表中就没有存储任何学生的信息。 添加函数可以用来向学生信息表中添加新的学生信息。通过接受用户输入的学生信息,将其添加到结构体数组中,并更新学生信息表中的元素个数。 查询函数可以通过输入学生姓名来查找学生信息表中是否存在该学生信息。通过遍历结构体数组,逐一比较学生姓名,可以判断是否存在该学生信息。 删除函数可以通过输入学生姓名来删除学生信息表中对应的学生信息。通过查找函数确定该学生信息的位置,然后将其删除,并更新学生信息表中的元素个数。 排序函数可以对学生信息表中的学生信息按照一定的规则进行排序,比如按照学生姓名的字母顺序进行排序。 修改函数可以通过输入学生姓名来修改学生信息表中对应的学生信息。通过查找函数确定该学生信息的位置,然后对其进行修改。 清空函数可以将学生信息表中的所有学生信息都清空,即将结构体数组中的元素个数设置为0。 综上所述,基于结构体数组学生信息管理系统可以实现学生信息的录入、查询、删除、修改、排序和清空等功能。这个系统可以较为方便地管理学生的信息,适用于小规模的学生信息管理需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&が&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值