Ayuda con programa de posición de letras

Iniciado por alejandro70, 27 Julio 2015, 05:12 AM

0 Miembros y 1 Visitante están viendo este tema.

alejandro70

Que tal chic@s del foro, pues tengo el codigo que se muestra mas abajo, lo que quiero es hacer un programa que me diga las posiciones del abecedario en que se encuentra  las letras de un texto introducido por ep usuario; aunque aun le faltan detalles al probarlo si abre, pero no me da lo que deberia, me da valores grandes y raros.
¿Alguien que me diga que esta mal?

Código (cpp) [Seleccionar]
#include <iostream>
#include <ctype.h>
#include <locale.h>

using namespace std;

int longitudmensaje, longitudOrden, i, j;
char alfabetoOr[28], mensaje[500];

int main(){

char alfabetoOr[28]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z',' '};
cout<<"Introduzca las letras de las que desea conocer su posiposición\n";
cin>>mensaje[500];

longitudmensaje=(sizeof(&mensaje));
int ordenLet[longitudmensaje];

for(i=0;i<(longitudmensaje);i++)
{
    mensaje[i]=toupper(mensaje[i]);                              
   }
 
    for (i=0;i<(longitudmensaje);i++)
    {
        for (j=0;j<28;j++)
        {
                                   if (mensaje[i]==alfabetoOr[j])
                                      {
if (mensaje[i]!='\0')
{
ordenLet[i]=j;
}
                                      }                                  
        }  
    }  

for(i=0;i<(longitudmensaje);i++){
cout<<ordenLet[i]<<"\n";
}

cin.get();
return 0;
}



Posdata:
Esta parte del codigo (if (mensaje!='\0') lo vi en youtube, decia que era necesario al comparar los elementos de un array

Mod: los códigos deben ir en etiquetas GeSHi

simorg

Hola, modifica tu post, para publicar codigo se den usar las etiquetas GeShi adecuadas al lenguaje empleado.

Leete las Reglas del Foro.


Saludos.

alejandro70

Ohh perdon, no lo sabia, ¿Puedo dejar el tema? O tengo que crear uno nuevo

v4char

#3
Hice esto en C espero que te funcione los caracteres que no reconoce los pone como 0

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int obtener_pos(char mensaje)
{
   switch (mensaje)
   {
   case 'a':
       return 1;
       break;
   case 'b':
       return 2;
       break;
   case 'c':
       return 3;
       break;
   case 'd':
       return 4;
       break;
   case 'e':
       return 5;
       break;
   case 'f':
       return 6;
       break;
   case 'g':
       return 7;
       break;
   case 'h':
       return 8;
       break;
   case 'i':
       return 9;
       break;
   case 'j':
       return 10;
       break;
   case 'k':
       return 11;
       break;
   case 'l':
       return 12;
       break;
   case 'm':
       return 13;
       break;
   case 'n':
       return 14;
       break;
   case 'o':
       return 15;
       break;
   case 'p':
       return 16;
       break;
   case 'q':
       return 17;
       break;
   case 'r':
       return 18;
       break;
   case 's':
       return 19;
       break;
   case 't':
       return 20;
       break;
   case 'u':
       return 21;
       break;
   case 'v':
       return 22;
       break;
   case 'w':
       return 23;
       break;
   case 'x':
       return 24;
       break;
   case 'y':
       return 25;
       break;
   case 'z':
       return 26;
       break;

   default:
       return 0;
       break;
   }

}

int main()
{
   char mensaje[501];

   printf("Introduce mensaje: ");
   fflush(stdout);
   gets(mensaje);

   sprintf( mensaje, "%s", tolower(mensaje) );

   int i;

   for(i=0;i<strlen(mensaje);i++)
   {
       printf("%i\n", obtener_pos(mensaje[i]));
   }

   return 0;
}

engel lex

#4
me parece que hacen mucho trabajo :P se puede hacer simple... aunque la "ñ" alarga el codigo de más

por cierto.. tu error está en que la "ñ" es una caracter ascii extendido  y en c++ ocupa 2 char (con valor negativo), así que estás tratando de llenar 1 char en el array con el valor de 2

sin la ñ se puede simplificar muchísimo más


Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <locale>
using namespace std;

int main(){

cout<<"Introduzca las letras de las que desea conocer su posición\n";
string mensaje;
cin>>mensaje;
locale loc;
int i;

for(i=0;i<mensaje.size();i++){

mensaje[i] = tolower(mensaje[i], loc);//a minusculas

   if(mensaje[i]>='a' && mensaje[i]<='z'){

    if(mensaje[i]>'n'){//para meter la ñ que no está en ascii standard
    mensaje[i]++;
    }

mensaje[i]-='a'-1;//para ubicarlo en el orden natural
cout<<(int)mensaje[i];//imprimimos casteando como int
cout<<endl;

   }

   if(mensaje[i]==-61){//aquí está la ñ de ascii extendido
    i++;//la ñ ocupa 2 char, así que avanzamos 1 de una vez
    if(mensaje[i]==-111 || mensaje[i]==-79){//aseguramos que es ñ
mensaje[i]='n'-'a'+1;//va siguiente a la n y arreglamos su orden natural
cout<<(int)mensaje[i];//imprimimos casteando como int
cout<<endl;
    }
   }
   
   
   }
 

cin.get();
return 0;
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

alejandro70

#5
Gracias gracias   ;D lo probaré por la noche en otros programas que tengo por ahi guardados ;).




Ya pobre el codigo y funcionó excelente, pero no reconoce la ñ y si pongo espacio y despues sigo escribiendo no me toma en cuenta eso, ¿alguna idea de como solucionarlo?
Y lo segundo, monte el código que me proporciono engel lex en un programa que no había terminado, un cifrado basado en rand y tomar posiciones aleatorias del alfabeto, mas o menos funciona pero no al 100 alguien me puede decir que pasa?

#include <iostream>
#include<cstdlib>
#include <ctype.h>
#include <locale.h>
#include<string.h>

using namespace std;

void desorden(int []);
void desordenarLet(int [], char []);


int main(){
setlocale(LC_CTYPE, "Spanish");

int random[28];
int i, numeroS, longitudmensaje;
char alfabetoDes[28];
    string mensaje;
    locale loc;

cout<<"Teclee su llave numerica: ";
cin>>numeroS;
srand(numeroS);
desorden(random);
desordenarLet(random, alfabetoDes);



cout<<"\nIntroduzca el mensaje a cifrar\n";
cin>>mensaje;
cin.get();

longitudmensaje=(mensaje.size());
int ordenLet[longitudmensaje];

for(i=0;i<mensaje.size();i++){

mensaje[i] = tolower(mensaje[i], loc);//a minusculas

    if(mensaje[i]>='a' && mensaje[i]<='z'){

    if(mensaje[i]>'n'){//para meter la ñ que no está en ascii standard
    mensaje[i]++;
    }

mensaje[i]-='a';
cout<<(int)mensaje[i];//para ubicarlo en el orden natural
            //cout<<(int)mensaje[i];//imprimimos casteando como int
//cout<<endl;

    }

    if(mensaje[i]==-61){//aquí está la ñ de ascii extendido
    i++;//la ñ ocupa 2 char, así que avanzamos 1 de una vez
    if(mensaje[i]==-111 || mensaje[i]==-79){//aseguramos que es ñ
mensaje[i]='n'-'a';//va siguiente a la n y arreglamos su orden natural
//cout<<(int)mensaje[i];//imprimimos casteando como int
//cout<<endl;
    }
    }


    } 

char mensajeCif[mensaje.size()];
   
    for(i=0;i<mensaje.size();i++){
        mensajeCif[i]=alfabetoDes[mensaje[i]];
    }
   
cout<<"\n";
for(i=0;i<=mensaje.size();i++){
cout<<mensajeCif[i];
}
   

cin.get();
return 0;
}

void desorden(int vector[28]){

int i, j, problema, n;

for(i=0;i<=27;i++){
n=rand() % 28;
problema=0;

for(j=0;j<=i;j++){

if(n==vector[j]){
problema=1;
break;
}
}

if(problema==1){
i--;
}else{
vector[i]=n;
}
}
}

void desordenarLet(int r[28], char a[28]){
a[28];
a[r[0]]='a';
a[r[1]]='b';
a[r[2]]='c';
a[r[3]]='d';
a[r[4]]='e';
a[r[5]]='f';
a[r[6]]='g';
a[r[7]]='h';
a[r[8]]='i';
a[r[9]]='j';
a[r[10]]='k';
a[r[11]]='l';
a[r[12]]='m';
a[r[13]]='n';
a[r[14]]='ñ';
a[r[15]]='o';
a[r[16]]='p';
a[r[17]]='q';
a[r[18]]='r';
a[r[19]]='s';
a[r[20]]='t';
a[r[21]]='u';
a[r[22]]='v';
a[r[23]]='w';
a[r[24]]='x';
a[r[25]]='y';
a[r[26]]='z';
a[r[27]]=' ';
}


Posdata: El valor que tiene que regresarme en la a es 0 ya que ese es su lugar en el array. Otra cosa que esta mal es que no me imprime la ñ (que ya me lo esperaba), ni la "t" y tampoco la "y".

v4char

Con esto funciona la ñ pero solo en Windows, por lo menos en el mio
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int obtener_pos(char mensaje)
{
   switch (mensaje)
   {
   case 'a':
       return 1;
       break;
   case 'b':
       return 2;
       break;
   case 'c':
       return 3;
       break;
   case 'd':
       return 4;
       break;
   case 'e':
       return 5;
       break;
   case 'f':
       return 6;
       break;
   case 'g':
       return 7;
       break;
   case 'h':
       return 8;
       break;
   case 'i':
       return 9;
       break;
   case 'j':
       return 10;
       break;
   case 'k':
       return 11;
       break;
   case 'l':
       return 12;
       break;
   case 'm':
       return 13;
       break;
   case 'n':
       return 14;
       break;
   case 'o':
       return 16;
       break;
   case 'p':
       return 17;
       break;
   case 'q':
       return 18;
       break;
   case 'r':
       return 19;
       break;
   case 's':
       return 20;
       break;
   case 't':
       return 21;
       break;
   case 'u':
       return 22;
       break;
   case 'v':
       return 23;
       break;
   case 'w':
       return 24;
       break;
   case 'x':
       return 25;
       break;
   case 'y':
       return 26;
       break;
   case 'z':
       return 27;
       break;
   default:
       if((int)mensaje==-92)
       {
           return 15;
           break;
       }
       return 0;

       break;

   }

}

int main()
{
   char mensaje[501];

   printf("Introduce mensaje: ");
   fflush(stdout);
   gets(mensaje);

   sprintf( mensaje, "%s", tolower(mensaje) );

   int i;

   for(i=0;i<strlen(mensaje);i++)
   {
       printf("%i\n", obtener_pos(mensaje[i]));
   }

   return 0;
}

do-while

¡Buenas!

Si tienes en cuenta que los caracteres no dejan de ser números enteros vas a ahorrar mucho código y todo te va a quedar más claro:


int posicion(char letra)
{
    letra = touper(letra);

    /* Las letras, tanto las mayúsculas como las minúsculas están ordenadas de la A a la Z en la tabla ASCII */
    if(letra >= 'A' && letra <= 'Z')
    {
        if(letra <= 'N')
            return letra - 'A';
        else
            return letra - 'A' + 1;
    }
    /* si mal no recuerdo, sin signo, la ñ y Ñ tienen los siguiente ASCII, corregidlo si no es así. */
    else if((unsigned char) letra == 164 || (unsigned char) letra == 165)
        return 'N' - 'A' + 1;

    return -1;
}


Así para cualquier letra 'A' - 'Z' tendrás el orden que ocupa en el alfabeto y si el parámetro que se le pasa a la función no es una letra te devolverá -1, por lo que siempre podrás detectar "errores".

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

joecarl

Este post se está convirtiendo en un bucle, parece que cada uno postea su idea sin tener en cuenta lo que ya se ha dicho, engel lex ya ha dicho exactametne lo que acaba de decir do-while, vchar4 pone lo mismo aunq ya se le ha dicho que es un código un tanto trabajoso, etc... sería interesante para todos que tengamos en cuenta lo que dice cada uno, para poder crecer y esas cosas.

do-while

Cita de: joecarl en 31 Julio 2015, 09:31 AM
engel lex ya ha dicho exactametne lo que acaba de decir do-while

Reconocer la posición de una letra dentro de un alfabeto es una utilidad. engel lex ha incrustado un código en la función principal que no es reutilizable, además mezclando el código que debería de tener la función con el código que realiza el trabajo que tiene que llevar a cabo el propio programa. Yo he aportado una función que lleva a cabo la detección de la posición de una letra de forma completamente independiente al objetivo del programa principal, por lo que ese código se puede reutilizar donde se quiera. No veo relación alguna con lo que engel lex ha propuesto.

Cita de: joecarl en 31 Julio 2015, 09:31 AM
vchar4 pone lo mismo aunq ya se le ha dicho que es un código un tanto trabajoso

Como ya he dicho en el primer párrafo del post anterior, estaba mostrando que si se trabaja con el valor numérico de los caracteres el trabajo es mucho más simple que incrustar un switch con 27 casos (¿Son 27? nunca lo he sabido y no voy a ponerme a contar ahora, digamos que son 'Z' - 'A' + 3 casos XD)

Cita de: joecarl en 31 Julio 2015, 09:31 AMpara todos que tengamos en cuenta lo que dice cada uno, para poder crecer y esas cosas.

Eso eso, a ver si aprendemos a ver las diferencias entre lo que cada uno escribe.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!