C语言个人财务管理
小仙女ya 人气:0该程序可以完成个人财务管理。每个人的财务项目应当包括姓名、年度、收入、支出等。为了叙述简单,以一个财政年度为统计单位,程序中可以计算每个人的每个财政年度的收入总额、支出总额、存款总额等,并能够打印出来。需要注意的是,收入总额不可能只输入一次,而可能是多次收入的和;同样地,支出总额也不可能只是一次支出,应是多次支出的总和。
【设计思想】本程序是一个财务管理程序,涉及收入和支出,虽然是个人财务管理程序,但最好能够按照一种标准的财务管理软件来考虑,所以在程序设计时;需要考虑如下几个因素:
每一笔收入或支出都可以理解为一笔交易,那么程序最多可以容纳多少笔交易决定数组的元素个数,必须有一个预测,不妨先假定为50笔。
确定结构体形式时需要认真考虑,它关系到程序实现的思路和方式。一个人的收入和支出显然是多次输入的,而每一笔交易必须记录交易的日期和姓名,所以结构体应包含日期和姓名信息。从银行存款单我们可以知道,每一次存款和取款的数目必须记录,而且是分别记录,所以结构体考虑增加收入和支出两个元素,这样就形成了如下描述每一笔交易的结构体。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 50 struct Date{ int year,month,day; }; struct deal{ struct Date date; char name[12]; double earning; double payout; }; void Menu(); void InputOneDeal(struct deal *per); void PrintOneDeal(struct deal *per); void SortPerson(struct deal *per,struct deal **per_sort); int main() { struct deal person[SIZE]={0}; char key; int i=0; while(1){ Menu(); key=getche(); printf("\n"); switch(key) { case '1': InputOneDeal(person+i); i++; break; case '2': PrintOneDeal(person); break; case '3': exit(0); default:break; } } return 0; } void Menu() { printf("1.Input one deal\n"); printf("2.Print one year balance\n"); printf("3.Exit\n"); printf("Please select(1-3):"); } void InputOneDeal(struct deal *per) { char s[10]; printf("Date(YYYY-MM-DD):"); scanf("%d-%d-%d",&per->date.year,&per->date.month,&per->date.day); printf("name:"); scanf("%9s",s); printf("deal(+/-):"); scanf("%9s",s); if(s[0]=='-') per->payout=atof(s); else per->earning=atof(s); } void PrintOneDeal(struct deal *per) { struct deal *per_sort[SIZE]={NULL}; int i, year, tag; char name[12]; double earning, payout; SortPerson(per,per_sort) ; printf ("Name------Year--——-Earning----Payout----Balance\n" ) ;i =- 0; while(per_sort[i]!= NULL) { strcpy (name, per_sort[i]->name); printf ("%-12s ", name) ; tag = 1; while(per_sort[i]!= NULL && strcmp(name,per_sort[i]->name)==0) { year = per_sort[i]->date.year; earning = 0; payout = 0 ; while(per_sort[i]!= NULL && strcmp(name, per_sort[i]->name)==0 && year == per_sort[i]->date.year) { earning+=per_sort[i]->earning; payout+= per_sort[i]->payout; i++; } if (tag==1) { printf ("%-6d %11.2lf %11.2lf %11.2lf\n" , year,earning,payout,earning+payout) ; tag = 0 ; } else printf ("%12s %-6d %11.21f %11.21f %1.2lf\n", " ",year, earning, payout, earning + payout); } } } void SortPerson(struct deal *per,struct deal **per_sort) { int i, j, k; struct deal *t; i = 0; while((per+i)->date.year !=0) { per_sort[i] = per + i; i++; } for(i = 0; per_sort[i] != NULL; i++) { k = i; for(j = i+1;per_sort[j]!=NULL;j++) if(strcmp(per_sort[j]->name,per_sort[k]->name)<0||strcmp(per_sort[j]->name, per_sort[k]->name)==0 &&per_sort[j]->date.year < per_sort[k]->date.year) k=j; if(k != i) { t = per_sort [i] ; per_sort[i] = per_sort [k]; per_sort[k] = t; } } }
加载全部内容