定义一个学生的结构体:学号 姓名 三门功课成绩
输入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;
}