elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Les presento mi calculadora de ncr!!!(ahora si que si!!!)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Les presento mi calculadora de ncr!!!(ahora si que si!!!)  (Leído 15,110 veces)
flacc


Desconectado Desconectado

Mensajes: 854


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #10 en: 18 Mayo 2010, 23:13 pm »

ok, ok pero para que ese tono...
yo solo quería hacerla un poco mejor...y pense que getch() era lo mismo que getchar(),
ademas no tenía idea de que era parte de conio2.h, yo solo la puse para usar gotoxy(), ademas eso lo saque de un ejemplo en la red, por que no me daba pausa con getchar(), o no la se usar..
en fin... seguiré trabajando haber si queda mejor...
saludoss


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #11 en: 19 Mayo 2010, 03:49 am »

Si el getchar() no hace su trabajo quiere decir que el buffer no está limpio.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
flacc


Desconectado Desconectado

Mensajes: 854


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #12 en: 19 Mayo 2010, 13:32 pm »

Citar
Si el getchar() no hace su trabajo quiere decir que el buffer no está limpio.

entonces como limpio el buffer...
En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #13 en: 19 Mayo 2010, 13:41 pm »

Puedes utilizar:

Código
  1. fflush(stdin); // Limpia el buffer de entrada

EDIT: Si utilizas los pauses a través de system("Pause"), getchar(), etc, únicamente para ver los resultados, es preferible que para ahorrarte ese tipo de cosas, ejecutes tu programa a través de una consola.
« Última modificación: 19 Mayo 2010, 13:51 pm por dr.~ » En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #14 en: 19 Mayo 2010, 15:24 pm »

Puedes utilizar:

Código
  1. fflush(stdin); // Limpia el buffer de entrada

EDIT: Si utilizas los pauses a través de system("Pause"), getchar(), etc, únicamente para ver los resultados, es preferible que para ahorrarte ese tipo de cosas, ejecutes tu programa a través de una consola.

Se ha comentado ya acerca del uso del fflush(stdin), mirate lo siguiente

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

para limpiar el buffer de entrada es mejor usar
Código
  1. while(getchar() !='\n');
  2.  
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #15 en: 19 Mayo 2010, 17:51 pm »

Antes que nada mini_nauta felicitaciones por emprenderte a codear!

Aca te dejo tu codigo con algunas mejoras y mas portable, cualquier duda pegue el grito nomas ;D

Código:
#include <stdio.h>

int
main( void )
{
signed long n, k, nf, kf, resta, restaf, x, y;
char opcion;
int ch;

do
{
printf( "\nIngrese n y k: " );
fflush( stdout);
scanf( "%ld %ld", &n, &k );
while ( (ch = fgetc( stdin )) != EOF && ch != '\n' );

nf = 1;
kf = 1;
resta = n - k;
restaf = 1;

while ( n > 1 ) /* factorial de n */
{
nf *= n--;
}

while ( k > 1 ) /* factorial de k */
{
kf *= k--;
}

while ( resta > 1 ) /* factorial de (n - k) */
{
restaf *= resta--;
}

x = kf * restaf; /* k! * (n - k)! */
y = nf / x; /* n! / (k! * (n - k)!) */

/* resultados */
printf( "\nn! = %ld\n"
"k! = %ld\n"
"(n - k)! = %ld\n"
"k! * (n - k)! = %ld\n"
"n! / [k! (n - k)!] = %ld\n"
"--------------------------\n"
"Resultado final (ncr): %ld\n", nf, kf, restaf, x, y, y );

printf( "\nContinuar? S/n: " );
fflush( stdout );
scanf( "%c", &opcion );
while ( (ch = fgetc( stdin )) != EOF && ch != '\n' );
}
while ( opcion == 's' || opcion == 'S' );

return 0;
}

Salu10.
« Última modificación: 19 Mayo 2010, 17:57 pm por nicolas_cof » En línea

Horricreu
Wiki

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #16 en: 19 Mayo 2010, 17:52 pm »

¡Exacto! A esto me refería... a ver si puedo ver el código multiplataforma :silbar:

Saludos :P

PD: perdona si te ha parecido un tono agresivo, sólo quería ayudarte a "mejorar" :)

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje
« Última modificación: 1 Septiembre 2010, 15:50 pm por Horricreu » En línea

flacc


Desconectado Desconectado

Mensajes: 854


Ver Perfil WWW
Re: Les presento mi calculadora de ncr!!!(modificado con el nuevo codigo!!!)
« Respuesta #17 en: 21 Mayo 2010, 04:18 am »

gracias... justamente buscaba poner esa opción de si continuar o no... ;-)....
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Les presento mi calculadora de ncr!!!(ahora si que si!!!)
« Respuesta #18 en: 8 Mayo 2013, 14:39 pm »

[Recopilatorio] Sources interesantes

hola, se preguntarán alguno que diablos es ncr, bueno mas especificamente es una parte del Teorema del binomio.

Mas especificamente es:


Entonces como en mis ratos libres y de oseo aprendo C, y dado que no tengo para comprarme una calculadora de esas Casio y que solo tengo una de esas chinas o japonesas, en fin, me hice mi propia calculadora para eso que entrega detalladamente los resultados para comprobarlos(si quieren a mano)...

..................................................

El uso de los factoriales para el cálculo de los números combinatorios tiene el inconveniente de su tamaño, desbordan las posibilidades de C/C++ desde 14 o 15. Una muestra de la salida de tu código:

Código
  1.  
  2. Ingrese n y k: 16
  3. 14
  4.  
  5. n! = 2004189184
  6. k! = 1278945280
  7. (n - k)! = 2
  8. k! * (n - k)! = -1737076736
  9. n! / [k! (n - k)!] = -1
  10. --------------------------
  11. Resultado final (ncr): -1
  12.  

Decepcionante, ¿verdad?.

Para evitarlo existe otra forma de calcular los números combinatorios que técnicamente consiste en dividir las variaciones de n tomados de p en p entre las permutaciones de p. Vamos que con un ejemplo se ve que es más fácil de lo que parece:

Combinaciones(15,4)= 15/4 * 14/3 * 13/2 * 12/1.

Y aún así se puede mejorar la eficiencia del cálculo. Por ejemplo:

Combinaciones(15,12)=15/12*14/11*13/10*12/9*11/8*10/7*.....

Muy largo, ¿verdad?. Pero eso se puede remediar aprovechado una propiedad de los números combinatorios que establece que :

Combinaciones(n,p)=Combinaciones(n,n-p)

Y aplicada al caso último daría:

Combinaciones(15,12)=Combinaciones(15,3)=15/3 *14/2 *13/1

Mucho más breve que el anterior método.

Así, aprovechando estas dos propiedades, la primera para cuando es inferior a la mitad de n y la segunda para cuando es superior surge el código mágico que te permitirá "meter" de exponente 20 y más sin problemas de que el C/C++ "cruja" soltando números "raros" porque se salen de sus capacidades:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int comb(int n,int p)
  5. {
  6.    int i;
  7.    if (n < 0 || p < 0 || p > n) return 0;
  8.    float c = 1;
  9.    if (p>n/2)
  10.        p=n-p;
  11.    for ( p; p>=1; p--,n--)
  12.        c*= (float)n/p;
  13.    return (int)c;
  14. }
  15. int main()
  16. {
  17.    int n, p, num , y;
  18.    while (1){
  19.        printf("\n\nIngrese n (0 para SALIR): " );
  20.    if (n==0)
  21.        break;
  22.    fflush( stdout);
  23.    scanf(" %d", &n);
  24.    printf("\nIngrese p : " );
  25.    fflush( stdout);
  26.    scanf(" %d", &p);
  27.    printf("\ncombinaciones(%d,%d)= %d",n,p,comb(n,p));
  28.    fflush( stdout);
  29.    }
  30.    return 0;
  31. }
  32.  

Y ahora puedo meter números más grandes:

Código
  1. Ingrese n (0 para SALIR): 40
  2.  
  3. Ingrese p : 35
  4.  
  5. combinaciones(40,35)= 658008
  6.  
  7. Ingrese n (0 para SALIR): 35
  8.  
  9. Ingrese p : 12
  10.  
  11. combinaciones(35,12)= 834451776
  12.  

Saluditos!. ...  

P.D: Más en http://foro.elhacker.net/programacion_cc/teorema_binomial-t388312.0.html
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines