一、关于
(1)要求:

1.选题:家庭财务管理系统
2.项目简介:编程实现一个家庭财务管理系统,系统能够通过菜单提供功能选择,能够实现家庭财务收入及财务支出的添加、查询、删除、 修改等功能,能够实现家庭财务数据的统计功能。
3. 基础语法(数据类型、运算符与表达式、流程控制数):预处理命令、数组、指针、函数、结构体、链表、文件操作等

(2)概述
  1. 功能:添加收入/支出;查询;删除;修改;统计;

  2. 实现过程:通过结构体链表储存信息;

    (文末附有完整代码)

(3)重点及难点
  1. 结构体:对于类似家庭财务管理系统,图书管理系统等项目,需要储存信息的时候使用一连串连续的空间,以便更好地储存信息,保证信息的完整性与可读性,故多选择结构体实现而非数组。

  2. 没有选择全局变量,而是在主函数中定义一个指针变量,防止了全局变量可能出现的错误;但注意:每个函数入口处基本上都会传递指针的头节点所在地址;在调用修改添加删除函数时返回头节点。

  3. 很多函数不是定义为void型,但也不一定会使用其返回值。不定义为void类型主要是为了能更好的控制该函数的结束(例如:int函数中若满足某种条件可以直接return 0或者其他数字来结束函数),使用可以更方便。

  4. do-while语句的方便使用(很多时候可以替换常见的while语句,让程序更简单明了)

  5. 特别注意:本文只给出了写的部分收入的代码,如果还要完整添加支出代码的话,在代码中的函数类型不是INPUT *的函数可以直接使用在支出函数里面,而用INPUT *定义的函数则需要重新编写(即把INPUT *改为OUTPUT *

二、实现过程及代码分析

(都附有函数代码及较详细的讲解)

  • 主函数部分
int main()
{int n = 1;INPUT *head=NULL;menu(n);scanf("%d", &n);while (n) {switch (n) {case 1:head=add_in(head);break;case 2:search_in(head);break;case 3:head=del_in(head);break;case 4:modify_in(head);break;case 5://    add_out(); break;case 6://    search_out();break;case 7://    del_out();break;case 8://    modify_out();break;case 9:total_in(head);break;case 10:
//   total_out();default:printf(">输入的数字有误,请重新输入!\n\n");  //如果选择的操作不合理,则会输出提示并要求重新输入;}if (n>0 && n<10) {system("cls");}menu(n);scanf("%d", &n);}return 0;
}
  • 菜单函数
void menu(int n){if (n > 0 && n < 11){printf("                                                      \n");printf("  ---------------------------------------------------- \n");printf(" |                  家庭财务管理系统                  |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >收入管理                         |\n");printf(" |----------------------------------------------------|\n");printf(" |                     1.添加收入                     |\n");printf(" |                     2.查询收入详情                 |\n");printf(" |                     3.删除收入                     |\n");printf(" |                     4.修改收入                     |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >支出管理                         |\n");printf(" |----------------------------------------------------|\n");printf(" |                     5.添加支出                     |\n");printf(" |                     6.查询支出详情                 |\n");printf(" |                     7.删除支出                     |\n");printf(" |                     8.修改支出                     |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >统计                             |\n");printf(" |----------------------------------------------------|\n");printf(" |                     9.统计总收入                   |\n");printf(" |                     10.统计总支出                  |\n");  printf(" |----------------------------------------------------|\n");printf(" |                     0.退出系统                     |\n");printf("  ---------------------------------------------------- \n");printf("                                                       \n");printf(">请选择要进行的操作(0-10):");}else if (n >= 11 || n < 0){       printf(">请选择要进行的操作(0-10):");}
}
  • 添加收入函数:
    输出信息一行一行提示,根据提示输入所填信息;
    输入编号后要查重;
    提交成功后,询问是否继续输入(嵌套,递归调用)
    是否返回主菜单
//增加收入函数(可以根据用户的需求申请空间,将信息储存在结构体中并通过链表连接)
INPUT *add_in(INPUT *head){ char c='y';int a;while(c=='y' || c=='Y'){head=build(head);                       //使用build函数printf(">是否继续输入?(y/n):");scanf(" %c",&c); }if(c=='n' || c=='N'){printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");  //可以返回主菜单scanf("%d",&a);if(a==2)exit(0);}return head;
}
//建立链表(使新申请空间的结构体通过链表串起来)
INPUT *build(INPUT *head){INPUT *pt=NULL;    //添加后的当前链表尾节点 ;; INPUT *prept=NULL;   //当前链表尾节点;pt=(INPUT *)malloc(sizeof(INPUT));if(pt!=NULL){printf(">请输入编号:"); scanf("%d",&pt->num);while(checknum(head,pt->num)!=NULL){    //使用checknum函数printf(">编号重复,请重新输入:");    //可以检查编号是否重复scanf("%d",&pt->num);}printf(">请输入姓名:");scanf("%s",pt->Name);printf(">请输入日期(例如:20190711):"); scanf("%ld",&pt->date); printf(">请输入收入金额:");scanf("%d",&pt->money);printf(">请输入备注:");scanf("%s",pt->other);printf(">输入成功!\n"); if(head==NULL){head=pt;prept=pt; }else{prept=findlast(head);   //如果指针没有到达当前链表末尾,则知道找到末指针为止(使用findlast函数)prept->next=pt;}pt->next=NULL;return head;}
}
//查找并指向尾节点
INPUT *findlast(INPUT *head){INPUT *pr;pr=head;while(pr->next!=NULL){pr=pr->next;}return pr;
}
INPUT *checknum(INPUT *head,int m)  //编号查询 (如果传入函数的编号和结构体链表中储存的编号有相同,则输出该结构体的地址,否则输出NULL)
{INPUT *pr;pr=head;while(pr!=NULL){if(pr->num==m){return pr; }elsepr=pr->next;}return NULL;
}
  • 查询收入明细:
    提示查询依据:名字/月份/年份;
    输出所有已查到的信息
    是否继续查询
    是否返回主菜单
//添加收入函数
void search_in(INPUT *head){int a;int sin_num;char sin_Name[20];long sin_date;char c; do{INPUT *pr=NULL;printf(">请选择查询依据(1.编号;2.月份;3.姓名;4.全部收入):");   //如输入的数字有误,则会报错;scanf("%d",&a);if(a!=1 && a!=2 && a!=3 && a!=4){printf(">输入的数字有误!\n");continue;}else{if(a==1){ printf(">输入需要查询的编号:");scanf("%d",&sin_num);while((pr=checknum(head,sin_num))==NULL){   //按编号查询,调用checknum函数printf(">未找到该编号对应的收入信息!\n");printf(">请重新输入编号:");scanf("%d",&sin_num);}printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);}else if(a==2){    printf(">输入需要查询的月份(例如:201907):");scanf("%ld",&sin_date);while(checkmonth(head,sin_date)==0){         //按月份查询,调用checkmonth函数printf(">未找到该月份对应的收入信息!\n");printf(">请重新输入月份:");scanf("%d",&sin_date);}}else if(a==3){printf(">输入需要查询的姓名:");scanf("%s",&sin_Name);while(checkName(head,sin_Name)==0){       //按姓名查询,调用checkName函数printf(">未找到该姓名对应的收入信息!\n");printf(">请重新输入姓名:");scanf("%s",&sin_Name);}}else if(a==4){           //显示所有 show(head);}printf(">是否继续查询(y/n):");getchar();scanf("%c",&c);} }while(c=='y' ||c=='Y');if(c=='n' || c=='N'){printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2)exit(0);}
}
 //月份查询 (原理同checunum)
int checkmonth(INPUT *head,int m)
{m=m*100;int k=0;INPUT *pr;pr=head;if((pr->date)>m && (pr->date)<m+100){printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");}while(pr!=NULL){if((pr->date)>m && (pr->date)<m+100){printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);pr=pr->next;k++;}elsepr=pr->next;}return k;
}
//名字查询 (原理同checunum)
int checkName(INPUT *head,char m[]){int k=0;INPUT *pr;pr=head;if(strcmp(pr->Name,m)==0){printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");}while(pr!=NULL){if(strcmp(pr->Name,m)==0){printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);pr=pr->next;k++;}elsepr=pr->next;}return k;
}
//显示所有
void show(INPUT * head){INPUT * p = head;printf("\n-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n"); while (p != NULL){printf("%-8d%-13s%-10ld%-14d%-12s\n",p->num,p->Name,p->date,p->money,p->other);p = p->next;}
}
  • 删除: 输入编号,判断是否存在,若该信息存在则删除,若不存在则提示错误 (这里特意加的编号,因为其余所有信息都可以一样,这里的话就通过编号以便删除信息) 是否继续删除 是否返回主菜单
//删除收入
INPUT *del_in(INPUT *head){int a;int k=0; INPUT *pt=head;INPUT *pr=NULL;long del_num;char c;if(pt==NULL){printf(">系统里没有录入数据!要返回主菜单");system("pause"); return NULL;}do{pt=head;k=0;if(pt==NULL){printf(">系统里没有录入数据!要返回主菜单");system("pause");return NULL;}printf(">请输入需要删除的编号:");scanf("%ld",&del_num); while(pt!=NULL){if(del_num!=pt->num && pt->next!=NULL){   //如果pt不为尾节点而且pt当前所指结构体num编号数据不等于要查询的数据,就让pt指向下一个结构体,pr指向当前结构体pr=pt;pt=pt->next;}else if(del_num!=pt->num && pt->next==NULL){    //如果尾节点为空,即跳出循环,说明整个链表中没有找到;break;} else if(pt->num==del_num &&pt->next!=NULL){     //如果找到了编号相同的结构体且该结构体不为尾节点if(pt==head){     //如果该结构体为头,若删掉该结构体就必须更改head的值;head=pt->next;}else{      //如果该结构体不为头,就让上一个pr,即上一个当前结构体直接指向下一个结构体(相当于跨过中间的结构体),让整个链表还是能连接起来;pr->next=pt->next;}k++;break;}else if(pt->num==del_num &&pt->next==NULL){   //如果找到了编号相同的结构体且该结构体为尾节点,则令pr,即上一个当前结构体指向空,即为结束;if(pt==head){head=pt->next=NULL;}else{pr->next=NULL;} k++;break;}}if(k==0){printf(">没有找到需要删除的数据!\n"); }else{printf(">删除成功!\n"); }printf(">是否继续删除(y/n):");scanf(" %c",&c); }while(c=='y' || c=='Y');printf(">请选择要进行的操作(1)返回主菜单(2)直接退出):");scanf("%d",&a);if(a==1){return head;}else{exit(0);}
}
  • 修改: 询问修改的编号,通过编号进入需要修改内容的收入信息中; 选择修改内容(编号/日期/姓名/备注/金额) 询问是否继续修改当前条数 询问是否修改其他条数 是否返回主菜单
    (修改部分的逻辑较为复杂,建议理解清楚:修改分为是否继续修改当前内容和是否继续修改其他内容,如果都不修改的话才会退出该功能)
//修改收入
void modify_in(INPUT *head){INPUT *pr;char c;int a,m_num,s;int k=0;char ch; do{k=0;pr=head;printf("请输入需要修改的收入编号:");      //第一次修改,没有循环结构scanf("%d",&m_num);while(pr!=NULL){if(pr->num==m_num){k+printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");scanf("%d",&s);printf("请输入修改的内容:"); if(s==1){scanf("%d",&pr->num);}else if(s==2){scanf("%ld",&pr->date);}else if(s==3){scanf("%s",pr->Name);}else if(s==4){scanf("%d",&pr->money);}else if(s==5){scanf("%s",pr->other);}break;}else{pr=pr->next;}}if(k==0){printf(">未找到对应的收入信息!"); ch='n'; }else if(k>0){printf(">修改成功!"); printf("是否继续修改当前收入的内容?(y/n)");scanf(" %c",&ch);} while(ch=='y' ||ch=='Y'){       //第二次及以后的修改,这里添加了循环结构k=0;while(pr!=NULL){if(pr->num==m_num){k++;printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");scanf("%d",&s);printf("请输入修改的内容:"); if(s==1){scanf("%d",&pr->num);}else if(s==2){scanf("%ld",&pr->date);}else if(s==3){scanf("%s",pr->Name);}else if(s==4){scanf("%d",&pr->money);}else if(s==5){scanf("%s",pr->other);}break;} else{pr=pr->next;}}if(k>0){printf("修改成功!\n");}else{printf(">未找到对应的收入信息!"); }printf("是否继续修改当前收入的内容?(y/n)");scanf(" %c",&ch);}printf("是否继续修改收入?(y/n)");scanf(" %c",&c); }while(c=='y'||c=='Y');printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2){exit(0);}
}
  • 统计: 提示所需统计的依据,即姓名/年份/月份 输出总收入,总支出,净收入
//统计总收入
INPUT *total_in(INPUT *head)
{INPUT *p=head;char ch;char c;int n,k,a;long fin_year,fin_month;char fin_Name[20];long sum=0;do{sum=0;k=0;p=head;if(p==NULL){printf("系统里没有任何数据!要返回主菜单");system("pause");return NULL;}printf("请选择统计依据:(1.姓名;2.年份;3.月份;4.总金额):");scanf("%d",&n);switch(n){case 1:printf("请输入姓名:");scanf("%s",&fin_Name);while(p!=NULL){if(!strcmp(fin_Name,p->Name)){sum=sum+p->money;k++;}p=p->next;}if(k==0){printf("没有找到该姓名对应的收入信息!\n"); }else{printf("用户为%s的收入总和为%ld\n",fin_Name,sum);}break;case 2:printf("请输入年份:");scanf("%ld",&fin_year);fin_year=fin_year*10000;while(p!=NULL){if((fin_year<p->date) &&(fin_year+10000)>p->date){sum+=p->money;k++;}p=p->next;}if(k==0){printf("没有找到该年份对应的收入信息!\n"); }else{printf("年份为%ld的收入总和为%ld\n",fin_year/10000,sum);}break;case 3:printf("请输入月份:");scanf("%ld",&fin_month);fin_month=fin_month*100;while(p!=NULL){if(fin_month<p->date &&(fin_month+100)>p->date){sum+=p->money;k++;}p=p->next;}if(k==0){printf("没有找到该年份对应的收入信息!\n"); }else{printf("月份为%ld的收入总和为%ld\n",fin_month/100,sum);}break;case 4:while(p!=NULL){sum=sum+p->money;p=p->next;} printf("总收入为:%ld\n",sum);break;default:printf("输入的编号有误,请重新输入!");break;}printf("是否要继续查询统计?(y/n)");scanf(" %c",&ch);}while(ch=='y' ||ch=='Y');printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2){exit(0);}
}
这里是小小的心得体会(与代码不是特别相关的部分):

1.因为之前在学课上学c的话只是简单的讲讲语法,讲讲用法及思路,没有真正了解到工程的做法与具体实施,这一次通过合作完成项目了解了一个工程的大概步骤,对真正做一个东西有了概念。
2.做工程写工程文件,这些不止与单个的c或者c++代码文件有关,要注意函数的划分,各个部分之间的衔接与汇总;注意把声明,函数,主函数各个文件分开并以不同的文件夹存储,方便汇总及管理。

如果有什么问题欢迎大家提出来呀!

附:

完整代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct input{      //声明结构体变量int  num;long date;char Name[20];int  money;char other[50];struct input *next;
}INPUT;
void menu(int n);  //菜单
INPUT *add_in(INPUT *head);  //添加收入------------------
INPUT *build(INPUT *head);       //建立链表,输入数据
INPUT *findlast(INPUT *head);    //查找尾节点函数;
void search_in(INPUT *head); //查询收入------------------------------
void show(INPUT * head);  //显示查询结果
INPUT *checknum(INPUT *head,int m);   //查重(编号查重)函数
int checkmonth(INPUT *head,int m);
int checkName(INPUT *head,char m[]);
INPUT *del_in(INPUT *head);  //删除收入--------------------------------
void modify_in(INPUT *head); //修改收入---------------------------------
void add_out();  //添加支出
void search_out(); //查询支出
void del_out();  //删除支出
void modify_out(); //修改支出
INPUT *total_in(INPUT *head);  //统计总收入---------------------
void total_out();      //统计总支出
//主函数部分
int main()
{int n = 1;INPUT *head=NULL;menu(n);scanf("%d", &n);while (n) {switch (n) {case 1:head=add_in(head);break;case 2:search_in(head);break;case 3:head=del_in(head);break;case 4:modify_in(head);break;case 5://    add_out();break;case 6://    search_out();break;case 7://    del_out();break;case 8://    modify_out();break;case 9:total_in(head);break;case 10:
//   total_out();default:printf(">输入的数字有误,请重新输入!\n\n");}if (n>0 && n<10) {system("cls");}menu(n);scanf("%d", &n);}return 0;
}
//函数部分
void menu(int n)
{if (n > 0 && n < 11){printf("                                                      \n");printf("  ---------------------------------------------------- \n");printf(" |                  家庭财务管理系统                  |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >收入管理                         |\n");printf(" |----------------------------------------------------|\n");printf(" |                     1.添加收入                     |\n");printf(" |                     2.查询收入详情                 |\n");printf(" |                     3.删除收入                     |\n");printf(" |                     4.修改收入                     |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >支出管理                         |\n");printf(" |----------------------------------------------------|\n");printf(" |                     5.添加支出                     |\n");printf(" |                     6.查询支出详情                 |\n");printf(" |                     7.删除支出                     |\n");printf(" |                     8.修改支出                     |\n");printf(" |----------------------------------------------------|\n");printf(" |                  >统计                             |\n");printf(" |----------------------------------------------------|\n");printf(" |                     9.统计总收入                   |\n");printf(" |                     10.统计总支出                  |\n");  printf(" |----------------------------------------------------|\n");printf(" |                     0.退出系统                     |\n");printf("  ---------------------------------------------------- \n");printf("                                                       \n");printf(">请选择要进行的操作(0-10):");}else if (n >= 11 || n < 0){printf(">请选择要进行的操作(0-10):");}
}
INPUT *build(INPUT *head)   //建立链表
{INPUT *pt=NULL;    //添加后的当前链表尾节点 ;; INPUT *prept=NULL;   //当前链表尾节点;pt=(INPUT *)malloc(sizeof(INPUT));if(pt!=NULL){printf(">请输入编号:"); scanf("%d",&pt->num);while(checknum(head,pt->num)!=NULL){printf(">编号重复,请重新输入:");scanf("%d",&pt->num);}printf(">请输入姓名:");scanf("%s",pt->Name);printf(">请输入日期(例如:20190711):"); scanf("%ld",&pt->date); printf(">请输入收入金额:");scanf("%d",&pt->money);printf(">请输入备注:");scanf("%s",pt->other);printf(">输入成功!\n"); if(head==NULL){head=pt;prept=pt; }else{prept=findlast(head);prept->next=pt;}pt->next=NULL;return head;}
}
INPUT *add_in(INPUT *head)     //添加收入——————————————————————————
{ char c='y';int a;while(c=='y' || c=='Y'){head=build(head);printf(">是否继续输入?(y/n):");scanf(" %c",&c); }if(c=='n' || c=='N'){printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2)exit(0);}return head;
}
INPUT *findlast(INPUT *head)    //查找尾节点
{INPUT *pr;pr=head;while(pr->next!=NULL){pr=pr->next;}return pr;
}
INPUT *checknum(INPUT *head,int m)  //编号查询
{INPUT *pr;pr=head;while(pr!=NULL){if(pr->num==m){return pr; }elsepr=pr->next;}return NULL;
}
int checkmonth(INPUT *head,int m)      //月份查询
{m=m*100;int k=0;INPUT *pr;pr=head;if((pr->date)>m && (pr->date)<m+100){printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");}while(pr!=NULL){if((pr->date)>m && (pr->date)<m+100){printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);pr=pr->next;k++;}elsepr=pr->next;}return k;
}
int checkName(INPUT *head,char m[])   //名字查询
{int k=0;INPUT *pr;pr=head;if(strcmp(pr->Name,m)==0){printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");}while(pr!=NULL){if(strcmp(pr->Name,m)==0){printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);pr=pr->next;k++;}elsepr=pr->next;}return k;
}
void search_in(INPUT *head)      //查询收入————————————————————————————
{int a;int sin_num;char sin_Name[20];long sin_date;char c; do{INPUT *pr=NULL;printf(">请选择查询依据(1.编号;2.月份;3.姓名;4.全部收入):"); scanf("%d",&a);if(a!=1 && a!=2 && a!=3 && a!=4){printf(">输入的数字有误!\n");continue;}else{if(a==1){      //按编号查询 printf(">输入需要查询的编号:");scanf("%d",&sin_num);while((pr=checknum(head,sin_num))==NULL){printf(">未找到该编号对应的收入信息!\n");printf(">请重新输入编号:");scanf("%d",&sin_num);}printf("-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n");printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);}else if(a==2){     //按月份查询 printf(">输入需要查询的月份(例如:201907):");scanf("%ld",&sin_date);while(checkmonth(head,sin_date)==0){printf(">未找到该月份对应的收入信息!\n");printf(">请重新输入月份:");scanf("%d",&sin_date);}}else if(a==3){printf(">输入需要查询的姓名:");scanf("%s",&sin_Name);while(checkName(head,sin_Name)==0){printf(">未找到该姓名对应的收入信息!\n");printf(">请重新输入姓名:");scanf("%s",&sin_Name);}}else if(a==4){    //显示所有 show(head);}printf(">是否继续查询(y/n):");getchar();scanf("%c",&c);} }while(c=='y' ||c=='Y');if(c=='n' || c=='N'){printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2)exit(0);}
}
void show(INPUT * head)     //显示所有
{INPUT * p = head;printf("\n-------------------------------------------------\n");printf(" 编号   成员姓名     日期      收入金额      备注\n"); while (p != NULL)                                                     {printf("% -8d%-13s%-10ld%-14d%-12s\n",p->num,p->Name,p->date,p->money,p->other);p = p->next;}
}
INPUT *del_in(INPUT *head)  //删除收入——————————————————————————————————
{int a;int k=0; INPUT *pt=head;INPUT *pr=NULL;long del_num;char c;if(pt==NULL){printf(">系统里没有录入数据!要返回主菜单");system("pause"); return NULL;}do{pt=head;k=0;if(pt==NULL){printf(">系统里没有录入数据!要返回主菜单");system("pause");return NULL;}printf(">请输入需要删除的编号:");scanf("%ld",&del_num);while(pt!=NULL){if(del_num!=pt->num && pt->next!=NULL){pr=pt;pt=pt->next;}else if(del_num!=pt->num && pt->next==NULL){break;} else if(pt->num==del_num &&pt->next!=NULL){if(pt==head){     head=pt->next;}else{pr->next=pt->next;}k++;break;}else if(pt->num==del_num &&pt->next==NULL){if(pt==head){head=pt->next=NULL;}else{pr->next=NULL;} k++;break;}}if(k==0){printf(">没有找到需要删除的数据!\n"); }else{printf(">删除成功!\n"); }printf(">是否继续删除(y/n):");scanf(" %c",&c); }while(c=='y' || c=='Y');printf(">请选择要进行的操作(1)返回主菜单(2)直接退出):");scanf("%d",&a);if(a==1){return head;}else{exit(0);}
}
void modify_in(INPUT *head)      //修改收入——————————————————————————————————
{INPUT *pr;char c;int a;int m_num; int s;int k=0;char ch; do{k=0;pr=head;printf("请输入需要修改的收入编号:");scanf("%d",&m_num);while(pr!=NULL){if(pr->num==m_num){k++;printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");scanf("%d",&s);printf("请输入修改的内容:"); if(s==1){scanf("%d",&pr->num);}else if(s==2){scanf("%ld",&pr->date);}else if(s==3){scanf("%s",pr->Name);}else if(s==4){scanf("%d",&pr->money);}else if(s==5){scanf("%s",pr->other);}break;}else{pr=pr->next;}}if(k==0){printf(">未找到对应的收入信息!"); ch='n'; }else if(k>0){printf(">修改成功!"); printf("是否继续修改当前收入的内容?(y/n)");scanf(" %c",&ch);} while(ch=='y' ||ch=='Y'){k=0;while(pr!=NULL){if(pr->num==m_num){k++;printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");scanf("%d",&s);printf("请输入修改的内容:"); if(s==1){scanf("%d",&pr->num);}else if(s==2){scanf("%ld",&pr->date);}else if(s==3){scanf("%s",pr->Name);}else if(s==4){scanf("%d",&pr->money);}else if(s==5){scanf("%s",pr->other);}break;} else{pr=pr->next;}}if(k>0){printf("修改成功!\n");}else{printf(">未找到对应的收入信息!"); }printf("是否继续修改当前收入的内容?(y/n)");scanf(" %c",&ch);}printf("是否继续修改收入?(y/n)");scanf(" %c",&c); }while(c=='y'||c=='Y');printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2){exit(0);}
}
INPUT *total_in(INPUT *head)   //统计总收入——————————————————————————————————
{INPUT *p=head;char ch;char c;int n;int k;int a;long fin_year,fin_month;char fin_Name[20];long sum=0;do{sum=0;k=0;p=head;if(p==NULL){printf("系统里没有任何数据!要返回主菜单");system("pause");return NULL;}printf("请选择统计依据:(1.姓名;2.年份;3.月份;4.总金额):");scanf("%d",&n);switch(n){case 1:printf("请输入姓名:");scanf("%s",&fin_Name);while(p!=NULL){if(!strcmp(fin_Name,p->Name)){sum=sum+p->money;k++;}p=p->next;}if(k==0){printf("没有找到该姓名对应的收入信息!\n"); }else{printf("用户为%s的收入总和为%ld\n",fin_Name,sum);}break;case 2:printf("请输入年份:");scanf("%ld",&fin_year);fin_year=fin_year*10000;while(p!=NULL){if((fin_year<p->date) &&(fin_year+10000)>p->date){sum+=p->money;k++;}p=p->next;}if(k==0){printf("没有找到该年份对应的收入信息!\n"); }else{printf("年份为%ld的收入总和为%ld\n",fin_year/10000,sum);}break;case 3:printf("请输入月份:");scanf("%ld",&fin_month);fin_month=fin_month*100;while(p!=NULL){if(fin_month<p->date &&(fin_month+100)>p->date){sum+=p->money;k++;}p=p->next;}if(k==0){printf("没有找到该年份对应的收入信息!\n"); }else{printf("月份为%ld的收入总和为%ld\n",fin_month/100,sum);}break;case 4:while(p!=NULL){sum=sum+p->money;p=p->next;} printf("总收入为:%ld\n",sum);break;default:printf("输入的编号有误,请重新输入!");break;}printf("是否要继续查询统计?(y/n)");scanf(" %c",&ch);}while(ch=='y' ||ch=='Y');printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");scanf("%d",&a);if(a==2){exit(0);}
}

C语言专题 ⑥项目实训-家庭财务管理系统相关推荐

  1. Android实训-家庭财务管理系统

    家庭财务目录 一.开发环境 二.后台接口文档 三.Android 项目 1.新建项目HomeFinance 2.所使用的图片资源下载地址 3.实现登录注册功能 a. 涉及的知识点 b.res 1.登录 ...

  2. C语言编程实训企业计算,C语言编程项目实训

    24.C语言编程项目实训(高级)(全日制一个半月,夜班三个月,学费1390元) 理论与实操一体化课程: 一.C语言基础:1.应用C语言的各种特点:2.应用算法的含义.特点.表示方法 二.C的基本数据类 ...

  3. 大一项目实训—学生成绩管理系统

    大一项目实训-学生成绩管理系统 项目实训总结 由于自己大一在Java课中没有好好听讲,导致项目实训中完全是一边学习一边敲代码.但自己付出了很多努力,早上8.30起床,晚上2,3点才睡甚至通宵,虽然做的 ...

  4. Java项目:springboot家庭财务管理系统

    作者主页:夜未央5788 简介:Java领域优质创作者.Java项目.学习资料.技术互助 文末获取源码 项目介绍 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功能有: 支出管 ...

  5. 我的第一个Java项目实训--家庭记账软件!

    这是我刚学完流程控制的时候照着敲得一个小项目! class familyAccount{public static void main(String[] args){boolean isFlag=tr ...

  6. springboot家庭财务管理系统、

    项目介绍: springboot家庭财务管理系统. 系统说明: 家庭财务管理系统 项目引见 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功用有: 支出管理:支出详情: 收入管 ...

  7. c语言小车寻迹实训报告,循迹小车项目实训报告.doc

    循迹小车项目实训报告 寻迹小车的设计与制作实训报告 课程名称: C51程序设计 EDA技术 专业班级: 应电0935班 指导老师: 方跃春 谭刚林 小组成员: 黄春桥 汤政 孙巍明 阳毅 实训项目要求 ...

  8. C语言循环语句实训项目,C语言程序设计与项目实训

    C语言程序设计与项目实训 编辑 锁定 讨论 上传视频 <C语言程序设计与项目实训>是2013年清华大学出版社出版的图书,作者是吴艳平.徐海燕. 书    名 C语言程序设计与项目实训 作  ...

  9. java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调 ...

最新文章

  1. Java BitSet使用场景和示例
  2. 专访1药网技术副总裁黄哲铿:揭秘技术跨界管理之道
  3. [题解]CEOI 2004 锯木厂选址
  4. 零基础带你五行代码实现聊天机器人-再这么玩?咱还能做朋友吗?
  5. java利用模板发送邮件_使用JavaMail实现发送模板邮件以及保存到发件箱
  6. poco c++ library 特性
  7. 【前端规划】来看看我整理的这一份专属技术知识图谱吧~
  8. 2018ICPC赛后总结
  9. c语言编译器uwp版,哔哩哔哩UWP最新版下载 - 哔哩哔哩UWP版免费版(32位64位win10)安装下载v1.3.10.0 - QT软件园...
  10. [项目管理] 如何评估工作量
  11. NC6 转库单、采购入库单、库存委托入库单签字后自动生成调拨订单
  12. 无线路由器怎么改密码
  13. 动态规划——最大连续子序列和
  14. 软件工程基础-个人项目-数独游戏
  15. easyUI datatimebox 设置时分秒不可修改
  16. Mysql数据库设计
  17. 1 简历该怎么写?注意事项--绝密,程序员大厂面试求职大揭秘!
  18. UPS不间断电源系统安全使用要领
  19. yershop商城系统开发(二)——新浪SAE配置
  20. 欧拉公式-python程序-计算机仿真方法(入门级)

热门文章

  1. 学科研究前沿--闲杂记录
  2. 滑模方法设计AUV路径跟踪转艏力矩
  3. Python基础教程让小白从入门到精通(二)爬虫实践及网络规范
  4. 独立于计算机系统的是 用户模式,全国计算机二级ms-office选择题题库(同名4921).pdf...
  5. 如何删除文件权限中的@符号
  6. Java如何给压缩文件设置密码
  7. 蓝牙IBEACON协议详细解析
  8. 诺基亚一口气发布三款安卓机:Nokia X 配4吋屏
  9. 最新Android studio版本下载,安装,第一个项目,以及插件配置教程(超详细图解)
  10. Kaggle-纽约市出租车费预测