Hola,¿Como estan? Realmente quisiera unas sugerencias o que me hagan la correciones necesarias,serian muy amables por eso y por su tiempo ,Les paso a detallar el enunciado:
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 ):
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
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 (asm) [Seleccionar]
#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