27-结构体相关练习——招生系统
练习要求:
文章目录
一、实现
结构体的使用解析
在你的代码中,struct Student
结构体用于存储学生的信息,包括姓名、性别、年龄、技能和ID。以下是对代码中结构体使用的详细解析:
1. 定义结构体
struct Student {
char name[50];
char gender[50];
int age;
char skills[50];
int id;
};
这个定义创建了一个 Student
结构体类型,包含五个成员:
name
:字符数组,用于存储学生的名字,最大长度为50个字符。gender
:字符数组,用于存储学生的性别,最大长度为50个字符。age
:整数,用于存储学生的年龄。skills
:字符数组,用于存储学生的技能,最大长度为50个字符。id
:整数,用于存储学生的ID。
2. 添加学生信息函数
void addStudent(struct Student *students, int *count)
{
if (*count >= 100) {
printf("不能再添加新的学员信息了,再添加则会越界,你可以选择更改相关信息或者删除一些表中的学员信息!\n");
return;
}
struct Student newStudent;
printf("请你输入新的学员的名字:\n");
scanf("%s", newStudent.name);
printf("请你输入新的学员的性别:\n");
scanf("%s", newStudent.gender);
printf("请你输入新的学员的年龄:\n");
scanf("%d", &newStudent.age);
printf("请你输入新的学员想要学习的技能:\n");
scanf("%s", newStudent.skills);
printf("请你输入新的学员的ID: \n");
scanf("%d", &newStudent.id);
students[*count] = newStudent;
(*count)++;
}
该函数用于向学生数组中添加新的学生信息:
students
是指向Student
结构体数组的指针。count
是一个指向当前学生数目的指针。- 检查是否超出数组最大容量(100)。
- 使用
scanf
函数从用户输入中获取新学生的信息,并将其存储在一个临时Student
结构体中。 - 将新的
Student
结构体赋值给students
数组中的当前下标位置,然后递增count
。
3. 显示学生信息函数
void ShowStudent(struct Student *student, int count)
{
for (int i = 0; i < count; i++) {
printf("--------现在显示第%d个学员的信息--------------\n", i + 1);
printf("第%d个学员的姓名: %s\n", i + 1, student[i].name);
printf("第%d个学员的性别: %s\n", i + 1, student[i].gender);
printf("第%d个学员的年龄: %d\n", i + 1, student[i].age);
printf("第%d个学员的ID: %d\n", i + 1, student[i].id);
printf("第%d个学员想学习的技能: %s\n", i + 1, student[i].skills);
}
}
该函数用于显示所有学生的信息:
student
是指向Student
结构体数组的指针。count
是当前学生的数量。- 通过遍历
students
数组,逐个打印每个学生的信息。
4. 修改学生信息函数
void EditStudent(struct Student *students, int count)
{
printf("请输入你需要修改的学员的编号:");
int ID;
int i;
int found = 0;
scanf("%d", &ID);
for (i = 0; i < count; i++) {
if (students[i].id == ID) {
found = 1;
break;
}
}
if (found) {
struct Student newStudent = students[i];
while (1) {
printf("请输入需要修改的内容的编号\n");
printf("1. 修改编号为%d的学员的姓名\n", ID);
printf("2. 修改编号为%d的学员的性别\n", ID);
printf("3. 修改编号为%d的学员的年龄\n", ID);
printf("4. 修改编号为%d的学员想要学习的技能\n", ID);
printf("5. 修改编号为%d的学员的编号(ID)\n", ID);
printf("6. 退出并保存\n");
printf("7. 退出不保存\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
printf("修改该学员的姓名为: ");
scanf("%s", newStudent.name);
break;
case 2:
printf("修改该学员的性别为: ");
scanf("%s", newStudent.gender);
break;
case 3:
printf("修改该学员的年龄为: ");
scanf("%d", &newStudent.age);
break;
case 4:
printf("修改该学员想要学习的技能为: ");
scanf("%s", newStudent.skills);
break;
case 5:
printf("修改该学员的ID为: ");
scanf("%d", &newStudent.id);
break;
case 6:
students[i] = newStudent;
printf("学员信息已更新。\n");
return;
case 7:
printf("不保存修改,退出。\n");
return;
default:
printf("无效选择,请重新输入。\n");
break;
}
}
} else {
printf("未找到编号为%d的学员。\n", ID);
}
}
该函数用于修改指定ID学生的信息:
- 获取需要修改的学生ID并检查其是否存在。
- 如果存在,复制当前学生信息到一个临时
Student
结构体。 - 使用循环和
switch
语句,根据用户的选择修改相应的信息。 - 提供保存和不保存修改的选项。
5. 删除学生信息函数
void DeleteStudent(struct Student *students, int *count)
{
printf("请输入你想删除学员信息的编号(ID): ");
int ID;
int i;
int found = 0;
scanf("%d", &ID);
for (i = 0; i < *count; i++) {
if (students[i].id == ID) {
found = 1;
break;
}
}
if (found) {
for (int j = i; j < *count - 1; j++) {
students[j] = students[j + 1];
}
(*count)--;
printf("编号为%d的学员信息已删除。\n", ID);
} else {
printf("未找到编号为%d的学员。\n", ID);
}
}
该函数用于删除指定ID的学生信息:
- 获取需要删除的学生ID并检查其是否存在。
- 如果存在,通过移动数组中的元素来删除指定的学生。
- 减少学生计数。
其他注意事项
-
字符数组溢出:
scanf
函数在读取字符串时,如果输入长度超过数组长度会导致缓冲区溢出。为了防止这种情况,可以使用%49s
来限制输入长度。例如:scanf("%49s", newStudent.name);
。 -
控制台编码:确保你的控制台编码设置为UTF-8,尤其是在Windows上运行时,可以在命令提示符中使用
chcp 65001
设置控制台编码。 -
输入验证:在实际应用中,应该对用户输入进行验证,例如确保年龄和ID是有效的整数,性别和技能输入不超过最大长度等。
-
文件操作:如果需要保存学生信息,可以将学生数据存储到文件中,并在程序启动时读取文件数据。
-
内存管理:目前代码中使用了静态数组,如果需要处理大量学生信息,考虑使用动态分配内存。
二、完整代码实现
#include <stdio.h>
#include <string.h>
struct Student
{
char name[50];
char gender[50];
int age;
char skills[50];
int id;
};
//*******添加学员信息************************/
void addStudent(struct Student *students, int *count)
{
// 检查数组是否越界
if (*count >= 100)
{
printf("不能再添加新的学员信息了,再添加则会越界,你可以选择更改相关信息或者删除一些表中的学员信息!\n");
return;
}
struct Student newStudent; // 临时创建一个新的结构体
printf("请你输入新的学员的名字:\n");
scanf("%s", newStudent.name);
printf("请你输入新的学员的性别:\n");
scanf("%s", newStudent.gender);
printf("请你输入新的学员的年龄:\n");
scanf("%d", &newStudent.age);
printf("请你输入新的学员想要学习的技能:\n");
scanf("%s", newStudent.skills);
printf("请你输入新的学员的ID: \n");
scanf("%d", &newStudent.id);
students[*count] = newStudent; // 将临时的结构体中的数据给原来的结构体
(*count)++; // 结构体的下标位置++
}
/**
* @description: 显示学员信息函数
* @param {struct Student *} student
* @param {int} count
*/
void ShowStudent(struct Student *student, int count)
{
for (int i = 0; i < count; i++)
{
printf("--------现在显示第%d个学员的信息--------------\n", i + 1);
printf("第%d个学员的姓名: %s\n", i + 1, student[i].name);
printf("第%d个学员的性别: %s\n", i + 1, student[i].gender);
printf("第%d个学员的年龄: %d\n", i + 1, student[i].age);
printf("第%d个学员的ID: %d\n", i + 1, student[i].id);
printf("第%d个学员想学习的技能: %s\n", i + 1, student[i].skills);
}
}
/**
* @description: 修改学员信息函数
* @param {struct Student *} students
* @param {int} count
*/
void EditStudent(struct Student *students, int count)
{
printf("请输入你需要修改的学员的编号:");
int ID;
int i; // 记录下标
int found = 0; // 检查编号是否存在
scanf("%d", &ID); // 接收修改学员编号
// 检查是否存在该编号的学员
for (i = 0; i < count; i++)
{
if (students[i].id == ID)
{
found = 1; // 检查通过
break;
}
}
if (found)
{
struct Student newStudent = students[i]; // 复制当前学生信息
while (1)
{
printf("请输入需要修改的内容的编号\n");
printf("1. 修改编号为%d的学员的姓名\n", ID);
printf("2. 修改编号为%d的学员的性别\n", ID);
printf("3. 修改编号为%d的学员的年龄\n", ID);
printf("4. 修改编号为%d的学员想要学习的技能\n", ID);
printf("5. 修改编号为%d的学员的编号(ID)\n", ID);
printf("6. 退出并保存\n");
printf("7. 退出不保存\n");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("修改该学员的姓名为: ");
scanf("%s", newStudent.name);
break;
case 2:
printf("修改该学员的性别为: ");
scanf("%s", newStudent.gender);
break;
case 3:
printf("修改该学员的年龄为: ");
scanf("%d", &newStudent.age);
break;
case 4:
printf("修改该学员想要学习的技能为: ");
scanf("%s", newStudent.skills);
break;
case 5:
printf("修改该学员的ID为: ");
scanf("%d", &newStudent.id);
break;
case 6:
students[i] = newStudent; // 更新学生信息
printf("学员信息已更新。\n");
return;
case 7:
printf("不保存修改,退出。\n");
return;
default:
printf("无效选择,请重新输入。\n");
break;
}
}
}
else
{
printf("未找到编号为%d的学员。\n", ID);
}
}
/**
* @description: 根据编号删除学员信息
* @param {Student} *students
* @param {int} *count
*/
void DeleteStudent(struct Student *students, int *count)
{
printf("请输入你想删除学员信息的编号(ID): ");
int ID;
int i; // 记录下标
int found = 0; // 检查编号是否存在
scanf("%d", &ID);
// 检查是否存在该编号的学员
for (i = 0; i < *count; i++)
{
if (students[i].id == ID)
{
found = 1; // 检查通过
break;
}
}
if (found)
{
for (int j = i; j < *count - 1; j++)
{
students[j] = students[j + 1]; // 移动数组后面的内容
}
(*count)--; // 减少学生人数
printf("编号为%d的学员信息已删除。\n", ID);
}
else
{
printf("未找到编号为%d的学员。\n", ID);
}
}
int main()
{
struct Student students[100]; // 实例化
int count = 0; // 结构体数组中当前下标
short choice;
printf("=========欢迎来到马保国招生系统===========\n");
do
{
printf("请输入你想进行的操作的序号\n");
printf("1. 信息登记(添加学员)\n");
printf("2. 显示学员信息\n");
printf("3. 修改学员信息\n");
printf("4. 删除学员信息\n");
printf("5. 退出系统\n");
scanf("%hd", &choice);
switch (choice)
{
case 1: // 添加学员
addStudent(students, &count);
break;
case 2: // 显示学员信息
ShowStudent(students, count);
break;
case 3: // 修改学员信息
EditStudent(students, count);
break;
case 4: // 删除学员信息
DeleteStudent(students, &count);
break;
case 5: // 退出系统
printf("正在退出系统...\n");
return 0;
default:
printf("无效选择,请重新输入。\n");
break;
}
} while (1);
}