• ベストアンサー

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

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • c言語で行列の積の値を求める

    行列の成分を入力した後に、 入力された行列は X = 1 2 3 4 5 6 7 8 9 10 11 12 Y = 1 5 2 6 3 7 4 8 のように表示して、(上の数字は適当です。) 行列 X と行列 Y の積を求めて結果を表示するプログラムが作りたいのですが、上手く表示できなくて困っています。 #include <stdio.h> int main(void) { double A[10][10]; double B[10][10]; double C[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } } この後にどうすればいいのか教えてください。 よろしくお願いします。

  • パスカルのピラミッドを作りたいのですが...

    */ 入力した段数のパスカルの三角形をつくる */ #include <stdio.h> /*---nCr値を返す---*/ int comb(int n,int r) { if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); for (i = 0; i < ln; i++){ for(j = 0;j < ln - i;j++) putchar(' '); for(j = 0; j < i; j++){ printf("%d",comb(i,j)); printf(" "); } putchar('\n'); } return (0); } と作ったら、うまく 1 1 1 1 2 1 1 3 3 1 とは表示されず、 1 1 2 1 3 3 1 4 6 4 となってしまいます。 どこを直せばよいのでしょうか。教えて下さるとうれしいです。 よろしくお願い致します。

  • C言語のwhile文はネストできますか?

    「*」を使用して、n列、m行の四角を表示させるプログラムを考えました。 --------------------------------------------------------------------------------------------- #include<stdio.h> int main(void) { int i=0,j=0,n,m; printf("n入力:"); scanf("%d",&n); printf("\nm入力:"); scanf("%d",&m); printf("\n"); while(i<m){ while(j<n){ printf("*"); j++; } printf("\n"); i++; } return 0; } --------------------------------------------------------------------------------------------- しかし、1行分しか表示されません。 n=2、m=2の場合 ----------------- n入力: m入力: ** ----------------- としか表示されません。 whileのネストが悪いのでしょうか? それとも、初歩的なミスがあるのでしょうか?

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\n'); } return (0); }

専門家に質問してみよう