include <stdio.h>
include <string.h>
define MAXSIZE 100 // 最大存储100人
define _CRT_SECURE_NO_WARNINGS
struct Student {
char name[20]; // 姓名
int age; // 年龄
int score; // 分数
int num; // 序号
} stu[MAXSIZE];
static int I = 0; // 当前学生数量
void menu();
void input();
void ddelete();
void modify();
void find();
void findall();
int add();
int main() {
int choice1 = 0;
while (1) {
menu();
scanf_s("%d", &choice1);
switch (choice1) {
case 1:
input();
break;
case 2:
ddelete();
break;
case 3:
modify();
break;
case 4:
find();
break;
case 5:
if (!add()) {
printf("插入失败,请检查插入位置。\n");
}
break;
case 6:
findall();
break;
case 7:
printf("退出系统\n");
return 0;
default:
printf("不存在该选项\n");
}
}
return 0;
}
// 主菜单
void menu() {
printf("学生管理系统*\n");
printf(" 请选择:\n");
printf(" 1、输入学生信息\n");
printf(" 2、删除学生信息\n");
printf(" 3、修改学生信息\n");
printf(" 4、查看学生信息\n");
printf(" 5、插入学生信息\n");
printf(" 6、查看总体学生信息\n");
printf(" 7、退出系统\n");
printf(" *************************\n");
}
// 输入学生信息
void input() {
if (I < MAXSIZE) {
printf("输入学生姓名:\n");
scanf_s("%19s", stu[I].name, sizeof(stu[I].name)); // 使用 sizeof 计算数组大小
printf("输入序号:\n");scanf_s("%d", &stu[I].num);printf("输入年龄:\n");scanf_s("%d", &stu[I].age);printf("输入成绩:\n");scanf_s("%d", &stu[I].score);I++;
}
else {printf("已满,无法输入\n");
}
}
// 删除学生信息
void ddelete() {
printf("输入序号:\n");
int num1 = 0;
scanf_s("%d", &num1);
int flag = -1; // 初始化为-1以表示未找到
for (int j = 0; j < I; j++) {
if (stu[j].num == num1) {
flag = j;
break; // 找到后退出循环
}
}
if (flag != -1) { // 如果找到
for (int n = flag; n < I - 1; n++) {
stu[n] = stu[n + 1]; // 向前移动元素
}
--I; // 学生数量减一
// 更新序号for (int j = 0; j < I; j++) {stu[j].num = j + 1; // 假设序号从1开始,序号数比数组序数大1。}printf("删除成功\n");
}
else {printf("未找到该序号的学生\n");
}
}
// 修改学生信息
void modify() {
printf("输入序号:\n");
int num1 = 0;
scanf_s("%d", &num1);
for (int j = 0; j < I; j++) {
if (stu[j].num == num1) {
printf("选择要修改的信息:\n1、姓名\n2、序号\n3、年龄\n4、成绩\n");
int choice = 0;
scanf_s("%d", &choice);
switch (choice) {
case 1:
printf("输入修改后的姓名:\n");
scanf_s("%19s", stu[j].name, sizeof(stu[j].name)); // 使用 sizeof 计算数组大小
break;
case 2:
printf("输入修改后的序号:\n");
scanf_s("%d", &stu[j].num);
break;
case 3:
printf("输入修改后的年龄:\n");
scanf_s("%d", &stu[j].age);
break;
case 4:
printf("输入修改后的成绩:\n");
scanf_s("%d", &stu[j].score);
break;
default:
printf("不存在该操作,请重新选择\n");
}
return; // 找到并修改后直接返回
}
}
printf("未找到该序号的学生\n");
}
// 查看信息
void find() {
printf("输入序号:\n");
int num1 = 0;
scanf_s("%d", &num1);
for (int i = 0; i < I; i++) {
if (stu[i].num == num1) {
printf("学生姓名:%s\t 学生年龄:%d\t 学生序号:%d\t 学生成绩:%d\t\n", stu[i].name, stu[i].age, stu[i].num, stu[i].score);
return; // 找到后直接返回
}
}
printf("未找到该序号的学生\n");
}
//查看总体学生信息
void findall() {
for (int i = 0; i < I; i++) {
printf("学生姓名:%s\t 学生年龄:%d\t 学生序号:%d\t 学生成绩:%d\t\n", stu[i].name, stu[i].age, stu[i].num, stu[i].score);
}
}
// 插入学生信息
int add() {
printf("输入插入的位置 (1 到 %d):\n", I + 1); // 提示用户输入的范围
int N = 0;
scanf_s("%d", &N);
if (N > 0 && N <= I + 1 && I < MAXSIZE) { // 允许插入在I+1位置
for (int j = I; j >= N; j--) {
stu[j] = stu[j - 1]; // 向后移动元素
}
printf("输入学生姓名:\n");scanf_s("%19s", stu[N - 1].name, sizeof(stu[N - 1].name)); // 使用 sizeof 计算数组大小printf("输入序号(与插入位置相同):\n");scanf_s("%d", &stu[N - 1].num);printf("输入年龄:\n");scanf_s("%d", &stu[N - 1].age);printf("输入成绩:\n");scanf_s("%d", &stu[N - 1].score);I++;// 更新序号for (int j = N - 1; j < I; j++) { //N是插入是序号数,N-1是该插入数的数组序数stu[j].num = j + 1; // 序号从1开始}return 1; // 插入成功
}
return 0; // 插入失败
}
与以往不同的是这一次用c语言写系统类题目,与c++和java不同的是c语言没有类,所以将函数定义写在最前面。
在删除和插入功能中,要分清序号数分数组序数,数组序数要比序号数小1。
scanf_s("%19s", stu[N - 1].name, sizeof(stu[N - 1].name))中:
sizeof(stu[N - 1].name)是scanf_s的第三个参数,作用是 获取 stu[N - 1].name 的大小,以字节为单位。scanf_s 要求用户在读取字符串时提供目标缓冲区的大小,以增强安全性。scanf_s 的第三个参数是必须的,用于告诉函数可写入的最大字符数,以防止溢出。