C++實現教工考勤信息管理系統

本文實例為大傢分享瞭C++實現教工考勤信息管理系統的具體代碼,供大傢參考,具體內容如下

需求分析

傳統意義上的考勤管理都是采用原始的手工操作來完成的。人事部的管理人員或辦公室人員要進行繁瑣的記錄、修改、查詢、統計等工作,不僅時間長、勞動強度大、工作效率低下,並且容易出錯。

1.1 問題提出

本人計劃編寫一個教工考勤信息管理系統,主要用來管理教工考勤信息。可以對信息進行排序,查詢,輸出,修改,添加,刪除等操作。

1.2 本系統涉及的知識點

循環、分支、數組、函數、結構體、指針、文件

1.3 功能要求

(1) 排序:按教師號對所有教工的出勤信息進行排序。
(2) 查詢:按特定條件查找教工的出勤信息。
(3) 更新:按編號對某個教工的某項出勤信息進行修改。
(4) 插入:加入新教工的出勤信息。
(5) 刪除:按編號刪除已離職的教工的出勤信息。
(6) 瀏覽:輸出所有教工的出勤信息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LIST_MAX_SIZE  100//順序表最大長度

typedef struct //定義的用於表示學生信息
{
    char num[8];//教師號
    char name[20];//姓名
    char sex[10];//性別
    char study[20];//學歷
    char date[20];//日期
    char phone[20];//電話
    char location[20];//職稱
    char chuqin[20];//出勤情況
    char remarks [30];//備註
}Teacher;

typedef struct
{
     Teacher data[LIST_MAX_SIZE];//數據域
    int length;//表長
}SqList;

//功能設計
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);//文件寫入畢業生信息
            break;
        case '2':
            select_all(L1);//畢業生信息瀏覽
            break;
        case '3':
            select_num(L1);//按照學號查詢
            break;
        case '4':
            select_name(L1);//按照姓名查詢
            break;
        case '5':
            change(L1);//修改畢業生信息
            write(L1);//文件寫入畢業生信息
            break;
        case '6':
            delete_teacher(L1);//刪除畢業生信息
            write(L1);//文件寫入畢業生信息
            break;
        case '7':
            ran(L1);//按照學號進行排序
            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))//如果學號一樣
        {
            break;
        }
    }
    if(i==L1->length)//查詢到表尾都沒有跳出循環
    {
        printf("刪除失敗!\n");
        return;
    }
    for(j=i;j<L1->length-1;j++)
    {
        L1->data[j]=L1->data[j+1];//用後一個覆蓋前面一個 達到刪除的效果
    }
    L1->length--;//人數-1
    printf("刪除成功!\n");
}

void change(SqList *L1)//改變畢業生信息
{
    int i;
    char no[20];
    printf("輸入教師號:");
    scanf("%s",no);
    for(i=0;i<L1->length;i++)//遍歷輸出
    {
        if(!strcmp(no,L1->data[i].num))//如果學號一樣
        {
            break;
        }
    }
    if(i==L1->length)//查詢到表尾都沒有跳出循環
    {
        printf("修改失敗!\n");
        return;
    }
    printf("請輸入姓名:");
    scanf("%s",L1->data[i].name);
    printf("請輸入性別:");
    scanf("%s",L1->data[i].sex);
    printf("請輸入學歷:");
    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++)//選擇排序 每次循環排好一個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("輸出根據教師號排序後的結果:\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","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
            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)//查詢到表尾都沒有跳出循環
    {
        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","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
            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;//設置標志 表示查詢到瞭  這裡不跳出 是因為 姓名可能會重復 需要把重復的人也顯示
        }
    }
    if(flag==0)//查詢到表尾都沒有跳出循環
    {
        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 是順序表當前長度 第L1->length個元素並未被使用 所以直接存在裡面
    printf("請輸入姓名:");
    scanf("%s",L1->data[L1->length].name);
    printf("請輸入性別:");
    scanf("%s",L1->data[L1->length].sex);
    printf("請輸入學歷:");
    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 使得剛剛存的數據有效
}

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","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
    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,用來識別到底有沒有刪除數據.t,用來接收fsacnf函數的返回值(為-1是說明無數據)
    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);        //關閉文件
        if (a == 0)
        {
            printf("文本無數據,教工考勤信息讀取失敗\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);    //關閉文件
        if(L1->length==0)
        {
            t=1;
        }
        if (t == 1)
        {
            printf("教師信息寫入完成\n");
        }
        else
        {
            printf("教工考勤信息寫入失敗\n");
        }
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: