Fracciones en C [Ayuda]

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

0 Miembros y 2 Visitantes están viendo este tema.

barnix456

Hola buenas tardes, tengo una duda, mi maestro de Fisica me ha dejado un pequeño programa en C para resolver la ecuacion de OHM, y lo he echo, pero me ha pedido que lo haga para que el programa tambien lea numero fraccionarios  :rolleyes: ahora no se, he buscado en google pero no he encontrado grandes cosas, si alguien sabe como trabajar con fracciones en C, me imagino que debe ser una funcion. Aqui les dejo mi codigo, cualquier comentario acerca del codigo son bienvenidos  ;D


#include <stdio.h>
#include <stdlib.h>
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();
   a:
   system("clear");
   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);
        }
        default:
        {
            goto a;
        }
   }
   return 0;
}

void resistencia(void)
{
    float n, res, total=0;
    int cont=1;
    system("clear");
    printf("\t\tEn esta sección calcularemos la resistencia total\n"); printf("\n");
    printf("Cuantas resistencias tiene el circuito: "); scanf("%f",&n); printf("\n");
    while (cont<=n)
    {
        printf("Escribe el valor de la resistencia %d :> ",cont); scanf("%f",&res);
        total+=res;
        cont++;
    }
    printf("\n");
    printf("El resultado de el total de las resistencias es: %.2f ohmios",total);
}

void intensidad(void)
{
    float vol,res,total=0;
    system("clear");
    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);
}

void voltaje(void)
{
    float res,inte,total=0;
    system("clear");
    printf("\t\tEn esta sección calcularemos el voltaje total\n"); printf("\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);
}
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

DickGumshoe

Hola.

Para trabajar con fracciones, puedes hacer una estructura que contenga dos campos: numerador y denominador. Así, cuando sea necesario mostrar la fracción, solo debes poner en un printf numerador / denominador, y te muestra ambos, y si quieres dividir, puedes también. No sé si me he expresado bien...

barnix456

Ah ver si entendi, poner algo como.

printf("Escriba la fraccion:)";
printf("  /  ");
scanf("%d%d, &a,&b);


o bueno esa es la idea pero, es una buena tecnica la habia pensado, pero no habra una funcion en la que si se puedan escribir una fraccion, o solo podremos trabajar de esa manera.
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

DickGumshoe

Me refería a crear un struct de esta forma:

#include <stdio.h>

struct division
{
    int numerador;
    int denominador;
}fraccion;

int main()
{
    //Las cantidades las asignamos desde donde queramos.
    //Desde el programa, se las pedimos al usuario...
    fraccion.numerador = 59;
    fraccion.denominador = 3;

    //Queremos mostrar solo la fracción:

    printf("Resultado 1: %d / %d\n\n", fraccion.numerador, fraccion.denominador);

    //Queremos mostrar el resultado con decimales:

    printf("Resultado 2: %f", (float) fraccion.numerador / fraccion.denominador);
   
    return 0;
}


Así podrías trabajar con fracciones de una forma sencilla.

Otra forma que se me acaba de ocurrir, aunque es mucho más pesada y larga, es trabajar con números decimales y expresar el resultado en forma de fracción generatriz. Obviamente esta forma es más larga, supongo que lo que buscas es la primera.  ;)

Un saludo.

barnix456

guaoo eso se ve muy interesante, la verdad no se hacer eso de las "struct" apenas comienzo jejej pero se ve interesante... tendre que buscar algo de eso para poder hacerlo jeje gracias
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

DickGumshoe

En el último caso, si no sabes usar estructuras todavía y no tienes tiempo de aprender, puedes crear dos variables numerador, denominador. No queda "tan elegante", pero sigue siendo útil.

Pero bueno, el uso del struct es bastante sencillo, no tiene más que lo que te he mostrado en el código.  ;)

barnix456

siii practicare apartir de ahi.. gracias por la informacion
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

BatchianoISpyxolo

Generalmente para trabajar con un cierto tidpo de dato que no existe predefinidamente en el lenguaje, lo que se hace es crear un TAD (tipo abstracto de datos) que dependiendo del lenguaje se puede implementar de una forma u otra.

Es decir, tener un tipo de dato complejo (formado a partir de tipos de datos simples) que pueda manejarse a través de rutinas para así abstraer el código y restringir el uso de cierto TAD; entre otras características.
Puede que desees aprender a programar desde 0: www.espascal.es

barnix456

disculpa por responder hasta ahora, habia estado ocupado en el trabajo, pasando a lo que explicaste, la verdad, todavia lo de "struct" me parecio algo mas simple de entender a lo tuyo, pero bien, como aun no se mucho de programacion lo que hice fue, hacer un arreglo, para el numerador y denominador, asi primero pedia el numerador y luego el denominador y los fui guardando en la misma posicion del arreglo:

numerador[1]=4
denominador[1]=5

y ya tenia mi fraccion 4/5

y divido los numeros y ya tengo el valor real de cada fraccion, al momento de mostrar el resultado lo muestra con decimales.

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.

como hago para limpiar este bufer?? busque algo como:

fflush(stdin)

while(getchar()!='\n');

pero no se como funciona?? alguien me podria explicar
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

barnix456

Les dejo mi codigo, ya sabes lo errores, observaciones y consejos me lo dicen... estoy aprendiendo apenas.


#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();
   b:
   system("clear");
   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:
       {
           fflush(stdin);
           resistencia();
           break;
        }
        case 2:
        {
            fflush(stdin);
            intensidad();
            break;
        }
        case 3:
        {
            fflush(stdin);
            voltaje();
            break;
        }
        case 4:
        {
            exit(0);
        }
        default:
        {
            goto b;
        }
   }
   return 0;
}

void resistencia(void)
{
    float res, total=0,suma=0,numerador[sise], denominador[sise];
    int n,cont,opc,cont1=1,n1;
    a:
    system("clear");
    printf("\t\tRESISTENCA\n"); printf("\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");
    fflush(stdin);
    scanf("%d",&opc); switch(opc)
    {
        case 1:
        {
            system("clear");
            printf("\t\tEn esta sección calcularemos la resistencia total\n"); printf("\n");
            printf("Cuantas resistencias tiene el circuito: "); scanf("%d",&n); printf("\n");
            fflush(stdin);
            for (cont=0;cont<=n-1;cont++)
            {
                printf("Escribe el valor del denomiador %d (_/ ): ",cont); scanf("%f",&numerador[cont]);
                printf("Escribe el valor del Denominaor %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();
            system("clear");
            goto a;
        }
        case 2:
        {
            fflush(stdin);
            system("clear");
            printf("\t\tEn esta sección calcularemos la resistencia total\n"); printf("\n");
            printf("Cuantas resistencias tiene el circuito: "); scanf("%d",&n1); printf("\n");
            fflush(stdin);
            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();
            system("clear");
            goto a;
        }
        case 3:
            main();
        case 4:
            exit(0);
        default:
            goto a;
    }
}
void intensidad(void)
{
    float vol,res,total=0, numerador[sise],denominador[sise],vol1=0,vol2=0,resul;
    int opc,cont;
    c:
    fflush(stdin);
    system("clear");
    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:
        {
            fflush(stdin);
            system("clear");
            printf("\t\tEn esta sección calcularemos la intensidad total\n"); printf("\n");
            printf("Escribe el valor del voltaje:\n\n");
            fflush(stdin);
            for (cont=1;cont<=1;cont++)
            {
                printf("Escribe el valor del denominador (_/ ): "); scanf("%f",&numerador[cont]);
                printf("Escribe el valor del Denominaor ( /_): "); scanf("%f",&denominador[cont]);
                printf("\n");
                vol1=vol1+(numerador[cont]+denominador[cont]);
            }
            fflush(stdin);
            printf("Escribe el valor de la resistencia total:\n\n");
            fflush(stdin);
            for (cont=2;cont<=2;cont++)
            {
                printf("Escribe el valor del denominador (_/ ): "); scanf("%f",&numerador[cont]);
                printf("Escribe el valor del Denominaor ( /_): "); 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("clear");
            goto c;
        }
        case 2:
        {
            fflush(stdin);
            system("clear");
            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();
            system("clear");
            goto c;
        }
        case 3:
            main();
        case 4:
            exit(0);
        default:
            goto c;
    }
}

void voltaje(void)
{
    float res,inte,total=0,numerador[sise],denominador[sise],tot1=0,tot2=0,resul;
    int opc,cont;
    d:
    fflush(stdin);
    system("clear");
    printf("\t\tVoltaje\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:
        {
            fflush(stdin);
            printf("\t\tEn esta sección calcularemos el voltaje total\n"); printf("\n");
            printf("Cual es el valor de la resistencia total:> \n\n");
            fflush(stdin);
            for (cont=1;cont<=1;cont++)
            {
                printf("Escribe el valor del denominador (_/ ): "); scanf("%f",&numerador[cont]);
                printf("Escribe el valor del Denominaor ( /_): "); scanf("%f",&denominador[cont]);
                printf("\n");
                tot1=tot1+(numerador[cont]+denominador[cont]);
            }
            fflush(stdin);
            printf("Escribe el valor de la resistencia total:\n\n");
            for (cont=2;cont<=2;cont++)
            {
                printf("Escribe el valor del denominador (_/ ): "); scanf("%f",&numerador[cont]);
                printf("Escribe el valor del Denominaor ( /_): "); scanf("%f",&denominador[cont]);
                printf("\n");
                tot2=tot2+(numerador[cont]+denominador[cont]);
            }
            resul=tot1*tot2;
            printf("\n");
            printf("El valor de el voltaje total es: %.2f Volts",resul);
            getchar();
            getchar();
            system("clear");
            goto d;
        }
        case 2:
        {
            fflush(stdin);
            system("clear");
            printf("\t\tEn esta sección calcularemos el voltaje total\n"); printf("\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); fflush(stdin);
            getchar(); getchar();
            goto d;

        }
        case 3:
            main();
        case 4:
            exit(0);
        default:
            goto d;
    }
}


por ahora mi unica duda es eso del buffer... gracias
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov