我必须实现一个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.
}
答案 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]
。