Написание абстрактного типа данных (полиморфная коллекция) - 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();
- }
Объяснение кода листинга программы
- Объявлен тип данных struct matrix, который содержит поля size, type и pObject.
- Определены функции Matrix_set, Matrix_new, Matrix_sum и Matrix_print.
- В функции Matrix_set происходит запрос на ввод элементов матрицы и их сохранение в динамически выделенной памяти.
- В функции Matrix_new происходит выделение динамической памяти под матрицу заданного типа и размера.
- В функции Matrix_sum происходит сложение двух матриц a и b, если их типы и размеры совпадают.
- В функции Matrix_print происходит вывод содержимого матрицы на экран.
- В функции main происходит создание и заполнение двух матриц m1 и m2, их сложение и вывод результата на экран.
- Для работы с матрицами вводится размер матрицы и тип элементов (целые числа или числа с плавающей точкой).
- Матрицы создаются и заполняются с помощью функции scanf.
- Для работы с целыми числами используется тип данных int, для работы с числами с плавающей точкой - float.
- Ввод и вывод элементов матрицы осуществляется с помощью функций scanf и printf соответственно.
- Для хранения элементов матрицы используется динамическая память, выделяемая с помощью функции malloc.
- При выходе из программы необходимо нажать любую клавишу.
- Ввод и вывод элементов матрицы осуществляются в цикле for.
- Если размер одной матрицы не равен размеру другой, то происходит выход из программы с сообщением об ошибке.
- Результат сложения двух матриц выводится на экран с помощью функции printf.
- Для работы с целыми числами используется тип данных int, для работы с числами с плавающей точкой - float.
- Для хранения результата сложения используется динамическая память, выделяемая с помощью функции malloc.
- Для выхода из программы используется функция getchar.
- Программа завершается без ошибок.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д