Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: cazagavilan en 6 Abril 2012, 17:50 PM

Título: Duda funcion incrementar
Publicado por: cazagavilan en 6 Abril 2012, 17:50 PM
Hola, tengo que hacer una funcion "bool incrementar(char numeri[10])" donde si la cadena tiene numeros devuelva true y si no false y si en el numero es menor a 999999999 lo incremente hasta 999999999.

Esto es lo que tengo de momento... he probado varias cosas pero no lo consigo... A ver si me podeis dar una pista.

Muchas gracias.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
bool incrementar (char numero[10]);
char numero[10];
int main()
{
cout << "Introduzca un numero de nueve digitos o menos: \n";
cin >> numero[10];
incrementar(numero);
cout << numero;
system("pause");

}

// Función incremetnar----------------------------------------------
bool incrementar ( char numero[10])
{
int aux = numero[10];
if(aux < 999999999)
{
for( ; aux < 999999999; aux++)
    {
cout << numero[aux];
}
return true;
}

else
{
cout << "El numero no es correcto";
return false;
}
}
Título: Re: Duda funcion incrementar
Publicado por: flony en 6 Abril 2012, 19:17 PM
digo en vez de usar char usar solo un int seria algo asi
( (numero >= 0) && (numero <= 999999999) )
seria con uso de boleano solo que el tipo de variable es distinto y en el rango determinado por ti y te devuelve true en caso de estar en ese rango.
después no entiendo bien para que el incremento que quieres hacer...pero el for serviría para ello
Título: Re: Duda funcion incrementar
Publicado por: cazagavilan en 6 Abril 2012, 19:49 PM
El problema es que tiene que ser char XD.

Pero muchas gracias igualmente.
Título: Re: Duda funcion incrementar
Publicado por: Sagrini en 6 Abril 2012, 23:33 PM
Tratas número como si fuese un int, cuando en realidad es un char * (o como decís en C++, "string" xD). Busca algo sobre la función atoi () e implementa una.
Título: Re: Duda funcion incrementar
Publicado por: cazagavilan en 7 Abril 2012, 07:33 AM
Hola de nuevo, ahora tengo otro problema... no me incrementa nada ni un numero y deberia incrementar hasta 999999999.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
bool incrementar (char numero[10]);
char numero[10];
int main()
{
   cout << "Introduzca un numero de nueve digitos o menos: \n";
   cin >> numero[10];
   incrementar(numero);
   cout << numero;
   system("pause");

}

// Función incremetnar----------------------------------------------
bool incrementar ( char numero[10])
{
   int aux;
   aux = atoi(numero);
   if(aux < 9)
   {
      for( ; aux < 9; aux++)
       {
         cout << numero[aux];
      }
      return true;
   }
   
   else
   {
      cout << "El numero no es correcto";
      return false;
   }
   return 0;
}


He probado con if(aux < 999999999) y luego for( ; aux < 999999999; aux++) pero se ve que accede a memoria que no deberia.

Una ayudita, gracias!!
Título: Re: Duda funcion incrementar
Publicado por: s00rk en 7 Abril 2012, 09:33 AM
Cita de: cazagavilan en  7 Abril 2012, 07:33 AM
Hola de nuevo, ahora tengo otro problema... no me incrementa nada ni un numero y deberia incrementar hasta 999999999.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
bool incrementar (char numero[10]);
char numero[10];
int main()
{
   cout << "Introduzca un numero de nueve digitos o menos: \n";
   cin >> numero[10];
   incrementar(numero);
   cout << numero;
   system("pause");

}

// Función incremetnar----------------------------------------------
bool incrementar ( char numero[10])
{
   int aux;
   aux = atoi(numero);
   if(aux < 9)
   {
      for( ; aux < 9; aux++)
       {
         cout << numero[aux];
      }
      return true;
   }
   
   else
   {
      cout << "El numero no es correcto";
      return false;
   }
   return 0;
}


He probado con if(aux < 999999999) y luego for( ; aux < 999999999; aux++) pero se ve que accede a memoria que no deberia.

Una ayudita, gracias!!

Exactamente, tu mismo lo estas diciendo estas accediendo a memoria que no deberia porque la variable "numero", tiene capacidad de hasta 10 caracteres, y luego utilizando esto: if(aux < 999999999) y luego for( ; aux < 999999999; aux++) , estaras intentando acceder a memoria que no existe.

Creo que podrias ponerlo mas sencillo asi:

Código (cpp) [Seleccionar]

int aux;
   aux = atoi(numero);
   if(aux < 999999999)
   {
        strcpy(numero, "999999999");
        cout << numero;
        return true;
   }


Aunque se podria decir que es trampa xD, pero pues si uno pone nose 9 o un numero bajo tardara demasiado :/

Otra cosa que veo es que cuando lees el numero lo ingresas directamente en una posicion de numero, deberia ser
cin >> numero;

Yo lo haria asi:
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;
char numero[10];

bool incrementar ( char numero[10])
{
cout << endl;
int aux;
aux = atoi(numero);
if(aux < 999999999)
{
                strcpy(numero, "999999999");
return true;
}else{
cout << "El numero no es correcto" << endl;
return false;
}
return 0;
}

int main()
{
cout << "Introduzca un numero de nueve digitos o menos: " << endl;
cin >> numero;
incrementar(numero);
cout << endl << "Resultado: " << numero << endl;
cin.get();cin.get();
return 0;
}


O si tiene que ser a fuerza el incremento pues asi:
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;
char numero[10];

bool incrementar ( char numero[10])
{
cout << endl;
int aux;
aux = atoi(numero);
if(aux < 999999999)
{
while(aux < 999999999)
{
aux++;
cout << aux << endl;
}
itoa(aux, numero, 10);
return true;
}else{
cout << "El numero no es correcto" << endl;
return false;
}
return 0;
}

int main()
{
cout << "Introduzca un numero de nueve digitos o menos: " << endl;
cin >> numero;
incrementar(numero);
cout << endl << "Resultado: " << numero << endl;
cin.get();cin.get();
return 0;
}
Título: Re: Duda funcion incrementar
Publicado por: cazagavilan en 7 Abril 2012, 09:51 AM
Voy a poner la descripcion del ejercicio a ver si la entendeis mejor que yo XD.

Hacer un programa que contenga una funcio con el prototipo bool incremetar (char numero[10]); La funcion debe incrementar el numero pasado como parametro en una cadena de caracteres de nueve digitos. Si la cadena no contiene numero debe devolver false, en caso cotrario true, y la cadena debe contener el numero incrementado. Si el numero es 999999999 debe devolver 0. Cadenas con menos de nueve digitos pueden contener numeros iniciales o no, por ejemplo, la funcion debe ser capaz de incrementar tanto 1234 como 000001234. La funcion main llamara a la funcion incrementar con varias cadenas.

Muchas gracias.
Título: Re: Duda funcion incrementar
Publicado por: s00rk en 7 Abril 2012, 12:04 PM
A como entendi seria asi:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;
char numero[10];

bool incrementar ( char numero[10])
{
cout << endl;
int aux, var;
char aux2[10];
strcpy(aux2, numero);

for(int x = 0; x < 10; x++)
if((numero[x] < 48 || numero[x] > 57) && numero[x] != 0)
return false;

aux = atoi(numero);
if(aux == 999999999)
strcpy(numero, "0");
else{
aux++;
itoa(aux, aux2, 10);
var = 9-strlen(aux2);
for(int x = 0; x < 9; x++)
{
if(x < var)
numero[x] = '0';
else
numero[x] = aux2[x-var];
}
}

return true;
}

int main()
{
cout << "Introduzca un numero de nueve digitos o menos: " << endl;
cin >> numero;
if(incrementar(numero))
                cout << endl << "Resultado: " << numero << endl;
        else
                cout << "Error, no son numeros";
cin.get();cin.get();
return 0;
}
Título: Re: Duda funcion incrementar
Publicado por: cazagavilan en 7 Abril 2012, 12:10 PM
Muchas gracias.
Título: Re: Duda funcion incrementar
Publicado por: david_BS en 7 Abril 2012, 19:34 PM
otra forma, también comprueba que sea una cadena terminada en 0

bool incrementar(const char *pv)
{
if(pv[9]!=0)return false;
for(unsigned int i=0; (pv[i]>='0'&&pv[i]<='9');i++);
if(i<9)return false;
char *d;
long n = strtol(pv,&d,10);
while(n<999999999)n++;
char *x;
x=ltoa(n,d,10);
printf("%s\n",x);
return true;
}


int main()
{
char n[]={ '1','2','3','4','5','6','7','8','9',0 };
incrementar(n);
       cin.get();
return 0;
}