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;
}
}//每一个次数对整个单词数组遍历输出
}
达成要求