2016-10-30 8 views
0

1つの列に24個の科学的な数値のリストをtxtファイル(%le形式を使用)として与えました。科学的表記法によるファイルから2次元配列への入力を読み取る

#include <stdio.h> 
    #include <stdlib.h> 



    void main() 
    { 
     int i; 
     int j; 

    /*matrix*/ 

    double** mat=malloc(24*sizeof(double*)); 
    for(i=0;i<24;++i) 
    mat[i]=malloc(1*sizeof(double)); 


     FILE *file; 
     file=fopen("input.txt", "r"); 


     if ((file = fopen("input.txt", "r")) == NULL) 
     { 
     printf("Error! opening file"); 
     // Program exits if file pointer returns NULL. 
     exit(1);   
     } 

    else 

    for(i = 0; i < 24; i++) 
{ 
    for(j = 0; j < 1; j++) 
    { 

    if (!fscanf(file, "%le", &mat[i][j])) 
     break; 

    printf("%le\n",mat[i][j]); 
    } 


} 
    fclose(file); 
} 

今私は

私はそれをどのように行うか6行列Aによって4に24個の要素のこの1次元配列を載せていきたいと思いますか?私は=>

for(m=1;m<=4;m++) 
    { 
    for(n=1;n<=6;n++) 
     { 
      mat[k][1]=A[i][j]; 

      k++; 
     } 

    } 

     printf("%lf \n",A[i][j]); 

をやって試してみました。しかし、これはnothing.IはCに新しいですしので、任意の助けをいただければ幸いです

はあなたに感謝します。

プログラムが...あなたがあなたのループ内で、jのインデックスをIを増加させないと、あなたは第二の内側のprintfを置く必要があるようだ

答えて

0
for(m=1;m<=4;m++) 
{ 
    for(n=1;n<=6;n++) 
    { 
    mat[k][1]=A[i][j]; 
    k++; 
    } 
} 

あなたのループインデックスはmnですが、あなたはあなたの添字としてijを使用している - ijループで初期化したり更新飽きません。

大きな問題は、あなたがmat[k][1]A[i][j]の値を割り当てるのではなく、他の方法で回避されていることです。

しかし、これにはまだ問題があります.Cでは、N要素の配列は0からN-1までインデックスされています。 Aは、4×6のアレイであり、matが24x1アレイ(すなわち後で以上)であれば、あなたのループは

for (m = 0; m < 4; m++) 
{ 
    for (n = 0; n < 6; n++) 
    { 
    A[m][n] = mat[k++][0]; 
    } 
} 

を書き込まなければならない場合、最初の要素はインデックス0にあり、第二等インデックス1、

であります

mat ...

について、あなたは24個の値を保存するために起こっているのを知っていれば、動的にmatを割り当てる必要が理由は明らかではありません。なぜ24x1アレイである必要があるのか​​も不明です。ただ、doubleの24要素の配列として宣言:

double mat[24]; 
... 
for (i = 0; i < 24; i++) 
{ 
    if (scanf(file, "%le", &mat[i]) != 1) 
    // handle read error 
} 
... 
for (k = 0, i = 0; i < 4; i++) 
    for (j = 0; j < 6; j++) 
    A[i][j] = mat[k++]; 

最後に、void main()int main(void)でなければなりません。

0

読んで、私が知っている行列で書くような単純なタスクのためには長すぎますループ。

試してみてください。この

k=0; 
for(i=0;i<4;i++) 
for(j=0;j<6;j++) 
{ 
    A[i][j] = *(mat[k++]); 
    printf("%f\n",A[i][j]); 
} 
0
for(m=1;m<=4;m++) //wrong counters 
{ 
    for(n=1;n<=6;n++) 
    { 
     mat[k][1]=A[i][j]; //does not assign anything 
     k++; 
    } 
} 
printf("%lf \n",A[i][j]); //not in loop 

あなたは、配列は0からインデックス化されているので、ループのために0からカウントを開始そして、あなたは右の記号を使用していることを確認してくださいとしてKを宣言している必要がありますintを作成し、初期化しました。つまり、int k = 0;です。

値を割り当てたいものは左側に、割り当てられているものは右側にある必要があります。

最後に、printステートメントはループ内にありません。ここで

は一例です:

for(int i = 0; i < 4; i++){ 
    for(int j = 0; j < 6; j++){ 
     A[i][j] = mat[k][0]; 
     k++; 
     printf("%lf \n",A[i][j]); 
    } 
} 
関連する問題