• 締切済み

for文を簡単な処理に書き変えたい

いま、配列を作る作業をしているのですが、for文を使うと、forをいくつ書けば良いのか分からない状態です。 作ろうとしている配列が、A[X][Y]で、Xの要素数は固定で良いのですが、Yの要素数が実験のたびに変動するためです。そして、処理したいのが、この配列の各列の値を適当な値(このfor文の前に値が決まっています)を代入することです。 例えば、for文だと、Y=3のときには for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ A[line][0] = C[i];//(Cという配列のi成分) A[line][1] = B[j]; A[line][2] = E[k]; } } } のように書くような内容なのですが、Yが増えると、for文も増やさないといけません。 ここで、再帰処理のような方法をつかってうまく書きたいのですが、どう書いたら良いのか分かりません。 一般的なfor文の書き換え方みたいなことでも良いので、教えて頂けませんか?宜しくお願いします。

みんなの回答

回答No.5

#2 さんと同じ考えですが、いまいち、質問の意味がわかりません。 例えば、for文だと、Y=3のときには for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ A[line][0] = C[i];//(Cという配列のi成分) A[line][1] = B[j]; A[line][2] = E[k]; } } } ではYが増えて、Y=4やY=5だと、どのようにfor()文が変わるのですか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

訂正です > ○が共通だったら、Y=3なら、○進数3桁と考えて、 k*3^2+j*3+i とする。 ○が共通だったら、Y=3なら、○進数3桁と考えて、 k*○^2+j*○+i とする。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

作ろうとしているものの条件がよくわからないのですが? 毎回違うのは Y だけですか? それとも、(この例なら) C,B,Eの長さもですか? また、C,B,Eの長さは共通(質問中の○が同じ値になる)ですか? それとも、一定の法則で計算できるものですか? それとも、それぞれ独立ですか? 例えば、こんなやりかたはあります。 ・C.B.Eといった個別の配列では、ループや再帰には向かないので、 T[0]=C, T[1]=B, ...のような配列の配列とか、ポインタの配列にする。 ・i,j,k...の値と一対一で対応する値の計算方法を考える。 ○が共通だったら、Y=3なら、○進数3桁と考えて、 k*3^2+j*3+i とする。 ・forの2重ループ。 for( idx=0;idx < ○のY乗 ; ++ idx ) { temp_idx=idx ; for( y=0; y < Y; ++y ) { i0 = temp_idx % ○ ; // 余りで、下の桁を取り出す temp_idx /= ○ ; // 一桁シフト A[line][y] = T[y][i0] ; } /* この位置にAを使った処理が入らなければ */ /* idxのループは無意味なのは、既に指摘のある通り */ }

  • yomyom01
  • ベストアンサー率12% (197/1596)
回答No.2

>Yが増えると、for文も増やさないといけません。  Yが増えたときに増やすのは、forのループ回数でfor文ではない。

回答No.1

>再帰処理のような方法をつかってうまく書きたいのですが それ以前にやりたい事が良く分かりません。 例としてソースを書くにしても、もう少し前後の処理を含め、値の確定など詳細に書いた上で質問した方が良いと思います。 少なくとも今の例では、 for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ を仮に for(i=0;i<10i++){ for(j=0;j<20;j++){ for(k=0;k<30;k++){ と仮定した場合、forループ無しの A[line][0] = C[10]; A[line][1] = B[20]; A[line][2] = E[30]; と同意ですよ。 それとも、各ループ内で、A[line]の初期化と処理がクローズされていると言う事ですか? まずは、「初期化」だけに絞ってロジックを考え、その上で質問する事をお勧めします。

関連するQ&A

  • for 文における処理の改善(C言語プログラム)

    はじめまして。panicdjです。 いまCでプログラムを組んでいます。 環境はVC++ver6.0 Win32 Console Applicationです。 以下のプログラムを見てください。 #define X_MAX 10 #define Y_MAX 20 #define Z_MAX 5 int main(int argc , char ** argv) { int i, j, k; int aa[10][20][5]; for (i = 0; i < X_MAX; i ++) { for (j = 0; j < Y_MAX; j ++) { for (k = 0; k < Z_MAX; k ++) { aa[i][j][k] = 10.0; } } return 0; } 過去のスレッドでポインタ型によるアクセスを すれば、処理が高速になるとかかれていました。 自分は,for文による繰り返す処理ではなく, その「ポインタ型によるアクセス」を実装したいのです。 こんな私にアドバイスお願い致します。

  • 配列の並びかえごにFor文使用

    いつもお世話になっております。 今回、配列の要素数に応じて順番を並び替へ、要素数の多いのから少ないものへのforループに挑戦することにしたのですがルーチンが思い浮かばず投稿させていただきました。 DBから 条件1で検索し、その条件でヒットしたid列の値を$hairetu1に格納しております。 条件2で検索し、その条件でヒットしたid列の値を$hairetu2に格納しております。 条件3で検索し、その条件でヒットしたid列の値を$hairetu3に格納しております。 条件4で検索し、その条件でヒットしたid列の値を$hairetu4に格納しております。 条件5で検索し、その条件でヒットしたid列の値を$hairetu5に格納しております。 最大5つの条件で検索できるようにしております。($hairetu変数は全て配列変数として使用しております) 条件1で検索した再に、$hairetu1には、1,2,4という値(id値)が入っており、 条件2で検索した再には、$hairetu2に、1,4という値が入っています。 条件3で検索した再には、$hairetu3に、1,2,3,4という値が入っています。 条件4で検索した再には、$hairetu4に、9999という値が入っています。 条件3で検索した再には、$hairetu5に、1,2という値が入っています。 ※各条件で検索した際に、ヒットしたid数が0の場合、nullが入らないように初期化の時点で9999をセットしております。$hairetu=array(9999); 今回、[条件1 and 条件2 and 条件3 and 条件4 and 条件5] の結果、1と2を最終的に$result_hairetuに格納したいのです。 考えた方法は、 For(i){ for(j){ for(k){ for(l){for(m){ if(hairetu[i]==hairetu[j] && hairetu[i]==hairetu[k]・・・,hairetu[l] ==hairetu[m]){array_push($result_hairetu,hairetu[i])}}}}}} ※i・・・ (i=0;i<count(hairetu1);i++) という方法で、5つのfor文でループし、ifで比較し同じであればresult_hairetuに格納するという手法をとろうとしたのですが、条件2で検索した結果が、1,2の二つであるため、二つ目のfor文を二回走ったところで抜けてしまい処理が途中で終わってしまいます。 途中で抜けるのを防ぐために以下のように配列を並び替えて、 For分で使用するという流れを作りたいのです。 また、今回、hairetu2と5の要素数が同じなのときはどのようにセットしたらよいかもわかりません。要素数が同じである場合はどちらが先でもかまいません。 for(hairetu4){for(hairetu2){for(hairetu5){for(hairetu1){for(hairetu3)}}}} このループの作り方がわかる方がいらっしゃいましたらご教授のほうお願いできないでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • 拡張for文について質問

    以下は、拡張for文と配列に関するソースコードの一部を抜粋したものです。 それを見た上で、私の質問に答えてください。 int[]a={10,5,8,4,3}; for(int n:a){ System.out.print(n+" "); } int[][]a={{1,2},{4,5,6}}; for(int[]n:a){ for(int k:n){ System.out.print(k+" "); } System.out.println(""); } 質問1:何故、前者の配列は、『for(int n:a)』のように[]がついてなくても配列要素が取り出せるのに、後者の多次元配列は『for(int[]n:a){』のように『[]』がついた拡張for文を書いた上で、下にも拡張for文を書いた2重構造でないと配列要素を取り出せないのですか? 後者について『for(int n:a){』の文だけで多次元配列aの要素全て取り出せると思ってました。 因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。 このことと、何か関係があるのか、、?

    • ベストアンサー
    • Java
  • for文で配列を引数として

    こんばんは。 for文で配列a[i][j]を引数として何らかの関数を呼び出すときがうまく動かないって事が起きてます。その関数にa[0][3]のように指定して動かすとうまく動くのですが・・・。 どうしてなのか分かりますか? for(i=0;i<=5;i++){ for(j=0;j<=6;j++){ ここで関数呼び出し; } } 抽象的な質問ですみません。

  • for文を使った配列の処理について

    for文を用いてそれぞれの$i時に別の名前で配列をつくり、共通の処理をするCGIを作ろうとしています。 for($i=1;$i<3;++$i){ @HAIRETSU = "@HAIRETSU$i"; #@HAIRETSUの処理# } のようなソースを用いて@HAIRETSU1、@HAIRETSU2を定義し、それぞれ共通の処理をすることを考えましたが、うまくいきません。何か良い方法はあるでしょうか?

    • ベストアンサー
    • CGI
  • 多次元配列とfor文について

    javascriptの配列について質問です。 例えば: var arrXXX = new Array(); function samplefunc{ //3次元配列の種類の作成 for (m = 0; m < aaa.length ; m++) { //連想配列作成 arrXXX .push(aaa[m]); } for (j = 0; j < bbb.length; j++) { for (i = 0; i < ccc.length; i++) { arrXXX[aaa[j]] = new Array(ccc.length); arrXXX[aaa[j]][i] = new Array(ccc.length); for (k = 0; k < ddd.length; k++) { arrXXX[aaa[j]][i][k] = eee;     ここでは配列を適切に使える・・・ } } } ここでarrXXXを使いたいが、3次元配列でなくなっている?!  arrXXX[~][0][0]はnullまたはオブジェクトではありません・・・がでます。 } 結局、for文を完全にでてしまうと、せっかくつくった配列がダメになってしまいます。どうすればfor文外で配列を使用できるのか教えてください!

  • 配列のポインタについて

    C言語で処理が下記のような処理を作成したいと思っております。 関数の引数によって、データを代入する配列を切り替えたいと考えております。 下記のような処理を考えた場合、if文の中・for文のbuffをどのように処理すれば よいでしょうか? アドバイスよろしくお願い致します。 int a[100][150]; int b[100][150]; void sample(int flg) { int i,j; unsigned short *buff; if(flg == 0){ buff = &a; }else{ buff = &b; } for( j=0 ; j<100 ; j++ ){ for( i=0 ; i<150 ; i++ ){ buff[y][x] = data; x++; } x = 0; y++; } }

  • 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言語についてです。 例えば関数中で for(i=0;i<10;i++){ for(j=0;j<10;j++){ A[i][j]=・・・; } } という10×10の配列に1つ1つ値が入っているとします。 このfor文の中で入れた値をfor文の外で使うことは出来ないのでしょうか? 例えば、 for(i=0;i<10;i++){ for(j=0;j<10;j++){ A[i][j]=・・・; } } for(k=0;k<10;k++){ for(l=0;l<10;l++){ B[k][l] = A[i][j]/2; } } みたいな形です。 つまり、A[i][j]の初期化を防ぐ方法はあるのでしょうか? 分かりにくくてすいません。

  • 特殊なfor文について

    SJC-P 問題集 問13の疑問より for文について教えてください。 一般的なfor文だと次の形だと思うのですが for(int i = 0; i < 5; i ++){ //5回ループする } Animal [] animals = { new Animal(), new Cow() }; for( Animal a : オブジェクト配列animals ){ a.saySomething(); } のような場合、このfor文は 「オブジェクト配列の中にanimalsがあるまでの間、ループする」という意味を指しているのでしょうか? for( クラス名 オブジェクト名 : オブジェクト配列) の一文にある「:」← の役割は何なのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう