0

2 つの行列の乗算を実行する C プログラムを実装する必要があり (そう、宿題です :)、ユーザーからの入力を受け取り、それを検証する関数を考案しようとしています。

私の最初の考えは、プログラムが自動的に計算するように、ユーザーに行列を入力するように求めるだけです(空白で区切られた数字、改行による行、および行列の終わりを知らせる改行の後のおそらく「e」だけ)。列と行の数を取得し、それらを 2 次元配列に格納します。しかし、サイズが事前にわからない場合、どうすれば十分なメモリを動的に割り当てることができますか? 可能であれば、ユーザーに各行列の行数と列数を手動で入力するように求めることは避けたいと思います。

さらに、間違ったデータや欠落しているデータに対して入力を検証する最良の方法は何ですか (たとえば、文字、ゴミ、他の行よりも数が少ない行など)。各行を strtok し、区切り文字として空白を使用してそれらを分割し、各トークンが厳密に数値であるかどうかを確認することを考えていました。これは、各行に有効な数値のみが含まれているかどうかを判断する最良の方法ですか? よりクリーンで正気なアプローチはありますか?

これは私の擬似コードです:

function getMatrix () {
   while(true) {
   Receive a matrix as input, until the user enters 'e' in a new line by itself;
   Split the matrix in rows delimited by newlines;
   Split the rows in strings delimited by whitespaces;
   For each string {
     If the string is numeric, save it as matrix[rowNumber][colNumber];
     Else print a warning and discard the entire input;
   }
   If each row of the matrix has an equal number of elements {
      return the matrix as an array of integers;
   } else {
      print a warning and let the user re-enter the data.
  }
 }
}

main () {
    matrix1 = getMatrix;
    matrix2 = getMatrix;

    matrix1x2 = multiply the two matrices (this is the easy part :)
    print matrix1x2.
}
4

1 に答える 1

1

これは、C では少し面倒です。しかし、ユーザーに行列の次元を指定してほしくない場合は、数値を入れるための成長バッファーが必要になります。これは、realloc を使用して実装できます。次のようになります(テストされていません):

int n = 0, nmax = 100;
size_t len = 0;
int nrow = 0, ncol = 0;
double * mat = malloc(nmax);
char * line = NULL, *tok;
while(getline(&line, &len, stdin) > 0)
{
    nrow++;
    ncol = 0;
    for(tok = strtok(line, " \t"); tok; tok = strtok(NULL, " \t"))
    {
        ncol++; n++;
        if(n > nmax) mat = realloc(mat, (nmax *= 2)*sizeof(double));
        mat[n-1] = atof(tok);
    }
}
mat = realloc(mat, nrol*nrow*sizeof(double));
free(line);

これが行っていることは、入力を行ごとに読み取り、スペースまたはタブ区切りのトークンをループし、それぞれを double に変換し、必要に応じて展開される 1 次元バッファーに割り当てることです。メモリの再割り当てに費やされる時間を最小限に抑えるために、その容量を毎回 2 倍にします (これは C++ ベクトル クラスでも行われます)。また、表示された行と列の数を追跡しますが、エラー チェックは行わないため、実用的なバージョンにはもう少し作業が必要です。

結果の行列のインデックス (i,j) の値を取得するには、線形インデックスを計算する必要がありますval = mat[i*ncol+j]

于 2012-10-29T21:13:35.303 に答える