案例描述 案例要求模擬開發(fā)一個學生成績管理系統(tǒng),此系統(tǒng)具有以下功能:
添加學生信息,包括學號、姓名、語文成績、數(shù)學成績; 修改學生信息,可以根據(jù)姓名查找到學生,然后可以修改學生姓名、成績項; 刪除學生信息,根據(jù)學號查找到學生,將其信息刪除; 查找學生信息,根據(jù)學生姓名,將其信息打印輸出; 這些功能之間的邏輯關系如下圖所示:
學生成績管理系統(tǒng) 案例分析 分析案例需求可知,該系統(tǒng)首先會向用戶展現(xiàn)一個菜單選擇界面,用戶可以根據(jù)菜單界面的提示,選擇不同的功能進入子界面,因此可以針對每一個功能定義一個函數(shù),通過函數(shù)調用實現(xiàn)相應功能。由系統(tǒng)需求可知,該系統(tǒng)主要有6大功能,因此需要定義6個函數(shù)。
添加記錄——add()函數(shù)當用戶在功能菜單中選擇數(shù)字1時,會調用add()函數(shù)進入添加記錄模塊,提示用戶輸入學生的學號、姓名、計算機基礎成績、數(shù)據(jù)結構成績。當用戶輸入完畢后,會提示用戶是否繼續(xù)添加,Y表示繼續(xù),N表示返回。需要注意的是,在添加學號時不能重復,如果輸入重復的學號就會提示此學號已存在。 void add(struct student stu[]) { int i, id = 0; //i作為循環(huán)變量,id用來保存新學號 char quit; //保存是否退出的選擇 do { printf("學號:"); scanf("%d", &id); for (i = 0; i < n; i++) { if (id == stu[i].id) { printf("此學號存在!\n"); return; } } stu[i].id = id; printf("姓名:"); scanf("%s", &stu[i].name); printf("計算機基礎成績:"); scanf("%d", &stu[i].chinese); printf("數(shù)據(jù)結構成績:"); scanf("%d", &stu[i].math); stu[i].sum = stu[i].chinese + stu[i].math; n++; //記錄條數(shù)加1 printf("是否繼續(xù)添加?(Y/N)"); scanf("\t%c", &quit); } while (quit != 'N'); }顯示記錄——showAll()函數(shù)當用戶在功能菜單中選擇數(shù)字2時,會調用show()函數(shù)進入顯示記錄模塊,并向控制臺輸出錄入的所有學生的學號、姓名、數(shù)據(jù)結構成績、計算機基礎成績和成績總和。 void show(struct student stu[], int i) { printf("%-10d", stu[i].id); printf("%-10s", stu[i].name); printf("%-10d", stu[i].chinese); printf("%-10d", stu[i].math); printf("%-10d\n", stu[i].sum); }修改記錄——modify()函數(shù)當用戶在功能菜單中選擇數(shù)字3時,會調用modify()函數(shù)進入修改記錄模塊,輸入要修改的學生姓名,當用戶輸入了已錄入的學生姓名后,如果學生信息存在即可修改除學號以外的其他信息,否則輸出沒有找到該生的記錄。 void modify(struct student stu[]) { char name[8], ch; int i; printf("修改學生的記錄。\n"); printf("請輸入學生的姓名:"); scanf("%s", &name); for (i = 0; i < n; i++) { if (strcmp(name, stu[i].name) == 0) { getchar(); printf("找到該生的記錄,如下所示:\n"); HH; //顯示記錄的標題 show(stu, i); printf("是否修改?(Y/N)\n"); scanf("%c", &ch); if (ch == 'Y' || ch == 'y') { getchar(); printf("姓名:"); scanf("%s", &stu[i].name); printf("計算機基礎成績:"); scanf("%d", &stu[i].chinese); printf("數(shù)據(jù)結構成績:"); scanf("%d", &stu[i].math); stu[i].sum = stu[i].chinese + stu[i].math; printf("修改完畢。\n"); } return; } } printf("沒有找到該生的記錄。\n"); }刪除記錄——del()函數(shù)當用戶在功能菜單中選擇數(shù)字4時,會調用del()函數(shù)進入刪除記錄模塊,對學生學號進行判斷,如果學號存在即可刪除該生的所有信息,否則輸出沒有找到該生的記錄。 void del(struct student stu[]) { int id, i; char ch; printf("刪除學生的記錄。\n"); printf("請輸入學號:"); scanf("%d", &id); for (i = 0; i < n; i++) { if (id == stu[i].id) { getchar(); printf("找到該生的記錄,如下所示:\n"); HH; //顯示記錄的標題 show(stu, i); //顯示數(shù)組stu中的第i條記錄 printf("是否刪除?(Y/N)\n"); scanf("%c", &ch); if (ch == 'Y' || ch == 'y') { for (; i < n; i++) // 被刪除記錄后面的記錄均前移一位 stu[i] = stu[i + 1]; n--; //記錄總條數(shù)減1 printf("刪除成功!"); } return; } } printf("沒有找到該生的記錄!\n"); }查找記錄——search()函數(shù)當用戶在功能菜單中輸入數(shù)字5時,會調用search()進入查找記錄模塊,在該模塊中輸入查找的學生姓名,如果該學生存在則輸出該學生的全部信息,否則輸出沒有找到該生的記錄。 void search(struct student stu[]) { char name[8]; int i; printf("查找學生的記錄。\n"); printf("請輸入學生的姓名:"); scanf("%s", &name); for (i = 0; i < n; i++) { if (strcmp(name, stu[i].name) == 0) { printf("找到該生的記錄,如下所示:\n"); HH; //顯示記錄的標題 show(stu, i); //顯示數(shù)組stu中的第i條記錄 return; } } printf("沒有找到該生的記錄。\n"); }排序——sort()函數(shù)當用戶在功能菜單中輸入數(shù)字6時,會調用sort()函數(shù)進入排序記錄模塊,該模塊會輸出所有學生的信息,并按總成績由高到低進行排序。 void sort(struct student stu[]) { int i, j; struct student t; printf("按總成績進行排序,"); for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (stu[i].sum < stu[j].sum) { t = stu[i]; stu[i] = stu[j]; stu[j] = t; } } } printf("排序結果如下:\n"); showAll(stu); //顯示排序后的所有記錄 }案例實現(xiàn) 由于該系統(tǒng)需要定義6個函數(shù),而且還涉及變量,代碼較多,因此可以分文件實現(xiàn)該系統(tǒng),將函數(shù)聲明與定義在頭文件student.h中實現(xiàn),函數(shù)實現(xiàn)在student.c文件中完成,函數(shù)調用在main.c文件中執(zhí)行。
定義student.h文件在student.h文件中定義項目需要的變量與函數(shù)聲明。在定義變量時,因為學生信息包括學號、姓名和成績等不同數(shù)據(jù)類型的屬性,所以需要定義一個學生類型的結構體。在存儲學生信息時,可選用數(shù)組、字符串指針,考慮到學生要根據(jù)總成績來排序,為方便排序,我們選用數(shù)組來存儲學生信息。 struct student { int id; // 學號 char name[8]; //姓名 int chinese; //計算機基礎成績 int math; //數(shù)據(jù)結構成績 int sum; //總分 };定義student.c文件在student.c文件中實現(xiàn)各個功能函數(shù)。
定義main.c文件在main.c文件中,定義保存學生信息的結構體數(shù)組,構建學生成績管理系統(tǒng)主界面,使用while(1)循環(huán)控制是否退出系統(tǒng),在while循環(huán)中使用switch語句判斷用戶所選擇的功能,根據(jù)用戶選擇的功能調用相應的函數(shù)。