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

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

ただいまの
回答率

90.47%

  • C++

    3593questions

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

ピラミッド

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,230

ryohasegawa

score 116

解決しました。プログラムは以下です。アドバイスをくださった方ありがとうございました。とても感謝しています。

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    int x;
    cout << "入力した数の応じてピラミッドを作ります。\n";//プログラムの説明

    do {                                                //繰り返し開始
        cout << "数字を入力してください。";                //入力を促す
        cin >> x;                                        //入力してもらう
    } while (x <= 0);                                    //入力した数字が1より大きければループからぬけ出す

    for (int i = 1; i <= x; i++) {                        //周回(改行)のfor文
        for (int j = 0; j <= x - 1 - i; j++)            //空白を作る
            cout << "_";
        for (int t = 1; t <= i * 2 - 1 ; t++)            //ピラミッドを作る
            cout << "*";
        cout << "\n";}                                    //改行

    ::system("pause");                                    //実行結果をすぐに消さないようにする
}

============================================================
追加2少しアドバイスをもらって、改行をするたびにスペースが1つ減り、☆が2つずつ増えているのがわかりあした。
そこでプログラムを書いてみたのですが、毎回空欄が生成されます。これはどうすればいいでしょうか?

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    int x;
    cout << "入力した数の応じてピラミッドを作ります。\n";

    do {
        cout << "数字を入力してください。";
        cin >> x;
    } while (x <= 0);
    int q = x;

    for (int i = 0; i <= x; i++) {
        for (int t = 1; t <= i * 2 - 1 ; t++){
            for (int j = 0; j <= q - 1; j++)
                cout << "_";
            cout << "*";
        }
        cout << "\n";
        q--;

    }::system("pause");
}

======================以前========================

追加です。参考にさせてもらって、じぶんなりに作ってみたんですが、実行すると一行目は入力した数よりひとつ少なく空欄(_)は入り一つ*が入って改行すると成功するのですが、2行目のはじめの空欄を一つ減らしたあとから、ズレが生じます。
この解決はどうすればいいのですか?

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    int x;
    cout << "入力した数の応じてピラミッドを作ります。\n";

    do {
        cout << "数字を入力してください。";
        cin >> x;
    } while (x <= 0);
    x -= 1;
    int q = x;

    cout << x << "\n";

    for (int i = 0; i <= x; i++) {
        for (int t = 0; t <= i; t++){
            for (int j = 1; j <= q - 1; j++)
                cout << "_";
            cout << "*";
        }
        cout << "\n";
        q--;
    }::system("pause");
}

=====================以前==========================

入力した数のピラミッドを作る問題を説いています。
そこでfor文を使ってやるのですがわかりません。
回答を教えて下さい。

for (int i = 1; i <= x; i += 2) {
        for (int t = 1; t <= i; t++){
            for (int j = 1; j <= q - 1; j++) {
                cout << "_";
                q--;
            }
            cout << "*";
        }
        cout << "\n";
    }


これを考えたのですが、うまく行きません。
それと、コマンド画面が表示された時にCtrl+F5を押しているんですが画面がすぐに閉じてしまいます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

こんにちは。

頭休めに作ってみました。起動したら入力待ちになるので、ピラミッドの高さを入力してEnterを押して下さい。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    unsigned h;
    cin >> h;
    for (unsigned i=0; i < h; ++i)
        cout << string(h-i-1, ' ') << string(i*2+1, '*') << "\n";
    return 0;
}

それと、コマンド画面が表示された時にCtrl+F5を押しているんですが画面がすぐに閉じてしまいます。

Visual Studioの編集画面(プログラムを開始する前)の時にCtrl+F5を押して下さい。
なお、デバッグモード実行ではないので注意です。(ブレークを設定していても止まりません。)


この問題ってときどき出てくるようですが、何かの問題なのでしょうか?
下記もありました。
C++ ピラミッド

因みに、上記も「c言語 while文で直角三角形を*で描く」も求めているものは中央に山があるピラミッドです。
teratailの仕様でベタ書きだとインデントつけてもそれが全て無視されるのです。
3連のバッククォーテーション・マークで囲めば良いのですが、なかなか気が付かない人が多いのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 18:50

    柴田望洋さんのC++のテキストのfor文の問題で、左寄せのピラミッド

    **
    ***
    ****
    このような感じや
      *
     ***
    *****
    このようなピラミッドなどの問題が出題されるんです。
    この4月から高校生の自分にはまだ早いのでしょうか?w

    キャンセル

  • 2016/04/14 18:54

    なるほど、教えてくれてありがとう。
    決して早くないと思いますよ。頑張って下さい。

    キャンセル

  • 2016/04/14 19:02

    実用的じゃないので授業の宿題のような気がしますね。そういう意味では答えを教えるのはあまりよろしくないかも(笑)

    キャンセル

  • 2016/04/14 19:24

    PineMatsuさん。
    真正面からの「回答を教えて下さい。」がなんとなく好ましかったのでつい。

    キャンセル

  • 2016/04/14 19:26

    追加させてもらったことがあるので、お願いします

    キャンセル

  • 2016/04/14 19:40

    考え方を整理する必要がありそうです。
    まず、手で実際に書いてみると良いかも知れません。
    例えば5と入力した時の正解はなんでしょう?

    ____*
    ___***
    __*****
    _*******
    *********

    それとも、これとは異なるイメージでしょうか?
    ____*
    ___*_*
    __*___*
    _*_____*
    *_______*

    どうもこの2つがごっちゃになってしまってないでしょうか?

    どちらか決めて、それぞれの行毎に_を出力する回数と*を出力する回数を書いてみてください。
    そして、その数字を発生できるようにfor文の構成を考えてみて下さい。

    キャンセル

  • 2016/04/14 20:30

    ちなみにピラミッド問題はjavaでも見たことがあります。
    制御構文の学習にちょうどいいのではないかと。

    キャンセル

  • 2016/04/14 21:35

    > 制御構文の学習にちょうどいいのではないかと。

    なるほど。確かにそうですね。

    キャンセル

  • 2016/04/14 22:31

    ____*
    ___***
    __*****
    _*******
    *********
    これをしたいのですが、紙に書いて考えたけっか、下の
    ____*
    ___*_*
    __*___*
    _*_____*
    *_______*
    を考えているように見えたのかもしれません。

    キャンセル

  • 2016/04/14 22:45

    例えば5の時の_と*の数を数えてみてください。
        _ *
    1行目 4 1
    2行目 3 3
    3行目 2 5
    4行目 2 7
    5行目 0 9

    何か見えてきません?

    また、下記では「_が幾つかと*(例えば__*)」が複数出力されますよ。
    (例えば__*__*)

    for (int t = 0; t <= i; t++){
     for (int j = 1; j <= q - 1; j++)
      cout << "_";
     cout << "*";
    }

    キャンセル

  • 2016/04/14 23:13 編集

    自分で考えたのは、全体の周回(改行の回数を☆にプラスしていけばいいんですかね?)
    そういう問題ではないですかね?
    自分の頭がおかしくなってきましたw

    キャンセル

  • 2016/04/14 23:23

    アドバイスをもらいプログラムを作ってみました。
    すると少し近づきました。
    ありがとうございます。
    あともう少しふんばらないと行けないみたいです。

    キャンセル

  • 2016/04/14 23:27

    プログラミングの世界へようこそ!!
    後少しのようですね。頑張って下さい。

    キャンセル

  • 2016/04/14 23:36

    毎回空白が作成されてしまうんですがなぜでしょう?
    一度初期化されているのでしょうか?

    キャンセル

  • 2016/04/15 00:07

    A for (int t = 1; t <= i * 2 - 1 ; t++){
    AB for (int j = 0; j <= q - 1; j++)
    AB  cout << "_";
    A  cout << "*";
    A }

    最初のfor (int t = 1;...のループは行頭にAをつけた範囲を繰り返し実行します。
    次のfor (int j = 0;...のループは次にBをつけた範囲を繰り返し実行します。
    5を入力した場合、2行目ではi=2、q=3になってますね。
    すると、Aのループはfor (int t = 1; t <= 3; t++)となるので3回実行します。
    そして、Bのループはfor(int j =0; j <= 2; j++)となるので3回実行します。
    その結果、___*___*___*と出力されます。

    ループの形を変えて下記のようにしたら、___***と出力されるようになりますよ。

    B for (int j = 0; j <= q - 1; j++)
    B  cout << "_";
    A for (int t = 1; t <= i * 2 - 1 ; t++){
    A  cout << "*";
    A }

    キャンセル

  • 2016/04/15 00:43

    解決できました!
    助かりました。

    キャンセル

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 16:56

    左端に寄せてのピラミッドを作るんじゃなく、中央揃えのピラミッドを作りたいんです。

    キャンセル

  • 2016/04/14 21:14

    「中央揃えのピラミッドを作りたい」←そこを考えないとだめなのでは?>ryohasegawaさん

    キャンセル

0

これを考えたのですが、うまく行きません。
それと、コマンド画面が表示された時にCtrl+F5を押しているんですが画面がすぐに閉じてしまいます。

main()関数の最後 return 0; で抜ける前に、

::system("pause");

を入れておけば、コンソール画面が閉じる前に表示したままになります。何かキーを押せば画面が閉じてプログラムが終了します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 18:47

    終了しないようになりました、ありがとうございました。感謝します!

    キャンセル

0

#include "stdafx.h"

いらない。Visual Studioをお使いのようなので、プロジェクトを作るときは「空のプロジェクト」を選びましょう

using namespace std;

やめよう

で本題。

まず*を任意個数出力する関数を作りましょう。つまり

void print_n_char(std::size_t n, char c)
{
    for(std::size_t i = 0; i < n; ++i) std::cout << c;
}

ですね。(operatorのオーバーロードを使えばもっと綺麗に書けるんですがそれはもっとC++ができるようになってからの話ですね)

さて、

____*
___***
__*****
_*******
*********

_は空白

を出力したいのでした。ということは一行ずつ見ると、今の行番号をi(0起算),全行数をnとすると

  1. 空白をn - i - 1個出力
  2. *(i + 1) * 2 - 1個出力

すればいいとわかります。あとは実現するだけですね。

void print(size_t n)
{
    for(size_t i = 0; i < n; ++i){
        print_n_char(n - i - 1, ' ');
        print_n_char((i + 1) * 2 - 1, '*');
        std::cout << std::endl;
    }
}

こんなかんじですね。

あとは組み合わせるだけです。なお今回は入力チェックは簡略化してますがまじめにやるなら
C++で再帰しつつnoexceptな数値入力関数を作る - Qiita#成果物
このくらいやりましょう。

int main()
{
    const size_t n = [](){ size_t in; std::cin >> in; return in; }();
    print(n);
    return 0;
}

Wandboxでの実行結果がこちら
http://melpon.org/wandbox/permlink/R7DTT3FstJRnIswa

わからないところあったら言ってください。

ちなみにoperatorのオーバーロードを使うというのはどういうことかというと
http://melpon.org/wandbox/permlink/3SVR8WfO2mVl5soh
こういうことです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 23:11 編集

    ちなみに
    ::system("pause");
    は環境依存(Windowsでしかうごかない)ので個人的にはあまりおすすめしないです。コマンドプロンプトで
    pause /?
    とするとなにをしているかわかると思います。つまりC++が持っている機能ではありません。今回はいいですが、環境依存だということを覚えていてくだい

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    [C++]paizaオンラインハッカソン7 恋愛SLG: プログラミングで彼女をつくる の 「眼帯」...

    C++を指定して提出するとエラーになります。 しかし、提出前確認は通ります。 Noneも出力できました。 が、全然自信がないので間違っているところを教えて欲しいです。 根本

  • 解決済

    足し算 C++

    #include <iostream> using namespace std; int main() { int x; cout <<"カウントダウンします。\

  • 解決済

    C++ ピラミッド

    入力した数のピラミッドを作るプログラムがわかりません。 (例)入力:4 * *** ***** ******* このような感じにしたいです。 for文

  • 解決済

    opencvでの画像の読み込み

    opencvで画像の読み込みを行い、テンプレートマッチングを行いたいと考えています。 外部のソフト(IC Imaging Contorol)というアルゴ社のカメラソフトを使い

  • 解決済

    2変数関数の一方の変数の和を取り1変数関数にする方法

    前提・実現したいこと xの関数 f(x)=Σ1/(n+x) を計算し、main関数の中でf(1),f(2)など計算できるようにしたいです。(Σはnについて1から10までの和)

  • 受付中

    二次元配列のvector(struct)に一元の配列をpush_backしたい。

    cinで行の値、括弧でくくられた3つの値をそれぞれ入力してもらいその値を構造化されたvectorにpush_backしたいのですが、どのようにすればよいのかわかりません。 最終的に

  • 解決済

    C++ 時計のプログラム

    某プログラミング練習サイトの問題についての質問です。 時計 秒単位の時間 S が与えられるので、h:m:s の形式へ変換して出力してください。ここで、h は時間、m は 6

  • 解決済

    スコープに関すること

    自作関数でファイル入力を行いmain関数で実際に入力されたものを出力していこうと思ったのですが、スコープの関係上main関数で出力できず困る羽目になってしまいました。アドバイスして

同じタグがついた質問を見る

  • C++

    3593questions

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