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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  obtener factorial y evitar desbordamiento de memoria con punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: obtener factorial y evitar desbordamiento de memoria con punteros  (Leído 7,410 veces)
kikian94

Desconectado Desconectado

Mensajes: 66


Ver Perfil
obtener factorial y evitar desbordamiento de memoria con punteros
« 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.  


En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #1 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 ;)


En línea

kikian94

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #2 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
En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #3 en: 12 Noviembre 2013, 12:22 pm »

No se si es esto que quieres, pero a mi no se me cuerga XD
 :rolleyes:


En línea

erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #4 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
« Última modificación: 13 Noviembre 2013, 02:25 am por erest0r » En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
KaL3o

Desconectado Desconectado

Mensajes: 60



Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #5 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..
« Última modificación: 13 Noviembre 2013, 02:49 am por KaL3o » En línea

Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #6 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
kellogs95

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: obtener factorial y evitar desbordamiento de memoria con punteros
« Respuesta #7 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:
En línea

kikian94

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re:
« Respuesta #8 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
reservar memoria para punteros en C « 1 2 3 »
Programación C/C++
Ghalad 23 18,939 Último mensaje 1 Junio 2010, 20:54 pm
por Ghalad
quien me puede ayudar a pasar este codigo con punteros y memoria dinamica
Programación C/C++
attackers 3 2,729 Último mensaje 23 Noviembre 2011, 13:04 pm
por attackers
Como evitar que se extraigan datos de la memoria volatil
Seguridad
devilhands 1 1,785 Último mensaje 22 Junio 2014, 05:00 am
por engel lex
Aumento de la memoria del Heap por desbordamiento. C++ Qt5
Programación C/C++
DarkSun812 2 2,740 Último mensaje 23 Marzo 2022, 15:12 pm
por DarkSun812
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines