2021-05-02

403:统计单词的出现次数并输出

目录

403:统计单词的出现次数并输出


http://jmunetds.openjudge.cn/ex3/403/

描述

根据用户给定的一篇包含若干个单词的英文文章(文章只包含英文字母和空格、回车换行符,单词之间

以空格或者回车换行符分隔,单词最短一个字母,最长100个字母;最多包含100000个不同的单词),请

解析出所有不同的单词,并统计出每个单词出现的次数,然后按照单词出现的次数从小到大输出,如果出

现次数一样,则按照英文单词的词典顺序输出(忽略大小写区别,输出时全部变成小写字母)。

输入

英文文章。以“***”作为结束标志。

输出

单词按照出现次数从小到大的输出,一行一个单词。

首先我想使用c语言实现,大致思路:首先用gets()函数读入字符串,先统计一共有多少个单词,并将所有开头大写的单词转化为小写,然后创建valueA与valueB两个char类型指针,valueA从第一个单词起读入,通过循环将valueB遍历所有单词并逐个用strcmp()函数与valueA比较,相同就将该单词的数量+1。后将不重复单词读入新数组,比较每个单词出现的次数并按从小到大顺序输出。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
	char str[10000000];
	int num = 1;//num用来存储共多少个单词
	int sum = 0;
	int i = 0;
	gets_s(str);
	char* destr = str;
	char* p = destr;
	while (*p != '\0')
	{
		if (*p >= 'A' && *p <= 'Z')
		{
			*p = *p - 'A' + 'a';//将单词全部转换为小写
		}
		if (*p == ' ')
		{
			num++;
			*p = '\0';
		}
		p++;
	}
	int* account = new int[num];//统计每个单词的出现次数
	account[0] = 1;
	for (int i = 1; i < num; i++)
	{
		account[i] = 0;
	}
	char* valueA = destr;
	for (int i = 0; i < num - 1; i++)
	{
		valueA += (strlen(valueA) + 1);
		char* valueB = destr;
		for (int j = 0; j < num; j++)
		{
			if (strcmp(valueA, valueB) == 0)//valueB是否与valueA相等
			{
				account[j]++;
				break;
			}
			else
			{
				valueB = valueB + (strlen(valueB) + 1);
			}
		}
	}
	valueA = destr;
	int* amount = new int[sum];
	string* value = new string[sum];
	for (i = 0; i < num; i++)
	{
		if (account[i] && *valueA != '\0')
		{
			value[i] = valueA;
			sum++;
		}
		valueA += (strlen(valueA) + 1);
	}
	int n = 0;
	valueA = destr;
	for (i = 0; i < num; i++)
	{
		if (account[i] && *valueA != '\0')
		{

			amount[n] = account[i];
			n++;
		}
		valueA += (strlen(valueA) + 1);
	}
	int m, k;
	for (k = 0; k < num; k++)
	{
		int max = amount[0];
		for (i = 0; i < sum; i++)
		{
			if (max < amount[i])
			{
				max = amount[i];
				m = i;
			}
		}
		sum--;
		cout << value[m] << endl;
		for (i = m; i < sum; i++)
		{
			amount[i] = amount[i + 1];
			value[i] = value[i + 1];
		}
	}

}

c语言输出较为困难所以转用c++实现

#include<iostream>
#include<cstring>
#include<string>
#include<map>
using namespace std;

int main()
{
	char ch[20];
	string str, stack[10000];
	int n = 0, max = 0, i;
	map<string, int>M;
	//输入处理
	scanf("%s", ch);
	while (strcmp(ch, "***") != 0) {
		for (i = 0; i < strlen(ch); i++) {
			if (ch[i] <= 'Z' && ch[i] >= 'A') {
				ch[i] = ch[i] + 'a' - 'A';
			}
		}//大写字母转小写
		str = ch;
		if (M[str] == NULL) {
			M[str] = 1;//创建没有map储存的单词
			i = 0;
			for (i = 0; i < n; i++) {
				if (stack[i].compare(str) < 0)continue;
				else {
					for (int j = n - 1; j >= i; j--) {
						stack[j + 1] = stack[j];
					}//将数组中所有单词按大小排序
					stack[i] = str;
					break;
				}
			}
			if (i == n)stack[n] = str;
			//储存所有单词
			n++;
		}
		else {
			M[str]++;//单词出现次数加一
			if (max < M[str])max = M[str];//得到最大次数
		}
		scanf("%s", ch);
	}
	//输出
	for (i = max; i > 0; i--) {
		for (int t = 0; t < n; t++) {
			if (M[stack[t]] == i)cout << stack[t] << ' ' << M[stack[t]] << endl;
		}
	}//每一个次数对整个单词数组遍历输出
}

达成要求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值