【问题描述】编写一个程序,读入几行文本,并打印一个表格。此表格按照单词在文本
长度不超过20个字符每行文本字符数不超过80,输入文本中的单词个数不超过1000个。
(2)编写一个函数readWords()从读入的几行文本中抽取每个单词,将其存储在二维数组
(1)可定义一个二维字符数组char words[1001][21]用于按照输入文本中单词出现的顺
要求:
中出现的顺序,显示每个不同单词(不区分大小写)在文本中的出现次数。约定每个单词的
序依次存储每个单词。
words中。(3)编写一个函数countAndPrintWords(),依次计算words数组中每个单词出现的次数,
并按照每行显示五个单词的格式,依次打印出每个单词出现的次数。
(4)在main函数中,调用上述定义的函数。
代码如下:
#include <iostream>
using namespace std;
//判断ch是否是字母
int isZm(char ch)
{
if( (ch >='a' &&ch <='z') || (ch>='A' && ch <='Z') || (ch == '\'') )
return 1;
else
return 0;
}
char tolower(char ch)
{
if(ch>='A' && ch <='Z')
return ch + 32;
else
return ch;
}
void readWords(char words[][21],int &nmb)
{
int i,n;
char buf[100];
nmb = 0; //单词数量
cout << "请输入读取的行数:" ;
cin >> n;
cin.get();
cout << "请输入" << n << "行字符:"<<endl;
for (i=0;i<n;i++)
{
cin.getline(buf,80);
int j = 0;
int k = 0;
while(buf[j] && (!isZm(buf[j])) ) j++;
while(buf[j])
{
if(isZm(buf[j]))
{
words[nmb][k] = tolower(buf[j]);
k++;
}else //假设单词中只有英文字母,没有特殊符号(如.')
{
if(isZm(buf[j-1]))
{
words[nmb][k] = 0;
nmb++;
k = 0;
}
}
j++;
}
if(isZm(buf[j-1]))
{
words[nmb][k] = 0;
nmb++;
k=0;
}
}
}
//统计单词数量
void countAndPrintWords(char words[][21],int nmb)
{
int i,j;
int cnt[1001];
for(i=0;i<nmb;i++)
cnt[i] = 0;
cnt[0] = 1;
for (i = 1;i<nmb;i++)
{
for (j=0;j<i;j++)
{
if( strcmp(words[i],words[j]) == 0 )
{
cnt[j]++;
break;
}
}
if(j == i)
cnt[i] = 1;
}
//显示
int kt = 0;
for (i=0;i<nmb;i++)
{
if (cnt[i] != 0)
{
cout << words[i] << " " << cnt[i] << " ";
kt++;
if(kt%5==0)
cout << endl;
}
}
}
int main()
{
char words[1001][21];
int nmb;
readWords(words,nmb);
countAndPrintWords(words,nmb);
return 0;
}
单词分隔符只有空格么,还是有其它字符,最好限定一下。
gets函数逐行读入,然后根据空格拆分出单词,将单词记录到二维数组。同时定义一个与单词二维数组一样长的整型数据,用来记录每个单词的出现频率。
当拆分出一个新的单词时,到单词数组进行检索,如果已经存在,则对应的整型数组值加1,否则单词数组增加新的单词,对应的整型数组值为1
最后打印单词数组及对应整型数组中的出现次数就行了