• 统计单词出现的频率及排序


    #include <iostream>
    #include <fstream>
    #include <string>
    #include<stdlib.h>
    using namespace std;
    
    FILE *fp;    //读文件
    char filename[20];      //文件路径及文件名
    int m=0;
    char c[20];
    struct wordcount                  //存放单词及其个数
    	{
    		int key;
    		char a[20]; 
    		
    	};
    struct wordcount list[300];
    
    void readfile(char filename[])   //读文件
    {
        
    	char ch;
    	int flag=0;
    	int k,n=0,j=0;
    	for(m=0;m<200;m++)                  //将list全部初始化为0
        list[m].key=0;
    	if((fp=fopen(filename,"rt"))==NULL)
    		 printf("cannot open the file!");  
    	else
    	while(!feof(fp))
    	{   for(k=0;k<20;k++)
    			c[k]='';
            int i=0;
    		ch=fgetc(fp);
    		while(((ch>'A'&&ch<'Z')||(ch>'a'&&ch<'z'))&&!feof(fp))
    		{
    			if(ch>'A'&&ch<'Z') ch=ch+32;
     			c[i]=ch;
    			ch=fgetc(fp);
    			i++;
    		 }
    		c[i]='';
    		for(j=0;list[j].key!=0;j++)            
    		{
    			if(strcmp(list[j].a,c)==0)
    			{
    				list[j].key=list[j].key+1;
    				flag=1;
    			    break;
    			}
    		}
    		if(flag==0)
    		{
    			list[j].key=1;
    			strcpy(list[j].a,c);
    		}	
    		flag=0;
    	} 
    }
    
    void sort()          //排序
    {
    	int i,j,max;
    	int n=100;             
    	char ch2[20];
    	for(i=0;i<10;i++)
    	{
    		max=list[i].key;
    		for(j=i+1;j<n;j++)
    			if(list[j].key>max)
    			{
    				max=list[j].key;
    			    list[j].key=list[i].key;
    				list[i].key=max;
                    strcpy(ch2,list[j].a);
    				strcpy(list[j].a,list[i].a);
    				strcpy(list[i].a,ch2);
    			}
    			cout<<list[i].a<<'	'<<list[i].key<<'	'<<endl;
    	}
    }
    
    void main()
    {
        int i;
    	cout<<"请输入文件路径及文件名 :"; 
        scanf("%s",filename); 
    	readfile(filename);
    	cout<<"频率最高的前十个词是:"<<endl;
        sort(); 
    }
    
    
    
    
    

    本程序总共分为三部分读文件readfile()、单词统计、排序找出频率最高的前十个单词;

    一、在统计单词频率的程序中,首先第一步是读文件,

    if((fp=fopen(filename,"rt"))==NULL)
       printf("cannot open the file!"); 
     else
     while(!feof(fp)){}

    这几行代码是读文件,其中要注意的是定义fp,FILE *fp,不要忘记*;

    二、单词统计部分是重要部分之一,本程序利用结构体、链表来记录单词及单词的个数

    while(((ch>'A'&&ch<'Z')||(ch>'a'&&ch<'z'))&&!feof(fp))
      {
       if(ch>'A'&&ch<'Z') ch=ch+32;
        c[i]=ch;
       ch=fgetc(fp);
       i++;
       }
      c[i]='';利用ch=ch+32将大写转换成小写,实现单词的识别,

    for(j=0;list[j].key!=0;j++)           
      {
       if(strcmp(list[j].a,c)==0)
       {
        list[j].key=list[j].key+1;
        flag=1;
           break;
       }
      }

    当遇到空格一个单词结束,进行单词之间的比较,个数累加

     for(i=0;i<10;i++)
     {
      max=list[i].key;
      for(j=i+1;j<n;j++)
       if(list[j].key>max)
       {
        max=list[j].key;
           list[j].key=list[i].key;
        list[i].key=max;
                    strcpy(ch2,list[j].a);
        strcpy(list[j].a,list[i].a);
        strcpy(list[i].a,ch2);
       }
       cout<<list[i].a<<' '<<list[i].key<<' '<<endl;
     }

    将第一个看做单词数最多的,和其他单词比较,最后把数量最多的单词换在第一位输出,依次类推输出出现频率最多的前十个单词;

  • 相关阅读:
    JFreeChart生成图片
    itext生成Word
    itext生成PDF
    物理模型name与comment互相转化
    表单序列化为Json(只限input)
    c#多线程同步之EventWaitHandle的应用
    C#多线程之异步编程
    Java环境变量设置
    sharepoint 2013实践
    WPF研究之道——数据驱动UI
  • 原文地址:https://www.cnblogs.com/guolili/p/3577336.html
Copyright © 2020-2023  润新知