fork(1) download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main ()
  5. {
  6. int encaixa;
  7. double baseCarta, alturaCarta, baseEnvelope, alturaEnvelope;
  8. double distanciaCarta, distanciaEnvelope;
  9. double raioEnv, centroEnvX, centroEnvY;
  10. double coefAReta, coefBReta, coefCReta, coefBNegReta, coefCNegReta;
  11. double coefARetaE2, centroEnvXArrumado, centroEnvYArrumado, coefBCNegRetaJunto, constanteCircTotal;
  12. double AEquacaoYCirc, BEquacaoYCirc, CEquacaoYCirc, deltaEquacaoY, x1EquacaoY, x2EquacaoY;
  13. double equacaoRetaX1, equacaoRetaX2, distanciaCentroRetaX1, distanciaCentroRetaX2;
  14.  
  15. scanf ("%lf %lf %lf %lf", &alturaCarta, &baseCarta, &alturaEnvelope, &baseEnvelope);
  16.  
  17. /* Guia das Variáveis e suas representações no Exercício 2978 da URI OJ:
  18.  
  19. "alturaCarta" representa a Letra A (Coordenada X da Carta) Eixo 0X (abscissa)
  20. "baseCarta" representa a Letra B (Coordenada Y da Carta) Eixo 0Y (ordenada)
  21. "alturaEnvelope" representa a Letra C (Coordenada X do Envelope) Eixo 0X (abscissa)
  22. "baseEnvelope" representa a Letra D (Coordenada Y do Envelope) Eixo 0Y (ordenada)
  23.  
  24. "distanciaCarta" representa A^2 + B^2 (Carta)
  25. "distanciaEnvelope" representa C^2 + D^2 (Envelope)
  26. */
  27.  
  28. encaixa = -1;
  29.  
  30. if (alturaCarta > alturaEnvelope)
  31. {
  32. encaixa = 0;
  33. }
  34. else if ((alturaCarta <= alturaEnvelope) && (baseCarta <= baseEnvelope))
  35. {
  36. encaixa = 1;
  37. }
  38. else if ((alturaCarta <= alturaEnvelope) && (baseCarta > baseEnvelope))
  39. {
  40. distanciaCarta = sqrt(pow (alturaCarta, 2) + pow (baseCarta, 2));
  41. distanciaEnvelope = sqrt(pow (alturaEnvelope, 2) + pow (baseEnvelope, 2));
  42.  
  43. if (distanciaCarta > distanciaEnvelope)
  44. {
  45. printf ("DC %lf DE %lf\n\n", distanciaCarta, distanciaEnvelope);
  46. encaixa = 0;
  47. }
  48. else
  49. {
  50.  
  51.  
  52. /* passos agora:
  53.  
  54. usar determinantes com base nos pontos C e D separados onde
  55. C (0;Y) e D (X;0)
  56. equacao reta CD
  57. usar pontos da carta na reta CD e verificar se os pontos A e B
  58. são iguais ou menores a igualdade da reta CD
  59.  
  60. determinante tem 3 retas
  61.  
  62. 1 - dois numeros e Y --> Y, 1, X1 (subtrai)
  63. 2 - dois numeros e X --> X, 1, Y2 (subtrai)
  64. 3 - 3 numeros --> 1, X1, Y2 (soma)
  65.  
  66. */
  67.  
  68.  
  69.  
  70. // raio
  71.  
  72. raioEnv = distanciaCarta / 2;
  73.  
  74. // centro X e Y
  75.  
  76. centroEnvX = alturaEnvelope / 2;
  77. centroEnvY = baseEnvelope / 2;
  78.  
  79. printf ("DC %lf DE %lf\n\n", distanciaCarta, distanciaEnvelope);
  80.  
  81.  
  82. /*double pontoX, pontoY, teste, teste2, teste3;
  83.  
  84. pontoX = alturaCarta / 2;
  85. pontoY = baseCarta / 2;
  86. */
  87.  
  88. printf ("XC %lf YC %lf XP %lf YP %lf\nR %lf\n\n", centroEnvX, centroEnvY, pontoX, pontoY, raioEnv);
  89.  
  90.  
  91.  
  92. //teste = sqrt(pow((alturaCarta - alturaEnvelope), 2) + pow((baseCarta - baseEnvelope), 2));
  93.  
  94. //teste = sqrt(pow((baseCarta - baseEnvelope), 2)); // 0Y
  95. //teste2 = sqrt(pow((alturaCarta - alturaEnvelope), 2)); // 0X
  96. //teste3 = sqrt(pow((pontoX - centroEnvX), 2) + pow((pontoY - centroEnvY), 2)); // Meio
  97.  
  98.  
  99. //teste = pow((alturaCarta - centroEnvX), 2) + pow((baseCarta - centroEnvY), 2) - pow(raioEnv, 2);
  100.  
  101.  
  102. printf ("DCPBD %lf \nDCPAC %lf \nDCPCPX %lf\n\n\n\n", teste, teste2, teste3);
  103.  
  104. /*double teste4[3], menor;
  105. int i;
  106.  
  107. teste4[0] = teste;
  108. teste4[1] = teste2;
  109. teste4[2] = teste3;
  110.  
  111. menor = teste4[0];
  112.  
  113. for (i = 1; i < 3; i++)
  114. {
  115. if (teste4[i] < menor)
  116. {
  117. menor = teste4[i];
  118. }
  119. }
  120.  
  121. printf ("Menor %lf\n\n", menor);
  122.  
  123.  
  124. if (teste >= alturaCarta)
  125. {
  126. encaixa = 1;
  127. }
  128. else
  129. {
  130. encaixa = 0;
  131. }
  132. */
  133.  
  134. printf ("C(%g, %g) Raio %g\n\n", centroEnvX, centroEnvY, raioEnv);
  135.  
  136. // Equação da reta
  137.  
  138. coefAReta = 1 * baseCarta;
  139. coefBReta = 1 * alturaCarta;
  140. coefCReta = -1 * baseCarta * alturaCarta;
  141.  
  142. printf ("%gX %gY %g\n\n", coefAReta, coefBReta, coefCReta);
  143.  
  144.  
  145. // Equação da reta: B e C pro segundo membro deixando X em evidência
  146.  
  147. coefBNegReta = -1 * coefBReta;
  148. coefCNegReta = -1 * coefCReta;
  149.  
  150. //printf ("X = %gY %g / %g\n\n", coefBNegReta, coefCNegReta, coefAReta);
  151.  
  152. // Reduções de expressões para Interseção de Reta e Circunferência e elaboração de
  153. // Equação do Segundo Grau de Y
  154.  
  155. coefARetaE2 = 1 * pow(coefAReta, 2);
  156. centroEnvXArrumado = -1 * 2 * centroEnvX;
  157. centroEnvYArrumado = -1 * 2 * centroEnvY;
  158. coefBCNegRetaJunto = 1 * 2 * coefBNegReta * coefCNegReta;
  159. constanteCircTotal = (pow(centroEnvX, 2) + pow(centroEnvY, 2) - pow(raioEnv, 2));
  160.  
  161. // Coeficientes A, B e C da Equação do segundo grau de Y
  162.  
  163. AEquacaoYCirc = (pow(coefBNegReta, 2) + coefARetaE2);
  164. BEquacaoYCirc = (coefBCNegRetaJunto + (coefBNegReta * centroEnvXArrumado * coefAReta) + (centroEnvYArrumado * coefARetaE2));
  165. CEquacaoYCirc = (pow(coefCNegReta, 2) + (coefCNegReta * centroEnvXArrumado * coefAReta) + (constanteCircTotal * coefARetaE2));
  166.  
  167. //printf ("Equacao Y = %gY^2 %gY %g = 0\n\n", AEquacaoYCirc, BEquacaoYCirc, CEquacaoYCirc);
  168.  
  169. deltaEquacaoY = ((pow(BEquacaoYCirc, 2)) - (4 * AEquacaoYCirc * CEquacaoYCirc));
  170.  
  171. //printf ("Delta %g\n\n", deltaEquacaoY);
  172.  
  173. if (deltaEquacaoY < 0)
  174. {
  175. encaixa = 0;
  176. }
  177. else if (deltaEquacaoY == 0)
  178. {
  179. // distancia = raio e novo calculo
  180.  
  181. if (raioEnv >= alturaCarta)
  182. {
  183. encaixa = 1;
  184. }
  185. else
  186. {
  187. encaixa = 0;
  188. }
  189. }
  190. else
  191. {
  192. // entao delta > 0; duas raizes
  193.  
  194. x1EquacaoY = ((-1 * BEquacaoYCirc) + sqrt(deltaEquacaoY)) / (2 * AEquacaoYCirc);
  195. x2EquacaoY = ((-1 * BEquacaoYCirc) - sqrt(deltaEquacaoY)) / (2 * AEquacaoYCirc);
  196.  
  197. //printf ("y1 = %g y2 %g\n\n", x1EquacaoY, x2EquacaoY);
  198.  
  199. equacaoRetaX1 = (((coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta);
  200. equacaoRetaX2 = (((coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta);
  201.  
  202. /* if ((x1EquacaoY < 0) && (x2EquacaoY < 0))
  203. {
  204. encaixa = 0;
  205. }
  206. else if (x1EquacaoY < 0)
  207. {
  208. // considerar x2
  209.  
  210. equacaoRetaX1 = -1;
  211. equacaoRetaX2 = (((coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta);
  212. }
  213. else if (x2EquacaoY < 0)
  214. {
  215. // considerar x1
  216.  
  217. equacaoRetaX1 = (((coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta);
  218. equacaoRetaX2 = -1;
  219. }
  220. else
  221. {
  222. // considerar x1 E x2
  223.  
  224. equacaoRetaX1 = (((coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta);
  225. equacaoRetaX2 = (((coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta);
  226. }
  227. */
  228.  
  229. //printf ("x1 = %g x2 %g\n\n", equacaoRetaX1, equacaoRetaX2);
  230.  
  231. //printf ("PontoX (%g; %g) / PontoY (%g; %g)\n\n", equacaoRetaX1, x1EquacaoY, equacaoRetaX2, x2EquacaoY);
  232.  
  233.  
  234. /* if (equacaoRetaX1 == -1)
  235. {
  236. // a segunda
  237.  
  238. distanciaCentroRetaX2 = sqrt(pow((equacaoRetaX2 - centroEnvX), 2) + pow((x2EquacaoY - centroEnvY), 2));
  239. distanciaCentroRetaX1 = -1;
  240. }
  241. else if (equacaoRetaX2 == -1)
  242. {
  243. // a primeira
  244.  
  245. distanciaCentroRetaX1 = sqrt(pow((equacaoRetaX1 - centroEnvX), 2) + pow((x1EquacaoY - centroEnvY), 2));
  246. distanciaCentroRetaX2 = -1;
  247. }
  248. else
  249. {
  250. distanciaCentroRetaX1 = sqrt(pow((equacaoRetaX1 - centroEnvX), 2) + pow((x1EquacaoY - centroEnvY), 2));
  251. distanciaCentroRetaX2 = sqrt(pow((equacaoRetaX2 - centroEnvX), 2) + pow((x2EquacaoY - centroEnvY), 2));
  252. }
  253. */
  254.  
  255. distanciaCentroRetaX1 = sqrt(pow((equacaoRetaX1 - centroEnvX), 2) + pow((x1EquacaoY - centroEnvY), 2));
  256. distanciaCentroRetaX2 = sqrt(pow((equacaoRetaX2 - centroEnvX), 2) + pow((x2EquacaoY - centroEnvY), 2));
  257.  
  258. //printf ("distx1 = %g distx2 %g\n\n", distanciaCentroRetaX1, distanciaCentroRetaX2);
  259.  
  260. if (distanciaCentroRetaX1 <= distanciaCentroRetaX2)
  261. {
  262. if (distanciaCentroRetaX1 >= alturaCarta)
  263. {
  264. encaixa = 1;
  265. }
  266. else
  267. {
  268. encaixa = 0;
  269. }
  270. }
  271. else
  272. {
  273. if (distanciaCentroRetaX2 >= alturaCarta)
  274. {
  275. encaixa = 1;
  276. }
  277. else
  278. {
  279. encaixa = 0;
  280. }
  281. }
  282.  
  283. /* if (distanciaCentroRetaX1 == -1)
  284. {
  285. // a segunda
  286.  
  287. if (distanciaCentroRetaX2 >= alturaCarta)
  288. {
  289. encaixa = 1;
  290. }
  291. else
  292. {
  293. encaixa = 0;
  294. }
  295. }
  296. else if (distanciaCentroRetaX2 == -1)
  297. {
  298. // a primeira
  299.  
  300. if (distanciaCentroRetaX1 >= alturaCarta)
  301. {
  302. encaixa = 1;
  303. }
  304. else
  305. {
  306. encaixa = 0;
  307. }
  308. }
  309. else
  310. {
  311. // ponto mais perto do centro
  312.  
  313. if (distanciaCentroRetaX1 <= distanciaCentroRetaX2)
  314. {
  315. if (distanciaCentroRetaX1 >= alturaCarta)
  316. {
  317. encaixa = 1;
  318. }
  319. else
  320. {
  321. encaixa = 0;
  322. }
  323. }
  324. else
  325. {
  326. if (distanciaCentroRetaX2 >= alturaCarta)
  327. {
  328. encaixa = 1;
  329. }
  330. else
  331. {
  332. encaixa = 0;
  333. }
  334. }
  335. }
  336. */
  337. }
  338. }
  339. }
  340.  
  341. if (encaixa)
  342. {
  343. printf ("yes\n");
  344. }
  345. else
  346. {
  347. printf ("no\n");
  348. }
  349.  
  350. return 0;
  351. }
Compilation error #stdin compilation error #stdout 0s 4428KB
stdin
6 7 8 5
compilation info
prog.c: In function ‘main’:
prog.c:88:81: error: ‘pontoX’ undeclared (first use in this function)
       printf ("XC %lf YC %lf XP %lf YP %lf\nR %lf\n\n", centroEnvX, centroEnvY, pontoX, pontoY, raioEnv);
                                                                                 ^~~~~~
prog.c:88:81: note: each undeclared identifier is reported only once for each function it appears in
prog.c:88:89: error: ‘pontoY’ undeclared (first use in this function)
       printf ("XC %lf YC %lf XP %lf YP %lf\nR %lf\n\n", centroEnvX, centroEnvY, pontoX, pontoY, raioEnv);
                                                                                         ^~~~~~
prog.c:102:61: error: ‘teste’ undeclared (first use in this function)
       printf ("DCPBD %lf \nDCPAC %lf \nDCPCPX %lf\n\n\n\n", teste, teste2, teste3);
                                                             ^~~~~
prog.c:102:68: error: ‘teste2’ undeclared (first use in this function)
       printf ("DCPBD %lf \nDCPAC %lf \nDCPCPX %lf\n\n\n\n", teste, teste2, teste3);
                                                                    ^~~~~~
prog.c:102:76: error: ‘teste3’ undeclared (first use in this function)
       printf ("DCPBD %lf \nDCPAC %lf \nDCPCPX %lf\n\n\n\n", teste, teste2, teste3);
                                                                            ^~~~~~
prog.c:15:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
  scanf ("%lf %lf %lf %lf", &alturaCarta, &baseCarta, &alturaEnvelope, &baseEnvelope);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
stdout
Standard output is empty