Autor
|
Tema: obtener factorial y evitar desbordamiento de memoria con punteros (Leído 7,410 veces)
|
kikian94
Desconectado
Mensajes: 66
|
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 #include<stdio.h> int factorial(int numero,int *pfactorial); int main(void){ int opcion; int numero; int *pfactorial; int comprobar; int factorial; do{ printf("**********MENU**********\n"); printf("1. Factorial de un numero\n"); printf("2. Seno de un angulo\n"); printf("3. Estadisticas de una secuencia digital\n"); printf("4. Evitar n unos seguidos en una secuencia digital\n"); printf("5. Salir del programa\n"); if(opcion>0&&opcion<6){ switch(opcion){ case 1: printf("Introduzca un numero para calcular factorial:"); comprobar=factorial(numero,&factorial); if(comprobar==1){ printf(" Desbordamiento de memoria \n"); } if(comprobar==2){ printf(" El numero introduzido es negativo"); } if(comprobar==0){ printf("El Factorial del numero: %d es: %d \n", numero ,*pfactorial ); } break; case 2: break; case 3: break; case 4: break; case 5: break; default: printf("Elige una opcion valida"); break; } } }while(opcion!=5); return 0; } int factorial(int numero,int *pfactorial){ int i; int auxiliar; int factorial; int comprobar; i=1; auxiliar=1; if(numero<0){ comprobar=2; } if(numero>=0){ while((i<=numero) && (comprobar!=0)){ auxiliar=factorial; factorial=(factorial*i); if((factorial/auxiliar)!=i){ comprobar=1; } i++; } } if((factorial/auxiliar)!=i){ comprobar=0; } (*pfactorial)= factorial; return comprobar; }
|
|
|
En línea
|
|
|
|
vangodp
Desconectado
Mensajes: 455
|
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 #include<stdio.h> int fact (int numero,int *pfactorial); int main(void){ int opcion; int numero; int *pfactorial; int comprobar; int factorial; do{ printf("**********MENU**********\n"); fflush(stdout); printf("1. Factorial de un numero\n"); fflush(stdout); printf("2. Seno de un angulo\n"); fflush(stdout); printf("3. Estadisticas de una secuencia digital\n"); fflush(stdout); printf("4. Evitar n unos seguidos en una secuencia digital\n"); fflush(stdout); printf("5. Salir del programa\n"); fflush(stdout); scanf("%d", &opcion); if(opcion>0&&opcion<6){ switch(opcion){ case 1: printf("Introduzca un numero para calcular factorial:"); fflush(stdout); scanf("%d",&numero); comprobar = fact(numero,&factorial); if(comprobar==1){ printf(" Desbordamiento de memoria \n"); } if(comprobar==2){ printf(" El numero introduzido es negativo"); } if(comprobar==0){ printf("El Factorial del numero: %d es: %d \n", numero,*pfactorial); } break; case 2: break; case 3: break; case 4: break; case 5: printf("Adios!"); break; default: printf("Elige una opcion valida"); break; } } }while(opcion!=5); return 0; } int fact(int numero,int *pfactorial){ int i; int auxiliar; int factorial; int comprobar; i=1; auxiliar=1; if(numero<0){ comprobar=2; } if(numero>=0){ while((i<=numero) && (comprobar!=0)){ auxiliar=factorial; factorial=(factorial*i); if((factorial/auxiliar)!=i){ comprobar=1; } i++; } } if((factorial/auxiliar)!=i){ comprobar=0; } (*pfactorial)= factorial; return comprobar; }
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
Mensajes: 66
|
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
|
|
|
|
|
erest0r
Desconectado
Mensajes: 147
|
A factorial deberia asignarse el valor de numero, y cuando dices que comprobar vale 2, deberias hacer un return comprobar; factorial = numero; if(numero<0){ comprobar=2; return comprobar; }
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
Mensajes: 60
|
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
Mensajes: 1.639
|
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": int *pfactorial; /* ... */ 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
Mensajes: 4
|
EUITT.... Creo que vamos a tener que hacer un foro para nosotros solos... Cuidado con el detector de copias... ya tu sabe
|
|
|
En línea
|
|
|
|
kikian94
Desconectado
Mensajes: 66
|
|
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
|
|
|
|
|
|