質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1978閲覧

授業で扱われたプログラムが理解できません

KeiM

総合スコア8

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

3クリップ

投稿2018/02/12 21:04

授業で他の生徒が書いたプログラムです。私にはまだまだ理解できません。これを紐解いていきたいのですが、まず、3行目の

std::string name;

ってどういう意味ですか?

もし、よろしければ、どなたか全体的な流れを教えて頂けないでしょうか?

class Student{
protected:
std::string name;
int ID;
float gpa;
Location loc;
//int x;
//int y;
public:
Student(std::string name,int ID, float gpa, Location loc);
void Displayinfo();
void set_gpa(float sgpa);
float get_gpa();
float operator -(const& student);
};
class Location{
private:
int x;
int y;
public:
void setx(int x);
void sety(int y);
int getx();
int gety();
};
void Student::set_gpa(float sgpa){
gpa = spga;
}
class GradStudent: public Student{
private:
bool isOnProbation;
public:
};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/02/12 22:34

どのような授業なのでしょうか? また、C++についてはどの程度理解していますか?
KeiM

2018/02/12 22:53

多分、CやC++の基本的な知識・経験がある上で、オブジェクト指向のプログラミングを学ぶという趣旨の授業だと思います。何しろアメリカの大学の授業のため、英語なので、正直ちんぷんかんぷんです。というのも、CもC++も初心者レベルの知識しかありません。
episteme

2018/02/12 23:04

あなたのいう初心者レベルってどの程度? これ”初心者のコード”やで。
KeiM

2018/02/12 23:07

そうなんですか!?プログラムも英語もまだまだなので、何が何だかという状態です。
KeiM

2018/02/12 23:09

float operator -(const& student); の、"-" や"const&"の意味もわからないのですが、教えて頂けませんでしょうか?
episteme

2018/02/12 23:11

あちこちにミスがある。コンパイルできるか確かめられてないコードを真に受けちゃダメだよー
guest

回答5

0

何のために外国で英語の授業を受けているのか思い出してみてください。
日本人に日本語で聞いてどうしますか?

「友達に聞く」が正解です。

投稿2018/02/13 00:10

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

std::string name; ってどういう意味ですか?

これが char name[20]; だったらわかる?
Student の属性である名前(文字列)を格納する領域をcharで20文字分確保し、それをnameと命名したってことね。

それとおんなじ。文字列を表現するクラス std::string 型のメンバ変数をStudentに与え、nameと命名してる。
※ std::stringは標準C++ライブラリが提供する文字列クラス。

どなたか全体的な流れを教えて頂けないでしょうか?

これまだ書きかけだから全体的な流れは見えませんねぇ...

[おまけ]

float operator -(const& student); の、"-" や"const&"の意味もわからないのですが、教えて頂けませんでしょうか

まずこれマチガイ。正しくは float operator-(const Student& student) const だろうきっと。
クラスに-演算子を定義している。これにより、

C++

1Student a("alice", 1234, 12.3, Location(12,34)); 2Student b("bob", 5678, 45.6, Localtion(56,78)); 3float value = a - b; // **** こんな演算ができる ***

※ 学生から学生を引くとは何を意味するのかわからんけどね。
※ const& :教科書読め。

投稿2018/02/12 22:28

編集2018/02/12 23:29
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiM

2018/02/12 23:05

ご説明ありがとうございます。理解できたと思います。
episteme

2018/02/12 23:08

お役に立ててなにより。std::string name; の数行下にある Localtion loc; と同じや。
KeiM

2018/02/12 23:12

"string" は、c++も文字列の型で、"Location"は、自分で定義したクラスという認識であってますか?
episteme

2018/02/12 23:17

そんなとこです。 std::stringはコンパイラに標準でついてくる(ライブラリが提供する)出来合いの文字列クラス。 出来合いのが見つからんかったら仕方なく自分で作らんならん、そのひとつがLocationだしStudent/GradStudent。
KeiM

2018/02/13 00:27

合ってたようで嬉しいです。ありがとうございます。
KeiM

2018/02/13 03:12

float operator-(const Student& student) const これは、Student a - Student bの演算を行うために、- 演算子をStudentクラス内においてのみ、異なる動作をするように定議しているのだと思いますが、なぜカッコの中がこのような記述になるのでしょうか? また、最後のconstはなぜ必要なのでしょうか?
episteme

2018/02/13 08:50

教科書読みなさい。
guest

0

ベストアンサー

そこそこマジメに手直ししてみた。

C++

1#include <string> 2#include <iostream> 3 4class Location{ 5private: 6 int x_; 7 int y_; 8public: 9 Location(int x, int y) : x_(x), y_(y) {} 10 Location(const Location& loc) : x_(loc.x_), y_(loc.y_) {} 11 Location& operator=(const Location& rhs) { x_ = rhs.x_; y_ = rhs.y_; return *this; } 12 void setx(int x) { x_ = x; } 13 void sety(int y) { y_ = y; } 14 int getx() const { return x_; } 15 int gety() const { return y_; } 16}; 17 18// Locationの比較: a == b 19inline bool operator==(const Location& a, const Location& b) { 20 return a.getx() == b.getx() && a.gety() == b.gety(); 21} 22 23// Locationの比較: a != b 24inline bool operator!=(const Location& a, const Location& b) { 25 return !(a == b); 26} 27 28// Locationの出力: stream << loc 29std::ostream& operator<<(std::ostream& stream, const Location& loc) { 30 return stream << '(' << loc.getx() << ',' << loc.gety() << ')'; 31} 32 33class Student { 34protected: 35 std::string name_; 36 int id_; 37 float gpa_; 38 Location loc_; 39public: 40 Student(const std::string& name,int id, float gpa, Location loc) 41 : name_(name), id_(id), gpa_(gpa), loc_(loc) {} 42 void print_to(std::ostream& stream) const; 43 void set_gpa(float gpa) { gpa_ = gpa; } 44 float get_gpa() const { return gpa_; } 45}; 46 47void Student::print_to(std::ostream& stream) const { 48 stream << name_ << " #" << id_ << " ?" << gpa_ << " @" << loc_; 49} 50 51// Studentの差(gpaの差) 52inline float operator-(const Student& a, const Student& b) { 53 return a.get_gpa() - b.get_gpa(); 54} 55 56inline std::ostream& operator<<(std::ostream& stream, const Student& stu) { 57 stu.print_to(stream); return stream; 58} 59 60/* 61 * おためし 62 */ 63int main() { 64 using namespace std; 65 Student a("alice", 123, 56.7f, Location(12,34)); 66 Student b("bob", 456, 67.8f, Location(23,45)); 67 cout << a << endl; 68 cout << b << endl; 69 cout << "a - b = " << a - b << endl; 70} 71 72/* 実行結果 73alice #123 ?56.7 @(12,34) 74bob #456 ?67.8 @(23,45) 75a - b = -11.1 76*/

投稿2018/02/13 23:13

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiM

2018/02/14 23:13

遅くなってすみません。 ありがとうございます。 お手本となるプログラムがあると大変ありがたいです。 じっくり勉強したいと思います。
episteme

2018/02/14 23:40

注: - Locationには==/!=による比較を定義した。 - Location/Studentは ostream に出力できるよう operator << を定義した。 - Student - Student はメンバ関数ではなく、グローバルな二項演算:'-' を定義することで実現した。 - 各メンバ関数は必要に応じ適切に const 修飾した。
guest

0

epistemeさんの言うようにクラス定義(しかも中途半端)だけなので処理は分かりません。
解釈としては、以下のようになるかも・・・こちらも中途半端ですが^^;

c++

1// 生徒の情報 2class Student { 3 protected: 4 std::string name; // 名前 5 int ID; // 6 float gpa; // 成績評価値 7 Location loc; // 位置(席かな?) 8 // int x; 9 // int y; 10 public: 11 Student(std::string name, int ID, float gpa, Location loc); // コンストラクタ 12 void Displayinfo(); // 生徒の情報表示 13 void set_gpa(float sgpa); // 成績評価値の設定 14 float get_gpa(); // 成績評価値の読出 15 float operator-(const& student); // -演算(欠席の時?) 16}; 17

投稿2018/02/12 23:16

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiM

2018/02/12 23:30

ありがとうございます。set関数とget関数というのも、まだ理解出来ていないのですが、これらは事前に定義した変数(gpa)に対して、set_やget_を頭につける事で、機能する特別な関数なのでしょうか?
episteme

2018/02/12 23:41 編集

違う。get/set/_に特別な意味はない。seisekiwokaesu() でもいいのよ。
KeiM

2018/02/13 00:27

特別なものではないんですね。勘違いしていました。
cateye

2018/02/13 09:21 編集

欠席の時・・・ではないようですね。floatなので、評価値の差分を取り出すんだと思います。(推測) なので、float value = a - b;は、生徒aと生徒bの評価値の差分を取り出しているだと思います。 operator-(const& student);は、自分自身(a)と対象とする生徒(b)の差分。constがつくのは渡されたクラス(b)を“変更しない”と言うことです。 [追記] 「2項演算子のオーバーロードは、演算子の右辺が引数として渡され、左辺のオブジェクトのオーバーロードした演算子が呼び出される。 例えば、data = obj1 + obj2;の時は、 data = obj1.+(obj2);」・・・http://www.booran.com/menu/cplus/ope_overload.html (2項演算子のオーバーロード)から引用
guest

0

まず見やすくインデントをつけましょう。

そしてstd::string nameはメンバ変数定義です。stdという名前空間の中のクラスstringに属するオブジェクトnameを定義します。ちなみにstringは文字列のために使用します。

投稿2018/02/12 21:53

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問