ANSI C - 数字矩阵的输入

时间:2012-10-29 20:58:13

标签: c input matrix

我必须实现一个C程序,它执行两个矩阵的乘法(是的,功课:),我正在尝试设计一个接收用户输入并验证它的函数。

我最初的想法是:让我们只要求用户输入矩阵(由空格分隔的数字,按行换行的行数,以及在换行信号结束后用换行符表示的'e'),以便程序将自动计算列数和行数并将它们存储在二维数组中。但是,如果我事先不知道它们的大小,我怎样才能为它们动态分配足够的内存?如果可能的话,我会避免要求用户手动输入每个矩阵的行数和列数。

此外,验证错误和/或缺失数据输入的最佳方法是什么(例如字母,垃圾,数字少于其他数据的行等?)。我正在考虑strtok'ing每一行,使用空格分隔它们作为分隔符,并检查每个标记是否严格数字。这是确定每行是否只包含有效数值的最佳方法吗?是否有更清洁和理智的方法?

这是我的伪代码:

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.
}

1 个答案:

答案 0 :(得分: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);

这样做是按行读取输入,在空格上循环或以制表符分隔的标记,将每个转换为双精度,并将其分配给一维缓冲区,根据需要进行扩展。我每次将其容量乘以2,以便最小化重新分配内存所花费的时间(这也是C ++矢量类所做的)。它还跟踪所看到的行数和列数,但不进行任何错误检查,因此实际版本需要更多的工作。

要获得结果矩阵的索引(i,j)处的值,您必须计算线性索引:val = mat[i*ncol+j]