我的代码适用于Qt Creator但不适用于Cloud9

时间:2018-04-11 02:52:59

标签: c++ qt-creator cloud9

因此,我创建了一个链接列表,该列表应该从文件中打印出名称,年龄,专业和GPA。

当我在Qt Creator中运行它时似乎正在工作,但是当我尝试在cloud9中运行它时,它似乎没有成功。

例如,findStudent函数找不到学生 - 而是将其作为"未找到学生。"

它似乎也不像我对它进行格式化的方式,节点(名称,年龄,专业,gpa)的所有内容看起来都是在彼此之上打印。

这样做除非我将每个人的信息标记到最右边,但这并不是我想要的,因为最终不会在cloud9之外看起来那么好。

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 Found


Front 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

在cloud9中重新格式化输出:

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 Found


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

1 个答案:

答案 0 :(得分:0)

FindStudent:

有些问题

首先,在评估列表中的名称之前,您要检查当前节点以查看是否在列表末尾。这可能是你的错误。如果列表中只包含一个项目,或者列表末尾的项目begin findStudent将看到节点的链接成员为空并在评估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;

&lt; views&gt; 第三,所有函数都将列表头作为对指针的引用传递。通过指针或引用,但不是两者。改进的功能签名:

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);