首頁 > 軟體

C++實現教工考勤資訊管理系統

2022-05-16 19:00:07

本文範例為大家分享了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%-20sn","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
            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%-20sn",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%-20sn","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
            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%-20sn",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%-20sn","教師號","姓名","性別","學歷","電話","職稱","考勤日期","出勤情況","備註");
    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%-20sn",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");
        }
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com