Un programa que ordene las letras de una oración de hasta 40 (cuarenta) caracteres juntando las vocales y las consonantes de acuerdo a la letra de comienzo, de la siguiente manera:
a) Se debe permitir el ingreso de cualquier elemento del teclado (entiéndase: letras, números y caracteres especiales).
b) Si la palabra comienza con vocal, todas las vocales deberán ser ubicadas al principio siguiendo el orden de aparición y posteriormente las consonantes de acuerdo a su aparición.
c) Si en el medio de la palabra aparece un número, o un carácter especial, este debe ser eliminado del conjunto de palabras, y colocado separadamente indicando cual es la posición del mismo en el conjunto original.
d) Si el carácter especial o número aparece como cierre de una palabra, frase u oración este debe conservar el lugar y no ser separado del conjunto inicial.
Ejemplos:
Estos serían 3 ejemplos básicos, pero podría escribirse cualquier cosa tenga o no sentido
1)Esta historia es larga y entusiasta
2)La comi#$da esta aceitosa pero sa;=brosa
3)Estaba esperando1 cuando aparecio?
Bien ahora analicemos uno por uno.
1)Esta historia es larga y entusiasta
DEBE DEVOLVER: East hstrioia es lrgaa y euiaantsst
Observen que en este ejemplo la tercera palabra no tiene modificación porque es de 2 letras pero las otras si se han modificado para obtener el resultado solicitado.
Vamos al segundo ejemplo
2)La comi#$da esta aceitosa pero sa;=brosa
DEBE DEVOLVER: La cmdoia east aeioacts preo sbrsaoa
# posicion 8
$ posicion 9
; posicion 34
= posicion 35
Como ven hemos sacado los caracteres especiales. En este ejemplo están seguidos pero pueden estar en cualquier lugar y también tengan en cuenta que también pueden ser números.
Vamos al tercer ejemplo.
3)Estaba esperando1 cuando aparecio?
DEBE DEVOLVER: Eaastb eeaosprnd1 cnduao aaeioprc?
Nótese que en este ejemplo los números y caracteres especiales que aparecen no se mueven y no se informan porque están al final de la palabra.
Los ejemplos dos y tres pueden estar mezclados.
-----------------------------------------------------------------------------------------------------------------------------------------------------
Les voy a explicar brevemente el codigo y a grandes rasgos:
Tengo un primero vector que obtiene los caracteres,luego lo que hago es proceder a "rastrear" los caracteres y dividirlos segun sean vocales (mayusculas o minusculas) o consonantes(mayusculas o minusculas) .Si,obviamente no es ninguno de ellos,es un caracter especial:
Les explico los procedimientos brevemente y a grandes rasgos:
A)Obtengo mi primer vector en la etiqueta veccadena_llenado
B)Luego voy a la etiqueta Rastreo,en donde pregunto si son vocales o consonantes ,si es verdad,voy a sus respectivas etiquetas hago la impresion del caracter(no se que elemento puedo usar para esto un segundo vector o variable de tipo string que acepte la escritura de caracteres)
C)Si no es ninguna vocal o consonante sera un caracter especial,en donde voy hasta un procedimiento que se encarga de SEPARAR ,IMPRIMIR Y DECIRME LA POSICION EN LA CUAL FUE ENCONTRADO
Bueno ahora les voy a mostrar como lo tengo planificado ( yo uso el emu8086 ):
Código
#make_COM# org 100h .stack ;Declaramos el tamanio de la pila ¿No? .data;declaraciones de los vectores y otras variables que vamos a usar declariaciones de los vectores y otras variables que vamos a usar .code text ;Empieza el programa en si mismo ;------------------------------------------------------------------- veccad_llenado:;Etiqueta en la cual vamos a proceder a llenar el ;vector y ademas tener en cuenta si el usuario borro ;algun caracter. ;Ademas tenemos que averiguar el tamanio final del ;vector para poder trabajar con el loop "rastreo" ;Ademas ya sea en este vector o antes,tenemos que ;mostrar el mensaje: "Ingrese su cadena:" " "(espacio) ;------------------------------------------------------------------- mov cx,"X" ;ES UN EJEMPLO PERO LA IDEA ES: ;POR ESTO MISMO,NECESITAMOS EL TAMANIO VERDADERO DEL ;VECTOR,PARA PODER LOOPEARLO Y RASTREAR Y DIVIDIR LOS ;CARACTERES,ESO BUSCAMOS. ;------------------------------------------------------------------- ;Antes de empezar con la siguiente etiqueta ,Luego del mensaje: ;"Ingrese su cadena:" (con su respectivo espacio). ;Despues de esto,hay que dejar un renglon hacia abajo y luego: ;"La cadena reordenada es:" y luego empezar a escribir a continuacion. ;1 sola vez el mensaje por supuesto. ;-------------------------------------------------------------------- rastreo: ;Etiqueta en la cual vamos a COMPARAR EL CONTENIDO ;EN LA PRIMERA POSICION DE ESE VECTOR(veccadena-contenido-) ;obviamente,por las vocales,ESA ES LA IDEA: CMP veccadena(contenido),'A' ;Empezamos por mayusculas,si es asi(JE), ;SALTO hasta la etiqueta llamada JE imp_voc ;"impresion_voc". ;(Una pregunta:Si salto hasta una etiqueta,no se como volver/retomar la ;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al ;final "RET" retorna alpunto exacto donde fue llamado,pero con una ;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma ;instruccion RET al final de la etiqueta "imp_voc". CMP veccadena(contenido),'a';Si la comparacion anterior no resulta ;IGUAL (JE) comparamos denuevo por la misma ;letra pero en minuscula si es asi(JE) ;SALTO hasta la misma etiqueta JE imp_voc ;"impresion_voc" ;(Aca me surje la misma pregunta,me surje la misma duda en todas las ;instrucciones:Si salto hasta una etiqueta no se como volver/retomar la ;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al ;final "RET" retorna al punto exacto donde fue llamado,pero con una ;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma ;instruccion RET al final de la etiqueta "imp_voc". CMP veccadena(contenido),'E' JE imp_voc CMP veccadena(contenido),'e' JE imp_voc CMP veccadena(contenido),'I' JE imp_voc CMP veccadena(contenido),'i' JE imp_voc CMP veccadena(contenido),'O' JE imp_voc CMP veccadena(contenido),'o' JE imp_voc CMP veccadena(contenido),'U' JE imp_voc CMP veccadena(contenido),'u' JE imp_voc ;Bueno,repetimos este paso con todas la vocales mayusculas y minusculas. ;---------------------------------------------------------- ;Obviamente,si no es ninguna vocal(mayus. o minus.) CMP veccadena(contenido),65 ;Vamos a COMPARAR,SI EL CONTENIDO EN LA ;PRIMERA POSICION DE ESE VECTOR ;(veccadena-contenido-)ESTA POR ABAJO(JB) ;del codigo 65 en decimal que representa ;la "A" (segun la tabla ASCII). JB vecespeciales ;SI ESTA POR ABAJO,vamos a vecespeciales CMP veccadena(contenido),90 ;SI NO ESTA POR ABAJO,volvemos a comparar ;SI EL CONTENIDO EN LA PRIMERA POSICION DE ;ESE VECTOR(veccadena-contenido-) ;SI ESTA POR ABAJO O ES IGUAL(JBE)que el ;codigo 90 en decimal que representa la ;"z"(segun la tabla ASCII). ;SI ES ASI,SIGNIFICA QUE ESTA DENTRO DE ;LAS MAYUSCULAS POR LO TANTO VAMOS A LA JBE imp_conso ;ETIQUETA "imp_conso" CMP veccadena(contenido),97 ;SI NO ESTA POR ABAJO O ES IGUAL A 90 ;comparamos,SI EL CONTENIDO EN LA PRIMERA ;POSICION DE ESE VECTOR ;(veccadena-contenido-)ESTA POR ABAJO(JB) ;DE 97 el codigo en decimal que representa ;la "a". ;SI ESTA POR ABAJO DE 97,nos vamos a JB vecespeciales ;vecespeciales CMP veccadena(contenido),122 ;SI NO ESTA POR ABAJO DE 97,comparamos ;SI EL CONTENIDO EN LA PRIMERA POSICION ;DE ESE VECTOR(veccadena-contenido)SI ESTA ;POR ABAJO O ES IGUAL(JBE)que el codigo ;122 que en decimal representa la "z". ;SI ESTA POR ABAJO O ES IGUAL de 122 JBE imp_conso ;vamos a "imp_conso" ;SI NO ESTA EN NINGUN LADO ANTERIOR ;SIGNIFICA QUE ES MAS GRANDE QUE 122 CALL vecespeciales ;por lo tanto hacemos CALL vecespeciales ;------------------------------------------------------------------ ;Luego,hacemos la etiqueta Retomo,en la cual adentro hacemos una ;variable contadora del vector y por supuestoincrementamos el ;vector(para recorrerlo) por ultimo,loop rastreo para volver a rastrear. Retomo: *Variable contadora del vector ;La voy a usar en "vecespeciales" *Incrementas el vector (para recorrerlo) *Pregunto si el contenido en esa posicion del vector es igual a "enter" *Si es igual ,ponemos "Pulse un tecla" o simplemente se termina el programa(mostrando todas las consignas obviamente) loop rastreo ;------------------------------------------------------------------ vecespeciales PROC ;Despues del mensaje "Ingrese su cadena:"(con su respectivo espacio) ;Tenemos que dejar un renglon hacia abajo,es decir vamos a graficar la ;situacion: ;Ingrese su cadena: 123 2est5aba6 donde ;La cadena reordenada:xxxxxx6 xxxx ;1 posicion 1 ;TODO ESTO HACE "vecespeciales" ;2 posicion 2 ;TODO ESTO HACE "vecespeciales" ;3 posicion 3 ;TODO ESTO HACE "vecespeciales" ;2 posicion 5 ;TODO ESTO HACE "vecespeciales" ;5 posicion 9 ;TODO ESTO HACE "vecespeciales" ;Como vieron dentro de esta funcion lo que se va hacer seria la parte ;de lo caracteres especiales y con mensajes consecutivos dejando ;un espacio,todo esto depende de lo que se ingrese ,es decir: ;Se los imprime,espacio en blanco y luego se imprime la posicion. ;Para llevar a cabo dentro de esta funcion lo que se necesita es el ;contenido de la direccion del vector (o el contenido,lo que sea ;posible) y el contador de la etiqueta "rastreo" para eso la creamos. RET vecespeciales ENDP ;------------------------------------------------------------------- imp_voc: ;Ya sea que usemos un segundo vector o un cadena de tipo string en ;donde se pueda escribir a traves de 2 etiquetas ;Esta etiqueta lo que hace obviamente recibe el contenido de veccadena ;y lo imprime en el elemento que usemos (vector o una cadena o variable ;de caracteres) luego hace el (JMP) hacia "Retomo" dentro de "Rastreo" ;Es decir: codigo JMP Retomo ;--------------------------------------------------------------------- imp_conso: ;Lo mismo que la etiqueta "imp_voc" codigo JMP Retomo ;-------------------------------------------------------------------- ret -------------------------------------------------------------------------------------------------------------------------------------------------
Espero sus sugerencias ya que mi planteo presenta errores y espero sus consejos,COMO LES DIJE ANTES LES AGRADEZCO SU TIEMPO,DE VERDAD,MUCHAS GRACIAS.
Mod: Los códigos deben ir en etiquetas GeSHi