C語言學(xué)完了,知識很多,也很瑣碎,學(xué)生信息管理系統(tǒng)對我們而言,就是一次機會,一次讓我們將C語言知識融會貫通的機會,通過編程學(xué)生信息管理系統(tǒng),我們運用了循環(huán)、指針,結(jié)構(gòu)體,鏈表、函數(shù)、文件等知識,也能讓我們更加熟悉了C語言相關(guān)知識。話不多說,直接開始。
一、思路學(xué)生信息管理系統(tǒng),說難也難,說簡單也簡單,對于初學(xué)者的我們也算一項不小的挑戰(zhàn)了,對于這個系統(tǒng),它的功能等等很多,所以我們需要有一個大概的思路,來讓我們更好的完成它。
1、流程圖2、代碼根據(jù)這個流程圖,我們先做好一個大概的框架,然后再一部分一部分的補全即可。
(1)登錄界面將學(xué)生信息管理系統(tǒng)的功能鍵選擇的提示信息打印出來,就組成了一個簡易的登錄界面:
void welcome()
{printf("****************************************************************\n");
printf("*********** 學(xué)生成績管理系統(tǒng) ***********\n");
printf("*********** 1 ---- 增加學(xué)生信息 ***********\n");
printf("*********** 2 ---- 刪除學(xué)生信息 ***********\n");
printf("*********** 3 ---- 修改學(xué)生信息 ***********\n");
printf("*********** 4 ---- 查詢學(xué)生信息 ***********\n");
printf("*********** 5 ---- 輸出學(xué)生信息 ***********\n");
printf("*********** 6 ---- 排序?qū)W生信息 ***********\n");
printf("*********** 0 ---- 退出管理系統(tǒng) ***********\n");
printf("****************************************************************\n");
printf("請選擇想要實現(xiàn)的功能(數(shù)字):");
}
運行結(jié)果為:
一共七個功能,為了程序的可讀性,我們盡量使用其英語全拼,
#include// 主菜單界面
void welcome();
// 增加學(xué)生信息
void Add();
// 刪除學(xué)生信息
void Delete();
// 修改學(xué)生信息
void Fix();
// 查詢學(xué)生信息
void Search();
// 輸出學(xué)生信息
void print();
// 排序?qū)W生信息
void Sort();
// 退出管理系統(tǒng)
void goodbye();
int main()
{int choice = 0;
while (true)
{welcome();
scanf("%d", &choice);
switch (choice)
{case 1:// 增加學(xué)生信息
Add();
break;
case 2:// 刪除學(xué)生信息
Delete();
break;
case 3:// 修改學(xué)生信息
Fix();
break;
case 4:// 查詢學(xué)生信息
Search();
break;
case 5:// 輸出學(xué)生信息
print();
break;
case 6:// 排序?qū)W生信息
Sort();
break;
case 0:// 退出管理系統(tǒng)
goodbye();
break;
}
printf("是否需要繼續(xù)操作?(Yes:1 / No:0):");
scanf("%d", &choice);
if (choice == 0)
{ break;
}
}
return 0;
}
void welcome()
{printf("****************************************************************\n");
printf("*********** 學(xué)生成績管理系統(tǒng) ***********\n");
printf("*********** 1 ---- 增加學(xué)生信息 ***********\n");
printf("*********** 2 ---- 刪除學(xué)生信息 ***********\n");
printf("*********** 3 ---- 修改學(xué)生信息 ***********\n");
printf("*********** 4 ---- 查詢學(xué)生信息 ***********\n");
printf("*********** 5 ---- 輸出學(xué)生信息 ***********\n");
printf("*********** 6 ---- 排序?qū)W生信息 ***********\n");
printf("*********** 0 ---- 退出管理系統(tǒng) ***********\n");
printf("****************************************************************\n");
printf("請選擇想要實現(xiàn)的功能(數(shù)字):");
}
// 增加學(xué)生信息
void Add()
{}
// 刪除學(xué)生信息
void Delete()
{}
// 修改學(xué)生信息
void Fix()
{}
// 查詢學(xué)生信息
void Search()
{}
// 輸出學(xué)生信息
void print()
{}
// 排序?qū)W生信息
void Sort()
{}
// 退出管理系統(tǒng)
void goodbye()
{}
運行結(jié)果為:
對于登錄界面,信息會不斷輸出,所以我們在 welcome()函數(shù)中加入一行代碼
system("cls");
其對應(yīng)的頭文件為:windows.h
功能為:清屏
這樣我們的學(xué)生信息系統(tǒng)在使用時,就會更加的簡潔。
二、分布實現(xiàn) 1、定義結(jié)構(gòu)體我們存儲學(xué)生信息用到的是鏈表,所以我們首先要定義結(jié)構(gòu)體,來創(chuàng)建鏈表。(信息可以自行定義)
typedef struct Node
{int ID;// 學(xué)號
char Name[50];// 姓名
char Sex[10];// 性別
char Class[50];// 班級
char Room[20];// 宿舍號
int Score;// 成績
struct Node* next;// 指針域
}node;
node list;// 鏈表
2、文件讀取運用文件的相關(guān)知識,我們就可以將之前已經(jīng)在文件中寫的一部分信息,保存在文件中,當(dāng)我們要讀取它們的時候,從文件中讀取它們,并將它們放入鏈表中,不用擔(dān)心每次打開信息就會丟失的問題。
這里就需要用到文件的讀取以及鏈表的插入相關(guān)的知識點。
這里文件的讀取,我選擇的是 fscanf () 函數(shù),而鏈表的插入我選擇的是尾插法。
代碼如下:
// 讀取文件
int Read_FILE(node* L)
{FILE* pfRead = fopen("student_information.txt", "r");
node st;
node* s;
node* t = L;
if (pfRead == NULL)
{return 0;
}
while (fscanf(pfRead, "%d %s %s %s %s %d", &st.ID, st.Name, st.Sex, st.Class, st.Room, &st.Score) != EOF)
{s = (node*)malloc(sizeof(node));
*s = st;
// 尾插法
t->next = s;
t = s;
t->next = NULL;
}
return 1;
}
3、輸出學(xué)生信息先從簡單的部分入手,讀取學(xué)生信息,我們只需要對鏈表進行一次遍歷即可,注意要判斷鏈表是否為空。
將功能和界面分開做更有利于我們快速完成:
(1)功能實現(xiàn)// 輸出學(xué)生信息
void Print(node* L)
{system("cls");
node* p = L->next;
Print_Printf();
if (p != NULL)
{while (p != NULL)
{ printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", p->ID, p->Name, p->Sex, p->Class, p->Room, p->Score);
printf("________________________________________________________________\n");
p = p->next;
}
}
}
(2)輸出界面void Print_Printf()
{printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
}
運行結(jié)果如下:
①選擇輸出學(xué)生信息
②輸出界面
完成輸出函數(shù)以后,我們需要繼續(xù)完成增加函數(shù),由于之前在文件讀取中,我們使用了尾插法,為了起到練習(xí)的作業(yè),我們現(xiàn)在使用頭插法添加學(xué)生信息。
我們將功能和界面分開來做:
(1)功能實現(xiàn)void Add(node* L, node e)
{// 頭插法
node* p = L;
node* s = (node*)malloc(sizeof(node));
*s = e;
s->next = p->next;
p->next = s;
}
(2)輸出界面// 增加學(xué)生信息
void Add_Printf()
{system("cls");
node st;
printf("請輸入新增學(xué)生的相關(guān)信息:\n");
printf("學(xué)號:");
scanf("%d", &st.ID);
printf("姓名:");
scanf("%s", st.Name);
printf("性別:");
scanf("%s", st.Sex);
printf("班級:");
scanf("%s", st.Class);
printf("宿舍號:");
scanf("%s", st.Room);
printf("成績:");
scanf("%d", &st.Score);
Add(&list, st);
}
運行結(jié)果為:
①選擇添加學(xué)生信息
②輸出添加學(xué)生的相關(guān)信息
③選擇輸出學(xué)生信息
④輸出界面
剛剛我們完成了增加學(xué)生信息,嘗試過的同學(xué)可能已經(jīng)發(fā)現(xiàn)了,當(dāng)我們關(guān)閉程序的時候,我們之前添加的信息并不會保存下來,所以就需要用到了文件來進行信息保存。
代碼如下:
// 保存文件
int Save_FILE(node* L)
{FILE* pfWrite = fopen("student_information.txt", "w");
if (pfWrite == NULL)
{return 0;
}
node* p = L->next;
while (p != NULL)
{fprintf(pfWrite, " %d %s %s %s %s %d\n", p->ID, p->Name, p->Sex, p->Class, p->Room, p->Score);
p = p->next;
}
return 1;
}
然后我們將這個文件保存的函數(shù)放在添加函數(shù)的最后:
void Add(node* L, node e)
{// 頭插法
node* p = L;
node* s = (node*)malloc(sizeof(node));
*s = e;
s->next = p->next;
p->next = s;
Save_FILE(L);
}
這樣我們添加的學(xué)生信息就可以存放在文件中了。
6、查詢學(xué)生信息同樣的,還是將功能和界面分開做,這里的查詢功能有兩種方式,分別通過學(xué)號、姓名查找學(xué)生信息,鑒于后邊的修改、刪除函數(shù)同樣需要用到查詢,所以我們在信息查詢完成后會返回其前一個節(jié)點的位置。
(1)輸出界面// 查詢學(xué)生信息
void Search_Printf(node* L)
{system("cls");
int choice = 0;
printf("按照學(xué)號查詢 ---- 1\n");
printf("按照姓名查詢 ---- 2\n");
printf("請輸入查詢方式:");
scanf("%d", &choice);
int id;
char name[50];
node* st;
if (choice == 1)
{printf("請輸入要查詢的學(xué)號:");
scanf("%d", &id);
st = Search(id, L);
if (st == NULL)
{ printf("查無此人!\n");
}
else
{ printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
}
}
else if (choice == 2)
{printf("請輸入要查詢的姓名:");
scanf("%s", name);
st = Search(name, L);
if (st == NULL)
{ printf("查無此人!\n");
}
else
{ st = st->next;
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
}
}
}
(2)功能實現(xiàn)
① 按照學(xué)號查找// 按學(xué)號進行查找
node* Search_id(int id, node* L)
{node* p = L;
while (p->next != NULL)
{if (p->next->ID == id)
{ return p;
}
p = p->next;
}
return NULL;
}
② 按照姓名查找注意 strcmp 函數(shù)需要頭文件 string.h
// 按姓名進行查找
node* Search_name(char name[], node* L)
{node* p = L;
while (p->next != NULL)
{if (strcmp(name,p->next->Name))
{ return p;
}
p = p->next;
}
return NULL;
}
運行結(jié)果為:
①按照學(xué)號查詢
②按照姓名查詢
// 修改學(xué)生信息
void Fix(node* L)
{system("cls");
int id;
printf("請輸入要查找的學(xué)生的學(xué)號:");
scanf("%d", &id);
node* st = Search_id(id, L);
if (st == NULL)
{printf("查無此人!\n");
return;
}
st = st->next;
int choice = 0;
while (1)
{system("cls");
// 輸出一次所要修改的學(xué)生成績
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
printf("修改姓名 ---- 1\n");
printf("修改性別 ---- 2\n");
printf("修改班級 ---- 3\n");
printf("修改宿舍號 ---- 4\n");
printf("修改成績 ---- 5\n");
printf("請輸入要修改的信息:");
scanf("%d", &choice);
switch (choice)
{case 1:
printf("請輸入姓名:");
scanf("%s", st->Name);
break;
case 2:
printf("請輸入性別:");
scanf("%s", st->Sex);
break;
case 3:
printf("請輸入班級:");
scanf("%s", st->Class);
break;
case 4:
printf("請輸入宿舍號:");
scanf("%s", st->Room);
break;
case 5:
printf("請輸入成績:");
scanf("%d", st->Score);
break;
}
printf("是否繼續(xù)修改該學(xué)生信息?(Yes:1 / No:0):");
scanf("%d", &choice);
if (choice == 0)
{ break;
}
}
// 修改完成后該學(xué)生的信息
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
// 保存信息
Save_FILE(L);
}
運行結(jié)果為:
這里運用到的是鏈表的刪除的相關(guān)知識點。
(1)輸出界面// 刪除學(xué)生信息
void Delete_Printf(node* L)
{system("cls");
int id;
node* p;
printf("請輸入要刪除的學(xué)生的學(xué)號:");
scanf("%d", &id);
node* st = Search_id(id, L);
p = st;
if (st == NULL)
{printf("查無此人!\n");
return;
}
st = st->next;
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
Delete(p);
// 保存信息
Save_FILE(L);
}
(2)功能實現(xiàn)void Delete(node* s)
{node* t = s->next;
s->next = t->next;
t->next = NULL;
free(t);
}
運行結(jié)果為:
再次嘗試
說明刪除成功!
排序這里主要還是注意鏈表的交換,涉及到數(shù)據(jù)域的交換與指針域的交換。
// 排序?qū)W生信息
void Sort(node* L)
{system("cls");
int choice = 0;
printf("按照學(xué)號從大到小排序 ---- 1\n");
printf("按照學(xué)號從小到大排序 ---- 2\n");
printf("按照成績從大到小排序 ---- 3\n");
printf("按照成績從小到大排序 ---- 4\n");
printf("請選擇排序方式:");
scanf("%d", &choice);
int flag = 0;
for (node* p = L->next; p != NULL; p = p->next)
{for (node* q = p; q != NULL; q = q->next)
{ switch (choice)
{ case 1:
if (!cmp_big_ID(*p, *q))
{flag = 1;
}
break;
case 2:
if (!cmp_small_ID(*p, *q))
{flag = 1;
}
break;
case 3:
if (!cmp_big_Score(*p, *q))
{flag = 1;
}
break;
case 4:
if (!cmp_small_Score(*p, *q))
{flag = 1;
}
break;
}
if (flag == 1)
{ // 交換數(shù)據(jù)域
node t = *p;
*p = *q;
*q = t;
// 處理指針域
t.next = p->next;
p->next = q->next;
q->next = t.next;
flag = 0;
}
}
}
}
// 學(xué)號從大到小
bool cmp_big_ID(node e1, node e2)
{return e1.ID >e2.ID;
}
// 成績從大到小
bool cmp_big_Score(node e1, node e2)
{return e1.Score >e2.Score;
}
// 學(xué)號從小到大
bool cmp_small_ID(node e1, node e2)
{return e1.ID< e2.ID;
}
// 成績從小到大
bool cmp_small_Score(node e1, node e2)
{return e1.Score< e2.Score;
}
運行結(jié)果為:
①學(xué)號從大到?。?br />
②學(xué)號從小到大:
③成績從小到大:
④成績從小到大:
終于!??!到了最激動人心的時刻了,我們的學(xué)生信息管理系統(tǒng)要做完了,萬事俱備只欠東風(fēng)!
注意:exit(0)表示正常運行程序并退出程序。
// 退出管理系統(tǒng)
void goodbye()
{system("cls");
printf("歡迎下次使用學(xué)生信息管理系統(tǒng)!");
exit(0);// 結(jié)束程序
}
三、完整代碼#include#include#include#includetypedef struct Node
{int ID;// 學(xué)號
char Name[50];// 姓名
char Sex[10];// 性別
char Class[50];// 班級
char Room[20];// 宿舍號
int Score;// 成績
struct Node* next;// 指針域
}node;
node list;// 鏈表
// 讀取文件
int Read_FILE(node* L);
// 保存文件
int Save_FILE(node* L);
// 主菜單界面
void welcome();
// 增加學(xué)生信息
void Add(node *L,node e);// 功能
void Add_Printf();// 界面
// 刪除學(xué)生信息
void Delete_Printf(node*L);// 界面
void Delete(node* s);// 功能
// 修改學(xué)生信息
void Fix(node *L);
// 查詢學(xué)生信息
void Search_Printf(node* L);// 界面
node* Search_id(int id, node* L);// 按學(xué)號進行查找
node* Search_name(char name[], node* L);// 按姓名進行查找
// 輸出學(xué)生信息
void Print(node* L);// 功能
void Print_Printf();// 界面
// 排序?qū)W生信息
void Sort(node* L);
bool cmp_big_ID(node e1, node e2);// 學(xué)號從大到小
bool cmp_big_Score(node e1, node e2);// 成績從大到小
bool cmp_small_ID(node e1, node e2);// 學(xué)號從小到大
bool cmp_small_Score(node e1, node e2);// 成績從小到大
// 退出管理系統(tǒng)
void goodbye();
int main()
{int choice = 0;
Read_FILE(&list);
while (true)
{welcome();
scanf("%d", &choice);
switch (choice)
{case 1:// 增加學(xué)生信息
Add_Printf();
break;
case 2:// 刪除學(xué)生信息
Delete_Printf(&list);
break;
case 3:// 修改學(xué)生信息
Fix(&list);
break;
case 4:// 查詢學(xué)生信息
Search_Printf(&list);
break;
case 5:// 輸出學(xué)生信息
Print(&list);
break;
case 6:// 排序?qū)W生信息
Sort(&list);
break;
case 0:// 退出管理系統(tǒng)
goodbye();
break;
}
printf("是否需要繼續(xù)操作?(Yes:1 / No:0):");
scanf("%d", &choice);
if (choice == 0)
{ break;
}
}
return 0;
}
void welcome()
{system("cls");
printf("****************************************************************\n");
printf("*********** 學(xué)生成績管理系統(tǒng) ***********\n");
printf("*********** 1 ---- 增加學(xué)生信息 ***********\n");
printf("*********** 2 ---- 刪除學(xué)生信息 ***********\n");
printf("*********** 3 ---- 修改學(xué)生信息 ***********\n");
printf("*********** 4 ---- 查詢學(xué)生信息 ***********\n");
printf("*********** 5 ---- 輸出學(xué)生信息 ***********\n");
printf("*********** 6 ---- 排序?qū)W生信息 ***********\n");
printf("*********** 0 ---- 退出管理系統(tǒng) ***********\n");
printf("****************************************************************\n");
printf("請選擇想要實現(xiàn)的功能(數(shù)字):");
}
// 讀取文件
int Read_FILE(node* L)
{FILE* pfRead = fopen("student_information.txt", "r");
node st;
node* s;
node* t = L;
if (pfRead == NULL)
{return 0;
}
while (fscanf(pfRead, "%d %s %s %s %s %d", &st.ID, st.Name, st.Sex, st.Class, st.Room, &st.Score) != EOF)
{s = (node*)malloc(sizeof(node));
*s = st;
// 尾插法
t->next = s;
t = s;
t->next = NULL;
}
return 1;
}
// 保存文件
int Save_FILE(node* L)
{FILE* pfWrite = fopen("student_information.txt", "w");
if (pfWrite == NULL)
{return 0;
}
node* p = L->next;
while (p != NULL)
{fprintf(pfWrite, " %d %s %s %s %s %d\n", p->ID, p->Name, p->Sex, p->Class, p->Room, p->Score);
p = p->next;
}
return 1;
}
// 增加學(xué)生信息
void Add_Printf()
{system("cls");
node st;
printf("請輸入新增學(xué)生的相關(guān)信息:\n");
printf("學(xué)號:");
scanf("%d", &st.ID);
printf("姓名:");
scanf("%s", st.Name);
printf("性別:");
scanf("%s", st.Sex);
printf("班級:");
scanf("%s", st.Class);
printf("宿舍號:");
scanf("%s", st.Room);
printf("成績:");
scanf("%d", &st.Score);
Add(&list, st);
}
void Add(node* L, node e)
{// 頭插法
node* p = L;
node* s = (node*)malloc(sizeof(node));
*s = e;
s->next = p->next;
p->next = s;
Save_FILE(L);
}
// 刪除學(xué)生信息
void Delete_Printf(node* L)
{system("cls");
int id;
node* p;
printf("請輸入要刪除的學(xué)生的學(xué)號:");
scanf("%d", &id);
node* st = Search_id(id, L);
p = st;
if (st == NULL)
{printf("查無此人!\n");
return;
}
st = st->next;
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
Delete(p);
// 保存信息
Save_FILE(L);
}
void Delete(node* s)
{node* t = s->next;
s->next = t->next;
t->next = NULL;
free(t);
}
// 修改學(xué)生信息
void Fix(node* L)
{system("cls");
int id;
printf("請輸入要修改的學(xué)生的學(xué)號:");
scanf("%d", &id);
node* st = Search_id(id, L);
if (st == NULL)
{printf("查無此人!\n");
return;
}
st = st->next;
int choice = 0;
while (1)
{system("cls");
// 輸出一次所要修改的學(xué)生成績
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
printf("修改姓名 ---- 1\n");
printf("修改性別 ---- 2\n");
printf("修改班級 ---- 3\n");
printf("修改宿舍號 ---- 4\n");
printf("修改成績 ---- 5\n");
printf("請輸入要修改的信息:");
scanf("%d", &choice);
switch (choice)
{case 1:
printf("請輸入姓名:");
scanf("%s", st->Name);
break;
case 2:
printf("請輸入性別:");
scanf("%s", st->Sex);
break;
case 3:
printf("請輸入班級:");
scanf("%s", st->Class);
break;
case 4:
printf("請輸入宿舍號:");
scanf("%s", st->Room);
break;
case 5:
printf("請輸入成績:");
scanf("%d", st->Score);
break;
}
printf("是否繼續(xù)修改該學(xué)生信息?(Yes:1 / No:0):");
scanf("%d", &choice);
if (choice == 0)
{ break;
}
}
// 修改完成后該學(xué)生的信息
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
// 保存信息
Save_FILE(L);
}
// 查詢學(xué)生信息
void Search_Printf(node* L)
{system("cls");
int choice = 0;
printf("按照學(xué)號查詢 ---- 1\n");
printf("按照姓名查詢 ---- 2\n");
printf("請輸入查詢方式:");
scanf("%d", &choice);
int id;
char name[50];
node* st;
if (choice == 1)
{printf("請輸入要查詢的學(xué)號:");
scanf("%d", &id);
st = Search_id(id, L);
if (st == NULL)
{ printf("查無此人!\n");
}
else
{ st = st->next;
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
}
}
else if (choice == 2)
{printf("請輸入要查詢的姓名:");
scanf("%s", name);
st = Search_name(name, L);
if (st == NULL)
{ printf("查無此人!\n");
}
else
{ st = st->next;
printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", st->ID, st->Name, st->Sex, st->Class, st->Room, st->Score);
printf("________________________________________________________________\n");
}
}
}
// 按學(xué)號進行查找
node* Search_id(int id, node* L)
{node* p = L;
while (p->next != NULL)
{if (p->next->ID == id)
{ return p;
}
p = p->next;
}
return NULL;
}
// 按姓名進行查找
node* Search_name(char name[], node* L)
{node* p = L;
while (p->next != NULL)
{if (strcmp(name, p->next->Name) == 0)
{ return p;
}
p = p->next;
}
return NULL;
}
// 輸出學(xué)生信息
void Print(node* L)
{system("cls");
node* p = L->next;
Print_Printf();
if (p != NULL)
{while (p != NULL)
{ printf("________________________________________________________________\n");
printf("%d|%s\t|%s\t|%s\t|%s\t|%d\t|\n", p->ID, p->Name, p->Sex, p->Class, p->Room, p->Score);
printf("________________________________________________________________\n");
p = p->next;
}
}
}
void Print_Printf()
{printf("________________________________________________________________\n");
printf("|學(xué)號\t|姓名\t|性別\t|班級\t\t|宿舍號\t\t|成績\t|\n");
printf("________________________________________________________________\n");
}
// 排序?qū)W生信息
void Sort(node* L)
{system("cls");
int choice = 0;
printf("按照學(xué)號從大到小排序 ---- 1\n");
printf("按照學(xué)號從小到大排序 ---- 2\n");
printf("按照成績從大到小排序 ---- 3\n");
printf("按照成績從小到大排序 ---- 4\n");
printf("請選擇排序方式:");
scanf("%d", &choice);
int flag = 0;
for (node* p = L->next; p != NULL; p = p->next)
{for (node* q = p; q != NULL; q = q->next)
{ switch (choice)
{ case 1:
if (!cmp_big_ID(*p, *q))
{flag = 1;
}
break;
case 2:
if (!cmp_small_ID(*p, *q))
{flag = 1;
}
break;
case 3:
if (!cmp_big_Score(*p, *q))
{flag = 1;
}
break;
case 4:
if (!cmp_small_Score(*p, *q))
{flag = 1;
}
break;
}
if (flag == 1)
{ // 交換數(shù)據(jù)域
node t = *p;
*p = *q;
*q = t;
// 處理指針域
t.next = p->next;
p->next = q->next;
q->next = t.next;
flag = 0;
}
}
}
}
// 學(xué)號從大到小
bool cmp_big_ID(node e1, node e2)
{return e1.ID >e2.ID;
}
// 成績從大到小
bool cmp_big_Score(node e1, node e2)
{return e1.Score >e2.Score;
}
// 學(xué)號從小到大
bool cmp_small_ID(node e1, node e2)
{return e1.ID< e2.ID;
}
// 成績從小到大
bool cmp_small_Score(node e1, node e2)
{return e1.Score< e2.Score;
}
// 退出管理系統(tǒng)
void goodbye()
{system("cls");
printf("歡迎下次使用學(xué)生信息管理系統(tǒng)!");
exit(0);// 結(jié)束程序
}
總結(jié)到此,學(xué)生管理系統(tǒng)的代碼部分就結(jié)束了,耗時9個小時,代碼+博客終于完成了,也算是有了滿滿的成就感,希望可以幫助到大家。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧