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;
}
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 ;)
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
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)
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
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..
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
EUITT.... Creo que vamos a tener que hacer un foro para nosotros solos...
Cuidado con el detector de copias... ya tu sabe :silbar:
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