アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。

C言語の学習しております。

問題で「読み込んだ整数の段数を持つ下向き数字のピラミッドを表示するプログラムを作成せよ。第i行目にはi % 10によって得られる数字を表示すること」というものなのですが、なかなか書けません。

ヒントもしくは答えを教えていただけませんか?

質問者からの補足コメント

  • ご回答ありがとうございます。

    確かにtastu99さん通りのプログラムが実行されました。

    ですが、私の質問の内容不足もあったのですが、ピラミッドなので、形としては、
    111
    □22
    □□3
    にする必要があります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/01/30 12:41
  • ご回答ありがとうございます。
    *を用いたのはできましたが、
    int i, j; //ループ変数
    int no; //段数番号
    int prmd; //ピラミッドの個数
    int blnk; //空白の個数

    printf("段数を入力してください。"); scanf("%d", &no);
    //ピラミッド//
    for(i=no; i>0; i--){
    prmd = (i - 1) * 2 + 1;
    blnk = no - i;
    for(j=1; j<=blnk; j++)
    putchar(' ');
    for(j=1; j<=prmd; j++)
    printf("%d", i % 10);
    putchar('\n');
    数が逆しかできないです......。
    字数制限で一部省略しています。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/01/30 13:07
  • 補足解答ありがとうございます。

    こちらの補足内容間違いでした。

    私が希望している形はケース(2)の形です。
    11111
    □222
    □□3 (※3段ピラミッドの場合)
    この数字の列のピラミッドです。

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/01/30 18:51

A 回答 (7件)

> 数が逆しかできないです......。



とわかっているのなら、逆にするだけです。
次の問題を解いてみましょう

○入力した数値まで、昇順と降順を同時に出力するプログラムを作る
例) 5 を入力したら
1 5
2 4
3 3
4 2
5 1


複雑に見えた元の問題ですが、簡単なプログラムを組み合わせだけだとわかるかと思います。
どんな複雑なプログラムも、実際には「簡単なプログラム」を組み合わせたものです。
この「簡単なプログラム」への分解方法と組み合わせ方法を考えるのが、プログラミングです。
問題に行き詰まったら、分解することから考えてみましょう。
    • good
    • 0

>私が希望している形はケース(2)の形です。


>11111
>□222
>□□3 (※3段ピラミッドの場合)
以下のように、して下さい。
---------------------------------------------------
#include <stdio.h>

int main(void){
int dansu; //入力値(段数)
int yoko; //横幅の個数(最上段)
int i;
int j;
int val; //各段に表示する値(10の余りの数)
printf ("1~999の数値を入力してください=>");
scanf("%d",&dansu);
printf("入力値は%dです\n",dansu);
if (dansu < 1 || dansu > 999){
printf("数値が範囲外です\n");
return 0;
}
//最上段の横幅の個数を求める
yoko = 2 * dansu - 1;
//1~段数まで繰り返す
for (i = 0; i < dansu; i++,yoko--){
val = (i+1) % 10;
//1~各段の横幅分まで繰り返す
//各段の空白は1段ごとに1つずつ増える
//各段の横幅1段ごとに1つずつ減る
for (j = 0; j < yoko; j++){
if (j < i){
printf(" ");
}else{
printf("%d",val);
}
}
//最後で改行する
printf("\n");
}
return 0;
}
---------------------------------------------------
以下実行結果です。
1~999の数値を入力してください=>3
入力値は3です
11111
222
3

1~999の数値を入力してください=>7
入力値は7です
1111111111111
22222222222
333333333
4444444
55555
666
7
--------------------------------------------------------------
このサイトでは、空白がつめられるので、きれいな形になりませんが、
実際に実行すると、きれいな形で表示されませす。
不明点があれば、補足ください。
--------------------------------------------------------
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます!!

ちゃんと実行できました!!

自分で作れるようにもう一度1から書いてみます!

お礼日時:2015/01/30 20:21

#4です。


すみません、間違いました。
ケース1)
111
□22
□□3
は、きれいな三角形になりません。
そうするには、

ケース2)
11111
□222
□□3

ケース3)
1□1□1
□2□2
□□3

が正しいです。
ケース1)2)3)のどれをのぞまれますか?
この回答への補足あり
    • good
    • 0

>ですが、私の質問の内容不足もあったのですが、ピラミッドなので、形としては、


>111
>□22
>□□3
>にする必要があります。
とういうことですが、きれいな三角形をひっくりかえしたものを描きたいということでしょうか?

そうすると、3段の三角形を例に取ると
ケース1)
111
□22
□□1
は、きれいな三角形になりません。
そうするには、

ケース2)
11111
□222
□□1

ケース3)
1□1□1
□2□2
□□1

のようにするしか有りません。
1)2)3)のどれを、のぞまれてますか?
    • good
    • 0

#1です。


このようなかたちになればよいですか?
-----------------------------------------------
#include <stdio.h>

int main(void){
int dansu; //入力値(段数)
int i;
int j;
int val; //各行に表示する値(10の余りの数)
int kaisu; //各行で繰り返す回数
printf ("1~999の数値を入力してください=>");
scanf("%d",&dansu);
printf("入力値は%dです\n",dansu);
if (dansu < 1 || dansu > 999){
printf("数値が範囲外です\n");
return 0;
}
//1~段数まで繰り返す
for (i = 1; i <= dansu; i++){
val = i % 10;
kaisu = dansu - i + 1;
//1~各行の段数まで繰り返す
for (j = 1; j <= dansu; j++){
if (i - j > 0){
printf(" ");
}else{
printf("%d",val);
}
}
//最後で改行する
printf("\n");
}
return 0;
}
------------------------------------------------------
以下、実行結果です。
1~999の数値を入力してください=>13
入力値は13です
1111111111111
222222222222
33333333333
4444444444
555555555
66666666
7777777
888888
99999
0000
111
22
3
-----------------------------------------
このサイトはスペースがつぶされるので、見た目とは
違います。実行して確認して下さい。
    • good
    • 3

まずは


「読み込んだ整数の段数を/第i行目にはi % 10によって得られる数字を表示」
は作れますか?
「読み込んだ整数の段数を持つ下向き『*』のピラミッドを表示」
は作れますか?

例えば、3段の*のピラミッドだと
*****
□***
□□*
こんな感じになるでしょう。
i=0からループさせれば
i=0, 0個の空白、5個の* (5=3+3 -1)
i=1, 1個の空白、3個の* (3=(3-1)+(3-1)-1)
i=2, 2個の空白、1個の* (1=(3-2)+(3-2)-1)

他の数のピラミッドについても調べてみましょう。
法則が見つかるはずです。
この回答への補足あり
    • good
    • 0

以下のようにしてください。

1~999の段数まで行います。上限を変えたい場合は、999の値を
自分で好きなように変えてください。
------------------------------------------------------
#include <stdio.h>

int main(void){
int dansu; //入力値(段数)
int i;
int j;
int val; //各行に表示する値(10の余りの数)
int kaisu; //各行で繰り返す回数
printf ("1~999の数値を入力してください=>");
scanf("%d",&dansu);
printf("入力値は%dです\n",dansu);
if (dansu < 1 || dansu > 999){
printf("数値が範囲外です\n");
return 0;
}
//1~段数まで繰り返す
for (i = 1; i <= dansu; i++){
val = i % 10;
kaisu = dansu - i + 1;
//1~各行の回数まで繰り返す
for (j = 1; j <= kaisu; j++){
printf("%d",val);
}
//最後で改行する
printf("\n");
}
return 0;
}
-------------------------------------------
以下、13の場合の、実行結果です。
1~999の数値を入力してください=>13
入力値は13です
1111111111111
222222222222
33333333333
4444444444
555555555
66666666
7777777
888888
99999
0000
111
22
3
ーーーーーーーーーーーーーーーーーーーーーー
不明点は、補足してください。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!