C语言课程设计 Win32应用程序
问题描述:
请设计一个职工信息管理程序,以方便人事部门对本单位职工的管理,该程序应该具有以下功
能:
(1)能从键盘输入职工的信息 。
(2)给定职工号,显示职工的信息。
(3)给定工作部门,显示该部门的职工信息。
(4)给定职工号,修改职工的信息。
(5)给定职工号,删除职工信息。
题目要求:
(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。
(2)职工信息应该包含职工号、姓名、工作部门、职称、入厂时间、工资。
(3)为程序设计windows 窗口,在该窗口上以按钮的形式为用户提供“菜单”,通过点击各个功
能项对应的按钮完成操作。
输入要求:
(1)用户可以根据需求,选定相应的操作项目。进入每个操作后,通过窗口的文本框,从键盘输
入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。
(2)能对输入的数据进行简单的校验,例如,入厂时间必须是合法的日期格式,职工号是唯一的
(一个职工号对应一个职工的职工信息)。
输出要求:
(1)应用程序运行后,要在屏幕上显示一个按钮形式的“菜单”。
(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方
式等。
(3)在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定职工号删除职工信息时,
如果该职工不存在,要提示没能删除,如果删除成功要提示删除成功。
实现要求:
(1)在程序中使用链表存储职工信息。
(2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。
提示:
(1)使用结构体表示职工信息,一个结点保存一条职工信息。
扩展功能:
(1)提供一些统计功能。例如统计每个部门的人数,统计平均工资、统计各职称的人数。
(2)职工信息从文件读入。
(3)将职工信息保存到文件中。
代码如下:
1 #include <windows.h> 2 #include<string.h> 3 #include<stdio.h> 4 #include"resource.h" 5 LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);//函数声明 6 /* 基本功能 */ 7 void initWorker(); 8 void addWorker(); 9 void showAllInfo(); 10 void clearText(); 11 void clearCache(); 12 void deleteWorker(); 13 void searchWorker(); 14 void modifyWorker(); 15 void searchDepartmentWorker(); 16 void showFormat(struct worker *p); 17 void saveLocalFile(); 18 void readLocalFile(); 19 void statisticsInfo(); 20 21 struct inputhwnd 22 { 23 int x1; 24 int x2; 25 int x3; 26 int x4; 27 int menu_name; 28 }hwndArray[9]= {{110, 145, 150, 20,NUM_INPUT},{110, 200, 150, 20,NAME_INPUT},{110, 255, 150, 20,DEPART_INPUT}, 29 {110, 310, 150, 20,JOBTITLE_INPUT},{110, 365, 50, 20,YEAR_INPUT},{110, 420, 150, 20,WAGE_INPUT}, 30 {182, 365, 25, 20,MONTH_INPUT},{232, 365, 25, 20,DATE_INPUT},{320, 120, 900, 400,BIGTEXTBOX}}; 31 /* 按钮 结构体 */ 32 struct inputhwndbutton 33 { 34 char buttonName[30]; 35 int x1; 36 int x2; 37 int x3; 38 int x4; 39 int buttonNum; 40 }buttonArray[12]={{"添加职工",190,550,80,30,ADD_BUTTON},{"按职工号查询",300,550,120,30,SEARCHNUM_BUTTON},{"修改信息",450,550,100,30,MODIFY_BUTTON}, 41 {"删除职工",580,550,80,30,DELETE_BUTTON},{"显示所有职工信息",690,550,140,30,SHOWINFO_BUTTON},{"按部门查询",860,550,100,30,SEARCHDEPART_BUTTON}, 42 {"清空显示",990,550,100,30,CLEARTEXT_BUTTON},{"版权声明",1,622,100,30,COPYRIGHT_BUTTON},{"退出程序",1190,622,100,30,EXIT_BUTTON}, 43 {"保存到本地",900,90,100,30,SAVELOCALFILE_BUTTON},{"从本地读",1100,90,100,30,READLOCALFILE_BUTTON},{"统计",1120,550,100,30,STATISTICS_BUTTON}}; 44 /* 矩形框 结构体 */ 45 struct showrect 46 { 47 char rectName[50]; 48 int top; 49 int right; 50 int bottom; 51 int left; 52 }rectArray[10]={{"[ 职工信息输入框 ]",220,300,40,100},{"职工号:",270,120,40,20},{"姓名:",380,120,40,20}, 53 {"工作部门:",490,120,40,20},{"职称:",600,120,40,20},{"入厂时间:",710,120,40,20}, 54 {"工资:",820,120,40,20},{"年",710,50,40,290},{"月",710,50,40,390},{"日",710,50,40,490}}; 55 RECT rect[10]; 56 HDC hDC; 57 HWND hWnd; 58 PAINTSTRUCT paint; 59 static char str_num[20],str_name[20],str_depart[20],str_jobTitle[20],str_year[10],str_month[6],str_date[6],str_wage[20],str_showAll[1000]; 60 char title[100]={"职工号\t\t姓名\t\t工作部门\t\t\t职称\t\t入厂时间\t\t工资\r\n\r\n"}; 61 struct worker 62 { 63 long num; //职工号 64 char name[20]; //姓名 65 char department[20];//工作部门 66 char jobTitle[20]; //职称 67 int year; 68 int month; 69 int date; 70 long wage; //工资 71 worker *next; 72 }; 73 struct worker *headp; 74 void initWorker() 75 { 76 headp = new worker; 77 headp->next=NULL; 78 } 79 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 80 { 81 char *cName = "myWindow";//定义个字符指针表示窗口类的名字 82 WNDCLASS wc;//定义变量 83 MSG Msg; 84 wc.cbClsExtra = 0; 85 wc.cbWndExtra = 0; 86 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);;//设置窗口背景为白色 87 wc.hCursor = NULL;//窗口的光标不设置 88 wc.hIcon = NULL; 89 wc.hInstance = hInstance;//当前程序的句柄,hInstance是由主函数传递 90 wc.lpfnWndProc = WinProc;//窗口处理过程的窗口函数。 91 wc.lpszClassName =(LPSTR)cName;//窗口类的名字。 92 wc.lpszMenuName = NULL;//目录名,不设置 93 wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格 94 RegisterClass(&wc);//在系统中注册窗口 95 hWnd = CreateWindow(cName,TEXT("职工管理程序"),WS_OVERLAPPEDWINDOW,25, 25, 1300, 690,NULL, NULL, hInstance, NULL) ; 96 ShowWindow(hWnd,nShowCmd);//显示窗口 97 UpdateWindow(hWnd);//更新窗口 98 initWorker(); 99 while(GetMessage(&Msg,NULL,0,0)) 100 { 101 TranslateMessage(&Msg);//翻译消息 102 DispatchMessage(&Msg);//分派消息 103 } 104 return Msg.message;//程序结束后返回消息 105 } 106 LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 107 {//处理消息过程 108 static HWND btnHwnd; 109 static HWND inputHwnd[9]; 110 static HWND hwndbutton[12]; 111 switch(Msg)//对消息进行判断 112 { 113 case WM_PAINT: 114 hDC=BeginPaint(hWnd,&paint);//获取设备上下文 115 for(int i =0;i<10;i++) 116 { 117 rect[i].top = rectArray[i].top; 118 rect[i].right = rectArray[i].right; 119 rect[i].bottom = rectArray[i].bottom; 120 rect[i].left = rectArray[i].left; 121 DrawText(hDC,rectArray[i].rectName,-1,&rect[i],DT_SINGLELINE|DT_LEFT|DT_VCENTER); 122 } 123 EndPaint(hWnd,&paint); 124 return 0; 125 case WM_CREATE: //响应窗口的创建事件 126 //gg(((LPCREATESTRUCT) lParam) -> hInstance); 127 for(int i = 0;i<9;i++) 128 { 129 inputHwnd[i]=CreateWindow(TEXT("edit"),NULL,WS_CHILD |WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,hwndArray[i].x1,hwndArray[i].x2,hwndArray[i].x3,hwndArray[i].x4,hWnd,(HMENU)hwndArray[i].menu_name,((LPCREATESTRUCT) lParam)->hInstance,NULL); 130 } 131 for(int i =0 ;i<12;i++) 132 { 133 hwndbutton[i]=CreateWindow(TEXT("BUTTON"),buttonArray[i].buttonName,WS_CHILD|WS_VISIBLE,buttonArray[i].x1,buttonArray[i].x2,buttonArray[i].x3,buttonArray[i].x4,hWnd,(HMENU)buttonArray[i].buttonNum,((LPCREATESTRUCT) lParam) -> hInstance,NULL); 134 } 135 return 0; 136 case WM_COMMAND://响应命令 137 { 138 switch(LOWORD(wParam)) 139 { 140 case ADD_BUTTON: 141 { 142 clearCache(); 143 addWorker(); 144 return 0; 145 } 146 case SEARCHNUM_BUTTON: 147 { 148 clearCache(); 149 searchWorker(); 150 return 0; 151 } 152 case MODIFY_BUTTON: 153 { 154 clearCache(); 155 modifyWorker(); 156 return 0; 157 } 158 case DELETE_BUTTON: 159 { 160 clearCache(); 161 deleteWorker(); 162 return 0; 163 } 164 case SHOWINFO_BUTTON: 165 { 166 clearCache(); 167 showAllInfo(); 168 return 0; 169 } 170 case SEARCHDEPART_BUTTON: 171 { 172 clearCache(); 173 searchDepartmentWorker(); 174 return 0; 175 } 176 case CLEARTEXT_BUTTON: 177 { 178 clearCache(); 179 clearText(); 180 return 0; 181 } 182 case COPYRIGHT_BUTTON: 183 { 184 MessageBox(NULL,TEXT("本程序归属CCSoft所有,并保留一切权力,任何\n个人或者单位必须经过CCSoft的个人授权、不限\n于书面形式。如有侵权行为,必当追究。"),TEXT("版权声明"),MB_OK); 185 return 0; 186 } 187 case EXIT_BUTTON: 188 { 189 PostQuitMessage(0);//退出消息队列 190 return 0;//返回0,结束函数 191 } 192 /* 扩展功能:保存在本地 */ 193 case SAVELOCALFILE_BUTTON: 194 { 195 clearCache(); 196 saveLocalFile(); 197 return 0; 198 } 199 /* 扩展功能:写在本地 */ 200 201 /**fun()[];*/ 202 case READLOCALFILE_BUTTON: 203 { 204 clearCache(); 205 readLocalFile(); 206 /* 用函数指针的方式 */ 207 /*fun()[3]*/ 208 return 0; 209 } 210 /* 扩展功能:简单的统计 */ 211 case STATISTICS_BUTTON: 212 { 213 clearCache(); 214 statisticsInfo(); 215 return 0; 216 } 217 } 218 return 0; 219 } 220 case WM_DESTROY://如果是点击关闭窗口时的消息 221 PostQuitMessage(0);//退出消息队列 222 return 0;//返回0,结束函数 223 } 224 //如果是其余的消息,调用默认消息处理函数,将消息该函数处理并将返回值返回 225 return DefWindowProc(hWnd,Msg,wParam,lParam); 226 } 227 void clearText() 228 { 229 230 SetDlgItemText(hWnd,NUM_INPUT,str_num); 231 SetDlgItemText(hWnd,NAME_INPUT,str_name); 232 SetDlgItemText(hWnd,DEPART_INPUT,str_depart); 233 SetDlgItemText(hWnd,JOBTITLE_INPUT,str_jobTitle); 234 SetDlgItemText(hWnd,YEAR_INPUT,str_year); 235 SetDlgItemText(hWnd,MONTH_INPUT,str_month); 236 SetDlgItemText(hWnd,DATE_INPUT,str_date); 237 SetDlgItemText(hWnd,WAGE_INPUT,str_wage); 238 SetDlgItemText(hWnd,BIGTEXTBOX,str_showAll); 239 } 240 void gg( HINSTANCE hInstance) 241 { 242 243 } 244 245 void clearCache() 246 { 247 ZeroMemory(str_num,sizeof(str_num)); 248 ZeroMemory(str_name,sizeof(str_name)); 249 ZeroMemory(str_depart,sizeof(str_depart)); 250 ZeroMemory(str_jobTitle,sizeof(str_jobTitle)); 251 ZeroMemory(str_year,sizeof(str_year)); 252 ZeroMemory(str_month,sizeof(str_month)); 253 ZeroMemory(str_date,sizeof(str_date)); 254 ZeroMemory(str_wage,sizeof(str_wage)); 255 ZeroMemory(str_showAll,sizeof(str_showAll)); 256 } 257 void addWorker() 258 { 259 char str_temp[50]; 260 ZeroMemory(str_temp,sizeof(str_temp)); 261 struct worker *newworker; 262 struct worker *assistp,*followp; 263 followp=headp; 264 assistp=headp->next; 265 newworker = new worker; 266 GetDlgItemText(hWnd,NUM_INPUT,str_num,sizeof(str_num)/sizeof(char)); 267 newworker->num = atol(str_num); 268 if(newworker->num == 0 || newworker->num<0) 269 { 270 MessageBox(NULL,TEXT("保存失败!输入职工号不合法!请检查输入信息"),TEXT("系统提示"),MB_OK); 271 delete newworker; 272 } 273 else 274 { 275 while(assistp!=NULL && assistp->num!=newworker->num) 276 { 277 assistp=assistp->next; 278 followp=followp->next; 279 } 280 if(assistp==NULL) 281 { 282 GetDlgItemText(hWnd,NAME_INPUT,newworker->name,sizeof(str_num)/sizeof(char)); 283 GetDlgItemText(hWnd,DEPART_INPUT,newworker->department,sizeof(str_num)/sizeof(char)); 284 GetDlgItemText(hWnd,JOBTITLE_INPUT,newworker->jobTitle,sizeof(str_num)/sizeof(char)); 285 GetDlgItemText(hWnd,YEAR_INPUT,str_year,sizeof(str_num)/sizeof(char)); 286 GetDlgItemText(hWnd,MONTH_INPUT,str_month,sizeof(str_num)/sizeof(char)); 287 GetDlgItemText(hWnd,DATE_INPUT,str_date,sizeof(str_num)/sizeof(char)); 288 GetDlgItemText(hWnd,WAGE_INPUT,str_wage,sizeof(str_num)/sizeof(char)); 289 newworker->wage=atoi(str_wage); 290 newworker->year=atoi(str_year); 291 newworker->month=atoi(str_month); 292 newworker->date=atoi(str_date); 293 newworker->next = NULL; 294 if(newworker->year<1972 || newworker->year>2017 || newworker->month<1 || newworker->month >12 || newworker->date <1 ||newworker->date>31) 295 { 296 MessageBox(NULL,TEXT("保存失败!您输入的日期不合法,请检查职工信息,并重试!"),("系统提示"),MB_OK); 297 delete newworker; 298 } 299 else if(newworker->wage<0 | newworker->wage > 1000000) 300 { 301 MessageBox(NULL,TEXT("保存失败!您输入的工资不合法,请检查职工信息,并重试!"),TEXT("系统提示"),MB_OK); 302 delete newworker; 303 } 304 else 305 { 306 /* 理清楚概念不要挂错了地方。 */ 307 followp->next=newworker;//将指向首节点的指针,向右移动 308 followp=followp->next; 309 MessageBox(NULL,TEXT("保存成功!"),TEXT("系统提示"),MB_OK); 310 } 311 } 312 else 313 { 314 strcat(str_temp,"保存失败!职工号为"); 315 ltoa(newworker->num,str_num,10); 316 strcat(str_temp,str_num); 317 strcat(str_temp,"的职工已存在,请勿重复保存!"); 318 MessageBox(NULL,str_temp,"系统提示",MB_OK); 319 delete newworker; 320 } 321 } 322 } 323 void showAllInfo() 324 { 325 int flag = 0; 326 worker *searchp; 327 searchp=headp->next; 328 if(searchp==NULL) 329 { 330 MessageBox(NULL,TEXT("请先输入职工信息!"),TEXT("系统提示"),MB_OK); 331 } 332 strcat(str_showAll,title); 333 while(searchp!=NULL) 334 { 335 flag = 1; 336 showFormat(searchp); 337 searchp=searchp->next; 338 } 339 if(flag==1) 340 { 341 SetDlgItemText(hWnd,10,str_showAll); 342 } 343 } 344 /* 函数名:showFormat(struct worker *p) 345 * 用来统一文本输出格式 346 为什么当初用那种显示方式 主要是因为简单,但是对于用户来说 可能影响了用户的使用体验。 347 */ 348 void showFormat(struct worker *p) 349 { 350 ltoa(p->num,str_num,10); 351 strcat(str_showAll,str_num); 352 /* 该判断 用来对齐 字符串 */ 353 if(strlen(str_num)<6) 354 { 355 //MessageBox(NULL,TEXT("测试判断"),TEXT("提示"),MB_OK); 356 strcat(str_showAll,"\t"); 357 } 358 strcat(str_showAll,"\t"); 359 strcat(str_showAll,p->name); 360 strcat(str_showAll,"\t\t"); 361 strcat(str_showAll,p->department); 362 if(strlen(p->department)<8) 363 { 364 strcat(str_showAll,"\t\t\t"); 365 } 366 else 367 { 368 strcat(str_showAll,"\t\t"); 369 } 370 //strcat(str_showAll,"\t"); 371 strcat(str_showAll,p->jobTitle); 372 strcat(str_showAll,"\t\t"); 373 ltoa(p->year,str_year,10); 374 strcat(str_showAll,str_year); 375 strcat(str_showAll,"年"); 376 ltoa(p->month,str_month,10); 377 strcat(str_showAll,str_month); 378 strcat(str_showAll,"月"); 379 ltoa(p->date,str_date,10); 380 strcat(str_showAll,str_date); 381 strcat(str_showAll,"日"); 382 strcat(str_showAll,"\t"); 383 ltoa(p->wage,str_wage,10); 384 strcat(str_showAll,str_wage); 385 strcat(str_showAll,"\r\n"); 386 strcat(str_showAll,"\r\n"); 387 } 388 void deleteWorker() 389 { 390 char str_temp[50]; 391 ZeroMemory(str_temp,sizeof(str_temp)); 392 long s; 393 worker *deletep,*shadowp; 394 shadowp=headp; 395 deletep=headp->next; 396 GetDlgItemText(hWnd,NUM_INPUT,str_num,sizeof(str_num)/sizeof(char)); 397 s=atol(str_num); 398 if(s==0 || s<0) 399 { 400 MessageBox(NULL,TEXT("请输入正确的职工号再删除!"),TEXT("系统提示"),MB_OK); 401 } 402 else 403 { 404 while(deletep!=NULL && deletep->num!=s) 405 { 406 deletep=deletep->next; 407 shadowp=shadowp->next; 408 } 409 if(deletep!=NULL) 410 { 411 if(deletep->next==NULL) 412 { 413 shadowp->next =NULL; 414 delete deletep;; 415 MessageBox(NULL,TEXT("删除成功"),TEXT("系统提示"),MB_OK); 416 } 417 else 418 { 419 shadowp->next=deletep->next; 420 delete deletep; 421 MessageBox(NULL,TEXT("删除成功"),TEXT("系统提示"),MB_OK); 422 } 423 } 424 else 425 { 426 strcat(str_temp,"职工号为:"); 427 strcat(str_temp,str_num); 428 strcat(str_temp,"的职工不存在,无法删除!"); 429 MessageBox(NULL,str_temp,TEXT("系统提示"),MB_OK); 430 } 431 } 432 } 433 void searchWorker() 434 { 435 long s; 436 char str_temp[50]; 437 ZeroMemory(str_temp,sizeof(str_temp)); 438 struct worker *assistp; 439 assistp=headp->next; 440 GetDlgItemText(hWnd,NUM_INPUT,str_num,sizeof(str_num)/sizeof(char)); 441 s=atol(str_num); 442 if(s==0 || s<0) 443 { 444 MessageBox(NULL,TEXT("请输入正确的职工号!"),TEXT("系统提示"),MB_OK); 445 } 446 else 447 { 448 /* long s = atol(str1); 直接用!=进行比较 没毛病 */ 449 450 while(assistp!=NULL && assistp->num!=s) 451 { 452 assistp=assistp->next; 453 } 454 if(assistp!=NULL) 455 { 456 strcat(str_showAll,title); 457 showFormat(assistp); 458 SetDlgItemText(hWnd,10,str_showAll); 459 } 460 else 461 { 462 strcat(str_temp,"职工号为:"); 463 strcat(str_temp,str_num); 464 strcat(str_temp,"的职工不存在!"); 465 MessageBox(NULL,str_temp,TEXT("系统提示"),MB_OK); 466 } 467 } 468 469 } 470 void modifyWorker() 471 { 472 struct worker *assistp; 473 assistp=headp->next; 474 char str_temp[50]; 475 long s; 476 GetDlgItemText(hWnd,NUM_INPUT,str_num,sizeof(str_num)/sizeof(char)); 477 s=atol(str_num); 478 if(s==0 || s<0) 479 { 480 MessageBox(NULL,TEXT("请输入正确的职工号!"),TEXT("系统提示"),MB_OK); 481 } 482 else 483 { 484 while(assistp!=NULL && assistp->num!=s) 485 { 486 assistp=assistp->next; 487 } 488 if(assistp!=NULL) 489 { 490 GetDlgItemText(hWnd,NAME_INPUT,assistp->name,sizeof(str_num)/sizeof(char)); 491 GetDlgItemText(hWnd,DEPART_INPUT,assistp->department,sizeof(str_num)/sizeof(char)); 492 GetDlgItemText(hWnd,JOBTITLE_INPUT,assistp->jobTitle,sizeof(str_num)/sizeof(char)); 493 //GetDlgItemText(hWnd,5,newworker->date,sizeof(str1)/sizeof(char)); 494 GetDlgItemText(hWnd,YEAR_INPUT,str_year,sizeof(str_num)/sizeof(char)); 495 GetDlgItemText(hWnd,WAGE_INPUT,str_wage,sizeof(str_num)/sizeof(char)); 496 GetDlgItemText(hWnd,MONTH_INPUT,str_month,sizeof(str_num)/sizeof(char)); 497 GetDlgItemText(hWnd,DATE_INPUT,str_date,sizeof(str_num)/sizeof(char)); 498 assistp->wage = atoi(str_wage); 499 assistp->year = atoi(str_month); 500 assistp->month = atoi(str_month); 501 assistp->date = atoi(str_date); 502 MessageBox(NULL,TEXT("修改成功!"),TEXT("系统提示"),MB_OK); 503 } 504 else 505 { 506 strcat(str_temp,"职工号为:"); 507 strcat(str_temp,str_num); 508 strcat(str_temp,"的职工不存在,无法修改其信息!"); 509 MessageBox(NULL,str_temp,TEXT("系统提示"),MB_OK); 510 } 511 } 512 assistp=headp->next; 513 } 514 515 void searchDepartmentWorker() 516 { 517 int flag= 0; 518 worker *searchp; 519 searchp=headp->next; 520 GetDlgItemText(hWnd,DEPART_INPUT,str_depart,sizeof(str_num)/sizeof(char)); 521 if(str_depart=="\0") 522 { 523 MessageBox(NULL,TEXT("请输入正确的部门!"),TEXT("系统提示"),MB_OK); 524 } 525 else 526 { 527 strcat(str_showAll,title); 528 while(searchp!=NULL) 529 { 530 if(strcmp((searchp->department),str_depart)==0) 531 { 532 flag =1; 533 showFormat(searchp); 534 /* 如果 和比对的 字符串 相等的话 , 向前移动一个在进行比较 */ 535 searchp=searchp->next; 536 537 } 538 else 539 { 540 /* 如果 和比对的 字符串 不相等的话 , 向前移动一个在进行比较 */ 541 /* 注意这个不能漏,必定出错。 */ 542 searchp=searchp->next; 543 } 544 } 545 SetDlgItemText(hWnd,10,str_showAll); 546 //searchp=headp->next; 547 if(flag == 0) 548 { 549 MessageBox(NULL,TEXT("没有找到该部门的职工!"),TEXT("系统提示"),MB_OK); 550 } 551 } 552 } 553 554 /* 扩展功能 */ 555 void saveLocalFile() 556 { 557 int flag = 0; 558 FILE *fp; 559 fp=fopen("C:\\workerDatabase.txt","w"); 560 if(fp==NULL) 561 { 562 MessageBox(NULL,TEXT("无法保存在本地!"),TEXT("系统警告"),MB_OK); 563 exit(0); 564 } 565 worker *searchp; 566 searchp=headp->next; 567 if(searchp==NULL) 568 { 569 MessageBox(NULL,TEXT("职工信息为空!请先录入职工信息!"),TEXT("系统警告"),MB_OK); 570 exit(0); 571 } 572 while(searchp!=NULL) 573 { 574 fprintf(fp,"%ld %s %s %s %d %d %d %ld\n",searchp->num,searchp->name,searchp->department,searchp->jobTitle,searchp->year,searchp->month,searchp->date,searchp->wage); 575 searchp=searchp->next; 576 flag = 1; 577 } 578 fclose(fp); 579 if(flag == 1) 580 { 581 MessageBox(NULL,TEXT("写入本地成功!"),TEXT("系统提示"),MB_OK); 582 } 583 else 584 { 585 MessageBox(NULL,TEXT("写入本地失败!"),TEXT("系统提示"),MB_OK); 586 } 587 } 588 void readLocalFile() 589 { 590 FILE *p; 591 int flag = 0; 592 struct worker *newworker;//用来保存读入的新职员 593 struct worker *followp;//用来移动指针 594 followp=headp; 595 worker *shadowp;//定义一个影子指针 用来指向 倒数第二个节点。因为从文本读入的时候最后一行是空行,要丢弃。 596 if((p=fopen("C:\\workerDatabase.txt","r"))==NULL) 597 { 598 MessageBox(NULL,TEXT("打开本地数据文件失败!"),TEXT("系统警告"),MB_OK); 599 exit(0); 600 } 601 while(!feof(p)) 602 { 603 newworker = (struct worker*)malloc(sizeof(struct worker )); 604 fscanf(p,"%ld %s %s %s %d %d %d %ld",&newworker->num,newworker->name,newworker->department,newworker->jobTitle,&newworker->year,&newworker->month,&newworker->date,&newworker->wage); 605 newworker->next = NULL; 606 followp->next = newworker; 607 shadowp = followp; 608 followp = newworker; 609 /* 在这里-842156451是用来标记一个未赋值的变量。利用这一点,来判断读取是否成功*/ 610 if(newworker->wage != -842150451) 611 { 612 flag = 1; 613 } 614 } 615 /* 删除最后一个节点*/ 616 delete newworker; 617 followp = shadowp; 618 shadowp->next = NULL; 619 if(flag == 1) 620 { 621 622 MessageBox(NULL,TEXT("从本地读取到程序成功!"),TEXT("系统提示"),MB_OK); 623 } 624 else 625 { 626 MessageBox(NULL,TEXT("从本地读取到程序失败"),TEXT("系统提示"),MB_OK); 627 } 628 629 fclose(p); 630 } 631 void statisticsInfo() 632 { 633 char temp1[30],temp2[30]; 634 int NumOfPeoCount=0; 635 double sumWage = 0; 636 double averageWage=0; 637 worker *searchp; 638 searchp=headp->next; 639 if(headp->next==NULL) 640 { 641 MessageBox(NULL,TEXT("请先输入职工信息!"),TEXT("系统提示"),MB_OK); 642 } 643 else 644 { 645 while(searchp!=NULL) 646 { 647 NumOfPeoCount++; 648 sumWage += searchp->wage; 649 searchp=searchp->next; 650 } 651 averageWage = sumWage/(double)NumOfPeoCount; 652 ltoa(NumOfPeoCount,temp1,10); 653 ltoa(averageWage,temp2,10); 654 strcat(str_showAll,"总计有:"); 655 strcat(str_showAll,temp1); 656 strcat(str_showAll,"人\t"); 657 strcat(str_showAll,"平均工资为:"); 658 strcat(str_showAll,temp2); 659 strcat(str_showAll,"\t\n"); 660 SetDlgItemText(hWnd,10,str_showAll); 661 } 662 }
resource.h头文件如下:
1 /* INPUT NUMBER */ 2 #define NUM_INPUT 1 3 #define NAME_INPUT 2 4 #define DEPART_INPUT 3 5 #define JOBTITLE_INPUT 4 6 #define YEAR_INPUT 5 7 #define WAGE_INPUT 6 8 #define MONTH_INPUT 7 9 #define DATE_INPUT 8 10 #define BIGTEXTBOX 10 11 /* BUTTON NUMBER */ 12 #define ADD_BUTTON 13 13 #define SEARCHNUM_BUTTON 14 14 #define MODIFY_BUTTON 15 15 #define DELETE_BUTTON 16 16 #define SHOWINFO_BUTTON 17 17 #define SEARCHDEPART_BUTTON 18 18 #define CLEARTEXT_BUTTON 19 19 #define COPYRIGHT_BUTTON 20 20 #define EXIT_BUTTON 21 21 #define SAVELOCALFILE_BUTTON 100 22 #define READLOCALFILE_BUTTON 101 23 #define STATISTICS_BUTTON 111