Fracciones en C [Ayuda]

Iniciado por barnix456, 11 Febrero 2013, 00:47 AM

0 Miembros y 1 Visitante están viendo este tema.

leosansan

#10
Cita de: barnix456 en 16 Febrero 2013, 21:29 PM

Ahora tengo otra duda, por ejemplo corro mi programa, hago una operacion con fracciones por ejemplo, al calcular la resistencia, que es sumado, sumo (2/2)+(2/2) me da de resultado 2, lo cual es correcto, el programa cuando termina de hacer la operacion pulso ENTER y regreso al menu principal, y si eligo la misma opcion de volver a calcular otra resistencia, y pongo unas fracciones como (1/2)+(1/2) y me deberia dar como resultado 1, pero me da como resultado 3, por que aun guarda en su bufer el resultado de 2.



El problema que te aparece no tiene nada que ver con el buffer,

¡ ¡ ¡ quita todos los "fflush(stdin)" del código que no hacen nada ¡ ¡ ¡ .

Es más sencillo y el culpable en el fondo es el goto.

Lo que ocurre es que cada vez que hace una llamada el goto debe encontrar las variables que acumulan o suman con valor de cero o uno en el caso de un contador que tienes por ahí, pero lo que se encuentran es a esas variables con el valor que han tomado anteriormente, de ahí que sumen al valor viejo el nuevo.

Ese efecto lo corriges asignando nuevamente ,después de la etiqueta a la que llama el goto, esas variables a sus valores originales. por ejemplo, en el caso de la resistencia tendrías que poner:


Código (cpp) [Seleccionar]
void resistencia(void)
{
   float res, total=0,suma=0,numerador[sise], denominador[sise];
   int n,cont,opc,cont1=1,n1;
   a:
   total=0,suma=0,cont1=1; /* <==AQUI INICIALIZAS NUEVAMENTE */
   system("clear");
   printf("\t\tRESISTENCA\n\n");
    ..................



Si tienes duda pregunta nuevamente. :rolleyes:

Saluditos!.


P.D: En todo caso habría que poner un "fflush(stdout)" después de cada printf no terminado en \n y ... pero en fin, eso es otro tema.

REEDITO: Perdona que te cambie system (clear) a system (cls) pero así es como me funciona.

Te faltaba además algunos break, tenías entrada de dos resistencias fraccionarias en el cálculo del voltaje -porqué dos o no 3 o 5- y te he cambiado los goto por while, también nombrabas a Numerador como denominador y ya que usas system, en lugar de dos getchar seguidos yo pondría un system(pause). Revisa no obstante por si se ha colado algún gazapo:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define sise 100

void resistencia(void);
void intensidad(void);
void voltaje(void);
/***************************************************/
int main()
{
  int opc;
  printf("\n");
  printf ("\t\tC\tE\tP\tR\tO\tG\n");
  printf("\n"); printf("\n");
  printf ("\t\t\tCIRCUITOS EN SERIE \n");
  printf ("\n");
  printf ("Este Software se basa en la ley de OHM\n");
  printf("\n");
  printf("Precione ENTER para continuar\n");
  getchar();
  while (1){
   system("cls");
    printf("ELIJA UNA OPCCION: \n\n \t1)Calcular Resistencia\n\t2)Calcular Intensidad\n\t3)Calcular Voltaje\n\t4)Salir\n");
    scanf("%d",&opc);
    switch (opc)
    {
        case 1:
        {
            resistencia();
            break;
         }
         case 2:
         {
             intensidad();
             break;
         }
         case 3:
         {
             voltaje();
             break;
         }
         case 4:
         {
             exit(0);
         }
       }
  }
  return 0;
}
/***************************************************/
void resistencia(void)
{
   float res, total=0,suma=0,numerador[sise], denominador[sise];
   int n,cont,opc,cont1=1,n1;
   while (1){
     total=0,suma=0,cont1=1; /* <==AQUI INICIALIZAS NUEVAMENTE */
     system("cls");
     printf("\t\tRESISTENCA\n\n");
     printf("Con que tipo de datos desea calcular la resistencia:\n\n \t1)Numeros fraccionarios\n \t2)Numeros enteros/decimales\n \t3)regresar al menu anteior\n \t4)Salir\n");
     scanf("%d",&opc);
      switch(opc)
     {
         case 1:
         {
             system("cls");
             printf("\t\tEn esta sección calcularemos la resistencia total\n\n");
             printf("Cuantas resistencias tiene el circuito: ");
             scanf("%d",&n);
             printf("\n");
             for (cont=0;cont<=n-1;cont++)
             {
                 printf("Escribe el valor del Numerador %d (_/ ): ",cont); scanf("%f",&numerador[cont]);
                 printf("Escribe el valor del Denominador %d ( /_): ",cont); scanf("%f",&denominador[cont]);
                 printf("\n");
             }
             for(cont=0;cont<=n-1;cont++)
             {
                 suma=suma+(numerador[cont]/denominador[cont]);
             }
             printf("\n");
             printf("El valor de la resistencia total es: %.2f Ohmios",suma);
             getchar();getchar();
             break;
         }
         case 2:
         {
             system("cls");
             total=0;cont1=1;
             printf("\t\tEn esta sección calcularemos la resistencia total\n\n");
             printf("Cuantas resistencias tiene el circuito: ");
             scanf("%d",&n1);
             printf("\n");
             while (cont1<=n1)
             {
                 printf("Escribe el valor de la resistencia %d :> ",cont1);
                 scanf("%f",&res);
                 total+=res;
                 cont1++;
             }
             printf("\n");
             printf("El resultado de el total de las resistencias es: %.2f ohmios",total);
             getchar();getchar();
             break;
         }
         case 3:
             main();
             break;
         case 4:
             exit(0);
       }
   }
}
/***************************************************/
void intensidad(void)
{
   float vol,res,total=0, numerador[sise],denominador[sise],vol1=0,vol2=0,resul;
   int opc,cont;
   while (1){
     system("cls");
     printf("\t\tIntensidad\n"); printf("\n");
     printf("Con que tipo de datos desea calcular la Intensidad:\n\n \t1)Numeros fraccionarios\n \t2)Numeros enteros/decimales\n \t3)regresar al menu anteior\n \t4)Salir\n");
     scanf("%d",&opc); switch(opc)
     {
         case 1:
         {
             system("cls");
             printf("\t\tEn esta sección calcularemos la intensidad total\n"); printf("\n");
             printf("Escribe el valor del voltaje:\n\n");
             for (cont=1;cont<=1;cont++)
             {
                 printf("Escribe el valor del Numerador (_/ ): "); scanf("%f",&numerador[cont]);
                 printf("Escribe el valor del Denominador ( /_): "); scanf("%f",&denominador[cont]);
                 printf("\n");
                 vol1=vol1+(numerador[cont]+denominador[cont]);
             }
             printf("Escribe el valor de la resistencia total:\n\n");
             for (cont=2;cont<=2;cont++)
             {
                 printf("Escribe el valor del Numerador (_/ ): "); scanf("%f",&numerador[cont]);
                 printf("Escribe el valor del Denominador ( /_): "); scanf("%f",&denominador[cont]);
                 printf("\n");
                 vol2=vol2+(numerador[cont]+denominador[cont]);
             }
             resul=vol1/vol2;
             printf("\n");
             printf("El valor de la intensidad total es: %.2f Ampers",resul);
             getchar();getchar();
             system("cls");
             break;
         }
         case 2:
         {
             system("cls");
             printf("\t\tEn esta sección calcularemos la intensidad total\n"); printf("\n");
             printf("Cual es el valor del voltaje total: "); scanf("%f",&vol);
             printf("Cual es el valor de la resistencai total: "); scanf("%f",&res); printf("\n"); total=vol/res;
             printf("La intensidad es: %.2f ampers",total);
             getchar();getchar();
             break;
         }
         case 3:
             main();
         case 4:
             exit(0);
       }
   }

}
/***************************************************/
void voltaje(void)
{
   float res,inte,total=0,numerador,denominador,tot1=0,resul;
   int opc;
   while (1) {
     system("cls");
     tot1=0;
     printf("\t\tVoltaje\n\n");
     printf("Con que tipo de datos desea calcular la Intensidad:\n\n \t1)Numeros fraccionarios\n \t2)Numeros enteros/decimales\n \t3)regresar al menu anteior\n \t4)Salir\n");
     scanf("%d",&opc); switch(opc)
     {
         case 1:
         {
             printf("\t\tEn esta sección calcularemos el voltaje total\n\n");
             printf("Cual es el valor de la resistencia total: \n\n");
             printf("Escribe el valor del Numerador (_/ ): "); scanf("%f",&numerador);
             printf("Escribe el valor del Denominador ( /_): "); scanf("%f",&denominador);
             printf("\n");
             tot1=(numerador/denominador);
             printf("Cual es el valor de la intensidad total: "); scanf("%f",&inte); printf("\n");
             resul=inte*tot1;
             printf("El valor de el voltaje total es: %.2f Volts",resul);
             getchar();getchar();
             break;
         }
         case 2:
         {
             system("cls");
             printf("\t\tEn esta sección calcularemos el voltaje total\n\n");
             printf("Cual es el valor de la resistencia total: "); scanf("%f",&res);
             printf("Cual es el valor de la intensidad total: "); scanf("%f",&inte); printf("\n"); total=res*inte;
             printf("El voltaje total es: %.2f vols",total);
             getchar();getchar();
             break;

         }
         case 3:
             main();
             break;
         case 4:
             exit(0);
       }
   }

}
/***************************************************/

0xDani

@leosansan, te dejo un truco de preprocesador que he usado mas de una vez aqui para limpiar la pantalla:


#ifdef __unix__ /* Estamos en *nix */
#define clscr() system("clear");
#elif defined __WIN32 /* Estamos en windows */
#define clscr() system("cls");
#else
#warning Missing clear screen function
#endif

/* En el codigo puedes usar clscr() tranquilamente para limpiar la pantalla */

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

leosansan

Cita de: 0xDani en 18 Febrero 2013, 16:17 PM
@leosansan, te dejo un truco de preprocesador que he usado mas de una vez aqui para limpiar la pantalla:
.....................................................................................

Muchas gracias, la verdad es que lo veo muy útil. ;-)

Saluditos!.

BatchianoISpyxolo

Cita de: 0xDani en 18 Febrero 2013, 16:17 PM
@leosansan, te dejo un truco de preprocesador que he usado mas de una vez aqui para limpiar la pantalla:


#ifdef __unix__ /* Estamos en *nix */
#define clscr() system("clear");
#elif defined __WIN32 /* Estamos en windows */
#define clscr() system("cls");
#else
#warning Missing clear screen function
#endif

/* En el codigo puedes usar clscr() tranquilamente para limpiar la pantalla */



¿Y Para Mac OS? *.* xD
Puede que desees aprender a programar desde 0: www.espascal.es

0xDani

Cita de: BatchianoISpyxolo en 18 Febrero 2013, 23:22 PM
¿Y Para Mac OS? *.* xD

1) I don't give a shit about Mac OS
2) La idea queda clara, solo hay que buscar la macro que debe estar definida en Mac OS
3) *Creo* que __unix__ esta definida en Mac OS
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

barnix456

gracias por tu aporte leosansan disculpa por responder hasta ahora, es que por mi trabajo me ocupo toda la semana, y lamentablemente donde no voy no hay cobertura de red movil, pero gracias por tus consejos, no sabia que el while se podria usar como un goto, y que el goto provocaba esos errores, y el system("pause") nunca lo habia usadado, checare ahora el codigo gracias.


0xDani Gracias por tu aporte para limpiar mas facilmente la pantalla, si es muy bueno, lo hace mas rapido, gracias de nuevo.

Cualquier duda y aclaracion la publico mas al rato, gracias a todos.
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov