プログラミング for文の応用問題!パターンを作成する方法を教えてください

このQ&Aのポイント
  • プログラミングの問題です。自然数nを入力し、特定のパターンが出力されるプログラムを作成したいです。
  • まずは単位パターンを作成するプログラムを作成しましたが、複数の単位パターンを並べる方法が分かりません。
  • さらに、for文を使い3重、4重にする必要があるのでしょうか。どなたか教えてください。
回答を見る
  • ベストアンサー

プログラミング for文

プログラミング for文 プログラミングの問題です。 「自然数nを入力し、以下のようなパターンが出力されるようなプログラムをfor文を使って作成せよ。」 (例:n=3のとき) % ./a.out n: 3 * ** *** *__* **_** ****** *__*__* **_**_** ********* (例:n=4のとき) % ./a.out n: 4 * ** *** **** *___* **__** ***_*** ******** *___*___* **__**__** ***_***_*** ************ *___*___*___* **__**__**__** ***_***_***_*** **************** (_で空白を表しましたが、上手く見られないかもしれません…。小さい直角三角形が下に行くにつれ1個ずつ増え、全体的にみると大きい直角三角形が見えるイメージです。) つまり、n=3なら、 * ** *** を単位として、1~3行目にはこれが1つ、4~6行目にはこれが2つ、7~9行目にはこれが3つあります。 一般に、 * ** *** … ********(←n個) を単位とし、n^2-2~n^2行目にこれがn個あるようなパターンです。 私はまず、単位パターンをプログラムしました。 #include <stdio.h> main() { ___int n, i, j; ___printf("n: "); ___scanf("%d", &n); ___for (i=1; i<=n; i++) { ______for (j=1; j<=i; j++) { _________printf("*"); ______} ______printf("\n"); ___} } (_は空白です) しかし、単位パターンを横に2個、3個と並べるプログラムが分かりません。 さらにfor文を使い、3重、4重にするのですか?どなたか教えてください。

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

  • ベストアンサー
回答No.3

要素から考えたらこんな感じ #include <stdio.h> int main() {  int n;  int i,j,k,m;  printf("n:");  scanf("%d", &n);  // 縦のnブロック分の繰り返し  for (i = 1; i <= n; i++) {   // 縦n行分の繰り返し   for (j = 1; j <= n; j++) {    // 横全体の繰り返し    for (k = 1; k <= i; k++) {     // 単位「*」の繰り返し     for (m = 1; m <= j; m++) {      putchar('*');     }     if (k == i) {      putchar('\n');      break;     }     // 「 」の繰り返し     for (m = n - j; m > 0; m--) {      putchar(' ');     }    }   }  } }

tksmsysh
質問者

お礼

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

その他の回答 (2)

回答No.2

ミスった。9行目修正 http://ideone.com/bAarZ

回答No.1

できればn * nの正方形を「いくつ」積み重ねるのか、という発想まで来て欲しいかな。 #絵に描かずに、塊を何個表示しなきゃいけないか、いくつ*を連続させないといけないか、の数字のリストをつくるだけでもいい。 #ごちゃごちゃしているけどループは内側から考えてます。 http://ideone.com/Bx3Wa

tksmsysh
質問者

お礼

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

関連するQ&A

  • 簡単なfor文

    #include <stdio.h> int main(void) { int n; int i; for(n=0 ;n<10;n++){ for(i=0; i<=n ;i++){ printf("*"); } printf("\n"); } return(0); } こういったプログラムを実行すると、以下のように表示されるのですがなんででしょうか? * ** *** 以下略 自分の考えですと、*は毎回一つしか表示されずに改行されると思うのですが・・・ * * * * 以下略 i個分の*を表示するなどという指示をプログラムはなされていないと思うのですがなぜなんでしょうか? 一つ目のfor文では10回ループが繰り返され改行 二つ目のfor文で*を永遠に表示 といった僕の解釈ではおかしいですよね。 当方C言語初心者で、周りに聞く人がいないため教えていただけると非常に助かりますm(__)m

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • C言語 for文を使った一例について

    #include<stdio.h> main () { int i ; int j ; for(i = 0 ; i<5 ; i++){ /*行数の制御部*/ for(j = 0; j<(i+1) ; j++){ /* *の制御部*/ printf("*"); } printf("\n"); } return; } このプログラムを実行すると * ** *** **** ***** が表示されます。 for(j = 0; j<(i+1) ; j++){ ↑    printf("*");} ↑ 「*」の制御部となりますが、 何故「*」が1行目で1個表示されているのに 2行目では2個表示されているのですか? 行数と「*」は同じになると思われますが。 上記の質問の回答の程宜しくお願いします。

  • プログラミングの間違いを…

    度々の似たような発言、大変申し訳ありません。お許し下さい。 もう1つ実行が上手く出来ないプログラムがある事を忘れていました。以下のプログラムについても、まだまだ未熟な私には間違っている箇所が全く分からないので、C言語プログラミング熟練者の方々、どうか指摘して下さると有り難いです。宜しくお願い致します。 ●for文の2重ループを使い、入力された星の行数に対して、下図のような表示になるようなプログラム。なお、このプログラムでは、中のループで表示するスペースの数を変え、その後にアスタリスクを表示している。 星の行数を入力してください。 6 *  *   *    *     *      * (1)整数型変数のi,j,noを宣言する (2)“星の行数を入力して下さい。”と表示し、入力された値をnoに読み込む (3)for文により、カウンターiが1からnoまで、(4)、(6)の処理を繰り返す (4)for文により、カウンターjが1からi未満まで、(5)の処理を繰り返す (5)半角スペース1つ(“ ”)を表示する (6)半角のアスタリスクを表示し、改行する #include <stdio.h> main(void) {   int i,j,no;   printf("星の行数を入力して下さい。\n");   scanf("%d",&no);   for(i=1;i<=no;i++){     for(j=1;j<i;i++){       printf(" \n");     }     printf("*");     printf("\n");   } }

  • n重のfor文にするには?

    C言語の勉強をしはじめた者です。 よろしくお願いします。 「整数nを入力したときにn重for文にするにはどうしたらよいでしょうか?n個for文の中身の条件は、それぞれ異なりますが、nに依存した条件です。 」 たとえば、n=3と入力したとき、 for(i=1;i<=3;i++){ for(j=i+1;j<=4;j++){ for(k=j+1;j<=5;k++){ ... }}} また、 たとえば、n=5と入力したとき、 for(i=1;i<=3;i++){ for(j=i+1;j<=4;j++){ for(k=j+1;k<=5;k++){ for(l=k+1;l<=6;l++){ for(m=l+1;m<=7;m++)} ... }}}}} という感じに整数nを入力すると、その分、for文がでて、機能するようなプログラムはどうすればいいでしょうか? よければアドバイスください。 質問の仕方が下手くそですいません..

  • Visual C++でのプログラミング

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<=n;i++){ printf("a[%d]",i); scanf("%d\n",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[i]=%d\n",a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これをVisual C++でデバックすると 『test.exeの0x0fcbe42e(msvcr100d.dll)にハンドルされていない例外が発生しました:0C0000005: 場所 0x00000000 に書き込み中のアクセス違反が発生しました。』 と表示されて実行できません。 今日インストールしたばかりなのでどこでエラーが起きているのかわかりません。 これはプログラミングとVisual C++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。1問だけでも構いませんのでよろしくお願いします。

  • for文

    for文なのですが、 scanfで得た、 iを for文のi--で、一づつへらしてますが、 0でfor文がおわりますが 0で終わりの記述がない気がするんですが、 どうしてでしょか? int main(void) {    int i;    printf("正の整数を入力してください。\n");    scanf("%d",&i);    for( ; i ; i--)    printf("qが入力されました。\n");    return 0; }

  • for文の条件式について

    #include<stdio.h> #define N 30 #define TRUE 1 #define FALSE 0 char is_prime[N+1]; int main(void) { for(i=1;i<=N;i++){ is_prime[i]=TRUE; } is_prime[1]=FALSE for(i=2;i*i<=N;i++)→(1) if(is_prime[i]) for(j=i*2;j<=N;j+=i)→(2) is_prime[j]=FALSE;→(3) printf("%dまでの素数は、\n",N); for(i=1;i<=N;i++) if(is_prime[i]) printf("%d",i); return 0; これはエラトステネスの素数を求めるプログラムですが、(1)のi*iは2 3 5と理解できるんですが(2)の条件式が理解できません。 例えはi=2のときjは4になるのですが、(3)は is_prime[4]=FALSEとなりj+=iは6になりますが、何ゆえこれが増分として出てくるのか理解できません。 j+=iはどういう使われ方をするのか理解できません。どなたかご教授ねがいます。

専門家に質問してみよう