学习笔记

作业
学生管理系统
//student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <myhead.h>
// 定义数据表最大容量
#define MAX 50
// 定义数据元素类型
typedef int datatype_ID; // 学号
typedef char datatype_Name; // 姓名
typedef double datatype_Score; // 成绩
// 定义数据表结构类型
typedef struct
{
struct
{
datatype_ID studentId[20]; // 学号
datatype_Name studentName[20]; // 班级
datatype_Score studentScore[20]; // 姓名
} student[MAX];
int len; // 顺序表长度
} StudentList, *StudentListPtr;
// 在堆区创建顺序表
StudentListPtr create_list();
// 菜单
void menu();
// 判断是否为空
int list_empty(StudentListPtr L);
// 判断是否为满
int list_full(StudentListPtr L);
// 输入
void input_student(StudentListPtr L);
// 输出
void show_student(StudentListPtr L);
// 增加
int add_student(StudentListPtr L, int pos,
int studentID, char studentName[], double studentScore);
// 删除
int delete_student(StudentListPtr L,char studentName[]);
// 修改
void modify_student(StudentListPtr L, char studentName[]);
// 按名字查找
int find_student_by_name(StudentListPtr L, char studentName[]);
// 排序
void sort_students(StudentListPtr L);
#endif
//student.c
#include <myhead.h>
#include "student.h"
// 菜单
void menu()
{
printf("\t\t==>1.录入学生成绩\n");
printf("\t\t==>2.查看学生成绩\n");
printf("\t\t==>3.按照位置增加学生成绩\n");
printf("\t\t==>4.删除学生成绩\n");
printf("\t\t==>5.修改学生成绩\n");
printf("\t\t==>6.按名字查找学生成绩\n");
printf("\t\t==>7.按升序排序学生成绩\n");
printf("\t\t==>0.退出程序\n");
};
// 在堆区创建顺序表 ???
StudentListPtr create_list()
{
StudentListPtr L = (StudentListPtr)malloc(sizeof(StudentList));
if (NULL == L)
{
printf("创建顺序表失败\n");
return NULL;
}
memset(L->student, 0, sizeof(L->student));
L->len = 0; // 顺序长度为0
printf("创建顺序表成功\n");
return L;
};
// 判断是否为空
int list_empty(StudentListPtr L)
{
return L->len == 0;
};
// 判断是否为满
int list_full(StudentListPtr L)
{
return L->len == MAX;
};
// 输入
void input_student(StudentListPtr L)
{
printf("请输入学生的人数:");
scanf("%d", &L->len);
printf("\n");
// 判断 len>0 len<max
if (L->len >= 0 && L->len <= MAX)
{
for (int i = 0; i < L->len; i++)
{
printf("请输入第%d个学生的学号:", i + 1);
scanf("%d", L->student[i].studentId);
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", L->student[i].studentName);
printf("请输入第%d个学生的成绩:", i + 1);
scanf("%lf", L->student[i].studentScore);
}
if (NULL != L || list_empty(L))
{
printf("\n");
printf("录入学生成功\n");
}
}
};
// 输出
void show_student(StudentListPtr L)
{
if (NULL != L || list_empty(L))
{
for (int i = 0; i < L->len; i++)
{
printf("学号:%d 姓名:%s 成绩:%lf\n",
L->student[i].studentId[0],
L->student[i].studentName,
L->student[i].studentScore[0]);
}
printf("\n");
}
else
printf("查看学生成绩失败\n");
};
// 增加
int add_student(StudentListPtr L, int pos,
int studentID, char studentName[], double studentScore)
{
if (NULL == L || list_full(L) || pos < 0 || pos > L->len)
{
printf("插入失败\n");
return 0;
}
for (int i = L->len; i > pos - 1; i--)
{
L->student[i + 1] = L->student[i];
}
L->student[pos - 1].studentId[0] = studentID; // 直接赋值给数组的第一个元素
strcpy(L->student[pos - 1].studentName, studentName); // 使用 strcpy 复制字符串
L->student[pos - 1].studentScore[0] = studentScore; // 直接赋值给数组的第一个元素
L->len++; // 增加顺序表的长度
return 1;
}
// 删除
int delete_student(StudentListPtr L, char studentName[])
{
int found = 0;
for (int i = 0; i < L->len; i++)
{
if (strcmp(L->student[i].studentName, studentName) == 0)
{
found = 1;
for (int j = i; j < L->len - 1; j++)
{
L->student[j] = L->student[j + 1];
}
L->len--;
break;
}
}
if (found)
{
printf("删除成功\n");
return 1;
}
else
{
printf("未找到该学生,删除失败\n");
return 0;
}
}
// 修改
void modify_student(StudentListPtr L, char studentName[])
{
int found = 0;
for (int i = 0; i < L->len; i++)
{
if (strcmp(L->student[i].studentName, studentName) == 0)
{
found = 1;
printf("请输入修改后的学号: ");
scanf("%d", &L->student[i].studentId[0]);
printf("请输入修改后的姓名: ");
scanf("%s", L->student[i].studentName);
printf("请输入修改后的成绩: ");
scanf("%lf", &L->student[i].studentScore[0]);
break;
}
}
if (found)
{
printf("修改成功\n");
}
else
{
printf("未找到该学生,修改失败\n");
}
}
// 按名字查找
int find_student_by_name(StudentListPtr L, char studentName[])
{
for (int i = 0; i < L->len; i++)
{
if (strcmp(L->student[i].studentName, studentName) == 0)
{
printf("学号: %d 姓名: %s 成绩: %lf\n",
L->student[i].studentId[0],
L->student[i].studentName,
L->student[i].studentScore[0]);
return 1;
}
}
printf("未找到该学生\n");
return 0;
}
// 排序(按成绩升序)
void sort_students(StudentListPtr L)
{
for (int i = 0; i < L->len - 1; i++)
{
for (int j = 0; j < L->len - i - 1; j++)
{
if (L->student[j].studentScore[0] > L->student[j + 1].studentScore[0])
{
// 交换学生信息
struct
{
datatype_ID studentId;
datatype_Name studentName[20];
datatype_Score studentScore;
} temp;
temp.studentId = L->student[j].studentId[0];
strcpy(temp.studentName, L->student[j].studentName);
temp.studentScore = L->student[j].studentScore[0];
L->student[j].studentId[0] = L->student[j + 1].studentId[0];
strcpy(L->student[j].studentName, L->student[j + 1].studentName);
L->student[j].studentScore[0] = L->student[j + 1].studentScore[0];
L->student[j + 1].studentId[0] = temp.studentId;
strcpy(L->student[j + 1].studentName, temp.studentName);
L->student[j + 1].studentScore[0] = temp.studentScore;
}
}
}
printf("排序成功\n");
}
//studentmain.c
#include <myhead.h>
#include "student.h"
int main(int argc, char const *argv[])
{
int key = 0;
int studentID, pos;
char studentName[MAX];
double studentScore;
StudentListPtr L = create_list();
if (NULL == L)
{
return -1;
}
while (1)
{
menu();
printf("\n");
printf("请输入你要进行的操作:");
scanf("%d", &key);
printf("\n");
switch (key)
{
case 1:
// 输入
input_student(L);
break;
case 2:
// 输出
show_student(L);
break;
case 3:
// 增加
{
printf("请输入插入位置: ");
scanf("%d", &pos);
printf("请输入学生学号: ");
scanf("%d", &studentID);
printf("请输入学生姓名: ");
scanf("%s", studentName);
printf("请输入学生成绩: ");
double studentScore;
scanf("%lf", &studentScore);
add_student(L, pos, studentID, studentName, studentScore);
}
break;
case 4:
// 删除
{
char studentName[20];
printf("请输入要删除的学生姓名: ");
scanf("%s", studentName);
delete_student(L, studentName);
}
break;
case 5:
// 修改
{
char studentName[20];
printf("请输入要修改的学生姓名: ");
scanf("%s", studentName);
modify_student(L, studentName);
}
break;
case 6:
// 按名字查找
{
char studentName[20];
printf("请输入要查找的学生姓名: ");
scanf("%s", studentName);
find_student_by_name(L, studentName);
}
break;
case 7:
// 排序
sort_students(L);
break;
case 0:
// 退出
break;
}
}
return 0;
}