Написание абстрактного типа данных (полиморфная коллекция) - 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.
- Программа завершается без ошибок.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д