作业统计程序3.0

作业统计程序3.0

小编今年大一,是班级的团支书,由于经常要收集全班的材料上交学院,常常收不齐,全班这么多人,偏偏小编又比较懒,不想一个个调查是谁没交,于是就萌发了写一个小程序实现这一过程的想法,尝试了许多次都没有成功,因为C语言中文字符的编码与一般字符不同,且不同平台中文字符占字节数不同(devcpp运行下一个中文字符2个字节,vscode3个字节),所以比较困难,经过多次尝试和参考,终于写出了一个能用的版本,虽然尚有许多局限,但后续还会继续完善!(目前为最新的3.0版)
程序清单:
1.主程序Find_Who_nSubmit.c
2.存放名单的文件namedata.txt
3.存放提取文字的文件data.txt
4.导出统计数据的文件SubmitList.txt
具体使用方法是:
1.(由于每次收材料都是电子文档)将收集的文档截图并提取文件名,放在一个“data.txt"
文件内(小编使用的是QQ聊天窗口的截图提取文字功能)
作业统计程序3.0_第1张图片
作业统计程序3.0_第2张图片

2.在主文件"Find_Who_nSubmit.c"设置相关参数,具体参数有:
NEED_TO_HAND_IN_NUM 每人需要提交的文件数量
CLASSMATE_NUM 班级人数
宏_PRINT_DATA_可选择定义或不定义,若定义该宏,可将结果导出到文件SubmitList.txt
3.在文件名为namedata.txt的文件内放置全班名单
(之所以把名单放在另外一个文件是为了防止运行主程序或修改代码宏参数时误删过改动名单信息。)作业统计程序3.0_第3张图片

4.然后运行主程序"Find_Who_nSubmit.c"就可以看到提交和未提交的人名单以及一个数量统计了。
作业统计程序3.0_第4张图片
若定义了宏_PRINT_DATA_还可以导出名单。
作业统计程序3.0_第5张图片
以下就是代码具体实现过程:

    //Created by 锋//  
  
  //使用方法:用QQ聊天截图截取文件名并提取文字,放入data.txt文档//  
  //由于中文字符编码标准不同,建议在Devc++运行本程序//
  //若出现移植后中文乱码的现象,在所使用的平台重新打出中文即可// 
#include 
#include 
#define NEED_TO_HAND_IN_NUM 1 
#define CLASSMATE_NUM 62
#define DATA_Len 1000000
#define _PRINT_DATA_//可不定义,若定义,结果导出到文件SubmitList.txt//
#include"namedata.txt" //内含全班名单//  
FILE * fp1;FILE*fp2;
char collection[DATA_Len];

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);
	}
	#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
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;
}

你可能感兴趣的:(笔记,c语言,windows)