当前位置:首页 > 开发教程 > C语言 >

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

时间:2022-05-30 13:32 来源:未知 作者:爱情水深王八多 收藏

这篇文章主要为大家详细介绍了C语言实现个人财务管理软件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

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

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

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(); //调用函数
}

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


下一篇:没有了

C语言阅读排行

最新文章