Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Dreamaker en 28 Mayo 2010, 18:33 pm



Título: [Ayuda] Como puedo validar esto?
Publicado por: Dreamaker en 28 Mayo 2010, 18:33 pm
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:

Código
  1. Private Sub cmdConvertir_Click()
  2.  
  3. 'Declaracion de variables
  4.  
  5. Dim strPalabra As String
  6.  
  7. 'Asignacion de valor
  8.  
  9. strPalabra = txtValor1.Text
  10.  
  11. If strPalabra = Verificar(strPalabra) Then
  12.    lblResultado.Caption = "La palabra ya es palindroma" 'Si pasa la verificación de que es palindroma, entonces avisa al usuario de eso"
  13. Else
  14.    lblResultado.Caption = txtValor1.Text & Convertir(strPalabra) 'Si no, entonces la convierte en palindroma
  15. End If
  16.  
  17. 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)


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Shell Root en 28 Mayo 2010, 21:12 pm
Podrías usar expresiones regulares. Como está:
Código
  1. [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)
Código
  1. <?php /* #!/usr/bin/php
  2.  
  3. Autor: Shell Root
  4. Archivo: PoC.php
  5. Descripción: Verificación si una o varías palabra son palindromás
  6.  
  7. */
  8.  
  9.  
  10.    /* Verificamos la cantidad de parámetros */
  11.    if(sizeof($_SERVER['argv']) == 2){
  12.   $strOriginal = str_replace(' ', '', $_SERVER['argv'][1]);
  13.   $strInvertida = strrev($strOriginal);
  14.     if(strtolower($strOriginal) == strtolower($strInvertida)){
  15.   echo "Es palindroma \n";
  16. echo strtolower($_SERVER['argv'][1])."\n";
  17. echo strrev(strtolower($_SERVER['argv'][1]))."\n";
  18.   }else{
  19.   echo "No es palindroma \n";
  20. echo strtolower($_SERVER['argv'][1])."\n";
  21. echo strrev(strtolower($_SERVER['argv'][1]))."\n";
  22.   }
  23.    }else{
  24.        echo "\n  Modo de uso: php PoC.php [Oración o Palabra] \n";
  25.        echo "       PoC: php PoC.php hola \n";
  26.        echo "       PoC: php PoC.php 'anita lava la tina \n\n";
  27.    }
  28.  
  29. ?>
PoC:
Código
  1. shellroot@alex-laptop:~/Escritorio$ php PoC.php oso
  2. Es palindroma
  3. oso
  4. oso
  5. shellroot@alex-laptop:~/Escritorio$ php PoC.php 'Anita lava la tina'
  6. Es palindroma
  7. anita lava la tina
  8. anit al aval atina
  9. shellroot@alex-laptop:~/Escritorio$ php PoC.php 'No se que poner aqui'
  10. No es palindroma
  11. no se que poner aqui
  12. iuqa renop euq es on


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Dreamaker en 29 Mayo 2010, 00:55 am
Pero estamos en visual basic, no sé programar en C :xD


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Shell Root en 29 Mayo 2010, 03:16 am
No es C, es PHP, y solo te di un ejemplo.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: BlackZeroX en 29 Mayo 2010, 11:50 am
[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!¡.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Karcrack en 29 Mayo 2010, 13:13 pm
Con un poco de logica y StrReverse() tienes mas que suficiente ;)


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Dreamaker en 29 Mayo 2010, 17:12 pm
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 :-\


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: BlackZeroX en 29 Mayo 2010, 20:48 pm
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!¡.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: BlackZeroX en 29 Mayo 2010, 21:35 pm
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

Código
  1.  
  2. '
  3. ' ////////////////////////////////////////////////////////////////
  4. ' // Autor: BlackZeroX ( Ortega Avila Miguel Angel )            //
  5. ' //                                                            //
  6. ' // Web: http://InfrAngeluX.Sytes.Net/                         //
  7. ' //                                                            //
  8. ' // |-> Pueden Distribuir Este Codigo siempre y cuando         //
  9. ' // no se eliminen los creditos originales de este codigo      //
  10. ' // No importando que sea modificado/editado o engrandesido    //
  11. ' // o achicado, si es en base a este codigo                    //
  12. ' ////////////////////////////////////////////////////////////////
  13.  
  14. Option Explicit
  15. Option Compare Text
  16.  
  17. Public Function vbReverse(ByVal StrInOri As String) As String
  18. Dim TmpChar             As String * 1   '   //  TmpChar = Space(1)
  19. Dim Stringhalf          As Long
  20. Dim StringLen           As Long
  21. Dim Index_String        As Long
  22. Dim index_StrInOri      As Long
  23.    If Not Len(StrInOri) <= 1 Then
  24.        StringLen = Len(StrInOri)
  25.        Stringhalf = StringLen / 2
  26.        For index_StrInOri = 1 To Stringhalf
  27.            TmpChar = Mid$(StrInOri, index_StrInOri, 1)
  28.            Index_String = StringLen - index_StrInOri + 1
  29.            Mid$(StrInOri, index_StrInOri, 1) = Mid$(StrInOri, Index_String, 1)
  30.            Mid$(StrInOri, Index_String, 1) = TmpChar
  31.        Next
  32.    End If
  33.    vbReverse = StrInOri
  34. End Function
  35.  
  36. Public Function EsPalidromoAlt(ByVal StrInOri As String) As Boolean
  37.    EsPalidromoAlt = StrInOri = vbReverse(StrInOri)
  38. End Function
  39.  
  40. Public Function EsPalidromo(ByVal StrInOri As String) As Boolean
  41. Dim TmpChar             As String * 1   '   //  TmpChar = Space(1)
  42. Dim Stringhalf          As Long
  43. Dim StringLen           As Long
  44. Dim Index_String        As Long
  45. Dim index_StrInOri      As Long
  46. Dim TmpStr              As String
  47.    If Not Len(StrInOri) <= 1 Then
  48.        StringLen = Len(StrInOri)
  49.        Stringhalf = StringLen / 2
  50.        TmpStr = Space(StringLen)
  51.        For index_StrInOri = 1 To Stringhalf
  52.            Index_String = StringLen - index_StrInOri + 1
  53.            Mid$(TmpStr, index_StrInOri, 1) = Mid$(StrInOri, Index_String, 1)
  54.            Mid$(TmpStr, Index_String, 1) = Mid$(StrInOri, index_StrInOri, 1)
  55.        Next
  56.    End If
  57.    EsPalidromo = StrInOri = TmpStr
  58. End Function
  59.  
  60.  

Código
  1.  
  2. Private Sub Form_Load()
  3. Const vConst As String = "peep"
  4.    MsgBox vbReverse(vConst)
  5.    MsgBox EsPalidromo(vConst)
  6.    MsgBox EsPalidromoAlt(vConst)
  7. End Sub
  8.  
  9.  

funciones alternativas

Código
  1.  
  2. Public Function EsPalidromo(ByVal StrInOri As String) As Boolean
  3.    EsPalidromo = StrInOri = StrReverse(StrInOri)
  4. End Function
  5.  
  6.  

P.D.: las funciones son similares como vez si hay dudas avisa.

Dulce Infierno Lunar!¡.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Dreamaker en 29 Mayo 2010, 21:52 pm
Cuando pones:

Código
  1. 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?




Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: BlackZeroX en 30 Mayo 2010, 07:27 am
Cuando pones:

Código
  1. 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!¡.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Karcrack en 30 Mayo 2010, 13:00 pm
No entiendo por que te complicas tanto para hacer el StrReverse() :-\

Código
  1. Public Function Str_Reverse(Expression As String) As String
  2.    Dim i     As Integer
  3.    For i = Len(Expression) To 1 Step -1
  4.        Str_Reverse = Str_Reverse & Mid$(Expression, i, 1)
  5.    Next i
  6. End Function


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Dreamaker en 30 Mayo 2010, 15:59 pm
Karcrack, que hace el Mid con el signo "$"?

Porque yo hasta ahora lo usaba simplemente Mid(<Cadena>,<Posición>,<Longitud>)
 :huh:


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: 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 ;)


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: burbu_1 en 30 Mayo 2010, 18:45 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í  :-\

Código
  1. Public Shared Function Mid( _
  2.   ByVal str As String, _
  3.   ByVal Start As Integer, _
  4.   Optional ByVal Length As Integer _
  5. ) As String
  6.  

http://msdn.microsoft.com/en-us/library/05e63829%28VS.80%29.aspx

saludos.


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: Karcrack en 30 Mayo 2010, 19:11 pm
Fijate que gran parte de la documentacion de la MSDN ya no es para VB6
Código
  1. ' Creates text string.
  2. Dim TestString As String = "Mid Function Demo"
  3. ' Returns "Mid".
  4. Dim FirstWord As String = Mid(TestString, 1, 3)
  5. ' Returns "Demo".
  6. Dim LastWord As String = Mid(TestString, 14, 4)
  7. ' Returns "Function Demo".
  8. Dim MidWords As String = Mid(TestString, 5)
  9.  
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 ;)


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: cobein en 30 Mayo 2010, 23:45 pm
Sacado de msvbvm60.dll

Código:
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;


Título: Re: [Ayuda] Como puedo validar esto?
Publicado por: LeandroA en 31 Mayo 2010, 11:31 am
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

Código:
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?
Código:
dim Valor as  long

Valor = 5&

o esto

Código:
dim B() as byte

redim B(0&)

Saludos.