elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con programa de posición de letras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con programa de posición de letras  (Leído 5,227 veces)
alejandro70

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ayuda con programa de posición de letras
« 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


« Última modificación: 27 Julio 2015, 05:29 am por engel lex » En línea

simorg
Ex-Staff
*
Desconectado Desconectado

Mensajes: 8.302



Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #1 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.


En línea

alejandro70

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #2 en: 27 Julio 2015, 05:32 am »

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

v4char

Desconectado Desconectado

Mensajes: 61



Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #3 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.  
« Última modificación: 27 Julio 2015, 07:20 am por v4char » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #4 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. }
« Última modificación: 27 Julio 2015, 07:12 am por engel lex » En línea

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #5 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".
« Última modificación: 30 Julio 2015, 16:18 pm por Eternal Idol » En línea

v4char

Desconectado Desconectado

Mensajes: 61



Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #6 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.  
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #7 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!
En línea

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

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #8 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.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda con programa de posición de letras
« Respuesta #9 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿con qué programa puedo ver las letras del karaoke??? « 1 2 »
Multimedia
4rm4ndo 11 15,743 Último mensaje 4 Enero 2004, 07:35 am
por 4rm4ndo
programa que muestre letras
ASM
mapers 1 3,618 Último mensaje 28 Noviembre 2010, 22:03 pm
por Eternal Idol
CAMBIAR POSICION EN INICIO DEL PROGRAMA « 1 2 »
Windows
FCOSTA 11 6,827 Último mensaje 4 Octubre 2014, 00:38 am
por FCOSTA
Cambiar posicion en inicio del programa
.NET (C#, VB.NET, ASP)
FCOSTA 1 1,971 Último mensaje 4 Octubre 2014, 22:28 pm
por Eleкtro
Necesito ayuda con un programa, bloqueado con una contraseña de 4 digitos-letras
Ingeniería Inversa
Fabianyang 3 3,481 Último mensaje 29 Noviembre 2017, 17:02 pm
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines