資料結構課程設計——學生資訊管理系統
阿新 • • 發佈:2018-12-26
/*Copyright (c)2017,煙臺大學計算機與控制工程學院
*All rights reservrd.
*作者:趙楷文
*完成時間:2017年12月20日
*版本號:v1.0
*問題描述:設計一個管理學生資訊的系統
/************************************************************* * Copyright (c) 2017, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:student.h * 檔案標識:無 * 內容概要:實現程式各種功能的函式的宣告 * 作者:趙楷文 * 完成日期:2017年12月20日 * 版本號:V1.0 *************************************************************/ #ifndef STUDENT_H_INCLUDED #define STUDENT_H_INCLUDED #include <stdio.h> #define LEN sizeof(struct Student) typedef struct Student { char name[100]; //姓名 char num[100]; //學號 char department[100] ;//院系 char sex;//性別 int age;//年齡 char phone[100];//電話號碼 char bankcard[100]; //銀行卡號 int score;//學期總成績 int banlance;//校園卡餘額 }stu; typedef struct LNode //定義單鏈表結點型別 { stu data; struct LNode *next; //指向後繼結點 }LinkList; void InitList( LinkList *&L);//初始化結點 void ListInsert(LinkList *&L,LinkList *P);//插入新的節點 void AddStu(LinkList *&L);//增加學生資訊 void DeleteStu(LinkList *L);//刪除學生資訊 void ChangeStu(LinkList *L);//更改學生資訊 void FindStu(LinkList *L);//查詢學生並輸出該生資訊(按學號查詢) void ReChange(LinkList *L);//輸入學號進行充值功能 void Sort(LinkList *L);//按成績排序排序 void DisPlay(LinkList *&L);//列出全部學生資訊 typedef struct manage//管理員 { char account[10];//賬號 char password[10];//密碼 }roots; void Save(LinkList *&L);//儲存學生資訊到檔案 void Read (LinkList *&L);//執行前把檔案內容讀取到電腦記憶體 void management();// 管理員入口 //bool check(LinkList *&L,int n);//根據學號判斷此生存在不存在 #endif // STUDENT_H_INCLUDED
/************************************************************* * Copyright (c) 2017, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:student.cpp * 檔案標識:無 * 內容概要:實現程式各個功能的函式的定義 * 作者:趙楷文 * 完成日期:2017年12月20日 * 版本號:V1.0 *************************************************************/ #include <malloc.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include "student.h" LinkList *L=NULL; char nm[100]; //姓名 char nu[100]; //學號 char depart[100] ;//院系 char se;//性別 int ag;//年齡 char ph[100];//電話號碼 char bank[100]; //銀行卡號 int sc;//學期總成績 int ba;//校園卡餘額 /********************************************************* * 功能描述: 初始化連結串列 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void InitList( LinkList *&L)//初始化連結串列 { L=(LinkList *)malloc(sizeof(LinkList)); strcpy(L->data.num,"none");//初始化學號 strcpy(L->data.name,"none");//初始化姓名 strcpy(L->data.department,"none");//初始化院系 L->data.sex=0; //初始化性別 L->data.age=0; //初始化年齡 strcpy(L->data.phone,"none");//初始化手機號 strcpy(L->data.bankcard,"none");//初始化銀行卡號 L->data.score=0; //初始化成績 L->data.banlance=0; //初始化校園卡餘額 L->next=NULL; } /********************************************************* * 功能描述: 刪除某學生的資訊 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void DeleteStu(LinkList *L) // 刪除學生資訊 { printf("請輸入所需要刪除資訊的學生學號\n"); scanf("%s",nu); LinkList *pre,*p; if(L->next==NULL) //判斷是否存在學生資訊 { printf("系統不存在任何學生資訊\n"); return; } else { pre=L; p=pre->next; int judge=0; while(p!=NULL) { if(strcmp(p->data.num,nu)==0) { judge=1; pre->next=p->next; free(p); p=NULL; printf("刪除學生資訊成功\n"); Save(L);//儲存學生資訊到檔案 break; } pre=p; p=pre->next; } if(judge==0) printf("不存在該生資訊\n"); } } /********************************************************* * 功能描述: 增加學生資訊 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void AddStu(LinkList *&L)// 增加學生資訊 { printf("請輸入需要增加學生的學號\n"); scanf("%s",nu); LinkList *q=L->next; while(q!=NULL) { if(strcmp(q->data.num,nu)==0) { printf("該生已存在\n"); break; } q=q->next; } if(q==NULL) { LinkList *p; InitList(p); strcpy(p->data.num,nu); printf("請輸入學生姓名\n"); scanf("%s",nm); strcpy(p->data.name,nm); printf("請輸入院系\n"); scanf("%s",depart); strcpy(p->data.department,depart); printf("請輸入性別\n"); scanf(" %c",&se); p->data.sex=se; printf("請輸入年齡\n"); scanf("%d",&ag); p->data.age=ag; printf("請輸入手機號碼\n"); scanf("%s",ph); strcpy(p->data.phone,ph); printf("請輸入銀行卡號\n"); scanf("%s",bank); strcpy(p->data.bankcard,bank); printf("請輸入總成績\n"); scanf("%d",&sc); p->data.score=sc; ListInsert(L,p); //將學生資訊插入連結串列中 Save(L);//儲存學生資訊到檔案 } } /********************************************************* * 功能描述: 更改學生資訊 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void ChangeStu(LinkList *L) //更改學生資訊 { printf("請輸入需要更改資訊的學生學號\n"); scanf("%s",nu); LinkList *q=L->next; int judge=0; while(q!=NULL) { if(strcmp(q->data.num,nu)==0) { judge=1; printf("*************************請輸入您要修改的資訊選項****************************\n"); printf("* *\n"); printf("* *\n"); printf("* ◆ 1.姓 名 ◆ *\n"); printf("* *\n"); printf("* ◆ 2.院 系 ◆ *\n"); printf("* *\n"); printf("* ◆ 3.性 別 ◆ *\n"); printf("* *\n"); printf("* ◆ 4.年 齡 ◆ *\n"); printf("* *\n"); printf("* ◆ 5.銀行卡號 ◆ *\n"); printf("* *\n"); printf("* ◆ 6.電話號碼 ◆ *\n"); printf("* *\n"); printf("* ◆ 7.成 績 ◆ *\n"); printf("* *\n"); printf("* *\n"); printf("**d**************************************************************************\n"); int n; scanf("%d",&n); switch(n) { case 1: printf("請輸入姓名\n"); scanf("%s",nm); strcpy(q->data.name,nm); printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 2: printf("請輸入院系\n"); scanf("%s",depart); strcpy(q->data.department,depart); printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 3: printf("請輸入性別\n"); scanf("%c",&se); q->data.sex=se; printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 4: printf("請輸入年齡\n"); scanf("%d",&ag); q->data.age=ag; printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 5: printf("請輸入銀行卡\n"); scanf("%s",bank); strcpy(q->data.bankcard,bank); printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 6: printf("請輸入電話號碼\n"); scanf("%s",ph); strcpy(q->data.phone,ph); printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; case 7: printf("請輸入成績\n"); scanf("%d",&sc); q->data.score=sc; printf("操作成功\n"); Save(L);//儲存學生資訊到檔案 break; default : printf("輸入錯誤,請輸入正確的選項\n"); break; } } q=q->next; } if(judge==0) { printf("不存在該生的資訊\n"); } } /********************************************************* * 功能描述: 按學號查詢學生資訊 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void FindStu(LinkList *L) // 查詢學生資訊(按學號) { LinkList *q=L->next; printf("請輸入需要查詢資訊的學生學號\n"); scanf("%s",nu); while(q!=NULL) { if(strcmp(q->data.num,nu)==0) { printf("姓名:%s\n",q->data.name); printf("學號:%s\n",q->data.num); printf("院系:%s\n",q->data.department); printf("性別:%c\n",q->data.sex); printf("年齡:%d\n",q->data.age); printf("電話號碼:%s\n",q->data.phone); printf("銀行卡號:%s\n",q->data.bankcard); printf("總成績:%d\n",q->data.score); printf("校園卡餘額:%d\n",q->data.banlance); break; } q=q->next; } if(q==NULL) printf("不存在該生資訊\n"); } /********************************************************* * 功能描述: 按成績排序排序 並輸出排序後的結果 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void Sort(LinkList *L)//按成績排序排序 並輸出排序後的結果 { LinkList *q,*p,*r=L->next; if(r==NULL) { printf("還沒有學生資訊,請增加學生資訊\n"); return; } while(r) //兩層迴圈完成排序 { p=r; q=r->next; LinkList *tmp;//用於排序時暫存節點 InitList(tmp); while(q!=NULL) { if(q->data.score > p->data.score) { /*先複製q結點資訊到tmp*/ strcpy(tmp->data.num,q->data.num); strcpy(tmp->data.name,q->data.name); strcpy(tmp->data.department,q->data.department); strcpy(tmp->data.phone,q->data.phone); strcpy(tmp->data.bankcard,q->data.bankcard); tmp->data.sex=q->data.sex; tmp->data.age=q->data.age; tmp->data.score=q->data.score; tmp->data.banlance=q->data.banlance; /*再複製q結點資訊到r*/ strcpy(q->data.num,p->data.num); strcpy(q->data.name,p->data.name); strcpy(q->data.department,p->data.department); strcpy(q->data.phone,p->data.phone); strcpy(q->data.bankcard,p->data.bankcard); q->data.sex=p->data.sex; q->data.age=p->data.age; q->data.score=p->data.score; q->data.banlance=p->data.banlance; /*最後複製tmp結點資訊到q*/ strcpy(p->data.num,tmp->data.num); strcpy(p->data.name,tmp->data.name); strcpy(p->data.department,tmp->data.department); strcpy(p->data.phone,tmp->data.phone); strcpy(p->data.bankcard,tmp->data.bankcard); p->data.sex=tmp->data.sex; p->data.age=tmp->data.age; p->data.score=tmp->data.score; p->data.banlance=tmp->data.banlance; } q=q->next; } r=r->next; } Save(L);//儲存學生資訊到檔案 printf("排序後的學生資訊是:\n"); DisPlay(L); } /********************************************************* * 功能描述: 充值校園卡 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void ReChange(LinkList *L) //充值校園卡 { LinkList *q=L->next; int money; printf("請輸入需要充值的學號\n"); scanf("%s",nu); if(q==NULL) printf("不存在該生資訊\n"); while(q!=NULL) { if(strcmp(q->data.num,nu)==0) { printf("請輸入需要充值的金額\n"); scanf("%d",&money); q->data.banlance=q->data.banlance+money; printf("充值成功\n"); printf("餘額為 %d元",q->data.banlance); Save(L);//儲存學生資訊到檔案 } q=q->next; } } /********************************************************* * 功能描述: 將學生所有資訊列出 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void DisPlay(LinkList *&L)// 列出所有學生資訊 { LinkList *q=L->next; if(q==NULL) { printf("操作失敗,不存在任何學生資訊\n"); return; } while(q!=NULL) { printf("學號:%s 姓名:%s 院系:%s 性別:%c 年齡:%d",q->data.num,q->data.name,q->data.department,q->data.sex,q->data.age); printf("銀行卡號:%s 電話號碼:%s 總成績:%d 校園卡餘額:%d",q->data.bankcard,q->data.phone,q->data.score,q->data.banlance); q=q->next; } } /********************************************************* * 功能描述: 將學生資訊以TXT格式儲存在當前目錄下 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void Save(LinkList * &L) //將學生資訊儲存到檔案中 { FILE *fp; LinkList *q=L->next; if((fp=fopen("student.txt","w"))==NULL)// 以可寫的方式開啟當前目錄下的.txt { printf("開啟檔案失敗"); exit(1); } while(q!=NULL) { fprintf(fp,"學號:%s 姓名:%s 院系:%s 性別:%c 年齡:%d\n",q->data.num,q->data.name,q->data.department,q->data.sex,q->data.age); fprintf(fp,"銀行卡號:%s 電話號碼:%s 總成績:%d 校園卡餘額:%d\n",q->data.bankcard,q->data.phone,q->data.score,q->data.banlance); q=q->next; } fclose(fp); } /********************************************************* * 功能描述: 將節點插入連結串列中 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 無 ************************************************************/ void ListInsert(LinkList *&L,LinkList *p) //將學生資訊插入連結串列中 { LinkList *q=NULL; q=L; if(q->next==NULL) { q->next=p; p->next=NULL; } else { p->next=q->next; q->next=p; } }
/************************************************************* * Copyright (c) 2017, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:main.cpp * 檔案標識:無 * 內容概要:進入管理系統及功能選擇 * 作者:趙楷文 * 完成日期:2017年12月20日 * 版本號:V1.0 *************************************************************/ #include <stdio.h> #include "student.h" #include <string.h> #include <stdlib.h> int main() { LinkList *L; InitList(L); char roott[100];//輸入的賬號 char passwordd[100];//輸入的密碼 roots root; strcpy(root.account,"root");//管理員賬號 strcpy(root.password,"123");//管理員密碼 printf("*************************歡迎使用學生管理系統**************************\n"); printf("* *\n"); printf("* *\n"); printf("* 賬號: "); scanf("%s",roott); printf("* *\n"); printf("* 密碼: "); scanf("%s",passwordd); printf("* *\n"); printf("* *\n"); printf("***********************************************************************\n"); if((strcmp(roott,root.account)==0)&& (strcmp(passwordd,root.password)==0 )) { while(1) { printf("***************************歡迎使用管理入口****************************\n"); printf("* *\n"); printf("* *\n"); printf("* ◆ 1.查詢學生資訊 ◆ *\n"); printf("* *\n"); printf("* ◆ 2.更改學生資訊 ◆ *\n"); printf("* *\n"); printf("* ◆ 3.增加學生資訊 ◆ *\n"); printf("* *\n"); printf("* ◆ 4.刪除學生資訊 ◆ *\n"); printf("* *\n"); printf("* ◆ 5.學生成績排序 ◆ *\n"); printf("* *\n"); printf("* ◆ 6.校園卡充值 ◆ *\n"); printf("* *\n"); printf("* ◆ 0.退出系統 ◆ *\n"); printf("***********************************************************************\n"); int i; printf("請選擇您需要使用的功能:\n"); scanf("%d",&i); switch(i) { case 0://退出系統 printf("操作成功"); break; case 1: //查詢學生資訊 FindStu(L); break; case 2: //更改學生資訊 ChangeStu(L); break; case 3: //增加學生資訊 AddStu(L); break; case 4: //刪除學生資訊 DeleteStu(L); break; case 5: //學生成績排序 Sort(L); break; case 6: //銀行圈存 ReChange(L); break; default: printf("輸入錯誤,請輸入正確的選擇\n"); break; } } } else printf("賬號或密碼錯誤\n"); return 0; }
程式測試截圖: