obtener factorial y evitar desbordamiento de memoria con punteros

Iniciado por kikian94, 11 Noviembre 2013, 11:51 AM

0 Miembros y 1 Visitante están viendo este tema.

kikian94

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");
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=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:
printf("Adios!");

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;
}


vangodp

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 (cpp) [Seleccionar]


#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 ;)

kikian94

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

vangodp

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



erest0r

#4
A factorial deberia asignarse el valor de numero, y cuando dices que comprobar vale 2, deberias hacer un return comprobar;

Código (cpp) [Seleccionar]

factorial = numero;
if(numero<0){
   comprobar=2;
   return comprobar;
}


entre otras cosas, porque lo demas no comprendo bien lo que querias hacer
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

#5
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..
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.

rir3760

Cita de: kikian94 en 11 Noviembre 2013, 11:51 AMtengo 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
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

EUITT.... Creo que vamos a tener que hacer un foro para nosotros solos...

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

kikian94

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