C語言實現個人財務管理軟件

本文實例為大傢分享瞭C語言實現個人財務管理軟件的具體代碼,供大傢參考,具體內容如下

代碼:

/*課程設計項目名稱:個人賬戶管理軟件
  作者:施瑞文 
  專業:軟件工程(商業智能) 
  時間:2018.1
*/ 
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h> 
#include<time.h>
#define N sizeof(struct Account)   //宏定義 
#define M sizeof(struct income_and_expenditure)
 
struct income_and_expenditure      //收支情況 
{
    float iae;     //收入或支出 
    char ch;    //-號代表支出,+號代表收入 
    int year;    //年月日 
    int month;
    int day;
    int num;    //標號 
    char source_or_aim[50];    // 收入來源或支出目的 
    struct income_and_expenditure *next;       // 指針域 ,後接 
    struct income_and_expenditure *pre;   //前驅 
};
typedef struct income_and_expenditure IAE;   
typedef IAE *IAEP;
 
 
struct Account       //賬戶信息 
{
    char name[10];       //賬號昵稱 
    char password[18];       //密碼 
    struct Account *next;   //指針域 
};
typedef struct Account Acc;
typedef Acc *Accp;
 
//好多自定義函數~~
Accp ff();                     //將存賬號的文件裡的內容輸出到鏈表中
IAEP ss();                   //將存賬單的文件裡的內容輸出到鏈表中 
void signin();               //登陸或註冊 
void login();                 // 註冊賬號 
void logon();                  // 賬號登陸  
void menu();                 //菜單 
void over();                  //退出系統 
void color(short x);                 //控制顏色 
void HideCursor();          //隱藏光標
void toxy(int x, int y);    //將光標移動到X,Y坐標處
void amend_password();         //修改密碼 
void add_information();       //添加信息 
void print_information();     //賬單明細 
void find_information();     //查找信息 
void delete_information();   //刪除信息 
void amend_information();    //修改信息 
void save_account(Accp p);    //保存賬號
void save_information(IAEP p); //保存信息 
 
 
char _name[20],_password[18];       //全局變量記住當前登陸賬戶 
 
 
/*void color(short x)
{
    if(x>=0&&x<=15)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
    }
    else
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
    }
} */
 
void HideCursor()     //隱藏光標
{
 CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
 
void toxy(int x, int y)      //將光標移動到X,Y坐標處
{
COORD pos = { x , y };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos); 
}
 
Accp ff()               //將存賬號的文件裡的內容輸出到鏈表中
{
    FILE *fp;       //文件指針 
    int n=0;
    Accp head=NULL;
    Accp p2,p;
    fp=fopen("account","a+");     //以隻讀的方式打開文件 
    if(fp==NULL)
    {
        printf("cannot open file\n");
    }
    else
    {
        while(!feof(fp))        //判斷文件位置標志是否移動到文件末尾 
        {
           n++;
               p=(Accp)malloc(N);
           fread(p,N,1,fp);
           if(n==1)
           {
              head=p;
              p2=p;
            }
            else             //創建鏈表 
            {
                p2->next=p;
                p2=p;
            }
        }
        p2->next=NULL;
    }
    fclose(fp);
    return head;
}
 
 
void menu()     //菜單 
{
    system("cls");    //清屏 
    system("color 70");
    do{
        char t;
        toxy(50,5);
        printf(" 個人財務管理軟件");
        toxy(50,6);
        printf("當前賬戶為:%s",_name);
        toxy(48,8);
        printf("|     1.添加信息      |");
        toxy(48,10);
        printf("|     2.修改信息      |");
        toxy(48,12);
        printf("|     3.刪除信息      |");
        toxy(48,14);
        printf("|     4.賬單明細      |");
        toxy(48,16);
        printf("|     5.查找信息      |");
        toxy(48,18);
        printf("|     6.修改密碼      |"); 
        toxy(48,20);
        printf("|     7.退出系統      |");
        t=getch();                    //利用不回顯函數,輸入t,可以不用手動按回車鍵 
        switch(t)
        {
            case '1':add_information();break;
            case '2':amend_information();break;
            case '3':delete_information();break;
            case '4':print_information();break;
            case '5':find_information();break;
            case '6':amend_password();break;
            case '7':over();break;
            default :;break;
        }
    }while(1);       //永遠為真 
}
 
void signin()       //登陸或註冊 
{
    system("cls");
    HideCursor();    //隱藏光標
    char t;
    system("color 72");
    toxy(50,5);
    printf("個人財務管理軟件");
    toxy(44,8);
    printf("****************************");
    toxy(45,10);
    printf("請輸入(1:登陸;2:註冊.)");
    toxy(44,12);
    printf("****************************");
    while(1)
    {
        t=getch();
        switch(t)
        {
            case '1':logon();break;
            case '2':login();break;
            default :break;
        }
    }
}
 
void logon()      // 賬號登陸 
{
    system("cls");
    HideCursor();
    Accp p,head;
    head=ff();
    do{
        HideCursor();       //隱藏光標 
        system("color 72");
        p=head;
        char t,c,k;
        int i=0;
        toxy(50,5);
        printf("個人財務管理軟件");
        toxy(45,6);
        printf("--------------------------");
        toxy(45,8);
        printf("     登陸狀態       ");
        toxy(45,10);
        printf("*  請輸入您的賬號:");
        gets(_name);
        toxy(45,12);
        printf("*  請輸入您的密碼:");
        for(;;)              //此處為輸入密碼不回顯操作 
        {
            k=getch();       //輸入k 
            if(k=='\r')      //如果輸入k為回車,則跳出循環 
            {
                break;
            }
            else if(k=='\b')  //如果輸入k為刪除鍵 
            {
                if(i>0)       //如若密碼還沒完全刪除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
            {
                _password[i]=k;   //把k的值賦給_password[i]; 
                printf("*");      //輸出*號,保護用戶隱私 
                i++;              //密碼位數加1 
            }
        }
        _password[i]='\0';
        while(p!=NULL&&strcmp(p->name,_name)!=0)   //遍歷鏈表,尋找當前輸入的賬戶的賬號 
        {
            p=p->next;
        }
        if(p!=NULL)   //如果p不為空 
        {
            if(strcmp(p->password,_password)==0)     //如果輸入的密碼正確 
            {
                toxy(48,16);
                printf("正在登陸....");
                Sleep(500);      //暫停0.5秒
                system("cls");
                system("color 72");
                toxy(48,10);
                printf("登陸成功!");
                break;    //跳出循環
            }
            else      //如果輸入的密碼錯誤
            { 
                toxy(48,16);
                printf("正在登陸....");
                Sleep(500);
                system("cls");
                system("color 72");
                toxy(46,8);
                printf("-------------------------");
                toxy(46,9);
                printf("|                       |");
                toxy(46,10);
                printf("| 密碼錯誤!是否繼續?  |");
                toxy(46,12);
                printf("| 1.是             2.否 |");
                toxy(46,13);
                printf("|                       |");
                toxy(46,14);
                printf("-------------------------");
                while(1)
                {
                    t=getch();  //輸入t    
                    if(t=='1')          
                    {
                        system("cls");  //清屏 
                        system("color 72"); 
                        break;
                    }
                    else if(t=='2')     //如果輸入t為n,進入開始界面 
                    {
                        signin();break;
                    }
                }
            } 
       }
       else              //如果p為空,即輸入的賬號不正確 
       {
               toxy(48,16);
               printf("正在登陸....");
               Sleep(500);
               system("cls");
               system("color 72");
               toxy(46,8);
               printf("-------------------------");
               toxy(46,9);
               printf("|                       |");
               toxy(46,10);
            printf("|  賬號錯誤!是否繼續? |");
            toxy(46,11);
            printf("|                       |");
            toxy(46,12);
            printf("|  1.是            2.否 |"); 
            toxy(46,13);
            printf("|                       |");
            toxy(46,14);
            printf("-------------------------");
            while(1)
            {
                c=getch();
                if(c=='1')
                {  
                    system("cls");
                    system("color 72");
                    break;
                }
                else if(c=='2')
                {
                    signin();break;
                }
            }
       }
    }while(1);      //永遠為真 
   Sleep(500);      //暫停0.5秒 
   menu();         //賬號密碼均正確,進入主菜單 
}
 
void login()        //註冊賬號 
{
    system("cls");
    HideCursor();       //隱藏光標 
    Accp p1;
    p1=(Accp)malloc(N);     //向內存申請一段空間 
    do{
        HideCursor();
        system("color 72");
        char name[20],password[18],againpassword[18],c,k;
        int i=0;; 
        toxy(50,5);
        printf("個人財務管理軟件");
        toxy(45,6);
        printf("-------------------------");
        toxy(45,8);
        printf("   正在註冊");
        toxy(45,10);
        printf("*  請輸入賬號:");
        gets(name);
        toxy(45,12);
        printf("*  請輸入密碼:");
        for(;;)              //此處為輸入密碼不回顯操作 
        {
            k=getch();       //輸入k 
            if(k=='\r')      //如果輸入k為回車,則跳出循環 
            {
                break;
            }
            else if(k=='\b')  //如果輸入k為刪除鍵 
            {
                if(i>0)       //如若密碼還沒完全刪除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
            {
                password[i]=k;   //把k的值賦給_password[i]; 
                printf("*");      //輸出*號,保護用戶隱私 
                i++;              //密碼位數加1 
            }
        }
        password[i]='\0';
        i=0;
        toxy(45,14);
        printf("*  請確認您的密碼:");
        for(;;)              //此處為輸入密碼不回顯操作 
        {
            k=getch();       //輸入k 
            if(k=='\r')      //如果輸入k為回車,則跳出循環 
            {
                break;
            }
            else if(k=='\b')  //如果輸入k為刪除鍵 
            {
                if(i>0)       //如若密碼還沒完全刪除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
            {
                againpassword[i]=k;   //把k的值賦給_password[i]; 
                printf("*");      //輸出*號,保護用戶隱私 
                i++;              //密碼位數加1 
            }
        }
        againpassword[i]='\0';
        if(strcmp(password,againpassword)==0)        //如果輸入的兩次密碼均正確 
        {
            strcpy(p1->name,name);
            strcpy(p1->password,password);
            toxy(48,16);
            printf("正在註冊....");
            Sleep(500);
            system("cls");
            system("color 72");
            toxy(48,10);
            printf("註冊成功!");
            Sleep(500);         //暫停0.5秒 
            break;              //跳出循環 
        }
        else    //如果輸入的兩次密碼不同 
        {
            toxy(48,16);
            printf("正在註冊....");
            Sleep(500);
            system("cls");
            system("color 72");
            toxy(46,8);
            printf("-----------------------------");
            toxy(46,9);
            printf("|                           |");
            toxy(46,10);
            printf("|  註冊失敗!是否繼續註冊? |");
            toxy(46,11);
            printf("|                           |");
            toxy(46,12);
            printf("|  1.是               2.否  |"); 
            toxy(46,13);
            printf("|                           |");
            toxy(46,14);
            printf("-----------------------------");
            while(1)
            {
                c=getch();
                if(c=='1')
                {
                    system("cls");
                    system("color 72");
                    break;
                }
                else if(c=='2')
                {
                    signin();
                    break;
                }
            }
        }
    }while(1);    //永遠為真 
    save_account(p1);     //調用函數,將p1所指向的內容存儲到文件中 
    toxy(48,12);
    printf("正在自動為您登陸....");
    Sleep(500);
    menu();    //註冊成功後進入主菜單 
}
 
/*修改密碼
方法比較笨,這裡是先將儲存在文件中的賬戶信息
輸出在一個鏈表中,遍歷鏈表,尋找當前登陸的賬戶賬號,修改該節點的p->password,
再將修改後的鏈表存到文件中,需要註意的是修改之後再存到文件中需要將該文件中的內容
清空*/ 
void amend_password()        //修改密碼 
{ 
    system("cls");         //清屏 
    system("color 74");    //看著舒服的顏色 
    HideCursor();  
    Accp p,head;       //隱藏光標,看著更舒服 
    head=ff();
    FILE *fp;
    do
    {
        HideCursor();       //隱藏光標,看著舒服 
        p=head;
        char password[18],newpassword[18],t,k;
        int i=0;
        toxy(50,5);          //將光標移動到坐標為(50,5)的位置 
        printf("個人財務管理軟件");
        toxy(50,8);
        printf("修改密碼");
        toxy(48,10);
        printf("請輸入舊密碼:");
        for(;;)              //此處為輸入密碼不回顯操作 
        {
            k=getch();       //輸入k 
            if(k=='\r')      //如果輸入k為回車,則跳出循環 
            {
                break;
            }
            else if(k=='\b')  //如果輸入k為刪除鍵 
            {
                if(i>0)       //如若密碼還沒完全刪除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
            {
                password[i]=k;   //把k的值賦給_password[i]; 
                printf("*");      //輸出*號,保護用戶隱私 
                i++;              //密碼位數加1 
            }
        }
        password[i]='\0';
        i=0;
        toxy(48,12);
        printf("請輸入新密碼:");
        for(;;)              //此處為輸入密碼不回顯操作 
        {
            k=getch();       //輸入k 
            if(k=='\r')      //如果輸入k為回車,則跳出循環 
            {
                break;
            }
            else if(k=='\b')  //如果輸入k為刪除鍵 
            {
                if(i>0)       //如若密碼還沒完全刪除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
            {
                newpassword[i]=k;   //把k的值賦給_password[i]; 
                printf("*");      //輸出*號,保護用戶隱私 
                i++;              //密碼位數加1 
            }
        }
        newpassword[i]='\0';
        while(p!=NULL&&strcmp(p->name,_name)!=0)//遍歷鏈表,尋找當前登陸賬戶的賬號 
        {
            p=p->next;
        }
        if(p!=NULL)                   //如果p不為空 
        {
            if(strcmp(p->password,password)==0)          //如果舊密碼輸入正確 
            {
                strcpy(p->password,newpassword);         //將舊密碼改為新密碼 
                break;                                   //跳出循環 
            }
            else                                         //如果舊密碼輸入錯誤 
            {
                system("cls");
                system("color 72");
                toxy(46,8);
                printf("--------------------------");
                toxy(46,9);
                printf("|                        |");
                toxy(46,10);
                printf("|  密碼錯誤!是否繼續?  |");
                toxy(46,11);
                printf("|                        |");
                toxy(46,12);
                printf("|  1.是           2.否   |");
                toxy(46,13);
                printf("|                        |");
                toxy(46,14);
                printf("--------------------------");
                while(1)
                {
                    t=getch();                              //輸入t 
                    if(t=='1')
                    {
                        system("cls");
                        system("color 72");
                        break;
                    }
                    else if(t=='2')
                      menu();
                }
            }
        }
    }while(1);                                //永遠為真 
    p=head->next;                           //使p指向第二個結點 
    fp=fopen("account","w");                  //先清空原文件內容再將修改後的信息寫入文件 
    if(fp==NULL)
    {
        printf("cannot open file\n");
    }
    if(fwrite(head,N,1,fp)!=1)                 //將head所指向的數據寫入fp所指向的文件 
    {
        printf("file write error\n");
    }
    fclose(fp);                         //關閉文件 
    fp=fopen("account","a");          // 打開account文件,方式為追加 
    while(p!=NULL)                    //p不為空就執行循環體 
    {
        if(fwrite(p,N,1,fp)!=1)            //將p所指向的1個大小為N的數據結構寫入fp所指向的文件 
        {
        printf("file write error\n");
        }
        p=p->next;                     //使p指向下一個結點 
    }
    fclose(fp);              //關閉文件 
    toxy(48,14);
    printf("修改成功!正在跳轉...");
    Sleep(500);       //暫停0.5秒 
}
 
 
void save_account(Accp p1)     //將p1所指向的內容存儲到文件中 
{
    FILE *fp;       //文件指針 
    fp=fopen("account","a");    //以追加的方式打開文件 
    if(fp==NULL)
    {
        printf("cannot open file\n");
    }
    if(fwrite(p1,N,1,fp)!=1)    //將p1所指向的1個大小為N的數據結構寫入fp所指向的文件中 
    {
        printf("file write error\n");
    }
    fclose(fp);        //關閉文件 
}
IAEP ss()             //將存賬單的文件裡的內容輸出到鏈表中 
{
    FILE *fp;              //文件指針
    int n=0; 
    IAEP head=NULL;
    IAEP p,p2,pr=NULL;
    fp=fopen(_name,"ab+");//打開文件,方式為隻讀 
    if(fp==NULL)            //如果打開為空 
    {
        printf("cannot open file\n");
    }
    else
    {
        while(!feof(fp))         // feof函數可以檢查文件讀寫位置標志是否移動到文件末尾,feof(fp)檢查fp所指向的文件是否結束,如果是 
        {                        //則函數值為真,否則為假,即“!feof(fp)”為真,在while循環中檢查 “!feof(fp)”為真,就執行循環體 
           n++;
           p=(IAEP)malloc(M);   //向內存申請一段空間 
           fread(p,M,1,fp);      //從fp所指向的文件讀入1個大小為M的數據,存儲到p所指向的空間中 
           if(n==1) 
           {
              head=p;
              p2=p;
              head->pre=NULL;
              
            }
            else                //創建雙向鏈表 
            {
                pr=p2;          //pr是p的前驅結點 
                p->pre=p2;
                p2->next=p;
                p2=p;
            }
        }
        if(pr!=NULL)
        {
            pr->next=NULL;
        }
    }
    fclose(fp);
    if(n==1)
        head=NULL;
    return head;
 }
 
void add_information()     //添加信息 
{
    do
    {
        system("cls");              //清屏 
        system("color 75");       //顏色 
        HideCursor();             //隱藏光標 
        IAEP p;                    
        char t;            
        toxy(50,5); 
        printf("個人賬戶管理軟件");
        p=(IAEP)malloc(M);         //申請一段大小為M 的空間 
        toxy(44,8);
        printf("請輸入金額:");
        scanf("%f",&p->iae);
        getchar();              //吸收回車鍵 
        toxy(44,10);
        printf("請輸入收支類型(-代表支出,+代表收入):"); 
        scanf("%c",&p->ch);
        getchar();
        toxy(44,12);
        printf("請輸入時間(年 月 日):");
        scanf("%d%d%d",&p->year,&p->month,&p->day);
        getchar();
        toxy(44,14);
        printf("請輸入收入來源或支出目的:");
        gets(p->source_or_aim); 
        save_information(p);             //保存p到文件中 
        toxy(44,16);
        printf("正在保存....");
        Sleep(500);               //暫停0.5秒 
        system("cls");
        system("color 73");
        toxy(46,8);
        printf("-------------------------");
        toxy(46,9);
        printf("|                       |");
        toxy(46,10);
        printf("| 保存成功!是否繼續?  |");
        toxy(46,12);
        printf("| 1.是             2.否 |");
        toxy(46,13);
        printf("|                       |");
        toxy(46,14);
        printf("-------------------------");
        while(1)     
        {
            t=getch();  //輸入t    
            if(t=='1')          
            { 
                break;
            }
            else if(t=='2')     //如果輸入t為2,進入菜單 
            {
                menu();break;
            }
        }
    }while(1);  //永遠為真 
}
 
void print_information()     //輸出賬單 
{
    system("cls");         //清屏 
    system("color 76");    //看著舒服的顏色 
    HideCursor();          //隱藏光標,看著更舒服 
    FILE *fp;              //文件指針 
    int n=0; 
    int i=12;
    char t;
    float sum=0,sum1=0,sum2=0;
    IAEP head=NULL;
    IAEP p,p2,pr=NULL;
    fp=fopen(_name,"ab+");//打開文件,方式為隻讀 
    if(fp==NULL)            //如果打開為空 
    {
        printf("cannot open file\n");
    }
    while(!feof(fp))         // feof函數可以檢查文件讀寫位置標志是否移動到文件末尾,feof(fp)檢查fp所指向的文件是否結束,如果是 
    {                        //則函數值為真,否則為假,即“!feof(fp)”為真,在while循環中檢查 “!feof(fp)”為真,就執行循環體 
       n++;
       p=(IAEP)malloc(M);   //向內存申請一段空間 
       fread(p,M,1,fp);      //從fp所指向的文件讀入1個大小為M的數據,存儲到p所指向的空間中 
       if(n==1) 
       {
          head=p;
          p2=p;
          head->pre=NULL;
          
        }
        else                //創建雙向鏈表 
        {
            pr=p2;          //pr是p的前驅結點 
            p->pre=p2;
            p2->next=p;
            p2=p;
        }
        //printf("%d.%d.%-12d%c%-24f%s\n",p->year,p->month,p->day,p->ch,p->iae,p->source_or_aim);
    }
    fclose(fp);             //關閉fp所指向的文件
    toxy(50,5);
    printf("個人賬戶管理軟件");
    toxy(54,7);
    printf("賬單明細(按0返回)");
    toxy(30,8);
    printf("----------------------------------------------------------------");
    toxy(30,9);
    printf("時     間          金   額                 收入來源或支出目的");
    toxy(30,10);
    printf("----------------------------------------------------------------");
    if(pr!=NULL)
    { 
        pr->next=NULL; 
        p=pr;
        while(p!=NULL)
        {
            toxy(30,i);
            printf("%d.%d.%-12d%c%-24f%s\n",p->year,p->month,p->day,p->ch,p->iae,p->source_or_aim);
            if(p->ch=='+')
            {
                sum1+=p->iae;
            }
            else if(p->ch=='-')
            {
                sum2-=p->iae;
            }
            sum=sum1+sum2;
            i++;
            p=p->pre;
        }
        toxy(30,11);
        printf("總   計: %f    總支出: %f    總收入: %f",sum,sum2,sum1);
    }
    else if(pr==NULL)
    {
        toxy(50,11);
        printf("您還沒記錄任何信息哦~");
    }
    while(1)
    {
        t=getch();
        if(t=='0')
        {
            menu();break;
        }
    }
 } 
 
void find_information()     //查找信息
{
    
    system("cls");         //清屏 
    system("color 77");    //看著舒服的顏色 
    HideCursor();          //隱藏光標,看著更舒服 
    int i=15;
    char t;
    int year,month,day;
    IAEP p=NULL;
    p=ss();
    toxy(50,5);
    printf("個人賬戶管理軟件");
    toxy(54,7);
    printf("查找信息");
    toxy(40,9);
    printf("請輸入您要查找的信息(輸入年月日,空格隔開):");
    toxy(50,10);
    scanf("%d%d%d",&year,&month,&day);
    getchar(); 
    toxy(30,12);
    printf("----------------------------------------------------------------");
    toxy(30,13);
    printf("時     間          金   額                 收入來源或支出目的");
    toxy(30,14);
    printf("----------------------------------------------------------------");
    if(p!=NULL)
    {
        //printf("\n%s\n",p->source_or_aim);
        while(p!=NULL)
        {
            if(p->year==year&&p->month==month&&p->day==day)
            {
                toxy(30,i);
                printf("%d.%d.%-12d%c%-24f%s\n",p->year,p->month,p->day,p->ch,p->iae,p->source_or_aim);
                i++;
            }
            p=p->next;
        }
    }
    else if(p==NULL)
    {
        toxy(50,i);
        printf("沒有找到相應的信息~");
    }
    toxy(54,i+1);
    printf("按0返回主菜單!");
    while(1)
    {
        t=getch();
        if(t=='0')
        {
            menu();break;
        }
    }
 } 
 
 
void delete_information()    //刪除信息 
{
    do{
        system("cls");
        system("color 79");
        HideCursor();                 //隱藏光標 
        FILE *fp;           //文件指針 
        int year,month,day,i,j;
        int c;
        char t,k,ch; 
        IAEP p,head,pr=NULL;
        head=ss();                  //調用ss()函數,將該函數的返回值賦給head 
        toxy(50,5);
        printf("個人賬戶管理軟件");
        toxy(54,7);
        printf("刪除信息");
        toxy(40,9);
        printf("請輸入您要查找的信息(輸入年月日,空格隔開):");
        toxy(50,10);
        scanf("%d%d%d",&year,&month,&day);       //輸入年月日 
        toxy(30,12);
        printf("----------------------------------------------------------------");
        toxy(30,13);
        printf("時     間          金   額                 收入來源或支出目的");
        toxy(30,14);
        printf("----------------------------------------------------------------");
        i=15;j=0;            //給i,j初始化 
        p=head;               //註意,再次使p重新指向第一個結點,不要忘瞭 
        while(p!=NULL)
        {
            if(p->year==year&&p->month==month&&p->day==day)
            {
                toxy(28,i);
                j++;                        //j是標記被搜索的信息 
                printf("%d: %d.%d.%-12d%c%-24f%s\n",j,p->year,p->month,p->day,p->ch,p->iae,p->source_or_aim);
                p->num=j;                   //將j賦值給p->num 
                i++;
            }
            p=p->next;
        }
        if(j==0)                   //如果j=0,即沒有進入前面的搜索循環,也就是沒有找到相應的信息 
        { 
            toxy(50,i);
            printf("沒有找到相應的信息!(按0返回,按1重新搜索)");
            while(1)               //死循環是為瞭防止除0和1的其他按鍵幹擾 
            {
                ch=getch();
                if(ch=='0')
                {
                    menu();break;
                }
                else if(ch=='1')
                {
                    break;
                }
            }
            if(ch=='1')     //如果輸入的ch等於1,則結束本次循環 
               continue;
        }
        while(1)
        {
            toxy(50,i);
            printf("請輸入您要刪除的信息的標號:");
            scanf("%d",&c);
            getchar();
            i++;
            if(c<=j)              //如果c<=j,即輸入正確 
                break;
            else if(c>j)         //否則,輸入錯誤 
            {
                toxy(50,i);
                printf("沒有找到您所要刪除的信息,請重新輸入!");
                i++;
                Sleep(500);      //暫停0.5秒 
            }
        }
        toxy(46,16);
        printf("-------------------------");
        toxy(46,17);
        printf("|                       |");
        toxy(46,18);
        printf("|       確認刪除?      |");
        toxy(46,19);
        printf("| 1.確認         2.取消 |");
        toxy(46,20);
        printf("|                       |");
        toxy(46,21);
        printf("-------------------------");
        while(1)
        {
            p=head;               //每一次遍歷鏈表之前,記得將p指向頭結點 
            pr=NULL;
            t=getch();             //輸入t 
            if(t=='1')                           //如果輸入t=1,即選擇確認刪除選項 
            {
                while(p!=NULL&&p->num!=c)
                {
                    pr=p;                     //pr記錄p的前驅結點 
                    p=p->next;               //p指向下一節點 
                }
                if(p!=NULL)
                {
                    if(pr==NULL)                //如果pr=NULL,即刪除的結點為第一個結點 
                    {                                 
                        head=p->next;
                    }
                    else                         //否則,刪除其他結點 
                    {
                        pr->next=p->next;
                    }
                }
                free(p);                  //釋放p 
                break;                   //跳出循環 
            }
            else if(t=='2')              //如果輸入t=2,即選擇取消刪除選項 
            {
                system("cls");         //清屏 
                toxy(46,8);
                printf("------------------------------");
                toxy(46,9);
                printf("|                            |");
                toxy(46,10);
                printf("|  返回刪除界面還是回主菜單  |");
                toxy(46,11);
                printf("| 1.刪除界面      2.主菜單   |");
                toxy(46,12);
                printf("|                            |");
                toxy(46,13);
                printf("------------------------------");
                while(1)                    //死循環為瞭防止其他按鍵的幹擾 
                {
                    k=getch();               //輸入K 
                    if(k=='1')
                        break;
                    else if(k=='2')        //如果輸入k=2,回到主菜單 
                        menu();
                }
                if(k=='1')
                   break;
            }
        }
        if(t=='1')                  
        {                            
            fp=fopen(_name,"wb");                  //先清空原文件內容再將修改後的信息寫入文件 
            if(fp==NULL)
            {
                printf("cannot open file\n");
            }
            if(fwrite(head,M,1,fp)!=1)                 //將head所指向的數據寫入fp所指向的文件 
            {
                printf("file write error\n");
            }
            fclose(fp);                         //關閉文件
            if(head!=NULL)                        //如果頭指針不為空 
            {
                p=head->next;                //使p指向第二個結點 
                fp=fopen(_name,"ab");          // 打開文件,方式為追加 
                while(p!=NULL)                    //p不為空就執行循環體 
                {
                    if(fwrite(p,M,1,fp)!=1)            //將p所指向的1個大小為N的數據結構寫入fp所指向的文件 
                    {
                    printf("file write error\n");
                    }
                    p=p->next;                     //使p指向下一個結點 
                }
                fclose(fp);              //關閉文件 
            }
            system("cls");
            system("color 75");
            toxy(48,16);
            printf("正在刪除,請稍後....");
            Sleep(500);
            system("cls");
            toxy(48,16);
            printf("刪除成功!自動跳轉到菜單....");
            break;
        }
    }while(1);//永遠為真 
    Sleep(500);
    menu();
}
 
 
void amend_information()   //修改信息 
{
    system("cls");         //清屏 
    system("color 79");    //看著舒服的顏色 
    HideCursor();          //隱藏光標,看著更舒服
    IAEP p,head;
    FILE *fp;
    int i=15,j=0,c; 
    int year,day,month,newyear,newday,newmonth;
    char source_or_aim[50];
    char ch,cc,t;
    int aie;
    head=ss();
    p=head;
    do
    {
        system("cls");
        toxy(50,5);
        printf("個人賬戶管理軟件");
        toxy(54,7);
        printf("修改信息");
        toxy(40,9);
        printf("請輸入您要修改的信息(輸入年月日,空格隔開):");
        toxy(50,10);
        scanf("%d%d%d",&year,&month,&day);
        getchar();
        toxy(30,12);
        printf("----------------------------------------------------------------");
        toxy(30,13);
        printf("時     間          金   額                 收入來源或支出目的");
        toxy(30,14);
        printf("----------------------------------------------------------------");
        i=15;j=0;
        while(p!=NULL)   //將每個結點的p->num都賦為0,以免後面數據幹擾 
        {
            p->num=0;
            p=p->next;
        }
        p=head;      //重新讓p指向head 
        while(p!=NULL)
        {
            if(p->year==year&&p->month==month&&p->day==day)
            {
                toxy(30,i);
                j++;
                printf("%d: %d.%d.%-12d%c%-24f%s\n",j,p->year,p->month,p->day,p->ch,p->iae,p->source_or_aim);
                p->num=j;      //給p->num賦值,即給滿足搜索要求的結點編號 
                i++;
            }
            p=p->next;
        }
        if(j==0)                   //如果j=0,即沒有進入前面的搜索循環,也就是沒有找到相應的信息 
        { 
            toxy(50,i);
            printf("沒有找到相應的信息!(按0返回,按1重新搜索)");
            while(1)               //死循環是為瞭防止除0和1的其他按鍵幹擾 
            {
                ch=getch();     
                if(ch=='0')
                {
                    menu();break;
                }
                else if(ch=='1')
                {
                    break;
                }
            }
            if(ch=='1')     //如果輸入的ch等於1,則結束本次循環 
               continue;
        }
        while(1)
        {
            toxy(50,i);
            printf("請輸入您要修改的信息的標號:");
            scanf("%d",&c);
            getchar();
            i++;  
            if(c<=j)              //如果c<=j,即輸入正確 
                break;
            else if(c>j)         //否則,輸入錯誤 
            {
                toxy(50,i);
                printf("沒有找到您所要修改的信息,請重新輸入!");
                i++;
                Sleep(500);      //暫停0.5秒 
            }
        }
        p=head;      //讓p重新指向head,即第一個結點 
        while(p!=NULL&&p->num!=c)    //遍歷鏈表,尋找滿足要求的結點 
        {
            p=p->next;
        }
        if(p!=NULL)      //如果尋找成功,進入修改部分 
        {
            system("cls");    //清屏 
            toxy(44,8);
            printf("請輸入修改後的金額:");
            scanf("%d",&aie);getchar();p->iae=aie;
            toxy(44,10);
            printf("請輸入收支類型(-代表支出,+代表收入):");
            scanf("%c",&cc);getchar();p->ch=cc;
            toxy(44,12);
            printf("請輸入時間(年 月 日):");
            scanf("%d%d%d",&newyear,&newmonth,&newday);getchar();
            p->year=newyear;p->month=newmonth;p->day=newday;
            toxy(44,14);
            printf("請輸入收入來源或支出目的:");
            gets(source_or_aim);
            strcpy(p->source_or_aim,source_or_aim);
            toxy(46,16);
            printf("-------------------------");
            toxy(46,17);
            printf("|                       |");
            toxy(46,18);
            printf("|     是否確認修改?    |");
            toxy(46,19);
            printf("| 1.確認         2.取消 |");
            toxy(46,20);
            printf("|                       |");
            toxy(46,21);
            printf("-------------------------");
            while(1)    //死循環為防止其他按鍵幹擾 
            {
                t=getch();
                if(t=='1')
                   break;
                else if(t=='2')
                {
                    menu();
                }
             } 
             if(t=='1')  //如果t等於1,則跳出循環 
             {
                 break; 
             }
        }
    }while(1);
    p=head;     //p重新指向頭節點 
    system("cls");
    toxy(44,12);
    printf("正在修改....");
    fp=fopen(_name,"wb");   //打開文件的同時清除文件內的內容 
    if(fp==NULL)
    {
        printf("cannot open file");
    }
    while(p!=NULL)
    {
        if(fwrite(p,M,1,fp)!=1)    //將p所指向的內容存入fp所指向的文件中 
        {
            printf("file write error\n");
        }
        p=p->next;
    }
    fclose(fp);     //關閉文件 
    Sleep(500);
    system("cls");
    toxy(44,12);
    printf("修改成功!正在自動跳轉到主菜單....");
    Sleep(500);
    menu();
}
 
 
void save_information(IAEP p)    //保存信息 
{
    FILE *fp;       //文件指針 
    fp=fopen(_name,"ab");    //以追加的方式打開文件 
    if(fp==NULL)
    {
        printf("cannot open file\n");
        
    }
    if(fwrite(p,M,1,fp)!=1)    //將p所指向的1個大小為M的數據結構寫入fp所指向的文件中 
    {
        printf("file write error\n");
    }
    fclose(fp);        //關閉文件
 } 
 
void over()       //退出軟件 
{
    char t;
    toxy(48,11);
    printf("-----------------------");
    toxy(48,12);
    printf("|   您確定要退出嗎?  |");
    toxy(48,14);
    printf("| 1.確定     2.取消   |");
    toxy(48,15);
    printf("-----------------------");
    while(1)
    {
        t=getch();         //輸入t
        switch(t)
        {
            case '1':
            system("cls");
            system("color 78");
            toxy(48,10);
            printf("正在安全退出....");
            Sleep(1000);     //暫停1秒 
            system("cls");
            system("color 75");
            toxy(48,10);
            printf("已安全退出軟件");
            toxy(48,12);
            printf("謝謝使用!");
            toxy(48,14);
            printf("by-by^_^");
            exit(0);  break; //終止程序 
            case '2':
            menu(); break;   //調用函數,進入菜單 
            default :break;
        }
    }
}
 
main()      //簡單明瞭的主函數^~^ 
{
    signin(); //調用函數 
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: