資料結構課程設計【學生資訊管理系統(煙大版)】
阿新 • • 發佈:2019-02-17
/*
* Copyright (c) 2016, 煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:student.project
* 作者:李瀟
* 完成日期:2016年12月28日
* 版本號:DEVC++
*
* 問題描述:學生資訊管理系統,實現資訊的輸入,顯示,插入,查詢,刪除,排序,修改,瀏覽,充值與存入檔案
* 輸入描述:
*/
程式碼:
//student.h #ifndef STUDENT_H_INCLUDED #define STUDENT_H_INCLUDED #include <stdio.h> typedef struct Student { char name[10]; //姓名 char num[10]; //學號 (都是四位 便於排序) char sex;//性別 (w代表女m代表男) int age;//年齡 char phone[10];//電話號碼 int score;//總成績 int wangfei;//網費 int banlance;//校園卡餘額 }stu; typedef struct LNode { stu data; struct LNode *next; }LinkList; typedef struct manage//管理員 { char zhanghao[10];//賬號 char password[10];//密碼 }mag; void InitList( LinkList *&L);//初始化連結串列 void ListInsert(LinkList *&L,LinkList *P);//插入新的節點 //void ListDelete(LinkList *&L,LinkList *P);//刪除節點 void menu();//功能選單 void addstu(LinkList *&L);//增加新的學生 void deletestu(LinkList *L);//刪除學生 void changestu(LinkList *L);//改變學生資訊 void findstu(LinkList *L);//按學號查詢學生並輸出該生資訊 void rechange(LinkList *L);//輸入學號進行充值功能 void paixu(LinkList *L);//按成績排序排序 void display(LinkList *&L);//瀏覽全部學生資訊 void saveStuDentFile(LinkList * &L);//儲存學生資訊到檔案 void readStuDentput (LinkList *&L);//執行前把檔案內容讀取到電腦記憶體 void welocome();//首介面 void wel1();//管理員登陸介面 void carry();//執行階段 //bool check(LinkList *&L,int n);//根據學號判斷此生存在不存在 #endif // STUDENT_H_INCLUDED
// student.cpp #include <iostream> #include <windows.h> using namespace std; #include <malloc.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include "student.h" LinkList *L=NULL; /******************************************/ //這些變數用於輸入學生相關的資訊 char nam[10];//名字 char nu[10];//學號 char s;//性別 int ag;//年齡 char ph[10];//號碼 int sc;//成績 int wf;//網費 int bal;//餘額 /********************************************************* * 功能描述: 首介面 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 螢幕會顯示a3的顏色並輸出登陸介面 ************************************************************/ void welocome()//登陸介面 { system("color a3"); printf("-------------------------------------------------------------------------------------------------------------\n"); printf("\n"); printf(" **************** 歡迎來到煙臺大學學生資訊管理平臺 **************** \n"); printf("\n"); printf(" ********** 製作人:李瀟 ********** \n"); printf("\n"); printf(" ****** 班級:計-156-1 ****** \n"); printf("\n"); printf(" ****** ****** \n"); printf("********************************************************************************\n"); printf("-------------------------------------------------------------------------------------------------------------\n"); printf("\n"); } /********************************************************* * 功能描述: 管理員登陸介面 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 螢幕會顯示d3的顏色並輸出管理員登陸介面 相應的內容 ************************************************************/ void wel1()//管理員登陸介面 { system("color d4"); printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n"); printf("\n"); printf(" ◇◇◇◇◇◇◇請您輸入管理員登陸資訊 ◇◇◇◇◇◇◇ \n"); printf("\n"); printf(" ▅▅▅▅▅▅▅ 1. 賬號: _________ ▃▃▃▃▃▃▃▃▃▃ \n"); printf("\n"); printf(" ▅▅▅▅▅▅▅ 2. 密碼: _________ ▃▃▃▃▃▃▃▃▃▃ \n"); printf("\n"); printf(" ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● \n"); printf("\n"); printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n"); printf("\n"); } /********************************************************* * 功能描述: 功能選單 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 螢幕會顯示c4的顏色並輸出功能選單欄 ************************************************************/ void menu()//功能選單 { system("color c4"); printf("|______________________________________________________________|\n"); printf("| |\n"); printf("| 學生資訊管理系統 |\n"); printf("| |\n"); printf("| 0、 退出系統 |\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("|______________________________________________________________|\n"); return ; } /********************************************************* * 功能描述: 執行階段 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 螢幕會顯示c4的顏色並輸出功能選單欄 ************************************************************/ void carry()//執行階段 { LinkList *L; InitList(L); readStuDentput (L);//執行前把檔案內容讀取到電腦記憶體 int choose; while(1) { printf("請輸入您要選擇的功能鍵:\n"); menu();//功能選單 scanf("%d",&choose); switch(choose) { case 0://退出系統 printf("謝謝使用!歡迎下次光臨"); break; case 1://增加學生資訊 addstu(L);//增加新的學生 break; case 2://刪除所有學生資訊 deletestu(L);//刪除學生 break; case 3://改變個學生的資訊 changestu(L);//改變學生資訊 break; case 4://查詢某個學生的資訊 findstu(L);//按學號查詢學生並輸出該生資訊 break; case 5:// 充值 rechange(L);//輸入學號進行充值功能 break; case 6:// 對學生成績進行排序 paixu(L); break; case 7://輸出所有學生的資訊 display(L); break; default: printf("請輸入正確的選擇\n"); break; } } } /********************************************************* * 功能描述: 初始化連結串列 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 頭結點本無資訊,在這裡給頭結點附相應的值是為了讀取檔案那不讀入頭結點的內容 ************************************************************/ void InitList( LinkList *&L)//初始化連結串列 { L=(LinkList *)malloc(sizeof(LinkList)); strcpy(L->data.num,"xx");//把後者的內容拷貝到前者中 strcpy(L->data.name,"xx");//把後者的內容拷貝到前者中 L->data.sex=0; L->data.age=0; strcpy(L->data.phone,"xx");//把後者的內容拷貝到前者中 L->data.score=0; L->data.wangfei=0; L->data.banlance=0; L->next=NULL; } /********************************************************* * 功能描述: 插入新的節點 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明: 尾插法 ************************************************************/ 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; } } /********************************************************* * 功能描述: 增加新的學生 * 輸入描述: 新增的學生相關資訊 * 輸出描述: 此生存在會輸出"該生已存在" * 返回值 : 無 * 其它說明: ************************************************************/ void addstu(LinkList *&L)//增加新的學生 { system("color f2"); printf("請輸入學生的資訊:\n"); printf("學號:"); scanf("%s",nu); printf("%s\n",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("姓名:") ; scanf("%s",nam) ; // printf("%s\n",nam); strcpy(p->data.name,nam);//把後者的內容拷貝到前者中 printf("性別:(w為男 m為女)"); scanf(" %c",&s); //printf("%c\n",s); p->data.sex=s; printf("年齡:"); scanf("%d",&ag); // printf("%d\n",ag); p->data.age=ag; printf("總成績:"); scanf("%d",&sc); // printf("%d\n",sc); p->data.score=sc; printf("網費:"); scanf("%d",&wf); // printf("%d\n",wf); p->data.wangfei=wf; printf("餘額:"); scanf("%d",&bal); // printf("%d\n",bal); p->data.banlance=bal; printf("電話號碼:"); scanf("%s",ph); //printf("%s\n",ph); strcpy(p->data.phone,ph);//把後者的內容拷貝到前者中 ListInsert(L,p); saveStuDentFile(L);//儲存學生資訊到檔案 } } /********************************************************* * 功能描述: 刪除學生 * 輸入描述: 要刪除學生的學號 * 輸出描述: 此生不存在時會輸出“此生不存在” 連結串列本身為空時會輸出"還沒有學生資訊請增加學生資訊" * 返回值 : 無 * 其它說明: ************************************************************/ void deletestu(LinkList *L)//刪除某個學生 { system("color f4"); printf("請輸入您要刪除的學生的學號:"); scanf("%s",nu); LinkList *p,*pre; if(L->next==NULL) { printf("還沒有學生資訊,請增加學生資訊\n"); return; } pre=L; p=pre->next; int judge=0; while(p) { if(strcmp(p->data.num,nu)==0) { judge=1; pre->next =p->next; free(p); p=NULL; printf("刪除學生成功\n"); saveStuDentFile(L);//儲存學生資訊到檔案 break; } pre=p; p=p->next; } if(judge==0) printf("該生不存在\n"); } /********************************************************* * 功能描述: 修改學生資訊 * 輸入描述: 要修改學生的學號 * 輸出描述: 此生不存在時會輸出“此生不存在” 存在會輸出相應的修改資訊的語句 * 返回值 : 無 * 其它說明: ************************************************************/ void changestu(LinkList *L)//改變學生資訊 { int judge=1; system("color e4"); printf("請輸入您要修改學生的學號:\n"); scanf("%s",nu); LinkList *q=L->next; while(q!=NULL ) { if(strcmp(q->data.num,nu)==0) { judge=0; printf("請輸入您要修改的資訊選項:1.姓名 2. 電話號碼 3. 總成績 4.年齡 \n"); int n; scanf("%d",&n); switch(n) { case 1: printf("請輸入您要修改的名字:"); scanf("%s",nam); printf("修改的名字為:%s\n",nam); strcpy(q->data.name,nam);//把後者的內容拷貝到前者中 printf("修改名字成功!\n"); saveStuDentFile(L);//儲存學生資訊到檔案 break; case 2: printf("請輸入您要修改的電話號碼:"); scanf("%s",ph); printf("修改的電話號碼為:%s\n",ph); strcpy(q->data.phone,ph);//把後者的內容拷貝到前者中 printf("修改電話號碼成功!\n"); saveStuDentFile(L);//儲存學生資訊到檔案 break; case 3: printf("請輸入您要修改的總成績"); scanf("%d",&sc); printf("修改的總成績為:%d\n",sc); q->data.score=sc; printf("修改總成績成功!\n"); saveStuDentFile(L);//儲存學生資訊到檔案 break; case 4: printf("請輸入您要修改的年齡:"); scanf("%d",&ag); printf("修改的年齡為:%d\n",ag); q->data.age=ag; printf("修改年齡成功!\n"); saveStuDentFile(L);//儲存學生資訊到檔案 break; default : printf("請輸入正確的選項\n"); break; } } q=q->next; } if(judge==1) { printf("該生不存在\n"); } } /********************************************************* * 功能描述: 查詢學生資訊 * 輸入描述: 要查詢學生的學號 * 輸出描述: 此生不存在時會輸出“此生不存在” 存在會輸出該生的相應修改資訊 * 返回值 : 無 * 其它說明: ************************************************************/ void findstu(LinkList *L)//按學號查詢學生並輸出該生資訊 { system("color b1"); printf("請輸入您要查詢的學生的學號:"); scanf("%s",nu); LinkList *q=L->next; while(q!=NULL ) { if(strcmp(q->data.num,nu)==0) { printf("姓名:%s\n",q->data.name); printf("學號:%s\n",q->data.num); printf("性別:%c\n",q->data.sex); printf("年齡:%d\n",q->data.age); printf("電話號碼:%s\n",q->data.phone); printf("總成績:%d\n",q->data.score); printf("網費:%d\n",q->data.wangfei); printf("餘額:%d\n",q->data.banlance); break; } q=q->next; } if(q==NULL) printf("該生不存在\n"); } /********************************************************* * 功能描述: 充值功能 * 輸入描述: 要充值學生的學號 * 輸出描述: 此生不存在時會輸出“此生不存在” 存在會輸出相應的充值資訊的語句 * 返回值 : 無 * 其它說明: ************************************************************/ void rechange(LinkList *L)//輸入學號進行充值功能 { system("color d6"); int choose; printf("請輸入您要充值的學生的學號:\n"); scanf("%s",&nu); int money; LinkList *q=L->next; while(q!=NULL ) { if(strcmp(q->data.num,nu)==0) { printf("請輸入您要充值的選項 : 1. 網費充值 2.校園卡充值\n"); scanf("%d",&choose); if(choose==1) { printf("請輸入您要充值的金額:\n"); scanf("%d",&money); printf("您要充值的金額為%d元\n",money); q->data.wangfei=q->data.wangfei+money; printf("網費充值成功!\n"); printf("%s 同學的網費餘額為 %d元",q->data.name,q->data.wangfei); //saveStuDentFile(L);//儲存學生資訊到檔案 } else if(choose==2) { printf("請輸入您要充值的金額:\n"); scanf("%d",&money); printf("您要充值的金額為%d元\n",money); q->data.banlance=q->data.banlance+money; printf("校園卡充值成功!\n"); printf("%s 同學的餘額為 %d元",q->data.name,q->data.banlance); //saveStuDentFile(L);//儲存學生資訊到檔案 } else printf("請輸入正確的選項\n"); break; } q=q->next; } if(q==NULL) printf("該生不存在\n"); } /********************************************************* * 功能描述: 排序 * 輸入描述: * 輸出描述: 不存在學生時會輸出"還沒有學生資訊,請增加學生資訊" 不然就輸出按成績排序後的所有學生資訊 * 返回值 : 無 * 其它說明: ************************************************************/ void paixu(LinkList *L)//按成績排序排序 並輸出排序後的結果 { system("color f9"); 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) { 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.phone,q->data.phone); tmp->data.sex=q->data.sex; tmp->data.age=q->data.age; tmp->data.score=q->data.score; tmp->data.wangfei=q->data.wangfei; tmp->data.banlance=q->data.banlance; /*再複製p結點資訊到q*/ strcpy(q->data.num,p->data.num); strcpy(q->data.name,p->data.name); strcpy(q->data.phone,p->data.phone); q->data.sex=p->data.sex; q->data.age=p->data.age; q->data.score=p->data.score; q->data.wangfei=p->data.wangfei; q->data.banlance=p->data.banlance; /*最後複製exchange結點資訊到p*/ strcpy(p->data.num,tmp->data.num); strcpy(p->data.name,tmp->data.name); strcpy(p->data.phone,tmp->data.phone); p->data.sex=tmp->data.sex; p->data.age=tmp->data.age; p->data.score=tmp->data.score; p->data.wangfei=tmp->data.wangfei; p->data.banlance=tmp->data.banlance; } q=q->next; } r=r->next; } saveStuDentFile(L);//儲存學生資訊到檔案 printf("排序後的學生資訊是:\n"); display(L); } /********************************************************* * 功能描述: 瀏覽全部學生資訊 * 輸入描述: * 輸出描述: 不存在學生時會輸出"還沒有學生資訊,請增加學生資訊" 不然就輸出所有學生資訊 * 返回值 : 無 * 其它說明: ************************************************************/ void display(LinkList *&L)//瀏覽全部學生資訊 { LinkList *q=L->next; if(q==NULL) { printf("還沒有學生資訊,請增加學生資訊\n"); return; } while(q) { system("color c0"); printf(" 學號:%s 名字:%s 年齡:%d 性別:%c 電話號碼:%s 總成績:%d 網費: %d 校園卡餘額:%d \n",q->data.num,q->data.name,q->data.age,q->data.sex, q->data.phone,q->data.score,q->data.wangfei,q->data.banlance); q=q->next; } } /********************************************************* * 功能描述: 儲存學生資訊到檔案 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明:把學生資訊儲存到此資料夾中 ************************************************************/ void saveStuDentFile(LinkList * &L)//儲存學生資訊到檔案 { FILE *fp; //WORK*p; //p = worker; LinkList *p=L->next; if((fp=fopen("student.txt","w"))==NULL)// 以可寫的方式開啟當前目錄下的.txt { printf("Can not open the file,press any key exit!"); exit(1); } // fprintf(fp,"學號 姓名 性別 年齡 電話 總成績 網費 校園卡餘額\n"); while(p) { //printf("*******\n"); //display(p); fprintf(fp,"%s %s %c %d %s %d %d %d\n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.phone,p->data.score,p->data.wangfei,p->data.banlance); p=p->next; } fclose(fp); } /********************************************************* * 功能描述: 讀檔案 * 輸入描述: 無 * 輸出描述: 無 * 返回值 : 無 * 其它說明:執行前把學生資訊讀到電腦記憶體中 首先以只讀的方式開啟檔案進行計數 i 然後再把這i個學生資訊讀入到電腦記憶體 ************************************************************/ void readStuDentput (LinkList *&L) //執行前把檔案內容讀取到電腦記憶體 { FILE *fp; fp=fopen("student.txt","rb"); //以只讀方式開啟當前目錄下的.txt if(fp==NULL) { printf("無法開啟檔案\n"); exit(0); //-------- 終止程式 --------- } int i=0; while(!feof(fp)) { //LinkList *p=(LinkList *)malloc(sizeof(LinkList)); char nam[10];//名字 char nu[10];//學號 char s;//性別 int ag;//年齡 char ph[10];//號碼 int sc;//成績 int wf;//網費 int bal;//餘額 //fscanf(fp,"%s %s %c %d %s %d %d %d",p->data.num,p->data.name,&p->data.sex,&p->data.age,p->data.phone,&p->data.score,&p->data.wangfei,&p->data.banlance); fscanf(fp,"%s %s %c %d %s %d %d %d",nu,nam,&s,&ag,ph,&sc,&wf,&bal); i++; } fclose(fp); FILE *FP; FP=fopen("student.txt","rb"); //以只讀方式開啟當前目錄下的.txt if(FP==NULL) { printf("無法開啟檔案\n"); exit(0); //-------- 終止程式 --------- } int b=i-1; int j=1; while(!feof(FP)) { fscanf(FP,"%s %s %c %d %s %d %d %d",nu,nam,&s,&ag,ph,&sc,&wf,&bal); //fscanf(FP,"%s %s %c %d %s %d %d %d",n->data.num,n->data.name,&n->data.sex,&n->data.age,n->data.phone,&n->data.score,&n->data.wangfei,&n->data.banlance); LinkList *n=(LinkList *)malloc(sizeof(LinkList)); strcpy(n->data.num,nu);//把後者的內容拷貝到前者中 strcpy(n->data.name,nam);//把後者的內容拷貝到前者中 n->data.sex=s; n->data.age=ag; strcpy(n->data.phone,ph);//把後者的內容拷貝到前者中 n->data.score=sc; n->data.wangfei=wf; n->data.banlance=bal; ListInsert(L,n);//插入新的節點 n=n->next; if(j==b) break; j++; } fclose(FP); //----關閉檔案---- }
//main.cpp /********************************************************* * 功能描述: 主函式 * 輸入描述:管理員賬號和密碼 * 輸出描述: 無 根據選項各有不同 * 返回值 : 0 * 其它說明:首先是清屏 然後暫停十秒 之後是輸入資訊 如果進入系統此時螢幕會顯示不同的顏色並輸出相應東西 ************************************************************/ #include <stdio.h> #include "student.h" #include <string.h> #include <stdlib.h> #include <windows.h> #include <string.h> #include <iostream> using namespace std; int main() { //LinkList *L=NULL; system("cls");//清屏 welocome();//登陸介面 Sleep(10000);//延緩十秒 mag a; strcpy(a.zhanghao,"lixiao");//把後者的內容拷貝到前者中 strcpy(a.password,"123");//把後者的內容拷貝到前者中 wel1();//管理員登陸介面 /* printf("請輸入您的賬號和密碼:\n"); printf("賬號: ") ; scanf("%s",a.zhanghao); printf("密碼:"); scanf("%s",a.password); printf("●●●●●●●●●●\n"); printf("恭喜%s 已經成為本系統的管理員\n",a.zhanghao); */ char zh[10];//管理員的賬號 char m[10];//密碼 printf("請輸入管理員登入賬號和密碼:\n"); printf("賬號:"); scanf("%s",zh); printf("密碼:"); scanf("%s",m); //判斷名字和密碼 if((strcmp(zh,a.zhanghao)==0) && (strcmp(m,a.password)==0)) { carry();//執行階段 } else printf("姓名或密碼不對"); return 0; }
執行結果: