Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник" - C (СИ)

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

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

Делая следующее задание наткунлся на проблему
Определить структуры: отрезок (задан длиной) и прямоугольник (задан 2-мя отрезками). Реализовать функции: 1. для инициализации динамического прямоугольника по двум отрезкам. 2. search() - поиск прямоугольников подобных заданному в статическом массиве прямоугольников (результат поместить в динамический массив прямоугольников). 3. Печать информации о прямоугольнике Создать два динамических прямоугольника (данные вводить с клавиатуры), определить прямоугольник с большей площадью. Определить статический массив прямоугольников, используя датчик случайных чисел и функцию. Найти все прямоугольники, подобные первому в статическом массиве.
Код выглядит так:
Листинг программы
  1. // bdz1.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <windows.h>
  7. #include <clocale>
  8. #include <cmath>
  9. #define LEN 10
  10. #define LLL 10
  11.  
  12. struct line
  13. {
  14. int L;
  15. };
  16. struct rect
  17. {
  18. struct line l1;
  19. struct line l2;
  20. };
  21. struct rect T[1];
  22. struct rect* init()
  23. {
  24. const int leng = LLL;
  25. static struct rect R[leng];
  26. for(int i = 0; i < leng; i++)
  27. {
  28. R[i].l1.L=(int)(rand()%LEN);
  29. R[i].l2.L=(int)(rand()%LEN);
  30. }
  31. return(R);
  32. }
  33. void printR(struct rect R[], int l = LLL)
  34. {
  35. for(int i = 0; i < l; i++)
  36. printf("Прямоугольник %i\t%ix%i\n",i,R[i].l1.L,R[i].l2.L);
  37. }
  38. void search(struct rect R[], struct rect S, struct rect *T, int &k)//sdgfdgfgfgh
  39. {
  40. for(int i = 0; i < LLL; i++)
  41. {
  42. if((R[i].l1.L/R[i].l2.L == S.l1.L/S.l2.L) ||
  43. (R[i].l2.L/R[i].l1.L == S.l2.L/S.l1.L))
  44. {
  45. T = (struct rect*) realloc (T, (k+1) * sizeof(struct rect));
  46. T[k] = R[i];
  47. k++;
  48. }
  49. }
  50. }
  51. int _tmain(int argc, _TCHAR* argv[])
  52. {
  53. setlocale(0,"Russian");
  54. srand (time(0));
  55. struct rect R1;
  56. struct rect R2;
  57. printf("Первый прямоугольник: введите длинну 1-ой: ");
  58. scanf("%d", &R1.l1.L);
  59. printf("Первый прямоугольник: введите длинну 2-ой: ");
  60. scanf("%d", &R1.l2.L);
  61. printf("Второй прямоугольник: введите длинну 1-ой: ");
  62. scanf("%d", &R2.l1.L);
  63. printf("Второй прямоугольник: введите длинну 2-ой: ");
  64. scanf("%d", &R2.l2.L);
  65. if(R1.l1.L * R1.l2.L > R2.l1.L * R2.l2.L)
  66. printf("\nПервый прямоугольник больше\n\n");
  67. else if(R1.l1.L * R1.l2.L < R2.l1.L * R2.l2.L)
  68. printf("\nВторой прямоугольник больше\n\n");
  69. else
  70. printf("\nПрямоугольники равны\n\n");
  71.  
  72. static struct rect *RR = init();
  73. printR(RR);
  74. int k = 0;
  75. search(RR,R1,T,k);
  76. printR(T, k);
  77. return 0;
  78. }
Ошибка как я понял происходит при попытке увеличит массив в этой функции:
Листинг программы
  1. struct line
  2. {
  3. int L;
  4. };
  5. struct rect
  6. {
  7. struct line l1;
  8. struct line l2;
  9. };
  10. struct rect T[1];
  11. ...
  12.  
  13. void search(struct rect R[], struct rect S, struct rect *T, int &k)//sdgfdgfgfgh
  14. {
  15. for(int i = 0; i < LLL; i++)
  16. {
  17. if((R[i].l1.L/R[i].l2.L == S.l1.L/S.l2.L) ||
  18. (R[i].l2.L/R[i].l1.L == S.l2.L/S.l1.L))
  19. {
  20. T = (struct rect*) realloc (T, (k+1) * sizeof(struct rect));
  21. T[k] = R[i];
  22. k++;
  23. }
  24. }
  25. }

Решение задачи: «Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник"»

textual
Листинг программы
  1. struct rect* init()
  2. {
  3.     const int leng = LLL;
  4.     static struct rect* R = malloc(sizeof(struct rect) * leng);
  5.     for(int i = 0; i < leng; i++)
  6.     {
  7.         R[i].l1.L=(int)(rand()%LEN);
  8.         R[i].l2.L=(int)(rand()%LEN);
  9.     }
  10.     return(R);
  11. }

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

В данном коде выполняется инициализация массива структур Отрезок Прямоугольник динамически, то есть во время выполнения программы.

  1. Объявляется константа leng (вместо неё может быть любое другое имя, но в данном случае используется LLL), которая определяет размер массива.
  2. Выделяется память под массив структур Отрезок Прямоугольник с помощью функции malloc (вместо неё можно использовать calloc, тогда все элементы массива будут инициализированы нулями).
  3. В цикле происходит заполнение массива структур Отрезок Прямоугольник. Для этого используется генератор случайных чисел, который выдаёт случайное число от 0 до LEN (включительно).
  4. Функция возвращает указатель на первый элемент массива. Пользователь может вызвать функцию init для инициализации массива структур Отрезок Прямоугольник.

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


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

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

11   голосов , оценка 3.455 из 5

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

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

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