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