構造体 解答ページ | Programming Place Plus 新C++編

トップページ新C++編構造体

このページの概要

このページは、練習問題の解答例や解説のページです。



解答・解説

問題1 (確認★)

四角形の幅と高さを保持する構造体を作ってください。


たとえば次のようにできます。

#include <iostream>

int main()
{
    struct Square {
        int  width;
        int  height;
    };

    Square sq {10, 15};

    std::cout << sq.width << ", " << sq.height << "\n";
}

実行結果:

10, 15

構造体を使うには、まず構造体型の定義を記述します(本編解説)。今回は Square という名前の構造体型にしました。データメンバには幅と高さを表現する width と height を宣言しています。今回は int型を選びましたが、ここは自由にしてください。小数点以下まで表現したければ double型を使うことができます。負数になりえないので unsigned int型にするというのも手ではありますが、不用意に符号無し整数型を持ち出さないほうがいいことは、「符号無し整数」のページで説明したとおりです。

次に、構造体型の変数(構造体変数)を宣言します(本編解説)。基本的にいままでどおりで、型名と変数名、初期化子を書き並べていけばいいです。{} の内側には、データメンバを宣言した順番通りに、初期化子を書けます。今回、{10, 15} としているので、10 が width に、15 が height に与えられます。

データメンバにアクセスするときには、. を使います(本編解説)。

問題2 (確認★)

問題1の構造体型の変数を2つ宣言し、データメンバが同じ値かどうかを比較するプログラムを作成してください。


たとえ型が同じであっても、構造体変数どうしでの比較は直接的には行えません。データメンバを1つ1つ比較していく必要があります(本編解説)。

#include <iostream>

int main()
{
    struct Square {
        int  width;
        int  height;
    };

    Square sq1 {10, 15};
    Square sq2 {20, 15};

    std::cout << std::boolalpha
              << (sq1.width == sq2.width && sq1.height == sq2.height)
              << "\n";
}

実行結果:

false

データメンバを1つ1つ比較するためには、論理AND演算子(&&)を使います。

すること自体は簡単ですが、ミスしやすくもあるので注意しましょう。たとえば、同じ構造体変数どうしで比較してしまうミス(sq1.width == sq1.width)や、比較するデータメンバを誤るミス(sq1.width == sq2.height)、比較していないデータメンバができてしまうミスなどが考えられます。また、あとから構造体型の定義のほうを変更し、データメンバが追加された場合、構造体変数を比較しているコードにも忘れずに追加しなければなりません。

問題3 (基本★)

問題1の構造体型の変数を2つ宣言し、どちらのほうが面積が大きいかを判定するプログラムを作成してください。


面積は、幅と高さを乗算して求められますから、次のように書けます。

#include <iostream>

int main()
{
    struct Square {
        int  width;
        int  height;
    };

    Square sq1 {10, 15};
    Square sq2 {20, 15};

    auto sq1_area = sq1.width * sq1.height;
    auto sq2_area = sq2.width * sq2.height;

    if (sq1_area > sq2_area) {
        std::cout << "sq1 is greater than sq2.\n";
    }
    else if (sq1_area < sq2_area) {
        std::cout << "sq2 is greater than sq1.\n";
    }
    else {
        std::cout << "area of a and b is equal.\n";
    }
}

実行結果:

sq2 is greater than sq1.

問題4 (応用★★)

std::vector に以下のように本のデータが登録されています。標準入力から評価値を入力させ、その評価値以上の本の一覧を出力するプログラムを作成してください。

struct Book {
    std::string    title;
    std::string    author;
    int            price;
    int            evaluate;
};

std::vector<Book> books {
    {"C++ Programming Guide Book", "Thomas Murray", 3500, 5},
    {"C++ Programming Primer", "Sonia Elis", 2200, 3},
    {"C++ Tutorial", "Jack Simon", 2800, 4},
    {"C++ Game Programming", "Richard Bill", 5800, 5},
    {"C++ Reference Book", "Jack Simon", 4000, 2},
};


たとえば、次のようになります。

#include <iostream>
#include <string>
#include <vector>

int main()
{
    struct Book {
        std::string    title;
        std::string    author;
        int            price;
        int            evaluate;
    };

    std::vector<Book> books {
        {"C++ Programming Guide Book", "Thomas Murray", 3500, 5},
        {"C++ Programming Primer", "Sonia Elis", 2200, 3},
        {"C++ Tutorial", "Jack Simon", 2800, 4},
        {"C++ Game Programming", "Richard Bill", 5800, 5},
        {"C++ Reference Book", "Jack Simon", 4000, 2},
    };

    std::cout << "Please enter the evaluate.\n";
    int evaluate {};
    std::cin >> evaluate;

    for (auto& book : books) {
        if (book.evaluate >= evaluate) {
            std::cout << "title: " << book.title << "\n"
                      << "author: " << book.author << "\n"
                      << "price: " << book.price << "\n"
                      << "evaluate: " << book.evaluate << "\n";
        }
    }
}

実行結果:

Please enter the evaluate.
4  <-- 入力した内容
title: C++ Programming Guide Book
author: Thomas Murray
price: 3500
evaluate: 5
title: C++ Tutorial
author: Jack Simon
price: 2800
evaluate: 4
title: C++ Game Programming
author: Richard Bill
price: 5800
evaluate: 5

標準入力から受け取るところはこれまでどおりです。

範囲for文を使って1冊ずつ本のデータを調べていきます。余計なコピーをしないように、変数book は参照型にしています(本編解説)。

特に難しいわけではなく、変数book のデータメンバ evaluate と、標準入力から受け取った値(変数evaluate に格納している)を比較し、該当すれば本のデータを出力するだけです。


参考リンク



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る