Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alejandro70 en 27 Julio 2015, 05:12 am



Título: Ayuda con programa de posición de letras
Publicado por: alejandro70 en 27 Julio 2015, 05:12 am
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
  1. #include <iostream>
  2. #include <ctype.h>
  3. #include <locale.h>
  4.  
  5. using namespace std;
  6.  
  7. int longitudmensaje, longitudOrden, i, j;
  8. char alfabetoOr[28], mensaje[500];
  9.  
  10. int main(){
  11.  
  12. 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',' '};
  13. cout<<"Introduzca las letras de las que desea conocer su posiposición\n";
  14. cin>>mensaje[500];
  15.  
  16. longitudmensaje=(sizeof(&mensaje));
  17. int ordenLet[longitudmensaje];
  18.  
  19. for(i=0;i<(longitudmensaje);i++)
  20. {
  21.     mensaje[i]=toupper(mensaje[i]);                              
  22.    }
  23.  
  24.     for (i=0;i<(longitudmensaje);i++)
  25.     {
  26.         for (j=0;j<28;j++)
  27.         {
  28.                                    if (mensaje[i]==alfabetoOr[j])
  29.                                       {
  30. if (mensaje[i]!='\0')
  31. {
  32. ordenLet[i]=j;
  33. }
  34.                                       }                                  
  35.         }  
  36.     }  
  37.  
  38. for(i=0;i<(longitudmensaje);i++){
  39. cout<<ordenLet[i]<<"\n";
  40. }
  41.  
  42. cin.get();
  43. return 0;
  44. }


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


Título: Re: Ayuda con programa de posición de letras
Publicado por: simorg en 27 Julio 2015, 05:28 am
Hola, modifica tu post, para publicar codigo se den usar las etiquetas GeShi adecuadas al lenguaje empleado.

Leete las Reglas del Foro.


Saludos.


Título: Re: Ayuda con programa de posición de letras
Publicado por: alejandro70 en 27 Julio 2015, 05:32 am
Ohh perdon, no lo sabia, ¿Puedo dejar el tema? O tengo que crear uno nuevo


Título: Re: Ayuda con programa de posición de letras
Publicado por: v4char en 27 Julio 2015, 06:32 am
Hice esto en C espero que te funcione los caracteres que no reconoce los pone como 0

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int obtener_pos(char mensaje)
  5. {
  6.    switch (mensaje)
  7.    {
  8.    case 'a':
  9.        return 1;
  10.        break;
  11.    case 'b':
  12.        return 2;
  13.        break;
  14.    case 'c':
  15.        return 3;
  16.        break;
  17.    case 'd':
  18.        return 4;
  19.        break;
  20.    case 'e':
  21.        return 5;
  22.        break;
  23.    case 'f':
  24.        return 6;
  25.        break;
  26.    case 'g':
  27.        return 7;
  28.        break;
  29.    case 'h':
  30.        return 8;
  31.        break;
  32.    case 'i':
  33.        return 9;
  34.        break;
  35.    case 'j':
  36.        return 10;
  37.        break;
  38.    case 'k':
  39.        return 11;
  40.        break;
  41.    case 'l':
  42.        return 12;
  43.        break;
  44.    case 'm':
  45.        return 13;
  46.        break;
  47.    case 'n':
  48.        return 14;
  49.        break;
  50.    case 'o':
  51.        return 15;
  52.        break;
  53.    case 'p':
  54.        return 16;
  55.        break;
  56.    case 'q':
  57.        return 17;
  58.        break;
  59.    case 'r':
  60.        return 18;
  61.        break;
  62.    case 's':
  63.        return 19;
  64.        break;
  65.    case 't':
  66.        return 20;
  67.        break;
  68.    case 'u':
  69.        return 21;
  70.        break;
  71.    case 'v':
  72.        return 22;
  73.        break;
  74.    case 'w':
  75.        return 23;
  76.        break;
  77.    case 'x':
  78.        return 24;
  79.        break;
  80.    case 'y':
  81.        return 25;
  82.        break;
  83.    case 'z':
  84.        return 26;
  85.        break;
  86.  
  87.    default:
  88.        return 0;
  89.        break;
  90.    }
  91.  
  92. }
  93.  
  94. int main()
  95. {
  96.    char mensaje[501];
  97.  
  98.    printf("Introduce mensaje: ");
  99.    fflush(stdout);
  100.    gets(mensaje);
  101.  
  102.    sprintf( mensaje, "%s", tolower(mensaje) );
  103.  
  104.    int i;
  105.  
  106.    for(i=0;i<strlen(mensaje);i++)
  107.    {
  108.        printf("%i\n", obtener_pos(mensaje[i]));
  109.    }
  110.  
  111.    return 0;
  112. }
  113.  


Título: Re: Ayuda con programa de posición de letras
Publicado por: engel lex en 27 Julio 2015, 07:08 am
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
  1. #include <iostream>
  2. #include <string>
  3. #include <locale>
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8. cout<<"Introduzca las letras de las que desea conocer su posición\n";
  9. string mensaje;
  10. cin>>mensaje;
  11. locale loc;
  12. int i;
  13.  
  14. for(i=0;i<mensaje.size();i++){
  15.  
  16. mensaje[i] = tolower(mensaje[i], loc);//a minusculas
  17.  
  18.    if(mensaje[i]>='a' && mensaje[i]<='z'){
  19.  
  20.     if(mensaje[i]>'n'){//para meter la ñ que no está en ascii standard
  21.     mensaje[i]++;
  22.     }
  23.  
  24. mensaje[i]-='a'-1;//para ubicarlo en el orden natural
  25. cout<<(int)mensaje[i];//imprimimos casteando como int
  26. cout<<endl;
  27.  
  28.    }
  29.  
  30.    if(mensaje[i]==-61){//aquí está la ñ de ascii extendido
  31.     i++;//la ñ ocupa 2 char, así que avanzamos 1 de una vez
  32.     if(mensaje[i]==-111 || mensaje[i]==-79){//aseguramos que es ñ
  33. mensaje[i]='n'-'a'+1;//va siguiente a la n y arreglamos su orden natural
  34. cout<<(int)mensaje[i];//imprimimos casteando como int
  35. cout<<endl;
  36.     }
  37.    }
  38.  
  39.  
  40.    }
  41.  
  42.  
  43. cin.get();
  44. return 0;
  45. }


Título: Re: Ayuda con programa de posición de letras
Publicado por: alejandro70 en 29 Julio 2015, 07:29 am
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?

Código:
#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".


Título: Re: Ayuda con programa de posición de letras
Publicado por: v4char en 30 Julio 2015, 13:38 pm
Con esto funciona la ñ pero solo en Windows, por lo menos en el mio
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int obtener_pos(char mensaje)
  5. {
  6.    switch (mensaje)
  7.    {
  8.    case 'a':
  9.        return 1;
  10.        break;
  11.    case 'b':
  12.        return 2;
  13.        break;
  14.    case 'c':
  15.        return 3;
  16.        break;
  17.    case 'd':
  18.        return 4;
  19.        break;
  20.    case 'e':
  21.        return 5;
  22.        break;
  23.    case 'f':
  24.        return 6;
  25.        break;
  26.    case 'g':
  27.        return 7;
  28.        break;
  29.    case 'h':
  30.        return 8;
  31.        break;
  32.    case 'i':
  33.        return 9;
  34.        break;
  35.    case 'j':
  36.        return 10;
  37.        break;
  38.    case 'k':
  39.        return 11;
  40.        break;
  41.    case 'l':
  42.        return 12;
  43.        break;
  44.    case 'm':
  45.        return 13;
  46.        break;
  47.    case 'n':
  48.        return 14;
  49.        break;
  50.    case 'o':
  51.        return 16;
  52.        break;
  53.    case 'p':
  54.        return 17;
  55.        break;
  56.    case 'q':
  57.        return 18;
  58.        break;
  59.    case 'r':
  60.        return 19;
  61.        break;
  62.    case 's':
  63.        return 20;
  64.        break;
  65.    case 't':
  66.        return 21;
  67.        break;
  68.    case 'u':
  69.        return 22;
  70.        break;
  71.    case 'v':
  72.        return 23;
  73.        break;
  74.    case 'w':
  75.        return 24;
  76.        break;
  77.    case 'x':
  78.        return 25;
  79.        break;
  80.    case 'y':
  81.        return 26;
  82.        break;
  83.    case 'z':
  84.        return 27;
  85.        break;
  86.    default:
  87.        if((int)mensaje==-92)
  88.        {
  89.            return 15;
  90.            break;
  91.        }
  92.        return 0;
  93.  
  94.        break;
  95.  
  96.    }
  97.  
  98. }
  99.  
  100. int main()
  101. {
  102.    char mensaje[501];
  103.  
  104.    printf("Introduce mensaje: ");
  105.    fflush(stdout);
  106.    gets(mensaje);
  107.  
  108.    sprintf( mensaje, "%s", tolower(mensaje) );
  109.  
  110.    int i;
  111.  
  112.    for(i=0;i<strlen(mensaje);i++)
  113.    {
  114.        printf("%i\n", obtener_pos(mensaje[i]));
  115.    }
  116.  
  117.    return 0;
  118. }
  119.  


Título: Re: Ayuda con programa de posición de letras
Publicado por: do-while en 31 Julio 2015, 09:05 am
¡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:

Código
  1. int posicion(char letra)
  2. {
  3.    letra = touper(letra);
  4.  
  5.    /* Las letras, tanto las mayúsculas como las minúsculas están ordenadas de la A a la Z en la tabla ASCII */
  6.    if(letra >= 'A' && letra <= 'Z')
  7.    {
  8.        if(letra <= 'N')
  9.            return letra - 'A';
  10.        else
  11.            return letra - 'A' + 1;
  12.    }
  13.    /* si mal no recuerdo, sin signo, la ñ y Ñ tienen los siguiente ASCII, corregidlo si no es así. */
  14.    else if((unsigned char) letra == 164 || (unsigned char) letra == 165)
  15.        return 'N' - 'A' + 1;
  16.  
  17.    return -1;
  18. }
  19.  

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!


Título: Re: Ayuda con programa de posición de letras
Publicado por: joecarl en 31 Julio 2015, 09:31 am
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.


Título: Re: Ayuda con programa de posición de letras
Publicado por: do-while en 1 Agosto 2015, 09:46 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.

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)

para 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!


Título: Re: Ayuda con programa de posición de letras
Publicado por: joecarl en 1 Agosto 2015, 11:44 am
Obviamente los mensajes no son exactamente iguales, eso ya sería para llevarse las manos a la cabeza, pero decis cosas muy similares sin ni tan siquiera hacer mención a la persona que lo ha dicho anteriormente, resulta desagradable ver como cada uno dice una cosa sin tener en cuenta lo que ya se ha dicho, un "tal y como ha dicho no se quien..." no vendría mal para establecer un debate humano.


Título: Re: Ayuda con programa de posición de letras
Publicado por: geeke en 1 Agosto 2015, 15:33 pm
Otra aproximación seria haciendo uso de la función strchr y una tabla, con la que podríamos ubicar fácilmente cualquier letra inclusive la ñ, sin complicar demasiado el código.

Código
  1. int posicion(char c)
  2. {
  3.    const char * abc = "abcdefghijklmnñopqrstuvwxyz";
  4.    const char * letra;
  5.  
  6.    c = tolower ((unsigned char)c);
  7.    letra = strchr (abc, c);
  8.  
  9.    return letra ? letra - abc : -1;
  10. }

Saludos