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

Это вопрос:

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

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

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

  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. Напишите основную программу, которая использует функции выше. Программа считывает значения матриц от пользователя, умножает их и печатает матрицу результатов на экране.

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

Вот мой код:

#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][SIZE]={ 0 }, mat2[SIZE][SIZE]={ 0 }, res_mat[SIZE][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


Вопрос:

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

Please Enter Values For Matrix 1
6475465176547650654605836574657625846071654047
Please Enter Values For Matrix 2
The First Matrix Is :-
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  0  1  1  1  1
  0  1  1  1  1
The Second Matrix Is :-
  1  1  1  1  1
  1  1  1  1  1
  1  0  1  1  1
  1  1  0  1  1
  0  0  0  0  0
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

1 Ответ

1 голос
/ 04 мая 2020
if (i >= size){
    return;
}
c=getchar();

После того, как вы прочитали достаточно символов, вы возвращаетесь из функции без использования дополнительных символов. Вам нужно будет изменить лог c, чтобы продолжить вызов getchar() до нажатия '\n', но просто выбросьте эти символы, если i >= size.

while(c!='\n'){
    if(i < size){
        if(c!='0'){
            mat[i][j]=1;
            j++;
        }
        else{
            mat[i][j]=0;
            j++;
        }
        if (j >= size){
            j = 0;
            i++;
        }
    }
    c=getchar();
}
...