Помогите с условиями и циклами на Си

Рейтинг: 0Ответов: 1Опубликовано: 04.03.2023

Делал прогу, в которой нужно создать два массива-матрицы n на n с динамической памятью. С этим все ок. После этого нужно было сделать функцию, которая определяет +, - или * и сделать соответствующие вычисления для матриц. После задания условия - все ок, но после начала цикла for код отказывается работать. В чем может быть проблема?

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

double** new_matrix(int n){
    int i;
    double** matrix = calloc(n, sizeof(double*));
    for(i = 0; i < n; i++){
         matrix[i] = calloc(n, sizeof(double));
    }
    return matrix;
}

void input(int n, double **mat){
    int i, j;
    for(i = 0; i<n; i++){
        for(j =0; j<n; j++){
            printf("input matrix[%d][%d]", i+1, j+1);
            scanf("%lf", &mat[i][j]);
        }
    }
}
void print_mat(int n, double **mat){
    int i, j;
    for(i = 0; i<n; i++){
        for(j =0; j<n; j++){
            printf("%lf\t", mat[i][j]);
        }
        printf("\n");
    }
}
double** calculat_mat(int n, double **mat1, double **mat2){
    double **res = new_matrix(n);
    char c;
    printf("+, -, or *? \n");
    scanf("%s", &c);

    if (c == '+'){
        for (int i=0; i < n; i++){
            for(int j = 0; j<n; j++){
                res[i][j] = mat1[i][j]+mat2[i][j];
            }
        }
        return res;
    }
    else if (c == '-'){
        for (int i=0; i < n; i++){
            for(int j = 0; j<n; j++){
                res[i][j] = mat1[i][j]-mat2[i][j];
            }
        }
        return res;
    }
    else if (c == '*'){
        for (int i=0; i < n; i++){
            for(int j = 0; j<n; j++){
                res[i][j] = 0;
                for(int p=0; p<n; p++){
                    res[i][j] += mat1[i][p]*mat2[p][j];
                }
            }
        }
        return res;
    }
    else{
        return res;
    }
}

int main() {
    int n;
    char c;

    printf("Write size of matrix: \n");
    scanf("%d", &n);

    double **mat1 = new_matrix(n);
    double **mat2 = new_matrix(n);
    double **res = new_matrix(n);

    printf("Input matrix number 1: \n");
    input(n, mat1);

    printf("Input matrix number 2: \n");
    input(n, mat2);


    res = calculat_mat(n, mat1, mat2);
    print_mat(n, res);
    return 0;
}

Если код вам кажется кривым - сорян, я только начал учить Си.

Ответы

▲ 2

Неверное чтение символа.

scanf("%s", &c);

надо заменить на

scanf(" %c", &c);

Так, во-первых, будет читаться символ (не будет выхода за пределы отведенной памяти), а во-вторых, будут пропускаться все пробельные символы (главное - остающийся после ввода числа символ перевода строки).