Ver Mensaje Individual
  #31 (permalink)  
Antiguo 19/06/2014, 06:17
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Atascado con ejercicio.

Cita:
Yo también lo interpreto así. Si paso la cadena "123", la función ha de transformarla en "000000124". (que no devolver, que la función lo único que devuelve es un bool)
Tanto dehm como Italico76 han hecho la misma interpretación y ya puestos, ¿por qué no?.

En ese caso y para obtener una salida siempre con "nueve" caracteres, ojo que ese esel tamaño de la cadena ya que el décimo es para el caracter nulo, algo como:

Cita:

Ingrese parametro 1 de string: 0
Ingrese parametro 2 de string: 0
Ingrese parametro 3 de string: 0
Ingrese parametro 4 de string: 0
Ingrese parametro 5 de string: 1
Ingrese parametro 6 de string: 2
Ingrese parametro 7 de string: 3
Ingrese parametro 8 de string: 4
Ingrese parametro 9 de string: 9

Cadena inicial: 000012349
Cadena incrementada: 000012350

Process returned 0 (0x0) execution time
Press any key to continue.
Propongo una ligera modificación al código anteriormente expuesto:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cctype>  /// para usar la funcion "isdigit"
  3. #include <cstring> /// para usar la funcion "strcmp" y "strcat"
  4. #include <cstdlib> /// para usar la funcion "itoa"
  5. #include <cstdio>  /// para usar la funcion "sprintf"
  6. #define N 5
  7.  
  8. using namespace std;
  9.  
  10. bool incrementar( char numero[N] );
  11.  
  12. int main(){
  13.     char lista[N] = {0}, num [N] = {0};
  14.   for( int i = 0; i < N - 1; i++ ){
  15.     cout << "Ingrese parametro " << i + 1 << " de string: ";
  16.     cin >> lista[i];
  17.   }
  18.     cout  << endl << "Cadena inicial: " << lista << endl;
  19.     if ( !incrementar( lista) )
  20.     cout << "Lo siento la cadena no puede ser tratada." << endl;
  21.     else
  22.     cout << "Cadena incrementada: " << lista << endl;
  23.     return 0;
  24. }
  25.  
  26. bool incrementar(char numero[N]){
  27.   char nueves [N] = {0}, num [N] = {0};
  28.   int i;
  29.   for( i=0; i < N - 1; i++ )
  30.     nueves [i] = '9';
  31.   for( i=0; i < N - 1; i++ )
  32.     if ( !isdigit(numero[i]) )
  33.       return false;
  34.     if ( strcmp ( numero, nueves ) == 0 )
  35.       sprintf( numero, "%d", 0 );
  36.     else
  37.       sprintf( num, "%d", atoi ( numero ) + 1 );
  38.     for  ( i = 0; i < N - 1 - strlen( num ); i++ )
  39.       numero[i] = '0';
  40.     numero[i] = '\0';
  41.     strcat ( numero, num );
  42.     return true;}

Y aprovecho para volver a poner el código comentado, ya que en el anterior mensaje me falto una línea:

Código C++:
Ver original
  1. bool incrementar(char numero[N]){
  2.   char nueves [N] = {0};
  3.   for( int i=0; i < N - 1; i++ )
  4.  
  5.     nueves [i] = '9';
  6.   for( int i=0; i < N - 1; i++ )
  7. ///compruebo si los caracteres son todos tipo int
  8.     ///if ( numero[i] < '0' || numero[i] > '9' )...o bien lo que sigue
  9.     if ( !isdigit(numero[i]) )
  10.       return false;
  11. ///si llega hasta aqui es true y comparo mediante la funcion "strcmp" con la cadena de nueves
  12.     if ( strcmp( numero, nueves ) == 0 )
  13. ///y si coincide copio "0" en la cadena con la funcion "sprintf"
  14.       sprintf( numero, "%d", 0 );
  15. ///si no, ahora viene el incremento del numero
  16. ///"atoi" es una funcion que obtiene un int de una cadena
  17. ///y "sprintf" como dije permite pasar a cadena un int.... y mucho mas!!!
  18.       else
  19.         sprintf( numero, "%d", atoi ( numero ) + 1 );
  20. ///ahora relleno con ceros las primeras posiciones    
  21.     for  ( i = 0; i < N - 1 - strlen( num ); i++ )
  22.       numero[i] = '0';
  23.      numero[i] = '\0';
  24. /// Y a esos ceros les añado el numero
  25.     strcat ( numero, num );
  26.   return true;
  27. }

¡¡¡Saluditos!!!