[Ayuda] Contar letras de una cadena C#

Iniciado por Leo_Programador, 30 Noviembre 2014, 07:48 AM

0 Miembros y 1 Visitante están viendo este tema.

Leo_Programador


[MOD]: Los códigos deben ir en su respectiva etiqueta.




Hola a todos, basicamente el programa que estoy haciendo es un AHORCADO, mi problema es el siguiente:
En un textbox yo escribo la letra que deseo ingresar para verificar si esta o no en la palabra, el tema es que si la palabra es por ejemplo HIPOPOTAMO, esta tiene 3 "O", y yo obviamente al colocar "O" me escribe solo la primera que encuentra.


la porcion de codigo con mi problema esta aca:

Código (csharp) [Seleccionar]
private void button3_Click(object sender, EventArgs e)
       {
           letraIngresada = textBoxLetra.Text;

           TextBox[] palabraFinal = { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11 };

           if (palabraElegida.IndexOf(letraIngresada)>=0)
           {

               int x = 0;
               x = palabraElegida.IndexOf(letraIngresada);

               palabraFinal[x].Text = textBoxLetra.Text;

               for (int i = 0; i < palabraFinal.Length; i++)
{
if (palabraFinal[i].Text=="")
               {
                   x++;
                   x=palabraElegida.IndexOf(letraIngresada,x);

                   palabraFinal[x].Text = textBoxLetra.Text;

               }

}
               
           }
           else
           {
               cont++;
               CambiarImagen(cont);
           }
           
       }







public partial class Form1 : Form
   {

       string[] animales = { "rinoceronte", "hipopotamo", "tortuga", "flamenco", "avestruz" };
       string[] FruVer = { "zanahoria", "calabacin", "puerro", "remolacha", "aceituna" };
       string[] objetos = { "ventilador", "heladera", "modular", "mochila", "camperon" };
       string[] paises = { "angola", "australia", "nicaragua", "tanzania", "singapur" };
       int bus;
       string palabraElegida;
       string letraIngresada;
       int cont = 0;


       public Form1()
       {
           InitializeComponent();
       }

       public void Buscar_palabra(string[] vec)
       {
           Random buscar = new Random();

           bus = buscar.Next(5);
           palabraElegida = vec[bus];
           
           label_Letra.Text= vec[bus];
       }

       private void button3_Click(object sender, EventArgs e)
       {
           letraIngresada = textBoxLetra.Text;

           TextBox[] palabraFinal = { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11 };

           if (palabraElegida.IndexOf(letraIngresada)>=0)
           {

               int x = 0;
               x = palabraElegida.IndexOf(letraIngresada);

               palabraFinal[x].Text = textBoxLetra.Text;

               for (int i = 0; i < palabraFinal.Length; i++)
{
if (palabraFinal[i].Text=="")
               {
                   x++;
                   x=palabraElegida.IndexOf(letraIngresada,x);

                   palabraFinal[x].Text = textBoxLetra.Text;

               }

}
               
           }

           //if (palabraElegida.IndexOf(letraIngresada) != -1)
           //{

           //    for (int i = 0; i < palabraElegida.Length; i++)
           //    {
           //        palabraFinal[palabraElegida.IndexOf(letraIngresada)].Text = textBoxLetra.Text;

           //        palabraFinal[palabraElegida.IndexOf(letraIngresada, palabraElegida.IndexOf(letraIngresada) + 1)].Text = textBoxLetra.Text;
           //    }

           //}
           else
           {
               cont++;
               CambiarImagen(cont);
           }
           
       }

       private void pictureBox1_Click(object sender, EventArgs e)
       {
           fotoPrincipal.Image = fotoSoga.Image;
           label_Letra.Visible = true;
           textBoxLetra.Visible = true;
           button3.Visible = true;
           pictureBox1.Visible = false;
           groupBox1.Visible = false;
           groupBox2.Visible = true;

           
           if (radioButton1.Checked == true)
           {
               Buscar_palabra(animales);
           }
           else if (radioButton2.Checked == true)
           {
              Buscar_palabra(FruVer);
           }
           else if (radioButton3.Checked == true)
           {
             Buscar_palabra(objetos);
           }
           else if (radioButton4.Checked == true)
           {
              Buscar_palabra(paises);
           }
           else MessageBox.Show("Elige una opción por favor.");

           if (palabraElegida.Length == 10)
           {
               textBox11.Visible = false;
           }
           if (palabraElegida.Length == 9)
           {
               textBox11.Visible = false;
               textBox10.Visible = false;
           }
           if (palabraElegida.Length == 8)
           {
               textBox11.Visible = false;
               textBox10.Visible = false;
               textBox9.Visible = false;
           }
           if (palabraElegida.Length == 7)
           {
               textBox11.Visible = false;
               textBox10.Visible = false;
               textBox9.Visible = false;
               textBox8.Visible = false;
           }
           if (palabraElegida.Length == 6)
           {
               textBox11.Visible = false;
               textBox10.Visible = false;
               textBox9.Visible = false;
               textBox8.Visible = false;
               textBox7.Visible = false;
           }


       }
                public void CambiarImagen(int cont)
         {
             switch (cont)
             {
               
                 case 1: fotoPrincipal.Image = fotoCabeza.Image;
                     break;
                 case 2: fotoPrincipal.Image = fotoBrazo.Image;
                     break;
                 case 3: fotoPrincipal.Image = fotoBrazos2.Image;
                     break;
                 case 4: fotoPrincipal.Image = fotoPanza.Image;
                     break;
                 case 5: fotoPrincipal.Image = fotoPierna.Image;
                     break;
                 case 6: fotoPrincipal.Image = fotoCuerpoEntero.Image;
                     break;

                 default:
                     break;
             }

             if (cont==6)
             {                
                 Form2 frm = new Form2();
                 frm.Show();
                 again.Visible = true;
                 again.BringToFront();


             }

         
       }

     

       private void again_Click(object sender, EventArgs e)
       {
           Application.Restart();
           
       }

       
   }
}

Eleкtro

#1
Este snippet de mi vieja biblioteca te debería servir para tus propósitos, la función busca un caracter todas las ocurrencias de un caracter y devuelve todos sus índices.

De todas formas el problema que tienes no tiene mucho misterio, también puedes leer caracter por caracter usando un For, o una pila (usando la Class Stack) podría ser mejor según tus necesidades.

VB.Net:
Código (vbnet) [Seleccionar]
   ' Find Characters
   ' ( By Elektro )
   '
   ' Usage Examples:
   ' Dim CharIndex As Integer() = FindCharacters("Elektro", "E", IgnoreCase:=True) ' Result: {0, 2}
   '
   ''' <summary>
   ''' Matches a character/string pattern in a String and returns the starting indexes of all concurrences.
   ''' </summary>
   ''' <param name="String">Indicates the string.</param>
   ''' <param name="Characters">Indicates the character(s) to find.</param>
   ''' <param name="IgnoreCase">if set to <c>true</c>, sensitive case is ignored.</param>
   ''' <returns>System.Int32().</returns>
   Public Function FindCharacters(ByVal [String] As String,
                                  ByVal Characters As String,
                                  Optional ByVal IgnoreCase As Boolean = False) As Integer()

       Return Enumerable.Range(0, [String].Length).
                         Where(Function(i As Integer) Characters.Select(Function(b1, b2) New With {b2, b1}).
                         All(Function(p) If(IgnoreCase,
                                            [String].ToLower.ToCharArray()(i + p.b2).Equals(Char.ToLower(p.b1)),
                                            [String].ToCharArray()(i + p.b2).Equals(p.b1)))).
                         ToArray()

   End Function


C#, traducción al vuelo:
Código (csharp) [Seleccionar]
// Matches a character/string pattern in a String and returns the starting indexes of all concurrences.
// ( By Elektro )
//
// Usage Examples:
// Dim CharIndex As Integer() = FindCharacters("Elektro", "E", IgnoreCase:=True) ' Result: {0, 2}
//
/// <summary>
/// Finds the characters.
/// </summary>
/// <param name="String">Indicates the string.</param>
/// <param name="Characters">Indicates the character(s) to find.</param>
/// <param name="IgnoreCase">if set to <c>true</c>, sensitive case is ignored.</param>
/// <returns>System.Int32().</returns>
public int[] FindCharacters(string String, string Characters, bool IgnoreCase = false)
{

return Enumerable.Range(0, String.Length).Where((int i) => Characters.Select((b1, b2) => new {
b2,
b1
}).All(p => IgnoreCase ? String.ToLower.ToCharArray()(i + p.b2).Equals(char.ToLower(p.b1)) : String.ToCharArray()(i + p.b2).Equals(p.b1))).ToArray();

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


Saludos