C语言课程设计——家庭财务管理系统源码
生活随笔
收集整理的這篇文章主要介紹了
C语言课程设计——家庭财务管理系统源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAXNAME 11 //家庭成員姓名的最大長度
#define MAXDETAIL 21 //注最大長度//自定義枚舉類型fi_type,用來表示收入與支出typedef enum _fi_type{income=1,//收入payout =-1 //支出} fi_type;// 家庭財務信息結構體
typedef struct _fi_info{int year;int month;fi_type type;char name[9];float money;char detail[11];}fi_info;// 存儲財務數據結構的結構體typedef struct _fi_data{fi_info info;struct _fi_data* next;} fi_data;fi_data *head;//財務數據的頭結點void menu();//菜單函數void add_income();void search_income();void delete_income();void update_income();void add_payout();void search_payout();void delete_payout();void update_payout();void count_total();void quit();//void search_data(fi_type type);void delete_data(fi_type type);void update_data(fi_type type);//void initialize();void save_to_file();void clear_data();fi_data *get_last();fi_data *get_previous(fi_data *p);void input_info(fi_info *info);void show_info(fi_data *p);void menu(){printf("\n");printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t\t 家庭財務管理系統\n");printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t*******************************************\n");printf("\t\t收入管理:");printf("1.添加收入");printf(" 2.查詢收入明細\n");printf("\t\t\t 3.刪除收入");printf(" 4.修改收入\n");printf("\t\t*******************************************\n");printf("\t\t支出管理:");printf("5.添加支出");printf(" 6.查詢支出明細\n");printf("\t\t\t 7.刪除支出");printf(" 8.修改支出\n");printf("\t\t*******************************************\n");printf("\t\t統 計:");printf("9.統計總收入/總支出\n");printf("\t\t*******************************************\n");printf("\t\t退 出:0.退出系統\n");printf("\t\t*******************************************\n\n\n");}
void main() {int selected=0;initialize();while(selected>=0&&selected<=9){system("cls");menu();printf("\t\t>請選擇要進行的操作(0-9):");if(scanf("%d",&selected)!=1||selected<0||selected>9){printf("\t\t>輸入有誤!請選擇(0-9)之間的數字!按任意鍵重試");getchar();}else{switch(selected){case 0:exit(0);clear_data();break;case 1:add_income();save_to_file();break;case 2:search_income();break;case 3:delete_income();save_to_file();break;case 4:update_income();save_to_file();break;case 5:add_payout();save_to_file();break;case 6:search_payout();break;case 7:delete_payout();save_to_file();break;case 8:update_payout();save_to_file();break;case 9:count_total();break;}}}}void add_income()//添加收入{fi_data *p=(fi_data *)malloc(sizeof(fi_data));p->next=NULL;input_info(&(p->info));p->info.type=income;if(head==NULL)head=p;elseget_last()->next=p;}void add_payout()//添加支出{fi_data *p=(fi_data *)malloc(sizeof(fi_data));p->next=NULL;input_info(&(p->info));p->info.type=payout;if(head==NULL)head=p;elseget_last()->next=p;}//輸入函數void input_info(fi_info *info){printf("\t\t>請輸入年月(YYYY/M)");scanf("%d/%d",&(info->year),&(info->month));printf("\t\t>請輸入家庭成員姓名(最大長度為%d):",MAXNAME-1);scanf("%s",info->name);printf("\t\t>輸入金額:");scanf("%f",&(info->money));printf("\t\t>請輸入備注(最大長度為%d):",20);scanf("%s",info->detail);}//查找數據函數void search_data(fi_type type){int year=0;int month=0;fi_data *p=NULL;int count=0;char input=' ';while(1){printf("\t\t>請輸入要查詢的年月(YYYY/M)");if(scanf("%d/%d",&year,&month)!=2){printf("\t\t>輸入有誤\n");}else{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)){show_info(p);system("PAUSE");count++;}p=p->next;}if(count==0){printf("\t\t>沒有找到數據\n");}printf("\t\t>繼續查找其他數據?(y or n)");input=getchar();if(input=='y'||input=='Y')continue;elsebreak;}}}//初始化函數,讀取文本數據void initialize(){FILE * fp=NULL;fi_data *p=NULL;fi_data *last=NULL;int count=0;fp=fopen("data.txt","rb");if(fp==NULL){fp=fopen("data.txt","w");fclose(fp);return;}p=(fi_data*)malloc(sizeof(fi_data));memset(p,0,sizeof(fi_data));p->next=NULL;while(fread(&(p->info),sizeof(fi_info),1,fp)==1){if(head==NULL)head=p;else{last=get_last();last->next=p;}count++;fseek(fp,count*sizeof(fi_info),SEEK_SET);p=(fi_data *)malloc(sizeof(fi_data));memset(p,0,sizeof(fi_data));p->next=NULL;}free(p);p=NULL;fclose(fp);}//顯示信息函數void show_info(fi_data *p){int i=0;printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");printf("|NO.\t |年/月\t\t|類型\t\t|姓名\t\t|金額\t\t|備注\t\t|\n");printf("|%5d\t|%4d/%02d\t|%4s\t|%10s\t|%10.2f|%20s|\n",i+1,p->info.year,p->info.month,p->info.type==income?"收入":"支出",p->info.name,p->info.money,p->info.detail);printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");}//統計總收入、總支出void count_total(){float total_income=0.0;float total_payout=0.0;fi_data *p=head;while(p!=NULL){if(p->info.type==income){total_income+=p->info.money;}else{total_payout+=p->info.money;}p=p->next;}printf("\t\t+\t\t+\t\t+\n");printf("\t\t|合計收入\t|合計支出\t|結余\t|\n");printf("\t\t%12.2f|%12.2f|%12.2f|\n",total_income,total_payout,total_income-total_payout);printf("\t\t+\t\t+\t\t+\n");printf("\t\t>按任意鍵返回主菜單");getchar();getchar();}//保存到文件void save_to_file(){FILE *fp=fopen("data.txt","wb" );fi_data *p=head;while(p!=NULL){fwrite(&(p->info),sizeof(fi_info),1,fp);fseek(fp,0,SEEK_END);p=p->next;}fclose(fp);}//修改信息函數void update_data(fi_type type){ int year=0;int month=0;fi_data *p=NULL;fi_data *pre=NULL;char input;int count=0;int i=0;while(1){ printf("\t\t>請輸入要查詢的年月(YYYY/M)");if(scanf("%d/%d",&year,&month)!=2){printf("\t\t>輸入有誤\n");}else{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)){count++;show_info(p);input_info(&(p->info));printf("\t\t修改成功\n");p=get_previous(p);}p=p->next;}if(count==0)printf("\t\t>沒有找到數據\n");printf("\t\t>繼續查找其他數據?(y or n)");input=getchar();if(input=='y'||input=='Y')continue;elsebreak;}}}void delete_data(fi_type type)//刪除數據函數{int year=0;int month=0;fi_data *p=NULL;fi_data *pre=NULL;int count=0;char input=' ';int i=0;while(1){ printf("\t\t>請輸入要查詢的年月(YYYY/M)");if(scanf("%d/%d",&year,&month)!=2){printf("\t\t>輸入有誤\n");}else{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)){count++;show_info(p);pre=get_previous(p);if(pre==NULL)head=head->next;elsepre->next=p->next;free(p);printf("\t\t>刪除成功\n");}p=p->next;}if(count==0)printf("\t\t>沒有找到數據\n");printf("\t\t>繼續查找其他數據?(y or n)");input=getchar();if(input=='y'||input=='Y')continue;elsebreak;}}}void clear_data()//清空鏈表數據{fi_data *p=NULL;while(head!=NULL){if(head->next!=NULL){p=head;head=head->next;free(p);p=NULL;}else{free(head);head=NULL;}}}fi_data *get_last() {fi_data * p=head;if(p==NULL)return p;while((p!=NULL)&&(p->next!=NULL))p=p->next;return p;}fi_data *get_previous(fi_data *p){fi_data *previous=head;while(previous!=NULL){if(previous->next==p)break;previous=previous->next;}return previous;}void search_payout(){search_data(payout);}void delete_payout(){delete_data(payout);}void update_payout(){update_data(payout);}void search_income(){search_data(income);}void delete_income(){delete_data(income);}void update_income(){update_data(income);}
總結
以上是生活随笔為你收集整理的C语言课程设计——家庭财务管理系统源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s_Node节点安全基线
- 下一篇: [源码和文档分享]基于JAVA和SQL