• ベストアンサー

初歩的な質問ですが;;

学校でC言語を習い始めたのですが、 よく、理解できない部分があるので教えていただけると、ありがたいです。 関数、for文でのことですが 2重のfor文がよく理解できません。 たとえば、略して書きますが for(i = 0;i < 10; i++){ printf("%d",i); for(j = 0; j < i; j++){ printf("*"); } printf("\n"); で、内側のfor文のことで疑問があります。 なぜ、行を繰り返して表示しなければいけないのでしょうか?? 本当、初歩的な質問ですがお願いしますm,,m

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

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

2重のfor文がどの様に実行されるかを、憶える為の演習問題だと思いますが。 for(j = 0; j < i; j++){ printf("*"); } の、部分を実行をi回実行して、全体では、それを10回繰り返すという入れ子の構造を理解する為の演習問題だと思いますが。

shinbqz
質問者

お礼

迅速な、回答ありがとうございましたm,,n

その他の回答 (6)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.7

ここまでのやり取りを見ていて、あなたの疑問は二重ループに関する疑問だけではないようだという結論に達しました。 for(j=0;j<5;j++) { printf("%d", j); } このとき、出力結果が01234となることが理解できないのだと思います。 1.printfは、改行を明示的につけてやらなければ改行しない。 2.printfをはじめとするstdoutへ出力する関数は、あくまでstdoutへ出力するだけである。 3.stdoutは、出力する機能のみを持っており、出力内容を整形する機能はない。 4.stdoutに出力する内容は、以前の出力内容に依存せずに後から後からどんどん追加される。 であるから、 上記のプログラムをforとjを使わずに表現した結果が printf("%d", 0); printf("%d", 1); printf("%d", 2); printf("%d", 3); printf("%d", 4); となることは理解できるとして、あなたは、この出力がどんどん上書きされるように考えてしまっているのだと思います。 しかし、実際には、上記のプログラムは printf("%d%d%d%d%d",0,1,2,3,4); と同等に動きます。 ちなみに… Win32 コンソール上においては、stdoutにバイナリ出力すると \r=cr \n=lf となるため、改行\nの代わりに\rを出力すると、あなたの意図した結果が得られます。 for(i = 0;i < 5; i++){ printf("%d\r",i); for(j = 0; j < i; j++){ printf("%d\r",j); } printf("\n"); =>結果 0 0 1 2 3 実際には(^M=\r、^J=\n) 0^M^J・・・・・・・・>0 1^M0^M^J ・・・・・・>0 2^M0^M1^M^J・・・・・>1 3^M0^M1^M2^M^J ・・・>2 4^M0^M1^M2^M3^M^J・・>3 さて このことを踏まえてあなたの質問に答えますと >で、内側のfor文のことで疑問があります。 >なぜ、行を繰り返して表示しなければいけないのでしょうか?? 『あなたが「繰り返して表示するよう」プログラミングしたから』です。 コンピュータは、プログラマがプログラムしたこと以外のことを実行するようには出来ていません。 たとえ自律制御が出来るようになっていても、そのコンピュータには「自律制御する」プログラムが入っているに過ぎません。 コンピュータに間違ったプログラムを与えたら間違った処理を実行します。 お分かりでしょうか。

shinbqz
質問者

お礼

返信ありがとうございます。 みなさんのレスのおかげでようやく、理解することができました。 本当にありがとうございました。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.6

No.3のものです。 No.4の方の言っているのはあなたの補足書かれたコードの 改行\nの出し方やカッコが片方ないことなどから あなたの書いた結果にはならないということをいっているのだと思いますよ。 まあ、ここに写す際にタイプミスしたのだと思いますが。 0 01 012 0123 は内側のfor文の出力です。 2段階に分けて考えましょう。 外側のforのiが0の際には jは0から0の範囲です。 ですのでjの出力は0がひとつですね。 外側が2回目の時には iは1です。 するとjは0から1の2回、回るので \dの時には01 *の時は** となります。

shinbqz
質問者

お礼

再度ありがとざいますm(__)m。 本当に、頑固な頭がいうことをきかずすみません。 >>外側が2回目の時には iは1です。 するとjは0から1の2回、回るので \dの時には01 ですが、jの範囲は確かに0~1ありますが 範囲内の数だけ出力されるのはなぜでしょうか?? 自分てきに、1だけだとおもってたのですが・・・

  • g_dori
  • ベストアンサー率47% (330/699)
回答No.5

ループを展開した時に、どういう処理が行われているかがわからないって事ですかね? iをコメントアウトすると、以下のような処理になります。 //for(i = 0;i < 10; i++){ printf("%d",0); for(j = 0; j < 0; j++){ printf("%d",j); } printf("\n"); printf("%d",1); for(j = 0; j < 1; j++){ printf("%d",j); } printf("\n"); printf("%d",2); for(j = 0; j < 2; j++){ printf("%d",j); } printf("\n"); printf("%d",3); for(j = 0; j < 3; j++){ printf("%d",j); } printf("\n"); //…中略 //} これでわかりませんかね?

shinbqz
質問者

お礼

わざわざ、詳しく丁寧にありがとうございますm(__)m

  • Ysan
  • ベストアンサー率32% (44/136)
回答No.4

0 01 012 0123 の様にはなりませんよ。 タイプミスしていないか確認してみてください。 また、外側のfor文の閉じカッコが無いのが気になりますが、 わざとですか。

shinbqz
質問者

補足

0 01 012 0123は 内側のfor文の内容だとおもわれます。 0 10 201 3012 40123の部分の 0 01 012 0123です。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.3

実行してみましたか? 行の番号と同じ数だけ「*」を並べるプログラムですよね? だからiまでjをまわすわけですよね? ほかの書き方もあるとは思いますが、 for文を使うならこういう風に書くのは素直だと思います。 質問の題名の;;が for(;;) みたいで面白いですね。

shinbqz
質問者

補足

すみません、補足させていただきます。 略させてもらいますが例えば for(i = 0;i < 5; i++){ printf("%d",i); for(j = 0; j < i; j++){ printf("%d",j); } printf("\n"); でコンパイルすると 0 10 201 3012 40123となりますが 0 01 012 0123のように前の行の繰り返しがされるのはなぜでしょうか??意味わからない質問だったらスルーしてください;

  • Ysan
  • ベストアンサー率32% (44/136)
回答No.2

内側のfor文とは for(j = 0; j < i; j++){ printf("*"); } この部分ですよね? 改行コード出力 printf("\n"); は外側のfor文です。 このコードでは、 1.数字を出力 2.その数字分の*を出力 3.改行 を10回繰り返すものだと思いますが。

shinbqz
質問者

お礼

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

関連するQ&A

  • 以前も同じ質問したのですがもう一度お願いします

    以前も同じ質問したのですがもう一度お願いします プログラミングで3行3列の行列Aに対しAの2乗、Aの3乗を求めるプログラムを作成したいのですが下記のプログラムでは3行3列まで表示できません どこが間違えているのか修正していただけないでしょうか? #include <stdio.h> int main(){ int z[3][3]; int w[3][3]; int x[3][3]={1,2,3,4,5,6,7,8,9}; int n,m; int i,j,k; printf("z[3][3] : \n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) {printf("z[%d][%d] = ",i,j); scanf ("%d",&z[i][j]); } } printf("m for [z]^m ="); scanf ("%d",&m); for(n=0;n<m;n++) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { w[i][j] = 0; for(k=0;k<3;k++) { w[i][j] += x[i][k]*z[k][j]; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { x[i][j] = w[i][j]; } } printf("[z]^%d\n",n+1); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf(" %9d",x[i][j]); }printf("\n"); }printf("\n"); } return 0; }

  • プログラミング 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重にするのですか?どなたか教えてください。

  • サブルーチン、グローバル変数がわかりません。

    2つの行列の計算をサブルーチン関数とグローバル変数を使って行いたいのですが、サブルーチン関数を宣言する為の、プロトタイプ宣言やプロトタイプ定義や、グローバル変数など、 調べてもよく理解できません。 とりあえず、二次元配列を用いたソースコードを書いてみました。 (1)14行目と23行目からのfor文、(2)40行目と51行目と62行目からのfor文を1つにまとめて、最初のプロトタイプ宣言は void 関数(double a[LINE][COLUMN] , double b{LINE][COLUMN] , double c[LINE][COLUMN]) ; にすればいいと思うのですが、 その後は、どのようにすればいいのでしょうか? あと、scanfも使って、aとbも入力できるようにしたいです。 1 #include <stdio.h> 2 3 #define LINE 3 4 #define COLUMN 3 5 6 int main(int argc, char *argv[]) 7 { 8 double a[LINE][COLUMN] ; 9 double b[LINE][COLUMN] ; 10 double c[LINE][COLUMN] ; 11 int i ; 12 int j ; 13 14 for(i= 0;i < LINE ; i++) 15 { 16 for(j = 0 ; j<COLUMN ; j++) 17 { 18 printf("A[%d][%d]=", i+1 , j+1 ); 19 scanf("%f", &a[i][j]); 20 } 21 } 22 23 for(i =0;i < LINE ; i++) 24 { 25 for(j = 0 ; j<COLUMN ; j++) 26 { 27 printf("B[%d][%d]=", i+1 , j+1 ); 28 scanf(" %f", &b[i][j]); 29 } 30 } 31 32 for(i =0;i < LINE ; i++) 33 { 34 for(j = 0 ; j<COLUMN ; j++) 35 { 36 c[i][j] = a[i][j] + b[i][j] ; 37 } 38 } 39 40 printf("\n行列A:\n"); 41 for(i =0;i < LINE ; i++) 42 { 43 for(j = 0 ; j<COLUMN ; j++) 44 { 45 printf("%10.5f" , a[i][j]) ; 46 } 47 48 printf("\n"); 49 } 50 51 printf("\n行列B:\n"); 52 for(i= 0;i < LINE ; i++) 53 { 54 for(j = 0 ; j<COLUMN ; j++) 55 { 56 printf("%10.5f" , b[i][j]) ; 57 } 58 59 printf("\n"); 60 } 61 62 printf("\nC(和):\n"); 63 for(i= 0;i < LINE ; i++) 64 { 65 for(j = 0 ; j<COLUMN ; j++) 66 { 67 printf("%10.5f" , c[i][j]) ; 68 } 69 70 printf("\n"); 71 } 72 return 0 ; 73 }

  • C言語、putcharについて

    C言語で、 int i,j; for (i=1;i<=9;i++) { for (j=1;j<=9;j++) printf("%d",i*j); putchar('¥n'); を実行すると   1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 となります。 しかし、4行目をprintf("%d",i*j); にかえてputchar('¥n')をなくすと、すべての値が同じ列になってしまいます これはどういうことでしょうか??

  • C言語のscanf関数についての質問です。

    閲覧ありがとうございます。 C言語についての質問です。 nと、2つのn×n行列の各成分をキーボードから入力し、 その和を計算するプログラムを作ろうとして i,j,と行列二つの配列(a[n][n]とb[n][n])をintで定義した後、 printf("行列aの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&a[i][j]); } } printf("行列bの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&b[i][j]); } } というプログラムを書いてn=3としたのですが、 「行列aの成分を入力してください」と表示されて 例えば「1 2 3 4 5 6 7 8 9」と入力してEnterキーを押しても 「行列bの成分を入力してください」という文が表示されません。 C言語を学び始めてまもないので、 まだ基本的なところが理解できていないかもしれません。 何が原因だかわかる方、解答頂けると嬉しいです。

  • プログラミング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; }

  • 行列の積について

    3行3列の行列AとB、およびその和と積を表示するものです #include <stdio.h> int main (void) { int i,j,k; double a[3][3] = {{2.4, 5.5, -8.5},{0.8, 3.7, 1.1},{3.5, -9.1, 2.6}}; double b[3][3] = {{-5.1, 9.8, 2.3},{-4.1, 0.2, -0.3},{3.3, 6.1, -1.3}}; double c[3][3] = {0}; printf(" 行列A\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", a[i][j]); printf("\n"); } printf("\n 行列B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", b[i][j]); printf("\n"); } printf("\n 行列A+B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) c[i][j] = a[i][j] + b[i][j]; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%5.1f", c[i][j]); printf("\n"); } for (i=0; i<3 ; i++){ for (j=0; j<3; j++) for (k=0; k<3; k++) c[i][j] =c[i][j]+ a[i][k]* b[k][j]; } printf("\n 行列AB\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%7.2f", c[i][j]); printf("\n"); } return 0; } これだと積だけが異なった値が出てしまいます。 試しに、積の部分だけで組んでみると正しい答えが出ました。 for文のブロックの組み方がまずいのかなと思っていますが、これ以外だと、行列のレイアウトが崩れてしまいます どのように直したらいいのか、ご教示お願いします

  • 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"); } }

  • 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文がでて、機能するようなプログラムはどうすればいいでしょうか? よければアドバイスください。 質問の仕方が下手くそですいません..

  • Cの配列についての質問

    Cオープンコースウェア9-4の問題を改変した質問 #include <stdio.h> void set (int b[],int n,int dat){ int i; for (i= 0;i<n;i++){ b[i] = dat; } } int main(){ int a[4][6] int i,j,M= 4,N=6; set ((int *)a,sizeof(a)/sizeof(a[0][0]),1) for (i = 0;i<M;i++){ for (j= 0;j<N,j++){ printf("%2d",a[i][j]); } printf("\N"); } return 0; } ここまで このmein関数内の表示部分を変更して for (i =0;i<(sizeof(a)/sizeof(a[0][0]));i++){ printf("%2d",(int *)a); } のようにすると変な数字になってしまうのはなぜでしょうか? 環境はgcc4.6.3 ubuntu 12.04です

専門家に質問してみよう