C语言程序设计实训1:基于数组的学生信息管理系统

  • Post author:
  • Post category:其他




大胆相信我,我这科拿了满分嗷~



目录


1.实验内容


2.实验要求


3.功能结构图和算法流程图


4.程序清单


5.程序运行截图


1.实验内容

编写并调试程序,实现学校各专业班级学生信息的管理。10个学生的信息存储在文件


studentInit.dat


中。在


头文件student.h


中定义学生信息的结构体类型,包括:学号、姓名、专业、班级、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;

2.实验要求

  1. main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。

    STU student[N]; //保存输入的N名学生信息

    1.从文件中读入n个学生信息

    2.从文件中任意读取一个(0<=n<=%d)学生的信息

    3.输入班级与成绩要求进行查找

    4.所有学生中某门课程的最高分的学生

    5.所有学生按平均成绩由低到高进行简单选择排序

    6.对某个班级的学生按平均成绩由高到低进行起泡排序

    7.对某个专业的学生按某门课程成绩由低到高进行直接插入排序

    8.存储更新后的学生信息

  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);  对某个班级的学生,按平均成绩由高到低进行起泡排序。

    定义局部变量:

    STU stu_class_ave[N]; //按平均成绩排序后的某个班级的学生信息;

    int count; //实际元素个数

  9. 定义函数void Sort_insert(STU *p, int n, char *major):对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。

    定义局部变量:

    STU stu_class_ subject [N]; //按某门课程成绩排序后的某个专业的学生信息;

    int count; //实际元素个数

  10. 定义函数void Save(STU *p,int n) :将学生信息存入文件。

3.功能结构图和算法流程图

系统功能结构图

函数Sort_select的算法流程图

4.程序清单

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"

STU stu[10],store[10];//定义全局变量
 
//声明函数
void Input(STU *p);//从文件student.dat中输入n个学生信息
void Output(STU *p);//将p所指的某个学生信息表格式化屏幕输出
void SaveStudent(STU *p,int n);//向文件中保存信息 
void LoadStudent(STU *p,int n); //向文件中读取信息 
void Read(STU *p);//从文件中读取n个学生信息并保存 
void Fetch(STU *p);//从文件中读取第n个学生的信息
void Search(STU *p);//输入班级与成绩要求进行查找 
int Max(STU *p);//返回所有学生中第scoreIndex科分数最高的学生序号 
void Sort_select(STU *p);//对所有学生按平均成绩由低到高进行简单选择排序
void Sort_buble(STU *p);//对某个班级学生,按平均成绩由高到低起泡排序
void Sort_insert(STU *p);//对某个专业的学生按某门课程由低到高进行直接插入排序
void Store();//存储更新后的学生信息

int main(){
	int n;
	//进行功能选项
	printf("\n请输入功能编号,运行相应功能\n");
	printf("1.从文件中读入n(0<n<10)个学生信息\n");
	printf("2.从文件中随机读取第n个(0<=n<=9)学生的信息\n");
	printf("3.输入班级与成绩要求进行查找\n");
	printf("4.所有学生某门课程的最高分和分数最高的学生信息\n");
	printf("5.所有学生按平均成绩由低到高进行简单选择排序\n");
	printf("6.对某个班级的学生按平均成绩由高到低进行起泡排序\n");
	printf("7.对某个专业的学生按某门课程由低到高进行直接插入排序\n");
	printf("8.存储更新后的学生信息\n");
	printf("其他.退出\n\n");
	while(scanf("%d",&n)!=EOF){

		if(n<1||n>8)
			break;
		switch(n){
			case 1:
				Read(stu);
				break;
			case 2:
				Fetch(stu);
				break;
			case 3:
				Search(stu);
				break;
			case 4:
				Output(stu+Max(stu)-101);
				break;
			case 5:
				Sort_select(stu);
				break;
			case 6:
				Sort_buble(stu);
				break;
			case 7:
				Sort_insert(stu);
				break;
			case 8:
				Store();
				break;
		}
		printf("\n\n请输入功能编号,运行相应功能\n");
		printf("1.从文件中读入n(0<n<10)个学生信息\n");
		printf("2.从文件中随机读取第n个(0<=n<=9)学生的信息\n");
		printf("3.输入班级与成绩要求进行查找\n");
		printf("4.所有学生某门课程的最高分和分数最高的学生信息\n");
		printf("5.所有学生按平均成绩由低到高进行简单选择排序\n");
		printf("6.对某个班级的学生按平均成绩由高到低进行起泡排序\n");
		printf("7.对某个专业的学生按某门课程由低到高进行直接插入排序\n");
		printf("8.存储更新后的学生信息\n");
		printf("其他.退出\n\n");
	}
	return 0;
}

void Input(STU *p){//录入学生信息 
	printf("下面,请录入学生的信息\n"); 
	FILE *fp;char filename[10];
	printf("请输入文件名:"); 
	scanf("%s",&filename);
	printf("请输入10个学生的信息,并用空格隔开:\n");
	for(int i=0;i<10;i++){
		scanf("%s",stu[i].num);
		scanf("%s",stu[i].name);
		scanf("%s",stu[i].major);
		scanf("%d",&stu[i].classNo);
		for(int j=0;j<=2;j++){
			scanf("%d",&stu[i].score[j]);
		}
	}
	//写入文件
	if((fp=fopen(filename,"wb"))==NULL) {
		printf("Cannot open this file."); 
		exit(0);
	}
	fwrite(stu,sizeof(stu),10,fp);
	fclose(fp);
}

void Output(STU *p){//将p所指的某个学生信息表格式化屏幕输出
		printf("%s\t%8s\t%8s\t%d\t%d\t%d\t%d\t\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}

void LoadStudent(STU *p,int n){//向文件中读取信息 
	FILE *fp;
	char filename[20];
	printf("\n请输入打开文件名:\n");
	gets(filename);
	fp=fopen(filename,"rb");
	fread(p,sizeof(STU),n,fp);
	fclose(fp);
}

void Read(STU *p){//从文件中读取n个学生信息并保存 
	int m;
	printf("请输入读入学生信息个数:\n");
	scanf("%d",&m);
	getchar();
	LoadStudent(p,m);
	printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
	for(int i=0;i<m;i++)
		Output(p+i);
}

void Fetch(STU *p){//从文件中读取第n个学生的信息
	int n;
	printf("请输入需要查找第几个学生的信息:\n");
	scanf("%d",&n);
	getchar();
	LoadStudent(p,n);
	printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
	Output(p+n-1);
	store[0]=p[n-1];
}

void Search(STU *p){//输入班级与成绩要求进行查找 
	int i,j,q=0;
	char k;
	printf("请输入要查询的班级:");
	scanf("%d",&i);getchar();
	if(i>3){
		printf("查询错误,无此班级,请重新输入\n");
	}
	else{
		printf("请输入条件(>或<)和成绩,用空格隔开:");
		scanf("%c",&k);
		scanf("%d",&j);
		if(k=='<')
		{
			printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
			for(int m=0;m<10;m++)
				if(p[m].score[0]+p[m].score[1]+p[m].score[2]<j&&p[m].classNo==i){//寻找并输出符合要求的学生信息 
					Output(p+m);
					store[m]=p[m];
					q++;	
				}		
		}
		if(k=='>')
		{
			printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
			for(int m=0;m<10;m++)
				if(p[m].score[0]+p[m].score[1]+p[m].score[2]>j&&p[m].classNo==i){//寻找并输出符合要求的学生信息 
					Output(p+m);
					store[m]=p[m];
					q++;	
				}
		}
		if(q==0){
			printf("查无此人,请重新输入\n"); 
		}
	}
	q=0; 
} 

int Max(STU*p){//返回所有学生中第scoreIndex科分数最高的学生序号 
	int scoreIndex;
	printf("请输入查询科目:");
	scanf("%d",&scoreIndex);
	char n[10];
	int m=p[0].score[scoreIndex-1];
	strcpy(n,p[0].num);
	for(int i=1;i<10;i++){//寻找并记录符合要求的学生序号 
		if(p[i].score[scoreIndex-1]>m){		
			m=p[i].score[scoreIndex-1];
			strcpy(n,p[i].num);
		}
	}
	m=(n[0]-'0')*100+(n[1]-'0')*10+(n[2]-'0');
	printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
	store[0]=p[m-101];
	return m;
}

void Sort_select(STU *p){//对所有学生按平均成绩由低到高进行简单选择排序
	int m=0,sum[10];
	int i=0,d[10];
	for(i=0;i<10;i++){
		sum[i]=p[i].score[0]+p[i].score[1]+p[i].score[2];
	}//计算各学生总分
	for(i=0;i<10;i++){
		m=0;
		for(int j=0;j<10;j++){
			if(sum[j]<sum[m]){
				m=j;
			}
		}
		d[i]=m;
		sum[m]=1000;
	}//选择法排序
	printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
	for(i=0;i<10;i++){
		Output(&p[d[i]]);
		store[i]=p[d[i]];
	}
}

void Sort_buble(STU *p){//对某个班级学生,按平均成绩由高到低起泡排序
	int banji;
	printf("输入查询班级:");
	scanf("%d",&banji);
	if(banji<1||banji>3) printf("查无此班,请重新输入");
	else{
		char asort[10][10];
		int m=0,temp=0,k=0,sum[10],afsort[10];
		int i=0,numeber;
		int sco[10];
		for(i=0;i<10;i++){
			sum[i]=p[i].score[0]+p[i].score[1]+p[i].score[2];
		}//计算各学生总分
		for(i=0;i<10;i++){
			if(banji==p[i].classNo){
				sco[k]=sum[i];
				afsort[k]=i;
				k++;
			}
		}//将所需班级学生挑出
		for(i=0;i<k;i++){
			for(int j=0;j<k-1;j++){
				if(sco[j]<sco[j+1]){
					temp=sco[j];
					sco[j]=sco[j+1];
					sco[j+1]=temp;
					
					temp=afsort[j];
					afsort[j]=afsort[j+1];
					afsort[j+1]=temp;
				}
			}
		}//起泡法排序
		printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
		for(i=0;i<k;i++){
			Output(&p[afsort[i]]);
			store[i]=p[afsort[i]];
		}
	}
}

void Sort_insert(STU *p){//对某个专业的学生按某门课程由低到高进行直接插入排序
	char maj[10];
	int sub;
	int i,j,k,cont=0;
	STU afsort[10],t;
	printf("请输入需查询专业:\n");
	scanf("%s",maj);
	if(!strcmp(maj,"network")||!strcmp(maj,"computer")||!strcmp(maj,"software")){
		printf("请输入需查询成绩的科目:\n");
		scanf("%d",&sub);
		if(sub<4&&sub>0){
			for(i=0;i<10;i++){
				if(!strcmp(maj,p[i].major)){//寻找并记录符合条件的学生信息 
					afsort[cont]=p[i];
					cont++; 
				}
			}
			for(j=1;j<cont;j++){//插入法排序 
				t=afsort[j];
				for(i=0;i<j;i++){
					if(afsort[i].score[sub-1]>t.score[sub-1]) break;
				}
				for(k=j;k>i;k--)
					afsort[k]=afsort[k-1];
				afsort[i]=t;
			}
			printf("\n学号\t  姓名\t\t专业    \t班级   成绩1   成绩2   成绩3   \t\n");
			for(i=0;i<cont;i++){
				Output(afsort+i);
				store[i]=afsort[i];
			}
		}
		else printf("无此科目,请重新输入\n"); 
	}
	else printf("无此专业,请重新输入\n"); 
}

void Store(){//存储更新后的学生信息
	FILE *fp;
	char filename[15];
	printf("请输入要储存的文件名\n");
	getchar();
	gets(filename);
	if((fp=fopen(filename,"w"))==NULL)
	{
		printf("Wrong.\n");
		exit(0);
	}
	fwrite(store,sizeof(store),10,fp);
	fclose(fp);	
} 

5.程序运行截图

Input、Search、Max、Sort_buble、Sort_insert函数的调用及执行结果的界面截图




版权声明:本文为qq_53216148原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。