您的位置:首页 > 其它

课程设计账户管理系统(3)

2011-11-28 13:11 288 查看
个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情。

关于本次课程设计虽然做得有些急,但是主要的功能还是实现了,虽然比较简单,但是还是遇到好多问题,有语言上的基本问题,有算法设计上的问题,在开始由于要求比较高而且想于要快,就是前面两个的原型主要功能没有实现,最后用啦一个简单的方法把功能实现了,钱面两个就是初步实现功能的,但是效率不是很好,比如用到数组保存数据,但是主要功能的到实现了,这次就把数组的固定内存分配问题改为用单链表实现动态空间分配,由于是数据结构的课程设计,这也是老师要求的吧。对于这次的还是基本满意的,但还是有许多需要优化的地方,因为考试较多,就没有经行优化,也厚有时间再来优化,排版上也有好多问题,这次课程设计有好多感悟,今天写完的代码在今天晚上睡觉后明天起来就觉得不行了,就要删掉,有时候这种感觉就是要把所有的代码都要删掉,流程模块都要重新设计,对这中事情又爱又恨,但还是觉得重新设计比较好,这样的收获也比较大,最终付出了努力,收获还是蛮大的,下面还是把代码弄出来吧,本来代码是分还多文件的,我只能把他们合并后再贴上来,这样就更没层次了。

/*
* Count.c
*
* 个人帐簿管理系统设计  1.0
* 个人帐簿管理系统记录某人每月的全部收入及各项开支情况,
* 包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。
* 进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,
* 可以根据输入的月份查询每月的收支情况。
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define MONTH 20

/*账户开支信息*/
struct Count{
int month;         //月份
float income;      //总收入
float outcome;      //总支出
float food;        //食品消费
float rent;        //房租
float education;   //子女教育费
float water;       //水电费
float hospital;    //医疗费
float save;        //储蓄
float other;       //其他
};

struct Node {
struct Count acount;
struct Node *next;  //指向下一个月的信息节点
};
typedef struct Node *PNode;
typedef struct Node *LinkList;
typedef struct LinkList *PLinkList;

int MenuSlect();
int EndWithZero();
int IsMonthExist(char *name,int month);
int IsCountExist(char* name);
void AboutIt();
void NewCount();
void LoadCount(char*);
void SortCount(char *);
void LookCount(char *);
void LookMonthCount(char *,int);
void ResetMonthCount(char *);
void AddMonthData(char *name);
void ReadCount(char *,LinkList *);
void OutputCount(LinkList countlist);
void SaveToFile(char *name,LinkList plist);

struct Count InputData(int );
LinkList BubbleMonthSort(LinkList head);

void AboutIt(){
FILE *fp;
char ch;
fp = fopen("about.txt","r");
printf ("\n");
while((ch=getc(fp)) != EOF)
printf("%c",ch);
fclose(fp);
printf("\n按任意键继续.......");
getch();
system("cls");
}

/*按月添加数据到文件末尾*/
void AddMonthData(char *name) {
FILE *fp;
int mon,i;
int month;
LinkList countlist;          //账户节点
countlist = (LinkList) malloc (sizeof (struct Node));
struct Count myCount;
printf("输入要添加的月份数目:");
scanf("%d",&mon);
/*把刚添加的数据写入到文件*/

for(i=0;i<mon;i++) {
printf("输入要添加的月份:");
scanf("%d",&month);
myCount.month = month;
while(1) {
if(IsMonthExist(name,month)){
printf("月%d的账户信息已经存!\n",month);
break;
}
else {
myCount = InputData(month);
fp = fopen(name,"a");
fprintf(fp,"%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n",
myCount.month,myCount.rent,myCount.education,
myCount.water,myCount.hospital,myCount.save,
myCount.other,myCount.outcome);
fclose(fp);
ReadCount(name,&countlist);
BubbleMonthSort(countlist);
SaveToFile(name,countlist);
break;
}
}
}
return ;
}

void RmCount() {
char name[15];
int isRm;
printf("请输入要删除账户:");
gets(name);
isRm = remove(name);
if(isRm == 0) {
printf("账户删除成功!");
}
else
printf("账户删除失败!");
printf("按任意键继续....");
getch();
}

int main() {
system("color fd");
char name[16];
printf("\t\t欢迎使用天才账户管理系统,祝你愉快!\n");
while(1) {
out:
switch(MenuSlect()) {
case 1:
system("cls");
NewCount();      //新建账户
break;
case 2:
system("cls");
printf("请输入你的账户名:");
while(1) {
gets(name);
if (!IsCountExist(name)) {
printf("账户不存在,请核对或者选择1新建账户:");
goto out;
}
break;
}
LoadCount(name);    //登录账户
break;
case 3:
system("cls");
RmCount();     //删除账户
break;
case 4:
system("cls");
AboutIt();          //关于我们
break;
case 0:
exit(0);           //退出
}
}
printf("\n退出系统!按任意键关闭窗口......");
getch();
return 0;
}

int EndWithZero() {
char ch[2];
int zero;
printf("\n按0返回,或者按其他任意键继续......");
scanf("%s",ch);
zero = atoi(ch);
return zero;
}

struct Count InputData(int m) {
struct Count myCount;
myCount.month = m;
printf("%20s","输入房租:");
scanf("%f",&myCount.rent);
printf("%20s","输入子女教育费:");
scanf("%f",&myCount.education);
printf("%20s","输入水电费:");
scanf("%f",&myCount.water);
printf("%20s","输入医疗费:");
scanf("%f",&myCount.hospital);
printf("%20s","输入储蓄费:");
scanf("%f",&myCount.save);
printf("%20s","输入其他费用:");
scanf("%f",&myCount.other);
myCount.outcome = myCount.rent + myCount.education + myCount.water
+ myCount.hospital + myCount.save + myCount.other;
return myCount;
}

/*判断账户是否存在*/
int IsCountExist(char* name) {
FILE *fp;
if((fp = fopen(name,"r")) != NULL)
return 1;
else
return 0;
}

int LoadSlect() {
int n;
char ch[4];
//system("cls");
printf("\n\t\t          查询菜单");
printf("\n\t\t         1.查询个人账户信息");
printf("\n\t\t         2.添加个人账户信息");
printf("\n\t\t         3.修改个人账户信息");
printf("\n\t\t         4.对每月总支出排序");
printf("\n\t\t         5.查询某月账户信息");
printf("\n\t\t         0.返回");
printf("\n\t\t\t根据功能菜单选择相应的操作0--5:");

while(1) {
scanf("%s",ch);
n = atoi(ch);
if(n>=0 && n<=5)
break;
printf("\t\t\t选择错误,请重新选择0--5:");
}
return n;
}

void LoadCount(char *name) {
int month;
printf("\n\t登录成功!欢迎你%s你可以对你的账户进行如下管理:",name);
while(1) {
switch(LoadSlect()) {
case 1:
system("cls");
LookCount(name);
break;
case 2:
system("cls");
AddMonthData(name);
printf("\n\t\t\t账户添加完成,请按任意键继续......");
getch();
system("cls");
break;
case 3:
system("cls");
ResetMonthCount(name);

break;
case 4:
system("cls");
SortCount(name);
break;
case 5:
system("cls");
printf("\t\t\t请输入要查看的月:");
scanf("%d",&month);
LookMonthCount(name,month);
printf("\n\t\t\t账户按月查看完成,请按任意键继续......");
getch();
system("cls");
break;
case 0:
printf("\n\t\t\t账户成功退出!");
printf("\n\t\t\t按任意键继续.......");
getch();
system("cls");
return ;
}
}
}

LinkList BubbleMonthSort(LinkList head) {
struct Node *p,*q,*tail,*s;
tail = NULL;
while(head->next != tail) {
p= head;
q= p->next;
while(q->next != tail) {
/*相邻两个节点比较,满足就交换*/
if(p->next->acount.month > q->next->acount.month) {
s= q->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = s;                    /*实现链表的向前移动*/
}
p = p->next;
q = q->next;
}
tail = q;
}
return head;
}

void SaveToFile(char *name,LinkList plist) {
FILE *fp;
LinkList tp;
fp = fopen(name,"w");
fprintf( fp,"   %s你好!欢迎使用天才账户管理系统,你的账户信息如下:\n",name);
fputs( "月份   房   租  子女教育   水电费   医 疗    储  蓄     其 他   总支出\n",fp);
tp = plist;
tp = tp->next;
while((tp != NULL) ) {
fprintf(fp,"%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n",
tp->acount.month,tp->acount.rent,tp->acount.education,
tp->acount.water,tp->acount.hospital,tp->acount.save,
tp->acount.other,tp->acount.outcome);
tp = tp->next;
}
fclose(fp);
}

/*判断输入的月份month账户是否存在*/
int IsMonthExist(char *name,int month) {
LinkList countlist;
PNode p;         //账户节点
countlist = (LinkList) malloc (sizeof (struct Node));
ReadCount(name,&countlist);
p = countlist;
p = p->next;
while((p != NULL)) {
if(p->acount.month == month)
return 1;
p = p->next;
}
return 0;
}

void LookCount(char *name) {
//FILE fp;
LinkList countlist;          //账户节点
countlist = (LinkList) malloc (sizeof (struct Node));
ReadCount(name,&countlist);
BubbleMonthSort(countlist);
printf("\n  %s你好!欢迎使用天才账户管理系统,你的账户信息如下:",name);
puts(  "\n月份   房   租  子女教育   水电费   医 疗    储  蓄     其 他   总支出");
SaveToFile(name,countlist);
OutputCount(countlist);
printf("\n\t\t\t账户查看完成,请按任意键继续......");
getch();
system("cls");
}

void LookMonthCount(char *name,int month) {
//int month;
PNode p;
LinkList countlist;          //账户节点
countlist = (LinkList) malloc (sizeof (struct Node));
ReadCount(name,&countlist);
p = countlist;
p = p->next;
while((p != NULL)) {
if(month == p->acount.month) {
printf("      %s你好!你%d月的账户信息如下:",name,month);
puts("\n月份   房   租  子女教育   水电费   医 疗    储  蓄     其 他   总支出");
printf("%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n",
p->acount.month,p->acount.rent,p->acount.education,
p->acount.water,p->acount.hospital,p->acount.save,
p->acount.other,p->acount.outcome);
return ;
}
else
p = p->next;
}
printf("\t\t\t对不起你要查看的月份不存在,你可以选择2添加账户信息");
}

int MenuSlect() {
char ch[4];
int n;
printf("\n\t\t             主功能菜单                                     ");
printf("\n\t\t             1.新建个人账户                           ");
printf("\n\t\t             2.登录个人账户                           ");
printf("\n\t\t             3.删除个人账户                           ");
printf("\n\t\t             4.关于我们                                   ");
printf("\n\t\t             0.退出程序                                   ");
printf("\n\t\t根据功能菜单选择相应的操作0--3:");
while(1) {
gets(ch);
n = atoi(ch);
if(n>=0 && n<=4)
break;
else
printf("\t\t\t选择错误,请重新选择0--4:");
}
return n;
}
void NewCount(){
FILE *fp;
char name[10];
printf("\t\t\t输入账户名:");
gets(name);
if (IsCountExist(name)){
printf("\t\t\t账户已经存在!请进行其他操作!\n");
return ;
}
/*账户不存在新建账户*/
fp = fopen(name,"w");
fprintf( fp,"   %s你好!欢迎使用天才账户管理系统,你的账户信息如下:\n",name);
fputs( "月份   房   租  子女教育   水电费   医 疗    储  蓄     其 他   总支出\n",fp);
fclose(fp);
AddMonthData(name);
printf("\n\t\t\t新建账户完成!按任意键继续.....");
getch();
}
void OutputCount(LinkList countlist) {
PNode p;
p = countlist;
p = p->next;
while((p != NULL)) {
printf("%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n",
p->acount.month,p->acount.rent,p->acount.education,
p->acount.water,p->acount.hospital,p->acount.save,
p->acount.other,p->acount.outcome);
p = p->next;
}
}

void ReadCount(char *name,LinkList *plist) {
FILE *fp;
char ch;
PNode p,q,tp;
tp = (PNode) malloc (sizeof (struct Node));
q = (PNode) malloc (sizeof (struct Node));
if(NULL == q) {
printf("\n\t\t\t内存错误!");
return ;
}
*plist = q;
q->next = NULL;
fp = fopen(name,"r");
while((ch=fgetc(fp)) != (int)'\n');  //跳过第一行
while((ch=fgetc(fp)) != (int)'\n');  //跳过第二行

while(1) {
if((ch=fgetc(fp)) == EOF)
break;
if((ch=fgetc(fp)) == EOF)
break;
else
fseek(fp,-2,SEEK_CUR);
/*从文件中读出数据到单链表中*/

p = (PNode) malloc (sizeof (struct Node));
if(NULL == p) {
printf("\n\t\t\t内存错误");
exit(0);
}

fscanf(fp,"%d%f%f%f%f%f%f%f",
&p->acount.month,
//&p->acount.food,
&p->acount.rent,
&p->acount.education,
&p->acount.water,
&p->acount.hospital,
&p->acount.save,
&p->acount.other,
&p->acount.outcome);
p->next = q->next;
q->next = p;
q = p;
}
fclose(fp);
}

void ResetMonthCount(char *name) {
PNode tp,p,temp;
int month;
LinkList countlist;
ReadCount(name,&countlist);
tp = (PNode) malloc (sizeof (struct Node));
tp->next = NULL;

/*判断要重置的月份是否存在*/
printf("\t\t\t输入你要修改的月份:");
scanf("%d",&month);
if(IsMonthExist(name,month)) {
LookMonthCount(name,month);
printf("\n\t\t\t开始修改,请输入修改后的信息:\n");
tp->acount = InputData(month);
p = countlist;
while((p->next != NULL)) {
if(p->next->acount.month == month) {
temp = p->next->next;    //最容易有bug的地方
p->next = tp;
tp->next = temp;
SaveToFile(name,countlist);
break;
}
p = p->next;
}
printf("\t\t\t账户修改完成,");
}
else {
printf("\t\t\t你需要修改的月份不存在,返回!");
}
printf("\t\t\t请按任意键继续......");
getch();
system("cls");
}

LinkList BubbleOutcmeSort(LinkList head) {
struct Node *p,*q,*tail,*s;
tail=NULL;
while(head->next!=tail) {
p=head;
q=p->next;
while(q->next!=tail) {
if(p->next->acount.outcome>q->next->acount.outcome) {
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}
p=p->next;
q=q->next;
}
tail=q;
}
return head;
}

void SortCount(char *name) {
LinkList countlist;          //账户节点
countlist = (LinkList) malloc (sizeof (struct Node));
ReadCount(name,&countlist);
BubbleOutcmeSort(countlist);
printf("  %s你好!你的账户支出排序情况信息如下:\n",name);
puts("月份   房   租  子女教育   水电费   医 疗    储  蓄     其 他   总支出\n");
OutputCount(countlist);
printf("\n\t\t\t账户支出排序完成,请按任意键继续......");
getch();
system("cls");
}


PS:代码有许多不当,注意不是有语法或逻辑之类的错误,而是设计上的不当,恳请指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: