Reputation: 35
The code outputs separate lines, but I want it to have added all the lines together instead.
Example testdata file:
Iris Pruysen at 2014 Athletics Paralympic Meeting
Iris Pruysen, an athlete with an artificial leg, competes in the long jump at the 2014 Athletics Paralympic Meeting in Stade Sébastien Charléty, Paris, France.Today is July 27, 2017.
Output is:
Average number of letters per sentence 163.000
Total number of digits is 8
Average number of letters per sentence 5.000
Total number of digits is 6
How can I have just one line for average number of letters and one line for total digits?
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cctype>
using namespace std;
int main()
{
int letters; //Total number of letters
int digits; //Total number of digits
double sentencecount; //Number of sentences
float averageletters; //Average number of letters per sentence
int linecount=0; //Count of lines
char current; //Current character
cout << fixed << setprecision(3);
cin.get(current);
while (cin) //while receiving input
{
digits = 0;
letters = 0;
linecount++;
while (current != '.' && current != '!' && current != '?') //checks each line
{
if (isalpha(current))//counts alphabet characters
letters++;
if (isdigit(current))//counts digits
digits++;
cin.get (current);
}
sentencecount = letters/linecount;//finds average letters per sentence
cin.get (current);
cout << "Average number of letters per sentence " << sentencecount << endl << "Total number of digits is " << digits << endl;
}
// cout << "Average number of letters per sentence " << sentencecount << endl << "Total number of digits is " << digits << endl;
return 0;
}
Upvotes: 0
Views: 93
Reputation: 87959
Here's my effort to clean up your code. It's really a matter of doing the right thing at the right time. You need to think about what should be inside the loop and what should be outside. For instance it should be obvious that if you are trying to total the number of letters it is wrong to set the number of letters to zero inside the loop.
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cctype>
using namespace std;
int main()
{
int letters = 0; // Total number of letters
int digits = 0; // Total number of digits
double sentencecount; // Number of sentences
float averageletters; // Average number of letters per sentence
int linecount=0; // Count of lines
char current; // Current character
cout << fixed << setprecision(3);
cin.get(current);
while (cin) // While receiving input
{
linecount++;
while (current != '.' && current != '!' && current != '?') // Checks each line
{
if (isalpha(current)) // Counts alphabet characters
letters++;
if (isdigit(current)) // Counts digits
digits++;
cin.get (current);
}
cin.get (current);
}
sentencecount = letters/linecount; // Finds average letters per sentence
cout << "Average number of letters per sentence " << sentencecount << endl
<< "Total number of digits is " << digits << endl;
return 0;
}
Disclaimer, I haven't actually tested the code above.
Upvotes: 1
Reputation: 31599
This code can be simplified by using only one while
loop. The number of lines are not being counted. Use if (current == '\n') linecount++;
to count the number of lines.
Currently, "!!!"
is treated as 3 sentences. Check the previous character to correctly identify the end of the sentence.
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
int letters = 0;
int digits = 0;
int sentences = 0;
stringstream source;
source << "!!!Abc def 1 2 3 100. Sentence 2.";
char current;
char previous = 0;
while(source.get(current))
{
if(isalnum(previous) && (current == '.' || current == '!' || current == '?'))
sentences++;
else if(isalpha(current))
letters++;
else if(isdigit(current))
digits++;
previous = current;
}
cout << "digits " << digits << endl;
cout << "letters " << letters << endl;
cout << "sentences " << sentences << endl;
cout << "total average " << (float)letters/sentences << endl;
return 0;
}
Note that isalpha(c)
will return zero when c
is one of !?.
Upvotes: 0