大一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;
}
原谅我的注释有点神奇