Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kikian94 en 11 Noviembre 2013, 11:51 am



Título: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: kikian94 en 11 Noviembre 2013, 11:51 am
hola, tengo que hacer un programa que tenga varias opciones, la primera es la obtencion de un factorial mediante el uso de punteros y funciones de modo que dependiendo de si la variable comprobar es un 1,2 o 0 diga si el numero introducido es negativo, es correcto o ha habido desbordamiento, el problema es que he hecho todo pero al ejecutar el programa no carga y da error, se que el fallo esta en los punteros pero no se como arreglarlo

Código
  1. #include<stdio.h>
  2.  
  3.  
  4.  
  5. int factorial(int numero,int *pfactorial);
  6. int main(void){
  7.  
  8. int opcion;
  9. int numero;
  10. int *pfactorial;
  11. int comprobar;
  12. int factorial;
  13.  
  14.  
  15.  
  16. do{
  17. printf("**********MENU**********\n");
  18. fflush(stdout);
  19.  
  20. printf("1.  Factorial de un numero\n");
  21. fflush(stdout);
  22.  
  23. printf("2.  Seno de un angulo\n");
  24. fflush(stdout);
  25.  
  26. printf("3.  Estadisticas de una secuencia digital\n");
  27. fflush(stdout);
  28.  
  29. printf("4.  Evitar n unos seguidos en una secuencia digital\n");
  30. fflush(stdout);
  31.  
  32. printf("5.  Salir del programa\n");
  33. fflush(stdout);
  34.  
  35. scanf("%d", &opcion);
  36.  
  37.  
  38. if(opcion>0&&opcion<6){
  39. switch(opcion){
  40.  
  41. case 1:
  42. printf("Introduzca un numero para calcular factorial:");
  43. fflush(stdout);
  44. scanf("%d",&numero);
  45.  
  46. comprobar=factorial(numero,&factorial);
  47.  
  48. if(comprobar==1){
  49.  
  50. printf(" Desbordamiento de memoria \n");
  51. }
  52. if(comprobar==2){
  53. printf(" El numero introduzido es negativo");
  54. }
  55.  
  56. if(comprobar==0){
  57.  
  58. printf("El Factorial del numero: %d es: %d \n", numero,*pfactorial);
  59.  
  60. }
  61.  
  62.  
  63. break;
  64. case 2:
  65.  
  66.  
  67. break;
  68. case 3:
  69.  
  70.  
  71. break;
  72. case 4:
  73.  
  74.  
  75. break;
  76.  
  77. case 5:
  78. printf("Adios!");
  79.  
  80. break;
  81.  
  82. default:
  83.  
  84. printf("Elige una opcion valida");
  85. break;
  86.  
  87. }
  88. }
  89. }while(opcion!=5);
  90.  
  91. return 0;
  92. }
  93.  
  94.  
  95. int factorial(int numero,int *pfactorial){
  96.  
  97. int i;
  98. int auxiliar;
  99. int factorial;
  100. int comprobar;
  101. i=1;
  102. auxiliar=1;
  103. if(numero<0){
  104. comprobar=2;
  105. }
  106. if(numero>=0){
  107.    while((i<=numero) && (comprobar!=0)){
  108.     auxiliar=factorial;
  109.     factorial=(factorial*i);
  110.     if((factorial/auxiliar)!=i){
  111.     comprobar=1;
  112. }
  113.     i++;
  114.    }
  115. }
  116. if((factorial/auxiliar)!=i){
  117.     comprobar=0;
  118. }
  119. (*pfactorial)= factorial;
  120. return comprobar;
  121. }
  122.  
  123.  


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: vangodp en 11 Noviembre 2013, 17:13 pm
creo que tienes una funcion que se llama lo mismo que una variable.
cambia el nombre de la funcion a fact y ya te marcha la cosa XD

Código
  1.  
  2. #include<stdio.h>
  3.  
  4.  
  5.  
  6. int fact (int numero,int *pfactorial);
  7. int main(void){
  8.  
  9. int opcion;
  10. int numero;
  11. int *pfactorial;
  12. int comprobar;
  13. int factorial;
  14.  
  15.  
  16.  
  17. do{
  18. printf("**********MENU**********\n");
  19. fflush(stdout);
  20.  
  21. printf("1.  Factorial de un numero\n");
  22. fflush(stdout);
  23.  
  24. printf("2.  Seno de un angulo\n");
  25. fflush(stdout);
  26.  
  27. printf("3.  Estadisticas de una secuencia digital\n");
  28. fflush(stdout);
  29.  
  30. printf("4.  Evitar n unos seguidos en una secuencia digital\n");
  31. fflush(stdout);
  32.  
  33. printf("5.  Salir del programa\n");
  34. fflush(stdout);
  35.  
  36. scanf("%d", &opcion);
  37.  
  38.  
  39. if(opcion>0&&opcion<6){
  40. switch(opcion){
  41.  
  42. case 1:
  43. printf("Introduzca un numero para calcular factorial:");
  44. fflush(stdout);
  45. scanf("%d",&numero);
  46.  
  47. comprobar = fact(numero,&factorial);
  48.  
  49. if(comprobar==1){
  50.  
  51. printf(" Desbordamiento de memoria \n");
  52. }
  53. if(comprobar==2){
  54. printf(" El numero introduzido es negativo");
  55. }
  56.  
  57. if(comprobar==0){
  58.  
  59. printf("El Factorial del numero: %d es: %d \n", numero,*pfactorial);
  60.  
  61. }
  62.  
  63.  
  64. break;
  65. case 2:
  66.  
  67.  
  68. break;
  69. case 3:
  70.  
  71.  
  72. break;
  73. case 4:
  74.  
  75.  
  76. break;
  77.  
  78. case 5:
  79. printf("Adios!");
  80.  
  81. break;
  82.  
  83. default:
  84.  
  85. printf("Elige una opcion valida");
  86. break;
  87.  
  88. }
  89. }
  90. }while(opcion!=5);
  91.  
  92. return 0;
  93. }
  94.  
  95.  
  96. int fact(int numero,int *pfactorial){
  97.  
  98. int i;
  99. int auxiliar;
  100. int factorial;
  101. int comprobar;
  102. i=1;
  103. auxiliar=1;
  104. if(numero<0){
  105. comprobar=2;
  106. }
  107. if(numero>=0){
  108.   while((i<=numero) && (comprobar!=0)){
  109.    auxiliar=factorial;
  110.    factorial=(factorial*i);
  111.    if((factorial/auxiliar)!=i){
  112.    comprobar=1;
  113. }
  114.    i++;
  115.   }
  116. }
  117. if((factorial/auxiliar)!=i){
  118.    comprobar=0;
  119. }
  120. (*pfactorial)= factorial;
  121. return comprobar;
  122. }
  123.  
  124.  

aclaro que no eh comprobado el funcionamiento del programa pero a la funcion ya la puedes llamar que si te funciona ;)


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: kikian94 en 12 Noviembre 2013, 08:39 am
me sigue sin funcionar, lo ejecuto me pide el factorial, le meto el 3 por ejemplo y me pone que el programa dejo de funcionar


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: vangodp en 12 Noviembre 2013, 12:22 pm
No se si es esto que quieres, pero a mi no se me cuerga XD
 :rolleyes:
(http://i1247.photobucket.com/albums/gg633/vangodp/lol_zps1d988dcf.jpg)



Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: erest0r en 13 Noviembre 2013, 01:54 am
A factorial deberia asignarse el valor de numero, y cuando dices que comprobar vale 2, deberias hacer un return comprobar;

Código
  1. factorial = numero;
  2. if(numero<0){
  3.    comprobar=2;
  4.    return comprobar;
  5. }
  6.  

entre otras cosas, porque lo demas no comprendo bien lo que querias hacer


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: KaL3o en 13 Noviembre 2013, 02:41 am
Asi mirando de rapidez tu codigo, tienes dos variables diferentes con el mismo nombre
*pfactorial, dos punteros que declaras uno en el main y otro en la funcion. Edito: Te amplio un poco, el puntero de la funcion tomara la dirección de memoria que le mandes, mas no el *pfactorial del main.

otro error es q tu variable comprobar en la funcion no esta inicializada, por ende si el parametro enviado es menor o igual a cero nunca entrara en tu ciclo while, bueno puede que lo haga porq la variable se llena con basura..


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: rir3760 en 13 Noviembre 2013, 18:33 pm
tengo que hacer un programa que tenga varias opciones, la primera es la obtencion de un factorial mediante el uso de punteros y funciones de modo que dependiendo de si la variable comprobar es un 1,2 o 0 diga si el numero introducido es negativo, es correcto o ha habido desbordamiento, el problema es que he hecho todo pero al ejecutar el programa no carga y da error
Como ya te comentaron (salvo el ultimo punto):

* El problema principal se debe a que declaras en ambas funciones (main y "factorial") una variable con el nombre "factorial".

* En la función main declaras y tratas de utilizar una variable con el nombre "pfactorial":
Código
  1. int *pfactorial;
  2.  
  3. /* ... */
  4.  
  5. printf ("El Factorial del numero: %d es: %d \n", numero, *pfactorial);
En su lugar solo tienes que imprimir el valor de la variable cuya dirección pasas en la llamada a la función "factorial".

* Cuando se desborda un entero con signo en C ello resulta en comportamiento no definido. Para evitarlo en lugar de "a * b <= max" utilizas "a <= max / b" donde max es el valor máximo para el tipo signed int, ese valor esta dado por la macro INT_MAX definida en <limits.h>.

Un saludo


Título: Re: obtener factorial y evitar desbordamiento de memoria con punteros
Publicado por: kellogs95 en 13 Noviembre 2013, 21:53 pm
EUITT.... Creo que vamos a tener que hacer un foro para nosotros solos...

Cuidado con el detector de copias... ya tu sabe  :silbar:


Título: Re:
Publicado por: kikian94 en 17 Noviembre 2013, 09:01 am
ya lo arregle gracias, tenia un error en el while de la funcion ya que nunca entraba en el. saludos

Enviado desde mi Nexus 5 mediante Tapatalk