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

    技术2022-07-10  143

    大一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; }

    原谅我的注释有点神奇

    Processed: 0.019, SQL: 9