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