Hal v.0.2




Este programa pertenece al curso de C# de Douglas Bell & Mike Parr.
Básicamente consiste en escribir un método llamado obtenerRespuesta, el cual devuelve una respuesta a una pregunta que se le pasa como argumento. La cadena de entrada es introducida por el usuario mediante un cuadro de texto, y la respuesta se despliega en una etiqueta.
Para que las respuestas parezcan más humanas, agregamos un elemento aleatorio.
El entero aleatorio provee tres casos. En dos de ellos producimos una respuesta estándar, pero en el tercero transformamos la pregunta; es decir, reemplazamos cada ocurrencia de " Yo " por " usted ". Ademas añadimos espacios adicionales al principio y al final de la pregunta para ayudar a detectar palabras completas. Cabe mencionar que el programa no tiene conocimiento del significado ni de la gramática Española.

Así mismo creamos el método Cambiar: El proceso básico consiste en utilizar IndexOf para determinar la posición de la subcadena que nos interesa. Después formamos una nueva cadena compuesta por la parte izquierda de la cadena, la parte derecha y la cadena de reemplazo al centro. El proceso se debe repetir hasta que no haya más ocurrencias. Hay tres casos problemáticos:
- Cuando el usuario nos pide sustituir un valor de "". es preciso tomar en cuenta que antes de cualquier cadena puede haber un número infinito de esas cadenas vacías. Nuestra forma de proceder en este caso deberá ser devolver la cadena original sin cambios.
- Cuando la cadena de reemplazo contiene la cadena a reemplazar. Por ejemplo podriamos tratar de cambiar "ser" por "serpiente". Para evitar que se realice un número infinito de reemplazos, nos aseguramos de que sólo se consideren subcadenas en la parte derecha de la cadena original. Para ello podríamos utilizar la variable iniciarBusqueda, para guardar en dónde está el inicio de la parte derecha de la cadena en un momento dado.
- Cuando la cadena de reemplazo combinada con la cadena original produce la cadena a reemplazar. Por ejemplo, al reemplazar bc con c en abbcd obtenemos abcd.  La solución al caso anterior también contempla y resuelve esta posibilidad.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            respuestaLabel.Text = obtenerRespuesta(preguntaTextBox.Text);
        }


        private string obtenerRespuesta(string pregunta)
        {
            Random numeroAleatorio = new Random();
            int variacion;
            string respuesta;
            pregunta = " " + pregunta + " ";
            variacion = numeroAleatorio.Next(0, 2);
            if (variacion == 0)
            {
                respuesta = transformar(pregunta);
            }
            else
                if (variacion == 1)
                {
                    respuesta = "¿Por qué se siente así ?";
                }
                else
                {
                    respuesta = "Por favor, sea sincero !";
                }
            return respuesta;
        }

        private string transformar(string pregunta)
        {
            string respuestaTemp;
            if (pregunta.IndexOf(" Yo ") >= 0)
            {
                respuestaTemp = Cambiar(pregunta, " Yo ", " Usted ");
                respuestaTemp = Cambiar(respuestaTemp, " me siento ", " se siente ");
                return Cambiar(respuestaTemp, " mi ", " su ") +
                    "¿Por qué?";
            }
            else
                if (pregunta.IndexOf(" no ") <= 0)
                {
                    return "¿ No ? - !Que negativo! Por favor, expliqueme.";
                }
                else
                {
                    return "´" + pregunta + ".´ Por favor, expliqueme ";
                }
        }



        private string Cambiar(string original,
        string textoActual,
        string textoFinal)
        {
            string parteIzq, parteDer;
            int inicialBusqueda = 0;
            int lugar = original.IndexOf(textoActual);

            if (textoActual.Length != 0)
            {
                while (lugar >= inicialBusqueda)
                {
                    parteIzq = original.Substring(0, lugar);
                    parteDer = original.Substring(lugar + textoActual.Length, original.Length - lugar - textoActual.Length);

                    original = parteIzq + textoFinal + parteDer;
                    inicialBusqueda = parteIzq.Length + textoFinal.Length;
                    lugar = original.IndexOf(textoActual);
                }
            }
            return original;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void acerdaDeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String textodelacaja = "Hal 9000 Versión 1.0" +
                Environment.NewLine + "(c), 2015";
            MessageBox.Show(textodelacaja, "Hal 9000");
        }

     
    }
}

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.