作业统计程序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;
}