• ベストアンサー

うまくプログラミングできません・・・

* ** *** **** ***** というような図形を表示したいのですが、自分でプログラムしたものを表示すると、 ++++* ** *** **** ***** +++* ** *** **** ***** ++* ** *** **** ***** +* ** *** **** ***** * ** *** **** ***** (空白は分かりやすいように+にしています) Basicプログラミングの勉強を始めたばかりで・・・アドバイスをお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.8

 ここの解答を下さる方は、レベルの高い方が多いので、困ったときなどには、過去ログなどいつも参考にさせていただいていますm(__)m 感謝  yumeponyo さんは、BASICプログラムの勉強を始めた方ばかりとのことなので、諸先輩方のエレガントな解答(解説)にいたる前段階を yumeponyo さんのコードを使って埋めてみたいと思います。  長くなるので全角800時を越えるかも知れません(^^;  yumeponyo さんが実現したいのは、5行に5文字を空白とアスタリスクを使って三角を書きたいのですね。  まず、字下げ(インデント)をしてみましょう(空白が潰されるので_で置き換えます)FORループのブロックが3つ下がるのが判ると思います。これがネストが3段階の状態です。 100 FOR K = 1 TO 5 110 ____FOR J = K TO 4 120 ________PRINT"+"; 130 ____NEXT J 140 ____PRINT; 150 ____FOR I = 1 TO 5 160 ________FOR H = 1 TO I 170 ____________PRINT "*"; 180 ________NEXT H 190 ________PRINT 200 ____NEXT I 210 ____PRINT 220 NEXT K  5つの行をカウントするFOR Kがもっとも外側になっていますね。あと空白を書くFOR Jとアスタリスクを書くFOR H があれば書けますよね。ここを皆さんに指摘されています。以上で書き直してみます。 100 FOR K = 1 TO 5 110 ____FOR J = K TO 4 120 ________PRINT "+"; 130 ____NEXT J 140 rem 150 rem 160 ____FOR H = 1 TO k 170 ________PRINT "*"; 180 ____NEXT H 190 ____PRINT 200 rem 210 rem 220 NEXT K  いらないFOR Iを削除して小文字 rem(コメント)にしました。また Iが無くなったので160行の I を K に替えています。ところで空白だけは5行目に0文字書くので110行のカウンタの最大値を 4 にしていますね。ところが K をループカウンタ J に代入しているので K が 5 になったとき、実行時にエラーが出ますね。 FOR J は、K が 5 になったときのみ無効にならないと0文字書く(=書かない)ことが実現できません。 K が 5 のときの例外処理を105行に書きましょう。 100 FOR K = 1 TO 5 105 ____if K = 5 then goto 160 110 ____FOR J = K TO 4 120 ________PRINT "+"; 130 ____NEXT J 140 rem 150 rem 160 ____FOR H = 1 TO k 170 ________PRINT "*"; 180 ____NEXT H 190 ____PRINT 200 rem 210 rem 220 NEXT K  ところで内側のFOR JとFOR Hの2つのループがありますが、これをひとつのループで出来ないでしょうか? 1行に書く文字の空白とアスタリスクをなんらかのルールで切り替えれば内側の2つのループがまとめることが出来ます。このものの見方の実例をプログラム例で提示してくださっています。  この文字数で投稿できるかな。

yumeponyo
質問者

お礼

私のコードをもとにして、解説していただけて、とても分かりやすかったです。 本当にありがとうございました。

その他の回答 (8)

  • afhyus
  • ベストアンサー率35% (134/380)
回答No.9

質問者さんに回答を導き出して欲しかったのですが #8さんにある程度書かれてしまったので… まず、考え方(法則)を整理する事からした方がいいですよ。 それの上でプログラムに置き換える。 法則を考えるという意味では 1.今回は5行で表示する。 2.各行には行の数の*が存在する。 3.*表示は右詰めにする。 4.右詰めにするために*の左側はスペースで埋める。 というのが出てきます。 ここで、2と4が判れば、プログラムは出来たも同然です。 上記の法則をプログラムに直すと… 最初のFOR文は5行のループにする。 FOR I = 1 TO 5 次は、スペースで埋めるループを作成する FOR J = 1 TO (5 - I) ← 全部で最大は5文字になるわけだから、それから行数分の*の表示分を除けば左側のスペースは5-行数という事になる。 次は、行数と同じだけの*を表示すればいいわけだから FOR J = 1 TO I ということになる。 つまり FOR I = 1 TO 5 FOR J = 1 TO (5 - I) PRINT "+"; NEXT J FOR J = 1 TO I PRINT "*"; NEXT J PRINT NEXT I ということになりますね。 結局は、プログラムはいかに簡単な法則を見つけられるかにかかっています。 ちなみに FOR I = 1 TO 5 PRINT LEFT$("+++++", (5 - I));LEFT$("*****", I) NEXT I これが、一番簡単かな。 LEFT$または、LEFTという関数は指定した文字列から、左側から指定した文字数だけ抜き出すというものです。 +表示は最大で4文字しかないので、4つでもよかったのですが判りやすくするため5文字にしています。 もし、PRINT文が1行だと正しい結果が得られなかったら… というか、むしろプログラムを読みやすくするという意味で… PRINT LEFT$("+++++", (5 - I)); PRINT LEFT$("*****", I) の2行にしてみてください。

yumeponyo
質問者

お礼

丁寧な説明、本当にありがとうございました。 色々なやり方があるんですね・・ とても勉強になりました。 ありがとうございました。

  • afhyus
  • ベストアンサー率35% (134/380)
回答No.7

ちなみに… 一番短く書いたとして3行(または4行)で、ループは1個のみです。 ただし、元々の問題がループの数をいくつ以上と指定されているのであれば、正しい回答にはならないかもしれませんが…

回答No.6

確かに9stepでいけますね。 勉強になりました。 ヒント:内側のループはKループの値をうまく使いましょう。

  • afhyus
  • ベストアンサー率35% (134/380)
回答No.5

正しいプログラムを書く事は簡単だけど、それでは意味がなさそうなので… まず、ループ文の数をよく考えてください。 一番最初のKのループはつまり、5行分のループなわけです。 その内側に入るのは+(実際はスペース)を表示するループと *を表示するループだけのはずです。 つまり、ループは全部で3個で用が足ります。 (あくまでも、質問者さんの理解しやすく、作ったものを踏襲するとすれば) しかも、ネストの数は2段までです。 それ以上になる事はおかしいです。 ちなみに、9行で書けます。

yumeponyo
質問者

お礼

afhyusさんの説明を読みながら、「あ、ホントだ・・・」と。 ありがとうございます。

回答No.4

VB.NETでWindowアプリケーションでならこんなかんじ・・・ 1.フォームに適当にボタン、テキストボックスを配置。 2.テキストボックスのMultilineプロパティをTrueに。 3.テキストボックスのサイズを適当に広げる。 4.ボタンをWクリックしてソースを表示する。 5.Private Sub Button1_Click~とかいうメソッドが自動生成されるので以下のコードを記入。 For i As Integer = 0 To 4 For j As Integer = 0 To 4 If i - j < 0 Then TextBox1.Text = TextBox1.Text & "*" Else TextBox1.Text = TextBox1.Text & "+" End If Next TextBox1.Text = TextBox1.Text & vbCrLf Next 素のBasic?は存じませんので動くようにご自分で改造していただくか、ほかの回答者を待ってください。

yumeponyo
質問者

お礼

ありがとうございます。 自分が何の言語を使っているのかも、いまいちピンとこない状態で・・・ 説明していただいてありがとうございました。

回答No.3

失礼、ぼーっとしてて見てる場所間違えてた模様。 行番号みたいなのが出てるのでなんじゃこれはって思っちゃいましたよ・・・

回答No.2

これ、言語何ですか? なんとなくはわかるけど、使える構文がよくわからないので回答しようがない・・・ (CASLに似てるような・・・最近のはしらない) ちなみにここはJava用です。

回答No.1

ソースプログラム見ないとわからないと思いますよ

yumeponyo
質問者

補足

すみません・・・質問のところの図が違っていました。 ++++* +++** ++*** +**** ***** (+は空白です) を表示したいのですが・・・実行すると上記のようになってしまいます。 100 FOR K = 1 TO 5 110 FOR J = K TO 4 120 PRINT"+"; 130 NEXT J 140 PRINT; 150 FOR I = 1 TO 5 160 FOR H = 1 TO I 170 PRINT "*"; 180 NEXT H 190 PRINT 200 NEXT I 210 PRINT 220 NEXT K という風にプログラムしたのですが、どのようにすればよいのでしょうか?

関連するQ&A