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 的第三個引數是必須的,用於告訴函式可寫入的最大字元數,以防止溢位。