Autor
|
Tema: Ayuda con programa de posición de letras (Leído 5,102 veces)
|
alejandro70
Desconectado
Mensajes: 5
|
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? #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
|
|
« Última modificación: 27 Julio 2015, 05:29 am por engel lex »
|
En línea
|
|
|
|
simorg
Ex-Staff
Desconectado
Mensajes: 8.302
|
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
Mensajes: 5
|
Ohh perdon, no lo sabia, ¿Puedo dejar el tema? O tengo que crear uno nuevo
|
|
|
En línea
|
|
|
|
v4char
Desconectado
Mensajes: 61
|
Hice esto en C espero que te funcione los caracteres que no reconoce los pone como 0 #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; }
|
|
« Última modificación: 27 Julio 2015, 07:20 am por v4char »
|
En línea
|
|
|
|
engel lex
|
me parece que hacen mucho trabajo 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 #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; }
|
|
« Ú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
Mensajes: 5
|
Gracias gracias 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".
|
|
« Última modificación: 30 Julio 2015, 16:18 pm por Eternal Idol »
|
En línea
|
|
|
|
v4char
Desconectado
Mensajes: 61
|
Con esto funciona la ñ pero solo en Windows, por lo menos en el mio #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; }
|
|
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
joecarl
Desconectado
Mensajes: 24
|
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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!
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿con qué programa puedo ver las letras del karaoke???
« 1 2 »
Multimedia
|
4rm4ndo
|
11
|
15,653
|
4 Enero 2004, 07:35 am
por 4rm4ndo
|
|
|
programa que muestre letras
ASM
|
mapers
|
1
|
3,586
|
28 Noviembre 2010, 22:03 pm
por Eternal Idol
|
|
|
CAMBIAR POSICION EN INICIO DEL PROGRAMA
« 1 2 »
Windows
|
FCOSTA
|
11
|
6,743
|
4 Octubre 2014, 00:38 am
por FCOSTA
|
|
|
Cambiar posicion en inicio del programa
.NET (C#, VB.NET, ASP)
|
FCOSTA
|
1
|
1,955
|
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,444
|
29 Noviembre 2017, 17:02 pm
por .:UND3R:.
|
|