triangulo de ceros y unos vb

Iniciado por elsrtenedor, 5 Junio 2019, 23:02 PM

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

elsrtenedor

Código (vbnet) [Seleccionar]
necesito su ayuda con un programa.

necesito hacer un programa en visual basic en aplicacion windows from.NET que dibuje un triangulo de 0 y 1 en un msgbox, de n números de filas.

por ejemplo n=7

1
11
101
1001
10001
100001
1111111

por favor alguien podria decirme como se hace, llevo varias horas intentandolo y no lo consigo ni de cerca o almenos darme alguna idea. soy muy nuevo en esto

Eleкtro

#1
Citar1
11
101
1001
10001
100001
1111111

Eso más que un triángulo, sería una pirámide. Y más que dibujar (la forma de un triángulo), creo que lo que realmente quieres es imprimir texto y mostrarlo mediante un MsgBox. Pero si no especificas cuales son las reglas de formato que debe seguir la construcción de dicha pirámide entonces dudo que alguien te pueda ayudar. Por ejemplo veo que todas las filas están alineadas a la izquierda, y la longitud de las dos primeras y la última fila se imprimen solamente con el caracter "1", mientras que el resto de filas empiezan y acaban con "1" pero el resto son "0". No explicas nada. De todas formas aquí no se hacen tareas (no se me ocurre que utilidad podría tener mostrar una pirámide de ceros y unos en un MsgBox si no es por que te lo pide un ejercicio de clase). Si muestras tus intentos fallidos / progresos y aclaras con exactitud las reglas de formato de dicha pirámide, tendrás más posibilidades de que alguien pueda ayudarte...

Un saludo.








tincopasan

elsrtenedor
Citar
por favor alguien podria decirme como se hace, llevo varias horas intentandolo y no lo consigo ni de cerca
¿y qué has intentado en varias horas?

Serapis

#3
...además este no es el foro de VB.NET...

Para no dejarte al sol y que se te seque el cerebro, digamos que necesitas 2 bucles, en el externo se escriben/generan los unos, antes del bucle interno siempre escribe un 1 y a la salida del interno otro 1, y en el bucle interno los ceros.

dicho de otra manera...el bucle externo controla la 'verticalidad, el interno la horizontalidad, si bien el bucle interno comienza (por asi decirlo), un carácter '1' antes del bucle y acaba un carácter '1' después del bucle

Ahora piensa un poco... cuantos ciclos tendría el bucle externo y cuantos el interno?... intenta dibujar a lápiz primero para n=1,2,3 y luego si te funciona también con 4 (esto es , cuanto  debiera ser el valor del bucle externo e interno), y si te sigue resultando bien, es muy probable que te lo resuelva para cualquier n (eso sí, msgbox tiene un límite de caracteres).

elsrtenedor

GRACIAS NEBIRE

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filas As Integer = 0
        Dim tri As String = ""
        filas = InputBox("INGRESE UN NUMERO MAYOR A 0", "VENTANA DE CARGA")
        While (filas < 0)
            MsgBox("Introduzca solo valores mayores a 0")
            filas = InputBox("INGRESE UN NUMERO MAYOR A 0", "VENTANA DE CARGA")
        End While
            For n As Integer = 1 To filas
                For i As Integer = 1 To n
                    If i = 1 Or i = n Or n = filas Then
                        tri = tri + "1 "
                    Else
                        tri = tri + "0 "
                    End If
                Next
                tri += vbNewLine
            Next
        MsgBox("Triángulo:" + vbNewLine + vbNewLine + tri)
    End Sub

Eleкtro

#5
El código que has mostrado, puedes simplificarlo y micro-optimizarlo de la siguiente manera:

Código (vbnet) [Seleccionar]
Dim rows As UShort
Do Until (UShort.TryParse(Interaction.InputBox("INGRESE UN NÚMERO MAYOR A 0:", Me.Text),
                         NumberStyles.Integer, CultureInfo.InvariantCulture, rows))

   MessageBox.Show(Me, "Introduzca solo valores mayores a 0.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
Loop

Dim sb As New StringBuilder()
For row As UShort = 0 To (rows - 1US)
   For column As UShort = 0 To row
       sb.Append(If((column = 0) OrElse (column = row) OrElse (row = rows), "1 ", "0 "))
   Next column
   sb.AppendLine()
Next row

MessageBox.Show(Me, $"Triángulo: {String.Concat(Enumerable.Repeat(Environment.NewLine, 2))}{sb.ToString()}",
               Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)


Dependiendo de tus necesidades reales, y a menos que esto sea para un ejercicio de clase...

1. Reemplaza el tipo primitivo sin signo UShort por el tipo sin signo que sea más conveniente. Usa el tipo Byte si solamente es para mostrarlo en un MsgBox, ya que dudo que en ese caso quieras crear y mostrar más de 255 filas.

2. Deberías considerar mover/encapsular el código a una función reutilizable, que tome como parámetro la cantidad de filas, y que simplemente devuelva la cadena de texto/triángulo. Pero como sigues sin determinar las reglas de formato, he dejado el código tal y como está.

Saludos.








Serapis

#6
De entrada sigue los consejos que te recomienda Elektro...

...para continuar, la utilidad práctica de utilizar dos bucles es no requerir un condicional... esto es, al disponer de dos bucles en vez de solo uno, ya queda debidamente condicionado.

...luego me has leído solo parcialmente:
Citar...necesitas 2 bucles, en el externo se escriben/generan los unos, antes del bucle interno siempre escribe un 1 y a la salida del interno otro 1, y en el bucle interno los ceros.

...si bien el bucle interno comienza (por asi decirlo), un carácter '1' antes del bucle y acaba un carácter '1' después del bucle...
Es mas, con el tiempo y a medida que entiendas mejor la programación, verías que el bucle interno puede ser substituído por una línea con un método de string... pero para el principiante, el uso de bucles es necesario para que aprenda la lógica subyacente.

El código entonces, quedaría algo así como:
Código (vbnet) [Seleccionar]

triangulo = "1" & vbNewLine ' la cadena debe empezar ya con la primera línea, pues es la única que no lleva d '1s', que es lo que dibuja cada bucle externo.
' por eso el bucle empieza ya con 2... y si 'filas = 1' no entra pués en el bucle.
For n = 2 To filas-1  ' <---- ojo: -1, pues la ultima linea no lleva '0s', se debe generar aparte.
   triangulo.append("1")
   For i = 1 To n -2  ' <----- ojo: -2, pues esa es la cuenta de '0s' en cada linea, los dos '1s' no se escriben aqui.
         triangulo.append("0")                    
   Next
   triangulo.append("1" & vbNewLine)
Next

' la ultima linea se compone de solo '1s'.
triangulo.append(string("1", filas))  ' en este punto n=filas

messagebox.show(triangulo)


Como señalaba Elektro, mucho mejor si se coloca dentro de una función y esta recibe 1 o mas parámetros...

Código (vbnet) [Seleccionar]

Private Function TrianguloTexto(byval Filas as byte, otrosparametros, optional byref Separador as string = VBNewLine) as string
  dim Triangulo as string = "1" & separador
  dim n  as byte, i as byte

  ' básicamente copiar el código anterior aquí y remplazar los nombres d elas variables  a como aquí se denominen

  return Triangulo
End function

Luego basta invocar la función con el dato introducido por el usuario, algo así como:
Código (vbnet) [Seleccionar]

   dim filas as integer
   do
       filas = inputbox...  ' OJO: No hace falta un msgbox previo, inputbox, también puede mostrar un mensaje de texto...
   loop while filas...

   messagebox.Show(TriangularTexto( (filas))



..y para terminar, tal como señala Elektro, no tenemos una precisa descripción del problema. Por ejemplo pudiera ser que la imagen completa requiera espacios, esto es, que todas las líneas dispongan de la misma cantidad de caracteres, para que visualmente el resultado se vea como un rombo... a falta de una descripción exacta, no puede proporcionarse más solución que la dada.

p.d.: Editado, donde puse 'rombo' (párrafo anterior) en realidad debe poner 'triángulo isósceles'.