Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Atascado con ejercicio.

Estas en el tema de Atascado con ejercicio. en el foro de C/C++ en Foros del Web. 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 ...

  #31 (permalink)  
Antiguo 19/06/2014, 06:17
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 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!!!

  #32 (permalink)  
Antiguo 19/06/2014, 06:24
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 1 mes
Puntos: 22
Respuesta: Atascado con ejercicio.

El siguiente ejemplo es para mostrar otra forma de resolverlo simplemente utilizando la función estándar strtol (un post acerca de esta función aquí).

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. typedef char Number[10];
  7.  
  8. bool increase(Number number){
  9.     char *endptr;
  10.     int n = strtol(number, &endptr, 10);
  11.     if(*endptr != '\0')return false;
  12.     n = (n == 999999999)? 0 : ++n;
  13.     sprintf(number, "%d", n);
  14.     return true;
  15. }
  16.  
  17. int main(){
  18.     Number testList[] = {"111", "-232", "2543GH49", "999999999",
  19.     "000002431", "015", "text", "123456789", "++49", "+100", ""};
  20.  
  21.     Number *number = testList;
  22.     while(**number != 0){
  23.         cout << "increase(\"" << *number << "\") = ";
  24.         cout << boolalpha << increase(*number);
  25.         cout << ", " << "\"" << *number << "\"" << endl;
  26.         number++;
  27.     }
  28.  
  29.     return 0;
  30. }

Para centrarse en el dominio de C y C++ es necesario el manejo de sus librerías, tanto para estudio como para resolver los problemas.

Saludos.
  #33 (permalink)  
Antiguo 19/06/2014, 07:01
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Atascado con ejercicio.

En la linea 12 del codigo anterior sugiero cambiar

n = ... : ++n;

Por

n = ... : n + 1;

El operador de preincremento junto a la misma variable tiene comportamiento indefinido.
Un compilador podria generar un warning ahi y en el peor de los casos funcionar erradamente.
__________________
Visita mi perfil en LinkedIn
  #34 (permalink)  
Antiguo 19/06/2014, 07:32
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

Cita:
Pero es que el ejercicio no consiste en sumar un número, sino en modificar un array de chars para simular precisamente esa suma o incremento
Claro que si de que estamos hablando sino.
999

num[0]=9
num[1]=9
num[2]=9

si sumo uno al num[2] y este es 9 le pongo a cero y le sumo uno a num[1]. Y si se repite hago lo mismo con ese. XD

No hice nada pero esta claro de que va el tema.
  #35 (permalink)  
Antiguo 19/06/2014, 08:00
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por vangodp Ver Mensaje
Claro que si de que estamos hablando sino.
999

num[0]=9
num[1]=9
num[2]=9

si sumo uno al num[2] y este es 9 le pongo a cero y le sumo uno a num[1]. Y si se repite hago lo mismo con ese. XD

No hice nada pero esta claro de que va el tema.
No, vangodp.
Estamos hablando de esto
num[0]='9';
num[1]='9';
num[2]='9';

ó

num[0]=57;
num[1]=57;
num[2]=57;

Recuerda que el array es de char
  #36 (permalink)  
Antiguo 19/06/2014, 08:06
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

y que mas da si es char o num? :S
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void foo( int num[],int fin ){
  5.     num[fin] = num[fin]+1;
  6.     for (int i = fin; i >= 0; i-- ){
  7.         if( num[i] == 10  ){
  8.             num[i] = 0;
  9.             //sumamos el uno a la anterior casilla
  10.             num[i-1] = num[i-1] + 1;
  11.         }        
  12.     }
  13. }
  14.  
  15. int main (){
  16.     int num[]={9,9,9,7}; // poner aqui cualquier cantidad soportada por un entero y tachaaa
  17.     int fin = sizeof(num)/sizeof(int)-1;
  18.    
  19.     foo(num, fin);
  20.    
  21.     for( int i = 0; i<=fin;i++ ){
  22.         cout << num[i];
  23.     }
  24.  
  25.     cin.ignore();
  26.     return 0;
  27. }
Al final no es para imprimir?
  #37 (permalink)  
Antiguo 19/06/2014, 08:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hombre, pues para ceñirse al ejercicio.
El ejercicio no te pide que modifiques una cadena cualquiera.
Te pide que te ciñas a éste prototipo:
Código C++:
Ver original
  1. bool Incrementa(char cadena[10]);
  #38 (permalink)  
Antiguo 19/06/2014, 08:14
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

que retorne 0 en caso de ser 9999999?XD
Creo que no es muy difícil eso no? XD
Unos cuantos cambios y listo XD
Se me ocurren unas cuantas ideas...
mirar casilla por casilla y si todas son 9 retornar el dichoso false XD
O creo que mejor seria sumar todas las casa y si el resultado es 0 es por que era 99999999... XD

Última edición por vangodp; 19/06/2014 a las 08:22
  #39 (permalink)  
Antiguo 19/06/2014, 08:27
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

vangodp:

No es un "ejercicio para imprimir".
Es un ejercicio para aprender a pasar un array como parámetro.
Es un ejercicio para aprender a recorrer arrays.
Es un ejercicio para aprender a negociar con el valor de retorno de la función, manipulando o no el objeto pasado como parámetro.
Es un ejercicio para aprender a usar operadores lógicos AND y OR y cómo usarlos para incluir o excluir intervalos de valores.
Es un ejercicio para usar condicionales if-else en función de cómo afrontar la manipulación del array.

En fin, que es un ejercicio para aprender. El partido se le saca en el "durante", no en el resultado final. Eso es lo de menos (bueno, exceptuando la satisfacción de resolverlo).
Entonces puedes usar el ejercicio para sacarle mucho partido y aprender por el camino, o limitarte a buscar una forma cualquiera que "cumpla" y ya está
Además, estas cosas que a nosotros nos pueden parecer muy básicas, para otras personas pueden ser todavía un mundo. Tenemos que recordar las fechas no tan lejanas en las que no sabíamos plantear una condición hasta después de chorrocientos intentos.
Un poquito de empatía!

(y disculpa por el tostón, pero es que pienso que el autor del hilo no quiere que le resuelvan nada, sino que le enseñen. Si tarda 3 semanas en resolverlo y entre medias ha afianzado los conceptos que se pretenden con el ejercicio, no ha perdido tiempo, en mi opnión)
  #40 (permalink)  
Antiguo 19/06/2014, 09:09
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

¡Si! La verdad es que estas "tostando" mucho como dices.
El dueño del post ya dio por concluido lo que tenia duda, todo lo demás son añadidos.
No se la verdad por que estas tan molesto, aquí han colgado unos tropecientos sorces y solo me lo estas diciendo a mi. ¿Que problema tienes?
Yo estudio igual que todos aqui y si pregunto algo y me dan un source completo no se por que me iba molestar.
¿Es que se aprende menos de un código completo? Desde luego no es para mi trabajo por que estoy en paro y no vivo de esto.
Si pones aquí un source y el dueño va y se lo copia no se por que te duele a ti si quien se va quedar sin aprender es el.
Y sin mencionar los libros de enseñanza que vienen todos completos y no por la mitad para que aprendas mas "rápido". :S
Me estas dando varias lecciones de moral y lo único que quiero es compartir una idea.
No se por que te comportas así pero bueno O.o
Yo por ejemplo paso el dia navegando por internet y absorviendo de todo. As veces me salgo incluso del tema por que ya sabes que una cosa te lleva a otra y cuando me doy cuenta estoy haciendo bases de dados o lo que sea y es un tema que a mi me interesa casi poco.
En la vida no existe moldes ni nadie te lo va a dar todo de la forma que te gusta. ¿Ya has pensado que asco de mundo viviríamos si todo tuviera "moldes"?
En serio compañero no se que he dicho dicho para que te pongas así, pero si algo hice mal pues perdoname que así soy yo y no lo hago por mal. o_O
Simplemente he visto algo interesante y me gusto, como veo que hay mucha gente mas interesada pues solo eso, ni iba comentar hasta que has dicho que yo no tenia entendido que era para poner en tablas esos números pero bueno. Ya no digo nada mas.
Saludo no lo tomes a mal. Me has dicho lo que querías y si sueltas algo también hay que escuchar¿Verdad?
  #41 (permalink)  
Antiguo 19/06/2014, 09:51
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Ok. sin problemas.
El autor del post ya lo ha solucionado, y todo lo demás es hablar por hablar.
Saludos y disculpa si te he ofendido.
  #42 (permalink)  
Antiguo 19/06/2014, 09:55
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

No me has ofendido solo veo que estas alterado con algo y no se bien lo que es simplemente ten presente que estamos aquí todos a lo mismo(aprender).
Si no para que vamos a andar aquí contestando cosas gratis ¯\_(ツ)_/¯.
Saludos no te piques que la vida ya es áspera por si sola para que nos agobiemos, intenta pasarlo bien. ;)
  #43 (permalink)  
Antiguo 19/06/2014, 10:04
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Atascado con ejercicio.

Hola ,si lo he dado por solucionado para que nadie se enfrente y vangodp ,dehm tiene razón ,tengo q pasar por todos los temas del curso que estoy haciendo para aprender.Y tu tienes razón también ,pienso que lo normal seria hacerlo a la maneras que as dicho tu por que es mas fácil y la lógica, nada de tantas complicaciones. Un saludo a todo , a seguir aprendiendo que aun me queda un montón y espero de verdad que todo los problemas que tenga me ayudéis tanto como en este .Un saludo a todos
  #44 (permalink)  
Antiguo 19/06/2014, 10:29
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

Cita:
tengo q pasar por todos los temas del curso que estoy haciendo para aprender
Me parece muy bien pero no tenemos ni idea al curso que refieres.
Pero iniciar un tema no es que seas el dueño de el, como puedes ver seguimos aquí comentando.
Mas gente ha preguntado cosas como Italico76, eso se puede extender mucho si seguimos así.
Lo normal es que cuando tienes dudas 1º busques por Internet y como ultimo recurso pues te pasas por un foro.
Puedes mirar en mi perfil, apenas he preguntado nada. Ni aquí ni en otro lado.
Creo que en unas 10 o poco mas ocasiones he preguntado cosas.
¿Que quiere decir eso? Pues nada que aprendo junto con vosotros aquí con vuestras preguntas.
Soy de estar leyendo mucho y investigando por internet. Y solo si no encuentro nada pues me paso por aquí a preguntar.
No soy tan antiguo programador como poden creer vosotros llevo lo que de 2013 y 2014.
Y confieso que podía haber aprendido mucho mas por que soy algo vaguillo, pero voy avanzando sin prisa pero sin pausa que es lo importante ;)
Mis ganas de aprender a programar aparecieron allá por 2007 o por ahí, pero no fue hasta que me quede en paro que me decidí poner la mano en la masa.
Estuve mucho tiempo recopilando info hasta que en el principio del año pasado empece a pillar con fuerza en C++.
Os ayudo aquí por que tal vez algún día me tenga algunas dudas y entonces espero que me puedan ayudar ;)
Razón las tenemos todos, lo que no hay que perder es la cabeza. Y nunca te olvides que lo que dije antes. Estamos aquí para aprender incluyendo yo.
Preguntar no es un crimen pero cuando preguntas algo no creas que siempre te va venir la respuesta ideal as veces alguien pega un código aquí completo por que ve que no estas haciendo algún deber del colo o algo así.
Si alguien me pide que le haga algo estoy en mi derecho de decidir como le aplico mi ayuda, desde que no viole ninguna norma, pero eso puede pasar de manera accidental también por que soy humano y me equivoco todo el tempo.
No creo en eso de que no existe mal estudiante sino mal maestro. No tengo maestro y voy avanzando solo igual que muchos de los que están aquí.
Algunos seguro vienen solo a que les hagan el deber pero si lo calo no va recibir ni pizca de ayuda por mi parte.
Iros a yahoo y miren como pegan las preguntas de sus libros tal cual y simplemente esperan a que les resuelvan el problema jajaj.
Bueno suerte.
  #45 (permalink)  
Antiguo 19/06/2014, 10:56
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Atascado con ejercicio.

El curso es de la web c con clase ,y es verdad no soy dueño de nada ,tienes razón en lo que dices que tu ayudas a tu manera ,y es verdad que si pido ayuda pueda recibirla de mil maneras .Pero como soy el que a iniciado el hilo me siento culpable de las rencillas o mal entendido que puedan haber ,por eso ese pensamiento de posesión pero se que no es mio.Yo hago lo mismo que tu busco en internet e intento apañarmelas solo ,pero gusta también tener gente que te ayude perq es verdad que se puede aprende solo ,pero mejor acompañado de buena gente . Un saludo vangodp y siguamos aprendiendo lo que nos gusta .
  #46 (permalink)  
Antiguo 19/06/2014, 11:42
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

Perfecto ;)
Dale al libro y por cierto te dejo esta pagina que me servio mucho a mi también.
Si no la conoces ya :D http://www.zator.com/Cpp/E_Ce.htm
otra muy buena es minidosis v1 y v2, son vídeos.
Si necesitas algunas mas ;)
  #47 (permalink)  
Antiguo 19/06/2014, 23:36
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Atascado con ejercicio.

Gracias,le echare un vistazo.saludos
  #48 (permalink)  
Antiguo 20/06/2014, 06:53
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Atascado con ejercicio.

Antes que nada editar mi último código al que faltaba una línea:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cctype>  /// para usar la funcion "isdigit"
  3. #include <cstring> /// para usar la funcion "strcmp", "strcat", "strlen"
  4. #include <cstdlib> /// para usar la funcion "itoa"
  5. #include <cstdio>  /// para usar la funcion "sprintf"
  6. #define N 10
  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.     return true;
  37.   }
  38.   sprintf( num, "%d", atoi ( numero ) + 1 );
  39.   for  ( i = 0; i < N - 1 - strlen( num ); i++ )
  40.     numero[i] = '0';
  41.   numero[i] = '\0';
  42.   strcat ( numero, num );
  43.   return true;
  44. }

Como comenta dehm es un ejercicio para aprender con lo que con este y el de fightmx tienes para ir viendo el uso de algunas de las funciones de C++.

¿Quién dijo funciones?. Porque si, como comenta dehm es un ejercicio para aprender arrays y manejar el uso de los for e if podemos prescindir "totalmente" de dichas funciones. El código que resulta es un pelín más complejo que con funciones pero en él tienes el control total de lo que hace el código. Como yo soy más de C estoy acostumbrado a no tener la cantidad de funciones que tiene el C++, pero eso no es más que un reto ya que las tengo que implementar yo. Observa la ausencia de las librerías y funciones del código anterior:

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

Y claro, así a pelo puede resultarte chino, pero como tan acertadamente plantea vangodp, cuya opinión comparto, para eso estamos aquí, para ayudarnos no sólo a colgar códigos sino a explicarlos cuando es necesario, y creo que en este caso lo es.

Así que ahí va el código comentado:

Código C++:
Ver original
  1. /******************   Codigo comentado   ************************/
  2.  
  3. bool incrementar(char numero[N]){
  4.   int i, lon = 0, cont = 0, factor = 10, num = 0, num_ = 0;
  5.  
  6. /// En este primer for compruebo si todos los caracteres de la cadena "numero" son '0' al '9'
  7.  
  8.   for( i=0; i < N - 1; i++ )
  9.     if ( numero[i] < '0' || numero[i] > '9' )
  10.  
  11. /// Si alguno no lo es devuelvo "false"
  12.  
  13.       return false;
  14.  
  15. /// Si entro aqui es que todos los caracteres son del tipo '0'  al '9'
  16. /// Y lo que hago es contar con la variable "cont" los 9 que hay
  17.  
  18.   for( i=0; i < N - 1; i++ )
  19.     if ( numero [i] == '9' )
  20.       cont++;
  21.  
  22. /// Si tengo N-1=9 tengo que devolver "0"
  23.  
  24.   if ( cont == N - 1 ){
  25.  
  26. /// Y lo hago haciendo que el primer caracter de la cadena,numero[0], sea '0'
  27. ///y el segundo y ultimo es el caracter nulo que cierra las cadenas:numero[1] = '\0'
  28.  
  29.     numero[0] = '0', numero[1] = '\0';
  30.  
  31. /// Y retorno true teniendo en cuenta que numero será esta vez "0"
  32.  
  33.     return true;
  34.   }
  35.  
  36. /// Si llego aqui es que NO todos los caracteres eran nueve
  37. /// Con lo que lo primero que necesito es el equivalente en
  38. /// tipo int del numero que representa la cadena "numero"
  39. /// Eso se hace multiplicando sucesivamente por 10 cada caracter,
  40. /// pasado a int, y se pasa de char a int sumando '0', o su equivalentte ASCII 48
  41. /// Aqui te aconsejo que mires la tabla de codigos ASCII, busca en google...
  42. /// por ejempño si numero[i]='2' el entero 2 equivalente seria: 2 = numero[i] - '0'
  43.  
  44. /// Y lo de "num =  num * factor + numero[i] - '0'" funciona asi:
  45.  
  46. /// Imagina que numero[5]="1234", es decir
  47. /// numero[0] = '1' | numero[1] = '2' |  numero[2] = '3' | numero[3] = '4'
  48. /// y actua el for:actua el for:
  49. ///
  50. /// num =  0   * 10 + (numero[0] - '0') = 0*10+1 = 1
  51. /// num =  1   * 10 + (numero[1] - '0') = 1*10+2 = 12
  52. /// num =  12  * 10 + (numero[2] - '0') = 12*10+3 = 123
  53. /// num =  123 * 10 + (numero[3] - '0') = 123*10+4 = 1234
  54.  
  55. /// Tachin, Tachan, ya tenemos num = 1234 pero ahora como un int
  56.  
  57.   for( i=0; i < N - 1; i++ )
  58.     num =  num * factor + numero[i] - '0';
  59.  
  60. /// Ahora lo incremento y copio para no perderlo en las siguientes operaciones
  61.  
  62.   num_ = ++num;
  63.  
  64. /// Ahora viene un for "especial", si te fijas acaba en punto y coma, no tiene cuerpo
  65. /// Ello es porque solo voy a iterar para conseguir dos cosas:
  66. /// 1. El tamaño de la variable entera num, que no tiene porque coincidir con la de "numero"
  67. /// 2. La variable "factor" que sera de 10000, si N=5 para el caso de "1235"
  68. /// Y no, no me he equivocado, recuerda que ya hemos incrementado el "1234"
  69.  
  70.   for( lon = 0,factor = 1; num_; lon++, num_ /= 10,factor *= 10);
  71.  
  72. /// Copio al comienzo de la "numero" los ceros que corresponden a la diferencia entre el
  73. /// tamaño de "numero" = N-1  y el de "num" = lon
  74.  
  75.   for  ( i = 0; i < N - 1 - lon; i++ )
  76.      numero[i] = '0';
  77.  
  78. /// Y continuo rellenado la cadena "numero" pero esta vez con los digitos de "num"
  79. ///Es decir, viene justo lo contrario a lo de antes: pasar "num" a "numero"
  80. /// Y si antes para pasar del char numero[i] a entero restaba '0', ahora sumare '0'
  81. /// Y el proceso del for seria este:
  82.  
  83. /// Ocurre una cosa muy importante: (1235/1000)*1000 no es 1235
  84. /// porque la division (1235/1000) es entre enteros y da 1 con lo que queda:
  85.  
  86. /// 1.1  numero[0] = 1235/1000 + '0' = 1 + '0' = '1'
  87. /// 1.2 NEW num -=(num/factor)*factor,factor/=10
  88. ///      o  num  = num -(num/factor)*factor
  89. ///     ==> num = 1235-(1235/1000) * 1000 = 1235-1*1000 = 235
  90.  
  91. /// 2.1 numero[1] = 235/100 + '0' = '2'
  92. /// 2.2 num = 235-(235/100)*100 = 235-2*100 = 235-200 = 35
  93.  
  94. /// 3.1 numero[2] = 35/10 + '0' = '3'
  95. /// 3.2 num = 35-(35/10)*10 = 35-3*10 = 35-30 = 5
  96.  
  97. /// 4.1 numero[3] = 5/1 + '0' = '5'
  98. /// 4.2 num = 5-(5/10)*1 = 5-5*1 = 0
  99.  
  100.   for  ( i=N-1-lon, factor/= 10; i < N-1; i++, num -=(num/factor)*factor, factor/=10 )
  101.     numero[i] = num/factor + '0';
  102.  
  103. /// Y se acabo el for con el resultado de:
  104. ///numero[0] = '1' | numero[1] = '2' |  numero[2] = '3' | numero[3] = '5'
  105. ///Es decir con la cadena: numero[]="1235"
  106.  
  107. /// Y ahora añadimos el caracter de fin de cadena
  108.  
  109.   numero[i] = '\0';
  110.  
  111. /// Oberva que he puesto numero[i] = '\0' esto es porque
  112. ///la i se ha incrementado en la última pasada del for
  113. /// y su valor es ahora justito N-1, que lo podia haber puesto
  114. /// en lugar de la i, pero queda más geek.
  115.  
  116. /// Y ya solo no queda indicar el retorno, true, claro
  117.  
  118.   return true;
  119.  
  120. }/******************   Codigo comentado   ************************/


Espero te sea útil y si te queda alguna duda del ejercicio a dar la lata que para eso estamos aquí.

¡¡¡Saluditos!!!


Última edición por leosansan; 20/06/2014 a las 09:06
  #49 (permalink)  
Antiguo 21/06/2014, 13:56
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Atascado con ejercicio.

leosansan, Muchas gracias por la excelente explicación
Código C++:
Ver original
  1. for( i=0; i < N - 1; i++ )
  2.     if ( numero [i] == '9' )
  3.       cont++;
  4.  
  5.   if ( cont == N - 1 ){
  6.  
  7.     numero[0] = '0', numero[1] = '\0';
  8.  
  9.     return true;
Esta parte es la que me quedaba por aclarar y ya la e entendido.
Código C++:
Ver original
  1. for(int i= 0;i<10;i++){
  2.                 if(numero[i]=='9'){
  3.                     cont++;
  4.                 }          
  5.                 if(cont == 10-1){
  6.                     for(int i = 0;i<10;i++){
  7.                     numero[i]='0';
  8.                 }
  9.                     return true;
  10.                 }
Mi código es un poco diferente, convierte todos los 9 a 0. jejeje e intentado poner que la posición[1] de la cadena sea el nulo pero me da fallo, así que lo dejado así.
Y muchas gracias de verdad , ya pasare a dar la alta un poquito más ,aun me queda por aprender .

Etiquetas: atascado, int, numero, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:05.