C语言专题 ⑥项目实训-家庭财务管理系统
c语言项目专题实训:家庭财务管理系统采用:文件,链表,指针,结构体等有函数代码及较详细的讲解,有完整代码
一、关于
(1)要求:
1.选题:家庭财务管理系统
2.项目简介:编程实现一个家庭财务管理系统,系统能够通过菜单提供功能选择,能够实现家庭财务收入及财务支出的添加、查询、删除、 修改等功能,能够实现家庭财务数据的统计功能。
3. 基础语法(数据类型、运算符与表达式、流程控制数):预处理命令、数组、指针、函数、结构体、链表、文件操作等
(2)概述
-
功能:添加收入/支出;查询;删除;修改;统计;
-
实现过程:通过结构体链表储存信息;
(文末附有完整代码)
(3)重点及难点
-
结构体:对于类似家庭财务管理系统,图书管理系统等项目,需要储存信息的时候使用一连串连续的空间,以便更好地储存信息,保证信息的完整性与可读性,故多选择结构体实现而非数组。
-
没有选择全局变量,而是在主函数中定义一个指针变量,防止了全局变量可能出现的错误;但注意:每个函数入口处基本上都会传递指针的头节点所在地址;在调用修改添加删除函数时返回头节点。
-
很多函数不是定义为
void
型,但也不一定会使用其返回值。不定义为void
类型主要是为了能更好的控制该函数的结束(例如:int
函数中若满足某种条件可以直接return 0
或者其他数字来结束函数),使用可以更方便。 -
do-while语句的方便使用(很多时候可以替换常见的while语句,让程序更简单明了)
-
特别注意:本文只给出了写的部分收入的代码,如果还要完整添加支出代码的话,在代码中的函数类型不是
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;
}
else
pr=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++;
}
else
pr=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++;
}
else
pr=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;
}
else
pr=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++;
}
else
pr=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++;
}
else
pr=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);
}
}
更多推荐
所有评论(0)