一、设计目的
(1)巩固和加深对C语言课程基本知识的理解和掌握;
(2)掌握C语言编程和调试的基本技能;
(3)掌握利用C语言进行软件设计的方法
二、任务概述
(1)本课程设计用C语言创建的系统实现对家庭成员收入、支出进行添加、查询、删除、修改功能。
(2)本系统以菜单方式工作,通过家庭成员姓名登录系统。
(3)支持录入,删除,修改成员收支记录的功能。
三、功能展示
四、思维导图
五、程序源码
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
int Recordcount;//定义全局变量
struct F_Data
{
int year; //年
int month; //月
int data; //日期
float amout; //金额
char name[20]; //姓名
int type; //收入或支出类型
char comment[100]; //备注
struct F_Data*next; //定义一个指针
}e[1000];
struct F_Data*head=NULL;
void add();
void search();
void delete_rec();
void show();
void menu();
void start();
void start()//开始界面
{
system("cls");
printf("\n\n\n\n\n");
printf("\t*********************************************************\n");
printf("\t*****************欢迎使用家庭财务管家系统****************\n");
printf("\t**********************************************************\n");
printf(" \n\n\n\n\n\n\n ");
system("pause");
}
void menu()//菜单界面
{
system("cls");
printf("\n\n\n\n\n");
printf(" ********************* 菜单************************");
printf(" \n\n");
printf(" 1,输入\n");
printf(" 2,显示\n");
printf(" 3,查询\n");
printf(" 4,删除\n");
}
void add()//添加模块代码
{
system("cls"); /*清屏*/
struct F_Data *p=NULL; /*定义pNode为struct F_Data类型指针*/
p=(struct F_Data*)malloc(sizeof(struct F_Data)); /*运行时动态调整所占内存 的大小*/
printf("请输入年份:");
scanf("%d",&p->year);
printf("请输入月份:");
scanf("%d",&p->month);
if((p->month>0)&&(p->month<13)) /*限定月份为1~12 */
{
printf("请输入日期:");
scanf("%d",&p->data);
printf("请输入金额:");
scanf("%f",&p->amout);
printf("请输入姓名:");
scanf("%s",p->name);
printf("收入按1,支出按0:");
scanf("%d",&p->type);
printf("请输入类型:");
scanf("%s",p->comment);
p->next=head; /*插入一个结点 */
head=p;
Recordcount++; /*结点数加一 */
}
void save(int m);
system("PAUSE"); /*停顿*/
}// 在菜单界面选择"添加"选项,界面会依次显示年份,月份,且限定月份为1~12,再显示日期,金额,姓名,type,类型逐个填写,然后返回到菜单界面。
void save(int m) //保存函数
{
FILE *fp;
int i; //文件行指针
if((fp=fopen("d:家庭财务管理.dat","wb"))==NULL) //打开文件、为输出打开一个二进制文件
{
printf("文件打开错误!\n");
exit(0);
}
for(i=0;i<m;i++)
if(fwrite(&e[i],sizeof(struct F_Data),1,fp)!=1)
{printf("没有文件!");
getchar();
return;
}
fclose(fp);
}
void search()//查询模块代码
{
system("cls"); /*清屏*/
char name[20];
int type;
int choice;
struct F_Data*p=NULL; /*定义pNode为struct F_Data类型指针*/
printf("1按姓名查找\n2按类型查找\n ");
printf("请输入你的选择:");
scanf("%d",&choice);
if(choice==1)
{
printf("请输入姓名:");
scanf("%s",name);
for(p=head;p!=NULL;p=p->next) /*从链表的第一个结点到尾结点 */
if(strcmp(p->name,name)==0) /*如果输入的name和结点中的name一样 */
{
printf("%d\t",p->year);
printf("%d\t",p->month);
printf("%d\t",p->data);
printf("%.2f\t",p->amout);
printf("%s\t",p->name);
printf("%d\t",p->type);
printf("%s\n",p->comment);
}
}
if(choice==2)
{
printf("请输入类型:1收入 0支出\n ");
scanf("%d",&type);
for(p=head;p!=NULL;p=p->next)
if(p->type==type) /*如果输入的type和结点中的type一样 */
{
printf("%d\t",p->year);
printf("%d\t",p->month);
printf("%d\t",p->data);
printf("%.2f\t",p->amout);
printf("%s\t",p->name);
printf("%d\t",p->type);
printf("%s\n",p->comment);
}
}
system("PAUSE"); /*停顿*/
}// 在菜单界面选择"查询"选项,界面会让你选择查找的方式 :1按姓名查找2按类型查找,用户可以根据自己的需要进行选择,按1就输入联系人的姓名,按2就输入类型,系统会进行查询,如果有就显示该条记录。
void delete_rec()
{
system("cls"); /*清屏*/
char name[20];
float amout;
int choice;
struct F_Data *p=NULL,*q=NULL; /*定义p和q都为struct F_Data类型指针*/
p=head; /*p指向第一个结点 */
q=head; /*q指向第一个结点 */
printf("请输入要删除者的姓名:");
scanf("%s",name);
printf("请输入金额:");
scanf("%f",&amout);
for(;q!=NULL;q=q->next) /*q指针从链表的第一个结点到尾结点 */
{
if((head->amout==amout)&&(strcmp(head->name,name)==0)) /*如果头结点符合要求 */
{
printf("%d\t",q->year);
printf("%d\t",q->month);
printf("%d\t",q->data);
printf("%.2f\t",q->amout);
printf("%s\t",q->name);
printf("%d\t",q->type);
printf("%s\n",q->comment);
printf("确认删除?\n 1是\n 2否\n");
scanf("%d",&choice);
if(choice==1)
{
head=q->next; /*删除头结点 */
Recordcount--; /*结点数减一*/
}
else break;
}
else
{
if((q->amout==amout)&&(strcmp(q->name,name)==0)) /*如果结点符合要求 */
{
{
printf("%d\t",q->year);
printf("%d\t",q->month);
printf("%d\t",q->data);
printf("%.2f\t",q->amout);
printf("%s\t",q->name);
printf("%d\t",q->type);
printf("%s\n",q->comment);
}
printf("确认删除?\n 1是\n 2否\n");
scanf("%d",&choice);
if(choice==1)
{
p->next=q->next; /*删除一个结点*/
Recordcount--; /*结点数减一*/
}
else break;
}
else
{
p=q; /*p后移一 个位子*/
}
}
}
system("PAUSE"); /*停顿*/
}//选择删除选项后,界面会让使用者输入要删除者的姓名及金额,并根据输入的信息显示该条记录,并且为了防止意外删除而有提示是否删除,经使用者再三确认后便删除该记录。
void show()//显示模块
{
system("cls"); /*清屏*/
struct F_Data*p=NULL; /*定义p和q都为struct F_Data类型指针*/
float j=0.0,i=0.0,w=0.0;
for(p=head;p!=NULL;p=p->next) /*从链表的第一个结点到尾结点 */
{
printf("%d\t",p->year);
printf("%d\t",p->month);
printf("%d\t",p->data);
printf("%.2f\t",p->amout);
printf("%s\t",p->name);
printf("%d\t",p->type);
printf("%s\n",p->comment);
if(p->type==1)
j+=p->amout; /*把type=1记录中的金额全部加给j*/
else
i+=p->amout;
}
printf("一共收入:%.2f\n",j);
printf("一共支出:%.2f\n",i);
w=j-i;
printf("当前余额:%.2f\n",w);
system("PAUSE"); /*停顿*/
}
//在界面选择显示选项后,屏幕上会把每条记录依次显示出来,并把总收入和总支出及目前余额也统计并显示出来。
int main()
{
int n,button;
system("color 5A");
start();
menu();
// getchar();
do
{
printf(" 请选择您想要的功能(1--4):\n");
scanf("%d",&n);
if(n>0&&n<5)
{
button=1;break;
}
else
{ button=0;
printf("输入有误,重新输入");
}
}while(button==0);
while(button==1)
{
switch(n)
{
case 1: add();break;
case 2: show();break;
case 3: search();break;
case 4: delete_rec();break;
default :break;
}
getchar();
printf("\n");
printf("按任意键继续\n");
getch();
system("cls"); /*清屏*/
menu(); /*调用菜单函数*/
printf("功能选择(1--4):\n");
scanf("%d",&n);
printf("\n");
}
}