數據結構課程設計【家庭財務管理系統】


main.cpp:

#include "family.h"

int main()
{
    US *h_user=NULL;
    PE *h_people=NULL;
    FILE *fp_people,*fp_user;             /*創建文件型指針*/
    Login();
    if((fp_user=fopen("User.txt","rb"))==NULL||(fp_people=fopen("People.txt","rb"))==NULL)
    {
        Init1(h_user);
        Init2(h_people);
        Login1(h_user,h_people);
    }
    else if((fp_user=fopen("User.txt","rb"))!=NULL||(fp_people=fopen("People.txt","rb"))!=NULL)
    {
        Load(h_user,h_people);
        Login1(h_user,h_people);
    }
    return 0;
}



family.h:

#ifndef FAMILY_H_INCLUDED
#define FAMILY_H_INCLUDED

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

typedef struct user
{
    char user_name[10];        //姓名
    char user_password[10];    //密碼
    int user_flag;             //標誌:0爲普通成員,1爲家長
    struct user *next;
}US;  //成員登陸信息

typedef struct people
{
    char people_name[10];   //姓名
    int people_income; //收入
    int people_output; //支出
    struct people *next;
}PE; //成員收支信息



void Login();//初始界面
void Init1(US *&h_user);//登錄成員信息初始化
void Init2(PE *&h_people);//成員收支信息初始化
void Login1(US *h_user,PE *h_people);//);//成員登錄

void Menu1(US *&h_user,PE *&h_people);//管理員選擇界面
void Menu2(US *h_user,PE *h_people);//普通成員選擇界面

void Add_user(US *&h_user,PE *h_people);//增加登錄成員
void Add_people(US *h_user,PE *&h_people);//錄入成員收支信息
void Delete_people(US *h_user,PE *&h_people);//刪除成員收支信息
void Delete_user(US *&h_user,PE *h_people);//刪除成員登錄信息

void Print_people(PE *p);//輸出成員收支信息
void Find_people1(US *h_user,PE *h_people);//查找成員收支信息
void Find_people2(US *h_user,PE *h_people);//查找成員收支信息
void Print_allpeople1(US *h_user,PE *h_people);//輸出全部成員收支信息
void Print_allpeople2(US *h_user,PE *h_people);//輸出全部成員收支信息
void Change_people(US *h_user,PE *h_people);//修改成員收支信息
void Change_code1(US *h_user,PE *h_people);//修改成員登錄密碼
void Change_code2(US *h_user,PE *h_people);//修改成員登錄密碼
void Save(US *h_user,PE *h_people);                 //保存
void Save_User(US *h_user);            //保存成員登陸信息
void Save_People(PE *h_people);          //保存成員收支信息
void Load(US *h_user,PE *h_people);                 //加載
void Load_User(US *h_user);            //加載成員登陸信息
void Load_People(PE *h_people);          //加載成員收支信息
int out();//退出系統
void List(US *h_user,PE *h_people);//排序


#endif // FAMILY_H_INCLUDED


family.cpp:

#include "family.h"
/********************************************************************************************************************************************
* 功能描述: 進入歡迎界面
* 輸入參數: 任意值
* 輸出參數:
* 返回值  :
* 其它說明:當存在家庭成員信息時進入登陸界面,否則進入初始化界面
*********************************************************************************************************************************************/

void Login() /*歡迎界面*/
{
    system("cls");
    system("color 4f");
    printf("\n");
    printf("        **     **   *********    **          **              ***      \n");
    printf("        **     **   *********    **          **            **   **    \n");
    printf("        **     **   **           **          **           **     **   \n");
    printf("        **     **   **           **          **          **       **  \n");
    printf("        *********   *********    **          **          **       **  \n");
    printf("        *********   *********    **          **          **       **  \n");
    printf("        **     **   **           **          **          **       **  \n");
    printf("        **     **   **           **          **           **     **   \n");
    printf("        **     **   *********    *********   *********     **   **    \n");
    printf("        **     **   *********    *********   *********       ***      \n");
    printf("\n");
    printf("            歡 迎 進 入 家 庭 財 務 管 理 系 統!\n");
    printf("\n\n\n\t\t 按任意鍵進入系統...");
    getch();
    system("cls");
}
/**************************************************************************************************************
* 功能描述: 家庭成員信息初始化
* 輸入參數: US *&h_user形參指針
* 輸出參數: 無
* 返回值  :
* 其它說明:家庭成員信息包括姓名、密碼和權限。
****************************************************************************************************************/
void Init1(US *&h_user)  //登錄成員信息初始化
{
    system("cls");
    US *p0;
    printf("\n 【成員信息初始化】\n\n");
    p0=(US*)malloc(sizeof(US));      /*申請新結點存儲空間*/
    h_user=(US*)malloc(sizeof(US));
    printf("\n請輸入成員姓名:");
    scanf("%s",p0->user_name);
    printf("\n\n請輸入新成員密碼:");
    scanf("%s",p0->user_password);
    printf("\n\n新成員是否作爲家長(是請輸入1,否輸入0):");
    scanf("%d",&p0->user_flag);
    p0->next=NULL;
    h_user->next=p0;
    printf("\n成員信息初始化完畢!按任意鍵繼續下一步操作..\n");
    getch();
    system("cls");
}
/**************************************************************************************************************
* 功能描述: 家庭成員收支信息初始化
* 輸入參數: PE *&h_people形參指針
* 輸出參數: 無
* 返回值  :
* 其它說明:家庭成員收支信息包括姓名、收入和支出。
****************************************************************************************************************/
void Init2(PE *&h_people)  //成員收支信息初始化
{
    system("cls");
    PE *p0;
    printf("\n 【成員收支信息初始化】\n\n");
    p0=(PE*)malloc(sizeof(PE));      /*申請新結點存儲空間*/
    h_people=(PE*)malloc(sizeof(PE));
    printf("\n請輸入成員姓名:");
    scanf("%s",p0->people_name);
    printf("\n\n請輸入成員收入:");
    scanf("%d",&p0->people_income);
    printf("\n\n請輸入成員支出:");
    scanf("%d",&p0->people_output);
    p0->next=NULL;
    h_people->next=p0;
    printf("\n成員信息初始化完畢!按任意鍵繼續下一步操作..\n");
    getch();
    system("cls");
}
/**************************************************************************************************************
* 功能描述: 家庭成員登陸
* 輸入參數: US *&h_user,PE *h_people形參指針,US *p用來遍歷的指針
* 輸出參數: 無
* 返回值  :
* 其它說明:當家庭成員的姓名和密碼正確時才進入選擇菜單界面。不同權限進入不同界面。
****************************************************************************************************************/
void Login1(US *h_user,PE *h_people)  //成員登錄
{
    US *p;
    system("cls");
    char name[10],password[10];
    p=h_user;
    printf("\n 【登錄界面】\n\n請按以下順序輸入成員賬戶和密碼:\n");
    printf("\n請輸入成員賬戶名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(p->next != NULL && !strcmp(p->next->user_name,name))
        {

            printf("\n請輸入密碼:");
            scanf("%s",password);
            {
                for(; p!=NULL; p=p->next)
                {
                    if(p->next != NULL && !strcmp(p->next->user_password,password))//找到成員後分兩種情況,成員flag爲1即家長進入管理員界面,爲0即孩子進入普通界面
                    {
                        if(p->next->user_flag==1)
                        {
                            Menu1(h_user,h_people);
                            break;
                        }
                        else if(p->next->user_flag==0)
                        {
                            Menu2(h_user,h_people);
                            break;
                        }
                    }
                    break;
                }
                if(p==NULL)
                {
                    printf("登錄失敗,密碼錯誤!請重新登錄!");
                    Login1(h_user,h_people);
                }
            }
            break;
        }
    }
    if(p==NULL)
    {
        printf("登錄失敗,不存在此成員!");
        Login1(h_user,h_people);
    }
}
/**************************************************************************************************************
* 功能描述: 管理員主頁
* 輸入參數: 0-9
* 輸出參數: 對應功能
* 返回值  :
* 其它說明:菜單包括對家庭成員信息和收支信息的管理,查看收支信息和修改密碼。
****************************************************************************************************************/
void Menu1(US *&h_user,PE *&h_people) //管理員選擇界面
{
    system("cls");
    int c;
    printf("        ※※※※※※※※※※※※※※※※※\n");
    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("        ※       8: 排序成員收支信息    ※\n");
    printf("        ※                              ※\n");
    printf("        ※       9:     修改密碼        ※\n");
    printf("        ※                              ※\n");
    printf("        ※       0:       退出          ※\n");
    printf("        ※                              ※\n");
    printf("        ※※※※※※※※※※※※※※※※※\n");
    printf("       請選擇:\n");
    scanf("%d",&c);
    switch(c)
    {
    case 1:
        Add_user(h_user,h_people);
        system("pause");
        break;
    case 2:
        Delete_user(h_user,h_people);
        system("pause");
        break;
    case 3:
        Add_people(h_user,h_people);
        system("pause");
        break;
    case 4:
        Delete_people(h_user,h_people);
        system("pause");
        break;
    case 5:
        Find_people1(h_user,h_people);
        system("pause");
        break;
    case 6:
        Print_allpeople1(h_user,h_people);
        system("pause");
        break;
    case 7:
        Change_people(h_user,h_people);
        system("pause");
        break;
    case 8:
        List(h_user,h_people);
        system("pause");
        break;
    case 9:
        Change_code1(h_user,h_people);
        system("pause");
        break;
    case 0:
        out();
        system("pause");
        break;
    default:
        printf("你的選擇有誤!請重新選擇!");
        break;
    }
}
/**************************************************************************************************************
* 功能描述: 普通成員主頁
* 輸入參數: 0-3
* 輸出參數: 對應功能
* 返回值  :
* 其它說明:菜單包括查看家庭成員收支信息和修改密碼。
****************************************************************************************************************/
void Menu2(US *h_user,PE *h_people)  //普通成員選擇界面
{
    system("cls");
    int c;
    printf("        ※※※※※※※※※※※※※※※※※\n");
    printf("        ※                              ※\n");
    printf("        ※********成**員**主**頁********※\n");
    printf("        ※                              ※\n");
    printf("        ※      1:  瀏覽成員收支信息    ※\n");
    printf("        ※                              ※\n");
    printf("        ※      2:  查詢成員收支信息    ※\n");
    printf("        ※                              ※\n");
    printf("        ※      3:     修改密碼         ※\n");
    printf("        ※                              ※\n");
    printf("        ※      0:      退出            ※\n");
    printf("        ※                              ※\n");
    printf("        ※※※※※※※※※※※※※※※※※\n");
    printf("       請選擇:");
    scanf("%d",&c);
    switch(c)
    {
    case 1:
        Print_allpeople2(h_user,h_people);
        system("pause");
        break;
    case 2:
        Find_people2(h_user,h_people);
        system("pause");
        break;
    case 3:
        Change_code2(h_user,h_people);
        system("pause");
        break;
    case 0:
        out();
        system("pause");
        break;
    default:
        printf("你的選擇有誤!請重新選擇!");
        break;
    }
}
/**************************************************************************************************************
* 功能描述: 1新增家庭成員
* 輸入參數: US *p,*p0,*p1指針;US *&h_user,PE *h_people形參指針
* 輸出參數: 無
* 返回值  : 0
* 其它說明:家庭成員信息包括姓名、密碼和權限。
****************************************************************************************************************/
void Add_user(US *&h_user,PE *h_people) //增加登錄成員
{
    system("cls");
    US *p,*p0,*p1;
    p=p1=h_user;
    printf("\n 【添加新成員】\n\n");
    p0=(US*)malloc(sizeof(US));      /*申請新結點存儲空間*/
    printf("\n請輸入新成員姓名:");
    scanf("%s",p0->user_name);
    while(strcmp(p0->user_name,p1->user_name)!=0&&p1->next!=NULL)
        p1=p1->next;
    if(strcmp(p0->user_name,p1->user_name)==0)
    {
        printf("\n該成員已存在!\n");
    }
    else/*若不存在,則需要輸入其他的信息,然後在進行插入操作*/
    {
        printf("\n\n請輸入新成員密碼:");
        scanf("%s",p0->user_password);
        printf("\n\n新成員是否作爲家長(是請輸入1,否輸入0):");
        scanf("%d",&p0->user_flag);
        while(p->next)
        {
            p=p->next;
        }
        if(h_user==NULL) h_user=p0;   /*此處分兩種情況,鏈表中沒有數據,head直接指向p0處*/  //尾插法
        else p->next=p0;               /*此處分兩種情況,鏈表中有數據,鏈表中最後元素的next指向p0處*/
        p0->next=NULL;
        printf("\n新成員添加成功!\n");
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 2刪除家庭成員
* 輸入參數: US *&h_user,PE *h_people形參指針,US *q指向要刪除的節點
* 輸出參數: 無
* 返回值  :
* 其它說明: 無
****************************************************************************************************************/
void Delete_user(US *&h_user,PE *h_people)    //刪除成員登錄信息
{
    US *p,*q;
    int c;
    system("cls");
    char name[10];
    p=h_user;
    printf("\n 【刪除家庭成員】\n\n請輸入要刪除的家庭成員姓名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(p->next != NULL && !strcmp(p->next->user_name,name))
        {
            if(p->next->user_flag==1)
            {
                printf("%s成員爲家長,無權限刪除!\n",name);
                break;
            }
            printf("確認刪除%s成員?(是請輸入1,否輸入0)",name);
            scanf("%d",&c);
            if(c==1)
            {
                q=p->next;
                p->next=q->next;
                free(q);
                printf("成功刪除%s成員!\n",name);
                break;
            }
            else if(c==0)
            {
                printf("已放棄刪除操作!\n");
                break;
            }
            else
            {
                printf("您的輸入有誤!\n");
                break;
            }
        }
    }
    if(p==NULL)
    {
        printf("未找到此成員,刪除失敗!\n");
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 3錄入成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針
* 輸出參數: 無
* 返回值  : 0
* 其它說明:成員收支信息包括姓名、收入和支出。
****************************************************************************************************************/
void Add_people(US *h_user,PE *&h_people)       //錄入成員收支信息
{
    system("cls");
    PE *p,*p0,*p1;
    p=p1=h_people;
    printf("\n 【錄入成員收支信息】\n\n請按以下順序錄入成員收支信息:\n");
    p0=(PE*)malloc(sizeof(PE));      /*申請新結點存儲空間*/
    printf("\n請輸入姓名:");
    scanf("%s",p0->people_name);
    while(strcmp(p0->people_name,p1->people_name)!=0&&p1->next!=NULL)
        p1=p1->next;
    if(strcmp(p0->people_name,p1->people_name)==0) /*此處分兩種情況*/
    {
        printf("\n該成員收支信息已存在!\n");
    }
    else
    {
        printf("\n請輸入收入(元):");
        scanf("%d",&p0->people_income);
        printf("\n請輸入支出(元):");
        scanf("%d",&p0->people_output);
        printf("\n······\n錄入成功。\n");
        while(p->next)
        {
            p=p->next;
        }
        if(h_people==NULL) h_people=p0;   /*此處分兩種情況,鏈表中沒有數據,head直接指向p0處*/
        else p->next=p0;               /*此處分兩種情況,鏈表中有數據,鏈表中最後元素的next指向p0處*/
        p0->next=NULL;
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 4刪除成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針,*q指向要刪除的節點
* 輸出參數:  無
* 返回值  :
* 其它說明:無
****************************************************************************************************************/
void Delete_people(US *h_user,PE *&h_people)     //刪除成員收支信息
{
    system("cls");
    PE *p,*q;
    int c;
    char name[10];
    p=h_people;
    printf("\n 【刪除收支信息】\n\n請輸入需要刪除收支信息的成員姓名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(p->next != NULL && !strcmp(p->next->people_name,name))
        {
            printf("確認刪除%s成員的收支信息?(是請輸入1,否輸入0)",name); //刪除判斷
            scanf("%d",&c);
            if(c==1)
            {
                q=p->next;
                p->next=q->next;
                free(q);
                printf("成功刪除%s成員收支信息!\n",name);
                break;
            }
            else if(c==0)
            {
                printf("已放棄刪除操作!\n");
                break;
            }
            else
            {
                printf("您的輸入有誤!\n");
                break;
            }
        }
    }
    if(p==NULL)
    {
        printf("未找到此成員,刪除失敗!\n");
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 5查找成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針,*p用來遍歷的指針
* 輸出參數: 成員收支信息
* 返回值  : 0
* 其它說明:無
****************************************************************************************************************/
void Print_people(PE *p)//輸出成員收支信息
{
    printf("\n%s成員收支信息如下:\n\n",p->people_name);
    printf("成員姓名\t收入\t\t支出\t\t總計\n");
    printf("%s\t\t%d\t\t%d\t\t%d\n",p->people_name,p->people_income,p->people_output,p->people_income-p->people_output);
}
void Find_people1(US *h_user,PE *h_people)//查找成員收支信息
{
    system("cls");
    PE *p;
    p=h_people->next;
    char name[10];
    printf("\n 【成員收支信息查詢】\n\n");
    printf("請輸入要查詢的成員名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->people_name,name)==0)
        {
            Print_people(p);
            break;
        }
    }
    if(p==NULL)
        printf("沒有相關信息!");
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

void Find_people2(US *h_user,PE *h_people)//查找成員收支信息
{
    system("cls");
    PE *p;
    p=h_people->next;
    char name[10];
    printf("\n 【成員收支信息查詢】\n\n");
    printf("請輸入要查詢的成員名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->people_name,name)==0)
        {
            Print_people(p);
            break;
        }
    }
    if(p==NULL)
        printf("沒有相關信息!");
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu2(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 6瀏覽成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針,*p用來遍歷逐個指向節點
* 輸出參數: 成員收支信息
* 返回值  : 0
* 其它說明:無
****************************************************************************************************************/
void Print_allpeople1(US *h_user,PE *h_people)//輸出全部成員收支信息
{
    system("cls");
    PE *p;
    p=h_people->next;
    int allin=0,allout=0,all=0;
    if(p!=NULL)
    {
        printf("\n全部成員收支信息如下:\n\n");
        printf("成員姓名\t收入\t\t支出\t\t總計\n");
        while(p!=NULL)
        {
            printf("%s\t\t%d\t\t%d\t\t%d\n",p->people_name,p->people_income,p->people_output,p->people_income-p->people_output);
            allin=p->people_income+allin;
            allout=p->people_output+allout;
            all=p->people_income-p->people_output+all;
            p = p->next;
        }
        printf("\n統計\t\t收入\t\t支出\t\t總計\n");
        printf("\t\t%d\t\t%d\t\t%d\n",allin,allout,all);

    }
    else
    {
        printf("沒有成員信息!\n");
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}
void Print_allpeople2(US *h_user,PE *h_people)//輸出全部成員收支信息
{
    system("cls");
    PE *p;
    p=h_people->next;
    int allin=0,allout=0,all=0;
    if(p!=NULL)
    {
        printf("\n全部成員收支信息如下:\n\n");
        printf("成員姓名\t收入\t\t支出\t\t總計\n");
        while(p!=NULL)
        {
            printf("%s\t\t%d\t\t%d\t\t%d\n",p->people_name,p->people_income,p->people_output,p->people_income-p->people_output);
            allin=p->people_income+allin;
            allout=p->people_output+allout;
            all=p->people_income-p->people_output+all;
            p = p->next;
        }
        printf("\n統計\t\t收入\t\t支出\t\t總計\n");
        printf("\t\t%d\t\t%d\t\t%d\n",allin,allout,all);

    }
    else
    {
        printf("沒有成員信息!\n");
    }
    printf("\n按任意鍵返回主菜單..\n");
    getch();
    system("cls");
    Menu2(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 7修改成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針,*p用來遍歷的指針
* 輸出參數: 若成員存在輸出修改後的內容
* 返回值  : 0
* 其它說明:無
****************************************************************************************************************/
void Change_people(US *h_user,PE *h_people) //修改成員收支信息
{
    system("cls");
    PE *p;
    int in,out;
    int c;
    char name[10];
    p=h_people;
    printf("\n【修改成員收支信息】\n\n");
    printf("\n請輸入要修改的成員姓名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->people_name,name)==0)
        {
            printf("已經找到%s成員,是否確認修改?(是請輸入1,否輸入0)",name);//修改判斷
            scanf("%d",&c);
            if(c==1)
            {
                printf("\n請輸入成員的收入:");
                scanf("%d",&in);
                p->people_income=in;
                printf("\n請輸入成員的支出:");
                scanf("%d",&out);
                p->people_output=out;
                printf("\n%s成員信息修改完畢!\n\n",name);
                Print_people(p);
                break;
            }
            else if(c==0)
            {
                printf("已放棄修改操作!\n");
                break;
            }
            else
            {
                printf("您的輸入有誤!\n");
                break;
            }
        }
    }
    if(p==NULL)
        printf("\n此成員不存在!\n\n按任意鍵返回菜單..\n");
    printf("\n按任意鍵返回菜單..\n\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 8排序成員收支信息
* 輸入參數: US *&h_user,PE *h_people形參指針,*h1用來遍歷尋找合適的插入位置,*h2用來指向需要插入的結點
* 輸出參數: 成員收支信息
* 返回值  : 0
* 其它說明:插入排序算法
****************************************************************************************************************/
void List(US *h_user,PE *h_people)//家庭成員收入排行瀏覽
{
     PE *h1,*h2,*h3; //h2用來指向需要插入的結點,h3用來指向h2的前一個結點
     for(h3=h_people,h2=h_people->next;h2!=NULL;)
    {
           h1=h_people; //h1用來遍歷尋找合適的插入位置
           for(;h1!=h2;h1=h1->next)
          {
                 if(h1->next->people_income < h2->people_income)//如果找到,即把h2所指向的結點插到h1後面,然後跳出循環
                {
                   h3->next=h2->next;
                   h2->next=h1->next;
                   h1->next=h2;
                   h2=h3->next;
                   break;
                }
          }

          if(h1==h2)//此處需要注意,只在h2所指結點不需要前插時,移動h2和h3
         {
              h2=h2->next;
              h3=h3->next;
         }
     }
    printf("\n按任意鍵輸出..\n\n");
    getch();
    system("cls");
    Print_allpeople1(h_user,h_people);
}
/**************************************************************************************************************
* 功能描述: 9修改密碼
* 輸入參數: US *&h_user,PE *h_people形參指針,*p指用來遍歷的指針
* 輸出參數:
* 返回值  : 0
* 其它說明:無
****************************************************************************************************************/
void Change_code1(US *h_user,PE *h_people)
{
    system("cls");
    US *p;
    int c;
    char name[10],password[10];
    p=h_user;
    printf("\n【修改成員密碼】\n\n");
    printf("\n請輸入要修改的成員姓名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->user_name,name)==0)
        {
            printf("\n已經找到%s成員,是否確認修改密碼?(是請輸入1,否輸入0)",name);//修改判斷
            scanf("%d",&c);
            if(c==1)
            {
                printf("\n請輸入成員的新密碼:");
                scanf("%s",password);
                strcpy(p->user_password,password);
                printf("\n%s成員密碼修改成功!\n\n",name);
                break;
            }
            else if(c==0)
            {
                printf("已放棄修改操作!\n");
                break;
            }
            else
            {
                printf("您的輸入有誤!\n");
                break;
            }
        }
    }
    if(p==NULL)
        printf("\n此成員不存在!\n\n按任意鍵返回菜單..\n");
    printf("\n按任意鍵返回菜單..\n\n");
    getch();
    system("cls");
    Menu1(h_user,h_people);
}

void Change_code2(US *h_user,PE *h_people)
{
    system("cls");
    US *p;
    int c;
    char name[10],password[10];
    p=h_user;
    printf("\n【修改成員密碼】\n\n");
    printf("\n請輸入要修改的成員姓名:");
    scanf("%s",name);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->user_name,name)==0)
        {
            printf("\n已經找到%s成員,是否確認修改密碼?(是請輸入1,否輸入0)",name);//修改判斷
            scanf("%d",&c);
            if(c==1)
            {
                printf("\n請輸入成員的新密碼:");
                scanf("%s",password);
                strcpy(p->user_password,password);
                printf("\n%s成員密碼修改成功!\n\n",name);
                break;
            }
            else if(c==0)
            {
                printf("已放棄修改操作!\n");
                break;
            }
            else
            {
                printf("您的輸入有誤!\n");
                break;
            }
        }
    }
    if(p==NULL)
        printf("\n此成員不存在!\n\n按任意鍵返回菜單..\n");
    printf("\n按任意鍵返回菜單..\n\n");
    getch();
    system("cls");
    Menu2(h_user,h_people);
}

/**************************************************************************************************************
* 功能描述: 保存退出
* 輸入參數: US *&h_user,PE *h_people形參指針
* 輸出參數: 若文件不爲空輸出文件內容
* 返回值  : 0
* 其它說明:無
****************************************************************************************************************/
void Save(US *h_user,PE *h_people) /*保存信息*/
{
    Save_User(h_user);
    Save_People(h_people);
}
void Save_User(US *h_user)   //保存成員登陸信息
{
    FILE *fp_user;
    US *p,*p0;
    p=h_user;
    if((fp_user=fopen("User.txt","wb"))==NULL)   //創建文件,進行保存
    {
        printf("\n文件保存失敗!\n請重新啓動本系統...\n");
        exit(0);
    }
    while(p!=NULL)
    {
        if(fwrite(p,sizeof(US),1,fp_user)!=1)   //將鏈表中的信息寫入文件中
            printf("\n寫入文件失敗!\n請重新啓動本系統!\n");
        p0=p;
        p=p->next;
        free(p0); //釋放所有結點
    }
    h_user=NULL;
    fclose(fp_user);    //關閉文件
}
void Save_People(PE *h_people) //保存成員收支信息
{
    FILE *fp_people;     //創建文件型指針
    PE *p,*p0;
    p=h_people;
    if((fp_people=fopen("People.txt","wb"))==NULL)      //創建文件,進行保存
    {
        printf("\n文件保存失敗!\n請重新啓動本系統...\n");
        exit(0);
    }
    while(p!=NULL)
    {
        if(fwrite(p,sizeof(PE),1,fp_people)!=1)                //將鏈表中的信息寫入文件中
            printf("\n寫入文件失敗!\n請重新啓動本系統!\n");
        p0=p;
        p=p->next;
        free(p0);
    }
    h_people=NULL;
    fclose(fp_people);   //關閉文件
}
void Load(US *h_user,PE *h_people) //加載信息
{
    Load_User(h_user);
    Load_People(h_people);
}
void Load_User(US *h_user)   //加載成員登錄信息
{
    US *p1,*p2,*p3;
    FILE *fp;           //創建文件型指針
    fp=fopen("user.txt","rb");       //打開文件
    p1=(US *)malloc(sizeof(US));
    fread(p1,sizeof(US),1,fp);
    h_user=p3=p2=p1;
    while(! feof(fp))   //讀出信息,重新鏈入鏈表
    {
        p1=(US *)malloc(sizeof(US));
        fread(p1,sizeof(US),1,fp);
        p2->next=p1;
        p3=p2;
        p2=p1;
    }
    p3->next=NULL;
    free(p1);
    fclose(fp); //關閉文件
}
void Load_People(PE *h_people) //加載成員收支信息
{
    PE *p1,*p2,*p3;
    FILE *fp;            //創建文件型指針
    fp=fopen("People.txt","rb");   //打開文件
    p1=(PE *)malloc(sizeof(PE));
    fread(p1,sizeof(PE),1,fp);
    h_people=p3=p2=p1;
    while(! feof(fp))   //讀出信息,重新鏈入鏈表
    {
        p1=(PE *)malloc(sizeof(PE));
        fread(p1,sizeof(PE),1,fp);
        p2->next=p1;
        p3=p2;
        p2=p1;
    }
    p3->next=NULL;
    free(p1);
    fclose(fp);   //關閉文件
}

/**************************************************************************************************************
* 功能描述: 0退出
* 輸入參數:
* 輸出參數:
* 返回值  :
* 其它說明:無
****************************************************************************************************************/
int out() //系統退出界面
{
    printf("\n\n 『謝謝使用家庭財務管理系統』\n\n\n\n\n");
    exit(0);
    return 0;
}






運行結果:









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章