2016-04-26 8 views
-2

最近私のC++クラスでは、ポインタとクラスについて学習しました。クラスポインタのユニット化ローカル変数

私はclass Studentのプログラムを作ろうとしています。これは、各生徒に名前とテストのスコアを与えることを指します。

名前とテストスコアの両方を入力した後、ソートされ、次に高い順に並べられます。

私はすべての構文が正しいと信じていますが、私はまだ学んでいます。私が抱えている問題は、初めてクラスを使用するときに、初期化されていないローカル変数エラーが発生することです。

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <array> 
using namespace std; 

class Student { 
private: 
    double score; 
    string name; 
public: 
    void setScore(double a) { 
     score = a; 
    } 
    double getScore() { 
     return score; 
    } 
    void setName(string b) { 
     name = b; 
    } 
    string getName() { 
     return name; 
    } 
}; 

void sorting(Student*, int); 

int main() 
{ 
    Student *students; 
    string name; 
    int score; 
    int *count; 
    count = new int; 
    cout << "How many students? "; 
    cin >> *count; 
    while (*count <= 0) { 
     cout << "ERROR: The number of students must be greater than 0.\n"; 
     cin >> *count; 
    } 
    for (int i = 0; i < *count; i++) { 
     cout << "Please enter the students name: "; 
     cin >> name; 
     students[i].setName(name); 
     cout << "Please enter " << students[i].getName() << "'s score: "; 
     cin >> score; 
     while (score < 0) { 
      cout << "ERROR: Score must be a positive number.\n"; 
      cin >> score; 
     } 
     students[i].setScore(score); 
    } 
    sorting(students, *count); 
    for (int i = 0; i < *count; i++) { 
     cout << students[i].getName() << ": " << students[i].getScore() << endl; 
    } 
    system("PAUSE"); 
    return 0; 
} 

void sorting(Student *s, int size) { 
    for (int i = 0; i < size; i++) { 
     for (int j = i; j < size; j++) { 
      if (s[j].getScore() > s[(j + 1)].getScore()) { 
       int tmp = s[(j + 1)].getScore(); 
       s[(j + 1)].setScore(s[j].getScore()); 
       s[j].setScore(tmp); 
       string tmp1 = s[(j + 1)].getName(); 
       s[(j + 1)].setName(s[j].getName()); 
       s[j].setName(tmp1); 
      } 
     } 
    } 
} 
+2

あなたの 'students'は' Student'へのポインタです。 'students = new Student [count];'を使って 'count'を知ったら配列にしてください。 –

+5

'count = new int;'を実行する必要はありません。単に 'int count'と宣言してください。 – Sean

+2

'count = new int;' - このようなコードを書くと、あなたやあなたの先生がポインタの必要条件を使いこなしてしまいました。また、彼らは 'delete'を教えていませんでしたか? – PaulMcKenzie

答えて

1

まず第一に、あなたのStudentクラスは、このように単純化することができます。

struct Student { 
    double score; 
    std::string name; 
}; 

アクセサは絶対に何もしないので。 using namespace std is considered a bad practiceのように接頭辞std::も追加しました。

、代わりに学生を格納するためのポインタを使用しての、vectorを含めて、それを使用します。

std::cout << "How many students? "; 
int count; 
std::cin >> count; 

std::vector<Student> students(count); 

ロードルーチンもaccesorsの不在与え簡素化することができます。

for (auto& student : students) { 
    std::cout << "Please enter the students name: "; 
    std::cin >> student.name; 
    std::cout << "Please enter " << student.name << "'s score: "; 
    std::cin >> student.score; 
    while (score < 0) { 
     std::cout << "ERROR: Score must be a positive number.\n"; 
     std::cin >> student.score; 
    } 
} 

そして、実際にあなたがそれを持っていれば、それをistream& operator>>(istream&, Student&)に入れて、それを以下に減らすことができます:

std::copy_n(std::istream_iterator<Student>(std::cin), students.size(), students.begin()); 

一時変数をもう使用する必要がなくなります(使用する場合でも、使用の直前にと定義する必要があります。)。

最後に、ソートルーチンがあります。

std::sort(
    begin(students), 
    end(students), 
    [](Student const& a, Student const& b) { return b.score < a.score; } 
); 

は、あなたが自分自身をソートルーチンを作成することを主張した場合、少なくともstd::swapを使用します。まず第一に、あなたは、単にコンパレータを提供する場合、あなたが代わりに使用することができますstd::sortがあります。

関連する問題