C++實現(xiàn)教工考勤信息管理系統(tǒng)
本文實例為大家分享了C++實現(xiàn)教工考勤信息管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
需求分析
傳統(tǒng)意義上的考勤管理都是采用原始的手工操作來完成的。人事部的管理人員或辦公室人員要進行繁瑣的記錄、修改、查詢、統(tǒng)計等工作,不僅時間長、勞動強度大、工作效率低下,并且容易出錯。
1.1 問題提出
本人計劃編寫一個教工考勤信息管理系統(tǒng),主要用來管理教工考勤信息??梢詫π畔⑦M行排序,查詢,輸出,修改,添加,刪除等操作。
1.2 本系統(tǒng)涉及的知識點
循環(huán)、分支、數(shù)組、函數(shù)、結(jié)構(gòu)體、指針、文件
1.3 功能要求
(1) 排序:按教師號對所有教工的出勤信息進行排序。
(2) 查詢:按特定條件查找教工的出勤信息。
(3) 更新:按編號對某個教工的某項出勤信息進行修改。
(4) 插入:加入新教工的出勤信息。
(5) 刪除:按編號刪除已離職的教工的出勤信息。
(6) 瀏覽:輸出所有教工的出勤信息。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LIST_MAX_SIZE ?100//順序表最大長度 typedef struct //定義的用于表示學(xué)生信息 { ?? ?char num[8];//教師號 ?? ?char name[20];//姓名 ?? ?char sex[10];//性別 ?? ?char study[20];//學(xué)歷 ?? ?char date[20];//日期 ?? ?char phone[20];//電話 ?? ?char location[20];//職稱 ?? ?char chuqin[20];//出勤情況 ?? ?char remarks [30];//備注 }Teacher; typedef struct { ?? ? Teacher data[LIST_MAX_SIZE];//數(shù)據(jù)域 ?? ?int length;//表長 }SqList; //功能設(shè)計 void add(SqList *L1);//添加教工考勤信息 void ran(SqList *L1);//出勤信息排序 void select_num(SqList *L1);//按教工查詢 void select_name(SqList *L1);//按教工名查詢 void select_all(SqList *L1);//查詢所有教工 void delete_teacher(SqList *L1);//刪除教工考勤信息 void change(SqList *L1);//改變教工考勤信息 void read(SqList *L1);//文件讀教工考勤信息 void write(SqList *L1);//文件寫教工考勤信息 void menu();//菜單 void menu()//菜單 { ?? ?system("cls");//清屏 ?? ?printf("1、教師信息錄入\n"); ?? ?printf("2、教師信息瀏覽\n"); ?? ?printf("3、按教師號查詢\n"); ?? ?printf("4、按照姓名查詢\n"); ?? ?printf("5、修改教師信息\n"); ?? ?printf("6、刪除教師信息\n"); ?? ?printf("7、按教師號排序\n"); ?? ?printf("0、退出\n"); } int main() { ?? ?char x; ?? ?SqList *L1; ?? ?L1 = (SqList*)malloc(sizeof(SqList)); ?? ?L1->length = 0; ?? ?read(L1);//文件讀 ?? ?while (1) ?? ?{ ?? ??? ?menu();//界面登陸 ?? ??? ?printf("請輸入你的選擇:"); ?? ??? ?scanf("%c", &x); ?? ??? ?switch (x) ?? ??? ?{ ?? ??? ?case '1': ?? ??? ??? ?add(L1);//教師信息錄入 ?? ??? ??? ?write(L1);//文件寫入畢業(yè)生信息 ?? ??? ??? ?break; ?? ??? ?case '2': ?? ??? ??? ?select_all(L1);//畢業(yè)生信息瀏覽 ?? ??? ??? ?break; ?? ??? ?case '3': ?? ??? ??? ?select_num(L1);//按照學(xué)號查詢 ?? ??? ??? ?break; ?? ??? ?case '4': ?? ??? ??? ?select_name(L1);//按照姓名查詢 ?? ??? ??? ?break; ?? ??? ?case '5': ?? ??? ??? ?change(L1);//修改畢業(yè)生信息 ?? ??? ??? ?write(L1);//文件寫入畢業(yè)生信息 ?? ??? ??? ?break; ?? ??? ?case '6': ?? ??? ??? ?delete_teacher(L1);//刪除畢業(yè)生信息 ?? ??? ??? ?write(L1);//文件寫入畢業(yè)生信息 ?? ??? ??? ?break; ?? ??? ?case '7': ?? ??? ??? ?ran(L1);//按照學(xué)號進行排序 ?? ??? ??? ?break; ?? ??? ?case '0': ?? ??? ??? ?return 0; ?? ??? ?default: ?? ??? ??? ?printf("輸入有誤,請重新選擇!\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?getchar(); ?? ??? ?system("pause"); ?? ?} ?? ?return 0; } void delete_teacher(SqList *L1)//刪除教師 { ?? ?int i,j; ?? ?char no[20]; ?? ?printf("輸入教師號:"); ?? ?scanf("%s",no); ?? ?for(i=0;i<L1->length;i++)//遍歷輸出 ?? ?{ ?? ??? ?if(!strcmp(no,L1->data[i].num))//如果學(xué)號一樣 ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?if(i==L1->length)//查詢到表尾都沒有跳出循環(huán) ?? ?{ ?? ??? ?printf("刪除失敗!\n"); ?? ??? ?return; ?? ?} ?? ?for(j=i;j<L1->length-1;j++) ?? ?{ ?? ??? ?L1->data[j]=L1->data[j+1];//用后一個覆蓋前面一個 達到刪除的效果 ?? ?} ?? ?L1->length--;//人數(shù)-1 ?? ?printf("刪除成功!\n"); } void change(SqList *L1)//改變畢業(yè)生信息 { ?? ?int i; ?? ?char no[20]; ?? ?printf("輸入教師號:"); ?? ?scanf("%s",no); ?? ?for(i=0;i<L1->length;i++)//遍歷輸出 ?? ?{ ?? ??? ?if(!strcmp(no,L1->data[i].num))//如果學(xué)號一樣 ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?if(i==L1->length)//查詢到表尾都沒有跳出循環(huán) ?? ?{ ?? ??? ?printf("修改失敗!\n"); ?? ??? ?return; ?? ?} ?? ?printf("請輸入姓名:"); ?? ?scanf("%s",L1->data[i].name); ?? ?printf("請輸入性別:"); ?? ?scanf("%s",L1->data[i].sex); ?? ?printf("請輸入學(xué)歷:"); ?? ?scanf("%s",L1->data[i].study); ?? ?printf("請輸入電話:"); ?? ?scanf("%s",L1->data[i].phone); ?? ?printf("請輸入職稱:"); ?? ?scanf("%s",L1->data[i].location); ?? ?printf("請輸入考勤日期(xxxx-xx-xx):"); ?? ?scanf("%s",L1->data[i].date); ?? ?printf("請輸入出勤情況:"); ?? ?scanf("%s",L1->data[i].chuqin); ?? ?printf("請輸入備注:"); ?? ?scanf("%s",L1->data[i].remarks); ?? ?printf("修改成功!\n"); } void ran(SqList *L1)//按教師號排序 { ?? ?int i,j; ?? ?Teacher temp; ?? ?for(i=0;i<L1->length;i++) ?? ?{ ?? ??? ?for(j=i+1;j<L1->length;j++)//選擇排序 每次循環(huán)排好一個data[i] ?? ??? ?{ ?? ??? ??? ?if(strcmp(L1->data[i].num,L1->data[j].num)>0)//如果需要交換? ?? ??? ??? ?{ ?? ??? ??? ??? ?temp=L1->data[i]; ?? ??? ??? ??? ?L1->data[i]=L1->data[j]; ?? ??? ??? ??? ?L1->data[j]=temp; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?printf("輸出根據(jù)教師號排序后的結(jié)果:\n"); ?? ?select_all(L1);//排序完顯示 } void select_num(SqList *L1)//按號查詢 { ?? ?int i,flag=0; ?? ?char no[20]; ?? ?printf("輸入教師號:"); ?? ?scanf("%s",no); ?? ?for(i=0;i<L1->length;i++)//遍歷查找 ?? ?{ ?? ??? ?if(!strcmp(no,L1->data[i].num))//如果和輸入的教師號一樣 ?? ??? ?{ ?? ??? ??? ?flag=1; ?? ??? ??? ?printf("%-10s%-10s%-10s%-10s%-20s%-10s%-20s%-20s%-20s\n","教師號","姓名","性別","學(xué)歷","電話","職稱","考勤日期","出勤情況","備注"); ?? ??? ??? ?printf("%-10s%-10s%-10s",L1->data[i].num,L1->data[i].name,L1->data[i].sex); ?? ??? ??? ?printf("%-10s%-20s%-10s",L1->data[i].study,L1->data[i].phone,L1->data[i].location); ?? ??? ??? ?printf("%-20s%-20s%-20s\n",L1->data[i].date,L1->data[i].chuqin,L1->data[i].remarks);?? ? ?? ??? ?} ?? ?} ?? ?if(flag==0)//查詢到表尾都沒有跳出循環(huán) ?? ?{ ?? ??? ?printf("無該教師信息!\n"); ?? ?} } void select_name(SqList *L1)//按姓名查詢 { ?? ?int i,flag=0; ?? ?char name[20]; ?? ?printf("輸入教師姓名:"); ?? ?scanf("%s",name); ?? ?for(i=0;i<L1->length;i++)//遍歷查找 ?? ?{ ?? ??? ?if(!strcmp(name,L1->data[i].name))//如果姓名一樣? ?? ??? ?{ ?? ??? ??? ?printf("%-10s%-10s%-10s%-10s%-20s%-10s%-20s%-20s%-20s\n","教師號","姓名","性別","學(xué)歷","電話","職稱","考勤日期","出勤情況","備注"); ?? ??? ??? ?printf("%-10s%-10s%-10s",L1->data[i].num,L1->data[i].name,L1->data[i].sex); ?? ??? ??? ?printf("%-10s%-20s%-10s",L1->data[i].study,L1->data[i].phone,L1->data[i].location); ?? ??? ??? ?printf("%-20s%-20s%-20s\n",L1->data[i].date,L1->data[i].chuqin,L1->data[i].remarks);?? ? ?? ??? ??? ?flag=1;//設(shè)置標(biāo)志 表示查詢到了 ?這里不跳出 是因為 姓名可能會重復(fù) 需要把重復(fù)的人也顯示 ?? ??? ?} ?? ?} ?? ?if(flag==0)//查詢到表尾都沒有跳出循環(huán) ?? ?{ ?? ??? ?printf("無該姓名信息!\n"); ?? ?} } void add(SqList *L1) { ?? ?if(L1->length>=LIST_MAX_SIZE)//如果達到了最大長度 ?? ?{ ?? ??? ?printf("順序表滿,無法添加!\n"); ?? ??? ?return ; ?? ?} ?? ?printf("請輸入教師號:"); ?? ?scanf("%s",L1->data[L1->length].num);//信息存入表尾 L1->length 是順序表當(dāng)前長度 第L1->length個元素并未被使用 所以直接存在里面 ?? ?printf("請輸入姓名:"); ?? ?scanf("%s",L1->data[L1->length].name); ?? ?printf("請輸入性別:"); ?? ?scanf("%s",L1->data[L1->length].sex); ?? ?printf("請輸入學(xué)歷:"); ?? ?scanf("%s",L1->data[L1->length].study); ?? ?printf("請輸入電話:"); ?? ?scanf("%s",L1->data[L1->length].phone); ?? ?printf("請輸入職稱:"); ?? ?scanf("%s",L1->data[L1->length].location); ?? ?printf("請輸入考勤日期(xxxx-xx-xx):"); ?? ?scanf("%s",L1->data[L1->length].date); ?? ?printf("請輸入出勤情況:"); ?? ?scanf("%s",L1->data[L1->length].chuqin); ?? ?printf("請輸入備注:"); ?? ?scanf("%s",L1->data[L1->length].remarks); ?? ?L1->length++;//表長+1 使得剛剛存的數(shù)據(jù)有效 } void select_all(SqList *L1)//顯示所有的教師信息 { ?? ?int i; ?? ?if(L1->length==0)//順序表長度為0 ?? ?{ ?? ??? ?printf("無教師信息!\n"); ?? ??? ?return; ?? ?} ?? ?printf("%-10s%-10s%-10s%-10s%-20s%-10s%-20s%-20s%-20s\n","教師號","姓名","性別","學(xué)歷","電話","職稱","考勤日期","出勤情況","備注"); ?? ?for(i=0;i<L1->length;i++)//遍歷輸出 ?? ?{ ?? ??? ?printf("%-10s%-10s%-10s",L1->data[i].num,L1->data[i].name,L1->data[i].sex); ?? ??? ?printf("%-10s%-20s%-10s",L1->data[i].study,L1->data[i].phone,L1->data[i].location); ?? ??? ?printf("%-20s%-20s%-20s\n",L1->data[i].date,L1->data[i].chuqin,L1->data[i].remarks); ?? ?} } void read(SqList *L1)//文件讀 { ?? ?FILE *fp; ?? ?int a = 0;//a,用來識別到底有沒有刪除數(shù)據(jù).t,用來接收fsacnf函數(shù)的返回值(為-1是說明無數(shù)據(jù)) ?? ?if ((fp = fopen("teacher.txt", "r+")) == NULL)//‘r'允許讀 ?? ?{ ?? ??? ?printf("文件打開失敗!\n"); ?? ??? ?return; ?? ?} ?? ?else ?? ?{ ?? ??? ?while (!feof(fp)) ?? ??? ?{ ?? ??? ??? ?a = 1; ?? ??? ??? ?fread(&L1->data[L1->length++],sizeof(Teacher),1,fp); ?? ??? ?} ?? ??? ?fclose(fp);?? ??? ?//關(guān)閉文件 ?? ??? ?if (a == 0) ?? ??? ?{ ?? ??? ??? ?printf("文本無數(shù)據(jù),教工考勤信息讀取失敗\n"); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?L1->length--; ?? ??? ?} ?? ?} } void write(SqList *L1)//文件寫 { ?? ?FILE *fp; ?? ?int t = 0; ?? ?int i; ?? ?if ((fp = fopen("teacher.txt", "w+")) == NULL) ?? ?{ ?? ??? ?printf("文件打開失敗!\n"); ?? ??? ?return; ?? ?} ?? ?else ?? ?{ ?? ??? ?for (i = 0; i < L1->length; i++) ?? ??? ?{ ?? ??? ??? ?t=1; ?? ??? ??? ?fwrite(&L1->data[i],sizeof(Teacher),1,fp); ?? ??? ?} ?? ??? ?fclose(fp);?? ?//關(guān)閉文件 ?? ??? ?if(L1->length==0) ?? ??? ?{ ?? ??? ??? ?t=1; ?? ??? ?} ?? ??? ?if (t == 1) ?? ??? ?{ ?? ??? ??? ?printf("教師信息寫入完成\n"); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?printf("教工考勤信息寫入失敗\n"); ?? ??? ?} ?? ?} }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用c語言根據(jù)可變參數(shù)合成字符串的實現(xiàn)代碼
本篇文章是對用c語言根據(jù)可變參數(shù)合成字符串的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進行縮放圖片大小(最新推薦)
這篇文章主要介紹了使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進行縮放圖片大小,本文給大家講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04select函數(shù)實現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析
這篇文章主要為大家介紹了select函數(shù)實現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09使用C語言實現(xiàn)vector動態(tài)數(shù)組的實例分享
vector是指能夠存放任意類型的動態(tài)數(shù)組,而C語言中并沒有面向?qū)ο蟮腃++那樣內(nèi)置vector類,所以我們接下來就來看一下使用C語言實現(xiàn)vector動態(tài)數(shù)組的實例,需要的朋友可以參考下2016-05-05MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系
這篇文章主要介紹了VC++中MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系,需要的朋友可以參考下2015-01-01