Antes que nada editar mi último código al que faltaba una línea:
Código C++:
Ver original#include <iostream>
#include <cctype> /// para usar la funcion "isdigit"
#include <cstring> /// para usar la funcion "strcmp", "strcat", "strlen"
#include <cstdlib> /// para usar la funcion "itoa"
#include <cstdio> /// para usar la funcion "sprintf"
#define N 10
using namespace std;
bool incrementar( char numero[N] );
int main(){
char lista[N] = {0}, num [N] = {0};
for( int i = 0; i < N - 1; i++ ){
cout << "Ingrese parametro " << i + 1 << " de string: ";
cin >> lista[i];
}
cout << endl << "Cadena inicial: " << lista << endl;
if ( !incrementar( lista) )
cout << "Lo siento la cadena no puede ser tratada." << endl;
else
cout << "Cadena incrementada: " << lista << endl;
return 0;
}
bool incrementar(char numero[N]){
char nueves [N] = {0}, num [N] = {0};
int i;
for( i = 0; i < N - 1; i++ )
nueves [i] = '9';
for( i = 0; i < N - 1; i++ )
return false;
if ( strcmp ( numero
, nueves
) == 0 ){ return true;
}
for ( i
= 0; i
< N
- 1 - strlen( num
); i
++ ) numero[i] = '0';
numero[i] = '\0';
return true;
}
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#include <iostream>
#define N 5
using namespace std;
bool incrementar( char numero[N] );
int main(){
char lista[N] = {0};
for( int i = 0; i < N - 1; i++ ){
cout << "Ingrese parametro " << i + 1 << " de string: ";
cin >> lista[i];
}
cout << endl << "Cadena inicial: " << lista << endl;
if ( !incrementar( lista) )
cout << "Lo siento la cadena no puede ser tratada." << endl;
else
cout << "Cadena incrementada: " << lista << endl;
return 0;
}
bool incrementar(char numero[N]){
int i, lon = 0, cont = 0, factor = 10, num = 0, num_ = 0;
for( i=0; i < N - 1; i++ )
if ( numero[i] < '0' || numero[i] > '9' )
return false;
for( i=0; i < N - 1; i++ )
if ( numero [i] == '9' )
cont++;
if ( cont == N - 1 ){
numero[0] = '0', numero[1] = '\0';
return true;
}
for( i=0; i < N - 1; i++ )
num = num * factor + numero[i] - '0';
num_ = ++num;
for( lon = 0,factor = 1; num_; lon++, num_ /= 10,factor *= 10);
for ( i = 0; i < N - 1 - lon; i++ )
numero[i] = '0';
for ( i=N-1-lon, factor/= 10; i<N-1; i++, num -=(num/factor)*factor, factor/=10 )
numero[i] = num/factor + '0';
numero[i] = '\0';
return true;
}
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/****************** Codigo comentado ************************/
bool incrementar(char numero[N]){
int i, lon = 0, cont = 0, factor = 10, num = 0, num_ = 0;
/// En este primer for compruebo si todos los caracteres de la cadena "numero" son '0' al '9'
for( i=0; i < N - 1; i++ )
if ( numero[i] < '0' || numero[i] > '9' )
/// Si alguno no lo es devuelvo "false"
return false;
/// Si entro aqui es que todos los caracteres son del tipo '0' al '9'
/// Y lo que hago es contar con la variable "cont" los 9 que hay
for( i=0; i < N - 1; i++ )
if ( numero [i] == '9' )
cont++;
/// Si tengo N-1=9 tengo que devolver "0"
if ( cont == N - 1 ){
/// Y lo hago haciendo que el primer caracter de la cadena,numero[0], sea '0'
///y el segundo y ultimo es el caracter nulo que cierra las cadenas:numero[1] = '\0'
numero[0] = '0', numero[1] = '\0';
/// Y retorno true teniendo en cuenta que numero será esta vez "0"
return true;
}
/// Si llego aqui es que NO todos los caracteres eran nueve
/// Con lo que lo primero que necesito es el equivalente en
/// tipo int del numero que representa la cadena "numero"
/// Eso se hace multiplicando sucesivamente por 10 cada caracter,
/// pasado a int, y se pasa de char a int sumando '0', o su equivalentte ASCII 48
/// Aqui te aconsejo que mires la tabla de codigos ASCII, busca en google...
/// por ejempño si numero[i]='2' el entero 2 equivalente seria: 2 = numero[i] - '0'
/// Y lo de "num = num * factor + numero[i] - '0'" funciona asi:
/// Imagina que numero[5]="1234", es decir
/// numero[0] = '1' | numero[1] = '2' | numero[2] = '3' | numero[3] = '4'
/// y actua el for:actua el for:
///
/// num = 0 * 10 + (numero[0] - '0') = 0*10+1 = 1
/// num = 1 * 10 + (numero[1] - '0') = 1*10+2 = 12
/// num = 12 * 10 + (numero[2] - '0') = 12*10+3 = 123
/// num = 123 * 10 + (numero[3] - '0') = 123*10+4 = 1234
/// Tachin, Tachan, ya tenemos num = 1234 pero ahora como un int
for( i=0; i < N - 1; i++ )
num = num * factor + numero[i] - '0';
/// Ahora lo incremento y copio para no perderlo en las siguientes operaciones
num_ = ++num;
/// Ahora viene un for "especial", si te fijas acaba en punto y coma, no tiene cuerpo
/// Ello es porque solo voy a iterar para conseguir dos cosas:
/// 1. El tamaño de la variable entera num, que no tiene porque coincidir con la de "numero"
/// 2. La variable "factor" que sera de 10000, si N=5 para el caso de "1235"
/// Y no, no me he equivocado, recuerda que ya hemos incrementado el "1234"
for( lon = 0,factor = 1; num_; lon++, num_ /= 10,factor *= 10);
/// Copio al comienzo de la "numero" los ceros que corresponden a la diferencia entre el
/// tamaño de "numero" = N-1 y el de "num" = lon
for ( i = 0; i < N - 1 - lon; i++ )
numero[i] = '0';
/// Y continuo rellenado la cadena "numero" pero esta vez con los digitos de "num"
///Es decir, viene justo lo contrario a lo de antes: pasar "num" a "numero"
/// Y si antes para pasar del char numero[i] a entero restaba '0', ahora sumare '0'
/// Y el proceso del for seria este:
/// Ocurre una cosa muy importante: (1235/1000)*1000 no es 1235
/// porque la division (1235/1000) es entre enteros y da 1 con lo que queda:
/// 1.1 numero[0] = 1235/1000 + '0' = 1 + '0' = '1'
/// 1.2 NEW num -=(num/factor)*factor,factor/=10
/// o num = num -(num/factor)*factor
/// ==> num = 1235-(1235/1000) * 1000 = 1235-1*1000 = 235
/// 2.1 numero[1] = 235/100 + '0' = '2'
/// 2.2 num = 235-(235/100)*100 = 235-2*100 = 235-200 = 35
/// 3.1 numero[2] = 35/10 + '0' = '3'
/// 3.2 num = 35-(35/10)*10 = 35-3*10 = 35-30 = 5
/// 4.1 numero[3] = 5/1 + '0' = '5'
/// 4.2 num = 5-(5/10)*1 = 5-5*1 = 0
for ( i=N-1-lon, factor/= 10; i < N-1; i++, num -=(num/factor)*factor, factor/=10 )
numero[i] = num/factor + '0';
/// Y se acabo el for con el resultado de:
///numero[0] = '1' | numero[1] = '2' | numero[2] = '3' | numero[3] = '5'
///Es decir con la cadena: numero[]="1235"
/// Y ahora añadimos el caracter de fin de cadena
numero[i] = '\0';
/// Oberva que he puesto numero[i] = '\0' esto es porque
///la i se ha incrementado en la última pasada del for
/// y su valor es ahora justito N-1, que lo podia haber puesto
/// en lugar de la i, pero queda más geek.
/// Y ya solo no queda indicar el retorno, true, claro
return true;
}/****************** Codigo comentado ************************/
Espero te sea útil y si te queda alguna duda del ejercicio a dar la lata que para eso estamos aquí.
¡¡¡Saluditos!!!