运行
这段代码写于2022年期末,作为C语言课程设计。
1#include <stdio.h>
2#include <stdbool.h>
3#include <string.h>
4#include <windows.h>
5#include <time.h>
6
7typedef struct worker_data // 定义保存员工数据的结构体
8{
9 int Number; // 编号
10 char Name[10]; // 姓名
11 char Department[10]; // 部门
12 int Wages_payable; // 应付工资
13 int Insurance; // 保险
14 int Taxes; // 税金
15 int Real_wags; // 实付工资
16} WD;
17
18void fpWrite(void); // 写入数据
19void fpRade(void); // 显示数据
20void fpInquire(void); // 查找数据
21void fpChange(void); // 修改数据
22void fpDelete(void); // 删除数据
23void about_h(void); // 关于程序
24void cls(void); // 清屏
25void color(int c); // 改变文字颜色
26void putss(WD *PT); // 打印数据函数
27void getss(WD *GT); // 写入数据函数
28
29int main()
30{
31 while (true) // true是stdbool包中的宏定义,编译时会自动替换为1
32 {
33 cls(); // 清屏 改变字体颜色 打印菜单栏
34 system("color 0A");
35 printf(" ****************************************************************\n");
36 printf(" * 工资统计系统 *\n");
37 printf(" * 1.写入数据 4.修改数据 *\n");
38 printf(" * 2.显示数据 5.删除数据 *\n");
39 printf(" * 3.查找数据 6.关于程序 *\n");
40 printf(" * 0:退出程序 *\n");
41 printf(" ****************************************************************\n\n");
42
43 _maed:
44 printf("请输入菜单中对应编码:"); // 通过不同的x值来进入不同函数,实现不同功能
45
46 int x;
47 scanf("%d", &x);
48
49 if (x == 1)
50 {
51 fpWrite();
52 }
53 else if (x == 2)
54 {
55 fpRade();
56 }
57 else if (x == 3)
58 {
59 fpInquire();
60 }
61 else if (x == 4)
62 {
63 fpChange();
64 }
65 else if (x == 5)
66 {
67 fpDelete();
68 }
69 else if (x == 6)
70 {
71 about_h();
72 }
73 else if (x == 0)
74 {
75 return 0;
76 }
77 else
78 {
79 printf("未知的指令:请在0~6中选择输入!\n");
80 goto _maed;
81 }
82 }
83};
84
85void fpWrite(void)
86{
87_Wsz:
88
89 cls();
90 WD workerW;
91 getss(&workerW);
92
93 FILE *fp = fopen("workerdata.txt", "a"); // 以写入方式打开数据文件,并定义文件指针指向该文件
94 fwrite(&workerW, sizeof(workerW), 1, fp); // 将结构体中的数据以二进制方式写入文件中
95 fclose(fp); // 关闭文件指针
96
97 cls();
98 printf("写入完成!\n");
99 printf("输入1继续写入,输入0返回菜单!");
100_Wsz2:
101 int num;
102 scanf("%d", &num);
103 if (num == 1)
104 {
105 goto _Wsz;
106 }
107 else if (num == 0)
108 {
109 return;
110 }
111 else
112 {
113 printf("未知的指令!请重新输入!");
114 goto _Wsz2;
115 }
116}
117
118void fpRade(void)
119{
120 cls();
121 printf(" 全部工资信息如下: \n\n");
122 WD workerR;
123 FILE *fp = fopen("workerdata.txt", "r"); // 以只读的方式打开数据文件,并定义文件指针指向该文件
124 while (fread(&workerR, sizeof(workerR), 1, fp)) // 循环读取文件指针的二进制数据,并打印
125 {
126 putss(&workerR);
127 }
128 fclose(fp);
129
130 printf("\n输入0返回菜单\n");
131_Rsiz:
132 int k;
133 scanf("%d", &k);
134
135 if (k == 0)
136 {
137 cls();
138 return;
139 }
140 else
141 {
142 printf("输入的数据不对,请重新输入!\n"); // 下面的goto语句来实现重新输入
143 goto _Rsiz;
144 }
145}
146
147void fpInquire(void)
148{
149 cls();
150_Isz:
151 char stud[3][10] = {"编号", "姓名", "部门"};
152 char a[10] = {0};
153 int size;
154 int size2;
155 int inumber;
156 WD workerI;
157
158 printf("1.按编号查找\n2.按姓名查找\n3.按部门查找\n0.返回上一级\n\n");
159
160 printf("请输入对应编号选择功能:");
161 scanf("%d", &size);
162_Isz3:
163 cls();
164 printf("请输入您要查找的%s:", stud[size - 1]);
165
166 if (size == 1)
167 {
168 int a1 = 1;
169 scanf("%d", &inumber);
170 FILE *fp = fopen("workerdata.txt", "r");
171 printf("编号%d的员工数据如下:\n", inumber);
172 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印
173 {
174 if (workerI.Number == inumber)
175 {
176 putss(&workerI);
177 a1 = 0;
178 }
179 }
180 fclose(fp);
181
182 if (a1 == 1)
183 {
184 printf("\n没有找到编号为%d的员工!请重新输入!\n", inumber);
185 goto _Isz3;
186 }
187 }
188 else if (size == 2)
189 {
190 int a2 = 0;
191 scanf("%s", a);
192 FILE *fp = fopen("workerdata.txt", "r");
193 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印
194 {
195 if (strcmp(workerI.Name, a) == 0)
196 {
197 printf("员工%s数据如下:\n", a);
198 putss(&workerI);
199 a2 = 1;
200 }
201 }
202 *a = 0;
203 fclose(fp);
204
205 if (a2 == 0)
206 {
207 printf("\n没有找到姓名为%s的员工!请重新输入!\n", a);
208 goto _Isz3;
209 }
210 }
211 else if (size == 3)
212 {
213 int a3 = 0;
214 int allnum = 0;
215 int numj = 0;
216 scanf("%s", a);
217 FILE *fp = fopen("workerdata.txt", "r");
218 printf("部门%s的数据如下:\n", a);
219 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印
220 {
221 if (strcmp(workerI.Department, a) == 0)
222 {
223 putss(&workerI);
224 allnum += workerI.Real_wags;
225 numj++;
226 a3 = 1;
227 }
228 }
229
230 *a = 0;
231 fclose(fp);
232
233 if (a3 == 0)
234 {
235 printf("\n没有找到部门为%s的员工!请重新输入!\n", a);
236 goto _Isz3;
237 }
238
239 printf("\n总工资:%d\n平均工资:%lf\n", allnum, 1.0 * allnum / numj);
240 }
241 else
242 {
243 return;
244 }
245
246_Isz2:
247 printf("\n输入1继续查找,输入0返回菜单:\n");
248 scanf("%d", &size2);
249
250 if (size2 == 1)
251 {
252 cls();
253 goto _Isz;
254 }
255 else if (size2 == 0)
256 {
257 return;
258 }
259 else
260 {
261 printf("未知的指令,请重新输入!\n");
262 goto _Isz2;
263 }
264}
265
266void fpChange(void)
267{
268 cls();
269_Csiz1:
270 printf("请输入要修改人员的姓名(输入0返回菜单):");
271 char name[10] = {0};
272 scanf("%s", name);
273
274 if (strcmp(name, "0") == 0)
275 {
276
277 cls();
278 return;
279 }
280
281 WD workerC;
282 int i = 1;
283
284 FILE *fp = fopen("workerdata.txt", "r+b");
285 while (fread(&workerC, sizeof(workerC), 1, fp))
286 {
287 if (strcmp(workerC.Name, name) == 0)
288 {
289 printf("%s的数据如下:\n", name);
290
291 putss(&workerC);
292
293 fseek(fp, -(long int)sizeof(workerC), SEEK_CUR);
294
295 i = 0;
296 break;
297 }
298 }
299
300 if (i == 1)
301 {
302 printf("没有找到这个人,请重新输入!\n");
303 goto _Csiz1;
304 }
305
306 printf("请输入修改后的数据!\n");
307 getss(&workerC);
308
309 fwrite(&workerC, sizeof(workerC), 1, fp);
310 fclose(fp);
311
312 printf("修改完成!\n输入1继续修改,输入0返回菜单!\n");
313 int k;
314 scanf("%d", &k);
315 if (k == 1)
316 {
317 goto _Csiz1;
318 cls();
319 }
320 else if (k == 0)
321 {
322 cls();
323 return;
324 }
325}
326
327void fpDelete(void)
328{
329 cls();
330_release:
331 printf("请输入想要删除的人员的名称(输入0返回上级):");
332 char name[10] = {0};
333 scanf("%s", name);
334
335 if (strcmp(name, "0") == 0)
336 {
337 cls();
338 return;
339 }
340
341 FILE *file = fopen("workerdata.txt", "r");
342 fseek(file, 0, SEEK_END);
343 int num = ftell(file) / sizeof(WD);
344 fseek(file, 0, SEEK_SET);
345
346 WD *all = (WD *)malloc(num * sizeof(WD));
347 WD *const start = all;
348 while (fread(all++, sizeof(WD), 1, file))
349 ;
350 fclose(file);
351
352 WD *news = (WD *)malloc((num - 1) * sizeof(WD));
353 WD *const newIndex = news;
354
355 int offset = 0;
356 for (int i = 0; i < num; ++i)
357 {
358 if (strcmp(name, start[i].Name) == 0)
359 {
360 offset = 1;
361 printf("%s的数据如下:\n", name);
362 putss(start);
363 continue;
364 }
365 *news++ = start[i];
366 }
367
368 if (offset == 0)
369 {
370 cls();
371 printf("没有找到这个人,请重新输入!\n");
372 goto _release;
373 }
374
375 printf("输入yes确认删除数据:");
376 scanf("%s", name);
377 if (strcmp(name, "yes") == 0)
378 {
379 cls();
380 printf("删除完成!");
381
382 system("del /f /s workerdata.txt");
383 FILE *w = fopen("workerdata.txt", "w");
384 fwrite(newIndex, sizeof(WD), num - 1, w);
385 fclose(w);
386 }
387
388 free(start);
389 free(newIndex);
390
391 printf("输入1继续删除,输入0返回菜单!\n");
392_stu:
393 int k;
394 scanf("%d", &k);
395 if (k == 1)
396 {
397 cls();
398 goto _release;
399 }
400 else if (k == 0)
401 {
402 return;
403 }
404 else
405 {
406 cls();
407 printf("您输入的数据有误,请重新输入!\n");
408 goto _stu;
409 }
410}
411
412void about_h(void)
413{
414 int x, y;
415 int dx, dy;
416
417 cls();
418 for (int i = 1; i < 20; i++)
419 {
420
421 printf(" /\\_/\\ \n( o.o )\n >^< \n /^\\/^\\\n");
422 if (i < 15)
423 {
424 color(i);
425 }
426 else
427 {
428 color(i - 15);
429 }
430 printf("\n\n\n\n\n\n\n\n\n\n\n\n");
431 printf(" ");
432 for (int j = 0; j < i; j++)
433 {
434 printf("* ");
435 }
436 printf("\n 感谢您使用本程序!\n");
437 printf("\n 作者:肖嘉兴 版本:V2.4\n");
438 printf(" 了解源代码,请访问-->hackerxiao.online\n");
439 printf(" ");
440 for (int j = 0; j < i; j++)
441 {
442 printf("* ");
443 }
444 Sleep(200);
445
446 cls();
447 }
448}
449
450void cls(void)
451{
452 system("CLS");
453}
454
455void color(int c)
456{
457 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
458}
459
460void putss(WD *PT)
461{
462 printf("\n编号:%d ", PT->Number);
463 printf("\t姓名:%s ", PT->Name);
464 printf("\t部门:%s ", PT->Department);
465 printf("\t应付工资:%d ", PT->Wages_payable);
466 printf("\t保险:%d ", PT->Insurance);
467 printf("\t税金:%d ", PT->Taxes);
468 printf("\t实付工资:%d \n", PT->Real_wags);
469}
470
471void getss(WD *PT)
472{
473 printf("编号:");
474 scanf("%d", &PT->Number);
475 printf("姓名:");
476 *PT->Name = 0;
477 scanf("%s", PT->Name);
478 printf("部门:");
479 *PT->Department = 0;
480 scanf("%s", PT->Department);
481 printf("应付工资:");
482 scanf("%d", &PT->Wages_payable);
483 printf("保险:");
484 scanf("%d", &PT->Insurance);
485 printf("税金:");
486 scanf("%d", &PT->Taxes);
487 PT->Real_wags = PT->Wages_payable - PT->Insurance - PT->Taxes;
488}