2016-04-28 16 views
-1

で行列私は私の仕事で問題にかなり良い解決策を見つけるたびに、常にその気持ちを台無しにC言語でコーディングを開始...いくつかの簡単なCコードとnoobingなぜそれが働いていないのOO 私は2次元配列(配列の配列)で行列を表現し、テキストファイルからそれを記入したいと思います。コードは悪いです、コードは醜いです...私はあなたから取ってくることができるチップ/トリックに興味があります:ストアN ^(n個の* n)でC

私の論理には何が間違っていますか?フードの下には何がありますか? []演算子を期待通りに使用していませんか?単に2D配列を反復処理する方法がわかりませんか?私はfor()の宣言を使って、clでWindows上でこのソースをコンパイルし、神は厳密にCのようなものが何であるかを知っています。

入力は、マトリックスのサイズとその要素を空白で区切ったテキストファイルです。この構文は次のとおりです。file:= {n、A | N:-N、A:= N ^(n個の* n)で}たとえば

3 
1 3 2 
4 5 2 
7 0 1 

だからここにある...カバーを取ります!

ファイルの最初の整数に基づいて配列を割り当てる、ファイル、最小限のコードをチェックし、エラーなし:)

FILE *fp = fopen("mat_mul.test", "r"); 

を開く

#include <stdio.h> 

int main(int argc, char **argv) { 

...これは正しいですか?配列の配列を割り当てるためのより良いアプローチはありますか? D

char act; 
    int i = 0, j = 0; 
    while (EOF != (act = fgetc(fp))) 
     if ('0' <= act && '9' >= act) 
      A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0'; 

    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      printf("A[%i][%i]=%i\n", i, j, A[i][j]); 
     } 
    } 

余すことなく、クリーニング:

int n = fgetc(fp) - '0'; 
    int **A = (int**) malloc(sizeof(int*) * n); 
    for (int i = 0; i < n; i++) 
     A[i] = (int*) malloc(sizeof(int) * n); 

AAAND、ここでは魔法、そのマスターに対するなったもの呪文です!あなたは、ブラケットの第二の対中jに割り当てる

A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0'; 

ともにその値にアクセス:あなたは一度ここで、行と列の割り当てと進歩をしようとするときは、未定義の振る舞いを呼び出す

if (fclose(fp)) { 

    return 0; 
} 
+1

「char act;」で始まる - > int act; ' –

+0

[' fgetc'](http://en.cppreference.com/w/c/io/fgetc)はあなたが知っているように、1文字を読み込みます。最初の行にはいくつの文字があるのでしょうか? 1つではありませんが、* 2 *、改行を忘れてしまいます。私はデバッガを使用することを習得することを推奨します。そのため、同時にすべての変数の値を監視することができます。 –

+0

しかし、それはすべての繰り返しでif()のために無視されるか、間違っていますか? – NMD

答えて

1

最初のペア。 (私のコンパイラは、「jの演算は未定義である」と警告しています)。三項演算子の部分の間にはシーケンスポイントがありますが、二つのインデックス演算子の間にはありません。[]

未定義の振る舞い以外にも、私の意見では表現が不必要に複雑になります。セパレートassignmemt、行と列のカウンターを進める:

if ('0' <= act && '9' >= act) {    
     A[i][j] = act - '0'; 

     j++; 
     if (j == n) { 
      j = 0; 
      i++; 
      if (i == n) break; // end outer while 
     } 
    } 

またmallocの宣言に<stdlib.h>を含める必要があります。 (それは私のコンパイラが警告が有効になっていると私に知らせるものです)

+0

説明とあなたの意見を私のコードにもありがとう。これは本当に適切なCコードを作るのに大いに役立ちます! – NMD

関連する問題