Hola a todos, estoy haciendo un programa para convertir palabras a palindromas, donde el código contiene 2 funciones:
Una llamada Verificar() que lo que hace es verificar si la palabra ya es palindroma: Por ejemplo, oro, oso, anana
Y otra llamada Convertir() que en el caso de que la palabra ingresada no sea palindroma, entonces la convierte, ejemplo:
Perro -> PerrorreP
Rata -> RatataR
Está validado para que si la palabra es palindroma, muestre en un label un mensaje diciendo "La palabra ingresada ya es palindroma", si no es entonces la convierte y la muestra
Lo que yo quiero hacer es que si el usuario ingresa numeros o cualquier otra cosa que no sean letras, por ej "*5846-!,,,.." y aprete el boton de Convertir, tire un mensaje al Label diciendo "La palabra ingresada no es válida o la caja de texto está vacía, por favor ingrese otro valor"
Se entiende? Me supongo que es sencillo pero no logro aclararme alguna idea de como hacerlo, les dejo el código principal:
Private Sub cmdConvertir_Click()
'Declaracion de variables
Dim strPalabra As String
'Asignacion de valor
strPalabra = txtValor1.Text
If strPalabra = Verificar(strPalabra) Then
lblResultado.Caption = "La palabra ya es palindroma" 'Si pasa la verificación de que es palindroma, entonces avisa al usuario de eso"
Else
lblResultado.Caption = txtValor1.Text & Convertir(strPalabra) 'Si no, entonces la convierte en palindroma
End If
End Sub
Está validado para lo que dije, lo que yo quiero es que diga lo otro en caso de que no sean letras lo que contiene la caja pero que tampoco pueda hacer trampa y poner "adsd5648"
Gracias, a ver si se les ocurre algo :huh:
PD: El problema es que ya probé poniendo con un Select case y los 3 casos, si es palindroma, si es distinto de palindromo (pero en este caso "*46541" como no es palindroma me la convertiría igual)
Podrías usar expresiones regulares. Como está:
[a-zA-Z]
Donde solo acepta Letras Minúsculas y Mayúsculas. En caso de ingresar un carácter especial o un numero no se cumpliría la RegExp.
Por ejemplo: (Aunque me falto la validación que mensionabas)
<?php /* #!/usr/bin/php
Autor: Shell Root
Archivo: PoC.php
Descripción: Verificación si una o varías palabra son palindromás
*/
/* Verificamos la cantidad de parámetros */
if(sizeof($_SERVER['argv']) == 2){
$strOriginal = str_replace(' ', '', $_SERVER['argv'][1]);
$strInvertida = strrev($strOriginal);
if(strtolower($strOriginal) == strtolower($strInvertida)){
echo "Es palindroma \n";
echo strtolower($_SERVER['argv'][1])."\n";
echo strrev(strtolower($_SERVER['argv'][1]))."\n";
}else{
echo "No es palindroma \n";
echo strtolower($_SERVER['argv'][1])."\n";
echo strrev(strtolower($_SERVER['argv'][1]))."\n";
}
}else{
echo "\n Modo de uso: php PoC.php [Oración o Palabra] \n";
echo " PoC: php PoC.php hola \n";
echo " PoC: php PoC.php 'anita lava la tina \n\n";
}
?>
PoC:
shellroot@alex-laptop:~/Escritorio$ php PoC.php oso
Es palindroma
oso
oso
shellroot@alex-laptop:~/Escritorio$ php PoC.php 'Anita lava la tina'
Es palindroma
anita lava la tina
anit al aval atina
shellroot@alex-laptop:~/Escritorio$ php PoC.php 'No se que poner aqui'
No es palindroma
no se que poner aqui
iuqa renop euq es on
Pero estamos en visual basic, no sé programar en C :xD
No es C, es PHP, y solo te di un ejemplo.
[b]lo peor que se puede hacer en un lugar de un tema fijado es relacionarlo con otro cuando este no le importa en lo absoluto al individuo sudicho, aquen que lo de expresiones regulares esta bien... pero el ejemplo esta pesimo en este subforo.[/b]
* Aqui la liga a expresiones regulares en vb6.0.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/166-expresiones-regulares.htm
Dulce Infierno Lunar!¡.
Con un poco de logica y StrReverse() tienes mas que suficiente ;)
Claro Karcrack pero la idea no es usar funciones del vb (que yo se que hay muchas) sino crear mis propias funciones, ya que cuando te pasas a otro lenguaje las funciones no son todas igual y varían algunas, la idea es aprender a programar completamente para poder migrar a cualquier otro lenguaje apenas cambiando la sintaxis y aprendiendo unos detalles más (como punteros y todo eso) :laugh:
Todavía no me pude ingeniar una idea para hcerlo :-\
lo que dices se entiende de por medio desde que empiesas a programar, solo que hay que saber que hace X funcion despues puedes recrearla sin problemas, si no sabes que hace entonces en C/C++ como ejemplos no migrarias tan facil.
En resumen solo hay que saber que hace X funcion lo demas es logica rudimentaria en la migracion a otro lenguaje X.
Dulces Lunas!¡.
estoy aburrido asi que hice esto para vos nos vemos.
Son dos funciones para que compares que onda con lo que se te dice arriba un poco:
las funciones son similares como vez xP
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este Codigo siempre y cuando //
' // no se eliminen los creditos originales de este codigo //
' // No importando que sea modificado/editado o engrandesido //
' // o achicado, si es en base a este codigo //
' ////////////////////////////////////////////////////////////////
Option Explicit
Option Compare Text
Public Function vbReverse(ByVal StrInOri As String) As String
Dim TmpChar As String * 1 ' // TmpChar = Space(1)
Dim Stringhalf As Long
Dim StringLen As Long
Dim Index_String As Long
Dim index_StrInOri As Long
If Not Len(StrInOri) <= 1 Then
StringLen = Len(StrInOri)
Stringhalf = StringLen / 2
For index_StrInOri = 1 To Stringhalf
TmpChar = Mid$(StrInOri, index_StrInOri, 1)
Index_String = StringLen - index_StrInOri + 1
Mid$(StrInOri, index_StrInOri, 1) = Mid$(StrInOri, Index_String, 1)
Mid$(StrInOri, Index_String, 1) = TmpChar
Next
End If
vbReverse = StrInOri
End Function
Public Function EsPalidromoAlt(ByVal StrInOri As String) As Boolean
EsPalidromoAlt = StrInOri = vbReverse(StrInOri)
End Function
Public Function EsPalidromo(ByVal StrInOri As String) As Boolean
Dim TmpChar As String * 1 ' // TmpChar = Space(1)
Dim Stringhalf As Long
Dim StringLen As Long
Dim Index_String As Long
Dim index_StrInOri As Long
Dim TmpStr As String
If Not Len(StrInOri) <= 1 Then
StringLen = Len(StrInOri)
Stringhalf = StringLen / 2
TmpStr = Space(StringLen)
For index_StrInOri = 1 To Stringhalf
Index_String = StringLen - index_StrInOri + 1
Mid$(TmpStr, index_StrInOri, 1) = Mid$(StrInOri, Index_String, 1)
Mid$(TmpStr, Index_String, 1) = Mid$(StrInOri, index_StrInOri, 1)
Next
End If
EsPalidromo = StrInOri = TmpStr
End Function
Private Sub Form_Load()
Const vConst As String = "peep"
MsgBox vbReverse(vConst)
MsgBox EsPalidromo(vConst)
MsgBox EsPalidromoAlt(vConst)
End Sub
funciones alternativas
Public Function EsPalidromo(ByVal StrInOri As String) As Boolean
EsPalidromo = StrInOri = StrReverse(StrInOri)
End Function
P.D.: las funciones son similares como vez si hay dudas avisa.
Dulce Infierno Lunar!¡.
Cuando pones:
Dim TmpChar As String * 1
Es para declarar que la variable contendrá un carácter y por eso se coloca el *1?
Para qué es necesario? Declarando que contendrá un sólo carácter ocupa menos memoria que si le pones un sólo caracter sin poner el *1?
Cita de: Dreamaker en 29 Mayo 2010, 21:52 PM
Cuando pones:
Dim TmpChar As String * 1
Es para declarar que la variable contendrá un carácter y por eso se coloca el *1?
Para qué es necesario? Declarando que contendrá un sólo carácter ocupa menos memoria que si le pones un sólo caracter sin poner el *1?
yo en lo personal lo hago por que solo ocupo y dejo lo nesesario en su declaracion es decir su longitud maxima y cuando uso el mid$ no se nesesita seguir estos pasos:
Redimencionar string
establecer String
y esto X veces sea en el bucle por lo cual conlleva un poco mas de tiempo, por lo contrario si se hace de la forma en la declaracion en una longitud fija solo va a pasar a introducir el valor y la variable string SIEMPRE va a contener la logitud deseada y si no se llenace totalmente se poner Bytes 0 o nullos.
Dulce Infierno Lunar!¡.
No entiendo por que te complicas tanto para hacer el StrReverse() :-\
Public Function Str_Reverse(Expression As String) As String
Dim i As Integer
For i = Len(Expression) To 1 Step -1
Str_Reverse = Str_Reverse & Mid$(Expression, i, 1)
Next i
End Function
Karcrack, que hace el Mid con el signo "$"?
Porque yo hasta ahora lo usaba simplemente Mid(<Cadena>,<Posición>,<Longitud>)
:huh:
Utilizar el dolar es mas optimo, debido a que si no especificas usando el dolar que quieres que devuelva String, la funcion devuelve Variant, luego VB tiene que hacer la conversion para meter los datos en una String ;)
Cita de: Karcrack en 30 Mayo 2010, 16:43 PM
Utilizar el dolar es mas optimo, debido a que si no especificas usando el dolar que quieres que devuelva String, la funcion devuelve Variant, luego VB tiene que hacer la conversion para meter los datos en una String ;)
hola,
sin ánimo de comenzar una discusión con los grandes (porque seguro saldría perdiendo.... :-[) tenía entendido que la función mid devuelve un string de por sí :-\
Public Shared Function Mid( _
ByVal str As String, _
ByVal Start As Integer, _
Optional ByVal Length As Integer _
) As String
http://msdn.microsoft.com/en-us/library/05e63829%28VS.80%29.aspx
saludos.
Fijate que gran parte de la documentacion de la MSDN ya no es para VB6
' Creates text string.
Dim TestString As String = "Mid Function Demo"
' Returns "Mid".
Dim FirstWord As String = Mid(TestString, 1, 3)
' Returns "Demo".
Dim LastWord As String = Mid(TestString, 14, 4)
' Returns "Function Demo".
Dim MidWords As String = Mid(TestString, 5)
Prueba a ejecutar eso en VB6 :P
Fijate que al poner Mid( te saldra la declaracion de la funcion, si pones Mid$( pone al final "As String"
A la hora de programar no hay diferencia, pero una vez compilado el proceso es distinto ;)
Sacado de msvbvm60.dll
Module Constants;
GUID = {343DB180-2BCC-1069-82D4-00DD010EDFAA};
vbObjectError = -2147221504;
vbNullString = ;
vbNullChar = iant; stdcall;
function _B_str_Mid(String: BSTR; Start: I4; out Length: ^Variant): BSTR; stdcall;
function _B_var_Mid(String: ^Variant; Start: I4; out Length: ^Variant): Variant; stdcall;
ya que se sale el tema, pregunto con respecto a valores numericos con los singnos.
he visto que cuando se utiliza una API muchas veces en los valores nulos (cero u otros tambien) se los pasa con los singos
por ejemplo
SendMessage THWnd, WM_KEYDOWN, VK_R, 0&
al cero se lo marca como un long
ahora si yo ago esto, es nesesario, esta bien o esta mal?
dim Valor as long
Valor = 5&
o esto
dim B() as byte
redim B(0&)
Saludos.