Duda funcion incrementar

Iniciado por cazagavilan, 6 Abril 2012, 17:50 PM

0 Miembros y 2 Visitantes están viendo este tema.

cazagavilan

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

flony

#1
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
si un problema no tiene solucion entonces no es un problema...es algo inevitable

cazagavilan

El problema es que tiene que ser char XD.

Pero muchas gracias igualmente.

Sagrini

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.

cazagavilan

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!!

s00rk

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

cazagavilan

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.

s00rk

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

cazagavilan


david_BS

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