运行

这段代码写于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}