【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19252

2次元配列からに1次元配列に変換したいのです。
投稿者---montan(2005/01/17 01:08:00)


以下のように規則性を持ちながら一次元配列にしたいのですが効率の
良い作り方を教えてください。ちなみにvec[500]まで作りたいと思っ
ています。

vec[0]=f[0][0];
vec[1]=f[0][1];
vec[2]=f[1][0];
vec[3]=f[2][0];
vec[4]=f[1][1];
vec[5]=f[0][2];
vec[6]=f[0][3];
vec[7]=f[1][2];
vec[8]=f[2][1];
vec[9]=f[3][0];
vec[10]=f[4][0];
vec[11]=f[3][1];
vec[12]=f[2][2];
vec[13]=f[1][3];
vec[14]=f[0][4];
vec[15]=f[0][5];
vec[16]=f[1][4];
vec[17]=f[2][3];
vec[18]=f[3][2];
vec[19]=f[4][1];
vec[20]=f[5][0];
vec[21]=f[6][0];
vec[22]=f[5][1];
vec[23]=f[4][2];
vec[24]=f[3][3];
vec[25]=f[2][4];
vec[26]=f[1][5];
vec[27]=f[0][6];
vec[28]=f[0][7];
vec[29]=f[1][6];
vec[30]=f[2][5];
vec[31]=f[3][4];
vec[32]=f[4][3];
vec[33]=f[5][2];
vec[34]=f[6][1];
vec[35]=f[7][0];
vec[36]=f[8][0];
vec[37]=f[7][1];
vec[38]=f[6][2];
vec[39]=f[5][3];
      ・
      ・
vec[500]=f[][];


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2次元配列からに1次元配列に変換したいのです。 19260 かずま 2005/01/17 02:05:05
<子記事> Re:2次元配列からに1次元配列に変換したいのです。 19290 monkey 2005/01/18 07:31:08


No.19260

Re:2次元配列からに1次元配列に変換したいのです。
投稿者---かずま(2005/01/17 02:05:05)


効率がよいかどうかわかりませんが、
#include <stdio.h>
  
#define N  500
#define M   32
  
void set(int *vec, int f[M][M])
{
    int i, j, k;
  
    for (i = k = 0; ; ) {
        for (j = 0; j <= k; j++) {
            vec[i] = f[k-j][j];
            if (++i > N) return;
        }
        k++;
        for (j = 0; j <= k; j++) {
            vec[i] = f[j][k-j];
            if (++i > N) return;
        }
        k++;
    }
}
  
int main(void)
{
    int vec[N], f[M][M], i, j;
 
    for (i = 0; i < M; i++)
        for (j = 0; j < M; j++)
            f[i][j] = i*1000 + j;
    set(vec, f);
    for (i = 0; i <= N; i++)
        printf("vec[%d] = f[%d][%d]\n", i, vec[i]/1000, vec[i]%1000);
    return 0;
}



この投稿にコメントする

削除パスワード

No.19262

Re:2次元配列からに1次元配列に変換したいのです。
投稿者---montan(2005/01/17 07:30:29)


#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
  
#define N  500
#define M   32



void set(double *vec, double f[M][M])
{
    int i, j, k;
  
    for (i = k = 0; ; ) {
        for (j = 0; j <= k; j++) {
            vec[i] = f[k-j][j];
            if (++i > N) return;
        }
        k++;
        for (j = 0; j <= k; j++) {
            vec[i] = f[j][k-j];
            if (++i > N) return;
        }
        k++;
    }
}
  
double main(void)
{
    double vec[N], f[M][M];
    int  i, j;

    char hi[70];
    FILE *fp;

sprintf(hi,"D:\\work\\1.dat");
        if( (fp = fopen(hi,"rt")) == NULL ){
        exit(1);
    }
    for( i = 0; i < M; i++ ){
        for(j=0;j<M;j++){
            fscanf(fp,"%lf",&f[i][j]);
            //printf("%lf",f[i][j]);getch();
        
    }}  //printf("\n");
    fclose(fp);

 
    for (i = 0; i < M; i++)
        for (j = 0; j < M; j++)
            f[i][j] = i*1000 + j;
    set(vec, f);
   for (i = 0; i <= N; i++)
     printf("vec[%d] = f[%d][%d]\n", i, vec[i]/1000, vec[i]%1000);


    return 0;
}




プログラムが走らないです('+')


この投稿にコメントする

削除パスワード

No.19263

Re:2次元配列からに1次元配列に変換したいのです。
投稿者---REE(2005/01/17 09:29:27)


>プログラムが走らないです('+')

※環境(OSとコンパイラ)や症状は具体的に詳しく!


この投稿にコメントする

削除パスワード

No.19264

Re:2次元配列からに1次元配列に変換したいのです。
投稿者---gf(2005/01/17 09:30:09)


>double main(void)
この記述は、提示されたのと大違いですが

ファイルから読み込んだf[i][j] の値を
> f[i][j] = i*1000 + j;
で、上書きしてますけど?

>プログラムが走らないです('+')
コンパイルできない?、実行時エラー?、実行結果が違う?
その他?のどれでしょうか


この投稿にコメントする

削除パスワード

No.19290

Re:2次元配列からに1次元配列に変換したいのです。
投稿者---monkey(2005/01/18 07:31:08)


このような規則でしょうか。

#include <stdio.h>
#define SIZE   500
#define GROWTH   2

int main( void )
{
    int row = 0, r_shift = -1, r_upper = 2;
    int col = 0, c_shift =  1, c_upper = 1;
    int i;

    for( i = 0; i < SIZE; i++ ){

        printf( "vec[%d] = f[%d][%d]\n", i, row, col );

        if( row == 0 && r_shift < 0 ){
            r_shift = -r_shift;
        }
        else{
            if( row == r_upper ){
                r_shift = -r_shift;
                r_upper += GROWTH;
            }
            row += r_shift;
        }

        if( col == 0 && c_shift < 0 ){
            c_shift = -c_shift;
        }
        else{
            if( col == c_upper ){
                c_shift = -c_shift;
                c_upper += GROWTH;
            }
            col += c_shift;
        }
    }

    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧