本文实例为大家分享了C语言实现个人财务管理软件的具体代码,供大家参考,具体内容如下
代码:
/*课程设计项目名称:个人账户管理软件 作者:施瑞文 专业:软件工程(商业智能) 时间: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(); //调用函数 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。