プロが教えるわが家の防犯対策術!

Perlでプログラムを書いています。
整数を1個受け取ってその整数の数だけコマンドプロンプト上に*の記号を使って縦横に左上の向きの直角三角形を表示させる方法はどのようにやるのでしょうか。
例えば「5」という数字を受け取った場合は
*****
****
***
**
*
のように表示させたいです。
宜しくお願いします。

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

  • 書き忘れていたんですがwhile文を使って2重ループを使って書こうとしていて
    print '正整数を入力して下さい: ';
    $n = <STDIN>;
    chomp($n);

    while ($n > 0) {
    print "+";
    while ($y > 0) {
    $n = $n--;
    $y--;
    }
    $n--;
    }
    このように書いてみたんですがうまくいかないです。。。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/11/16 01:07
  • 他のかたの補足分にも書いたんですがwhile文を使って2重ループの構造で書こうとしていて
    *をその数だけ書くのはできるんですが一個ずつ減らして*を下に並べる方法がわからないです。。。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/11/16 01:09

A 回答 (5件)

あなたのソースを多少修正しました。


以下のようにしてください。
---------------------------------------------
print '正整数を入力して下さい: ';
$n = <STDIN>;
chomp($n);

while ($n > 0) {
$y = $n;
while ($y > 0) {
print "+";
$y--;
}
print "\n";
$n--;
}
    • good
    • 0

その 「*をその数だけ書く」プログラムを、必要な数だけ繰り返す、という2重ループになります。


その補足にあるプログラムは

print "+";
while ($y > 0) {
$n = $n--;
$y--;
}
$n--;
}
というプログラムを

while ($n > 0) {
}

で繰り返す、という構造になっています。
上の部分、「*をその数だけ書く」プログラムになっていますか?


で、こういう決った数のループにはforの方が適切です。
また、入力した$nとループ制御用の変数とは分けるとよいでしょう。
(十分に理解してわざとやっているならともかく)
    • good
    • 0

あ,


print map { "*" x $_ . "\n" } reverse 1..<STDIN>;
で終わりだ.

さておき, なにをどう考えてそのように書いたのでしょうか? そしてどのように「うまくいかない」のですか?
    • good
    • 1

どうやって「整数を1個受け取」るんでしょうか?



そして, どこで困っている? 例えば, 「5」という数字を受け取って
*****
と表示させることはできる?
この回答への補足あり
    • good
    • 0

> 整数を1個受け取って



どこからどうやって受け取るのでしょうか?
コマンドライン引数から受けとるのと、Web上のフォームから受けとるのとではまったく違います。
他にも考えられる手段がたくさんあります。

> 整数の数だけコマンドプロンプト上に*の記号を使って縦横に左上の向きの直角三角形を表示

この三角形を書くためには、 自然数n を入力したら
0行目 * が ?個
1行目 * が ?個
2行目 * が ?個
....
と、?個にところに何が入るか、わかりますか?


5の例が質問文にありましたが、これは
5個
4個
3個
2個
1個
となってますよね?
たとえば、5を入力しら
5
4
3
2
1
と表示するプログラムはできますか?
これができるなら、Perlには x演算子という便利なものがあるので、 * を n個並べる、というのは簡単にできます。
http://perldoc.jp/docs/perl/5.8.8/perlop.pod
この回答への補足あり
    • good
    • 0

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