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

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

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

Помогите, пожалуйста, с программой. Необходимо написать абстрактный тип данных (полиморфную коллекцию), поэтому использован указатель типа void. Программа вылетает сразу после того, как выбираем необходимый для работы тип данных.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. struct matrix
  5. {
  6. int size_of_matrix;
  7. void* pointer_Undefined_Object;
  8. } Matrix;
  9.  
  10. void get_memory(int size_of_matrix, matrix* p) {
  11. struct matrix M;
  12. int z, k;
  13. p = &M;
  14. M.size_of_matrix = size_of_matrix;
  15. if (size_of_matrix > 0) {
  16.  
  17. printf("For work with integer humbers choose 1, for work with float - 0\n");
  18. scanf_s("%d", &z);
  19. if (z = 0)
  20. {
  21. k = sizeof(float);
  22. }
  23. else
  24. {
  25. k = sizeof(int);
  26. }
  27. M.pointer_Undefined_Object = malloc(M.size_of_matrix*M.size_of_matrix * k);
  28.  
  29. }
  30. }
  31. void create_matrix_float(int size_of_matrix, matrix* p)
  32. {
  33. struct matrix M;
  34. p = &M;
  35. M.size_of_matrix = size_of_matrix;
  36. {
  37. for (int i = 0; i <= M.size_of_matrix; i++)
  38. {
  39. for (int j = 0; j <= M.size_of_matrix; j++)
  40. {
  41. printf("Enter componets of matrix >> ");
  42. scanf_s("%f", (((float*)M.pointer_Undefined_Object + i) + j));
  43.  
  44. }
  45. }
  46.  
  47. for (int i = 0; i < M.size_of_matrix; i++)
  48. {
  49. for (int j = 0; j < M.size_of_matrix; j++)
  50. {
  51. printf("%6.1f", *(((float*)M.pointer_Undefined_Object + i) + j));
  52.  
  53. }
  54. printf("\n");
  55. }
  56. }
  57. }
  58. void create_matrix_int(int size_of_matrix, matrix* p)
  59. {
  60. struct matrix M;
  61. p = &M;
  62. for (int i = 0; i <= M.size_of_matrix; i++)
  63. {
  64. for (int j = 0; j <= M.size_of_matrix; j++)
  65. {
  66. printf("Enter componets of matrix >> ");
  67. scanf_s("%f", (((int*)M.pointer_Undefined_Object + i) + j));
  68.  
  69. }
  70. }
  71.  
  72. for (int i = 0; i < M.size_of_matrix; i++)
  73. {
  74. for (int j = 0; j < M.size_of_matrix; j++)
  75. {
  76. printf("%6.1f", *(((int*)M.pointer_Undefined_Object + i) + j));
  77.  
  78. }
  79. printf("\n");
  80. }
  81. }
  82. void main()
  83.  
  84. {
  85. struct matrix M;
  86. matrix* p = &M;
  87. int z;
  88. int size_of_matrix;
  89. printf("Enter the size of matrix >>");
  90. scanf_s("%d", &size_of_matrix);
  91.  
  92. printf("For work with integer humbers choose 1, for work with float - 0\n");
  93. scanf_s("%d", &z);
  94. if (z = 0)
  95. {
  96. create_matrix_float(size_of_matrix, p);
  97. }
  98. else
  99. {
  100. create_matrix_int(size_of_matrix, p);
  101. }
  102. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. typedef struct matrix
  6. {
  7.     int size;
  8.     int type; // 1 - int, 0 float
  9.     void* pObject;
  10. } Matrix;
  11.  
  12.  
  13. void Matrix_set(Matrix *m)
  14. {
  15.     switch(m->type) {
  16.         case 1:
  17.             for (int i = 0; i < m->size; i++)
  18.             {
  19.                 for (int j = 0; j < m->size; j++)
  20.                 {
  21.                     printf("Enter %dx%d componets of matrix >> ", i, j); // приглашение для ввода очередного элемента матрицы
  22.                     scanf("%d", (int*)m->pObject + (i*m->size) + j);
  23.                 }
  24.             }
  25.             break;
  26.         default:
  27.             break;
  28.     }
  29. }
  30.  
  31. Matrix *Matrix_new(int type, int size)
  32. {
  33.     Matrix *m;
  34.     m = malloc(sizeof(Matrix));
  35.     switch (type)
  36.     {
  37.         case 1:
  38.             m->pObject = malloc(sizeof(int)*size*size);
  39.             m->type = type;
  40.             m->size = size;
  41.             break;
  42.         default:
  43.             m->pObject = malloc(sizeof(float)*size*size);
  44.             m->type = type;
  45.             m->size = size;
  46.             break;
  47.     }
  48.         return m;
  49. }
  50. Matrix *Matrix_sum(Matrix *a, Matrix *b)
  51. {
  52.     if (a->size != b->size || a->type != b->type) {
  53.         fprintf(stderr, "a size != b size or a type != b type\n");
  54.         return NULL;
  55.     }
  56.  
  57.     int size = a->size;
  58.     Matrix *res = Matrix_new(a->type, size);
  59.     switch(a->type){
  60.         case 1:
  61.            for (int i = 0; i < size; i++)
  62.             {
  63.                 for (int j = 0; j < size; j++)
  64.                     *((int*)res->pObject + (i*size) + j) = *((int*)a->pObject + (i*size) + j) + *((int*)b->pObject + (i*size) + j);
  65.             }
  66.             break;
  67.         default:
  68.             break;
  69.     }
  70.     return res;
  71. }
  72.  
  73. void Matrix_print(Matrix *m)
  74. {
  75.     switch(m->type) {
  76.         case 1:
  77.             for (int i = 0; i < m->size; i++)
  78.             {
  79.                 for (int j = 0; j < m->size; j++)
  80.                     printf("%d  ", *((int*)m->pObject + (i*m->size) + j));
  81.                 printf("\n");
  82.             }
  83.             break;
  84.         default:
  85.             break;
  86.     }
  87. }
  88. int main(void)
  89. {
  90.     int type;
  91.     int size_of_matrix;
  92.     printf("Enter the size of matrix -> ");
  93.     scanf("%d", &size_of_matrix);
  94.    
  95.     printf("For work with integer numbers choose 1, for work with float - 0 -> ");
  96.     scanf("%d", &type);    
  97.     Matrix *m1 = Matrix_new(type, size_of_matrix);
  98.     Matrix_set(m1);
  99.     Matrix_print(m1);
  100.  
  101.     printf("For work with integer numbers choose 1, for work with float - 0 -> ");
  102.     scanf("%d", &type);
  103.     Matrix *m2 = Matrix_new(type, size_of_matrix);
  104.     Matrix_set(m2);
  105.     Matrix_print(m2);
  106.  
  107.     Matrix *m3 = Matrix_sum(m1, m2);
  108.     Matrix_print(m3);
  109.  
  110.     printf("\nPress any key to continue... ");
  111.     getchar();
  112. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы