Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 12 Febrero 2016, 07:44 am



Título: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 12 Febrero 2016, 07:44 am
Hola:

Como en las películas de antes, no recuerdo en qué peli sale, un ordenador que al imprimir mensajes, se oye un ruido por cada letra muy rápido.

Hice lo de imprimir cada letra en 10 milisegundos, 0.010 segundos.

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading; // No olvidar.

namespace Texto_consola_CS
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 80;
            Console.WindowHeight = 43;

            Console.Title = "Título del programa en la ventana de la consola.";

            Console.BackgroundColor = ConsoleColor.Black; // Fondo pantalla blanco.
            Console.Clear(); // Limpiar pantalla.
            Console.ForegroundColor = ConsoleColor.Green; // Color texto azul.

            string Cadena = @"El hombre moderno es un viajero que ha olvidado el lugar de donde va, y que
ha de volver a donde viene para saber a donde va.

No busques al amigo para matar las horas, sino búscale con horas para vivir.

Los amigos se convierten con frecuencia en ladrones de nuestro tiempo.

Es difícil decir quién hace el mayor daño: los enemigos con sus peores intenciones o los amigos con las mejores.

Recorre a menudo la senda que lleva al huerto de tu amigo, no sea que la maleza te impida ver el camino.";

            Console.CursorVisible = true;

            foreach (char Letra in Cadena)
            {
                Console.Write(Letra);
                Thread.Sleep(2); //medio segundo
            }
            Console.Beep();
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }
    }
}

Al final de impresión de oye un beep. No encuentro un vídeo de ejemplo por ahora para que vean a lo que me refiero. Cuando el hombre habla con el ordenador en la película y le responde con mesajes que se oye el ruido por cada letra que escriba en pantalla.

Si alguien sabe como se hace, lo explican, no he encontrado nada igual por Internet, lo más parecido es esto.

https://msdn.microsoft.com/es-es/library/4fe3hdb1%28v=vs.110%29.aspx

Pero no es lo mismo.

Cualquier información es de ayuda.

Saludos.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 16 Febrero 2016, 01:46 am
Me respondo a  mi mismo.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using System.Threading; // No olvidar.
  8.  
  9. namespace Texto_consola_CS
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Console.WindowWidth = 80;
  16.            Console.WindowHeight = 43;
  17.  
  18.            Console.Title = "Título del programa en la ventana de la consola.";
  19.  
  20.            Console.BackgroundColor = ConsoleColor.Black; // Fondo pantalla blanco.
  21.            Console.Clear(); // Limpiar pantalla.
  22.            Console.ForegroundColor = ConsoleColor.Green; // Color texto azul.
  23.  
  24.            string Cadena = @"El hombre moderno es un viajero que ha olvidado el lugar de su destino, y que
  25. ha de volver a donde viene para saber a donde va.
  26.  
  27. No busques al amigo para matar las horas, sino búscale con horas para vivir.
  28.  
  29. Los amigos se convierten con frecuencia en ladrones de nuestro tiempo.
  30.  
  31. Es difícil decir quién hace el mayor daño: los enemigos con sus peores intenciones o los amigos con las mejores.
  32.  
  33. Recorre a menudo la senda que lleva al huerto de tu amigo, no sea que la maleza te impida ver el camino.";
  34.  
  35.            Console.CursorVisible = true;
  36.  
  37.            foreach (char Letra in Cadena)
  38.            {
  39.                Console.Write(Letra);
  40.                Console.Beep(500, 60);
  41.            }
  42.            Console.ReadKey(); // Pulse cualquier tecla para salir.
  43.        }
  44.    }
  45. }

Saludos.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Lekim en 20 Febrero 2016, 16:40 pm
Hola

Interesante tu idea y buen aporte. Pero no me convence el sonido. Creo que solo debería hacer 'tic' cuando surja un carácter y no tan seguido. Similar a una máquina de escribir pero con sonido electrónico.

Usando tu código he hecho algún cambio (está en C#). A ver que te parece.


Código:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;


static class Module1
{



public static void Main()
{


Console.WindowWidth = 80;
Console.WindowHeight = 43;

Console.Title = "Título del programa en la ventana de la consola.";

Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.


string Cadena = string.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}", Environment.NewLine, "CÓDIGO DE ACCESO:_ 59898OP-NEI56", "***CÓDIGO DE ACCESO DENEGADO***", "█ POR FAVOR, INTRODUZCA DE NUEVO EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");


Console.CursorVisible = true;

foreach (char Letra in Cadena) {
//Espera 5 segundos

System.Threading.Thread.Sleep(0.09 * 1000);
if (Letra == Convert.ToChar(Environment.NewLine)) {
System.Threading.Thread.Sleep(0.75 * 1000);
//Espera 0.75 segundos antes de hacer el salto de línea
Console.Beep(600, 100);
// beep de salto de línea
}
Console.Write(Letra);
// Hacer sonido solo cuando el caracter sea distinto de espacio
if (string.IsNullOrWhiteSpace(Letra) == false) {
Console.Beep(500, 9);
}
}
Console.ReadKey();
// Pulse cualquier tecla para salir.



}




}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================

Lo suyo sería también, poder cambiar el tipo de fuente.

Saludos



En vb.net

Código:
Module Module1

 

    Sub Main()
 

        Console.WindowWidth = 80
        Console.WindowHeight = 43

        Console.Title = "Título del programa en la ventana de la consola."

        Console.BackgroundColor = ConsoleColor.Black
        ' Fondo pantalla blanco.
        Console.Clear()
        ' Limpiar pantalla.
        Console.ForegroundColor = ConsoleColor.Green
        ' Color texto azul.


        Dim Cadena As String = String.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}", Environment.NewLine,
                                              "CÓDIGO DE ACCESO:_ 59898OP-NEI56",
                                             "***CÓDIGO DE ACCESO DENEGADO***",
                                              "█ POR FAVOR, INTRODUZCA DE NUEVO EL CÓDIGO DE ACCESO █",
                                              "CÓDIGO DE ACCESO:_ ")

  
        Console.CursorVisible = True

        For Each Letra As Char In Cadena
            'Espera 5 segundos

            System.Threading.Thread.Sleep(0.09 * 1000)
            If Letra = CChar(Environment.NewLine) Then
                System.Threading.Thread.Sleep(0.75 * 1000) 'Espera 0.75 segundos antes de hacer el salto de línea
                Console.Beep(600, 100) ' beep de salto de línea
            End If
            Console.Write(Letra)
            If String.IsNullOrWhiteSpace(Letra) = False Then ' Hacer sonido solo cuando el caracter sea distinto de espacio
                Console.Beep(500, 9)
            End If
        Next
        Console.ReadKey()
        ' Pulse cualquier tecla para salir.



    End Sub




End Module

Por cierto la película a la que te refieres podría ser JUEGOS DE GUERRA (1983) (http://www.filmaffinity.com/es/film553168.html)

(ahora que recuerdo, creo que en esta película el ordenador hablaba  ;D)



Código de acceso denegado... jaja. Bueno, me aburría y quise hacer una versión funcional. Qué recuerdos...

C#
Código:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
static class Module1
{

public static void Main()
{
Console.WindowWidth = 80;
Console.WindowHeight = 43;
Console.Title = "Retro-Consola";
Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.
Console.CursorVisible = false;
1:
string Cadena = string.Format("{0}{1}{0}{0}{2}", Environment.NewLine, "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");

Mecanografiar(Cadena);

string Entrada = Console.ReadLine;

if (Entrada == 12345) {
Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
Mecanografiar(Cadena);
} else {
Cadena = string.Format("{0}{1}{0}", Environment.NewLine, "*** CÓDIGO DE ACCESO DENEGADO ***");
Mecanografiar(Cadena);
goto 1;
}
Console.ReadKey();
}
public static void Mecanografiar(string Cadena)
{
foreach (char Letra in Cadena) {
//Espera 5 segundos
if (Letra == Convert.ToChar(Environment.NewLine)) {
System.Threading.Thread.Sleep(0.75 * 1000);
//Espera 0.75 segundos antes de hacer el salto de línea
Console.Beep(600, 100);
// beep de salto de línea
} else {
System.Threading.Thread.Sleep(0.09 * 1000);
Console.Write(Letra);
// Hacer sonido solo cuando el caracter sea distinto de espacio
if (string.IsNullOrWhiteSpace(Letra) == false) {
Console.Beep(500, 9);
}
}

}
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================


VBNET
Código:
Module Module1

    Sub Main()
        Console.WindowWidth = 80
        Console.WindowHeight = 43
        Console.Title = "Retro-Consola"
        Console.BackgroundColor = ConsoleColor.Black' Fondo pantalla blanco.
        Console.Clear()' Limpiar pantalla.
        Console.ForegroundColor = ConsoleColor.Green' Color texto azul.
        Console.CursorVisible = False
1:
        Dim Cadena As String = String.Format("{0}{1}{0}{0}{2}", Environment.NewLine,
                                            "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █",
                                            "CÓDIGO DE ACCESO:_ ")

        Mecanografiar(Cadena)

        Dim Entrada As String = Console.ReadLine

        If Entrada = 12345 Then
            Cadena = String.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine,
                                "*** CÓDIGO DE ACCESO ACEPTADO ***",
                                "████████████████████████████████████████",
                                "█     BIENVENIDO DOCTOR FRANKESTEIN    █",
                                "████████████████████████████████████████")
            Mecanografiar(Cadena)
        Else
            Cadena = String.Format("{0}{1}{0}", Environment.NewLine,
                     "*** CÓDIGO DE ACCESO DENEGADO ***")
            Mecanografiar(Cadena)
            GoTo 1
        End If
        Console.ReadKey()
    End Sub
    Sub Mecanografiar(ByVal Cadena As String)
        For Each Letra As Char In Cadena
            'Espera 5 segundos
            If Letra = CChar(Environment.NewLine) Then
                System.Threading.Thread.Sleep(0.75 * 1000) 'Espera 0.75 segundos antes de hacer el salto de línea
                Console.Beep(600, 100) ' beep de salto de línea
            Else
                System.Threading.Thread.Sleep(0.09 * 1000)
                Console.Write(Letra)
                If String.IsNullOrWhiteSpace(Letra) = False Then ' Hacer sonido solo cuando el caracter sea distinto de espacio
                    Console.Beep(500, 9)
                End If
            End If

        Next
    End Sub
End Module



Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 27 Febrero 2016, 15:30 pm
Hola:

Que buena pinta tiene el programa. Muchas gracias campeón, lo voy a probar y te cuento.

Que recuerdos. Este si que es una buena peli de hacker básico pero buena. La más nueva que salió hace poco me pareció mala en muchos aspectos, menos cuando salen cosas de programación.
(http://coliseodigital.com/wp-content/uploads/2013/05/juegos_de_guerra.jpg)

Vi la segunda parte y no es lo mismo. Lo bueno que sale el ordenador el 1.
(http://www.hispashare.com/images/titles/4664/cover.jpg)

(http://picandocodigo.net/wp-content/uploads/2008/06/wargames-03.jpg)

Ojalá salga el 3.

Probando el último código en C#, lo primero me da errores por todas partes, y nunca había visto usar goto que se aconseja no usarlo en C# ni en Visual Basic para evitar malos hábitos.

Saludos.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Lekim en 29 Febrero 2016, 17:15 pm
Probando el último código en C#, lo primero me da errores por todas partes, y nunca había visto usar goto que se aconseja no usarlo en C# ni en Visual Basic para evitar malos hábitos.
Saludos.

 :P Normal, ni siquiera lo he testeado jaja. Simplemente he usado una conversión online y luego lo pegué.

De todos modos  básicamente lo que interesa es la función Mecanografiar para hacer los efectos de sonido.

En cuanto el uso de GOTO, antiguamente en Basic se usaba muchísimo, y en tal caso no veo porqué no.  Yo tuve un ordenador Sharp que funcionaba con Basic y un Commodore64 y era bastante habitual.


Saludos



Pues, así es. En C# no funciona  :-[

Para empezar C# no permite esto (y supongo que tampoco en C++):
Código:
  System.Threading.Thread.Sleep(0.09 * 1000);

Es decir, usar un valor temporal inferior a un segundo de este modo (0.09 * 1000). En lugar de eso simplemente poner, por ejemplo:

Código:
  System.Threading.Thread.Sleep(100);

Esto es imprescindible para conseguir el efecto  de tecla (tac, tac, tac,...) pues, sólo hace un tic similar a una tecla, sin determinarse claramente que sonido suena.

[CORREGIDO EN C#]

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
public static void Main()
{
Console.WindowWidth = 80;
Console.WindowHeight = 43;
Console.Title = "Retro-Consola";
Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.
Console.CursorVisible = false;
j1:;
string Cadena = string.Format("{0}{1}{0}{0}{2}", Environment.NewLine, "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");

Mecanografiar(Cadena);
        string Entrada;
Entrada = Console.ReadLine();

if (Entrada == "12345") {
Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
Mecanografiar(Cadena);
} else {
Cadena = string.Format("{0}{1}{0}", Environment.NewLine, "*** CÓDIGO DE ACCESO DENEGADO ***");
Mecanografiar(Cadena);
            goto j1;
}
Console.ReadKey();
}

        public static void Mecanografiar(string Cadena)
        {
            foreach (char Letra in Cadena)
            {
              
                if ((Letra) == Convert.ToChar(ConsoleKey.Enter))

                {
                    System.Threading.Thread.Sleep(750);
                    //Espera 0.75 segundos antes de hacer el salto de línea
                    Console.Beep(600, 100);
                    // beep de salto de línea
                }
                else
                {
                    System.Threading.Thread.Sleep(90);
                    Console.Write(Letra);
                    // Hacer sonido solo cuando el caracter sea distinto de espacio
                    if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
                    {
                        Console.Beep(500, 9);
                    }
                }
            }
        }


       }

     }



La función para crear el efecto:
Código
  1.  
  2. public static void Mecanografiar(string Cadena)
  3.        {
  4.            foreach (char Letra in Cadena)
  5.            {
  6.  
  7.                if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
  8.                {
  9.  
  10.                    System.Threading.Thread.Sleep(750);
  11.                    //Espera 0.75 segundos antes de hacer el salto de línea
  12.                    Console.Beep(600, 100);
  13.                    // beep de salto de línea
  14.                }
  15.                else
  16.                {
  17.                    System.Threading.Thread.Sleep(90);
  18.                    Console.Write(Letra);
  19.                    // Hacer sonido solo cuando el caracter sea distinto de espacio
  20.                    if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
  21.                    {
  22.                        Console.Beep(500, 9);
  23.                    }
  24.                }
  25.            }
  26.        }
  27.  
  28.  

Para modificar la velocidad cambia el valor de 90 a menos o más según prefieras:

Código:
System.Threading.Thread.Sleep(90)

En un principio puse 130, pero es demasiado lento. Creo que 90 está bien.

Saludos



Puede usarse TimeSpan en lugar de usarse Sleep del siguiente modo:

Código
  1.     TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
  2.                    Thread.Sleep(interval);

Ejemplo:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. namespace ConsoleApplication2
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            string cadena = "Ejemplo de como usar TimeSpan..." +
  13.            Environment.NewLine  +
  14.            "... En lugar de usar Speep";
  15.  
  16.            Mecanografiar(cadena);
  17.  
  18.        }
  19.        public static void Mecanografiar(string Cadena)
  20.        {
  21.            foreach (char Letra in Cadena)
  22.            {
  23.  
  24.                if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
  25.                {
  26.                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 500);
  27.                    Thread.Sleep(interval);
  28.                    //System.Threading.Thread.Sleep(750);
  29.  
  30.                    //Espera 0.75 segundos antes de hacer el salto de línea
  31.                    Console.Beep(600, 100);
  32.                    // beep de salto de línea
  33.                }
  34.                else
  35.                {
  36.                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
  37.                    Thread.Sleep(interval);
  38.                   // System.Threading.Thread.Sleep(90);
  39.                    Console.Write(Letra);
  40.                    // Hacer sonido solo cuando el caracter sea distinto de espacio
  41.                    if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
  42.                    {
  43.                        Console.Beep(500, 9);
  44.                    }
  45.                }
  46.            }
  47.        }
  48.  
  49.  
  50.  
  51.    }
  52. }


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 1 Marzo 2016, 05:22 am
¡¡¡¡Holaaaaaaaaaaaaaa!!!!

El último código lo hicieste de p**a madre con pausas en los espacios y todo.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. namespace ConsoleApplication2
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            string cadena = "Ejemplo de como usar TimeSpan..." +
  13.            Environment.NewLine +
  14.            "... En lugar de usar Speep";
  15.  
  16.            Mecanografiar(cadena);
  17.  
  18.        }
  19.        public static void Mecanografiar(string Cadena)
  20.        {
  21.            foreach (char Letra in Cadena)
  22.            {
  23.  
  24.                if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
  25.                {
  26.                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 500);
  27.                    Thread.Sleep(interval);
  28.                    System.Threading.Thread.Sleep(750);
  29.  
  30.                    //Espera 0.75 segundos antes de hacer el salto de línea
  31.                    Console.Beep(600, 100);
  32.                    // beep de salto de línea
  33.                }
  34.                else
  35.                {
  36.                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
  37.                    Thread.Sleep(interval);
  38.                    // System.Threading.Thread.Sleep(90);
  39.                    Console.Write(Letra);
  40.                    // Hacer sonido solo cuando el caracter sea distinto de espacio
  41.                    if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
  42.                    {
  43.                        Console.Beep(500, 9);
  44.                    }
  45.                }
  46.            }
  47.        }
  48.    }
  49. }

Sólo me falta odificar los colores y hacer lo que me da la gana con tu estilo.

Por cierto, me gustó mucho esto.
(http://fotos.subefotos.com/df2095fc38b5540966b1c6939ec118b7o.png)

Me recordaste los viejos tiempos. ;)

Hay partes del código que no entiendo, nuevo para mi a la hora de presentar textos en pantalla como este pedazo de código.
Código
  1. Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
  2.                Mecanografiar(Cadena);

El string.Format.
¿Es necesario usar eso así en vez la consola Console.WreiteLine directamente?

Saludos.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Lekim en 1 Marzo 2016, 07:34 am
Hola Meta

Código:
El string.Format. 
¿Es necesario usar eso así en vez la consola Console.WreiteLine directamente?

Hombre, necesario no es, pero simplifica bastante la labor, pues {0} en este caso representa Environment.NewLine, y no tengo que estar todo el rato escribiendo Environment.NewLine.

Ejemplo:
Código:
Cadena = string.Format("{0} {1} {0} {2} ", "#0", "#1" ,"#2");,
{0} Representa "#0"
{1} Representa "#1"
{2} Representa "#2"

"Cadena"  devuelve:
Código:
#0 #1 #0 #2

Por cierto, como ves GeShi para C# no acepta carácteres especiales ASCII como este █ = (Alt + 219). Los cuales te serán muy útiles para conseguir el efecto retro, ya que se usaban estos marcos ╔═════════════════════╗ en lugar de las ventanas o cuadros de mensajes actuales.

Carácteres ASCII (http://www.internetsecurityguru.com/better_passowrds.html)




Mientras experimentaba con WriteLine para obtener el valor string de lo escrito en consola, es decir pasarlo a una variable string, he querido crear el efecto de highlightb del texto pero no lo consigo. A ver si alguien sabe como...

(http://programarcadegames.com/chapters/05_intro_to_graphics/apple3screen.png)

Podría ser algo así pero es un palo:

Código
  1.       string NL = Environment.NewLine;
  2.            string T1 = "Adt Configuration";
  3.            string T2= "DISK SLOT";
  4.            string T3 = "DISK SLOT 2";
  5.            T1 = T1.ToUpper();
  6.     Console.BackgroundColor=ConsoleColor.Green;
  7.     Console.ForegroundColor = ConsoleColor.Black;
  8.     Console.Write("{1} {0}", NL, T1);
  9.     Console.BackgroundColor = ConsoleColor.Black;
  10.     Console.ForegroundColor = ConsoleColor.Green;
  11.     Console.Write("{0}", NL);
  12.  
  13.     Console.Write("{0}  ", T2);
  14.     Console.BackgroundColor = ConsoleColor.Green;
  15.     Console.ForegroundColor = ConsoleColor.Black;
  16.     Console.Write("{0}  ", "1".PadLeft(5));


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 1 Marzo 2016, 09:11 am
Hola:

Ahora lo entiendo. ;)

Muchas gracias por la ayuda mi muy distinguido amigo. ;)


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Lekim en 1 Marzo 2016, 09:44 am
En en ejemplo con TimeSpan se me olvidó eliminar la línea 28 :-\

Ya lo he quitado

Código
  1.   //System.Threading.Thread.Sleep(750);

Creo que no comentaré nada más jeje

 saludos  ;)


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Eleкtro en 1 Marzo 2016, 11:10 am
Hola

Solo vengo a aclarar una duda que ha surgido en este post a la cual no se le ha dado una respuesta muy acertada.

La instrucción Goto está deprecada desde hace décadas, Visual Basic es un lenguaje que nació de hace décadas, y lo que sigue persistiendo en Visual Basic.Net/C# solo es por mera compatibilidad para aquellos que no quieran perder las malas costumbres al migrar a este lenguaje.

Efectivamente la utilización de la instrucción Goto es totalmente irrecomendable tanto por Microsoft en la MSDN así como de forma no-oficial en cualquier otro lenguaje que soporte Goto y por cualquier programador con los conocimientos suficientes para entender lo que su uso implica, esto se debe a muchos motivos, pero la razón principal es que al utilizarlo estamos destrozando por completo el flujo de control de cualquier algoritmo, el uso de Goto tiende a generar un código spaguetti y esto imposibilita o dificulta la correcta depuración del código.

La instrucción Goto es ineficiente, peligrosa e insegura, y actualmente es algo innecesario en un lenguaje como Vb.Net/C#, ya que .Net Framework nos ofrece una solución eficiente para cualquier tipo de situación, como por ejemplo encapsular el algoritmo en un búcle, o en un bloque try/catch, o simplemente llamar a un método, el tipo de solución más apta dependerá de las circunstancias de nuestro algoritmo claro está.

TL/DR:
Desgraciadamente Microsoft utiliza muchísimo la instrucción Goto en el código fuente de la class Microsoft.VisualBasic (funciones Left, Mid, etc...) y ese es uno de los motivos por los que siempre desaconsejo utilizar esta Class de compatibildiad que no aporta ningún beneficio al programador, no solo por eso, sino por que la lógica programada está deprecada, es de hace décadas, sin actualizaciones de rendimiento, son algoritmos lentos y sucios, y hay alternativas eficientes para cualqueir miembro de esa Class en el resto de la librería de Classes de .Net framework.

Saludos!


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Lekim en 1 Marzo 2016, 11:22 am
Solo vengo a aclarar una duda que ha surgido en este post a la cual no se le ha dado una respuesta muy correcta.

Gracias Elektro por la aclaración.


Como he dicho, se usaba antiguamente. Me cito a mi mismo:
Código:
En cuanto el uso de GOTO, antiguamente en Basic se usaba muchísimo, y en tal caso no veo porqué no.  Yo tuve un ordenador Sharp que funcionaba con Basic y un Commodore64 y era bastante habitual. 

Con "y en tal caso no veo porqué no"  quiero decir que para el sencillo ejemplo que he puesto y además emulando la consola retro, creo que se puede utilizar. Vamos que no creo que vaya a explotar el ordenador  :xD

Lo que interesaba es crear el efecto retro de sonido que pedía Meta (en el que el GOTO no interviene).

Solo quería aclarar eso.

Saludos.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Meta en 1 Marzo 2016, 14:24 pm
Efectivamente la utilización de la instrucción Goto es totalmente irrecomendable tanto por Microsoft en la MSDN así como de forma no-oficial en cualquier otro lenguaje que soporte Goto y por cualquier programador con los conocimientos suficientes para entender lo que su uso implica[...]

No comparto que el Goto no se recomiende en cualquier lenguaje de programación. El GOTO que se uso mucho es en ASM de los PIC. Lo usas si o si.

Código
  1. ; ZONA DE DATOS *******************************************************
  2.  
  3. LIST P=16F887
  4. INCLUDE <P16F887.INC>
  5. __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
  6. __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  7. __IDLOCS 0x1234
  8.  
  9. CBLOCK   0x20
  10. TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
  11. MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
  12. Relays ; Estado de los relays
  13. Estado ; Estado general
  14. ENDC
  15.  
  16. #DEFINE PEntradasB PORTB ; Define puerto de salidas.
  17. #DEFINE EntradaR1B 0 ; Define dónde se sitúa cada salidas.
  18. #DEFINE EntradaR2B 1
  19. #DEFINE EntradaR3B 2
  20. #DEFINE EntradaR4B 3
  21. #DEFINE EntradaR5B 4
  22. #DEFINE EntradaR6B 5
  23. #DEFINE EntradaR7B 6
  24. #DEFINE EntradaR8B 7
  25. #DEFINE PSalidasD PORTD
  26. #DEFINE SalidaR1D 0
  27. #DEFINE SalidaR2D 1
  28. #DEFINE SalidaR3D 2
  29. #DEFINE SalidaR4D 3
  30. #DEFINE SalidaR5D 4
  31. #DEFINE SalidaR6D 5
  32. #DEFINE SalidaR7D 6
  33. #DEFINE SalidaR8D 7
  34.  
  35. TECLA_RELE_1_ON EQU 'q' ; Código de las teclas utilizadas.
  36. TECLA_RELE_1_OFF EQU 'a'
  37. TECLA_RELE_2_ON EQU 'w'
  38. TECLA_RELE_2_OFF EQU 's'
  39. TECLA_RELE_3_ON EQU 'e'
  40. TECLA_RELE_3_OFF EQU 'd'
  41. TECLA_RELE_4_ON EQU 'r'
  42. TECLA_RELE_4_OFF EQU 'f'
  43. TECLA_RELE_5_ON EQU 't'
  44. TECLA_RELE_5_OFF EQU 'g'
  45. TECLA_RELE_6_ON EQU 'y'
  46. TECLA_RELE_6_OFF EQU 'h'
  47. TECLA_RELE_7_ON EQU 'u'
  48. TECLA_RELE_7_OFF EQU 'j'
  49. TECLA_RELE_8_ON EQU 'i'
  50. TECLA_RELE_8_OFF EQU 'k'
  51. TECLA_INICIO EQU 'z'
  52. TECLA_PARADA EQU ' ' ; Código de la tecla espaciadora, (hay un espacio,
  53. ; tened cuidado al teclear el programa).
  54. TECLA_INFO EQU 'n'
  55.  
  56. ENTER EQU 0x0A ; Código de tecla "Enter" o "Retorno de Carro".
  57. CAMBIO_LINEA EQU 0x0D ; Código para el cambio de línea.
  58.  
  59. ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM
  60. ; de datos.
  61. DE 0x00,2,3
  62.  
  63. ;****************************************************************************
  64. ;* ZONA DE CODIGOS *
  65. ;****************************************************************************
  66.  
  67. ;****************************************************************************
  68. ;* Rutina Principal *
  69. ;****************************************************************************
  70.  
  71. ORG 0x00
  72. goto Inicio
  73.  
  74. ORG 4 ; Aquí se sitúa el vector de interrupción para
  75. goto LeeEntradasVisualiza ; atender las subrutinas de interrupción.
  76.  
  77.  
  78. Inicio
  79. call LCD_Inicializa ; Inicializa el display LCD
  80. call RS232_Inicializa ; Inicializa RS232.
  81. bsf PEntradasB,EntradaR1B
  82. bsf PEntradasB,EntradaR2B
  83. bsf PEntradasB,EntradaR3B
  84. bsf PEntradasB,EntradaR4B
  85. bsf PEntradasB,EntradaR5B
  86. bsf PEntradasB,EntradaR6B
  87. bsf PEntradasB,EntradaR7B
  88. bsf PEntradasB,EntradaR8B
  89. bcf PSalidasD,SalidaR1D
  90. bcf PSalidasD,SalidaR2D
  91. bcf PSalidasD,SalidaR3D
  92. bcf PSalidasD,SalidaR4D
  93. bcf PSalidasD,SalidaR5D
  94. bcf PSalidasD,SalidaR6D
  95. bcf PSalidasD,SalidaR7D
  96. bcf PSalidasD,SalidaR8D
  97. BANKSEL CM1CON0
  98. movlw b'00000111'
  99. movwf CM1CON0
  100. movwf CM2CON0
  101. movwf CM2CON1          
  102.    BANKSEL ANSEL
  103.    clrf ANSEL
  104.    clrf ANSELH
  105.    BANKSEL TRISB
  106. movlw b'11111111'
  107.    movwf TRISB
  108. clrw
  109. clrf TRISD
  110.    BANKSEL PORTD
  111.  
  112.  
  113.  
  114. call RS232_LineasBlanco ; Visualiza unas cuantas líneas en blanco
  115. call RS232_LineasBlanco ; para limpiar la pantalla.
  116. movlw b'10001000' ; Habilita la interrupción RBI y la general.
  117. movwf INTCON
  118.  
  119. Principal ; apagadas.
  120. sleep
  121. goto Principal ; Loop Infinito
  122.  
  123. ;****************************************************************************
  124. ;* Mensajes *
  125. ;****************************************************************************
  126. Mensajes
  127. addwf PCL,F
  128. MensajeParado
  129. DT "Sistema DESACTIVADO ", 0x00
  130. Mensaje_Reles
  131. DT " 1 2 3 4 5 6 7 8 RL ", 0x00
  132. Mensaje_ON
  133. DT " 1", 0x00
  134. Mensaje_OFF
  135. DT " O", 0x00
  136. Mensaje_Cambiolinea
  137. DT ENTER, CAMBIO_LINEA, 0x00
  138. Mensaje_Mostrarlinea
  139. DT "----------------", 0x00
  140. Mensaje_Info
  141. DT "n", 0x00
  142. ; DT "FirmWare v2.15  "
  143. ; DT ENTER, CAMBIO_LINEA
  144. ; call LCD_Linea2
  145. ; DT " PIC16F887      "
  146. ; DT ENTER, CAMBIO_LINEA
  147. ; call Retardo_2s
  148. ; call LCD_Linea1
  149. ; DT " metaconta      "
  150. ; DT ENTER, CAMBIO_LINEA
  151. ; call LCD_Linea2
  152. ; DT " @gmail.com     ", 0x00
  153. ; call Retardo_2s
  154. Mensaje_Activar
  155. DT "   Todos ACTIVOS    ", 0x00
  156. Mensaje_IN
  157. DT " IN", 0x00
  158. Mensaje_OUT
  159. DT " OUT", 0x00
  160. Mensaje_Avisos
  161. DT "***    ALARMA    ***", 0x00
  162. MensajeEntradas
  163. DT ENTER, CAMBIO_LINEA
  164. DT " 1 2 3 4 5 6 7 8 IN"
  165. DT ENTER, CAMBIO_LINEA
  166. DT "-------------------"
  167. DT ENTER, CAMBIO_LINEA, 0x00
  168. FinTablaASCII
  169.  
  170.  
  171.  
  172.  
  173.  
  174. ;****************************************************************************
  175. ; Interrupción
  176. ;****************************************************************************
  177.  
  178. ;****************************************************************************
  179. ; Subrutina
  180. ;****************************************************************************
  181.  
  182.  
  183. ; btfss PEntradasC,EntradaR1C ; ¿Bit 0 del PORTA es "1"?
  184. ; goto D1_OFF
  185. ; bsf PSalidasD,SalidaR1D
  186. ; goto Principal
  187. ;D1_OFF
  188. ; bcf PSalidasD,SalidaR1D
  189.  
  190. LeeEntradasVisualiza
  191. call RS232_LineasBlanco
  192. movlw MensajeEntradas ; Nombre de las entradas.
  193. call RS232_Mensaje ; Lo visualiza en el ordenador.
  194. LeeEntrada1
  195. btfss PEntradasB,EntradaR1B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  196. goto Entrada1Cerrado ; No, está cerrada.
  197. bsf PSalidasD,SalidaR1D
  198. call VisualizaAbierto1
  199. goto LeeEntrada2
  200. Entrada1Cerrado
  201. bcf PSalidasD,SalidaR1D
  202. call VisualizaCerrado1
  203. LeeEntrada2
  204. btfss PEntradasB,EntradaR2B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  205. goto Entrada2Cerrado ; No, está cerrada.
  206. call VisualizaAbierto2
  207. goto LeeEntrada3
  208. Entrada2Cerrado
  209. call VisualizaCerrado2
  210. LeeEntrada3
  211. btfss PEntradasB,EntradaR3B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  212. goto Entrada3Cerrado ; No, está cerrada.
  213. call VisualizaAbierto3
  214. goto LeeEntrada4
  215. Entrada3Cerrado
  216. call VisualizaCerrado3
  217. LeeEntrada4
  218. btfss PEntradasB,EntradaR4B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  219. goto Entrada4Cerrado ; No, está cerrada.
  220. call VisualizaAbierto4
  221. goto LeeEntrada5
  222. Entrada4Cerrado
  223. call VisualizaCerrado4
  224. LeeEntrada5
  225. btfss PEntradasB,EntradaR5B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  226. goto Entrada5Cerrado ; No, está cerrada.
  227. call VisualizaAbierto5
  228. goto LeeEntrada6
  229. Entrada5Cerrado
  230. call VisualizaCerrado5
  231. LeeEntrada6
  232. btfss PEntradasB,EntradaR6B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  233. goto Entrada6Cerrado ; No, está cerrada.
  234. call VisualizaAbierto6
  235. goto LeeEntrada7
  236. Entrada6Cerrado
  237. call VisualizaCerrado6
  238. LeeEntrada7
  239. btfss PEntradasB,EntradaR7B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  240. goto Entrada7Cerrado ; No, está cerrada.
  241. call VisualizaAbierto7
  242. goto LeeEntrada8
  243. Entrada7Cerrado
  244. call VisualizaCerrado7
  245. LeeEntrada8
  246. btfss PEntradasB,EntradaR8B ; ¿Entrada = 1?, ¿Entrada = Abierta?
  247. goto Entrada8Cerrado ; No, está cerrada.
  248. call VisualizaAbierto8
  249. goto FinVisualiza
  250. Entrada8Cerrado
  251. call VisualizaCerrado8
  252. FinVisualiza
  253. call RS232_LineasBlanco
  254. bcf INTCON,RBIF ; Limpia el flag de reconocimiento de la
  255. retfie
  256.  
  257. ;----------------------------------------------------------------------------------------
  258.  
  259. VisualizaAbierto1
  260. call LCD_Linea2 ; Seleccionar la línea 2.
  261. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  262. call RS232_Mensaje ; en el HyperTerminal.
  263. return
  264.  
  265. VisualizaAbierto2
  266. call LCD_Linea2 ; Seleccionar la línea 2.
  267. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  268. call RS232_Mensaje ; en el HyperTerminal.
  269. return
  270.  
  271. VisualizaAbierto3
  272. call LCD_Linea2 ; Seleccionar la línea 2.
  273. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  274. call RS232_Mensaje ; en el HyperTerminal.
  275. return
  276.  
  277. VisualizaAbierto4
  278. call LCD_Linea2 ; Seleccionar la línea 2.
  279. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  280. call RS232_Mensaje ; en el HyperTerminal.
  281. return
  282.  
  283. VisualizaAbierto5
  284. call LCD_Linea2 ; Seleccionar la línea 2.
  285. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  286. call RS232_Mensaje ; en el HyperTerminal.
  287. return
  288.  
  289. VisualizaAbierto6
  290. call LCD_Linea2 ; Seleccionar la línea 2.
  291. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  292. call RS232_Mensaje ; en el HyperTerminal.
  293. return
  294.  
  295. VisualizaAbierto7
  296. call LCD_Linea2 ; Seleccionar la línea 2.
  297. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  298. call RS232_Mensaje ; en el HyperTerminal.
  299. return
  300.  
  301. VisualizaAbierto8
  302. call LCD_Linea2 ; Seleccionar la línea 2.
  303. movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
  304. call RS232_Mensaje ; en el HyperTerminal.
  305. return
  306.  
  307. VisualizaCerrado1
  308. call LCD_Linea2 ; Seleccionar la línea 2.
  309. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  310. call RS232_Mensaje ; en el HyperTerminal.
  311. return
  312.  
  313. VisualizaCerrado2
  314. call LCD_Linea2 ; Seleccionar la línea 2.
  315. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  316. call RS232_Mensaje ; en el HyperTerminal.
  317. return
  318.  
  319. VisualizaCerrado3
  320. call LCD_Linea2 ; Seleccionar la línea 2.
  321. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  322. call RS232_Mensaje ; en el HyperTerminal.
  323. return
  324.  
  325. VisualizaCerrado4
  326. call LCD_Linea2 ; Seleccionar la línea 2.
  327. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  328. call RS232_Mensaje ; en el HyperTerminal.
  329. return
  330.  
  331. VisualizaCerrado5
  332. call LCD_Linea2 ; Seleccionar la línea 2.
  333. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  334. call RS232_Mensaje ; en el HyperTerminal.
  335. return
  336.  
  337. VisualizaCerrado6
  338. call LCD_Linea2 ; Seleccionar la línea 2.
  339. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  340. call RS232_Mensaje ; en el HyperTerminal.
  341. return
  342.  
  343. VisualizaCerrado7
  344. call LCD_Linea2 ; Seleccionar la línea 2.
  345. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  346. call RS232_Mensaje ; en el HyperTerminal.
  347. return
  348.  
  349. VisualizaCerrado8
  350. call LCD_Linea2 ; Seleccionar la línea 2.
  351. movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
  352. call RS232_Mensaje ; en el HyperTerminal.
  353. return ; interrupción.
  354. ; ---------------------------------------------------------------------------
  355.  
  356. IF (FinTablaASCII>0xFF)
  357. ERROR "¡CUIDADO!: La tabla ha superado el tamaño de los"
  358. MESSG "primeros 256 bytes de memoria ROM. No funcionará correctamente."
  359. ENDIF
  360.  
  361. INCLUDE  <RS232.INC>
  362. INCLUDE  <RS232MEN.INC>
  363. INCLUDE  <LCD_4BIT.INC>
  364. INCLUDE  <LCD_MENS.INC>
  365. INCLUDE  <RETARDOS.INC>
  366. INCLUDE  <EEPROM.INC>
  367. END

GOTO para asm o ensamblador de PIC, 8085, 8086, 8088 y demás, se usa obligado por el cual está diseñado así, para lenguajes de bajo nivel. Para alto nivel como explica nuestro amigo, es como dice.

Gracias por la explicación.


Título: Re: Imitar ordenador de los cines de antes en cuanto al sonido
Publicado por: Eleкtro en 1 Marzo 2016, 14:47 pm
No comparto que el Goto no se recomiende en cualquier lenguaje de programación. El GOTO que se uso mucho es en ASM de los PIC. Lo usas si o si.

GOTO para asm o ensamblador de PIC, 8085, 8086, 8088 y demás, se usa obligado por el cual está diseñado así, para lenguajes de bajo nivel. Para alto nivel como explica nuestro amigo, es como dice.

Por supuesto, se entiende que lo que he dicho se aplica a cualquier lenguaje cuya utilización no sea obligatoria, donde no exista una alternativa en el paradigma bajo el que nos permite programar ese lenguaje.

En Batch por ejemplo también hay que utilizar Goto si o si, sería absurdo pensar que al utilizarlo en estas circunstancias es seguir malos hábitos de programación, ya que no hay elección, estamos limitados.

Como ya dije, el uso de Goto está totalmente considerado deprecado e irrecomendable desde hace décadas para todos los lenguajes de programación bajo el que nos encontremos, esto se aplica a los lenguajes actuales de alto nivel con lo s paradigmas de mayor abstracción, los lenguajes que están en continuidad, vaya, te recuerdo que ASM apareció en el año 1949, es normal pensar que FASM, MASM, Objective ASM y todos esos tengan compatibilidad con Goto y dispongan o no de una alternativa a su utilización.

Los inconvenientes del uso de GoTo se conocen desde tiempos remotos de la programación, como prueba este extracto de la declaración "Go To Statement Considered Harmful" de Edsger W. Dijkstra publicada en el año 1968:
Cita de: http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html
"The unbridled use of the go to statement has as an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. ... The go to statement as it stands is just too primitive, it is too much an invitation to make a mess of one's program."

Y algunos de los métodos propuestos en el año 1990 que nos indica la wikipedia en la documentación del paradigma de programación estructurada:
Cita de: https://en.wikipedia.org/wiki/Structured_program_theorem
Up to 1990 there were quite a few proposed methods for eliminating gotos from existing program, while preserving most of their structure. The various approaches to this problem also proposed several notions of equivalence, which are stricter than simply Turing equivalence, in order to avoid output like the folk theorem discussed above. The strictness of the chosen notion of equivalence dictates the minimal set of control flow structures needed. The 1988 JACM paper by Lyle Ramshaw surveys the field up to that point, as well proposing its own method. Ramshaw's algorithm was used for example in some Java decompilers because the Java virtual machine code has branch instructions with targets expressed as offsets, but the high-level Java language only has multi-level break and continue statements. Ammarguellat (1992) proposed a transformation method that goes back to enforcing single-exit.

Esto es lo que nos aconseja la MSDN:
Cita de: https://msdn.microsoft.com/en-us/library/69whc95c.aspx
"GoTo statements can make code difficult to read and maintain. Whenever possible, use a control structure instead."
( hay que entender que el artículo está escrito para todo el público, por eso debemos cambiar las palabras "Whenever possible" por "Whenever you don't know other way to do". )

Soluciones al uso del Goto en C#/Vb.Net ya las expliqué en mi comentario anterior.

Saludos!