/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

funcion máximo

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 21/09/2007 12:03 pm
Título: funcion máximo

Buenas! Estoy haciendo un programa que tiende a ser bastante grande, pero finalmente he aislar uno de los fallos y bueno, no consigo saber porque me lo hace.

Simplemente he generado una función que te da el máximo de dos números. El programa compila pero no funciona.

Código:
#include<stdio.h>

int maximo_int(int Num1,int Num2)
{
  int maximo=Num2;
  if(Num1>Num2)
  {
    maximo=Num1;
  }
  return maximo;
}

int main(void)
{
  int Numero1,Numero2,maximo;
  int indice;
  printf("Escribe el primer numero: ");
  scanf("%d",&Numero1);
  printf("Escribe el segundo numero: ");
  scanf("%d",&Numero2);
  maximo=maximo_int(Numero1,Numero2);
  printf("El maximo es: %d",maximo);
  return 0;
}


Saludos y gracias!
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 21/09/2007 1:42 pm
Título:

Algo que deberias eliminar es la variable "indice" ya que no la utilizas. La funcion que calcula el maximo se puede reducir a un minimo utilizando el operador condicional "? :", aparte de eso el programa debe funcionar correctamente.

El programa modificado es (C estandar):
Código:
#include <stdio.h>
#include <stdlib.h>

int max_val(int a, int b);

int main(void)
{
   int a, b;
   
   printf("Escribe el primer numero: ");
   fflush(stdout);
   if (scanf("%d", &a) != 1)
      return EXIT_FAILURE;
   
   printf("Escribe el segundo numero: ");
   fflush(stdout);
   if (scanf("%d", &b) != 1)
      return EXIT_FAILURE;
   
   printf("El maximo es: %d\n", max_val(a, b));
   return EXIT_SUCCESS;
}

int max_val(int a, int b)
{
   return (a > b) ? a : b;
}



Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 21/09/2007 2:03 pm
Título:

Gracias, rir3760

Que retorna la función scanf?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 21/09/2007 2:20 pm
Título:

Retorna un numero positivo indicando el numero de conversiones exitosas o EOF en caso de error o fin de archivo.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 22/09/2007 1:12 am
Título:

Bua, que pasada, ahora veo que el programa que puse, aunque tuviera unos errores, compilaba y se ejecutaba bien, así que he ido mirando a ver de donde podía provenir y parece que el error está en una asignación pero no logro saber porqué. Así que tendré que poner todo el pedazo programa. Igualmente he puesto en el código algo como:

Código:
//PRINCIPIO DE LA PARTE DONDE BUSCO EL ERROR 

 
  printf("%d,%d\n",Sum1.longitud,Sum2.longitud); //funciona!!!!
  variable = maximo_int(Sum1.longitud,Sum2.longitud);
  printf("vaya, el problema debe estar en asignar el valores a 'resultado->longitud'\n"); \\funciona!!!!
  resultado->longitud=variable;
  printf("%d\n",resultado->longitud);
//AQUÍ ME MANDA UN ERROR Y SE ME CIERRA EL PROGRAMA!!!!
 
  //FINAL DE LA PARTE DONDE BUSCO EL ERROR


para que no os enredéis en buscar ningun error más, que eso es trabajo mío.

Por cierto, antes ponía:

Código:
//PRINCIPIO DE LA PARTE DONDE BUSCO EL ERROR 

 
  printf("%d,%d\n",Sum1.longitud,Sum2.longitud); //funciona!!!!
  resultado->longitud= maximo_int(Sum1.longitud,Sum2.longitud);
  printf("%d\n",resultado->longitud);
//AQUÍ ME MANDA UN ERROR Y SE ME CIERRA EL PROGRAMA!!!!
 
  //FINAL DE LA PARTE DONDE BUSCO EL ERROR


lo que cree otra variable para poder ver si el problema esta en la función maximo_int o en la asignación, y parece que es lo segundo.

Aquí va el pedazo texto, lo siento:

Código:
#include<stdio.h>
#include<strings.h>
#define CIFRAS 30

struct ENTERO
{
  char natural[CIFRAS];
  char signo;
  int longitud;
};

void printf_entero(struct ENTERO entero)
{
  int indice;
  if(entero.signo==-1)
  {
    printf("-");
  }
  for(indice=0 ; indice<entero.longitud ; indice++)
  {
    printf("%d",entero.natural[indice]);
  }
}

void conv_char_entero(struct ENTERO *entero)
{
  int indice;
  entero->signo=1;
  entero->longitud=strlen(entero->natural);
  if( entero->natural[0]=='-')
  {
    entero->signo=-1;
    for( indice=1 ; indice<entero->longitud ; indice++)
    {
      entero->natural[indice-1]=entero->natural[indice];
    }
    entero->longitud=entero->longitud-1;
  }
  for( indice=0 ; indice<entero->longitud ; indice++)
  {
     if(entero->natural[indice]>='0' && entero->natural[indice]<='9')
     {
       entero->natural[indice]-='0';
     }
     else
     {
       printf("%c no es una cifra",entero->natural[indice]);
       exit(1);
     }
  }
}

int maximo_int(int Num1,int Num2)
{
  return (Num1>Num2) ? Num1 : Num2;
}

void inversion(struct ENTERO *entero)
{
  int indice;
  char *cadena_auxiliar;
  cadena_auxiliar= (char*) malloc(entero->longitud);
  for(indice=0 ; indice<entero->longitud ; indice++)
  {
    cadena_auxiliar[indice]=entero->natural[indice];
  }
  for(indice=0 ; indice<entero->longitud ; indice++)
  {
    entero->natural[indice]=cadena_auxiliar[entero->longitud-1-indice];
  }
  free(cadena_auxiliar);
}

void reajuste_para_suma_o_resta(struct ENTERO *entero, int longitud)
{
  int indice;
  for(indice=entero->longitud ; indice<longitud ; indice++)
  {
    entero->natural[indice]=0;
  }
}

struct ENTERO *algoritmo_suma_natural(struct ENTERO Sum1, struct ENTERO Sum2, struct ENTERO *resultado)
{
  int variable,indice;
  char lo_que_me_llevo=0;
  inversion(&Sum1);
  inversion(&Sum2);
 
//PRINCIPIO DE LA PARTE DONDE BUSCO EL ERROR 
 
  printf("%d,%d\n",Sum1.longitud,Sum2.longitud); //funciona!!!!
  variable = maximo_int(Sum1.longitud,Sum2.longitud);
  printf("vaya, el problema debe estar en asignar el valores a 'resultado->longitud'\n");
  resultado->longitud=variable; //funciona!!!!
  printf("%d\n",resultado->longitud); //AQUÍ ME MANDA UN ERROR Y SE ME CIERRA EL PROGRAMA
 
  //FINAL DE LA PARTE DONDE BUSCO EL ERROR
 
  reajuste_para_suma_o_resta(&Sum1,resultado->longitud);
  reajuste_para_suma_o_resta(&Sum2,resultado->longitud);
  for( indice=0 ; indice<resultado->longitud ; indice++)
  {
    resultado->natural[indice]=Sum1.natural[indice]+Sum2.natural[indice]+lo_que_me_llevo;
    lo_que_me_llevo=resultado->natural[indice]/10;
    resultado->natural[indice]%=10;
  }
  if(lo_que_me_llevo=!0)
  {
    resultado->natural[resultado->longitud]=lo_que_me_llevo;
    resultado->longitud++;
  }
  inversion(resultado); 
}
 
 
struct ENTERO *suma_entera(struct ENTERO Sum1, struct ENTERO Sum2)
{
  struct ENTERO *resultado;
  conv_char_entero(&Sum1);
  conv_char_entero(&Sum2);
  if(Sum1.signo*Sum2.signo==1)
  {
    algoritmo_suma_natural(Sum1,Sum2,resultado);
  }
  else
  {
    //algoritmo_resta_natural()
    printf("No existe algoritmo, usa los dos numeros positivos de momento");
    exit(2);
  }
  return resultado;
}
 

 

int main(void)
{
  struct ENTERO Sum1,Sum2;
  struct ENTERO *resultado;
  int indice;
  resultado->signo=1;
  printf("Escribe el primer sumando: ");
  fflush(stdout);
  scanf("%s",Sum1.natural);
  printf("Escribe el segundo sumando: ");
  fflush(stdout);
  scanf("%s",Sum2.natural);
  resultado=suma_entera(Sum1,Sum2);
  printf("El resultado es: ");
  printf_entero(*resultado);
  printf("\nLongitud=%d\nSigno: %d",resultado->longitud,resultado->signo);
  return 0;


Gracias con antelación
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 22/09/2007 6:55 am
Título:

acabo de encontrar un error en algoritmo_suma_natual()

es una función la cual debe retornar la direccion de una estructura pero en la función no pongo que retorne ningún puntero.

Igualmente sigue sin funcionar.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 22/09/2007 7:18 am
Título:

Antes que nada siempre que tengas una duda con uno de tus programas es muy importante que indiques el lenguaje de programacion que estas utilizando junto con el compilador, plataforma y toda otra informacion que nos sea de informacion para ayudarte, como dice el dicho "ayudate que yo te ayudare" ...

Lo primero que debes hacer es definir los prototipos de todas tus funciones y colocar estos al principio del programa, despues de los archivos de inclusion macros y definiciones de tipos. Seria mas o menos asi:
Código:
#include <stdio.h>
#include <strings.h>

#define CIFRAS 30

struct ENTERO {
   char natural[CIFRAS];
   char signo;
   int longitud;
};

/* ... */

void printf_entero(struct ENTERO entero);
void conv_char_entero(struct ENTERO *entero);

int main(void){ /* ... */ }

/* ... */

Esto tiene dos propositos: el primero es permitirle al compilador verificar que todas las llamadas a funcion sean correctas en el numero y tipo de argumentos asi como en relacion al valor de retorno y la segunda es que te olvidas de la estructura del programa (orden en que se definen las funciones).

El primer error importante se encuentra en la funcion "main", en esta declaras la variable "resultado" pero en ningun momento le das un valor de forma explicita.

Hay que recordar que todas las variables locales almacenan un valor no definido o "basura" a menos (por supuesto) que nosotros le demos explicitamente un valor. Cuando tratas de utilizar los operadores '->' o '*' en el valor de esa variable se estaria accediendo una ubicacion en memoria que no es valida.

Este error tambien se encuentra en la funcion "suma_entera".

Para corregir el programa lo mas sencillo es no usar variables de tipo puntero, en su lugar si deseas modificar una variable declarada en una funcion desde otra funcion lo mas sencillo (relativamente hablando) es utilizando la emulacion del paso por referencia.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 22/09/2007 11:54 am
Título:

Estoy usando el compilador Dev-C++, y bueno, creo que el lenguaje se deduce claramente si se mira el código( es C).

No acabo de entender que quieres decir con darle un valor explícito a la variable.

Lo único que hago es como resultado es una estructura pues aplico lo mismo que con las matrices. Solamente puedo enviar la direccion de la variable y ya entonces con "*" o con "->"coger los valores asignados.

Lo que hago esquematcamente sería esto:

Código:
#include<stdio.h>

int *funcion(void)
{
  int *variable;
  *variable=2;
  return variable;
}

int main(void)
{
  int *variable;
  variable=funcion(void);
  printf("%d",*variable);
  return 0;
}


La única alternativa que sé es la siguiente:

Código:
#include<stdio.h>

void funcion(int *variable)
{
  *variable=2;
}

int main(void)
{
  int variable;
  funcion(&variable);
  printf("%d",variable);
  return 0;
}


¿Es a eso a lo que te referías?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 22/09/2007 2:46 pm
Título:

Pantalàimon_ escribió:
No acabo de entender que quieres decir con darle un valor explícito a la variable.

Toda variable local declarada en esta forma:
Código:
void fn(void)
{
   int i; /* no hay inicializacion */
   
   /* como tampoco asignacion */
   
   printf("%d\n", i); /* imprime lo que sea */
}

Tiene almacenado un valor no definido o "basura", con esto quiero decir que el valor almacenado en la variable puede ser cualquier valor. Cuando se ejecuta la llamada a la funcion printf el valor impreso puede ser cualquiera debido a la falta de inicializacion y/o asignacion.

Esto ultimo ejemplificado con una funcion:
Código:
void fn(void)
{
   int i = 5; /* inicializacion */
   int j;
   
   j = 7; /* asignacion */
   
   printf("%d\n", i); /* imprime 5 */
   printf("%d\n", j); /* imprime 7 */
}


Pantalàimon_ escribió:
Lo único que hago es como resultado es una estructura

La variable "resultado" en tu programa no es una estructura sino un puntero a estructura y estas cometiendo el error que te mencione antes.

Los variables locales de tipo puntero no se diferencian de ninguna otra variable local y tienen la restriccion de que no pueden utilizarse antes de darles un valor explicitamente, si (como en tu caso) sucede eso a partir de ese momento cualquier cosa puede pasar ("undefined behaviour" o comportamiento no definido) y ya no hay garantias de ningun tipo sobre el programa.

El fragmento comentado:
Código:
#include<stdio.h>

int *funcion(void)
{
  int *variable; /* sin inicializacion */
 
  /*
  ** como tampoco asignacion
  **
  ** debido a esto el valor en "variable" es
  ** "cualquier direccion de memoria" y esto
  ** no es valido
  */
 
  *variable = 2; /* ¿Que direccion de memoria estamos modificando? */
 
  return variable;
}

/* Mismo caso en esta funcion */
int main(void)
{
  int *variable;
  variable=funcion(void);
  printf("%d",*variable);
  return 0;
}


Pantalàimon_ escribió:
La única alternativa que sé es la siguiente:

Código:
#include<stdio.h>

void funcion(int *variable)
{
  *variable=2;
}

int main(void)
{
  int variable;
  funcion(&variable);
  printf("%d",variable);
  return 0;
}


¿Es a eso a lo que te referías?

Si, en este caso el puntero (o direccion de memoria) lo generas utilizando el operador "direccion de" (el '&').

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com