su程序运行
./a.out | 1.添加学员 2.删除学员 3.修改学员信息 |
|4.查询学员信息 5.学员成绩排序 6.退出 |
- 根据用户选择不同,走不同的处理逻辑
student.h
#ifndef __STUDENT_H__
#define __STUDENT_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 40 //班级能容纳的总人数
//每个学员的信息
typedef struct _Student{
int id;
char name[32];
int score;
}stu_t;
//整个班级的信息
typedef struct _Class{
stu_t person[N];
int count;//记录当前班级已有的人数
}class_t;
//函数声明
int create_class(class_t **);
void print_menu();
int insert_student(class_t *);
int print_student(class_t *);
int search_student(class_t *);
int modify_student(class_t *);
int delete_student(class_t *);
int sort_student(class_t *);
#endif
student.c
student.c
#include "student.h"
//创建班级结构体的函数
int create_class(class_t **p){
if(NULL == p){
printf("入参为NULL, 请检查\n");
return -1;
}
//*p = malloc(sizeof(*p));//错误的 这样写只有指针的大小
*p = (class_t *)malloc(sizeof(class_t));
if(NULL == *p){
printf("内存分配失败\n");
return -1;
}
//新分配的空间 清0
memset(*p, 0, sizeof(class_t));
return 0;
}
//打印操作菜单的函数
void print_menu(){
printf("---------------------------------------------\n");
printf("| 1.添加学员 2.删除学员 3.修改学员信息 |\n");
printf("| 4.查询学员信息 5.学员成绩排序 6.退出 |\n");
printf("---------------------------------------------\n");
printf("input your choose >> ");
}
//添加新学员的函数
int insert_student(class_t *my_class){
//先对指针做非空检查
printf("请输入新学员的 (学号 姓名 成绩):");
scanf("%d%s%d", &(my_class->person[my_class->count].id),\
my_class->person[my_class->count].name,\
&(my_class->person[my_class->count].score));
my_class->count++;
printf("新学员 %s 的信息添加成功\n", my_class->person[my_class->count - 1].name);
return 0;
}
//遍历学员信息的函数--不必要 只是为了我们看现象的
int print_student(class_t *my_class){
//先对指针做非空检查
int i = 0;
for(i = 0; i < my_class->count; i++){
printf("%-5d%-10s%-3d\n", my_class->person[i].id,\
my_class->person[i].name,\
my_class->person[i].score);
}
return 0;
}
//根据学号查询学员信息
int search_student(class_t *my_class){
//先对指针做非空检查
int input_id = 0;
printf("请输入要查询的学员的学号:");
scanf("%d", &input_id);
int i = 0;
for(i = 0; i < my_class->count; i++){
if(input_id == my_class->person[i].id){
printf("查找到该学员:%-5d%-10s%-3d\n", my_class->person[i].id,\
my_class->person[i].name,\
my_class->person[i].score);
break;
}
}
if(i == my_class->count){
printf("查无此人\n");
}
return 0;
}
//根据学号修改学员成绩
int modify_student(class_t *my_class){
//先对指针做非空检查
int input_id = 0;
printf("请输入要修改的学员的学号:");
scanf("%d", &input_id);
int i = 0;
for(i = 0; i < my_class->count; i++){
if(input_id == my_class->person[i].id){
printf("请输入学员新的成绩 : ");
scanf("%d", &(my_class->person[i].score));
printf("学员成绩修改成功\n");
break;
}
}
if(i == my_class->count){
printf("查无此人\n");
}
return 0;
}
//删除学员信息--根据学号
int delete_student(class_t *my_class){
//先对指针做非空检查
int delete_id = 0;
printf("请输入要删除的学员的学号 : ");
scanf("%d", &delete_id);
int i = 0;
int j = 0;
for(i = 0; i < my_class->count; i++){
if(my_class->person[i].id == delete_id){
//执行删除操作 将后面的元素依次往前移动一步
for(j = i+1; j < my_class->count; j++){
my_class->person[j-1] = my_class->person[j];
}
break;
}
}
if(i == my_class->count){
printf("查无此人\n");
}else{
my_class->count--;
printf("删除学员信息成功\n");
}
return 0;
}
//学员成绩排序 --降序
int sort_student(class_t *my_class){
//先对指针做非空检查
//使用冒泡排序 即可
int i = 0;
int j = 0;
stu_t temp;
for(i = 0; i < my_class->count-1; i++){
for(j = 0; j < my_class->count-1-i; j++){
if(my_class->person[j].score < my_class->person[j+1].score){
temp = my_class->person[j];
my_class->person[j] = my_class->person[j+1];
my_class->person[j+1] = temp;
}
}
}
printf("学员成绩降序排序完成\n");
return 0;
}
main.c
#include "student.h"
int main(int argc, const char *argv[])
{
class_t *my_class = NULL;
create_class(&my_class);
int choose = 0;
while(1){
print_student(my_class);
print_menu();
scanf("%d", &choose);
switch(choose){
case 1:
insert_student(my_class);
break;
case 2:
delete_student(my_class);
break;
case 3:
modify_student(my_class);
break;
case 4:
search_student(my_class);
break;
case 5:
sort_student(my_class);
break;
case 6:
break;
default:
printf("输入有误,请重新输入(1~6)\n");
break;
}
if(6 == choose){
break;
}
}
return 0;
}