CS 3358 (Data Structures and Algorithms) by Lee S. Koh

Using putse to Assist in Reformatting Poorly Formatted Code
Example 1: Code putsed


#include <fstream>
#include <iostream>
#include <iomanip>   //for output formatiing
#include <cstdlib>  // for exit(), EXIT_SUCCESS, EXIT_FAILURE
#include <cctype>  // for isspace()

using namespace std;

int main()
{
   int checkInputFile ();

   if (!checkInputFile()) 
   {
      cout << "Input file is not in correct format." << endl;
      exit (1);
   }

   ifstream fin("./scores.dat", ios::in);
   ofstream fout("./output.dat", ios::out);

   if ( fin.fail() )
   {
      cout << "Error opening input Score file scores.dat" << endl;
      exit(EXIT_SUCCESS);
   }

   if (fout.fail()) 
   {
      cout << "Error opening output Score file output.dat" << endl;
      exit(EXIT_SUCCESS);
   }

   int lineNum = 0, numOfValues, value, NumOfTests;
   int leastScore = 0, SecondleastScore = 0, stdID, TotalScore = 0;

   fin >> ws;              // "eat" up any preceding whitespaces

   while ( ! fin.eof() )  // as long as eof has not been encountered
   {
      lineNum++;
      fin >> value;
      if (lineNum == 1) 
      {

         NumOfTests = value;
         fout << "Maximum number of scores each student can have is " << NumOfTests << "." << endl;

         fout << endl;

         fout << setiosflags (ios::fixed)
            << setw (20)
               << "Student ID"
                  << setw (20)
                  << "Quizzes Taken"
                     << setw (20)
                     << "Quizzes Missed"
                        << setw (20)
                        << "Scores Average"
                           << resetiosflags (ios::fixed)
                           << endl;

         fout << setiosflags (ios::fixed)
            << setw (20)
               << "----------"
                  << setw (20)
                  << "--------------"
                     << setw (20)
                     << "--------------"
                        << setw (20)
                        << "--------------"
                           << resetiosflags (ios::fixed)
                           << endl;

         continue;
      }

      numOfValues = 1;
      stdID = value;

      while ( fin.peek() != '\n' )                     // next character is not "newline"
      {
         if ( isspace(fin.peek()) || fin.peek() == '$') // next character is whitespace
            fin.ignore();                                 // read and discard next character

         else 
         {
            // next character is part of a value
            fin >> value;
            TotalScore += value;

            if (numOfValues == 1) 
            {
               leastScore = value;
               numOfValues++;
               continue;
            }
            if (numOfValues == 2) 
            {
               SecondleastScore = value;
               numOfValues++;
               continue;
            }

            if (SecondleastScore > value) 
            {

               if (leastScore > value) 
               {
                  leastScore = value;
               }
               else 
               {
                  SecondleastScore = value;
               }
            }

            numOfValues++;
         }
      }

      float actualScore = 0, ActualAvg = 0;
      numOfValues--;

      if (numOfValues == NumOfTests) 
      {

         actualScore = TotalScore - leastScore - SecondleastScore;
         ActualAvg = (float) actualScore/(NumOfTests - 2);
         fout << setiosflags (ios::fixed | ios::showpoint)
            << setprecision(1)
               << setw (20)
                  << stdID
                     << setw (20)
                     << numOfValues
                        << setw (20)
                        << (numOfValues - NumOfTests)
                           << setw (20)
                              << ActualAvg
                                 << resetiosflags (ios::fixed)
                                 << endl;

      }
      else if (numOfValues == (NumOfTests - 1)) 
      {

         actualScore = TotalScore - leastScore;
         ActualAvg = (float) actualScore/(NumOfTests - 1);
         fout << setiosflags (ios::fixed | ios::showpoint)
            << setprecision(1)
               << setw (20)
                  << stdID
                     << setw (20)
                     << numOfValues
                        << setw (20)
                        << (NumOfTests - numOfValues)
                           << setw (20)
                              << ActualAvg
                                 << resetiosflags (ios::fixed)
                                 << endl;

      }
      else if (numOfValues <= (NumOfTests - 2)) 
      {

         ActualAvg = (float) TotalScore/(NumOfTests-2);
         fout << setiosflags (ios::fixed | ios::showpoint)
            << setprecision(1)
               << setw (20)
                  << stdID
                     << setw (20)
                     << numOfValues
                        << setw (20)
                        << (NumOfTests - numOfValues)
                           << setw (20)
                              << ActualAvg
                                 << resetiosflags (ios::fixed)
                                 << endl;
      }

      TotalScore = 0;

      fin >> ws;
   }

   fin.close();
   fout.close();
   return EXIT_SUCCESS;
}
 
 

/// Check Input file.

int checkInputFile () 
{

   ifstream fin("./scores.dat", ios::in);

   if ( fin.fail() ) 
   {
      cout << "Error opening input Score file scores.dat" << endl;
      exit(EXIT_SUCCESS);
   }

   fin >> ws;

   int lineNum = 0, Tests = 0,stdID = 0, value, NumOfVal, eolFlag = 0;

   while (!fin.eof()) 
   {
      lineNum++;
      fin >> value;

      if (lineNum == 1) 
      {
         Tests = value;
         NumOfVal = 1;
         while (fin.peek() != '\n') 
         {

            if (isspace (fin.peek())) 
            {
               fin.ignore();
            }
            else 
            {
               NumOfVal++;
            }
         }
         if (NumOfVal != 1) 
         {
            cout << "First line of the input file should contain only the no. of tests." << endl;
            exit (1);
         }
         continue;
      }
      NumOfVal = 0;
      eolFlag = 0;

      while ( fin.peek() != '\n' ) 
      {
         // next character is not "newline"

         if ( isspace(fin.peek()))  // next character is whitespace
            fin.ignore();             // read and discard next character
         else                     // next character is part of a value
         {
            fin >> value;
            NumOfVal++;
            if (value == '$') 
            {
               eolFlag = 1;
               continue;
            }

            if (value < 0 || value > 100 || eolFlag == 1) 
            {
               cout << "Input file contains invalid Student Scores." << endl;
               exit (1);
            }
         }
      }
   }
   fin.close();
   return 1;
}