1. 程式人生 > >資料結構課程設計——學生資訊管理系統

資料結構課程設計——學生資訊管理系統

/*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;
}


程式測試截圖: