логическое умножение матриц A и B операциями «И» и «ИЛИ» в C - PullRequest
0 голосов
/ 04 мая 2020

Это вопрос:

Логическая матрица - это матрица, в которой все ее элементы равны 0 или 1.

Мы определяем логическое умножение матриц A и B следующим образом: операция, определенная ниже, где «·» - логическая операция И, а «+» - логическая операция ИЛИ.

В этом назначении вы создадите две логические матрицы 5x5 и найдете соответствующую матрицу, которая будет созданный из "умножения" этих 2 матриц

  1. Определить глобальный размер равен 5 (уже определено в шаблоне)

  2. Написать функцию, которая получает ссылка на матрицу и считывает ввод в матрицу от пользователя. Если ввод не равен нулю, замените его на 1. Если пользователь не ввел достаточное количество значений до конца строки, оставшиеся ячейки в матрице будут заполнены нулями. Также убедитесь, что если пользователь вводит слишком много символов, вы берете только то, что нужно, и отбрасываете оставшиеся данные. (Например, 1509 является матрицей 2x2 со значениями 1101, а '1 5' также является матрицей 2x2 со значениями 1111, выделенный пробел принимается за 1, как описано выше.)

    Сигнатура функции: void read_mat(int mat[][SIZE])

  3. Напишите функцию, которая умножает, как определено выше, две матрицы и вводит результаты в третью матрицу с подходящими размерами.

    Сигнатура функции: void mult_mat(int mat1[][SIZE],int mat2[][SIZE], int result_mat[][SIZE])

  4. Напишите функцию, которая печатает матрицу на экране. Пожалуйста, используйте «% 3d» для формата печати, чтобы он выглядел хорошо, как показано ниже.

    Подпись функции: void print_mat(int mat[][SIZE])

  5. Напишите основную программу, которая использует функции над. Программа считывает значения матриц от пользователя, умножает их и выводит матрицу результатов на экран.

Приведенные определения функций являются преднамеренными, а операторы возврата - пустыми. Не меняйте их. Массивы передаются между функциями как ссылки, а не как примитивы, подобные переменным. Таким образом, определения функций совершенно верны. Кроме того, нет ограничений на ввод от пользователя. Вы можете прочитать только необходимые цифры, а затем прекратить чтение и отбросить оставшиеся данные.

Вот мой код:

#include <stdio.h>
#define SIZE 5

void read_mat(int mat[][SIZE],int size)
{
    int  i = 0, j = 0, k = 0; 
    char c; 
    c=getchar();
    while(c!='\n' && k<size*size){
        if(c!='0'){
            mat[i][j]=1;
            j++;
        }
        else{
            mat[i][j]=0;
            j++;
        }
        if (j >= size){
            j = 0;
            i++;
        }
        if (i >= size){
            return;
        }
        c=getchar();
        k++;
    }
}


void mult_mat(int mat1[][SIZE], int mat2[][SIZE], int result_mat[][SIZE])
{
    int i,j,k;
    for (i = 0; i <SIZE; ++i){
        for (j = 0; j <SIZE; ++j)
        {
            result_mat[i][j] = 0;
            for (k = 0; k < SIZE; ++k)
                result_mat[i][j] += mat1[i][k] * mat2[k][j];
                if(result_mat[i][j]!=0){
                    result_mat[i][j]=1;
                }
        }
    }



}

void print_mat(int mat[][SIZE],int size)
{
    int i, j;
    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++)
            printf("%3d", mat[i][j]);
        printf("\n");
    }

    //Please use the "%3d" format to print for uniformity.
}

int main()
{
    int mat1[][SIZE]={ 0 }, mat2[][SIZE]={ 0 }, res_mat[][SIZE]={0};
    printf("Please Enter Values For Matrix 1\n");
    read_mat(mat1,SIZE);

    printf("Please Enter Values For Matrix 2\n");
    read_mat(mat2,SIZE);

    mult_mat(mat1,mat2,res_mat);

    printf("The First Matrix Is :- \n");
    print_mat(mat1,SIZE);


    printf("The Second Matrix Is :- \n");
    print_mat(mat2,SIZE);

    printf("The Resultant Matrix Is :- \n");
    print_mat(res_mat,SIZE);

    return 0;
}

Вход и выход должны быть такими :

Please Enter Values For Matrix 1
111000654987010
Please Enter Values For Matrix 2
11 53
The First Matrix Is :-
  1  1  1  0  0
  0  1  1  1  1
  1  1  0  1  0 
  0  0  0  0  0
  0  0  0  0  0

The Second Matrix Is :-
  1  1  1  1  1
  1  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0
The Resultant Matrix Is :-
  1  1  1  1  1
  1  0  0  0  0
  1  1  1  1  1
  0  0  0  0  0
  0  0  0  0  0


Но когда я запускаю программу, появляется это сообщение:

Возникла исключительная ситуация: Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'mat2' поврежден .

и вывод не правильный, и я получаю некоторые элементы имеют значения барахла:

Please Enter Values For Matrix 1
111000654987010
Please Enter Values For Matrix 2
11 53
The First Matrix Is :-
  1  1  1  0  0
  0  1  1  1  1
  1  1  1  1  1
  1  1-858993460-858993460-858993460
-858993460-858993460-858993460-858993460  1
The Second Matrix Is :-
  1  1  1  1  1
-858993460-858993460-858993460-858993460-858993460
-858993460-858993460  1  1  1
  1  1  1  1  1
  1  1  1  1  1
The Resultant Matrix Is :-
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1

Другой вопрос:

, если я вошел в mat1 большая строка, она рассчитывается напрямую, не давая мне ввести строку в mat2, как мне решить эту проблему?

1 Ответ

0 голосов
/ 04 мая 2020
int mat1[][SIZE]={ 0 }

объявит матрицу 1x5. Измените его на

int mat1[SIZE][SIZE]={ 0 }
...