统计英文文件中单词数和各单词出现的频率(次数)

/*
File name:词频统计.cpp
Author:杨柳
Date:2017.3.25
IDE:DEV-c++ 
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NUM 100000
struct Word      //单词结构体
{
int  num;//单词频数
char ch[20];//每一个单词
} word[MAX_NUM];
int select=1;//select 为是否退出系统的标记
 
//向用户提供帮助说明
void help()
{
    printf("\n(1)可导入任意英文文本文件");
	printf("\n(2)统计该英文文件中单词数和各单词出现的频率(次数),并能将单词按字典顺序输出");
	printf("\n(3)将单词及频率写入文件");
}

//获取英文文本信息及总单词数
void  readfile(char essay[],int total_num,char ch)

{
   FILE *fp;
   int i=1;
   fp=fopen("data.txt","r");
   if(!fp)
   {
	   printf("\n打开文件data.txt失败!");
	   exit(0);
   }
   ch=fgetc(fp);//ch为文章第一个字符,判断文章文件是否为空。
   if(ch!=EOF)
   {
     essay[0]=ch;
     for(i;!feof(fp);i++) //如果未遇到读入文本结束符
	 {
          essay[i]=fgetc(fp);//获取文章,将文章中的各个字符放到essay数组中
	 }
     essay[i]='\0';//在读取文章时,并没有将字符串的结束标志读进去,为了后面使用strtok等字符串的相关函数,加上’\0’。
     total_num=i;//记录单词的数量
   }
     if(0==i)
	   printf("\n文件为空,请选择英文文本输入!");
     else
	   printf("\n");
   fclose(fp);
 }


/*向文件写入英文文本信息*/
void  writefile(char essay[] ,int total_num, char ch)
{
    char essay_str[MAX_NUM];
    FILE *fp;
    char str=' ';
    getchar();
    int i=0;
    fp=fopen("data.txt","w");
    if(!fp)
    {
	   printf("\n打开文件data.txt失败!");
    }
    printf("请输入:");
    gets(essay_str);
    if(ch!=EOF)
    fputc(str,fp);
    fputs(essay_str,fp);//将新增的文章读到文件上
    strcat(essay,essay_str);
    readfile(essay,total_num,ch);
    printf("添加成功");
    printf("\n");
    fclose(fp);
}
 
//显示英文文本 
void show(char essay[],int total_num,char ch)//显示文章

{
   if(ch==EOF)
          printf("\n文件为空,请选择英文文本输入!");
   else
          printf("%s",essay);
          printf("\n");
}


/*按字典顺序进行单词排序*/
void sort(int k)
{
	int num;
	int i,j,t;  //定义局部变量i,j
	char temp[20];  //临时字符数组
	for(i=0;i<k-1;i++)
	{
		for(j=k-1;j>i;j--)
			if((strcmp(word[j].ch,word[j+1].ch)==1)) //比较两个单词,若后一个单词大于前一个,进行调换
			{
             strcpy(temp,word[j].ch);//交换单词
             strcpy(word[j].ch,word[j+1].ch);
             strcpy(word[j+1].ch,temp);
             t=word[j].num;//交换单词频数
             word[j].num=word[j+1].num;
             word[j+1].num=t;
			}
	}
} 
 
 
//统计单词频数
void count(char *essay,char *b)
{
  
int j,i=0;//i记录有多少不同的单词,n记录相同单词出现的次数

char *t;

bool judge=false;

int sum=0;

FILE *fp;

    for(t=strtok(essay,b);t!=NULL;t=strtok(NULL,b))

{

//利用strtok函数将文章中的单词分离开。

   sum++;//单词总数

   strcpy(word[i].ch,t);

   (word[i].num)=1;


   for(j=0;j<i;j++)

      if(strcmp(word[i].ch,word[j].ch)==0)

  {

      (word[j].num)++;

      judge=true;

  }

   if(judge)

   i--;

   i++;

   judge=false;

   }

   i=i-1;
   sort(i);
   printf("单词总数为:%d\n",sum);

   fp=fopen("count.txt","w");

    if(!fp)

    {

   printf("\n打开文件count.txt失败!");

   exit(0);

} 

   fprintf(fp,"单词总数为:%d\n",sum);将单词总数读到文件中

   for(j=0;j<i;j++)

   {

   fprintf(fp,"%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数读到文件中

   printf("%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数打印到屏幕上

   }

    fclose(fp);

}

void menu()
{
    int item,total_num=0;//total_ch记录文章中的总字符数
    char b[20]={',','.','?',':','-',' '},essay[2*MAX_NUM],ch;
    printf("\n");
	printf("              *********************************************************\n");
	printf("              #                                                       #\n");
	printf("              #                 词频统计                              #\n");
	printf("              #                                                       #\n");
	printf("              *********************************************************\n");
	printf("              #                                                       #\n");
	printf("              #           1.显示英文文本                              #\n");
	printf("              #                                                       #\n");
	printf("              #           2.显示单词总数、全部单词及频数              #\n");
	printf("              #                                                       #\n");
	printf("              #           3.帮助                                      #\n");
	printf("              #                                                       #\n");
	printf("              #           4.输入英文文本                              #\n");
	printf("              #                                                       #\n");
	printf("              #           5.退出系统                                  #\n");
	printf("              *********************************************************\n"); 
    printf("请选择您需要的操作序号(1-5)按回车确认:");
    readfile(essay,total_num,ch);
    scanf("%d",&item);
    printf("\n");
   
    switch(item)
  {
   	  case 1:show(essay,total_num,ch);break;
      case 2:count(essay,b);break;
      case 3:help();break;
      case 4:writefile(essay,total_num,ch);break;
      case 5:select=0;break;
      default:printf("请在1-5之间选择\n");break;
   }
}

int main()
{ 
  	while(select)
	{
		menu();
	}
	return 1;
} 



 

  • 11
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以使用以下脚本实现该功能: ``` #!/bin/bash # 创建一个空的字典 declare -A word_count # 循环遍历文件的每一行 while read line; do # 将行拆分成单词组 words=($line) # 循环遍历单词组 for word in "${words[@]}"; do # 在字典单词计数器加 1 word_count[$word]=$((word_count[$word] + 1)) done done < words.txt # 循环遍历字典,输出每个单词及其出现次数 for word in "${!word_count[@]}"; do echo "$word: ${word_count[$word]} times" done ``` 上述脚本使用了一个叫做 "字典" 的据结构来记录每个单词出现次数。字典是一种可以将据项相关联的据结构,其每个据项都包含一个键和一个值。在上述脚本,我们使用了一个叫做 `word_count` 的字典,将每个单词作为键,将单词出现次数作为值。 注意:上述脚本需要在 bash 环境下运行,并且需要使用 "associative arrays" 功能,该功能在 bash 版本 4.0 及以上可用。 ### 回答2: 要实现这个功能,可以编写一个Bash脚本来统计words.txt文件每个单词出现频率。以下是一个示例脚本: ```bash #!/bin/bash # 读取文本文件的内容 text=$(cat words.txt) # 将文本内容按照空格和换行进行分隔,并将结果存储在 words=($text) # 创建一个关联组来存储单词及其出现频率 declare -A freq # 遍历单词,并统计频率 for word in "${words[@]}"; do if [[ $word != "" ]]; then ((freq[$word]++)) fi done # 输出每个单词及其出现频率 for word in "${!freq[@]}"; do echo "$word ${freq[$word]}" done ``` 使用这个脚本,你可以执行以下命令来统计words.txt文件每个单词频率: ```bash bash script.sh ``` 脚本将输出每个单词及其出现频率,如下所示: ``` apple 3 banana 2 orange 1 ``` 这表示在words.txt文件,"apple"单词出现了3次,"banana"单词出现了2次,"orange"单词出现了1次。 ### 回答3: 你可以编写一个bash脚本来统计文本文件words.txt每个单词出现频率。以下是一个简单的脚本示例: #!/bin/bash # 读取文件每个单词计数 cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr # 输出示例: # 2 apple # 1 banana # 3 orange # ... # 解释: # - 使用cat命令读取文件内容,并将多个空格转换为单个换行符 # - 使用sort命令对单词进行排序,以确保相同的单词相邻 # - 使用uniq命令统计每个单词出现频率,并在输出结果添加计数 # - 再次使用sort命令对计数进行逆序排序,以便先显示出现频率最高的单词 你可以将以上脚本保存为word_frequency.sh文件,然后在终端运行chmod +x word_frequency.sh命令,为脚本添加执行权限。接下来,你可以使用./word_frequency.sh命令来运行脚本,并将结果输出到终端。 注意:在运行脚本之前,请确保已经存在words.txt文件,并包含所需的文本据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值