通過c語言設計一個學生管理系統,要求有直觀的主選單,可以錄入學生的資訊,實現新增學生資訊、顯示學生資訊、查詢學生資訊、刪除學生資訊、修改學生資訊以及退出等功能。
1、首先因為學生有以下幾個基本資訊:姓名、年齡、學號、性別,依次由name、age、id和sex來表示,所以可以通過結構體實現,struct語句定義儲存不同型別的資料項,定義一個結構體名為student,用於儲存每個學生的資訊,另外定義一個結構體名為class_room班級,它包含了結構體student的變數初始化st,用於儲存學生以及當前班級人數,且定義學生最大人數為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]; //定義多個學生
int n; //當前班級的人數
};
2、由於是顯示一個管理系統,所以我們設計一個主選單,通過定義一個函數printf_menu()來實現這個功能,如下程式碼:
//列印主選單函數
void printf_menu()//列印主選單函數
{
printf(" 學生管理系統 \n");
printf("----------------------------\n");
printf("|1、新增學生資訊 |\n");
printf("|2、顯示所有學生資訊 |\n");
printf("|3、查詢學生資訊 |\n");
printf("|4、刪除學生資訊 |\n");
printf("|5、修改學生資訊 |\n");
printf("|6、退出 |\n");
printf("----------------------------\n");
printf("請輸入相應的序號選擇! \n");
}
3、因為要通過輸入相應的序號來選擇相應的功能,所以可以在主函數中通過一個switch()語句來實現,若要使程式一直執行下去,通過使用者輸入退出才退出程式,即設定一個while(1)無限迴圈下去,另外還要設定一個loop語句,通過goto語句,即若輸入錯誤的序號即跳到選擇序號的頁面。
存取結構的成員,通過使用運運算元.
來實現,即WLW.n=0,表示初始化班級WLW的成員n,而&WLW表示取WLW的地址,取出其對應儲存空間的值,即儲存的學生,另外若想使用指向該結構的指標來存取結構體,通過操作符->
實現。
如以下程式碼:
//主函數
int main()
{
struct class_room WLW;//定義一個班級為WLW儲存學生
WLW.n=0;//初始化,學生人數為0
while(1)//無限迴圈
{
loop:
printf_menu();//呼叫主選單函數輸出主選單
int choose;//定義一個序號
scanf("%d",&choose);
switch(choose)
{
case 1:
add_student(&WLW);//新增學生
break;
case 2:
show_student(&WLW);//顯示學生
break;
case 3:
find_student(&WLW);//查詢學生
break;
case 4:
remove_student(&WLW);//刪除學生
break;
case 5:
change_student(&WLW);//修改學生
break;
case 6:
return 0;//退出程式
default://若輸出錯誤的序號,則跳轉至重新輸出
printf("輸出錯誤,請重新輸入!\n");
goto loop;
}
}
}
1、定義一個add_student()函數新增學生資訊,引數為struct class_room *WLW,即結構體指標變數。姓名和性別由於是字串型別,所以scanf()中通過%s
格式符表示,年齡和id它們的地址是班級WLW當前學生的相應資訊,由於陣列名代表首地址這裡不用&,另外每次新增後,當前班級的人數n++,如下程式碼:
//新增學生資訊
void add_student(struct class_room *WLW)
{
printf("請輸入學生的姓名:\n");
scanf("%s",WLW->st[WLW->n].name); //陣列名代表首地址
printf("請輸入學生的年齡:\n");
scanf("%d",&WLW->st[WLW->n].age); //取變數的地址
printf("請輸入學生的id:\n");
scanf("%d",&WLW->st[WLW->n].id);
printf("請輸入學生的性別:\n");
scanf("%s",WLW->st[WLW->n].sex);
WLW->n++;//班級人數加一
}
2、定義一個show_student()函數顯示學生資訊,即顯示當前班級的所有學生資訊,其中WLW->n為當前班級的人數,如下程式碼:
//顯示學生資訊
void show_student(struct class_room *WLW)
{
int i;
for(i=0;i<WLW->n;i++)//WLW->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);
}
}
3、定義一個find_student()函數查詢學生資訊,通過輸入學生id查詢學生的資訊,若存在則通過迴圈依次輸出該學生的資訊:
//查詢學生
int find_student(struct class_room *WLW)
{
int id,i;
printf("請輸入要查詢的學生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、定義一個remove_student()函數刪除學生資訊,這裡首先定義一個引數ret,並呼叫find_student(WLW)查詢要刪除的學生是否在其中,如果返回值為-1,則進行覆蓋,即要刪除的學生資訊被後面的學生資訊所覆蓋,另外其中由於於是字串型別複製時通過使用標頭檔案string.h中的strcpy複製函數從而實現覆蓋的功能,然後當前班級學生人數減一:
//刪除指定學生
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);//由於是字串型別複製使用標頭檔案string.h中的strcpy複製函數
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("該學生已經刪除成功!\n");
}
5、定義一個change_student()函數修改學生資訊,因為學生學習有四項,所以這裡通過switch語句、goto語句來實現,定義ret引數呼叫find_student(WLW)查詢要刪除的學生是否在其中,然後再修改:
//修改學生資訊
void change_student(struct class_room *WLW)
{
int ret,choose;
ret=find_student(WLW);
if(ret!=-1)
{
loop1:
printf("修改學生資訊的哪一項?\n");
printf("1、姓名\n");
printf("2、年齡\n");
printf("3、id\n");
printf("4、性別\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("請輸入新的學生姓名:\n");
scanf("%s",WLW->st[ret].name);//輸出的代表首地址,所以不需要&取地址
break;
case 2:
printf("請輸入新的學生年齡:\n");
scanf("%d",&WLW->st[ret].age);
break;
case 3:
printf("請輸入新的學生id:\n");
scanf("%d",&WLW->st[ret].id);
break;
case 4:
printf("請輸入新的學生性別:\n");
scanf("%s",WLW->st[ret].sex);
break;
default:
printf("輸出錯誤,請重新輸入!\n");
goto loop1;
}
}
}
以下是完整的程式程式碼:
/*學生管理系統*/
#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]; //定義多個學生
int n; //當前班級的人數
};
void printf_menu()//列印主選單函數
{
printf(" 學生管理系統 \n");
printf("----------------------------\n");
printf("|1、新增學生資訊 |\n");
printf("|2、顯示所有學生資訊 |\n");
printf("|3、查詢學生資訊 |\n");
printf("|4、刪除學生資訊 |\n");
printf("|5、修改學生資訊 |\n");
printf("|6、退出 |\n");
printf("----------------------------\n");
printf("請輸入相應的序號選擇! \n");
}
void add_student(struct class_room *WLW)//新增學生資訊,其中struct class_room *WLW為結構體指標
{
printf("請輸入學生的姓名:\n");
scanf("%s",WLW->st[WLW->n].name); //陣列名代表首地址
printf("請輸入學生的年齡:\n");
scanf("%d",&WLW->st[WLW->n].age); //取變數的地址
printf("請輸入學生的id:\n");
scanf("%d",&WLW->st[WLW->n].id);
printf("請輸入學生的性別:\n");
scanf("%s",WLW->st[WLW->n].sex);
WLW->n++;//班級人數加一
}
void show_student(struct class_room *WLW)//顯示所有學生資訊
{
int i;
for(i=0;i<WLW->n;i++)//WLW->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);
}
}
int find_student(struct class_room *WLW)//查詢指定學生
{
int id,i;
printf("請輸入要查詢的學生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)//刪除指定學生
{
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);//由於是字串型別複製使用標頭檔案string.h中的strcpy複製函數
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("該學生已經刪除成功!\n")
}
void change_student(struct class_room *WLW)//修改學生資訊
{
int ret,choose;
ret=find_student(WLW);
if(ret!=-1)
{
loop1:
printf("修改學生資訊的哪一項?\n");
printf("1、姓名\n");
printf("2、年齡\n");
printf("3、id\n");
printf("4、性別\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("請輸入新的學生姓名:\n");
scanf("%s",WLW->st[ret].name);//輸出的代表首地址,所以不需要&取地址
break;
case 2:
printf("請輸入新的學生年齡:\n");
scanf("%d",&WLW->st[ret].age);
break;
case 3:
printf("請輸入新的學生id:\n");
scanf("%d",&WLW->st[ret].id);
break;
case 4:
printf("請輸入新的學生性別:\n");
scanf("%s",WLW->st[ret].sex);
break;
default:
printf("輸出錯誤,請重新輸入!\n");
goto loop1;
}
}
}
int main()
{
struct class_room WLW;//定義一個班級為WLW儲存學生
WLW.n=0;//初始化,學生人數為0
while(1)//無限迴圈
{
loop:
printf_menu();//呼叫主選單函數輸出主選單
int choose;//定義一個序號
scanf("%d",&choose);
switch(choose)
{
case 1:
add_student(&WLW);//新增學生
break;
case 2:
show_student(&WLW);//顯示學生
break;
case 3:
find_student(&WLW);//查詢學生
break;
case 4:
remove_student(&WLW);//刪除學生
break;
case 5:
change_student(&WLW);//修改學生
break;
case 6:
return 0;//退出程式
default://若輸出錯誤的序號,則跳轉至重新輸出
printf("輸出錯誤,請重新輸入!\n");
goto loop;
}
}
}
執行結果:
新增三個學生的資訊,第一個學生:
第二個學生:
第三個學生:
顯示所有學生資訊:
查詢學生資訊,例查詢id為100的學生:
查詢學生資訊,例查詢一個不存在的學生,查詢id為103的學生:
刪除學生資訊,刪除id為102和105的學生,其中id為105的學生不存在:
修改id為100的學生姓名為yyy:
修改後的所有學生資訊:
退出程式: