コンパイルしていないC ++構造体...正しく初期化されていませんか?それらを正しく使用していないのですか?

私は、入れ子構造体/構造体を使用しようとしています。数時間の擬似コードと試行の後に、私が思いつく最終結果は動作しないか、コンパイルされません。

私は二つのベクトルAとBを取り、それらを互いに比較したいと思う。私は、ベクトルの開始点と終了点、およびベクトル構造体自体を読み込むためにネストされた構造体を設定しました。だから私は以下のことをさらに間違えているかもしれないと思うが、私は立ち往生している。

    #include 
    #include 
    #include 

    using namespace std;
struct Point   //Reads in three coordinates for point to make a three dimensional vector
{
    double x;
    double y;
    double z;
};
struct MathVector  //Struct for the start and end point of each vector.
{
    Point start;
    Point end;
};
Point ReadPoint()
{
    Point pt;//Letter distinguishes between vector A and vector B, or "letterA" and "letterB"
    double x, y, z;

    cout << "Please input the x-coordinate: " << endl;
    cin >> pt.x;
    cout << "Please input the y-coordinate: " << endl;
    cin >> pt.y;
    cout << "Please input the z-coordinate: " << endl;
    cin >> pt.z;

    return pt;
}
void DotProduct (MathVector letterA, MathVector letterB, double& a_times_b ) //formula to compute orthogonality
{
    a_times_b = (letterA.end.x - letterA.start.x)*(letterB.end.x - letterB.start.x) + (letterA.end.y - letterA.start.y)*(letterB.end.y - letterB.start.y) + (letterA.end.z - letterA.start.z)*(letterB.end.z - letterB.start.z);
}
int main()
{
    MathVector letterA;
    MathVector letterB;
    double a_times_b;

    letterA = ReadPoint();
    letterB = ReadPoint();

    DotProduct (letterA, letterB, a_times_b);

    cout << "The vector " << letterA << " compared with " << letterB << " ";
    if ( a_times_b == 0)
        cout << "is orthoganal." << endl;
    else
        cout << "is not orthoganal." << endl;

    return 0;
}
0
エラーを投稿してください。また、は動作しませんはコンパイルされませんは2種類あります。
追加された 著者 Nawaz,
浮動小数点値を比較する際には細心の注意を払ってください。小さな誤差は計算に入り込み、結果が期待通りではありません。
追加された 著者 Mike Seymour,
ReadPoint() letter をタイプミスで更新しないという事実はありますか?
追加された 著者 Nikolai Fetissov,
みなさんのおかげです!しかしもう1つのことと私は自分の道に... letterA = ReadPoint(); letterB = ReadPoint(); 「letterB = ReadPoint()で 'operator ='が一致しない」と言っています。これはどういう意味ですか?
追加された 著者 alberto roberto,
また、zが明確に使用されているときに、zがReadPointで使用される変数であると言っています。
追加された 著者 alberto roberto,

5 答え

1つの問題は、戻り値の型が Point ReadPoint ですが、 MathVector のインスタンスを返しています。また、最終的に無視する変数への入力を読みます。

ReadPoint は次のように記述する必要があります。

Point ReadPoint()
{
    Point p;
    cout << "Please input the x-coordinate: " << endl;
    cin >> p.x;
    cout << "Please input the y-coordinate: " << endl;
    cin >> p.y;
    cout << "Please input the z-coordinate: " << endl;
    cin >> p.z;
    return p;
}

または少し良いバージョン:

Point ReadPoint()
{
    Point p;
    cout << "Please enter point-coordinate : " << endl;
    cin >> p.x >> p.y >> p.z; //example input : 1 2 3 
    return p;
}

Or, still better is, overload >> operator as:

std::istream & operator>>(std::istream & in, Point & p)
{
    cout << "Please enter point-coordinate : " << endl;
    return cin >> p.x >> p.y >> p.z; //example input : 1 2 3 
}

//Use this as
Point pointA, pointB;
cin >> pointA >> pointB;

今、良いC ++の本を読んでください。あなたが既に 1つを読んでいるなら、本当に良いことを確認してください。以下は、すべてのレベルの本当に良いC ++の本のリストです:

2
追加された
あなたは点と等しいベクトルを設定しようとしていますが、正確に何をすべきかを指定したことはありません。だからコンピュータは分かりません。
追加された 著者 David Schwartz,
ありがとうNawaz ....今のところ、私は高校のクラスより先にスキップするC ++の構造体を学んでいるだけです:)私がコースのユニまたはカレッジでいくつかのプログラミングを取るなら、私は絶対見てみましょう
追加された 著者 alberto roberto,
お手伝いありがとうございます!しかしもう1つのことと私は自分の道に... letterA = ReadPoint(); letterB = ReadPoint(); "letterB = ReadPoint()"の 'operator ='と一致しないと言っています。 "これはどういう意味ですか?
追加された 著者 alberto roberto,
  1. ReadPoint returns letter of type MathVector instead of Point
  2. You haven't overloaded operator << to tell it how to handle MathVector objects
0
追加された
Point ReadPoint()
{
   MathVector letter;//Letter distinguishes between vector A and vector B, or "letterA" and "letterB"
    double x, y, z;

   cout << "Please input the x-coordinate: " << endl;
   cin >> x;
   cout << "Please input the y-coordinate: " << endl;
   cin >> y;
   cout << "Please input the z-coordinate: " << endl;
   cin >> z;

   return letter;

}

あなたは何をしようとしているのか、どのようなエラーがあるのか​​説明していませんでしたが、このコードは no を意味します。 x y z という3つの変数があります。あなたはそれらをユーザから得た値で埋める。次に、それらの変数で何もしないで、 Point を返すと言っても、デフォルトのコンストラクタで作成された MathVector を返します。それはほとんど意味がありません。

0
追加された
さて、 4 の点を読み、2つのベクトルの start end の位置に読み込む必要があります。あなたは決してそれを行うためのコードを書いたことはありません。
追加された 著者 David Schwartz,
私は3次元、x y zを扱うはずのベクトル、Pointを作成しました。その後、ベクトルのSTARTとベクトルのENDがstruct Pointを使用できるように、構造体MathVectorを作成しました。これらのMathVectorのうちの2つは、2つの別々のベクトルを計算に入れるために、 'A'と 'B'として作成されます。
追加された 著者 alberto roberto,

letterA and letterB are of type MathVector

 MathVector letterA;
        MathVector letterB;
        double a_times_b;

        letterA = ReadPoint();
        letterB = ReadPoint();

Point で行っているように、 Mathvector ..を読み取る別のメソッドを作成する必要があります。

and in method ReadPoint

戻り値の型はPointでなければなりません。ポイントを読んでいる場合は、ここで計算を行い、 MathVector オブジェクトのtet startpoint endpoint

0
追加された

'operator ='エラーに一致しない場合は、MathVectorをポイントに割り当てるための関数がないことを意味します。 Pointを返し、返された値をMathVector型の変数に代入するReadPoint()を呼び出しています。コンパイラは自動的に変換機能を作成することはできません。あなたは自分で自分自身を提供しなければなりません。おそらくあなたが意味していたのは

letterA.start = ReadPoint();
letterA.end   = ReadPoint();
0
追加された