fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define RED "\033[1;31m"
  5. #define GREEN "\033[1;32m"
  6. #define YELLOW "\033[1;33m"
  7. #define BLUE "\033[1;34m"
  8. #define PURPLE "\033[1;35m"
  9. #define CYAN "\033[1;36m"
  10. #define RESET "\033[0m"
  11.  
  12. // Variáveis globais (artifício básico, para facilitar...)
  13. int ENTRADA = -1;
  14. float menor_distancia=10000000000000000;
  15. float maior_distancia=-1;
  16. int flag = 0;
  17. // FIM - Variáveis globais
  18.  
  19. long int fatorial(long int n) {
  20. if (n==0)
  21. return 1;
  22. else
  23. return (n * fatorial(n-1));
  24. }
  25.  
  26. float distancia_2_pontos(float *p1_x, float *p1_y, float *p1_z, float *p2_x, float *p2_y, float *p2_z) {
  27. //printf("\nP1: %f - %f - %f <> P2: %f - %f = %f\n", *p1_x, *p1_y, *p1_z, *p2_x, *p2_y, *p2_z);
  28. float dist = sqrt(((*p2_x - *p1_x)*(*p2_x - *p1_x)) + ((*p2_y - *p1_y)*(*p2_y - *p1_y)) + (*p2_z - *p1_z)*(*p2_z - *p1_z));
  29. return dist;
  30. }
  31.  
  32. void identificacao_comparacoes(int r, int n, int k, float *px, float *py, float *pz, float *pdist) {
  33. int i;
  34. float dAB;
  35. for(i=r; i<n; i++) {
  36. printf("\n<%d>-<%d> (%d)", r, i+1, k);
  37. dAB = distancia_2_pontos(px+(r-1), py+(r-1), pz+(r-1), px+i, py+i, pz+i);
  38. printf("\nDistância %d-%d: %4.5f\n", r, i+1, dAB);
  39. if(ENTRADA == -1) {
  40. ENTRADA = 1;
  41. menor_distancia = dAB;
  42. maior_distancia = dAB;
  43. }
  44. else {
  45. if(dAB < menor_distancia) {
  46. menor_distancia = dAB;
  47. }
  48. else {
  49. if(dAB > maior_distancia) {
  50. maior_distancia = dAB;
  51. //printf("\n>> OK\n");
  52. }
  53. }
  54. }
  55. k = k+1;
  56. }
  57. if(r<(n-1)) {
  58. identificacao_comparacoes(r+1, n, k, px, py, pz, pdist);
  59. }
  60. else {
  61. printf("\nTotal de comparações: ");
  62. printf("%ld", k-1);
  63. printf(",");
  64. }
  65. }
  66.  
  67. int main(void) {
  68.  
  69. long int n;
  70. int i, j, x;
  71. float *p_x, *p_y, *p_z, *p_dist;
  72. float dAB;
  73.  
  74. printf("Digite o valor de n >= 2 (total de pontos 3D):\n");
  75. scanf("%ld", &n);
  76.  
  77. printf("\nAnálise Combinatória => ((n!)/(2!(n-2)!)");
  78.  
  79. // Análise combinatória facilita... para saber o total de comparações (x).
  80. x = fatorial(n)/(fatorial(2)*fatorial(n-2));
  81.  
  82. p_x = malloc(sizeof(float) * n);
  83. p_y = malloc(sizeof(float) * n);
  84. p_z = malloc(sizeof(float) * n);
  85. p_dist = malloc(sizeof(float) * x);
  86.  
  87. for(i=0; i<n; i++)
  88. *(p_dist+i) = -1; // -1 significa sem valor calculado... ainda.
  89.  
  90. printf("\nDigite as coordenadas de cada ponto!\n");
  91. printf("Coordenadas geradas aleatoriamente...\n");
  92.  
  93. srand(time(NULL));
  94. for(i=0; i<n; i++) {
  95. printf("\nPonto %d:\n", i+1);
  96.  
  97. printf("Px[%d]: ", i+1);
  98. //scanf("%f", p_x+i); // &(p_x[i])
  99. *(p_x+i) = rand()%1000/100.0;
  100. printf("%.2f\n", *(p_x+i));
  101.  
  102. printf("Py[%d]: ", i+1);
  103. //scanf("%f", p_y+i); // &(p_y[i])
  104. *(p_y+i) = rand()%1000/100.0;
  105. printf("%.2f\n", *(p_y+i));
  106.  
  107. printf("Pz[%d]: ", i+1);
  108. //scanf("%f", p_z+i); // &(p_z[i])
  109. *(p_z+i) = rand()%1000/100.0;
  110. printf("%.2f\n", *(p_z+i));
  111. }
  112.  
  113. if (flag == 1) {
  114. printf("\nApresentação (dados):\n");
  115. for(i=0; i<n; i++) {
  116. printf("\nPonto %d:\n", i+1);
  117. printf("End. Px[%d]: %p / Valor Px[%d]: %f\n", i+1, p_x+i, i+1, p_x[i]); // *(p_x+i)
  118. printf("End. Py[%d]: %p / Valor Py[%d]: %f\n", i+1, p_y+i, i+1, p_y[i]); // *(p_y+i)
  119. printf("End. Pz[%d]: %p / Valor Pz[%d]: %f\n", i+1, p_z+i, i+1, p_z[i]); // *(p_z+i)
  120. }
  121. }
  122.  
  123. printf("\nComparações:\n");
  124. identificacao_comparacoes(1, n, 1, p_x+0, p_y+0, p_z+0, p_dist+0);
  125.  
  126. printf("\nMenor distância: ");
  127. printf("%5f", menor_distancia);
  128. printf(",");
  129. printf("\nMaior distância: ");
  130. printf("%5f", maior_distancia);
  131. printf(". -> Cálculo final!\n");
  132.  
  133. free(p_x);
  134. free(p_y);
  135. free(p_z);
  136. free(p_dist);
  137.  
  138. printf(">>>");
  139. printf(" Memória Liberada!!!\n");
  140. return 0;
  141. }
Success #stdin #stdout 0s 5272KB
stdin
6
stdout
Digite o valor de n >= 2 (total de pontos 3D):

Análise Combinatória => ((n!)/(2!(n-2)!)
Digite as coordenadas de cada ponto!
Coordenadas geradas aleatoriamente...

Ponto 1:
Px[1]: 3.97
Py[1]: 4.21
Pz[1]: 7.16

Ponto 2:
Px[2]: 9.74
Py[2]: 6.10
Pz[2]: 0.23

Ponto 3:
Px[3]: 1.23
Py[3]: 6.20
Pz[3]: 9.73

Ponto 4:
Px[4]: 9.81
Py[4]: 3.18
Pz[4]: 9.49

Ponto 5:
Px[5]: 7.96
Py[5]: 1.33
Pz[5]: 3.24

Ponto 6:
Px[6]: 4.92
Py[6]: 1.75
Pz[6]: 8.79

Comparações:

<1>-<2> (1)
Distância 1-2: 9.21357

<1>-<3> (2)
Distância 1-3: 4.25119

<1>-<4> (3)
Distância 1-4: 6.37145

<1>-<5> (4)
Distância 1-5: 6.29134

<1>-<6> (5)
Distância 1-6: 3.10016

<2>-<3> (6)
Distância 2-3: 12.75461

<2>-<4> (7)
Distância 2-4: 9.70973

<2>-<5> (8)
Distância 2-5: 5.91451

<2>-<6> (9)
Distância 2-6: 10.74377

<3>-<4> (10)
Distância 3-4: 9.09914

<3>-<5> (11)
Distância 3-5: 10.54182

<3>-<6> (12)
Distância 3-6: 5.85681

<4>-<5> (13)
Distância 4-5: 6.77551

<4>-<6> (14)
Distância 4-6: 5.14266

<5>-<6> (15)
Distância 5-6: 6.34196

Total de comparações: 15,
Menor distância: 3.100161,
Maior distância: 12.754612. -> Cálculo final!
>>> Memória Liberada!!!