Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bestfriend en 15 Mayo 2015, 23:13 pm



Título: Ayuda en Proyecto Simple
Publicado por: bestfriend en 15 Mayo 2015, 23:13 pm
Hola soy nuevo y llevo alrededor de 2 meses "programando" y necesito ayuda porque mi programa no me devuelve el resultado de un dato en especifico (la altura C). El proyecto es el siguiente https://drive.google.com/file/d/0B-T3GRGCH9STWHNHM2ZUdWl0ZzA/view?usp=sharing (https://drive.google.com/file/d/0B-T3GRGCH9STWHNHM2ZUdWl0ZzA/view?usp=sharing)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cmath>
  4. //Variables Globales
  5. float b1,b2,b3,d1,d3,h;
  6. float I,C;
  7. float d2=(h-d1-d3),A1=(b1*d1),A2=(b2*d2),A3=(b3*d3);
  8.  
  9. //Funciones
  10. void entrada(){
  11.     printf("Hola! Este programa esta diseñado para calcular el momento de inercia(I) y la altura(C) de nuestro Proyecto 1\n");
  12.     printf(" \n");
  13.     printf("Primero ingrese los datos de anchura de la viga (b1,b2,b3)\n");
  14.     printf(" \n");
  15.     printf("Ingrese el dato de b1\n");
  16.     scanf("\n%f",&b1);
  17.     printf("Ingrese el dato de b2\n");
  18.     scanf("\n%f",&b2);
  19.     printf("Ingrese el dato de b3\n");
  20.     scanf("\n%f",&b3);
  21.     printf("Ahora proceda a ingresar los datos de altura de altura de la viga (d1,d3,h)\n");
  22.     printf("Ingrese el dato de d1\n");
  23.     scanf("\n%f",&d1);
  24.     printf("Ingrese el dato de d3\n");
  25.     scanf("\n%f",&d3);
  26.     printf("Ingrese el dato de h\n");
  27.     scanf("\n%f",&h);
  28. }
  29.  
  30. void calculo(){
  31.      float x=d1,y=(h-C-(d1/2)),z=d2,k=(d3+(d2/2)-C),j=d3,p=(C+(d3/2));
  32.  
  33.      x=pow(x,3);
  34.      y=pow(y,2);
  35.      z=pow(z,3);
  36.      k=pow(k,2);
  37.      j=pow(j,3);
  38.      p=pow(p,2);
  39.  
  40.      I=(b1*x/12)+(A1*y)+(b2*z/12)+(A2*k)+(b3*j/12)+(A3*p);
  41.      C=(A1*(h-(d1/2)))+(A2*(d3+(d2/2)))+(A3*(d3/2))/(A1+A2+A3);
  42. }
  43.  
  44. //Programa Principal
  45. main(){
  46.       entrada();
  47.       printf("A continuacion se muestran los resultados del calculo\n");
  48.       calculo();
  49.       printf(" \n");
  50.       printf("La altura C de la viga es: %.2f\n",C);
  51.       printf("El momento de inercia I es: %.2f\n",I);
  52.       system("pause");
  53.  
  54. }
  55.  

Cualquier critica y consejo es absolutamente bienvenido soy un novato en este mundo :rolleyes:


Título: Re: Ayuda en Proyecto Simple
Publicado por: Stakewinner00 en 15 Mayo 2015, 23:49 pm
Para comenzar, no es buena práctica poner todo de variables globales, cuesta más depurar errores.



Título: Re: Ayuda en Proyecto Simple
Publicado por: kaiserr en 16 Mayo 2015, 00:03 am
Para continuar, creo que C no te dará el resultado que quieres porque le falta un parentesis para englobar todas las sumas y luego dividirlas en el denominador.

Ahora:
Código
  1. C=(A1*(h-(d1/2)))+(A2*(d3+(d2/2)))+(A3*(d3/2))/(A1+A2+A3);
  2.  

Solución:
Código
  1. C=((A1*(h-(d1/2)))+(A2*(d3+(d2/2)))+(A3*(d3/2)))/(A1+A2+A3);
  2.  

Primero se evaluarán las operaciones de multiplicación , división y módulo y luego las de suma y resta.

Un consejo, cuando quieras debuguear un programa de manera cutre, puede poner prints en las zonas que te interesen conocer el valor de una variable.
Si utilizas algún IDE puedes utilizar los debuguers que incorporan y seguir las variables a lo largo de la ejecución.


Título: Re: Ayuda en Proyecto Simple
Publicado por: engel lex en 16 Mayo 2015, 10:43 am
hola...

primero... no mezcles librerías standard de c++ con las de c.. usa siempre o unas u otras...

Código
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>

a tu error lo que dice kaiserr es cierto... el calculo está malo... recomiendo los cálculos hacerlos por partes para que tengas una buena legibilidad y usar variables tan legibles como puedas para que el código sea fácil de interpretar...

creo que esto no solo resuelve el problema, sino que ayuda a leer el código mucho veces mejor... al final para el compilador va a ser idéntico...

Código
  1. void calculo(){
  2.      float x = d1;
  3.      float y = h - C - (d1 / 2);
  4.      float z = d2;
  5.      float k = d3 + (d2 / 2) - C;
  6.      float j = d3;
  7.      float p = C+(d3/2);
  8.  
  9.      x = pow(x, 3);
  10.      y = pow(y, 2);
  11.      z = pow(z, 3);
  12.      k = pow(k, 2);
  13.      j = pow(j, 3);
  14.      p = pow(p, 2);
  15.  
  16.      I = b1 * x / 12;
  17.      I += A1 * y;
  18.      I += b2 * z / 12;
  19.      I += A2 * k;
  20.      I += b3 * j /12;
  21.      I += A3*p;
  22.  
  23.      C = A1 * (h - d1 / 2);
  24.      C += A2 * (d3 + d2 / 2);
  25.      C += A3 * d3 / 2;
  26.      C /= A1 + A2 + A3;
  27. }

(sabiendo que primero se divide y multiplica, después se suma y resta)

lo que dice Stakewinner00 es muy cierto... no es buena practica hacer todo en variables globales... eso se guarda para cuando no hay más solución práctica, sin contar que la linea 7 es terrible...

Código
  1. float d2=(h-d1-d3),A1=(b1*d1),A2=(b2*d2),A3=(b3*d3);

no le has dado ningún valor a las variables... va a hacer calculos con la basura que consiga en la ram

es como que lleges a alguien y le digas "si me dices cuanto es A*B + C, te doy 100$" y despues de decirle "te equivocaste A era 1, B era 1 y C era 0"