C語言結構體鏈表和指針實現學生管理系統
本文實例為大傢分享瞭C語言結構體鏈表和指針實現學生管理系統的具體代碼,供大傢參考,具體內容如下
一、需求分析
通過使用“學生管理系統”,可以更加有效地對學生實現管理,完成對學生基本信息以及成績信息的文件保存,具有信息的增加,刪除、查詢以及修改等功能,能提供簡單的數據統計、分析信息。
二、整體設計
學生管理系統 主要由兩大功能模塊組成,分別是是“學生檔案管理”和“學生成績管理“兩個子系統。整體模塊架構如下:
三、詳細設計
學生檔案管理子系統
- 用戶選擇
進入“學生檔案管理”子系統,顯示該子系統菜單,用戶分別可選擇:錄入數據、查詢數據、修改數據、刪除數據、增加數據、統計分析、退出系統等功能。
- 錄入數據
主要實現函數為 readin_record( ) ,能引導用戶輸入學生人數,依次錄入每個學生的學號、姓名、性別、出生日期、班級、生源地(具體到省、自治區和直轄市)等信息。采用結構體Stu_record數據類型保存學生檔案信息。結構體中含有學號、姓名、性別、出生日期、班級、生源地(具體到省、自治區和直轄市)共六項信息。
數據存儲由鏈表實現,讀入數據完成後,按學號排序輸出,並將其保存在磁盤文件Tdata_new.txt中。
- 查詢數據
采用函數menu3_inquire_record ()。設置查詢菜單,分為按學號查詢id_inquiry_record()、按姓名查詢name_inquiry_record()、按班級查詢clas_inquiry_record()、按生源地查詢syd_inquiry_record()、多條件組合查詢(班級與生源地組合查詢)clasSyd_inquiry_record()、全部顯示search()、退出查詢等功能。
- 修改數據
采用函數modify_record()。用戶輸入修改學生的學號,系統顯示該生信息。用switch case語句設置修改選項,選擇修改學號、姓名、性別、出生日期、班級、生源地、修改全部、保存並退出修改等。在磁盤文件Tdata_new.txt中修改相應信息。
- 刪除數據
采用函數delete_record()。用戶輸入刪除學生的學號,刪除前系統提示用戶再次確認是否刪除。註意需要在學生成績管理系統同步刪除該生信息。
- 增加數據
采用函數add_record()。引導用戶輸入增加學生的學號、姓名、性別、出生日期、班級、生源地信息,更新磁盤文件。
- 統計分析
采用函數statistics_record()。顯示各生源地的人數以及所占百分比。
學生成績管理子系統
- 用戶選擇
進入“學生成績管理”子系統,顯示該子系統菜單,用戶分別可選擇:錄入數據、查詢數據、修改數據、刪除數據、增加數據、統計分析、退出系統等功能。
- 錄入數據
主要實現函數為 readin_score ( ) ,能引導用戶輸入學生人數,依次錄入每個學生的學號、姓名、班級、課程成績等信息。采用結構體Stu_score數據類型保存學生成績信息。結構體中含有學號、姓名、班級、課程數據,其中課程數據包括3門課程的成績以及平均成績。
讀入數據完成後,根據用戶輸入的3門課程成績自動計算平均分avg, 將所有數據保存在磁盤文件Tscore_new.txt中。
- 查詢數據
采用函數inquiry_score()。設置查詢菜單,分為按學號查詢id_inquiry_score()、按姓名查詢name_inquiry_score()、按班級查詢clas_inquiry_score()、退出查詢等功能。
- 修改數據
采用函數modify_ score ()。用戶輸入修改學生的學號,系統顯示該生信息。用switch case語句設置修改選項,選擇修改學號、姓名、班級、課程1成績、課程2成績、課程3成績、保存並退出修改等。在磁盤文件Tscore_new.txt中修改相應信息。
- 刪除數據
采用函數delete_ score ()。用戶輸入刪除學生的學號,刪除前系統提示用戶再次確認是否刪除。註意需要在學生檔案管理系統同步刪除該生信息。
- 增加數據
采用函數add_ score ()。引導用戶輸入增加學生的學號、姓名、班級、課程1成績、課程2成績和課程3成績。系統自動計算平均分。更新磁盤文件。
- 統計分析
采用函數menu3_statistics_score ()。設置統計分析菜單,分為按學生分析和按課程分析。若用戶選擇按學生分析stu_statistics_score(),該函數統計輸出有不及格課程的學生的人數和其所占百分比。若用戶選擇按課程分析course_statistics_score(),該函數分析並輸出每門課程的最高分、最低分、平均分。
四、代碼實現
文件 main.c
#include<stdio.h> #include<string.h> #include <stdlib.h> #include<stdio.h> #include<malloc.h> #include"student.h" /*函數聲明*/ void menu1(); void menu2_record(); void menu2_score(); int main() { while(1) { int n; menu1(); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: menu2_record() ;break; case 2: menu2_score() ;break; case 0: return 0; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } return 0; }
文件 student.h
#include<stdio.h> #include<string.h> #include <stdlib.h> #include<stdio.h> #include<malloc.h> struct Date { int year; int month; int day; }; enum Depart {sdjinan,sdqingdao,sdyantai,sdweifang,sdheze,sddezhou,sdbinzhou,sdweihai}; struct Stu_record { int id; char name[20]; char sex[10]; struct Date birth; int clas; enum Depart syd; struct Stu_record *next; }; struct Stu_record *head = NULL; struct Stu_score { int id; char name[20]; int clas; double course1; double course2; double course3; double avg; struct Stu_score *next; }; /*函數聲明*/ struct Stu_record *readin_record(); void menu3_inquire_record(); void id_inquiry_record(struct Stu_record *head); void name_inquiry_record(struct Stu_record *head); void clas_inquiry_record(struct Stu_record *head); void syd_inquiry_record(struct Stu_record *head); void clasSyd_inquiry_record(struct Stu_record *head); void modify_record(struct Stu_record *head); struct Stu_record *delete_record(struct Stu_record *head); struct Stu_record *add_record(struct Stu_record *head); void statistics_record(struct Stu_record *head); struct Stu_score *readin_score(); void menu3_inquire_score(); void id_inquiry_score(struct Stu_score *head); void name_inquiry_score(struct Stu_score *head); void clas_inquiry_score(struct Stu_score *head); void modify_score(struct Stu_score *head) ; struct Stu_score *delete_score(struct Stu_score *head) ; struct Stu_score *add_score(struct Stu_score *head) ; void menu3_statistics_score(); void stu_statistics_score(struct Stu_score *head); void course_statistics_score(struct Stu_score *head); /********** 公共函數 **********/ struct Stu_record *insert(struct Stu_record *head, struct Stu_record *stu) { struct Stu_record *p1, *p2; if (stu == NULL) { printf("請按照學號、姓名、性別、出生日期(如1999 9 9)、班級、生源地\n(0:山東濟南 1:山東青島 2:山東煙臺 3:山東濰坊 4:山東菏澤 5:山東德州 6:山東濱州 7:山東威海)順序輸入\n"); stu = (struct Stu_record *) malloc(sizeof(struct Stu_record)); while (!scanf("%d %s %s %d %d %d %d %d", &stu->id, stu->name, stu->sex, &stu->birth.year, &stu->birth.month,&stu->birth.day,&stu->clas, &stu->syd)) { printf("輸入信息有誤,請重新輸入\n"); fflush(stdin); } } if (head == NULL) { head = stu; head->next = NULL; } else { p1 = p2 = head; while (stu->id > p1->id && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p2 == p1) { if (stu->id < p2->id) { head = stu; stu->next = p2; } else { p2->next = stu; stu->next = NULL; } } else { if (stu->id < p1->id) { p2->next = stu; stu->next = p1; } else { p1->next = stu; stu->next = NULL; } } } return(head); } struct Stu_score *sinsert(struct Stu_score *head, struct Stu_score *stu) { struct Stu_score *p1, *p2; if (stu == NULL) { printf("請按照學號、姓名、班級、課程1、課程2、課程3 順序輸入\n"); stu = (struct Stu_score *) malloc(sizeof(struct Stu_score)); while (!scanf("%d %s %d %lf %lf %lf", &stu->id, stu->name, &stu->clas, &stu->course1, &stu->course2,&stu->course3)) { printf("輸入信息有誤,請重新輸入\n"); fflush(stdin); } stu->avg=(stu->course1+stu->course2+stu->course3)/3.0; } if (head == NULL) { head = stu; head->next = NULL; } else { p1 = p2 = head; while (stu->id > p1->id && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p2 == p1) { if (stu->id < p2->id) { head = stu; stu->next = p2; } else { p2->next = stu; stu->next = NULL; } } else { if (stu->id < p1->id) { p2->next = stu; stu->next = p1; } else { p1->next = stu; stu->next = NULL; } } } return(head); } void search(struct Stu_record *head) { struct Stu_record *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); while (p1 != NULL) { printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); p1 = p1->next; } printf("\n"); } void ssearch(struct Stu_score *head) { struct Stu_score *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); while (p1 != NULL) { printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); p1 = p1->next; } printf("\n"); } /*** 一堆menu函數的定義 ***/ void menu1() { printf(" \n"); printf(" 歡迎進入學生管理系統 \n"); printf("-------------------------------------------------------\n"); printf(" \n"); printf("*************StudentInformationManagement**************\n"); printf("* *\n"); printf("*\t\t1.進入學生檔案管理子系統 *\n"); printf("* *\n"); printf("*\t\t2.進入學生成績管理子系統 *\n"); printf("* *\n"); printf("*\t\t0.退出系統 *\n"); printf("* *\n"); printf("*******************************************************\n\n"); } void menu2_record() { while(1) { int n; printf("********學生檔案管理*********\n"); printf("* *\n"); printf("*\t1.錄入數據 *\n"); printf("*\t2.查詢數據 *\n"); printf("*\t3.修改數據 *\n"); printf("*\t4.刪除數據 *\n"); printf("*\t5.增加數據 *\n"); printf("*\t6.統計分析 *\n"); printf("*\t0.退出系統 *\n"); printf("* *\n"); printf("*****************************\n\n"); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: readin_record() ; break; case 2: menu3_inquire_record() ; break; case 3: modify_record(head) ; break; case 4: delete_record(head) ; break; case 5: head=add_record(head); search(head); break; case 6: statistics_record(head) ; break; case 0: return; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } } void menu2_score() { while(1) { int n; printf("********學生成績管理*********\n"); printf("* *\n"); printf("*\t1.錄入數據 *\n"); printf("*\t2.查詢數據 *\n"); printf("*\t3.修改數據 *\n"); printf("*\t4.刪除數據 *\n"); printf("*\t5.增加數據 *\n"); printf("*\t6.統計分析 *\n"); printf("*\t0.退出系統 *\n"); printf("* *\n"); printf("*****************************\n\n"); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: readin_score() ; break; case 2: menu3_inquire_score(); break; case 3: modify_score(head); break; case 4: delete_score(head); break; case 5: head=add_score(head); ssearch(head); break; case 6: menu3_statistics_score() ; break; case 0: return; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } } void menu3_inquire_record() { while(1) { int n; printf("************查詢菜單*************\n"); printf("* *\n"); printf("*\t1.按學號查詢 *\n"); printf("*\t2.按姓名查詢 *\n"); printf("*\t3.按班級查詢 *\n"); printf("*\t4.按生源地查詢 *\n"); printf("*\t5.多條件組合查詢 *\n"); printf("*\t6.全部顯示 *\n"); printf("*\t0.退出查詢 *\n"); printf("* *\n"); printf("*********************************\n\n"); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: id_inquiry_record(head); break; case 2: name_inquiry_record(head) ; break; case 3: clas_inquiry_record(head) ; break; case 4: syd_inquiry_record(head) ; break; case 5: clasSyd_inquiry_record(head) ; break; case 6: search(head); break; case 0: return; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } } void menu3_inquire_score() { while(1) { int n; printf("************查詢菜單*************\n"); printf("* *\n"); printf("*\t1.按學號查詢 *\n"); printf("*\t2.按姓名查詢 *\n"); printf("*\t3.按班級查詢 *\n"); printf("*\t4.全部顯示 *\n"); printf("*\t0.退出查詢 *\n"); printf("* *\n"); printf("*********************************\n\n"); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: id_inquiry_score(head); break; case 2: name_inquiry_score(head) ; break; case 3: clas_inquiry_score(head) ; break; case 4: ssearch(head); break; case 0: return; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } } void menu3_statistics_score() { while(1) { int n; printf("************統計分析*************\n"); printf("* *\n"); printf("*\t1.按學生分析 *\n"); printf("*\t2.按課程分析 *\n"); printf("*\t0.退出統計分析 *\n"); printf("* *\n"); printf("*********************************\n\n"); printf("請輸入您的選擇:\n"); scanf("%d",&n); switch (n) { case 1: stu_statistics_score(head); break; case 2: course_statistics_score(head) ; break; case 0: return; default: printf("您的選擇錯誤,請重新輸入。\n"); } system("pause"); system("cls"); } } /****** record中函數 ******/ struct Stu_record *readin_record() { struct Stu_record *p2,*p1; int n,i; head=NULL; FILE *w; if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } printf("請輸入學生人數: \n"); scanf("%d",&n); head=p2=p1=(struct Stu_record *) malloc(sizeof(struct Stu_record)); //開辟內存,用於生成鏈表 printf("學生個數為:%d個,請按照以下順序輸入\n", n); //對學生總數的提示,並且提示每個學生信息的輸入順序 printf("學號、姓名、性別、出生日期(如1999 9 9)、班級、生源地\n(0:山東濟南 1:山東青島 2:山東煙臺 3:山東濰坊 4:山東菏澤 5:山東德州 6:山東濱州 7:山東威海)\n"); //每個學生信息的輸入順序 for (i = 0; i < n; i++) { while (!scanf("%d %s %s %d %d %d %d %d", &p2->id, p2->name, p2->sex, &p2->birth.year, &p2->birth.month,&p2->birth.day,&p2->clas, &p2->syd)) { printf("輸入有誤,請重新輸入該學生信息\n "); fflush(stdin); } if (n == 1) { p2->next = NULL; } else { head = insert(head, p2); p2 = (struct Student *) malloc(sizeof(struct Stu_record)); } } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd); p1= p1->next; } fclose(w); printf("成功錄入%d名學生信息,學生信息已經按學號從小到大排列,信息如下: \n\n",n); search(head); return head; } void id_inquiry_record(struct Stu_record *head) { int cho, t = 1; int num; struct Stu_record *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->id != num) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->id == num) { printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void name_inquiry_record(struct Stu_record *head) { int cho, t = 1; char qname[20]; struct Stu_record *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生姓名: "); while (!scanf("%s", qname)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (strcmp(p1->name,qname)!=0) { if (p1->next == NULL) break; p1 = p1->next; } if (strcmp(p1->name,qname)==0) { printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void clas_inquiry_record(struct Stu_record *head) { int cho, t = 1; struct Stu_record *p1; int qclas; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if (t == 1) { printf("請輸入需要查詢的學生班級: "); while (!scanf("%d", &qclas)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->clas != qclas) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->clas == qclas) { printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void syd_inquiry_record(struct Stu_record *head) { int cho,t = 1; struct Stu_record *p1; int qsyd; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生生源地: "); printf("(0:山東濟南 1:山東青島 2:山東煙臺 3:山東濰坊 4:山東菏澤 5:山東德州 6:山東濱州 7:山東威海)\n"); while (!scanf("%d", &qsyd)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->syd != qsyd) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->syd == qsyd) { printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void clasSyd_inquiry_record(struct Stu_record *head) { int cho, t = 1; struct Stu_record *p1; int qsyd,qclas; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生生源地: "); while (!scanf("%d", &qsyd)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } printf("請輸入需要查詢的學生班級: "); while (!scanf("%d", &qclas)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->syd != qsyd||p1->clas != qclas) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->syd == qsyd&&p1->clas == qclas) { printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void modify_record(struct Stu_record *head) { struct Stu_record *p1, *p2; int num,cho,k=1,l=0; FILE *w; if (head == NULL) { printf("沒有學生信息,結束修改\n "); system("pause"); return; } printf("請輸入需要修改的學生學號: "); while (!scanf("%d",&num)) { printf("輸入學號有誤,請重新輸入: "); fflush(stdin); } do { p2 = p1 = head; while (p1->id != num) { if (p1->next == NULL) break; p2 = p1; p1 = p1->next; } if (p1->id == num) { printf("已找到該學生,該學生的信息為: \n"); printf("生源地(0:山東濟南 1:山東青島 2:山東煙臺 3:山東濰坊 4:山東菏澤 5:山東德州 6:山東濱州 7:山東威海)\n"); printf("學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); l = 0; do { if (l == 0) printf("\n選擇修改的內容\n"); else printf("序號輸入錯誤,請重新選擇\n"); l = 1; printf(" 1.學號\n"); printf(" 2.姓名\n"); printf(" 3.性別\n"); printf(" 4.出生日期\n"); printf(" 5.班級\n"); printf(" 6.生源地\n"); printf(" 7.全部\n"); printf("請選擇序號: "); fflush(stdin); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } while (cho > 7 || cho < 1); switch (cho) { case 1: { printf("請輸入該學生改正的學號信息: "); while (!scanf("%d", &p1->id)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 2: { printf("請輸入該學生改正的姓名信息: "); while (!scanf("%s", p1->name)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 3: { printf("請輸入該學生改正的性別信息: "); while (!scanf("%s", p1->sex)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 4: { printf("請輸入該學生改正的出生年月信息(如輸入1999 9 9): "); while (!scanf("%d %d %d", &p1->birth.year,&p1->birth.month,&p1->birth.day)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 5: { printf("請輸入該學生改正的班級信息: "); while (!scanf("%d",&p1->clas)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 6: { printf("請輸入該學生改正的生源地信息: "); printf("生源地(0:山東濟南 1:山東青島 2:山東煙臺 3:山東濰坊 4:山東菏澤 5:山東德州 6:山東濱州 7:山東威海)\n"); while (!scanf("%d",&p1->syd)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 7: { printf("請輸入該學生全部要改正的信息: "); while (!scanf("%d %s %s %d %d %d %d %d",&p1->id, p1->name, p1->sex, &p1->birth.year, &p1->birth.month, &p1->birth.day, &p1->clas, &p1->syd)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } } if (cho == 1 || cho == 7) { if (p1 == head) { head = head->next; } else if (p1->next == NULL) { p2->next = NULL; } else { p2->next = p1->next; } head = insert(head,p1); } printf("修改成功,該學生改正後的信息為: \n"); printf(" 學號 姓名 性別 出生日期 班級 生源地 \n"); printf("———————————————————————————\n"); printf("%-7d %-4s %-6s %-4d年%-2d月%-2d日 %-6d %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd); printf(" 1.繼續修改其他學生信息\n"); printf(" 2.退出修改\n"); printf("請選擇: "); while (!scanf("%d",&k)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } if (k == 1) { printf("請輸入需要修改的學生學號: "); while (!scanf("%d", &num)) { printf("輸入修改信息有誤,請重新輸入: "); fflush(stdin); } } else if (k != 2) { printf("輸入有誤,請重新輸入\n"); } if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd); p1= p1->next; } fclose(w); } else { k = 1; printf("找不到該學生信息,請重新輸入需要修改的學生學號: "); fflush(stdin); while (!scanf("%d", &num)) { printf("輸入修改信息有誤,請重新輸入: "); fflush(stdin); } } } while(k == 1); printf(" "); system("pause"); } struct Stu_record *delete_record(struct Stu_record *head) { int num,k; FILE *w; struct Stu_record *p1,*p2; if(head == NULL) { printf("沒有學生信息,結束刪除\n"); return(head); } printf("請輸入要刪除的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入學生學號: "); fflush(stdin); } do { p1 = p2 = head; while (num != p1->id && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->id) { if (num == p1->id) { if (p1->next == NULL && p1 == head) { free(p1); head = NULL; } else if (p1->next == NULL)//如果刪除完表空瞭 把表刪除 { free(p1); p2->next = NULL; } else if (head == p1) { head = p1->next; free(p1); } else { p2->next = p1->next; free(p1); } } printf("成功刪除學生信息\n"); } else { printf("找不到該同學信息\n"); fflush(stdin); } if (head == NULL) { printf("沒有學生信息,結束刪除\n"); return(head); } else { printf(" 1.繼續刪除學生信息\n"); printf(" 2.結束刪除\n"); printf("請選擇: "); while (!scanf("%d",&k)) { printf("輸入有誤,請重新輸入選擇的序號: "); fflush(stdin); } if (k == 1) { printf("請輸入要刪除的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入學生學號: "); fflush(stdin); } } else if (k != 2) { k = 1; } if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd); p1= p1->next; } fclose(w); } } while (k == 1); return(head); } struct Stu_record *add_record(struct Stu_record *head) { FILE *w; int i,num; struct Stu_record *p1; head = insert(head, NULL); printf(" 成功插入學生信息\n "); if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd); p1= p1->next; } fclose(w); return head; } void statistics_record(struct Stu_record *head) { double cnt[8]; int i; double sum=0; struct Stu_record *p1; p1 = head; memset(cnt,0,sizeof(cnt)); printf("統計各生源地人數及所占百分比:\n"); while (1) { sum++; for(i=0;i<8;i++) { if(p1->syd==i) cnt[i]++; } if (p1->next == NULL) break; p1 = p1->next; } printf("全體學生人數:%.0lf人\n\n",sum); printf("山東濟南:%.0lf人 %5.2lf%%\n",cnt[0],(cnt[0]/sum)*100); printf("山東青島:%.0lf人 %5.2lf%%\n",cnt[1],(cnt[1]/sum)*100); printf("山東煙臺:%.0lf人 %5.2lf%%\n",cnt[2],(cnt[2]/sum)*100); printf("山東濰坊:%.0lf人 %5.2lf%%\n",cnt[3],(cnt[3]/sum)*100); printf("山東菏澤:%.0lf人 %5.2lf%%\n",cnt[4],(cnt[4]/sum)*100); printf("山東德州:%.0lf人 %5.2lf%%\n",cnt[5],(cnt[5]/sum)*100); printf("山東濱州:%.0lf人 %5.2lf%%\n",cnt[6],(cnt[6]/sum)*100); printf("山東威海:%.0lf人 %5.2lf%%\n\n",cnt[7],(cnt[7]/sum)*100); } /*** score中的函數 ***/ struct Stu_score *readin_score() { struct Stu_score *p2,*p1; int n,i; head=NULL; FILE *w; if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } printf("請輸入學生人數: \n"); scanf("%d",&n); head=p2=p1=(struct Stu_score *) malloc(sizeof(struct Stu_score)); //開辟內存,用於生成鏈表 printf("學生個數為:%d個,請按照以下順序輸入\n", n); //對學生總數的提示,並且提示每個學生信息的輸入順序 printf("學號、姓名、班級、課程1、課程2、課程3\n"); //每個學生信息的輸入順序 for (i = 0; i < n; i++) { while (!scanf("%d %s %d %lf %lf %lf", &p2->id, p2->name, &p2->clas, &p2->course1, &p2->course2,&p2->course3)) { printf("輸入有誤,請重新輸入該學生信息\n "); fflush(stdin); } p2->avg = (p2->course1+p2->course2+p2->course3)/3.0; if (n == 1) { p2->next = NULL; } else { head = sinsert(head, p2); p2 = (struct Stu_score *) malloc(sizeof(struct Stu_score)); } } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %d %lf %lf %lf\n",p2->id, p2->name, p2->clas, p2->course1, p2->course2,p2->course3,p2->avg); p1= p1->next; } fclose(w); printf("成功錄入%d名學生成績信息,學生成績信息已經按學號從小到大排列,信息如下: \n\n",n); ssearch(head); return head; } void id_inquiry_score(struct Stu_score *head) { int cho, t = 1; int num; struct Stu_score *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->id != num) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->id == num) { printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void name_inquiry_score(struct Stu_score *head) { int cho, t = 1; char qname[20]; struct Stu_score *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生姓名: "); while (!scanf("%s",qname)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (strcmp(p1->name,qname)!=0) { if (p1->next == NULL) break; p1 = p1->next; } if (strcmp(p1->name,qname)==0) { printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void clas_inquiry_score(struct Stu_score *head) { int cho, t = 1; int qclas; struct Stu_score *p1; if (head == NULL) { printf("沒有學生信息,結束查詢\n"); return; } p1 = head; do { p1 = head; if ( t == 1) { printf("請輸入需要查詢的學生班級: "); while (!scanf("%d", &qclas)) { printf("輸入有誤,請重新輸入: "); fflush(stdin); } t = 1; } else { cho = 2; } while (p1->clas != qclas) { if (p1->next == NULL) break; p1 = p1->next; } if (p1->clas == qclas) { printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); } else { printf("找不到該學生\n"); } if (t == 1) { printf("1.繼續查詢\n"); printf("2.結束查詢\n"); printf("請選擇: "); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } } while(cho==1); } void modify_score(struct Stu_score *head) { struct Stu_score *p1, *p2; int num,cho,k=1,l=0; FILE *w; if (head == NULL) { printf("沒有學生成績信息,結束修改\n "); system("pause"); return; } printf("請輸入需要修改的學生學號: "); while (!scanf("%d",&num)) { printf("輸入學號有誤,請重新輸入: "); fflush(stdin); } do { p2 = p1 = head; while (p1->id != num) { if (p1->next == NULL) break; p2 = p1; p1 = p1->next; } if (p1->id == num) { printf("已找到該學生,該學生的信息為: \n"); printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); l = 0; do { if (l == 0) printf("\n選擇修改的內容\n"); else printf("序號輸入錯誤,請重新選擇\n"); l = 1; printf(" 1.學號\n"); printf(" 2.姓名\n"); printf(" 3.班級\n"); printf(" 4.課程1成績\n"); printf(" 5.課程2成績\n"); printf(" 6.課程3成績\n"); printf(" 7.全部\n"); printf("請選擇序號: "); fflush(stdin); while (!scanf("%d", &cho)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } } while (cho > 7 || cho < 1); switch (cho) { case 1: { printf("請輸入該學生改正的學號信息: "); while (!scanf("%d", &p1->id)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 2: { printf("請輸入該學生改正的姓名信息: "); while (!scanf("%s", p1->name)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 3: { printf("請輸入該學生改正的班級信息: "); while (!scanf("%d", &p1->clas)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } break; } case 4: { printf("請輸入該學生改正的課程1成績信息: "); while (!scanf("%lf", &p1->course1)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } p1->avg=(p1->course1+p1->course2+p1->course3)/3.0; break; } case 5: { printf("請輸入該學生改正的課程2成績信息: "); while (!scanf("%lf",&p1->course2)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } p1->avg=(p1->course1+p1->course2+p1->course3)/3.0; break; } case 6: { printf("請輸入該學生改正的課程3成績信息: "); while (!scanf("%lf",&p1->course3)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } p1->avg=(p1->course1+p1->course2+p1->course3)/3.0; break; } case 7: { printf("請輸入該學生全部要改正的信息: "); while (!scanf("%d %s %d %lf %lf %lf",&p1->id, p1->name, &p1->clas, &p1->course1, &p1->course2, &p1->course3)) { printf("輸入改正信息有誤,請重新輸入: "); fflush(stdin); } p1->avg=(p1->course1+p1->course2+p1->course3)/3.0; break; } } if (cho == 1 || cho == 7) { if (p1 == head) { head = head->next; } else if (p1->next == NULL) { p2->next = NULL; } else { p2->next = p1->next; } head = sinsert(head,p1); } printf(" 學號 姓名 班級 課程1 課程2 課程3 平均分 \n"); printf("—————————————————————————————————\n"); printf("%-7d %-7s %-7d %-5.2lf %-5.2lf %-5.2lf %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg); l = 0; printf(" 1.繼續修改其他學生信息\n"); printf(" 2.退出修改\n"); printf("請選擇: "); while (!scanf("%d",&k)) { printf("輸入序號有誤,請重新輸入: "); fflush(stdin); } if (k == 1) { printf("請輸入需要修改的學生學號: "); while (!scanf("%d", &num)) { printf("輸入修改信息有誤,請重新輸入: "); fflush(stdin); } } else if (k != 2) { printf("輸入有誤,請重新輸入\n"); } if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %d %lf %lf %lf %lf \n", p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg); p1= p1->next; } fclose(w); } else { k = 1; printf("找不到該學生信息,請重新輸入需要修改的學生學號: "); fflush(stdin); while (!scanf("%d", &num)) { printf("輸入修改信息有誤,請重新輸入: "); fflush(stdin); } } } while(k == 1); printf(" "); system("pause"); } struct Stu_score *delete_score(struct Stu_score *head) { int num,k; FILE *w; struct Stu_score *p1,*p2; if(head == NULL) { printf("沒有學生信息,結束刪除\n"); return(head); } printf("請輸入要刪除的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入學生學號: "); fflush(stdin); } do { p1 = p2 = head; while (num != p1->id && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->id) { if (num == p1->id) { if (p1->next == NULL && p1 == head) { free(p1); head = NULL; } else if (p1->next == NULL)//如果刪除完表空瞭 把表刪除 { free(p1); p2->next = NULL; } else if (head == p1) { head = p1->next; free(p1); } else { p2->next = p1->next; free(p1); } } printf("成功刪除學生信息\n"); } else { printf("找不到該同學信息\n"); fflush(stdin); } if (head == NULL) { printf("沒有學生信息,結束刪除\n"); return(head); } else { printf(" 1.繼續刪除學生信息\n"); printf(" 2.結束刪除\n"); printf("請選擇: "); while (!scanf("%d",&k)) { printf("輸入有誤,請重新輸入選擇的序號: "); fflush(stdin); } if (k == 1) { printf("請輸入要刪除的學生學號: "); while (!scanf("%d", &num)) { printf("輸入有誤,請重新輸入學生學號: "); fflush(stdin); } } else if (k != 2) { k = 1; } if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %d %lf %lf %lf %lf \n", p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg); p1= p1->next; } fclose(w); } } while (k == 1); return(head); } struct Stu_score *add_score(struct Stu_score *head) { FILE *w; int i,num; struct Stu_score *p1; head = sinsert(head, NULL); printf("成功插入學生信息\n"); if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL) { printf("cannot open file\n"); exit(1); } p1=head; while(p1!=NULL) { fprintf(w,"%d %s %d %lf %lf %lf %lf\n",p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg); p1= p1->next; } fclose(w); return head; } void stu_statistics_score(struct Stu_score *head) { double cnt[3]; int i; double sum=0; struct Stu_score *p1; p1 = head; memset(cnt,0,sizeof(cnt)); printf("統計各課程不及格人數及所占百分比:\n"); while (1) { sum++; if(p1->course1<60) cnt[0]++; if(p1->course2<60) cnt[1]++; if(p1->course3<60) cnt[2]++; if (p1->next == NULL) break; p1 = p1->next; } printf("全體學生人數:%.0lf人\n\n",sum); printf("課程1不及格人數:%.0lf人 %5.2lf%%\n",cnt[0],(cnt[0]/sum)*100); printf("課程2不及格人數:%.0lf人 %5.2lf%%\n",cnt[1],(cnt[1]/sum)*100); printf("課程3不及格人數:%.0lf人 %5.2lf%%\n\n",cnt[2],(cnt[2]/sum)*100); } void course_statistics_score(struct Stu_score *head) { int i; int c1max=0,c2max=0,c3max=0; int c1min=1000,c2min=1000,c3min=1000; double sum1=0,sum2=0,sum3=0; double n=0; struct Stu_score *p1; p1 = head; printf("統計各課程最高分、最低分和平均分:\n"); while (1) { if(p1->course1<c1min) c1min=p1->course1; if(p1->course2<c2min) c2min=p1->course2; if(p1->course3<c3min) c3min=p1->course3; if(p1->course1>c1max) c1max=p1->course1; if(p1->course2>c2max) c2max=p1->course2; if(p1->course3>c3max) c3max=p1->course3; sum1+=p1->course1; sum2+=p1->course2; sum3+=p1->course3; n++; if (p1->next == NULL) break; p1 = p1->next; } printf("全體學生人數:%.0lf人\n\n",n); printf("課程1最高分、最低分和平均分:%3d %3d %3.2lf\n",c1max,c1min,sum1/n); printf("課程2最高分、最低分和平均分:%3d %3d %3.2lf\n",c2max,c2min,sum2/n); printf("課程3最高分、最低分和平均分:%3d %3d %3.2lf\n\n",c3max,c3min,sum3/n); }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。