Wednesday, September 1, 2010

Word Length Frequency

// word_len_histo.cpp : reads words and lists distribution
// of word lengths.
// Fred Swartz, 2002-09-01

// This would be nice to turn into an OO program, where
// a class represented a distribution of values.
// Some elements which are globals here would turn into
// private member elements in the class (eg, valueCount).


//--- includes
#include
#include
#include
using namespace std;

//--- prototypes
void countValue(int cnt);
float getAverage();

//--- constants
const int BINS = 21; // how many numbers can be counted

//--- globals
int valueCount[BINS]; // bins used for counting each number
int totalChars = 0; // total number of characters

//=========================================================== main
int main() {

char c; // input character
int wordLen = 0; // 0 if not in word, else word length

//--- Initialize counts to zero
for (int i=0; i
valueCount[i] = 0;
}

//--- Read chars in loop and decide if in a word or not.
while (cin.get(c)) {
if (isalpha(c)) { // letters are in words, so
wordLen++; // add one to the word length
} else {
countValue(wordLen); // end of word
wordLen = 0; // not in a word, set to zero
}
}
countValue(wordLen); // necessary if word ended in EOF

//--- print the number of words of each length
cout << "Why does this line disappear?" << endl;
cout << "Word length Frequency" << endl;
for (int j=1; j
cout << setw(6) << right << j << " "
<< setw(8) << right << valueCount[j] << endl;
}

//--- print average length
cout << "\nAverage word length: " << getAverage() << endl;

return 0;
}//end main


//==================================================== countValue
void countValue(int cnt) {
if (cnt > 0) {
// this must be the end of a word
if (cnt > 20) {
cnt = 20; // longer than 20 counts as 20
}
valueCount[cnt]++; // count in correct bin
}
totalChars += cnt;
}//end countWord


//==================================================== getAverage
float getAverage() {
int totalCount = 0;

for (int i=0; i
totalCount += valueCount[i];
}
if (totalCount > 0) {
return (float)totalChars/totalCount;
} else {
return 0.0;
}
}//end getAverage

No comments:

Post a Comment