C语言实现个人财务管理软件

本文实例为大家分享了C语言实现个人财务管理软件的具体代码,供大家参考,具体内容如下

C语言实现个人财务管理软件_第1张图片

C语言实现个人财务管理软件_第2张图片

C语言实现个人财务管理软件_第3张图片

C语言实现个人财务管理软件_第4张图片

C语言实现个人财务管理软件_第5张图片

代码:

/*课程设计项目名称:个人账户管理软件
  作者:施瑞文 
  专业:软件工程(商业智能) 
  时间:2018.1
*/ 
#include
#include
#include
#include
#include 
#include
#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(); //调用函数 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(C语言实现个人财务管理软件)