我是靠谱客的博主 慈祥枕头,这篇文章主要介绍c语言班费收支系统-------二进制文件操作,现在分享给大家,希望可以做个参考。

共约370行代码,撸了半天撸出来了

另附:学生成绩管理系统(附文档)

        学生用餐管理系统

 实现方式都不一样,可供参考. 

班费收支系统

主要包含以下项目

            班费收支编号,收入/支出,经办人.原因.金额.备注,余额;

采用二进制文本的形式储存

实现有以下功能:
添加班费收支信息
浏览所有班费收支信息
按照不同字段(收支编号,原因等)查询班费收支信息

修改班费收支信息///这个对二进制的修改很麻烦,我就退而求其次了,把所有文本的内容读取出来,修改了之后再重新写入


扩展功能:
按某些字段进行排序浏览
不同收入和支出分别存放在不同的文件中

把文件中的收入和支出信息导入的程序中

当中还有很多做的不好的地方,代码重复率很高,我争取改进

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
#include <stdio.h> #include <stdlib.h> #include <windows.h> ///消息窗口处理的头文件,此源码只使用了其中的Sleep函数和清屏函数 #include <string.h> ///字符串处理的头文件 #define maxn 500 typedef struct Class { int id; //id int kind; //收入支出 char person[maxn]; //经手人 char result[maxn]; //原因 int amount; //数额 char tips[maxn]; //备注 } Class; void Print(Class s) { ///对内容进行输出 printf("%5d%20d%20s%20s%20d%20sn",s.id,s.kind,s.person,s.result,s.amount,s.tips); }; void Init(); void Watch(); ///浏览 void Add(); ///添加 void Find(); ///查找 void Change(); ///修改 void Find1(int,Class*,int); //查找id void Find2(int,Class*,int); //查找收入输出,下面函数同理 void Find3(int,Class*,char*); void Find4(int,Class*,char*); void Find5(int,Class*,int); void Input(); ///输入 int cmp1(const void*,const void*); int cmp2(const void*,const void*); int cmp3(const void*,const void*); int cmp4(const void*,const void*); int cmp5(const void*,const void*); int cmp6(const void*,const void*); int main() { Input(); return 0; } void Init(){ printf("请注意,该操作将会清空收支信息!n"); Sleep(1000); printf("1.执行n2.返回主菜单n"); int flag; scanf("%d",&flag); if(flag==1){ FILE *fin = fopen("income.txt","wb"); ///用wb方式打开又关闭文件可生成此文件/// FILE *fout = fopen("expenditure.txt","wb"); fclose(fin); fclose(fout); printf("重置成功!n"); Sleep(1000); return; } else if(flag==2) return; else printf("输入有误,默认返回主菜单n"); Sleep(1000); return; } void Change() { FILE *fin = fopen("income.txt","rb"); FILE *fout = fopen("expenditure.txt","rb"); FILE *f; Class s[maxn]; int i,j; for(i=0; fread(&s[i],sizeof(Class),1,fin); i++); for(j=0; fread(&s[i],sizeof(Class),1,fout); j++); fclose(fin); fclose(fout); i += j; int id; int flag = 0; printf("请输入ID:n"); scanf("%d",&id); for(j=0; j<i; j++) if(s[j].id == id) { flag = 1; break; } printf(flag?"请按照经办人 收入(0)/支出(1) 原因 金额 备注的格式写入信息,写入后此ID所对应的信息为此时输入的内容n":"该ID不存在n"); Sleep(1000); if(!flag) return; scanf("%s %d %s %d %s",s[j].person,&s[j].kind,s[j].result,&s[j].amount,s[j].tips); fin = fopen("income.txt","wb"); fout = fopen("expenditure.txt","wb"); fclose(fin); fclose(fout); for(j=0; j<i; j++) { if(s[j].kind == 1) { f = fopen("expenditure.txt","ab+"); } else f = fopen("income.txt","ab+"); fwrite(&s[j],sizeof(Class),1,f); fclose(f); } printf("修改成功,1S后返回上一菜单n"); Sleep(1000); } void Watch() { system("cls"); FILE *fin = fopen("income.txt","rb"); FILE *fout = fopen("expenditure.txt","rb");///收入和支出的文件指针 Class s[maxn]; int i,j; for(i=0; fread(&s[i],sizeof(Class),1,fin); i++)///无限读取,直到文件读完为止,fread当文件已经读完或者读到EOF的时候返回0,这个式子才不成立,循环跳出 s[i].kind = 0; for(j=0; fread(&s[i],sizeof(Class),1,fout); j++) s[i].kind = 1; fclose(fin); fclose(fout); i += j; ///此时i为收入和支出的总次数 next: system("cls"); printf("请输入浏览方式:n"); printf("1.按照ID排序n"); printf("2.按照种类排序n"); printf("3.按照经办人排序n"); printf("4.按照原因排序n"); printf("5.按照金额排序n"); printf("6.按照备注排序n"); int n; ///输入排序方式 scanf("%d",&n); switch(n) { case 1: qsort(s,i,sizeof(s[0]),cmp1);///qsort为c语言内置快速排序函数,需要与比较函数cmp一同使用,位于头文件stdlib.h中,这里统一为从小到大排序 ///cmp的具体写法有好几种,可以百度qsort cmp写法 ///能实现对数组,数字,字符,结构体等多种数据类型排序 break; case 2: qsort(s,i,sizeof(s[0]),cmp2); break; case 3: qsort(s,i,sizeof(s[0]),cmp3); break; case 4: qsort(s,i,sizeof(s[0]),cmp4); break; case 5: qsort(s,i,sizeof(s[0]),cmp5); break; case 6: qsort(s,i,sizeof(s[0]),cmp6); break; default: printf("输入错误,按照默认排序输出n"); } int balance = 0;///余额 for(j=0; j<i; j++) { Print(s[j]); if(s[j].kind) balance -= s[j].amount; ///计算余额 else balance += s[j].amount; } printf("余额为:%5dn",balance); int juge; ///下一步操作 next1: printf("返回主菜单请输入0n"); printf("返回上一菜单请输入1n"); scanf("%d",&juge); if(juge==1) //判断是不是输入错误 goto next; else if (juge != 0) { printf("输入错误,请重新输入n"); goto next1; } return; } void Add() { Class s; int flag;///判断要写入的数据种类 FILE *f; while(1) { system("cls"); printf("请输入要输入的数据种类:n0.收入 1.支出 2.停止输入n"); scanf("%d",&flag); if(flag == 1) { f = fopen("expenditure.txt","ab+"); s.kind = 1; } else if(flag == 0) { f = fopen("income.txt","ab+"); s.kind = 0; } else { if(flag!=2) printf("输入错误请重新输入n"),Sleep(1000); else break; continue; } fseek(f, 0, SEEK_END); ///将文件指针移到文件末尾,方便追加输入 if(f == NULL) printf("打开失败n"); else { printf("请按照班费收支编号(请注意保证编号唯一) 经办人 原因 金额 备注的格式写入"); printf("n中间用空格隔开,如果没有备注请在备注栏写无,其他栏同理n"); scanf("%d%s%s%d%s",&s.id,s.person,s.result,&s.amount,s.tips); if(fwrite(&s,sizeof(Class),1,f)!=1)///将一个结构体以二进制写入文件 printf("保存失败"); else printf("录入成功"); Sleep(1000); } fclose(f); } } void Input() { revert: system("cls"); ///清屏函数 printf("*************班费收支系统*************n"); printf("请按快捷键进行以下操作:n"); printf("1 添加班费收支信息n"); printf("2 浏览所有班费收支信息n"); printf("3 按照不同字段查询班费收支信息n"); printf("4 修改班费收支信息n"); printf("5 退出系统n"); printf("6 重置系统n"); int input; scanf("%d",&input); switch(input) { case 1: Add(); break; case 2: Watch(); break; case 3: Find(); break; case 4: Change(); break; case 5: return; case 6: Init(); break; default: printf("输入错误,请重新输入n"); Sleep(1000); ///消息框延迟1000ms显示 } goto revert; } int cmp1(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return c->id-d->id; } int cmp2(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return c->kind-d->kind; } int cmp3(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return strcmp(c->person,d->person); } int cmp4(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return c->result-d->result; } int cmp5(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return c->amount-d->amount; } int cmp6(const void *a,const void *b) { Class *c = (Class*)a; Class *d = (Class*)b; return strcmp(c->tips,d->tips); } void Find() { FILE *fin = fopen("income.txt","rb"); FILE *fout = fopen("expenditure.txt","rb");///收入和支出的文件指针 Class s[maxn]; int i,j; for(i=0; fread(&s[i],sizeof(Class),1,fin); i++) s[i].kind = 0; for(j=0; fread(&s[i],sizeof(Class),1,fout); j++) s[i].kind = 1; fclose(fin); fclose(fout); i += j; ///此时i为收入和支出的总次数 int n;///输入的信息 char Buf[maxn];///查询的内容 int buf;///查询的内容 printf("请输入要查找的类别:n"); printf("1.编号n"); printf("2.收入支出n"); printf("3.经办人n"); printf("4.原因n"); printf("5.金额n"); scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入ID:n"); scanf("%d",&buf); Find1(i,&s[0],buf); break; case 2: printf("请输入种类n0.收入 1.支出n"); scanf("%d",&buf); Find2(i,&s[0],buf); break; case 5: printf("请输入金额:n"); scanf("%d",&buf); Find5(i,&s[0],buf); break; case 3: printf("请输入经手人:n"); scanf("%s",Buf); Find3(i,&s[0],Buf); break; case 4: printf("请输入原因:n"); scanf("%s",Buf); Find4(i,&s[0],Buf); break; default: printf("输入有误n"); } printf("3S后返回上一页n"); Sleep(3000); return; } void Find1(int n,Class* s,int x) { ///S为存储数据的结构体数组,n为数据总量,x为要查找的ID,下面同理 int i; for(i=0; i<n; i++) { if(x == s[i].id) Print(s[i]); } printf("输出完毕n"); } void Find2(int n,Class* s,int x) { int i; for(i=0; i<n; i++) { if(x == s[i].kind) Print(s[i]); } printf("输出完毕n"); } void Find3(int n,Class* s,char a[]) { int i; for(i=0; i<n; i++) if(strcmp(s[i].person,a) == 0) Print(s[i]); printf("输出完毕n"); } void Find4(int n,Class* s,char a[]) { int i; for(i=0; i<n; i++) if(strcmp(s[i].result,a) == 0) Print(s[i]); printf("输出完毕n"); } void Find5(int n,Class* s,int x) { int i; for(i=0; i<n; i++) { if(x == s[i].amount) Print(s[i]); } printf("输出完毕n"); }






转载于:https://www.cnblogs.com/bestsort/p/10588901.html

最后

以上就是慈祥枕头最近收集整理的关于c语言班费收支系统-------二进制文件操作的全部内容,更多相关c语言班费收支系统-------二进制文件操作内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部