C语言学生财富收入支出代码,包含文件输入输出(类似学生管理系统原理)

大一C语言这门课程的大作业,数据输入输出查找删除都含括,所选IDE是vs2010,不是空项目!!是用预编译头,用空项目的小伙伴记得加上头文件哟!
头文件:

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

#include "stdafx.h"
#define SIZE 5  //定义个宏常量方便
#define BITCH sizeof(struct student)

void showmenu(void); //显示菜单
int showintput(void);
void insert(void);
void modify(void);
void shanchu(void);
void find(void);

//定义结构体变量
struct student
{
	char name[10];
	int id;
	int blank;
	int weichat;
}stu[SIZE];

int _tmain(int argc, _TCHAR* argv[])
{
	int intput;

	showmenu();
	while(scanf("%d",&intput))
	{
		switch(intput)
		{
		case 1:
			insert();
			break;
		case 2:
			modify();
			break;
		case 3:
			shanchu();
			break;
		case 4:
			find();
			break;
		default:
			return 0;
		}
		getchar(); //抵消掉scanf带来的回车缓冲
		showmenu();
	}

	
	return 0;
}

void showmenu(void)
{
	system("cls");
	printf("\n\n");
	printf("\t\t|-------学生支出管理-------|\n");//seven -,这玩意真难调整
	printf("\t\t|\t\t\t   |\n");
	printf("\t\t|     1.插入学生的数据     |\n");
	printf("\t\t|     2.修改学生数据       |\n");
	printf("\t\t|     3.删除学生数据       |\n");
	printf("\t\t|     4.查找学生数据       |\n");
	printf("\t\t|     其他.退出程序        |\n");
	printf("\t\t|\t\t\t   |\n");
	printf("\t\t|\t\t\t   |\n");
	printf("\t\t|--------------------------|\n");
	printf("\n\n\t\t同学,请问您的输入是:");
}

int showintput(void)//实现二进制方式读取文件
{
	FILE *fp = NULL;
	int ber,num = 0; //用作循环当中
	if((fp = fopen("studentintput.txt","rb")) == NULL)
	{
		printf("no open1!\n");
		return -1;
	}

	while(!feof(fp)) //当文件不到末尾时,加加加
	{
		if(fread(&stu[num],BITCH,1,fp) == 1)
			num++;
	}
	fclose(fp);

	if(num == 0)
		printf("sorry no thing in file\n");
	else
	{
		printf("名字\t学号\t微信的钱\t银行的钱\n");
		for(ber = 0;ber < num;ber++)
			printf("%s\t %d\t%d\t\t%d\n",stu[ber].name,stu[ber].id,stu[ber].weichat,stu[ber].blank);
	}
	return num;
}

void insert(void)
{
	//根据用户输入的学号将他传送到相对应的位置上,那是不是后面的学生位置就得往后排了,应该是的
	//后面经过严谨的分析发现哈哈哈哈说xx呢,只要总共输入的个数一个一个找,发现了编码相同即可
	FILE * fp = NULL;
	int add; 
	system("cls");

	int num = showintput(); //返回在仓库里面的学员个数

	if((fp = fopen("studentintput.txt","ab")) == NULL)
	{
		printf("no open2!\n");
		getchar();
		return;
	}

	printf("请输入你想添加的学号:");
	if(scanf("%d",&stu[num].id)) //还需要考虑用户输入乱码的情况
	{
		for(add = 0;add < num;add++)
			if(stu[add].id == stu[num].id)
			{
				printf("里面已经存有数据啦!再来一次吧~\n");
				getchar();
				fclose(fp);
				return;
			}
		printf("请输入学生的名字:");
		scanf("%s",stu[num].name); //想防止用户输入乱码,后期实现 //但好像乱码也可以作为名字的一种...,还有一种情况是
		//名字重合现象,在生活中也无法避免。。。
		printf("请输入学生微信的钱:");
		scanf("%d",&stu[num].weichat);
		printf("请输入学生银行卡的钱:");
		scanf("%d",&stu[num].blank);
	}
	else
	{
		printf("你输入的id不正确\n");
		fclose(fp);
		return;
	}

	if(fwrite(&stu[num],BITCH,1,fp))
	{
		printf("已添加!\n");
		getchar();
		fclose(fp);
		return;
	}
}

void modify(void)
{
	int mod; //用作用户所需要更改的编号
	int add; //用做找到用户的参数
	int fund;//用作查找是否有跟学号重合的
	int temp; //用作寻找重复ID
	int sum = 0; //统计不对上头的
	system("cls");

	int num = showintput();

	if(num <= -1)
	{
		printf("文件里面没东西!\n");
		getchar();
		return;
	}

	printf("请输入你所需要更改的学号:");
	scanf("%d",&mod); //有个问题是怎么提示用户输入在文件里没有的学号

	for(add = 0;add < num;add++) //嘻嘻问题解决了!//在最后一个函数中有更加简便的算法,上面就不做修改了
	{
		if(mod != stu[add].id)
			sum++;
	}
	if(sum == num)
	{
		printf("你输入的学号在文件中不存在!");
		getchar();
		return;
	}


	for(add = 0;add < num;add++) //为了我方便就全部一起修改吧嘻嘻
	{
		if(mod == stu[add].id) //找到与其相同的学号
		{
			printf("请输入你需要改到的学号:");
			scanf("%d",&temp);
			for(fund = 0;fund < num;fund++) //这时再利用对原来的id逐一排查,看下有没有与之重复的
			{
				if(temp == stu[add].id) //一种情况就是遇到了要改变的学号和输入的学号一样
				{
					printf("你的学号保持不变\n");
					getchar();
					break;
				}
				if(temp == stu[fund].id)//还有一种是输入的里面已经有了
				{
					printf("这个学号已经有了,再来试试吧哈哈哈!\n");
					getchar();
					return;
				}
			}
			stu[add].id = temp;
			printf("请输入你需要改的名字:");
			scanf("%s",stu[add].name);
			printf("请输入你需要改的微信零钱:"); //钱应该是浮点数,待后期实现
			scanf("%d",&stu[add].weichat);
			printf("请输入你需要改的银行金额:");
			scanf("%d",&stu[add].blank);
			
			FILE *fp;
			if((fp = fopen("studentintput.txt","rb+")) == NULL)
			{
				printf("no open!\n");
				getchar();
				return;
			}
			fseek(fp,add*BITCH,0);
			if(fwrite(&stu[add],BITCH,1,fp) != 1)
			{
				printf("can't to save!\n");
				getchar();
				return;
			}
			fclose(fp);

		}
	}
	printf("修改完成!\n");
	showintput();
	getchar();
	return;
}

void shanchu(void)
{
	int mod; //用作用户所需要删除的编号
	int add; //用做找到用户的参数
	int dele; //用作开始删除的数据
	int sum = 0;
	system("cls");
	int num = showintput();

	printf("请输入你所需要删除的学号:");
	scanf("%d",&mod);

	for(add = 0;add < num;add++) //解决用户输入删除的学号不存在的情况
	{
		if(mod != stu[add].id)
			sum++;
	}
	if(sum == num)
	{
		printf("你输入的学号在文件中不存在!");
		getchar();
		return;
	}


	for(add = 0;add < num;add++) //找到需要删除的位置
	{
		if(mod == stu[add].id)
		{
			dele = add;
			break;
		}
	}

	for(;dele < num-1;dele++)
	{
		stu[dele] = stu[dele + 1];
	}

	FILE * fp;
	if((fp = fopen("studentintput.txt","wb")) == NULL)
	{
		printf("no open!\n");
		getchar();
		return;
	}

	for(add = 0;add < num-1;add++)
		fwrite(&stu[add],BITCH,1,fp);

	showintput();
	getchar();
	fclose(fp);
	return;
}

void find(void) //有个非常重要的一点,如果没有打开文本文件,结构体的数据能否给读取呢这需要慢慢调试了
{
	int chaxun;
	int add;//用于一个一个查找的参数
	char xingming[10]; //用户输入名字
	int money_w,money_b;//用作用户所查找的金额
	int number; //学号
	int sum = 0;//用作统计全局
	system("cls");

	int num = showintput();
	sum = num;

	FILE *fp;
	if((fp = fopen("studentintput.txt","rb")) == NULL)
	{
		printf("no open!\n");
		getchar();
		return;
	}
	for(add = 0;add < num;add++)
	{
		fwrite(&stu[add],BITCH,1,fp);
	}

	printf("\t1.姓名\t2.学号\n\t3.blank\t4.wechat\n");
	printf("你输入你想查找的玩意:");
	scanf("%d",&chaxun); //输入需要查询的信息
	//getchar();
	while(chaxun > 4 && chaxun < 1)
	{
		printf("不对,请再次输入:");
		scanf("%d",chaxun);
	/*	getchar();*/
	}

	switch(chaxun) //如果找不到的话,又要像上面一样返回值了
	{
	case 1:
		printf("请输入你要查找的名字:");
		scanf("%s",xingming);
		for(add = 0;add < num;add++)
			if(strcmp(stu[add].name,xingming) == 0) //如果相等就打印出来
			{
				printf("%s\t%d\t%d\t%d\n",stu[add].name,stu[add].id,stu[add].weichat,stu[add].blank);
				sum--;
			}
			if(sum == num)
			{
				printf("没有你要找的名字!");
				getchar();
				return;
			}
		break;
	case 2:
		printf("请输入你要查找的学号:");
		scanf("%d",&number);
		for(add = 0;add < num;add++)
			if(number == stu[add].id) //如果相等就打印出来
			{
				printf("%s\t%d\t%d\t%d\n",stu[add].name,stu[add].id,stu[add].weichat,stu[add].blank);
				sum--;
			}
			if(sum == num)
			{
				printf("没有你要找的学号!");
				getchar();
				return;
			}
		break;
	case 3:
		printf("请输入你要查找的银行余额:");
		scanf("%d",&money_b);
		for(add = 0;add < num;add++)
			if(money_b == stu[add].blank) //如果相等就打印出来
			{
				printf("%s\t%d\t%d\t%d\n",stu[add].name,stu[add].id,stu[add].weichat,stu[add].blank);
				sum--;
			}
			if(sum == num)
			{
				printf("没有你要找的银行余额!");
				getchar();
				return;
			}
		break;
	case 4:
		printf("请输入你要查找的微信余额:");
		scanf("%d",&money_w);
		for(add = 0;add < num;add++)
			if(money_w == stu[add].weichat) //如果相等就打印出来
			{
				printf("%s\t%d\t%d\t%d\n",stu[add].name,stu[add].id,stu[add].weichat,stu[add].blank);
				sum--;
			}
			if(sum == num)
			{
				printf("没有你要找的微信余额!");
				getchar();
				return;
			}
	}
	printf("已显示!");
	getchar();
	return;
}

原谅我的注释有点神奇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值