C语言大作业之班费管理系统
程序员文章站
2022-05-06 09:29:07
...
班费管理系统
前言:
开发环境:Visual Studio Community 2017;
1.储存班级收支的信息;2.增加班费信息;3.删除班费信息;
4.改变班费信息;5.查找班费信息;6.实现自动计算余额;
完成了
1.储存信息;2.增加信息;(不能选择位置添加、时间的获取只能通过手动输入)
3.删除信息;4.改变信息;(不能选择信息修改)5.查找信息;(不能按照规定排序)
6.自动计算
可以正常运行,并且有一定的容错性。对于如何操作有明显的提示,会对重复的收支编号信息进行提示,遇到不规范输入时会提醒。对于文本已经储存的信息会在运行时先读入链表里。这个班费收支系统可以让操作者输入信息到文本内储存起来,按照收支编号,收入支出,负责人,金额等信息顺序输入,并且在查找和展示的时候以列表的形式呈现出来,操作时没有撤回的功能所以如果误删了信息需要重新输入。
操作界面:
代码:
#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;
}
}
}
下一篇: C语言大作业:车辆管理系统