C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))
目錄
- 一、設(shè)計(jì)目的
- 二、原理及相關(guān)功能
- (一)基本框架
- (二)功能實(shí)現(xiàn)
- 三、完整代碼
- 四、運(yùn)行結(jié)果
一、設(shè)計(jì)目的
通過c語言設(shè)計(jì)一個(gè)學(xué)生管理系統(tǒng),要求有直觀的主菜單,可以錄入學(xué)生的信息,實(shí)現(xiàn)添加學(xué)生信息、顯示學(xué)生信息、查找學(xué)生信息、刪除學(xué)生信息、修改學(xué)生信息以及退出等功能。
二、原理及相關(guān)功能
(一)基本框架
1、首先因?yàn)閷W(xué)生有以下幾個(gè)基本信息:姓名、年齡、學(xué)號(hào)、性別,依次由name、age、id和sex來表示,所以可以通過結(jié)構(gòu)體實(shí)現(xiàn),struct語句定義存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),定義一個(gè)結(jié)構(gòu)體名為student,用于存儲(chǔ)每個(gè)學(xué)生的信息,另外定義一個(gè)結(jié)構(gòu)體名為class_room班級(jí),它包含了結(jié)構(gòu)體student的變量初始化st,用于存儲(chǔ)學(xué)生以及當(dāng)前班級(jí)人數(shù),且定義學(xué)生最大人數(shù)為60,如下代碼:
#define MAX 60//定義MAX最大值為60 struct student{char name[20];int age;int id;char sex[10]; };struct class_room{struct student st[MAX]; //定義多個(gè)學(xué)生 int n; //當(dāng)前班級(jí)的人數(shù) };2、由于是顯示一個(gè)管理系統(tǒng),所以我們?cè)O(shè)計(jì)一個(gè)主菜單,通過定義一個(gè)函數(shù)printf_menu()來實(shí)現(xiàn)這個(gè)功能,如下代碼:
//打印主菜單函數(shù) void printf_menu()//打印主菜單函數(shù) {printf(" 學(xué)生管理系統(tǒng) \n");printf("----------------------------\n");printf("|1、添加學(xué)生信息 |\n");printf("|2、顯示所有學(xué)生信息 |\n");printf("|3、查詢學(xué)生信息 |\n");printf("|4、刪除學(xué)生信息 |\n");printf("|5、修改學(xué)生信息 |\n");printf("|6、退出 |\n");printf("----------------------------\n");printf("請(qǐng)輸入相應(yīng)的序號(hào)選擇! \n"); }3、因?yàn)橐ㄟ^輸入相應(yīng)的序號(hào)來選擇相應(yīng)的功能,所以可以在主函數(shù)中通過一個(gè)switch()語句來實(shí)現(xiàn),若要使程序一直執(zhí)行下去,通過用戶輸入退出才退出程序,即設(shè)置一個(gè)while(1)無限循環(huán)下去,另外還要設(shè)置一個(gè)loop語句,通過goto語句,即若輸入錯(cuò)誤的序號(hào)即跳到選擇序號(hào)的頁面。
訪問結(jié)構(gòu)的成員,通過使用運(yùn)算符.來實(shí)現(xiàn),即WLW.n=0,表示初始化班級(jí)WLW的成員n,而&WLW表示取WLW的地址,取出其對(duì)應(yīng)存儲(chǔ)空間的值,即存儲(chǔ)的學(xué)生,另外若想使用指向該結(jié)構(gòu)的指針來訪問結(jié)構(gòu)體,通過操作符->實(shí)現(xiàn)。
如以下代碼:
(二)功能實(shí)現(xiàn)
1、定義一個(gè)add_student()函數(shù)添加學(xué)生信息,參數(shù)為struct class_room *WLW,即結(jié)構(gòu)體指針變量。姓名和性別由于是字符串類型,所以scanf()中通過%s格式符表示,年齡和id它們的地址是班級(jí)WLW當(dāng)前學(xué)生的相應(yīng)信息,由于數(shù)組名代表首地址這里不用&,另外每次添加后,當(dāng)前班級(jí)的人數(shù)n++,如下代碼:
//添加學(xué)生信息 void add_student(struct class_room *WLW) {printf("請(qǐng)輸入學(xué)生的姓名:\n");scanf("%s",WLW->st[WLW->n].name); //數(shù)組名代表首地址 printf("請(qǐng)輸入學(xué)生的年齡:\n");scanf("%d",&WLW->st[WLW->n].age); //取變量的地址 printf("請(qǐng)輸入學(xué)生的id:\n");scanf("%d",&WLW->st[WLW->n].id);printf("請(qǐng)輸入學(xué)生的性別:\n");scanf("%s",WLW->st[WLW->n].sex);WLW->n++;//班級(jí)人數(shù)加一 }2、定義一個(gè)show_student()函數(shù)顯示學(xué)生信息,即顯示當(dāng)前班級(jí)的所有學(xué)生信息,其中WLW->n為當(dāng)前班級(jí)的人數(shù),如下代碼:
//顯示學(xué)生信息 void show_student(struct class_room *WLW) {int i;for(i=0;i<WLW->n;i++)//WLW->n為當(dāng)前班級(jí)的人數(shù){printf("the %d student name is %s\n",i+1,WLW->st[i].name);printf("the %d student age is %d\n",i+1,WLW->st[i].age);printf("the %d student id is %d\n",i+1,WLW->st[i].id);printf("the %d student sex is %s\n",i+1,WLW->st[i].sex);} }3、定義一個(gè)find_student()函數(shù)查找學(xué)生信息,通過輸入學(xué)生id查找學(xué)生的信息,若存在則通過循環(huán)依次輸出該學(xué)生的信息:
//查找學(xué)生 int find_student(struct class_room *WLW) {int id,i; printf("請(qǐng)輸入要查找的學(xué)生id:\n");scanf("%d",&id);for(i=0;i<WLW->n;i++){if(id==WLW->st[i].id){printf("the student is exist!\n");printf("the %d student name is %s\n",i+1,WLW->st[i].name);printf("the %d student age is %d\n",i+1,WLW->st[i].age);printf("the %d student id is %d\n",i+1,WLW->st[i].id);printf("the %d student sex is %s\n",i+1,WLW->st[i].sex);return i;}}printf("the student is not exist!\n");return -1; }4、定義一個(gè)remove_student()函數(shù)刪除學(xué)生信息,這里首先定義一個(gè)參數(shù)ret,并調(diào)用find_student(WLW)查找要?jiǎng)h除的學(xué)生是否在其中,如果返回值為-1,則進(jìn)行覆蓋,即要?jiǎng)h除的學(xué)生信息被后面的學(xué)生信息所覆蓋,另外其中由于于是字符串類型復(fù)制時(shí)通過使用頭文件string.h中的strcpy復(fù)制函數(shù)從而實(shí)現(xiàn)覆蓋的功能,然后當(dāng)前班級(jí)學(xué)生人數(shù)減一:
//刪除指定學(xué)生 void remove_student(struct class_room *WLW){int ret,i;ret=find_student(WLW);if(ret!=-1){for(i=ret;i<WLW->n-1;i++){strcpy(WLW->st[i].name,WLW->st[i+1].name);//由于是字符串類型復(fù)制使用頭文件string.h中的strcpy復(fù)制函數(shù) WLW->st[i].age=WLW->st[i+1].age;WLW->st[i].id=WLW->st[i+1].id;strcpy(WLW->st[i].sex,WLW->st[i+1].sex);}WLW->n--;}printf("該學(xué)生已經(jīng)刪除成功!\n"); }5、定義一個(gè)change_student()函數(shù)修改學(xué)生信息,因?yàn)閷W(xué)生學(xué)習(xí)有四項(xiàng),所以這里通過switch語句、goto語句來實(shí)現(xiàn),定義ret參數(shù)調(diào)用find_student(WLW)查找要?jiǎng)h除的學(xué)生是否在其中,然后再修改:
//修改學(xué)生信息 void change_student(struct class_room *WLW) {int ret,choose;ret=find_student(WLW);if(ret!=-1){loop1:printf("修改學(xué)生信息的哪一項(xiàng)?\n");printf("1、姓名\n");printf("2、年齡\n");printf("3、id\n");printf("4、性別\n");scanf("%d",&choose);switch(choose){case 1:printf("請(qǐng)輸入新的學(xué)生姓名:\n");scanf("%s",WLW->st[ret].name);//輸出的代表首地址,所以不需要&取地址 break;case 2:printf("請(qǐng)輸入新的學(xué)生年齡:\n");scanf("%d",&WLW->st[ret].age);break;case 3:printf("請(qǐng)輸入新的學(xué)生id:\n");scanf("%d",&WLW->st[ret].id);break;case 4: printf("請(qǐng)輸入新的學(xué)生性別:\n");scanf("%s",WLW->st[ret].sex);break;default:printf("輸出錯(cuò)誤,請(qǐng)重新輸入!\n");goto loop1;}} }三、完整代碼
以下是完整的程序代碼:
/*學(xué)生管理系統(tǒng)*/ #include<stdio.h> #include<string.h>//包含頭文件string.h #define MAX 60//定義MAX最大值為60 struct student{char name[20];int age;int id;char sex[10]; };struct class_room{struct student st[MAX]; //定義多個(gè)學(xué)生 int n; //當(dāng)前班級(jí)的人數(shù) };void printf_menu()//打印主菜單函數(shù) {printf(" 學(xué)生管理系統(tǒng) \n");printf("----------------------------\n");printf("|1、添加學(xué)生信息 |\n");printf("|2、顯示所有學(xué)生信息 |\n");printf("|3、查詢學(xué)生信息 |\n");printf("|4、刪除學(xué)生信息 |\n");printf("|5、修改學(xué)生信息 |\n");printf("|6、退出 |\n");printf("----------------------------\n");printf("請(qǐng)輸入相應(yīng)的序號(hào)選擇! \n"); }void add_student(struct class_room *WLW)//添加學(xué)生信息,其中struct class_room *WLW為結(jié)構(gòu)體指針 {printf("請(qǐng)輸入學(xué)生的姓名:\n");scanf("%s",WLW->st[WLW->n].name); //數(shù)組名代表首地址 printf("請(qǐng)輸入學(xué)生的年齡:\n");scanf("%d",&WLW->st[WLW->n].age); //取變量的地址 printf("請(qǐng)輸入學(xué)生的id:\n");scanf("%d",&WLW->st[WLW->n].id);printf("請(qǐng)輸入學(xué)生的性別:\n");scanf("%s",WLW->st[WLW->n].sex);WLW->n++;//班級(jí)人數(shù)加一 }void show_student(struct class_room *WLW)//顯示所有學(xué)生信息 {int i;for(i=0;i<WLW->n;i++)//WLW->n為當(dāng)前班級(jí)的人數(shù){printf("the %d student name is %s\n",i+1,WLW->st[i].name);//第一個(gè)學(xué)生printf("the %d student age is %d\n",i+1,WLW->st[i].age);printf("the %d student id is %d\n",i+1,WLW->st[i].id);printf("the %d student sex is %s\n",i+1,WLW->st[i].sex);} }int find_student(struct class_room *WLW)//查找指定學(xué)生 {int id,i; printf("請(qǐng)輸入要查找的學(xué)生id:\n");scanf("%d",&id);for(i=0;i<WLW->n;i++){if(id==WLW->st[i].id){printf("the student is exist!\n");printf("the %d student name is %s\n",i+1,WLW->st[i].name);printf("the %d student age is %d\n",i+1,WLW->st[i].age);printf("the %d student id is %d\n",i+1,WLW->st[i].id);printf("the %d student sex is %s\n",i+1,WLW->st[i].sex);return i;}}printf("the student is not exist!\n");return -1; }void remove_student(struct class_room *WLW)//刪除指定學(xué)生 {int ret,i;ret=find_student(WLW);if(ret!=-1){for(i=ret;i<WLW->n-1;i++){strcpy(WLW->st[i].name,WLW->st[i+1].name);//由于是字符串類型復(fù)制使用頭文件string.h中的strcpy復(fù)制函數(shù) WLW->st[i].age=WLW->st[i+1].age;WLW->st[i].id=WLW->st[i+1].id;strcpy(WLW->st[i].sex,WLW->st[i+1].sex);}WLW->n--;}printf("該學(xué)生已經(jīng)刪除成功!\n"); }void change_student(struct class_room *WLW)//修改學(xué)生信息 {int ret,choose;ret=find_student(WLW);if(ret!=-1){loop1:printf("修改學(xué)生信息的哪一項(xiàng)?\n");printf("1、姓名\n");printf("2、年齡\n");printf("3、id\n");printf("4、性別\n");scanf("%d",&choose);switch(choose){case 1:printf("請(qǐng)輸入新的學(xué)生姓名:\n");scanf("%s",WLW->st[ret].name);//輸出的代表首地址,所以不需要&取地址 break;case 2:printf("請(qǐng)輸入新的學(xué)生年齡:\n");scanf("%d",&WLW->st[ret].age);break;case 3:printf("請(qǐng)輸入新的學(xué)生id:\n");scanf("%d",&WLW->st[ret].id);break;case 4: printf("請(qǐng)輸入新的學(xué)生性別:\n");scanf("%s",WLW->st[ret].sex);break;default:printf("輸出錯(cuò)誤,請(qǐng)重新輸入!\n");goto loop1;}} }int main() {struct class_room WLW;//定義一個(gè)班級(jí)為WLW存儲(chǔ)學(xué)生 WLW.n=0;//初始化,學(xué)生人數(shù)為0 while(1)//無限循環(huán) {loop:printf_menu();//調(diào)用主菜單函數(shù)輸出主菜單int choose;//定義一個(gè)序號(hào)scanf("%d",&choose);switch(choose){case 1:add_student(&WLW);//添加學(xué)生break;case 2:show_student(&WLW);//顯示學(xué)生break;case 3:find_student(&WLW);//查詢學(xué)生break;case 4:remove_student(&WLW);//刪除學(xué)生break; case 5:change_student(&WLW);//修改學(xué)生break;case 6:return 0;//退出程序default://若輸出錯(cuò)誤的序號(hào),則跳轉(zhuǎn)至重新輸出printf("輸出錯(cuò)誤,請(qǐng)重新輸入!\n");goto loop; }} }四、運(yùn)行結(jié)果
運(yùn)行結(jié)果:
添加三個(gè)學(xué)生的信息,第一個(gè)學(xué)生:
第二個(gè)學(xué)生:
第三個(gè)學(xué)生:
顯示所有學(xué)生信息:
查詢學(xué)生信息,例查詢id為100的學(xué)生:
查詢學(xué)生信息,例查詢一個(gè)不存在的學(xué)生,查詢id為103的學(xué)生:
刪除學(xué)生信息,刪除id為102和105的學(xué)生,其中id為105的學(xué)生不存在:
修改id為100的學(xué)生姓名為yyy:
修改后的所有學(xué)生信息:
退出程序:
總結(jié)
以上是生活随笔為你收集整理的C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web前端开发笔记——第四章 JavaS
- 下一篇: java信息管理系统总结_java实现科