补充个人项目(词频统计的功能)

词频统计:

项目需求:

1.小文件输入. 为表明程序能跑

2.支持命令行输入英文作品的文件名

3. 支持命令行输入存储有英文作品文件的目录名,批量统计

4. 从控制台读入英文单篇作品,重定向输出

之前已经完成小文件输入的功能,接下来就是补充2、3、4的功能。

 

定义结构体:

//结构体定义:单词和对应频率
typedef struct tlist 
    {  
        char word[200]; 
        int time; 
    }            

读单词函数:

void readWord(Word *p,int len) 
{  
  int i; 
  for(i=0;i<27;i++)     
  {          
    if(p->next[i]!=NULL)         
    { 
            if (i==26)     
         {
         str[len+1]='\0';str[len]='\'';
         len++;
       }     
       else     
       { 
              str[len]='a'+i;      
         len++;    
       } 
            readWord((Word*)p->next[i],len);             
       len--;
     }     
   }  
   if(p->num!=0)     
   { 
       str[len]='\0'    
       strcpy(list[size].word,str);    //如果遇到单词结束标志,将str存入list[size].word 
        list[size].time=p->num;         
      size++;     
     } 
}

在指定目录下遍历所有txt文件:

BOOL FindFile(char *pFileName, char * FindFileType)
{
    WIN32_FIND_DATA fd;
    HANDLE hFind;
    char Type[10]={0};
    sprintf(Type,".%s",FindFileType);
    //HANDLE hFindType;//查找对应文件类型
    char FileName[260]={0};
 
    sprintf(FileName,"%s\\*.*",pFileName);
    ZeroMemory(&fd,sizeof(fd));
 
    if(0 == strlen(FileName))
    {
        MessageBox(0,"文件名不能为空",0,0);
        return FALSE;
    }
    else
    {
       hFind = FindFirstFile(FileName,&fd);
       if(INVALID_HANDLE_VALUE==hFind)
       {
           return FALSE;
       }
       else
       {
            do 
            {
                //查找文件名字中有没与 .文件后缀  注意要加点 因为点在文件名字是特殊符号
                //一般是不可以用的。但可以用特殊方法来添加。
                //U 盘免疫就是用这中方法来 来建立一个不能用普通方法删除autorun.inf的文件夹 
                if(strstr(fd.cFileName,Type))
                {
                    Test(&fd);
                }
                else
                {
                    //当该文档是文件时候进行下列操作
                     if(fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
                     {
                         //除掉 . 表示当前目录 和..上一个目录 这个在dos 中可以看到
                         if(strcmp(fd.cFileName,".")!=0&&strcmp(fd.cFileName,"..")!=0)
                         {
                             char Temp[256]={0};
                             sprintf(Temp,"%s\\%s",pFileName,fd.cFileName);
                             FindFile(Temp,FindFileType);
 
                         }
                         
                     }
                }
                 
//继续查找下一个文件

从txt文档中读入:

while((x=fgetc(fp))!=EOF) //从txt文档中读入     
  { 
    if ((x>='A'&&x<='Z')||(x>='a'&&x<='z')||(x=='\''&&len!=0))   
    {
      tempword[len]=x;
      len++;
    }         
    else 
    {
      tempword[len]='\0';        
      createWord(tempword);        
      len=0;              
    }     
  }  
  tempword[len]='\0';  
  createWord(tempword);  
  len=0;  
  fclose(fp); 

输出单词及其出现频率:

readWord(root,0);   //比较频率大小冒泡排序     
  struct tlist temp;     
  for(i=0;i<size-1;i++)         
  for(j=i+1;j<size;j++)         
  if(list[i].time>list[j].time||(list[i].time==list[j].time&&strcmp(list[i].word,list[j].word)>0)) 
  {               
    temp.time=list[i].time;               
    list[i].time=list[j].time;              
    list[j].time=temp.time;               
    strcpy(temp.word,list[i].word);               
    strcpy(list[i].word,list[j].word);              
    strcpy(list[j].word,temp.word); 
   }   
    //将单词和对应频率输出到result.txt中     FILE *fpx; 
  fpx=fopen("result.txt","w"); 
  for (i=0;i<size;i++) 
  fprintf(fpx,"%s   %d\n",list[i].word,list[i].time);     
  fclose(fpx);     
  return 0;   
}

 注:重定向还不太了解,实验结果还在完善中。

今天psp:

内容  开始时间  打断时间  结束时间  净时间
查资料  17:24 0 17:51 27分
写代码  20:43 15分  21:50 67分
读构建之法 18:04 0 18:38 34分
在网上看练习与讨论 18:40 0 19:17 37分

本周代码堆积图:

代码和博客会继续更新,实验结果正在调试

posted @ 2016-11-14 23:16  刘ff  阅读(190)  评论(1编辑  收藏  举报