自分が早期に書いた簡単な通勤カード統計工数の勤務システム【整理版】



もともとこの招待状、返事から構成したので、全体のコードはそれぞれの返事の中で分布して、読者は読みにくくて、今全体はそれらを本文に置いて、便利に見ることができます.
これは初期に書いたもので、簡単な勤務システムだけで、大まかな機能はありますが、あまり書かれていません.テキストを採用して勤務データを記録し、おかずの一覧を提供しています.
 
 
//   :emp_head.h

#ifndef EMP_HEAD_H
#define EMP_HEAD_H

#include
#include

#define MAXNUM 1000

enum {
     NORMAL           = 0,
     ABSENT           = 1,
     WORK_LATE        = 2,
     LEAVE_EARLY      = 3,
     LATE_AND_LEARLY  = 4,
     PUNCH_ABNORMAL   = 5
};

enum {
     ERR_TIME_INVALID  = 1,
     ERR_ID_INVALID    = 2,
     ERR_CMD_INVALID   = 3,
     ERR_EXIT_SYS      = 9
};

struct emp_data
{
    int id;
    char name[8];
    int type;
    char check_in[16];//19:58 20110804
    char check_out[16];
    int work_time; //1208 --> 12H12M
} emp_data1;


int cmd_process(char* cmdx);

void p_err(int err);
int check_time(char *time);
int check_type(char *check_in, char *check_out);
void th_func(void);
void print_help(void);
int clean_data(char *fileaddr);
int request_data(char *fileaddr, char* cmdx);
int check_inout(char *fileaddr, char* cmdx);
int type_check(char* check_in, char *check_out, int* outlen);
char* ret_typestr(int typecode);

//char* analy_cmd(char* cmdx, int* n);

#endif  //end EMP_HEAD_H

 
 
以下の内容はすべて1つのcファイル(メインcファイル)ですが、実はこのcファイルしかありません.上のヘッダファイルを加えると、全体をコンパイルして私たちの勤務システムを生成することができます.ただCSDNの文法がハイライトされていないので、コードが長すぎると、ページ全体のロードが遅いので、いくつかの小段に分けられます.
 
また、入力チェックについては、これまで関数を1つも書いていなかったので、このプログラムは何文字しか固定できず、オフセットを行い、少なくなってはいけません.多くなってもだめです.すべてポインタオフセットで操作されています.後に関数(符号区切りのコマンドラインから任意のパラメータを取得した関数(カンマ区切り、スペース区切りなどは可能)(2011-12-29 01:04)を参照)と書きましたが、怠け者なのでこの勤務システムは書き換えられませんでした.読者に変更してもらいましょう.
 
/*
* c  
*author:duanxufang
*time:
*description:    
*
*/
#include 
#include 
#include 
#include 
#include "../include/emp_head.h"


#define FILE_IN "emp_record.datafile"

struct emp_data record[MAXNUM] = {0};

int main()
{
    pthread_t th_id;
    printf("will create thread!
"); if(pthread_create(&th_id, NULL, (void*)th_func, NULL)) { printf("create thread error!
"); exit(1); } if(pthread_join(th_id, NULL)) { printf("thread quit error!"); exit(1); } return 0; }

 
 
void p_err(int err)
{
    switch(err)
    {
    case ERR_TIME_INVALID : printf("[ERR:TIME INVALID]
"); break; case ERR_ID_INVALID : printf("[ERR:ID INVALID]
"); break; case ERR_CMD_INVALID : printf("[ERR:COMMAND INVALID]
"); break; case 0 : break; default: printf("ERR:Not Known!
"); } return ; } void th_func(void) { char input_cmd[256] = {0}; print_help(); while(printf("cmd here>"),gets(input_cmd)) { int err_no = 0; if((err_no = cmd_process(input_cmd)) == ERR_EXIT_SYS) { printf("EXIT SYSTEM
"); break; } p_err(err_no); printf("
please input next cmd:
"); } return ; } void print_help(void) { printf("--------cmd help:-----------
\"0\":clean all the records \"1\":checktime input
"); printf("\"2\":request records q/Q for quit system
"); printf("h/H for help
"); printf("cmd format is: 1,0001,duan001,18:56
\ [id] like 0001 must be 4 chars
\ [name] like duan001 must be 7 chars
"); printf("--------cmd help end--------
"); return ; } int cmd_process(char* cmdx) { printf("Your cmd: %s
", cmdx); int cmd_id = (int)(cmdx[0]-'0'); switch(cmd_id) { case 0: clean_data(FILE_IN); break; case 1: check_inout(FILE_IN, cmdx); break; case 2: request_data(FILE_IN, cmdx); break; case 'h'-'0': case 'H'-'0': print_help(); break; case 'q'-'0': case 'Q'-'0': return ERR_EXIT_SYS; //quik system; default: return ERR_CMD_INVALID; } return 0; } int clean_data(char *fileaddr) { int count = 0; char buf[60000]; int read_n = 0; int i = 0; struct emp_data *pemp = (struct emp_data *)buf; FILE *fptr; printf("clean_data()
");//for debug if(!(fptr = fopen(FILE_IN, "w")) ) { printf("in clean _data open file[%s] failed!
", FILE_IN); return 1; } if(!(read_n = fread(buf, 1, 60000, fptr))) { printf("no record!"); return 1; } count =read_n/(sizeof(struct emp_data)); for(i =0; i < count; i++) { pemp[i].type = PUNCH_ABNORMAL; strcpy(pemp[i].check_in, ""); strcpy(pemp[i].check_out, ""); pemp[i].work_time = 0; } fwrite(buf, 1, read_n, fptr); read_n = fread(buf, 1, 60000, fptr); for(i =0; i < count; i++) { printf("%d ", pemp[i].id); printf("%s ", pemp[i].name); printf("%s ", ret_typestr(pemp[i].type)); printf("%s ", pemp[i].check_in); printf("%s ", pemp[i].check_out); printf("%d
", pemp[i].work_time); } fclose(fptr); return 0; }

 
//request_data
int request_data(char *fileaddr, char* cmdx)
{
    int count = 0;
    char buf[60000];
    int read_n = 0;
    int i = 0;
    struct emp_data *pemp = (struct emp_data *)buf;
    printf("in request_data()
"); FILE *fptr; if(!(fptr = fopen(FILE_IN, "r")) ) { printf("in request_data open file[%s] failed!
", FILE_IN); return 1; } if(!(read_n = fread(buf, 1, 60000, fptr))) { printf("no record!"); return 1; } count =read_n/(sizeof(struct emp_data)); if(strlen(cmdx)==1) { for(i =0; i < count; i++) { printf("%4d ", pemp[i].id); printf("%10s ", pemp[i].name); printf("%-16s ", ret_typestr(pemp[i].type)); printf("%6s ", pemp[i].check_in); printf("%6s ", pemp[i].check_out); printf("%6d
", pemp[i].work_time); } } else { for(i =0; i < count; i++) { if(pemp[i].id==atoi(cmdx+2)) { printf("%4d ", pemp[i].id); printf("%10s ", pemp[i].name); printf("%-16s ", ret_typestr(pemp[i].type)); printf("%6s ", pemp[i].check_in); printf("%6s ", pemp[i].check_out); printf("%6d
", pemp[i].work_time); } } } fclose(fptr); return 0; } //check_inout int check_inout(char *fileaddr, char* cmdx) { // int count = 0, read_n = 0; int worktime_len = 0; int i = 0; char buf[60000]={0}; int emp_id = atoi(cmdx+2); struct emp_data *pemp = (struct emp_data *)buf; printf("in check_inout()
"); if(strlen(cmdx)<=2) { p_err(ERR_CMD_INVALID); return 1; } if((atoi(cmdx+2)>1000)||(atoi(cmdx+2)<1)) { p_err(ERR_ID_INVALID); return 1; } // if((cmdx[17]!=':')||(atoi(cmdx+15)>23)||(atoi(cmdx+15)<0)|| (atoi(cmdx+18)>59)||(atoi(cmdx+18)<0)) { p_err(ERR_TIME_INVALID); return 1; } FILE *fptr; if(!(fptr = fopen(FILE_IN, "r+")) ) { printf("open file[%s] failed!
", FILE_IN); return 1; } read_n = fread(buf, 1, 60000, fptr); printf("read_n is: %d
", read_n); count =read_n/(sizeof(struct emp_data)); fclose(fptr); check_inout for(i = 0; i < count; i++) { if( (pemp->id)== emp_id) { // //strncpy 6 ! strncpy ! strncpy(pemp->check_out, cmdx+15, 6); //!!! 5, '\0', '\0' 6 //printf("-------typecheck----"); pemp->type = type_check(pemp->check_in, pemp->check_out, &worktime_len); pemp->work_time = worktime_len;//worktime(); if(!(fptr = fopen(FILE_IN, "w")) ) { printf("open file[%s] failed!
", FILE_IN); return 1; } read_n=fwrite(buf,1,count*(sizeof(struct emp_data)),fptr); fclose(fptr); printf("if [0 count]---write bytes :%d
", read_n); break; } pemp++; } // , if(i == count) { // struct emp_data emp_data2; pemp = &emp_data2; pemp->id = emp_id; bzero(pemp->name, 8); strncpy(pemp->name, cmdx+7, 7);// 7 , '\0' pemp->type = PUNCH_ABNORMAL; strncpy(pemp->check_in, cmdx+15, 6); strcpy(pemp->check_out, ""); pemp->work_time = 0; if(!(fptr = fopen(FILE_IN, "a")) ) { printf("open file[%s] failed!
", FILE_IN); return 1; } read_n=fwrite(pemp,1,sizeof(struct emp_data),fptr); fclose(fptr); printf("if i== count---write bytes :%d,count %d
", read_n, count); } return 0; } // , , outlen int type_check(char* check_in, char *check_out, int* outlen) { int in_hh, in_mm; int out_hh, out_mm; int hh = 0, mm = 0; int flaglate = 0, flagearly = 0; int flagt =0; printf("in type_check()
"); if((strlen(check_in)>1)&&(strlen(check_out)>1)) { in_hh = atoi(check_in); in_mm = atoi(check_in+3); out_hh = atoi(check_out); out_mm = atoi(check_out+3); if((in_hh>8)||((in_hh==8)&&(in_mm>0))) { flaglate = 1; flagt = WORK_LATE; } if((out_hh<17)||((out_hh==17)&&(out_mm<30))) { flagearly = 1; flagt = LEAVE_EARLY; } if((in_hh>17)||((in_hh==17)&&(in_mm>=30))|| (out_hh<8)||((out_hh==8)&&(out_mm==0))) { printf("----1----abs"); flagt = ABSENT; } if(flaglate&&flagearly) { flagt =LATE_AND_LEARLY; } } else if((strlen(check_in)<1)&&(strlen(check_out)<1)) { printf("----2----abs"); flagt = ABSENT; } else { flagt = PUNCH_ABNORMAL; } // , outlen== -1 , if(*outlen == -1) goto ret; if((flagt == ABSENT)||(flagt == PUNCH_ABNORMAL)) // flagt == ABSENT = , { *outlen = 0; } else { if(in_mm<=out_mm) { *outlen = (out_hh-in_hh)*100 + (out_mm-in_mm); } else { *outlen = (out_hh-in_hh-1)*100 + 60 + (out_mm-in_mm); } } ret: return flagt; } char* ret_typestr(int typecode) { switch(typecode) { case 0: return "NORMAL"; case 1: return "ABSENT"; case 2: return "WORK_LATE"; case 3: return "LEAVE_EARLY"; case 4: return "LATE_AND_LEARLY"; case 5: return "PUNCH_ABNORMAL"; default: return "typecode not know!"; } }