4

ええと、私は初心者です。コンピューター サイエンス専攻の年です。MovieData構造体の作成時にメンバー変数を初期化できるコンストラクターを持つ構造体を使用する、教科書からの演習を試みていますMovieData 。私のコードは次のようになります。

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

// struct called MovieData
struct MovieData
{
    string title;
    string director;
    unsigned year;
    unsigned running_time;
    double production_cost;
    double first_year_revenue;

    MovieData() // default constructor
    {
        title = "Title";
        director = "Director";
        year = 2009;
        running_time = 90;
        production_cost = 1000000.00;
        first_year_revenue = 1000000.00;
    }
    // Constructor with arguments:
    MovieData(string t, string d, unsigned y, unsigned r, double p, double f)
    {
        title = t;
        director = d;
        year = y;
        running_time = r;
    }
};

// function prototype:
void displayMovieData(MovieData);

// main:
int main()
{
    // declare variables:
    MovieData movie, terminator("Terminator", "James Cameron", 1984, 120, 5000000, 2000000);

    // calling displayMovieData function for movie and terminator
    // so it will display information about the movie:
    displayMovieData(movie);
    displayMovieData(terminator);

    return 0;
}

// displayMovieData function:
// It receives struct MovieData variable as
// an argument and displays that argument's
// movie information to the user.
void displayMovieData(MovieData m)
{
    cout << m.title << endl;
    cout << m.director << endl;
    cout << m.year << endl;
    cout << m.running_time << endl;
    cout << fixed << showpoint << setprecision(2);
    cout << m.production_cost << endl;
    cout << m.first_year_revenue << endl << endl;
}

ここに私が受け取った出力があります:

題名
監督
2009年
90
1000000.00
1000000.00

ターミネーター
ジェームズ・キャメロン
1984年
120
-92559631349317830000000000000000000000000000000000000000000.00
-92559631349317830000000000000000000000000000000000000000000.00

何かキーを押すと続行します 。. .

Microsoft Visual C++ 2008 Express Edition でコンパイル。

私の質問は、これは double データ型のオーバーフローが原因ですか? long double を使用して試してみましたが、同じことが起こります。両方の数値出力が同じであるためproduction_cost、5mil と 2mil を使用しましたが。first_year_revenueデフォルトのコンストラクターを正しく使用すると、1000000 が出力されます。この場合、正しいデータ型を使用していますか? 通貨の数字、ドルとセントなので、2 倍にしたいのです。

助けてくれてありがとう。私の長い質問で申し訳ありません。これは SO に関する私の最初の投稿なので、質問を投稿する正しい形式に関するフィードバックは素晴らしいものになるでしょう。ありがとう!

4

6 に答える 6

8

完全なコードを投稿していただきありがとうございます。問題は明らかです。次の関数が問題です。

MovieData(string t, string d, unsigned y, unsigned r, double p, double f)
{
    title = t;
    director = d;
    year = y;
    running_time = r;
}

次のステートメントを省略しました:

    production_cost = p;
    first_year_revenue = f;

これらのステートメントがないproduction_costfirst_year_revenue、上記のコンストラクターを使用するときに初期化されません。

この演習では、Stack Overflow に質問を投稿するときに使用している正確なコードを投稿する必要があることを強調しています。あなたが投稿したコードの最初のバージョンは異なっており、このバグは含まれていませんでした。

于 2009-11-02T03:37:41.783 に答える
3

コードのコンパイルを停止した間違い (セミコロンの欠落、小文字の m ではなく大文字の M) を修正すると、次のようになります。

#include <iostream>
#include <iomanip>

using namespace std;

struct MovieData
{
    string title;
    string director;
    unsigned year;
    unsigned running_time;
    double production_cost;
    double first_year_revenue;

    MovieData() // My default constructor
    {
        title = "Title";
        director = "Director";
        year = 2009;
        running_time = 90;
        production_cost = 1000000.00; // this one comes out ok.
        first_year_revenue = 1000000.00; // this one comes out ok as well.
    }
    // This is my constructor with arguments:
    MovieData(string t, string d, unsigned y, unsigned r, double p, double f)
    {
        title = t;
        director = d;
        year = y;
        running_time = r;
        production_cost = p;
        first_year_revenue = f;
    }
};

void displayMovieData(MovieData m)
{
    cout << m.title << endl;
    cout << m.director << endl;
    cout << m.year << endl;
    cout << m.running_time;
    cout << fixed << showpoint << setprecision(2);
    cout << m.production_cost << endl;
    cout << m.first_year_revenue << endl << endl;
}

int main()
{
  MovieData terminator(
    "Terminator", "James Cameron", 1984, 120, 5000000, 2000000);
  displayMovieData(terminator);
  return 0;
}

コンパイルして実行しても問題は再現されません...:

$ g++ -Wall --pedantic z.cc
$ ./a.out
Terminator
James Cameron
1984
1205000000.00
2000000.00

$ 

ここで提供したコードを正確にコピーして貼り付け、何が起こるかをお知らせください (また、どのコンパイラ、プラットフォームなどで - 私は MacOSX 10.5 で gcc 4.0.1 を使用しています)。

于 2009-11-02T02:41:28.997 に答える
2

いいえ、映画の収益や制作費が 2 倍の範囲を超えることはありません。

問題は displayMovieData 関数にあると思います。それにコードを投稿できますか?
IIRC では、printf のようなものを呼び出すと、そのように奇妙な値が出力され、single と double の間で混乱する可能性があります。%dまたは、代わりに渡すと%f...

于 2009-11-02T02:25:54.350 に答える
1

ここでの他の回答と同様に、コードは問題ないように見えるため、問題が何であるかはわかりません。ただし、次の宣言を置き換えてみてください。

void displayMovieData(MovieData m)

void displayMovieData(const MovieData &m)

状況が改善するかどうかを確認します。最近の質問を参照してくださいこれら 2 つの宣言の違いの詳細については、

これによってプログラムの動作が変わることはないことを強調しておきますが、コンパイラやランタイム環境にバグがある場合は、上記のコード変更が問題の特定に役立つ可能性があります。

于 2009-11-02T02:47:54.050 に答える
1

あなたの出力はあなたが示すコードと一致しません - あなたの出力があなたが含めたと主張する実行時間の後に '<< endl' を省略しました。これにより、常にデバッグが難しくなります。

これは、G++ 4.0.1 を搭載した MacOS X 10.5.8 (Leopard) で正しく動作するコードです。

#include <string>
using namespace std;

struct MovieData
{
    string title;
    string director;
    unsigned year;
    unsigned running_time;
    double production_cost;
    double first_year_revenue;

    MovieData() // My default constructor
    {
        title = "Title";
        director = "Director";
        year = 2009;
        running_time = 90;
        production_cost = 1000000.00; // this one comes out ok.
        first_year_revenue = 1000000.00; // this one comes out ok as well.
    }
    // This is my constructor with arguments:
    MovieData(string t, string d, unsigned y, unsigned r, double p, double f)
    {
        title = t;
        director = d;
        year = y;
        running_time = r;
        production_cost = p;
        first_year_revenue = f;
    }
};

#include <iostream>
#include <iomanip>
using namespace std;

void displayMovieData(MovieData m)
{
    cout << m.title << endl;
    cout << m.director << endl;
    cout << m.year << endl;
    cout << m.running_time << endl;
    cout << fixed << showpoint << setprecision(2);
    cout << m.production_cost << endl;
    cout << m.first_year_revenue << endl << endl;
}

int main()
{
    MovieData def;
    MovieData terminator("Terminator", "James Cameron", 1984, 120, 5000000, 2000000);
    MovieData terminator2("Terminator 2", "James Cameron", 1984, 120, 5000000.0, 2000000.0);
    displayMovieData(def);
    displayMovieData(terminator);
    displayMovieData(terminator2);
}

私が得る出力は次のとおりです。

Title
Director
2009
90
1000000.00
1000000.00

Terminator
James Cameron
1984
120
5000000.00
2000000.00

Terminator 2
James Cameron
1984
120
5000000.00
2000000.00

私の最高の論文 (上記のデータではサポートされていません) は、コンストラクターへの呼び出しで「int」から「double」への変換が行われていないということですが、それがどのように発生するのか理解できません。

于 2009-11-02T02:49:56.183 に答える
0

数値に .0 を追加して、2 倍にしようとします。integer から double への変換を行おうとすると、混乱する可能性があります。

これは、動作しているデフォルトのコンストラクターにあるものを反映します。

于 2009-11-02T04:18:15.370 に答える