C语言程序设计--个人账簿管理系统

1.引言

    1. 编写目的

目的在于:

  1. 为编码人员提供依据;
  2. 为修改、维护提供条件;
  3. 项目负责人将按计划书的要求布置和控制开发工作全过程;
  4. 项目质量保证组将按此计划书做阶段性和总结性的质量验证和确认。

本说明书的预期读者包括:

  1. 项目开发人员,特别是编码人员;
  2. 软件维护人员;
  3. 技术管理人员;
  4. 执行软件质量保证计划的专门人员;
  5. 参与本项目开发进程各阶段验证、确认以及负责为最后项目验收、鉴定提供相应报告的有关人员。
  6. 合作各方有关部门的负责人;项目组负责人和全体参加人员。
    1. 背景
  1. 系统名称:个人账簿管理系统
  2. 任务提出者:湖北师范大学软件工程老师
  3. 开发者:湖北师范大学软件工程学生
  4. 最终用户:湖北师范大学软件工程学生
    1. 定义
  1. 个人账簿管理系统

本文档中个人账簿管理系统是基于C语言、软件工程导论、数据结构与算法设计的应用。

    1. 参考资料
  1. 1.《即现订餐项目需求规格说明书-V0.2.doc》
  1. 程序系统的结构
    1. 程序系统结构

2.2程序结构模块描述

2.2.1 录入数据

【流程描述】

1.选择操作:提示内容:“请输入要进行的操作:”,操作数为“1”。

2.输入数据:按照提示内容,分别输入内容,中间以空格符隔开。

提示内容:

请依次输入数据[说明:中间以空格符隔开]:

(本月月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 收入费用)

3.回车:显示“数据录入成功”。

3.个人账簿管理系统设计说明

3.1程序描述

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

3.2功能

3.2.1录入数据

功能描述:

  1. 用户根据提示内容输入当月的全部收入以及各项开支(录入时要明确开支的用途,以便归类)

3.2.2查看数据

功能描述:

  1. 进入系统可直接查看录入的数据,即所有月份的收入开支

3.2.3修改数据

功能描述:

  1. 修改某个月份的收支情况(在3.2.4查询功能基础上,先对某个月份收支情况进行查询)

3.2.4查询数据

功能描述:

  1. 输入月份后即可查询到该月的收支情况

3.2.5排序数据

功能描述:

  1. 对某个月份的收支情况进行排序(在3.2.4查询功能基础上,先对某个月份收支情况进行查询)

3.2.6删除数据

功能描述:

  1. 删除某个月份的收支情况(在3.2.4查询功能基础上,先对某个月份收支情况进行查询)

3.3 性能

1.支持鼠标操作

2.支持键盘操作

3.支持对文件进行操作

3.4输入输出项

部分程序:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>

#define LEN sizeof(struct Node)

//账单结构体
struct Node {
	int ID;				//月份
	//定义结构体定义各种费用
	float IncomeTotal;	//收入费用
	float FoodShoping;	//食品消费
	float House;		//房租费用
	float Education;	//子女教育费用
	float WaterAndEtc;	//水电费用
	float Hospital;		//医疗费用
	float Store;		//储蓄
	float Expend;		//支出总和
	struct Node *next;	//指向下一个节点的指针
};
typedef struct {// 自定义数据类型
	int no;
	int data;
} pType;
//建立动态链表--录入数据 
struct Node* CreateLink();
//插入一个月的数据
void Insert(struct Node *head);
//删除相同元素的值 
void DeleteSame(struct Node *L);
//菜单 
void menu(); 
//搜索某一月份的具体收支状况
struct Node* Search(struct Node *head);
//功能同上
struct Node* SearchNode(struct Node *p1,int n);
//打印一个月的收支状况
void PrintOneMonth(struct Node *p);
//输出详细的列表
void PrintAll(struct Node *head); 
//对链表进行排序
struct Node *Sort(struct Node *head);
//对单个链表排序 
void sort_Node(Node *a);
//修改某一月的记录
struct Node *Update(struct Node *head);
//删除数据 
bool Delete(struct Node **pHead);
//求年支出
int Sum(struct Node *q1);
//主函数
int main() {
	struct Node *a;
	int value,count;
	count = 1;
	menu();
	scanf("%d",&value);
	if(value!=1)
		printf("亲,您还未录入数据,无法进行后续操作 系统将3秒后退出!\n");
	else {
		while(value>=0) {
			switch(value) {
				case 1:
					if(count ==1 ) {
						a=CreateLink();
						count++;
					}
					else{
						Insert(a);
						DeleteSame(a);
						count++;
					}
					PrintAll(a);
					break;
				case 2:
					PrintAll(a);
					int sum  ;
					sum = Sum(a);
					printf("\n 这一年您总共花费%d元!\n",sum);
					break;
				case 3:
					PrintAll(Update(a));
					break;
				case 4:
					PrintOneMonth(Search(a));
					break;
				case 5:
//					printf("\t1---所有月份根据总支出排序\n");
//					printf("\t2---单个月份根据大小排序\n");
//					printf("请您要进行的选择排序操作:");
//					int op;
//					scanf("%d",&op);
//					struct Node *X ;
//					X = a;
//					if(op == 1) {
//						//Sort(X);
//						PrintAll(Sort(a));
//					}
//					else if(op == 2){
//						sort_Node(Search(a));	
//					}
//					struct Node *X;
//					X = a;
					PrintAll(Sort(a));
					break;
				case 6:
					if(Delete(&a)) PrintAll(a); 
					break;
				case 0:
					return 0; 
					break;
			}
			menu();
			scanf("%d",&value);
		}
	}
	return 0;
}

//建立动态链表--录入数据 
struct Node* CreateLink() {
	struct Node *p1,*p2,*head;//定义结构体指针
	int n=0;
	printf("\n请依次输入数据[说明:中间以空格符隔开 最后输入0 0 0 0 0 0 0]:\n");
	printf("\n(本月月份 食品消费 房租费用 子女费用 水电费用 医疗费用 收入费用)\n");
	p1=p2=(struct Node *)malloc(LEN);//开辟内存空间
	head=NULL;//设头指针为空
	scanf("%d %f %f %f %f %f %f",&p1->ID,&p1->FoodShoping,
	      &p1->House,&p1->Education,&p1->WaterAndEtc,&p1->Hospital,&p1->IncomeTotal);
	p1->Expend=(p1->FoodShoping+p1->House+p1->Education+p1->WaterAndEtc+p1->Hospital);	//计算总支出
	p1->Store=p1->IncomeTotal-p1->Expend;//计算储蓄
	while(p1->ID != 0) {//当输入月份的编号是0时说明,说明链表结束
		n=n+1;//节点的数量+1
		if(n==1) {//当节点数量为1时,设置头指针
			head=p1;//使head头指针指向开辟的第一个元素,p1返回的是开辟内存的首地址
		}
		p1=(struct Node *)malloc(LEN);//p1指向新开辟的内存单元的首地址
		scanf("%d %f %f %f %f %f %f",&p1->ID,&p1->FoodShoping,
		      &p1->House,&p1->Education,&p1->WaterAndEtc,&p1->Hospital,&p1->IncomeTotal);
		p1->Expend=(p1->FoodShoping+p1->House+p1->Education+p1->WaterAndEtc+p1->Hospital);
		p1->Store=p1->IncomeTotal-p1->Expend;
		p2->next=p1;
		p2=p1;//使p2也指向新开辟的内存单元
	}
	p1->next=NULL;
	if(head!=NULL) {
		printf("录入数据成功!\n");
		return head;//返回头指针
	} else {
		printf("录入数据失败!");
		return NULL;
	}
}
//插入一个月的数据
void Insert(struct Node *head) {
	int n;
	struct Node *p,*tempCell;
	printf("您想要把信息添加在哪个月份之后!\n");
	scanf("%d",&n);
	p=SearchNode(head,n);//找到要插入的节点的前一个节点p
	if(p!=NULL){
		tempCell=(struct Node*)malloc(LEN);
		//输入信息
		printf("\n请依次输入数据[说明:中间以空格符隔开]:\n");
		printf("\n(本月月份 食品消费 房租费用 子女费用 水电费用 医疗费用 收入费用)\n");
		scanf("%d %f %f %f %f %f %f",&tempCell->ID,&tempCell->FoodShoping,&tempCell->House,
			&tempCell->Education,&tempCell->WaterAndEtc,&tempCell->Hospital,&tempCell->IncomeTotal);
		tempCell->Expend=(tempCell->FoodShoping+tempCell->House+tempCell->Education+tempCell->WaterAndEtc+tempCell->Hospital);
		tempCell->Store=tempCell->IncomeTotal-tempCell->Expend;
		if(tempCell!=NULL) {
			tempCell->next=p->next;
			p->next=tempCell;
		}
	} 
}
//删除相同元素
void DeleteSame(struct Node *L){
	Node *p,*q,*s;
	p = L->next;
	for(p; p != NULL; p = p->next){
		s = p;
		for(q = p->next; q != NULL; ){
			if(q->ID == p->ID ){

 

文章借鉴于此纷传

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值