一、項目簡介
學生信息管理系統是一個基於C語言實現的小型控制台應用程序。通過該程序,管理員可以添加、刪除、修改、查詢學生信息,還可以對學生成績數據進行統計分析。
二、代碼剖析
1. 主體函數:main()
int main() {
int choice;
while (1) {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
add();
break;
case 2:
del();
break;
case 3:
update();
break;
case 4:
search();
break;
case 5:
stat();
break;
case 0:
exit(0);
break;
default:
printf("\n請輸入正確的選項!\n");
}
putchar('\n');
}
return 0;
}
主要是提供一個互動式界面,提供菜單選項供管理員進行學生信息管理操作,每次操作後可以繼續進行下次操作。
2. 菜單函數:menu()
void menu() {
printf("**************************************\n");
printf("********** 1. 新增學生信息 ***********\n");
printf("********** 2. 刪除學生信息 ***********\n");
printf("********** 3. 修改學生信息 ***********\n");
printf("********** 4. 查詢學生信息 ***********\n");
printf("********** 5. 統計分析 **************\n");
printf("********** 0. 退出管理系統 ***********\n");
printf("**************************************\n");
printf("請輸入您的選項(0 ~ 5):");
}
顯示一個簡單的菜單界面,供管理員選擇學生信息管理操作。
3. 新增函數:add()
void add() {
int num;
char name[10];
float score1, score2, score3;
struct student *p, *tail;
FILE *fp = fopen("stu.dat", "a+");
printf("\n請輸入學生學號:");
scanf("%d", &num);
while (1) {
p = head;
while (p != NULL) {
if (p -> num == num) {
printf("\n該學號已存在,請重新輸入學號:");
scanf("%d", &num);
break;
} else {
p = p -> next;
}
}
if (p == NULL) {
break;
}
}
printf("請輸入學生姓名:");
scanf("%s", name);
printf("請輸入學生三門課程的成績:\n");
printf("高數:");
scanf("%f", &score1);
printf("英語:");
scanf("%f", &score2);
printf("C語言編程:");
scanf("%f", &score3);
p = (struct student *) malloc(sizeof(struct student));
p -> num = num;
strcpy(p -> name, name);
p -> score[0] = score1;
p -> score[1] = score2;
p -> score[2] = score3;
p -> aver = (score1 + score2 + score3) / 3.0;
p -> next = NULL;
if (head == NULL) {
head = p;
} else {
tail = head;
while (tail -> next != NULL) {
tail = tail -> next;
}
tail -> next = p;
}
fwrite(p, sizeof(struct student), 1, fp);
fclose(fp);
printf("\n學生[%d|%s]添加成功!\n", p -> num, p -> name);
}
管理員輸入學生基本信息和成績信息,系統自動生成平均分。將學生信息以二進位形式寫入文件中,同時將學生信息添加到鏈表中。
4. 刪除函數:del()
void del() {
int num;
struct student *p, *prev;
FILE *fp1 = fopen("stu.dat", "r");
FILE *fp2 = fopen("tmp.dat", "w");
printf("\n請輸入要刪除的學生學號:");
scanf("%d", &num);
p = head;
prev = NULL;
while (p != NULL) {
if (p -> num == num) {
if (p == head) {
head = p -> next;
} else {
prev -> next = p -> next;
}
printf("\n學生[%d|%s]刪除成功!\n", p -> num, p -> name);
free(p);
writeToFile(fp1, fp2);
fclose(fp1);
fclose(fp2);
remove("stu.dat");
rename("tmp.dat", "stu.dat");
return;
} else {
prev = p;
p = p -> next;
}
}
printf("\n沒有找到要刪除的學生!\n");
fclose(fp1);
fclose(fp2);
remove("tmp.dat");
}
管理員輸入要刪除的學生學號,程序在鏈表中查找學號,找到則刪除該學生在鏈表中的節點,並將鏈表中的數據覆蓋寫入到臨時文件中。最後將臨時文件覆蓋原始文件實現刪除。
5. 修改函數:update()
void update() {
int num;
struct student *p;
FILE *fp1 = fopen("stu.dat", "r");
FILE *fp2 = fopen("tmp.dat", "w");
printf("\n請輸入要修改的學生學號:");
scanf("%d", &num);
p = head;
while (p != NULL) {
if (p -> num == num) {
printf("請輸入新的姓名:");
scanf("%s", p -> name);
printf("請輸入新的高數成績:");
scanf("%f", &p -> score[0]);
printf("請輸入新的英語成績:");
scanf("%f", &p -> score[1]);
printf("請輸入新的C語言編程成績:");
scanf("%f", &p -> score[2]);
p -> aver = (p -> score[0] + p -> score[1] + p -> score[2]) / 3.0;
printf("\n學生[%d|%s]修改成功!\n", p -> num, p -> name);
writeToFile(fp1, fp2);
fclose(fp1);
fclose(fp2);
remove("stu.dat");
rename("tmp.dat", "stu.dat");
return;
} else {
p = p -> next;
}
}
printf("\n沒有找到要修改的學生!\n");
fclose(fp1);
fclose(fp2);
remove("tmp.dat");
}
管理員輸入要修改的學生學號,程序在鏈表中查找學號,找到後修改學生姓名和3個科目成績,更新該學生平均分,並將鏈表中的數據覆蓋寫入到臨時文件中。最後將臨時文件覆蓋原始文件實現更新。
6. 查詢函數:search()
void search() {
int num;
struct student *p;
FILE *fp = fopen("stu.dat", "r");
printf("\n請輸入要查詢的學生學號:");
scanf("%d", &num);
p = head;
while (p != NULL) {
if (p -> num == num) {
printf("\n學生[%d|%s]\n", p -> num, p -> name);
printf("高數成績:%.2f\n", p -> score[0]);
printf("英語成績:%.2f\n", p -> score[1]);
printf("C語言編程成績:%.2f\n", p -> score[2]);
printf("平均分:%.2f\n", p -> aver);
fclose(fp);
return;
} else {
p = p -> next;
}
}
printf("\n沒有找到要查詢的學生!\n");
fclose(fp);
}
管理員輸入要查詢學生的學號,程序在鏈表中查找學號,找到後輸出該學生的學號、姓名、3個科目成績和平均分。
7. 統計函數:stat()
void stat() {
int n = 0, sum1 = 0, sum2 = 0, sum3 = 0;
float aver1, aver2, aver3;
struct student *p = head;
FILE *fp = fopen("stu.dat", "r");
while (p != NULL) {
n++;
sum1 += p -> score[0];
sum2 += p -> score[1];
sum3 += p -> score[2];
p = p -> next;
}
aver1 = (float) sum1 / n;
aver2 = (float) sum2 / n;
aver3 = (float) sum3 / n;
printf("\n[統計信息]\n");
printf("共有%d名學生\n", n);
printf("高數平均分:%.2f\n", aver1);
printf("英語平均分:%.2f\n", aver2);
printf("C語言編程平均分:%.2f\n", aver3);
fclose(fp);
}
程序對所有學生的高數、英語、C語言編程成績進行統計計算,並輸出各科目平均分。
三、總結
學生信息管理系統是一個綜合性高強度的應用程序,管理員通過該程序可以在控制台進行學生信息管理的增刪改查和統計等操作,該項目以C語言為編程語言,可以在Windows、Linux、macOS等平台上運行。以上是對該項目的詳細剖析和代碼解釋。
原創文章,作者:ULIZA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333208.html
微信掃一掃
支付寶掃一掃