期末C语言作业--家庭理财系统
比较简单
直接上代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include<time.h>
#include<windows.h>
int s=1;
int b=1;
struct Data
{
int a;
char name[25];
char riqi[15];
float money;
char beizhu[50];
};
struct list //链表申请
{
struct Data info;
struct list *next;
};
struct list *Inhead = NULL; //收入链表头指针
struct list *Intail = NULL; //收入链表尾指针
struct list *zhichuhead = NULL; //支出链表头指针
struct list *zhichutail = NULL; //支出链表尾指针
struct list *temp = NULL; //定义一个全局空指针方便后面引用
int count=0;
int count1=0;
void inquire_income();
void inquire_pay();
void modify_income();
void modify_pay();
void time();
void inquire_menu();
void Add_income();
void Del_income();
void display_income();
void inquire_menu();
void full_name();
void money();
void content();
void modify_menu();
void full_name_modify_income();
void time_modify_income();
void money_modify_income();
void content_modify_income();
void Del_pay();
void inquire_pay();
void display_pay();
void modify_pay();
void Add_pay();
void full_name_pay();
void time_pay();
void money_pay();
void content_pay();
void full_name_modify_pay();
void time_modify_pay();
void money_modify_pay();
void content_modify_pay();
void all_income();
void all_pay();
void ALLfund();
void menu();
void Save_income() //将收入数据存入文件
{
FILE *fp;
fp=fopen("D:\\shouru.dat","wb");
struct list *p = Inhead;
while (p != NULL)
{
fwrite(&p->info, sizeof(struct Data), 1, fp); //向文件写入内容
p = p->next; //指向下一个节点
}
fclose(fp); //关闭文件
}
void Save_zhichu() //将支出数据存入文件
{
FILE *fp;
fp = fopen("D:\\zhichu.dat","wb");
struct list *p = zhichuhead;
while (p != NULL)
{
fwrite(&p->info, sizeof(struct Data), 1, fp);
p = p->next;
}
fclose(fp);
}
void Open() //提前打开文件将已有的收入数据添加进来(如果没有直接跳过)
{
FILE *pp;
pp = fopen("D:\\shouru.dat", "rb");
if(pp != NULL)
{
struct Data linshi; //申请一个结构体
while (fread(&linshi, sizeof(struct Data), 1, pp) == 1) //直到没有了为止
{
temp = (struct list*)malloc(sizeof(struct list)); //分配空间赋给temp
temp->info = linshi; //将linshi地址赋给temp指向
temp->next = NULL; //将指针指向空
if (Inhead == NULL) //分为两种情况一种为空的时候一种不为空
{
Inhead = temp;
Intail = temp; //因为第一个元素
}
else
{
Intail->next = temp; //添加到前尾部的后指针
Intail = temp; //尾部指针
}
}
fclose(pp);
}
}
void Openzhichu() //提前打开文件将已有的支出数据添加进来(如果没有直接跳过)
{
FILE *fp;
fp = fopen("zhichu.dat","rb");
if (fp != NULL)
{
struct Data linshi;
while (fread(&linshi, sizeof(struct Data), 1, fp) == 1)
{
temp = (struct list*)malloc(sizeof(struct list));
temp->info = linshi;
temp->next = NULL;
if (zhichuhead == NULL)
{
zhichuhead = temp;
zhichutail = temp;
}
else
{
zhichutail->next = temp;
zhichutail = temp;
}
;
}
fclose(fp);
}
}
/*********************************************************************/
void Menu() //菜单主界面
{
system("cls"); //清屏
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t\t\t\t *****************************************\n");
printf("\n");
printf("\t\t\t\t * 欢迎使用家庭财务管理系统 *\n");
printf("\n");
printf("\t\t\t\t *****************************************\n");
printf(" \n");
printf("\t\t\t\t 1:收入操作 \n");
printf("\t\t\t\t 2:支出操作 \n");
printf("\t\t\t\t 3:统计操作 \n");
printf("\t\t\t\t 0:退出 \n");
}
void menu(){
system("cls"); //清屏
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t\t\t\t *****************************************\n");
printf("\n");
printf("\t\t\t\t * 欢迎使用家庭财务管理系统 *\n");
printf("\n");
printf("\t\t\t\t *****************************************\n");
printf(" \n");
}
/*****************************收入区**********************************/
void Income_menu() //收入界面
{
system("cls");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t\t\t\t *****************************************\n");
printf(" \n");
printf("\t\t\t\t * 欢迎使用家庭财务管理系统 * \n");
printf(" \n");
printf("\t\t\t\t *****************************************\n");
printf(" \n");
printf("\t\t\t\t 1.添加收入 \n");
printf("\t\t\t\t 2.删除收入 \n");
printf("\t\t\t\t 3.查询收入 \n");
printf("\t\t\t\t 4.显示收入 \n");
printf("\t\t\t\t 5.修改收入 \n");
printf("\t\t\t\t 0.返回上一级 \n");
}
void Income() //进入收入界面
{
int choice;
while (1)
{
Income_menu(); //收入菜单显示
printf("\t\t\t\t 请输入选择: ");
scanf("%d", &choice);
fflush(stdin); //等待
if (choice == 0)
{
printf("\t\t\t\t 返回上一级中...... ");system("PAUSE");break;
}
else
switch (choice)
{
case 1: Add_income(); Save_income(); break; //添加
case 2: Del_income(); Save_income(); break; //删除
case 3: inquire_income(); Save_income(); break; //查询
case 4: display_income(); Save_income(); break; //显示
case 5: modify_income(); Save_income(); break; //修改
}
}
}
void Add_income() //添加收入
{
char panduan;
do
{
temp = (struct list*)malloc(sizeof(struct list));
if(Inhead == NULL){
s=1;
}
else{
s=Intail->info.a+1;
}
temp->info.a=s;
printf("\t\t\t\t 姓名: "); gets(temp->info.name); fflush(stdin);
printf("\t\t\t\t 日期( XX 年 XX 月 XX 日): "); gets(temp->info.riqi); fflush(stdin);
printf("\t\t\t\t 收入: "); scanf("%f", &temp->info.money); fflush(stdin);
printf("\t\t\t\t 备注: "); gets(temp->info.beizhu); fflush(stdin);
printf("\n");
temp->next = NULL; //将尾部变为空
if (Inhead == NULL)
{
Inhead = temp;
Intail = temp;
}
else
{
Intail->next = temp;
Intail = temp;
}
Save_income();
do{
printf("\t\t\t\t 是否 (Y/N) 继续添加信息:");
panduan = getchar();
fflush(stdin);
if(panduan != 'Y'&& panduan != 'y'&&panduan != 'n' && panduan != 'N')
{
printf("\t\t\t\t 输入错误!\n");}
}while(panduan != 'Y'&& panduan != 'y'&&panduan != 'n' && panduan != 'N');
} while (panduan == 'Y' || panduan == 'y');
printf("\t\t\t\t 正在返回......");
system("PAUSE");
}
void Del_income() //删除收入
{
char shanchu[20],panduan2;
int t=0;
struct list *p = NULL;
struct list *m = NULL;
struct list *n = NULL;
p = Inhead;
if(p==NULL){
printf("\t\t\t\t 目前为空列表!\n");
printf("\t\t\t\t 即将返回收入操作界面进行添加\n");
printf("\t\t\t\t 正在返回......");
system("PAUSE");
}
else{
part:
if(t==0) printf("\t\t\t\t 请输入删除姓名: ");
else
{
printf("\t\t\t\t 请重新输入删除姓名: ");
}
gets(shanchu);
if (strcmp(Inhead->info.name, shanchu) == 0)
{
count++;
while (Inhead != NULL && strcmp(Inhead->info.name, shanchu) == 0)
{
char ch;
printf("\t\t\t\t 编号: "); printf("%d\n",Inhead->info.a);
printf("\t\t\t\t 姓名: "); puts(Inhead->info.name);
printf("\t\t\t\t 日期: "); puts(Inhead->info.riqi);
printf("\t\t\t\t 收入: "); printf("%.3f\n", Inhead->info.money);
printf("\t\t\t\t 备注: "); puts(Inhead->info.beizhu);
printf("\t\t\t\t 找到一个数据名字为%s,确认删除 Y/N ?", shanchu);
ch = getchar(); fflush(stdin);
if (ch == 'y' || ch == 'Y'){
Inhead = Inhead->next;
p = Inhead;
while(p!=NULL){
p->info.a=p->info.a-1;
p=p->next;
}
}
else {
break;
}
}
}
else
{
if (strcmp(Intail->info.name, shanchu) == 0)
{
count++;
do
{
m = p;
p = p->next;
} while (p != Intail);
char ch2;
printf("\t\t\t\t 编号: "); printf("%d\n",Intail->info.a);
printf("\t\t\t\t 姓名: "); puts(Intail->info.name);
printf("\t\t\t\t 日期: "); puts(Intail->info.riqi);
printf("\t\t\t\t 收入: "); printf("%.4f\n", Intail->info.money);
printf("\t\t\t\t 备注: "); puts(Intail->info.beizhu);
printf("\t\t\t\t 找到一个数据名字为%s,确认删除 Y/N ?", shanchu);
ch2 = getchar(); fflush(stdin);
if (ch2 == 'y' || ch2 == 'Y'){
m->next = NULL;
Intail=m;
}
}
else
{
while( count>=3 && p->next != NULL && strcmp(p->info.name, shanchu) != 0 )
{
m = p;
p = p->next;
n = p->next;
}
if(count>=3 && strcmp(p->info.name, shanchu) == 0)
{
char ch3;
printf("\t\t\t\t 编号: "); printf("%d\n",p->info.a);
printf("\t\t\t\t 姓名: "); puts(p->info.name);
printf("\t\t\t\t 日期: "); puts(p->info.riqi);
printf("\t\t\t\t 收入: "); printf("%.3f\n", p->info.money);
printf("\t\t\t\t 备注: "); puts(p->info.beizhu);
printf("\t\t\t\t 找到一个数据名字为%s,确认删除 Y/N ?", shanchu);
ch3 = getchar(); fflush(stdin);
if (ch3 == 'y' || ch3 == 'Y')
m->next = n;
while(n!=NULL){
n->info.a=n->info.a-1;
n=n->next;
}
}
else
{
printf("\t\t\t\t\t 不存在\n");
if(t==0){
t=1;
goto part;
}
}
}
}
Save_income();
if (Inhead != NULL)
{
char panduan;
do{
printf("\t\t\t\t 是否继续删除 (Y/N):");
panduan = getchar();
fflush(stdin);
if (panduan == 'Y' || panduan == 'y')
{
Del_income();break;
}
else if(panduan=='n'||panduan=='N'){
break;
}
else
{
printf("\t\t\t\t 输入错误!\n");}
}while(panduan != 'Y'&& panduan != 'y'&&panduan != 'n' && panduan != 'N');
}
else{
printf("\t\t\t\t 目前为空列表!\n");
printf("\t\t\t\t 即将返回收入操作界面进行添加!!!!!\n");
printf("\t\t\t\t 正在返回......");
system("PAUSE");
}
}
}
void inquire_income() //查询收入
{
inquire_menu();
int choice;
printf("\t\t\t\t 请输入你的选择: ");
scanf("%d", &choice);
fflush(stdin);
switch (choice)
{
case 1: full_name(); break;
case 2: time(); break;
case 3: money(); break;
case 4: content(); break;
default: printf("\t\t\t\t 输入错误 "); break;
}
}
void full_name() //通过名字查询收入
{
char chazhao[20];
int j=0;
if(Inhead==NULL){
printf("\t\t\t\t 目前为空列表!\n");
printf("\t\t\t\t 即将返回收入操作界面进行添加\n");
printf("\t\t\t\t 正在返回......");
system("PAUSE");
}
else{
printf("\t\t\t\t 请输入查询的名字: ");
gets(chazhao);
struct list *p = Inhead;
while (p != NULL)
{
if (strcmp(p->info.name, chazhao) == 0) //循环遍历链表
{
printf("\t\t\t\t 编号: "); printf("%d\n",p->info.a);
printf("\t\t\t\t 姓名: "); puts(p->info.name);
printf("\t\t\t\t 日期: "); puts(p->info.riqi);
printf("\t\t\t\t 收入: "); printf("%.3f\n", p->info.money);
printf("\t\t\t\t 备注: "); puts(p->info.beizhu)