views:

155

answers:

2

I have an issue with my C++ code for college. I can't seem to understand why my sRecSort() method isn't working.

Any help? This is really confusing me!

#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;

void sRecSort(string  n[], int s[], string e[], int len){
 for (int i = 0; i < len; i++){
  for (int j = 1; j < len; j++){
   if (s[j] < s[i]){
    string tempName = " ";
    string tempName2 = " ";
    int tempGrade,tempGrade2;
    string tempEmail = " ";
    string tempEmail2 = " ";
    tempName = n[i];
    tempName2 = n[j];
    tempGrade = s[i];
    tempGrade2 = s[j];
    tempEmail = e[i];
    tempEmail2 = e[j];

    s[i] = tempGrade2;
    s[j] = tempGrade;
    n[i] = tempName2;
    n[j] = tempName;
    e[i] = tempEmail2;
    e[j] = tempEmail;
   }
  }
 }
}
void printLowestRecord(char inFileName[]){
 string tempSubString = " ";
 string names[12] = {" "};
 int grades[12] = {0};
 string emails[12] = {""};
 int firstSpace = -1;
 int secondSpace = -1;
 ifstream inputMe(inFileName);
 while (!inputMe.eof()){
  for (int i = 0; i < 12; i++){
   getline(inputMe, tempSubString);
   for (int w = 0; w < strlen(tempSubString.c_str()); w++){
    if (tempSubString[w] != ' '){
     continue;
    }
    else{
     if (firstSpace == -1){
      firstSpace = w;
     }
     else if (firstSpace != -1 && secondSpace == -1){
      secondSpace = w;
      names[i] = tempSubString.substr(0, firstSpace);
      grades[i] = atoi((tempSubString.substr(firstSpace + 1, secondSpace - (firstSpace + 1))).c_str());
      emails[i] = tempSubString.substr(secondSpace + 1, tempSubString.length() - (secondSpace + 1));
      break;

     }
    }
   }
   firstSpace = -1;
   secondSpace = -1;
  }
 }

 sRecSort(names,grades,emails,12);
    cout << names[0] << " " << grades[0] << " " << emails[0] << endl;
 inputMe.close();
}

void sortFileRecords(char inFileName[], char outFileName[]){
 ifstream inputFile(inFileName);
 ofstream outputFile(outFileName);
 string tempSubString = " ";
 string names[12] = {" "};
 int grades[12] = {0};
 string emails[12] = {" "};
 int firstSpace = -1;
 int secondSpace = -1;
 while (!inputFile.eof()){
  for (int i = 0; i < 12; i++){
   getline(inputFile, tempSubString);
   for (int w = 0; w < strlen(tempSubString.c_str()); w++){
    if (tempSubString[w] != ' '){
     continue;
    }
    else{
     if (firstSpace == -1){
      firstSpace = w;
     }
     else if (firstSpace != -1 && secondSpace == -1){
      secondSpace = w;
      names[i] = tempSubString.substr(0, firstSpace);
      grades[i] = atoi((tempSubString.substr(firstSpace + 1, secondSpace - (firstSpace + 1))).c_str());
      emails[i] = tempSubString.substr(secondSpace + 1, tempSubString.length() - (secondSpace + 1));
      break;
     }
    }
   }
   firstSpace = -1;
   secondSpace = -1;
  }
 }
 int tempSmallest = grades[0];
 int idxCatch = 0;
 for (int x = 1; x < 12; x++){
  if (grades[x] < tempSmallest){
   tempSmallest = grades[x];
   idxCatch = x;
  }
 }

 for (int e = 0; e < 12; e++){
  cout << names[e] << " " << grades[e] << " " << emails[e] << endl;
 }
 //string tmpStringForInt = " ";
 //stringstream tmpSS;
 /*for (int q = 0; q < 12; q++){
  tmpSS << grades[q];
  tmpStringForInt = tmpSS.str();
  outputFile << names[q] << " " << tmpStringForInt << " " << emails[q] << endl;
 }*/
 inputFile.close();
 outputFile.close();
}

int main (int argc, char * const argv[]) {
 printLowestRecord("gradebook.txt");
 sortFileRecords("gradebook.txt", "sortedGradebook.txt");
    return 0;
}
+2  A: 

Okay, the problem is in the inner loop condition. Can't tell you where exactly -- that's a homework.

 for (int i = 0; i < len; i++){
  for (int j = 1; j < len; j++){  // <--- this line is wrong

The first element of your "sorted" array will correctly be the lowest. But the others...

P.S. Irrelevant to the problem, but, please, read a chapter about structures in your C++ book.

P.P.S. You have chosen the worst sorting algorithm I could possibly imagine. Try "Bubble sort", at least.

Pavel Shved
Actually, OP mentioned in a comment that he is supposed to use Selection Sort (it is sooo easy nowadays to simply go to the Wikipedia and either copy ready-made source, or implement the pseudo-code - although for educational purposes I'd suggest trying to understand the algorithm and implement it yourself, without looking at any code).
UncleBens
Thank you, I didn't know the name of "selection sort", so I proposed Bubble sort instead :). But the algorithm I see behind the errors is actually **worse** than selection sort.
Pavel Shved
+4  A: 

Your algorithm is busted, Pavel pointed you in the right direction, and Sam gave you a good alternative.

Your real problem, however, is that you didn't approach the problem in a systematic manner, solving the smaller, simpler problems before moving on to the larger ones. You should have first written a simple sort algorithm to sort a single array, along with a unit test program them exercised the code. Next you should have moved to multiple arrays as you have (or, more correctly, structures) and a unit test that proved the thing still worked. Continue in this manner until you've built a system that works and does all you want.

Welcome to the Software Development Process.

jfawcett