Para comprobar si los caracteres están en minúsculas hay una forma mejor que ir recorriendo el string:
*Haces una copia del string
*Conviertes la copia a minúsculas
*Si ambos strings son iguales... pues eso
Vale que string no dispone de ningún método para hacer la conversión a minúsculas de forma directa, pero puedes valerte de la stl:
Código C++:
Ver original#include <algorithm>
std::string copia = cadena;
std
::transform(copia.
begin(), copia.
end(), copia.
begin(), ::tolower);
if ( copia == cadena )
...
Por otro lado, el procedimiento para detectar las coincidencias podría ser algo más o menos así:
Código C++:
Ver original// Creamos un array para los resultados, así podemos ir marcando los aciertos
std::vector< bool> resultado( cadena.length( ), false );
int aciertos = 0;
int aproximaciones = 0;
// Primero buscamos los aciertos
for ( size_t i = 0; i < cadena.length( ); ++i )
{
if ( cadena[ i ] == referencia[ i ] )
{
// Marcamos el acierto, esto nos permite evitar estos valores al contar las aproximaciones
resultado[ i ] = true;
aciertos++;
}
}
// Después buscamos las aproximaciones
for ( size_t i = 0; i < cadena.length( ); ++i )
{
if ( !resultado[ i ] )
{
size_t aprox = 0;
while( true )
{
// Buscamos la siguiente referencia
aprox = std::find( referencia, aprox );
// Comprobamos si no se encuentran más referencias
if ( aprox == string::npos )
break;
// Si la referencia no ha sido utilizada, la marcamos
if ( resultado[ aprox ] == 0 )
{
aproximaciones++;
// eliminamos la aproximación de la referencia
referencia[ aprox ] = '_'; // Cualquier caracter que no pertenezca a la secuencia vale.
break;
}
}
}
}
// Componemos el string
return to_string( aciertos ) + "A, " + to_string( aproximaciones );
No lo he compilado, pero creo que debería funcionar.