Написание абстрактного типа данных (полиморфная коллекция) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, с программой. Необходимо написать абстрактный тип данных (полиморфную коллекцию), поэтому использован указатель типа void. Программа вылетает сразу после того, как выбираем необходимый для работы тип данных.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct matrix
{
    int size_of_matrix;
    void* pointer_Undefined_Object;
} Matrix;

void get_memory(int size_of_matrix, matrix* p) {
    struct matrix M;
    int z, k;
     p = &M;
    M.size_of_matrix = size_of_matrix;
    if (size_of_matrix > 0) {

        printf("For work with integer humbers choose 1, for work with float - 0\n");
        scanf_s("%d", &z);
        if (z = 0)
        {
            k = sizeof(float);
 
        }
        else
        {
            k = sizeof(int);
 
        }
        M.pointer_Undefined_Object = malloc(M.size_of_matrix*M.size_of_matrix * k);

    }
}
void create_matrix_float(int size_of_matrix, matrix* p)
{
    struct matrix M;
    p = &M;
    M.size_of_matrix = size_of_matrix;
    {
 
        for (int i = 0; i <= M.size_of_matrix; i++)
        {
            for (int j = 0; j <= M.size_of_matrix; j++)
            {
                printf("Enter  componets of matrix >> ");
                scanf_s("%f", (((float*)M.pointer_Undefined_Object + i) + j));

            }
        }

        for (int i = 0; i < M.size_of_matrix; i++)
        {
            for (int j = 0; j < M.size_of_matrix; j++)
            {
                printf("%6.1f", *(((float*)M.pointer_Undefined_Object + i) + j));

            }
            printf("\n");
        }
 
    }
}
 
void create_matrix_int(int size_of_matrix, matrix* p)
 
{
    struct matrix M;
    p = &M;
    for (int i = 0; i <= M.size_of_matrix; i++)
    {
        for (int j = 0; j <= M.size_of_matrix; j++)
        {
            printf("Enter  componets of matrix >> ");
            scanf_s("%f", (((int*)M.pointer_Undefined_Object + i) + j));

        }
    }

    for (int i = 0; i < M.size_of_matrix; i++)
    {
        for (int j = 0; j < M.size_of_matrix; j++)
        {
            printf("%6.1f", *(((int*)M.pointer_Undefined_Object + i) + j));

        }
        printf("\n");
    }
 
}
 
void main()

{
    struct matrix M;
    matrix* p = &M;
 
    int z;
    int size_of_matrix;
    printf("Enter the size of matrix >>");
    scanf_s("%d", &size_of_matrix);

    printf("For work with integer humbers choose 1, for work with float - 0\n");
    scanf_s("%d", &z);
    if (z = 0)
    {
        create_matrix_float(size_of_matrix, p);
    }
    else
    {
        create_matrix_int(size_of_matrix, p);
    }
    
    }

Решение задачи: «Написание абстрактного типа данных (полиморфная коллекция)»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct matrix
{
    int size;
    int type; // 1 - int, 0 float
    void* pObject;
} Matrix;
 
 
void Matrix_set(Matrix *m)
{
    switch(m->type) {
        case 1:
            for (int i = 0; i < m->size; i++)
            {
                for (int j = 0; j < m->size; j++)
                {
                    printf("Enter %dx%d componets of matrix >> ", i, j); // приглашение для ввода очередного элемента матрицы
                    scanf("%d", (int*)m->pObject + (i*m->size) + j);
                }
            }
            break;
        default:
            break;
    }
}
 
Matrix *Matrix_new(int type, int size) 
{
    Matrix *m;
    m = malloc(sizeof(Matrix));
    switch (type)
    {
        case 1:
            m->pObject = malloc(sizeof(int)*size*size);
            m->type = type;
            m->size = size;
            break;
        default:
            m->pObject = malloc(sizeof(float)*size*size);
            m->type = type;
            m->size = size;
            break;
    }
        return m;
}
Matrix *Matrix_sum(Matrix *a, Matrix *b)
{
    if (a->size != b->size || a->type != b->type) {
        fprintf(stderr, "a size != b size or a type != b type\n");
        return NULL;
    }
 
    int size = a->size;
    Matrix *res = Matrix_new(a->type, size); 
    switch(a->type){
        case 1:
           for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                    *((int*)res->pObject + (i*size) + j) = *((int*)a->pObject + (i*size) + j) + *((int*)b->pObject + (i*size) + j);
            }
            break;
        default:
            break;
    }
    return res;
}
 
void Matrix_print(Matrix *m)
{
    switch(m->type) {
        case 1:
            for (int i = 0; i < m->size; i++)
            {
                for (int j = 0; j < m->size; j++)
                    printf("%d  ", *((int*)m->pObject + (i*m->size) + j));
                printf("\n");
            }
            break;
        default:
            break;
    }
}
int main(void)
{
    int type;
    int size_of_matrix;
    printf("Enter the size of matrix -> ");
    scanf("%d", &size_of_matrix);
    
    printf("For work with integer numbers choose 1, for work with float - 0 -> ");
    scanf("%d", &type);    
    Matrix *m1 = Matrix_new(type, size_of_matrix);
    Matrix_set(m1);
    Matrix_print(m1);
 
    printf("For work with integer numbers choose 1, for work with float - 0 -> ");
    scanf("%d", &type);
    Matrix *m2 = Matrix_new(type, size_of_matrix);
    Matrix_set(m2);
    Matrix_print(m2);
 
    Matrix *m3 = Matrix_sum(m1, m2);
    Matrix_print(m3);
 
    printf("\nPress any key to continue... ");
    getchar();
}

Объяснение кода листинга программы

  1. Объявлен тип данных struct matrix, который содержит поля size, type и pObject.
  2. Определены функции Matrix_set, Matrix_new, Matrix_sum и Matrix_print.
  3. В функции Matrix_set происходит запрос на ввод элементов матрицы и их сохранение в динамически выделенной памяти.
  4. В функции Matrix_new происходит выделение динамической памяти под матрицу заданного типа и размера.
  5. В функции Matrix_sum происходит сложение двух матриц a и b, если их типы и размеры совпадают.
  6. В функции Matrix_print происходит вывод содержимого матрицы на экран.
  7. В функции main происходит создание и заполнение двух матриц m1 и m2, их сложение и вывод результата на экран.
  8. Для работы с матрицами вводится размер матрицы и тип элементов (целые числа или числа с плавающей точкой).
  9. Матрицы создаются и заполняются с помощью функции scanf.
  10. Для работы с целыми числами используется тип данных int, для работы с числами с плавающей точкой - float.
  11. Ввод и вывод элементов матрицы осуществляется с помощью функций scanf и printf соответственно.
  12. Для хранения элементов матрицы используется динамическая память, выделяемая с помощью функции malloc.
  13. При выходе из программы необходимо нажать любую клавишу.
  14. Ввод и вывод элементов матрицы осуществляются в цикле for.
  15. Если размер одной матрицы не равен размеру другой, то происходит выход из программы с сообщением об ошибке.
  16. Результат сложения двух матриц выводится на экран с помощью функции printf.
  17. Для работы с целыми числами используется тип данных int, для работы с числами с плавающей точкой - float.
  18. Для хранения результата сложения используется динамическая память, выделяемая с помощью функции malloc.
  19. Для выхода из программы используется функция getchar.
  20. Программа завершается без ошибок.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы