C语言基础之结构体小练习——学生成绩管理系统

定义一个学生的结构体:学号 姓名 三门功课成绩
输入10个学生信息 保存在动态内存中
1.按学号升序显示
2.按总成绩降序显示,如果总成绩一样,按照学号升序显示
3.输入一个学号,删除该学生
4.输入两个学生信息 添加到内存中(扩容)

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

#define N 3
typedef struct Stu{
    
    
	int no;//学号
	char name[40];//姓名
	int score[N];//成绩 语数外
}Stu;

//学生不应该从控制台输入 学号不能重复  学号自动生成
#define STUSIZE sizeof(Stu)
int makeno = 20200001;
Stu *pstu = NULL;//指向动态内存  申请内存用于保存学生信息
size_t capcity = 10;//动态内存单位大小
size_t size = 0;//记录当前使用了多少动态内存

void showMenu(){
    
    
	printf("*****学生信息管理系统*****\n");	
	printf(" 1. 增加学生 \n");
	printf(" 2. 删除学生 \n");
	printf(" 3. 列出学生 \n");
	printf(" 0. 退出 \n");
	printf(" operater: ");
}

void showStu(Stu s){
    
    
	printf("------------\n");
	printf("学号:%d\n",s.no);
	printf("姓名:%s\n",s.name);
	printf("成绩:");
	int i;
	for(i=0;i<N;i++){
    
    
		printf("%d ",s.score[i]);
	}
	printf("\n");
}
//功能实现
int addStuToMem(Stu s){
    
    
	if(pstu==NULL){
    
    //没有内存
		pstu = calloc(capcity,STUSIZE);
		if(pstu==NULL){
    
    
			//perror("calloc");
			//exit(-1);
			return -1;
		}
	}
	if(size>=capcity){
    
    //现有的动态内存用完了
		pstu = realloc(pstu,2*capcity*STUSIZE);
		capcity = 2*capcity;
		if(pstu==NULL){
    
    
			//perror("realloc");
			//exit(-1);
			return -2;
		}
	}
	pstu[size] = s;//把学生添加到动态内存中
	++size;
	return 0;
}
//用户交互
void addStu(){
    
    
	Stu s = {
    
    };
	s.no = makeno++;
	printf("请输入学生姓名:");
	scanf("%s",s.name);
	printf("请输入三门功课成绩:");
	int i;
	for(i=0;i<N;i++){
    
    
		scanf("%d",&s.score[i]);
	}
	showStu(s);
	int ret = addStuToMem(s);
	if(ret == 0){
    
    
		printf("  增加学生success!\n");	
	}else{
    
    
		perror("addStuToMem");
		exit(-1);
	}
}

int findStuByNo(int no){
    
    //如果有返回在动态内存中的下标位置 没有则返回-1
	int i;
	for(i=0;i<size;i++){
    
    
		if(pstu[i].no == no){
    
    
			return i;	
		}	
	}
	return -1;
}

void delStu(){
    
    
	if(size==0){
    
    
		printf("没有学生!\n");
		return;
	}
	printf("请输入要删除的学生学号:");
	int no = 0;
	scanf("%d",&no);
	int index = findStuByNo(no);
	if(index == -1){
    
    
		printf(" 查无此学生!\n");
		return;
	}
	showStu(pstu[index]);
	pstu[index] = pstu[size-1];
	--size;
	printf("该学生已删除!\n");
}


int compNoDesc(Stu s1,Stu s2){
    
    
	return s2.no - s1.no;	
}

int compNoAsc(Stu s1,Stu s2){
    
    
	return s1.no - s2.no;
}

int compScoreDesc(Stu s1,Stu s2){
    
    
	int sum1 = 0;
	int sum2 = 0;
	int i;
	for(i=0;i<N;i++){
    
    
		sum1+=s1.score[i];
		sum2+=s2.score[i];
	}
	if(sum2 != sum1){
    
    
		return sum2-sum1;
	}
	return s1.no - s2.no;
}

int compScoreAsc(Stu s1,Stu s2){
    
    
	return -compScoreDesc(s1,s2);
}

void sortStu(int (*comp)(Stu,Stu)){
    
    
	int i,j;
	for(i=1;i<size;i++){
    
    
		Stu s = pstu[i];
		for(j=i-1;j>=0&&comp(pstu[j],s)>0;--j){
    
    
			pstu[j+1] = pstu[j];
		}
		pstu[j+1] = s;
	}
}


void listAllStu(int (*comp)(Stu,Stu)){
    
    
	sortStu(comp);	
	int i,j;
	printf("------------------\n");
	printf("学生 姓名  语文  数学  外语\n");
	for(i=0;i<size;i++){
    
    
		printf("%d %10s ",pstu[i].no,pstu[i].name);	
		for(j=0;j<N;j++){
    
    
			printf("%3d ",pstu[i].score[j]);	
		}
		printf("\n");
	}
}


void listStu(){
    
    
	if(size==0){
    
    
		printf("没有学生!\n");
		return;
	}
	printf(" 1.按学号升序显示[默认] \n");
	printf(" 2.按学号降序显示 \n");
	printf(" 3.按成绩升序显示 \n");
	printf(" 4.按成绩降序显示 \n");	
	printf(" opt:");
	int opt = 0;
	scanf("%d",&opt);
	switch(opt){
    
    
		case 2:
			listAllStu(compNoDesc);break;
		case 3:
			listAllStu(compScoreAsc);break;
		case 4:
			listAllStu(compScoreDesc);break;
		default:
			listAllStu(compNoAsc);break;
	}
}

void run(){
    
    
	while(1){
    
    
		showMenu();
		int opt = 0;
		scanf("%d",&opt);
		switch(opt){
    
    
		case 1:
			addStu();break;
		case 2:
			delStu();break;
		case 3:
			listStu();break;
		case 0:
			printf("欢迎下次登录!\n");
			return;
		}
		
	}
}

void swapStu(Stu *ps1,Stu *ps2){
    
    
	Stu s = *ps1;
	*ps1 = *ps2;
	*ps2 = s;
}


int main(){
    
    
	run();
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/LUCAS004/article/details/107584410
今日推荐