user9435972
user9435972

Reputation: 35

How can I add numbers from a while loop?

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

Answers (2)

john
john

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

Barmak Shemirani
Barmak Shemirani

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

Related Questions