以特定格式输入(矩阵)

时间:2017-11-23 15:03:39

标签: c matrix dynamic-allocation formatted-input

我的作业输入有问题。在stdin上,我将获得一个特定格式的输入。

在第一行中,将有2个整数,用于确定矩阵的大小(行和列)。之后的所有行代表矩阵的行。

我基本上想做像getline()这样的事情,但我不想使用getline()。事实上我不能,它在作业中被禁止。因此,我必须通过int扫描int(或我猜猜char的char)。这里的问题是我需要防弹(差不多)。至少是假的。

我正在想象一个大的循环,一直持续到EOF,并且在另一个循环(也许是?)里面总是读取一条线,将它保存到我分配的矩阵并继续下一个。我知道我应该检查'\ n',但我现在还没有能力考虑解决方案。

以下是我正在使用的内容:我的矩阵是一种结构。

struct Matrix{
    int nrows;
    int ncols;
    int** matrix;
};

然后我有多个功能。

为特定大小的矩阵动态分配空间的函数:

struct Matrix init_matrix(int r, int c)
{
    struct Matrix mat;
    mat.nrows = r;
    mat.ncols = c;
    mat.matrix = calloc(r, sizeof(int *));
    for(int i = 0; i < r; ++i)
    {
        *(mat.matrix+i) = calloc(c, sizeof(int));
    }

    return mat;
}

释放先前分配的空间的函数:

void free_matrix(struct Matrix mat)
{   
    int top = mat.nrows;
    for(int i = 0; i < top; ++i)
    {
        free(mat.matrix[i]);
    }
    free(mat.matrix);
}

这两个功能完美无缺。

现在我正在尝试创建一个函数create_matrix(void)(至少我认为它不应该采用任何args),这将读取我应该接收的输入,例如:

3 3
1 2 3
4 5 6
7 8 9

当函数读取输入时,它可以判断输入是否不正确或格式是否正确并退出程序并返回相应的退出值(如100 fe)如果输入正确且格式正确,则调用init_matrix( )然后将输入保存到矩阵。

为了更深入的理解:我应该收到的整个输入是: 矩阵A(如上所述,第一行的大小,后面的行中的值) 一个操作(+, - ,*) 矩阵B

然后执行操作(A * B,A + B等)。我正在尝试将大多数东西变成函数,所以主要是非常简单的,例如。

int main(int argc, char *argv[])
{
    struct Matrix mat1 = create_matrix();
    char operation = get_operation();
    struct Matrix mat2 = create_matrix();
    struct Matrix result = compute(mat1,mat2, operation);
    return 0;
}

如果你找到我,就会出现这些问题。问题是我想让程序足够复杂,以便我以后可以编辑它来处理比两个矩阵更大的序列(最多100个)。现在我可以用脏的方式做到这一点,通过一次操作让它适用于两个矩阵,但这不是我真正想要的。

1 个答案:

答案 0 :(得分:1)

嗯,这就是我解决它的方式。有用。它不是接近完美的任何地方,但它起作用,上传系统接受它并给它全部积分,所以我很满意。

struct Matrix read_matrix(FILE *fp)
{
    struct Matrix mat;
    //FIRST LINE
    int ch;
    int i = 0;
    int n = 20;
    char* line = calloc(n,sizeof(char));
    while((ch = fgetc(fp)) != EOF && ch != '\n')
    {
        *(line + i++) = ch;
    }
    *(line + n-1) = '\0';
    int r,c;
    int k = sscanf(line,"%d %d", &r, &c);
    if(k != 2)
    {
        fprintf(stderr, "Error: Chybny vstup!\n");
        exit(100);
    } 
    free(line);
    //MATRIX
    line = calloc(c, sizeof(int));
    mat = init_matrix(r, c);
    i = 0;
    r = 0;
    while(r < mat.nrows && (ch = fgetc(fp)))
    {
        if(ch == '\n' || ch == EOF)
        {
            *(line + i) = '\0';
            int offset;
            char *data = line;
            for(int j = 0; j < mat.ncols; ++j)
            {
                int d = sscanf(data, " %d%n", &mat.matrix[r][j], &offset);
                if(d != 1){
                    fprintf(stderr, "Error: Chybny vstup!\n");
                    exit(100);
                }
                data += offset;
            }
            i = 0;
            ++r;
            if(ch == EOF){ 
                break;
            }
        } else
        {
            *(line + i++) = ch;
        }
    }
    free(line);
    return mat;
}