Мой код работает в Qt Creator, но не в Cloud9

Итак, я создал связанный список, который должен распечатать имя, возраст, майор и GPA из файла.

Кажется, он работает, когда я запускаю его в Qt Creator, но когда я пытаюсь запустить его в облаке 9, кажется, что он не работает.

Например, функция findStudent не находит ученика — вместо этого она выглядит как «ученик не найден».

Кажется, мне не нравится то, как я его отформатировал, все, начиная с узлов (name, age, major, gpa), печатается поверх друг друга.

Он делает это до тех пор, пока я не перенесу информацию о каждом из них в крайнее правое положение, но это не совсем то, что я хочу, так как в итоге это выглядит не так хорошо за пределами облака9.

studentlist.h:

#ifndef STUDENTLIST_H
#define STUDENTLIST_H
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>

using namespace std;

struct StudentNode{
string name;
int age;
string major;
double gpa;
StudentNode *link;
};

void createLinkedList(StudentNode *&head);
void findStudent(StudentNode *&head, string find);
void removeStudent(StudentNode *&head);
double calculateGPA(StudentNode *&head);
void printList(StudentNode *&head);#endif // STUDENTLIST_H

studentlist.cpp:

#include "studentlist.h"
void createLinkedList(StudentNode *&head){
StudentNode *last = NULL;
StudentNode *newNode = NULL;

fstream inFile;

inFile.open("inFile.txt");

if (inFile.fail()){

cout << "file failed to open" << endl;
exit(1);
}
else{

string newLine;

getline(inFile, newLine);
newNode = new StudentNode;
getline(inFile, newNode->name);
inFile >> newNode->age;
getline(inFile, newLine);
getline(inFile,newNode->major);
inFile >> newNode->gpa;
newNode->link = NULL;
head = newNode;
last = newNode;

while(!inFile.eof()){
getline(inFile, newLine);
getline(inFile, newLine);
newNode = new StudentNode;
getline(inFile, newNode->name);
inFile >> newNode->age;
getline(inFile, newLine);
getline(inFile,newNode->major);
inFile >> newNode->gpa;
newNode->link = head;
head = newNode;
}

}

inFile.close();
}

void findStudent(StudentNode *&head, string find){

StudentNode *current = head;

if(current->link ==  NULL){
cout << "Student Not Found" << endl;
}
else if(current->name == find){
cout << "Student Found:" << endl;
cout <<left<< setw(15);
cout <<current->name <<setw(7);
cout << current->age<<setw(15);
cout << current->major << setw(4);
cout << current->gpa;
}
else{
findStudent(current->link, find);
}
}

void removeStudent(StudentNode *&head){
StudentNode *temp_ptr;

temp_ptr = head->link;

cout << "Front Node Deleted:" << endl;

cout << left << setw(15);
cout << "Name" <<setw(7) << "Age" <<setw(15)
<< "Major" <<setw(4) << "GPA" <<setw(15) << endl;

cout <<head->name <<setw(7);
cout << head->age<<setw(15);
cout << head->major << setw(4);
cout << head->gpa;

delete head;

head = temp_ptr;

temp_ptr = NULL;
}

double calculateGPA(StudentNode *&head){

StudentNode *current = head;
double calculatedGPA;
int num_students=0;

while(current!= NULL){

calculatedGPA += current->gpa;
current = current->link;
num_students++;
}

cout << fixed << setw(3) << setprecision(2);
return calculatedGPA/num_students;
}

void printList(StudentNode *&head){
StudentNode *current = head;

cout << left << setw(15) << "Name"<<setw(7)<<"Age" << setw(15)<< "Major"<< setw(7) << "GPA" << endl;while(current!= NULL){

cout << setw(15) << current->name<< setw(7);
cout << current->age << setw(15);
cout << current->major << setw(7);
cout << current->gpa << endl;

current = current->link;
}
}

main.cpp:

#include <iostream>
#include  "studentlist.h"
using namespace std;

int main(int argc, char *argv[])
{
StudentNode *head;

createLinkedList(head);

printList(head);

cout << endl;
findStudent(head, "Anna White");
cout << endl << endl;

removeStudent(head);
cout << endl << endl;

cout << "Updated Student List: " << endl;
printList(head);
cout << endl;

cout << "GPA: " << calculateGPA(head) << endl;

return 0;
}

Выход в QT:

Name           Age    Major          GPA
Paul Johnson   18     Physics        3.7
Anna White     19     English        3.2
John Smith     20     Math           3.5
Anthony Rogers 21     Art            3.1
Cynthia Morris 24     History        3.6

Student Found:
Anna White     19     English        3.2

Front Node Deleted:
Name           Age    Major          GPA
Paul Johnson   18     Physics        3.7

Updated Student List:
Name           Age    Major          GPA
Anna White     19     English        3.2
John Smith     20     Math           3.5
Anthony Rogers 21     Art            3.1
Cynthia Morris 24     History        3.6

GPA: 3.35
Press <RETURN> to close this window...

вывод в Cloud9 без переформатирования:

Name           Age    Major          GPA
3.7    cs
3.2    lish
3.5
3.1
3.6

Student Not FoundFront Node Deleted:
Name           Age    Major          GPA
3.7 ysics

Updated Student List:
Name           Age    Major          GPA
3.2    lish
3.5
3.1
3.6

GPA: 3.35

переформатировал вывод в облаке9:

Name            Age     Major           GPA
Paul Johnson    18      Physics         3.7
Anna White      19      English         3.2
John Smith      20      Math            3.5
Anthony Rogers  21      Art             3.1
Cynthia Morris  24      History         3.6

Student Not FoundFront Node Deleted:
Name            Age     Major           GPA
Paul Johnson    18      Physics         3.7

Updated Student List:
Name            Age     Major           GPA
Anna White      19      English         3.2
John Smith      20      Math            3.5
Anthony Rogers  21      Art             3.1
Cynthia Morris  24      History         3.6

GPA: 3.35

0

Решение

Несколько вещей не так с FindStudent:

Во-первых, вы проверяете текущий узел, чтобы увидеть, находитесь ли вы в конце списка, прежде чем оценивать имя в списке. Это, вероятно, ваша ошибка. Если в списке содержится ровно один элемент, или искомый элемент находится в конце списка, findStudent увидит, что элемент ссылки узла имеет значение null и вернется перед оценкой current->name==find

Во-вторых, findStudent является рекурсивным Если список был достаточно большим, findStudent создаст переполнение стека. (И ваша программа зависнет).

Ваш код с исправлением:

StudentNode* findStudent(StudentNode *head, const string& find) {
StudentNode *current = head;

while ((current != NULL) && (current->name != find)) {
current = current->link;
}

if (current != NULL) {
cout << "Student Found:" << endl;
cout <<left<< setw(15);
cout <<current->name <<setw(7);
cout << current->age<<setw(15);
cout << current->major << setw(4);
cout << current->gpa;
}
else {
cout "Student not found" << endl;
}

return current;
}

Еще одна ошибка у вас есть:

double calculateGPA(StudentNode *&head){

StudentNode *current = head;
double calculatedGPA;  // UNINITIALIZED VARIABLE!
int num_students=0;

while(current!= NULL){

calculatedGPA += current->gpa;

Убедитесь, что вы инициализируете caculatedGPA в 0

    double calculatedGPA = 0;

<мнение> В-третьих, все ваши функции имеют заголовок списка, который передается как ссылка на указатель. Передача указателем или ссылкой, но не обоими. Улучшена функция подписи:

StudentNode* createLinkedList();
StudentNode* findStudent(const string& find);
StudentNode* removeStudent(StudentNode *head); // removes the head and returns the list's new head:

double calculateGPA(StudentNode* head);
void printList(StudentNode* head);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector