作業統計程式4.0
小編今年大一,是班級的團支書,由于經常要收集全班的材料上交學院,常常收不齊,全班這么多人,偏偏小編又比較懶,不想一個個調查是誰沒交,于是就萌發了寫一個小程式實作這一程序的想法,嘗試了許多次都沒有成功,因為C語言中文字符的編碼與一般字符不同,且不同平臺中文字符占位元組數不同(devcpp運行下一個中文字符2個位元組,vscode3個位元組),所以比較困難,經過多次嘗試和參考,終于寫出了一個能用的版本1.0,經過多次改進,程式性能有了提升,后續還會繼續完善!(目前為最新的4.0版)
程式清單:
1.主程式Find_Who_nSubmit.c
2.存放名單的檔案namedata.txt
3.存放提取文字的檔案data.txt
4.匯出統計資料的檔案SubmitList.txt(運行程式后自動創建)
具體使用方法是:
1.(由于每次收材料都是電子檔案)將收集的檔案截圖并提取檔案名,放在一個“data.txt"
檔案內(小編使用的是QQ聊天視窗的截圖提取文字功能)


2.在主檔案"Find_Who_nSubmit.c"設定相關引數,具體引數有:
NEED_TO_HAND_IN_NUM 每人需要提交的檔案數量
CLASSMATE_NUM 班級人數
宏_PRINT_DATA_可選擇定義或不定義,若定義該宏,可將結果匯出到檔案SubmitList.txt
3.在檔案名為namedata.txt的檔案內放置全班名單
(之所以把名單放在另外一個檔案是為了防止運行主程式或修改代碼宏引數時誤刪過改動名單資訊,而且把代碼做成exe可執行檔案后可以在不修改代碼的情況下修改名單,)

4.然后運行主程式"Find_Who_nSubmit.c"就可以看到提交和未提交的人名單以及一個數量統計了,

若定義了宏_PRINT_DATA_還可以匯出名單,

以下就是代碼具體實作程序:
//Created by 鋒//
//使用方法:用QQ聊天截圖截取檔案名并提取文字,放入data.txt檔案//
//由于中文字符編碼標準不同,建議在Devc++運行本程式//
//若出現移植后中文亂碼的現象,在所使用的平臺重新打出中文即可//
#include <stdio.h>
#include <string.h>
#define NEED_TO_HAND_IN_NUM 1
#define CLASSMATE_NUM 62
#define SLEN sizeof("歐陽嫣然歐陽嫣然")
#define DATA_Len 1000000
#define _PRINT_DATA_//可不定義,若定義,結果匯出到檔案SubmitList.txt//
FILE * fp1;FILE*fp2;
char collection[DATA_Len];
char name[CLASSMATE_NUM][SLEN];
int Name_Count(char *,char *);
int main()
{
int x,submit=0,Nsubmit=0;
if((fp1=fopen("data.txt","r"))==NULL)
{
puts("data.txt error!");
exit(0);
}
FILE*L=fopen("namedata.txt","r");//無亂碼//
if(L==NULL)
{
puts("namedata.txt error!");
exit(0);
}
for(i=0;i<CLASSMATE_NUM;i++)
{
fscanf(L,"%s",name[i]);
}
#ifdef _PRINT_DATA_
if((fp2=fopen("SubmitList.txt","w"))==NULL)
{
puts("SubmitList.txt error!");
exit(0);
}
#endif
fscanf(fp1,"%[^']",collection);
for(x=0;x<CLASSMATE_NUM;x++)
{
if(Name_Count(collection,name[x])>=NEED_TO_HAND_IN_NUM)
{
printf("%s\t\t已提交\n",name[x]);
#ifdef _PRINT_DATA_
fprintf(fp2,"%s\t\t已提交\n",name[x]);
#endif
submit++;
}
else
{
printf("%s\t\t未提交@%s\n",name[x],name[x]);
#ifdef _PRINT_DATA_
fprintf(fp2,"%s\t\t未提交@%s\n",name[x],name[x]);
#endif
Nsubmit++;
}
}
printf("\n已提交:%d\n未提交:%d",submit,Nsubmit);
#ifdef _PRINT_DATA_
fprintf(fp2,"\n已提交:%d\n未提交:%d",submit,Nsubmit);
#endif
free(fp1);
free(fp2);
free(L);
getchar();//防止閃退//
return 0;
}
int Name_Count(char * src,char * dst)
{
int i=0,j=0;
int num0=0,num1=0;
int len=(int)strlen(dst);
while(src[i]!='\0')
{
while((dst[j]!=0)&&(dst[j]==src[i+j]))
{
j++;
}
if(dst[j]==0)
{
i+=len;
j=0;
num0++;
if(src[i]=='\0')
{
if(num0>num1)
num1=num0;
}
}else
{
if(num0>num1)
{
num1=num0;
}
num0=0;
i++;
j=0;
}
}
return num1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248207.html
標籤:其他
