欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言大作业之班费管理系统

程序员文章站 2022-05-06 09:29:07
...

班费管理系统

前言:

开发环境:Visual Studio Community 2017;
1.储存班级收支的信息;2.增加班费信息;3.删除班费信息;
4.改变班费信息;5.查找班费信息;6.实现自动计算余额;

完成了
1.储存信息;2.增加信息;(不能选择位置添加、时间的获取只能通过手动输入)
3.删除信息;4.改变信息;(不能选择信息修改)5.查找信息;(不能按照规定排序)
6.自动计算

可以正常运行,并且有一定的容错性。对于如何操作有明显的提示,会对重复的收支编号信息进行提示,遇到不规范输入时会提醒。对于文本已经储存的信息会在运行时先读入链表里。这个班费收支系统可以让操作者输入信息到文本内储存起来,按照收支编号,收入支出,负责人,金额等信息顺序输入,并且在查找和展示的时候以列表的形式呈现出来,操作时没有撤回的功能所以如果误删了信息需要重新输入。

操作界面:

C语言大作业之班费管理系统

C语言大作业之班费管理系统
C语言大作业之班费管理系统
C语言大作业之班费管理系统
C语言大作业之班费管理系统
C语言大作业之班费管理系统
C语言大作业之班费管理系统

代码:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>

/*定义一个学生类型*/
/*
	班费收支编号:001
	收入还是支出:收入
	经办人:张三
	原因:班级活动
	金额(每位同学):50 
	人数:50
	余额(自动生成):2500
	备注:每人50
	时间(手动输入或获取当前时间): 2018.1.1
*/
typedef struct student
{
	char stuidnum[16];//班费收支编号
	char stuid[16];//收入还是支出
	char name[16];//经办人
	char reason[16];//原因
	int num;//金额
	int number;//人数
	int balance;//余额
	char remarks[16];//备注
	char time[16];//时间
	struct student* next;//下一个信息的指针
}Stu;

Stu* students;//信息链表
char* stuInfo = "test.txt";//信息存储的文件
int input = 0;//选择
char tempInput[64];
char tempStuidnum[64];
char tempStuid[64];
char tempName[64];
char tempReason[64];
int tempNum = 0;
int tempNumber = 0;
int tempBalance = 0;
char tempRemarks[64];
char tempTime[64];
int flat;
char m[64];

void initFromTxt(void);//初始化
int deleteInfo(char* stuidnum);//删除信息
void reWrite(void);//重写
void insert2txt(Stu* stu);//插入文本
int addinfo(char* stuidnum, char* stuid, char* name, char* reason, int num, int number, int balance, char* remarks, char* time);//增加信息
void modify(char* stuidnum, char* stuid, char* name, char* reason, int num, int number, int balance, char* remarks, char* time);//修改信息
int checkAdd(char* stuidnum);//判断班级收支编号输入
void showInfo(void);//展示信息
void findInfo(char* stuidnum);//查找信息
void view(void);//界面
int checkInput(char* input, int begin, int end);//判断输入是否再给定的范围内

void initFromTxt(void)
{
	students = (Stu*)malloc(sizeof(Stu));//给链表的头节点分配内存
	students->next = NULL;//指向设为空
	FILE* file;
	file = fopen(stuInfo, "r");//打开信息文件
	if (file == NULL)
	{
		printf("打开文件失败!");
		return;
	}
	Stu* s = students;//当前结点
	while (1)
	{
		Stu* stu = (Stu*)malloc(sizeof(Stu));
		//从文本读入信息,存进stu中
		if (fscanf(file, "%s %s %s %s %d %d %d %s %s", &(stu->stuidnum), &(stu->stuid), &(stu->name),&(stu->reason),&(stu->num),&(stu->number),&(stu->balance),&(stu->remarks),&(stu->time)) == EOF)
		{
			//如果读入为EOF,也就说为读入为空,那么刚刚新建的stu就不要了,释放分配的内存
			free(stu);
			break;
		}
		else tempBalance = stu->balance;
		stu->next = NULL;

		s->next = stu;//将当前节点和新建的节点链接起来
		s = stu;//调整当前节点为新节点
	}
	fclose(file);
}

int deleteInfo(char* stuidnum)
{
	Stu* stu = students->next;//当前节点
	Stu* pre = students;//当前节点的父节点
	int isFound = 0;//是否找到信息
	while (stu != NULL)
	{
		if (strcmp(stu->stuidnum, stuidnum) == 0)//判断信息是否相同
		{
			printf("  班级收支编号    收入还是支出    经办人    原因    金额    人数    余额    备注    时间\n");
			printf("    %s    %s    %s    %s    %d    %d    %d    %s    %s\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number, stu->balance, stu->remarks, stu->time);
			printf("确定删除该信息(Y/N): ");
			scanf("%s",m);
			if (strcmp(m,"Y") == 0){
				if (strcmp(tempStuid, "收入") == 0) {
					tempBalance = tempBalance - tempNum * tempNumber;
				}
				else tempBalance = tempBalance + tempNum * tempNumber;
				pre->next = stu->next;
				free(stu);
				reWrite();//重写进文件
				isFound = 1;
				break;
			}
			else {
				printf("取消操作");
				getchar(); getchar();
				break;
			}
		}
		pre = pre->next;
		stu = stu->next;
	}
	if (isFound)
	{
		printf("删除成功!\n");
		return 1;
		getchar(); getchar();
	}
	else return 0;

}

void reWrite(void)
{
	Stu* stu = students->next;
	FILE* file = fopen(stuInfo, "w");//清空文件
	fclose(file);
	if (stu == NULL)//这个代表当前没有记录,直接返回
	{
		return;
	}

	while (stu != NULL)
	{
		insert2txt(stu);
		stu = stu->next;
	}

}

//插入一条信息进入文本文件
void insert2txt(Stu* stu)
{
	FILE* file;
	file = fopen(stuInfo, "a");
	if (file == NULL)
	{
		printf("文件写入不成功!");
		return;
	}
	fprintf(file, "%s %s %s %s %d %d %d %s %s\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number, stu->balance , stu->remarks, stu->time);
	fclose(file);
}

int addinfo(char* stuidnum, char* stuid, char* name, char* reason, int num, int number, int balance, char* remarks, char* time)
{
	Stu* newinfo = (Stu*)malloc(sizeof(Stu));//新建一个新节点
	newinfo->next = NULL;
	//给新节点赋值
	strcpy(newinfo->stuidnum, stuidnum);
	strcpy(newinfo->stuid, stuid);
	strcpy(newinfo->name, name);
	strcpy(newinfo->reason, reason);
	strcpy(newinfo->remarks, remarks);
	strcpy(newinfo->time, time);
	newinfo->num = num;
	newinfo->number = number;
	newinfo->balance = balance;
	//调整p到最后一个节点
	Stu* p = students;
	while (p->next != NULL)
	{
		p = p->next;
	}
	//p链接新节点
	p->next = newinfo;
	//插入新信息
	insert2txt(newinfo);
	return 1;
}

/*修改班级收支编号*/
void modify(char* stuidnum, char* stuid, char* name, char* reason, int num, int number, int balance, char* remarks, char* time)
{
	deleteInfo(stuidnum);
	if (addinfo(stuidnum, stuid, name, reason, num, number, balance, remarks, time))
		printf("修改成功!");
	else
		printf("修改失败!");
}

/*判断班费收支编号是否重复*/
int checkAdd(char* stuidnum)
{
	Stu* stu = students->next;
	while (stu != NULL)
	{
		if (strcmp(stu->stuidnum, stuidnum) == 0)
			return 1;
		stu = stu->next;
	}
	return 0;
}

/*打印所有信息*/
void showInfo(void)
{
	Stu* stu = students->next;
	while (stu != NULL)
	{
		printf("    %s    %s    %s    %s    %d    %d    %d    %s    %s\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number,stu->balance, stu->remarks, stu->time);
		printf("\n");
		stu = stu->next;
	}
}
/*根据班级收支编号查找*/
void findInfo(char* stuidnum)
{
		Stu* stu = students->next;
		printf("  班级收支编号    收入还是支出    经办人    原因    金额    人数    余额    备注    时间\n");
		while (stu != NULL)
		{
			if (strcmp(stu->stuidnum, stuidnum) == 0) {
				printf("    %s    %s    %s    %s    %d    %d    %d    %s    %s\n\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number, stu->balance, stu->remarks, stu->time);
			}
			if (strcmp(stu->stuid, stuidnum) == 0) {
				printf("    %s    %s    %s    %s    %d    %d    %d    %s    %s\n\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number, stu->balance, stu->remarks, stu->time);
			}
			if (strcmp(stu->name, stuidnum) == 0) {
				printf("    %s    %s    %s    %s    %d    %d    %d    %s    %s\n\n", stu->stuidnum, stu->stuid, stu->name, stu->reason, stu->num, stu->number, stu->balance, stu->remarks, stu->time);
			}
			stu = stu->next;
		}
}

/*判断输入是否再范围内,用来判断*/
int checkInput(char* input, int begin, int end)
{
	//如果不是一个字符,直接返回
	if (strlen(input) != 1)
	{
		return -1;
	}
	//判断输入是不在范围内
	if (input[0]<'0' + begin || input[0]>'0' + end)
	{
		return -1;
	}
	return input[0] - '0';
}

void main(void)
{
	initFromTxt();
	view();
}

void view(void)
{

	while (1)
	{
		system("cls");
		printf("\n");
		printf("     班级收支管理系统\n");
		printf("  _____________________ \n");
		printf(" |                     |\n");
		printf(" |     1.增加信息       |\n");
		printf(" |     2.删除信息       |\n");
		printf(" |     3.改变信息       |\n");
		printf(" |     4.查询信息       |\n");
		printf(" |     5.展示信息       |\n");
		printf(" |     6.退出系统       |\n");
		printf(" |_____________________|\n");
		printf("  输入数字 1 - 6 操作系统 ;");
		scanf("%s", tempInput);
		input = checkInput(tempInput, 1, 6);
		switch (input)
		{
		case 1:
			printf("班费收支编号:");
			scanf("%s", tempStuidnum);
			for (;;) {
			if (checkAdd(tempStuidnum))
			{
				printf("班费收支编号重复,不能添加!\n");
			}
			else break;
			printf("班费收支编号:");
			scanf("%s", tempStuidnum);
			}
			printf("收入还是支出:");
			scanf("%s", tempStuid);
			printf("经办人:");
			scanf("%s", tempName);
			printf("原因:");
			scanf("%s", tempReason);
			printf("金额:");
			scanf("%d", &tempNum);
			printf("人数:");
			scanf("%d", &tempNumber);
			if (strcmp(tempStuid, "收入") == 0) {
				tempBalance = tempBalance + tempNum * tempNumber;
			}
			else tempBalance = tempBalance - tempNum * tempNumber;
			printf("余额:%d\n", tempBalance);
			printf("备注:");
			scanf("%s", tempRemarks);
			printf("时间:");
			scanf("%s", tempTime);
			addinfo(tempStuidnum, tempStuid, tempName, tempReason, tempNum, tempNumber, tempBalance, tempRemarks, tempTime);
			break;
		case 2:
			printf("请输入班级收支编号:");
			scanf("%s", tempStuidnum);
			deleteInfo(tempStuidnum);
			getchar();getchar();
			break;
		case 3:
			do {
				printf("请输入班级收支编号或者输入'n'退回主页面:");
				scanf("%s", tempStuidnum);
				if (strcmp(tempStuidnum,"n") == 0)break;
				flat=deleteInfo(tempStuidnum);
			} while (flat == 0);
			if (strcmp(tempStuidnum, "n") == 0)break;
			printf("班费收支编号;");
			scanf("%s", tempStuidnum);
			for (;;) {
				if (checkAdd(tempStuidnum))
				{
					printf("班费收支编号重复,不能添加!\n");
				}
				else break;
				printf("班费收支编号:");
				scanf("%s", tempStuidnum);
			}
			printf("收入还是支出;");
			scanf("%s", tempStuid);
			printf("经办人;");
			scanf("%s", tempName);
			printf("原因;");
			scanf("%s", tempReason);
			printf("金额;");
			scanf("%d", &tempNum);
			printf("人数;");
			scanf("%d", &tempNumber);
			if (strcmp(tempStuid, "收入") == 0) {
				tempBalance = tempBalance + tempNum * tempNumber;
			}
			else tempBalance = tempBalance - tempNum * tempNumber;
			printf("余额:%d\n", tempBalance);
			printf("备注;");
			scanf("%s", tempRemarks);
			printf("时间;");
			scanf("%s", tempTime);
			addinfo(tempStuidnum, tempStuid, tempName, tempReason, tempNum, tempNumber, tempBalance, tempRemarks, tempTime);
			break;
		case 4:
			printf("请输入要查找的信息:");
			scanf("%s", tempStuidnum);
			findInfo(tempStuidnum);
			getchar(); getchar();	
			break;
		case 5:
			printf("  班级收支编号    收入还是支出    经办人    原因    金额    人数    余额    备注    时间\n");
			showInfo();
			getchar(); getchar();
			break;
		case 6:
			return;
			break;
		default:
			printf("输入错误!按任意键返回\n");
			printf(""); 
			getchar(); getchar();
			break;
		}
	}

}