• ベストアンサー

C *での三角形描画

課題で*を使って三角形を描画するプログラムを作るんですが、ネットで見たかぎり、 #include<stdio.h> int main() { int n, i, j, k, l; printf("段数を入力してください:"); scanf("%d", &n); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { for(k = 0; k < n*n-i*n-j-1; k ++) printf(" "); for(k = 0; k < i; k ++) { for(l = 0; l < j*2+1; l ++) printf("*"); for(; l < n*2; l ++) printf(" "); } for(k = 0; k < j*2+1; k ++) printf("*"); printf("\n"); } } return 0; } となっているのが、  段数を入力してください:2     *    ***   *   *  *** *** という風に表示されるので、これを  段数を入力してください:2     *    *** という形に表示させられるよう変更すべき箇所を教えてください。

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

    *    *** を  * *** と左詰として「回答」します。 >という形に表示させられるよう変更すべき箇所を教えてください。  他の回答者さんも言っているとおり、「新しく作った方が」・・。 《ポイント》  ・変数名を判り易くする。  ・2段のとき、3段のときの状況を紙に描く。  ・その違いから、各行の必要空白・*数を求める「式」◆を考える。 《ヒント》  ・各行の*数は奇数です。 ★全部ソースに書いてはマズイかな。+++++ の部分を考えて・・。 #include <stdio.h> void main() {  int  iDansu, iY, iX, iSpaceSu, iPekeSu;  printf( "段数を入力してください:" );  scanf( "%d", &iDansu );  for( iY = 0; iY < iDansu; iY++ ){ // 上段から下段へ   iSpaceSu = ++++ - ++++ - ++++; // 左空白数◆   iPekeSu = ++++ * ++++ + ++++; // *数◆   for( iX = 0; iX < iSpaceSu; iX++ ) printf(" ");   for( iX = 0; iX < iPekeSu; iX++ ) printf("*");   printf( "\n" );  } } 注:インデントに全角空白を用いています。

その他の回答 (4)

  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.4

>質問内容を少し変更します。 >上記のプログラムがどのように描画処理をしているのかを教えてください。 いい質問です。 とはいえ、元のプログラムはなかなか複雑ですので元々の課題について解説していきます。 これがわかれば、質問に書いてある(やや複雑な)プログラムが何をしているかは理解できるようになるでしょう。複雑ですけれど考え方は同じですから。 まず小手調べその1です。次のプログラムは何をしているか理解できますか? int kosuu = 10; int i; for (i = 0; i < kosuu; i++) {  printf("*"); } printf("\n"); 作りたいプログラムの仕様がわからないのですけれど、入力された段数が5だとするとこんな感じの三角形を描けばいいのですか?     *    ***   *****  ******* ********* これを書く前に小手調べその2として、直角三角形を描いてみましょう。段数が5の時はこんな感じです。 * *** ***** ******* ********* 最初の行には"*"が何個ありますか?次の行は何個ですか?その次は? n番目の行には"*"が何個ありますか?nを使った式で表してください。 小手調べその1のプログラムを参考にして、n行目の"*"の並びを描くプログラムを書けますか?(←プログラムA) ところで、これは段数が5の時の直角三角形でしたが、何行ありますか?m段の三角形は何行ですか?mを使った式で表してください。 ここでちょっとだけ難しくなります。プログラムで、繰り返しはfor構文を使って記述します。 仮に世の中に「n段目の"*"の並びを描くプログラム」があったとします。次のプログラムの意味していることはわかりますか? for (n = 1; n <= m; n++) {  (ここに「n段目の"*"の並びを描くプログラム」が入る) } ここまで書いたことと上で書いた(プログラムA)をヒントにして、小手調べその2の直角三角形を描くプログラムを書けますか? ここまで読んで「ああ、そうか」と思って最後まで自分でやれたらそれはそれでOKです。 ここまでの問いには答えられるけれど、「それでその先は?」ということであれば、先を解説します。 ここまでの問いもよくわからないようであれば、わからないところを教えてください。また、わからないなりに考えて自分の考えを答えてみてください。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス ・どんな三角形でしょうか?  直角三角形、二等辺三角形。  内部は塗りつぶすのですか?  良く分かりませんので簡単な直角三角形の表示を載せておきます。 サンプル: int i, len = 5; ←scanfなどで入力しておく for ( len = 1 ; len <= n ; len++ ){  for ( i = 0 ; i < len ; i++ ){   printf( "*" );  }  printf( "\n" ); } 実行結果: * ** *** **** ***** もし次の三角形なら工夫が必要です。   *  *** ***** 仕組みは『*』文字を表示する前に空白文字を2個、1個、0個と出せばよい。 これを参考にお考え下さい。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

変更するのは難しいですね 新しく作った方が楽です 使えそうなところは for(k = 0; k < j*2+1; k ++) printf("*"); printf("\n"); ぐらいです。

  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.1

このプログラムはどこから持ってきたのでしょう?質問内容からするとご自分で書かれたわけではないですよね? 「ネットで見た限り」と書いてあるから、検索して探したら見つかったとかでしょうか。 作りたいプログラムの仕様が正確にわからないのですけれど、元のプログラムは作りたいプログラムと比較するとなかなかに複雑な気がします。 考え方の参考にするにはいいですが、これをちょっと直して目的のプログラムにするというよりは考え方を生かして自分で書いた方が早いと思いました。 この課題を満たすプログラムくらいは自分で考えて書けないとだめだと思いますよ。

FPShooter
質問者

補足

質問内容を少し変更します。 上記のプログラムがどのように描画処理をしているのかを教えてください。(数値入力によってどの位置に何が入るのか等・・・) 理解如何によっては自分でも組めそうです。

関連するQ&A

専門家に質問してみよう