Software y Aplicaciones Web

Blog de desarrollo de software y aplicaciones web

Comentarios Recientes

Comment RSS

MSDN Home Page (Argentina)


C# Corner


AspAlliance.com

Declaración

Las opiniones en este blog se proporcionan "TAL CUAL", sin garantías,  no confieren derechos y no reflejan, necesariamente, la opinión de quienes me contratan.
Algunas cuestiones que se comentan en el blog no son reales, cualquier similitud con alguna persona viva o muerta no es más que una coincidencia, tampoco significa que necesite terapia, soy asi.

© Copyright 2007-2010

Propaganda

Este sitio implementa publicidad basada en intereses
Jun
29.
2009

  Tirando Dados - Simulación

Este post muestra el código para simular la tirada de datos, el objetivo es estudiar la probabilidad que tienen de salir los distintos números.

Se trata de un ejercicio del cursos Programador .NET en Becas Control+F

 

   1:      /// <summary>
   2:      /// Escriba un programa que simule el tirar dos dados. El programa deberá utilizar 
   3:      /// una función que genere numero aleatorios para tirar el primer dado, y despues 
   4:      /// volver a utilizarla para tirar el segundo dado. La suma de los dos valores 
   5:      /// debera ser calculada. Nota: en vista de que cada dado puede mostrar un valor 
   6:      /// entero de 1 a 6 entonces la suma de los dos valores variará desde 2 hasta 12, 
   7:      /// siendo 7 la suma más frecuente y 2 y 12 las menos frecuentes. Su programa debera 
   8:      /// tirar 36000 veces los dos dados. Utilice un arreglo de una dimensión para llevar 
   9:      /// cuenta del número de veces que aparece cada suma posible. Imprima los resultados 
  10:      /// en un formato tabular. Tambien determine si los totales son razonables, es decir, 
  11:      /// existen seis formas de llegar a un 7, por lo que aproximadamente una sexta parte 
  12:      /// de todas las tiradas deberán ser 7
  13:      /// </summary>
  14:      static void Ejercicio4()
  15:      {
  16:        Console.Clear();
  17:        Console.WriteLine("Laboratorio 3 - Ejercicio 4");
  18:   
  19:        int[] valores = new int[13];  // Necesito el subindice 12
  20:        int suma = 0;
  21:        const int MAX = 360000;  // Cantidad de tiradas a realizar
  22:        // Inicialización del arreglo
  23:        for (int i = 0; i < valores.Length; ++i)
  24:        {
  25:          valores[i] = 0;
  26:        }
  27:        // Simulación de tirar dados y cuenta los valores obtenidos
  28:        for (int i = 0; i < MAX; ++i)
  29:        {
  30:          suma = TirarDado() + TirarDado();
  31:          valores[suma] += 1;
  32:        }
  33:        // Muestra los resultados
  34:        for (int i = 2; i <= 12; ++i)
  35:        {
  36:          Console.WriteLine("{0,3} - {1,8} - {2,8}%", i, valores[i], ((float) valores[i] / MAX * 100).ToString("#0.00"));
  37:        }
  38:   
  39:        Console.ReadKey();
  40:      }
  41:   
  42:      /// <summary>
  43:      /// Este objeto se utiliza para generar números pseudoaleatorios
  44:      /// </summary>
  45:      private static Random generador = new Random();
  46:   
  47:      /// <summary>
  48:      /// Simula el hecho de tirar un dado, los posibles valores van del 1 al 6
  49:      /// se utiliza un objeto que genera números pseudoaleatorios
  50:      /// </summary>
  51:      /// <returns>Valor simulado 1,2,3,4,5,6</returns>
  52:      private static int TirarDado()
  53:      {
  54:        return generador.Next(1, 7);
  55:      }

A ver si alguien tiene otra idea de cómo hacer esto.

 




Categorías: ASP.NET | Programacion



Jun
26.
2009

  Diferencias entre Visual Basic y C# - Arreglos 2

Ahora voy a continuar presentando diferencias entre Visual Basic y C# a la hora de manipular arreglos.

Se trata de otro ejercicio del curso Programador .NET de Becas Control+F, y en este caso se utiliza un generador de números pseudoaleatorios para evitarse el trabajo de ingresar los datos.

Para ello el Framework facilita una clase Random que permite generar estos números con un método donde se le indica los límites inferior y superior que se desea generar, en la documentación de este método se indica que el límite superior debe ser uno más que el valor que se desa generar.

 

Ejemplo en C#

   1:      /// <summary>
   2:      /// A cuarenta alumnos se les preguntó el nivel de calidad de los alimentos 
   3:      /// de la cafetería para alumnos en una escala de 1 a 10 (1 significa terrible 
   4:      /// y 10 significa excelente). Coloque las cuarenta respuestas en una arreglo 
   5:      /// entero y resuma los resultados de la encuesta. Realice el Histograma 
   6:      /// (utilice nuevamente asteriscos (*) para realizar el grafico)
   7:      /// </summary>
   8:      static void Ejercicio2()
   9:      {
  10:        Console.Clear();
  11:        Console.WriteLine("Laboratorio 3 - Ejercicio 2");
  12:   
  13:        int[] valores = new int[40];
  14:        Random generador = new Random();  // Objeto para generar números pseudoaleatorios
  15:   
  16:        for (int i = 0; i < 40; ++i)
  17:        {
  18:          valores[i] = generador.Next(1, 11);
  19:        }
  20:        // Inicializar el arreglo con la cuenta de valores
  21:        int[] histograma = new int[11];
  22:        for (int i = 0; i < histograma.Length; ++i)
  23:        {
  24:          histograma[i] = 0;
  25:        }
  26:        // Contar cuantas veces aparece cada calificación
  27:        for (int i = 0; i < valores.Length; ++i)
  28:        {
  29:          (histograma[valores[i]])++;
  30:        }
  31:   
  32:        for (int i = 1; i < histograma.Length; ++i)
  33:        {
  34:          Console.Write("Valor {0,2} - {1,2} veces : ", i, histograma[i]);
  35:          for (int j = 0; j < histograma[i]; ++j)
  36:          {
  37:            Console.Write("*");
  38:          }
  39:          Console.WriteLine();
  40:        }
  41:   
  42:        Console.ReadKey();
  43:      }

Vean en la línea 29 cómo se utiliza el dato que se encuentra en un arreglo (valor[i]) como subindice para acceder a un elemento del arreglo histograma.

Por esa razón es que la dimensión del arreglo histograma es de 11, para que se pueda acceder a la posicón 10. Por supuesto que se podría utilizar algo como (histograma[valores[i]-1])++ y dejar el arreglo en 10 pero queda más claro de esa manera.

Parecería que hacer esto en Visual Basic resulta más comprensible, veamos el código

Ejemplo en Visual Basic

   1:    ''' <summary>
   2:    ''' A cuarenta alumnos se les preguntó el nivel de calidad de los alimentos 
   3:    ''' de la cafetería para alumnos en una escala de 1 a 10 (1 significa terrible 
   4:    ''' y 10 significa excelente). Coloque las cuarenta respuestas en una arreglo 
   5:    ''' entero y resuma los resultados de la encuesta. Realice el Histograma 
   6:    ''' (utilice nuevamente asteriscos (*) para realizar el grafico)
   7:    ''' </summary>
   8:    Sub Ejercicio2()
   9:      Console.Clear()
  10:      Console.WriteLine("Laboratorio 3 - Ejercicio 2")
  11:   
  12:      Dim valores(40) As Integer
  13:      Dim generador As Random = New Random()  '' Objeto para generar números pseudoaleatorios
  14:      Dim i, j As Integer
  15:   
  16:      For i = 0 To 39
  17:        valores(i) = generador.Next(1, 11)
  18:      Next
  19:      '' Inicializar el arreglo con la cuenta de valores
  20:      Dim histograma(10) As Integer
  21:      For i = 0 To histograma.Length - 1
  22:        histograma(i) = 0
  23:      Next
  24:      '' Contar cuantas veces aparece cada calificación
  25:      For i = 0 To valores.Length - 1
  26:        histograma(valores(i)) += 1
  27:      Next
  28:   
  29:      For i = 1 To histograma.Length - 1
  30:        Console.Write("Valor {0,2} - {1,2} veces : ", i, histograma(i))
  31:        For j = 0 To histograma(i)
  32:          Console.Write("*")
  33:        Next
  34:        Console.WriteLine()
  35:      Next
  36:   
  37:      Console.ReadKey()
  38:    End Sub

Observen que para recorrer el arreglo utilizamos el método Length de este objeto, pero tuvimos que restarle uno porque el For ... Next de Visual Basic va hasta ese valor, que es uno más de lo que se definió.

Conclusión me quedo con la modalidad de C#, seguramente los desarrolladores acostumbrados a Visual Basic opinen distinto.

 

Finalmente les muestro el mísmo ejercicio pero obviando el arreglo de valores.

   1:      /// <summary>
   2:      /// A cuarenta alumnos se les preguntó el nivel de calidad de los alimentos 
   3:      /// de la cafetería para alumnos en una escala de 1 a 10 (1 significa terrible 
   4:      /// y 10 significa excelente). Coloque las cuarenta respuestas en una arreglo 
   5:      /// entero y resuma los resultados de la encuesta. Realice el Histograma 
   6:      /// (utilice nuevamente asteriscos (*) para realizar el grafico)
   7:      /// </summary>
   8:      static void Ejercicio2_bis()
   9:      {
  10:        Console.Clear();
  11:        Console.WriteLine("Laboratorio 3 - Ejercicio 2 bis");
  12:   
  13:        Random generador = new Random();  // Objeto para generar números pseudoaleatorios
  14:        // Inicializar el arreglo con la cuenta de valores
  15:        int[] histograma = new int[11];
  16:        for (int i = 0; i < histograma.Length; ++i)
  17:        {
  18:          histograma[i] = 0;
  19:        }
  20:        // Contar cuantas veces aparece cada calificación
  21:        for (int i = 0; i < 40; ++i)
  22:        {
  23:          (histograma[generador.Next(1, 11)])++;
  24:        }
  25:   
  26:        for (int i = 1; i < histograma.Length; ++i)
  27:        {
  28:          Console.Write("Valor {0,2} - {1,2} veces : ", i, histograma[i]);
  29:          for (int j = 0; j < histograma[i]; ++j)
  30:          {
  31:            Console.Write("*");
  32:          }
  33:          Console.WriteLine();
  34:        }
  35:   
  36:        Console.ReadKey();
  37:      }

Esto sería factible si el arreglo de valores no se desea guardar, lo que en general no ocurre; pero sirve como ejemplo.

 




Categorías: ASP.NET | Programacion



Jun
26.
2009

  Diferencias entre Visual Basic y C# - Arreglos

En este post voy a presentar las GRANDES diferencias que presenta Visual Basic y C# a la hora de manipular arreglos.

En primer lugar hay que destacar que en Visual Basic se utiliza parenteis "(" y ")" para encerrar los subíndices de un arreglo, en cambio en C# se utiliza corchetes "[" y "]", lo que realmente me complica la vida porque tengo asumido que los paréntesis se usan en las fuciones para encerrar la lista de parámetros.

Las formas en que se declaran presentan una diferencia importante, en C# es necesario "crear" el arreglo mientras que en Visual Basic es el compilador el que realiza esta tarea.

    Dim numeros(10) As Integer
    int[] numeros = new int[10];

Otra cuestión muy importante es que en la declaración o creación se indica el tamaño o dimensión del arreglo, este valor se supone indica cuantos elementos hay en el arreglo.

Hay que recordar que los subíndices de los arreglos en ambos lenguajes comienzan en 0 (cero), de manera que en C# se puede acceder a las posiciones 0, 1, 2, ..., 9; sin embargo en Visual Basic se puede acceder a las posiciones 0, 1, 2, ..., 9, 10 lo que agrega un elemento más al arreglo.

 

A continuación tenemos un ejercicio del curso de Programación .NET de Becas Control+F, en ambos lenguajes se utiliza un procediminto para mostrar el arreglo (el código está más adelante)

en C#

    /// <summary>
/// Utilice la estructura de repetición For Next para inicializar los elementos
/// de un array entero de diez elementos, e imprima el arreglo en formato tabular
/// Inicialice con números pares
/// Inicialice con números impares
/// Inicialice con múltiplos de tres
/// </summary>
static void Ejercicio1()
{
Console.Clear();
Console.WriteLine("Laboratorio 3 - Ejercicio 1");

int[] numeros = new int[10];

for (int i = 0; i < 10; ++i)
{
numeros[i] = (i + 1) * 2;
}
MostrarArray("Pares ", numeros);

for (int i = 0; i < 10; ++i)
{
numeros[i] = (i + 1) * 2 - 1;
}
MostrarArray("Impares ", numeros);

for (int i = 0; i < 10; ++i)
{
numeros[i] = (i + 1) * 3;
}
MostrarArray("Multiplos de tres", numeros);

Console.ReadKey();
}

Es importante destacar que el subindice que recorre el arreglo comienza en 0 (cero) y se mantienen en el bucle mientras sea menor que 10 (diez) que resulta ser la dimensión del arreglo.

en Visual Basic

  ''' <summary>
''' Utilice la estructura de repetición For Next para inicializar los elementos
''' de un array entero de diez elementos, e imprima el arreglo en formato tabular
''' Inicialice con números pares
''' Inicialice con números impares
''' Inicialice con múltiplos de tres
''' </summary>
Sub Ejercicio1()
Console.Clear()
Console.WriteLine("Laboratorio 3 - Ejercicio 1")

Dim numeros(10) As Integer
Dim i As Integer

For i = 0 To 10
numeros(i) = (i + 1) * 2
Next
MostrarArray("Pares ", numeros)

For i = 0 To 10
numeros(i) = (i + 1) * 2 - 1
Next
MostrarArray("Impares ", numeros)

For i = 0 To 10
numeros(i) = (i + 1) * 3
Next
MostrarArray("Multiplos de tres", numeros)

Console.ReadKey()
End Sub

Más allá de las diferencias en la sentencia de control For ... Next del Visual Basic con el for(...; ...; ...) de C#, el código es bastante parecido.

Pero es importante destacar que el For ... Next de Visual Basic va desde el valor inicial hasta (incluido) el valor final en este caso desde 0 (cero) hasta 10 (diez) lo que resulta en 11 (once) posiciones.

Esto lo podemos solucionar bastante facil; NOS OLVIDAMOS QUE HAY UN ELEMENTO EN LA POSICIÓN 0 (CERO) y entonces manipulamos 10 (diez) elementos desde las posiciones 1 (uno) hasta la 10 (diez) como si fuese Pascal Surprised.

El problema lo tenemos ahora en el procedimiento que muestra el arreglo. Resulta que al utilizar una estructura FOR EACH ... NEXT de Visual Basic o foreach( ... ) de C# no se puede indicar a partir de qué elemento procesamos el arreglo, los procesa todos.

en Visual Basic

  ''' <summary>
''' Muestra un arreglo de enteros
''' </summary>
''' <param name="mensaje">Mensaje o rótulo a mostrar</param>
''' <param name="arreglo">arreglo de enteros</param>
Sub MostrarArray(ByVal mensaje As String, ByVal arreglo() As Integer)
Console.Write("{0}: ", mensaje)
For Each num As Integer In arreglo
Console.Write("{0,4}", num)
Next
Console.WriteLine()
End Sub

en C#

    /// <summary>
/// Muestra un arreglo de enteros
/// </summary>
/// <param name="mensaje">Mensaje o rótulo a mostrar</param>
/// <param name="arreglo">arreglo de enteros</param>
static void MostrarArray(string mensaje, int[] arreglo)
{
Console.Write("{0}: ", mensaje);
foreach (int num in arreglo)
{
Console.Write("{0,4}", num);
}
Console.WriteLine();
}

Como pueden ver el código de MostrarArray (salvo las diferencias del lenguaje) es semánticamente identico, muestra todos los elementos que hay en el arreglo

El inconveniente es que al declarar en Visual Basic y en C# el tamaño del arreglo para 10 (diez) elementos, en Visual Basic nos agrega uno más.

Esto no es un error, es simplemente una cuestión que presenta el Visual Basic para mantener compatibilidad con las versiones anteriores de este lenguaje. De todos modos es muy molesto.

 




Categorías: ASP.NET | Programacion



Jun
20.
2009

  Diferencias entre Visual Basic y C#

En este post me interesa mostrar un par de aspectos básicos que me llaman la atención en la programación con Visual Basic y C#

Más allá de mi preferencia por los lenguajes de programación C#, C++ o simplemente C; cuando se desarrolla en la plataforma .NET siempre es posible encontrarse con código escrito en Visual Basic. De manera que debemos conocer algunas pequeñas diferencias que se encuentran. A medida que encuentre estos tips iré comentándolos.

En el siguiente ejercicio lo que me llama la atención es cómo Visual Basic tiene la capacidad de convertir una cadena de texto en un entero directamente desde la consola, lo que en C# debe especificarse con Convert.ToInt32(...)

Otra cosa que es importante destacar es la posibilidad que brinda Visual Basic de realizar divisiones enteras o no, esto lo pueden ver en el resultado de las líneas 19 y 20 del código en Visual Basic, esto tampoco es posible en C# que al dividir enteros presenta un resultado entero. Por supuesto que si deseamos el resultado con decimales hay que hacer una conversión (cast) entonces la división se realizará en ese otro tipo de dato.


Ejercicio 1 en Visual Basic

   1:    ''' <summary>
   2:    ''' Escriba un programa que solicite al usuario que introduzca dos números, 
   3:    ''' tome los dos números del usuario, e imprima la suma, el producto, 
   4:    ''' la diferencia, el cociente y el módulo del número
   5:    ''' </summary>
   6:    Sub Ejercicio1()
   7:      Console.Clear()
   8:      Console.WriteLine("Laboratorio 1 - Ejercicio 1")
   9:   
  10:      Dim num1, num2 As Integer
  11:      Console.WriteLine("Ingrese dos números")
  12:      Console.Write("Número 1: ")
  13:      num1 = Console.ReadLine()
  14:      Console.Write("Número 2: ")
  15:      num2 = Console.ReadLine()
  16:      Console.WriteLine("Suma       : {0}", num1 + num2)
  17:      Console.WriteLine("Producto   : {0}", num1 * num2)
  18:      Console.WriteLine("Diferencia : {0}", num1 - num2)
  19:      Console.WriteLine("Cociente   : {0}", num1 / num2)
  20:      Console.WriteLine("Cociente(*): {0}", num1 \ num2)
  21:      Console.WriteLine("Módulo     : {0}", num1 Mod num2)
  22:      Console.ReadKey()
  23:    End Sub

Ejercicio 1 en C#

   1:      /// <summary>
   2:      /// Escriba un programa que solicite al usuario que introduzca dos números, 
   3:      /// tome los dos números del usuario, e imprima la suma, el producto, 
   4:      /// la diferencia, el cociente y el módulo del número
   5:      /// </summary>
   6:      static void Ejercicio1()
   7:      {
   8:        Console.Clear();
   9:        Console.WriteLine("Laboratorio 1 - Ejercicio 1");
  10:   
  11:        int num1, num2;
  12:        Console.WriteLine("Ingrese dos números");
  13:        Console.Write("Número 1: ");
  14:        num1 = Convert.ToInt32(Console.ReadLine());
  15:        Console.Write("Número 2: ");
  16:        num2 = Convert.ToInt32(Console.ReadLine());
  17:        Console.WriteLine("Suma       : {0}", num1 + num2);
  18:        Console.WriteLine("Producto   : {0}", num1 * num2);
  19:        Console.WriteLine("Diferencia : {0}", num1 - num2);
  20:        Console.WriteLine("Cociente   : {0}", num1 / num2);
  21:        Console.WriteLine("Módulo     : {0}", num1 % num2);
  22:        Console.ReadKey();
  23:      }

 


El siguiente ejercicio permite mostrar una alternativa o técnica para validar el ingreso efectivo de un tipo de dato. En este caso se pretende ingresar un número entero y se utiliza un bucle que itera hasta que se produce el ingreso efectivo del número.

He codificado el mismo ejercicio en C# y en Visual Basic, observen que salvo las pequeñas diferencias de sintáxis son iguales. Sin embargo Visual Basic tiene la posibilidad de utilizar el "Do ... Loop Until ..." que no necesita de la negación porque es similar a la estructura que nos enseñan en pseudocódigo "Repetir ... Hasta que ...", mientras que la estructura de C# sería algo como "Repetir ... Mientras ..." lo que la mayoría de las veces confunde a los que no están acostumbrados.

Ejercicio 7 en C#

    /// <summary>
    /// Escriba un programa que entre un número de cinco digitos, separe el número 
    /// en sus dígitos individuales e imprima los digitos separados unos de otros 
    /// mediante tres espacios. 
    /// Por ejemplo, si el usuario escribe 42339 el programa debería imprimir 4 2 3 3 9
    /// </summary>
    static void Ejercicio7()
    {
      Console.Clear();
      Console.WriteLine("Laboratorio 1 - Ejercicio 7");
 
      int num1, dig1, dig2, dig3, dig4, dig5;
      //num1 = Convert.ToInt32(Console.ReadLine());
      do
      {
        Console.Write("Ingrese un Número: ");
      } while (!Int32.TryParse(Console.ReadLine(), out num1));
 
      dig5 = num1 % 10;
      dig4 = (num1 / 10) % 10;
      dig3 = (num1 / 100) % 10;
      dig2 = (num1 / 1000) % 10;
      dig1 = (num1 / 10000) % 10;
      Console.WriteLine("Digitos: {0}   {1}   {2}   {3}   {4}", dig1, dig2, dig3, dig4, dig5);
      Console.ReadKey();
    }

Ejercicio 7 en Visual Basic

  ''' <summary>
  ''' Escriba un programa que entre un número de cinco digitos, separe el número 
  ''' en sus dígitos individuales e imprima los digitos separados unos de otros 
  ''' mediante tres espacios. 
  ''' Por ejemplo, si el usuario escribe 42339 el programa debería imprimir 4 2 3 3 9
  ''' </summary>
  Sub Ejercicio7()
    Console.Clear()
    Console.WriteLine("Laboratorio 1 - Ejercicio 7")
 
    Dim num1, dig1, dig2, dig3, dig4, dig5 As Integer
    ''num1 = Convert.ToInt32(Console.ReadLine())
    Do
      Console.Write("Ingrese un Número: ")
    Loop While Not Integer.TryParse(Console.ReadLine(), num1)
 
    dig5 = num1 Mod 10
    dig4 = (num1 \ 10) Mod 10
    dig3 = (num1 \ 100) Mod 10
    dig2 = (num1 \ 1000) Mod 10
    dig1 = (num1 \ 10000) Mod 10
    Console.WriteLine("Digitos: {0}   {1}   {2}   {3}   {4}", dig1, dig2, dig3, dig4, dig5)
    Console.ReadKey()
  End Sub

Para probarlo deben cambiar en el código anterior las siguientes líneas

    Do
      Console.Write("Ingrese un Número: ")
    Loop Until Integer.TryParse(Console.ReadLine(), num1)

 




Categorías: ASP.NET | Programacion



Jun
20.
2009

  Becas Control F - Instructor

Como ya comenté en el post sobre Becas Control+F, se trata de un programa implementado en la Argentina por el gobierno nacional que otorga "becas" a personas interesadas en aprender ciertas herramientas vinculadas a las tecnologías informáticas.

La cuestión es que soy el instructor de uno de los cursos de Programación .NET, en el que se brinda capacitación en la plataforma de desarrollado de Microsoft desde los conceptos básicos de programación hasta los últimos aspectos que incorpora esta plataforma. Voy a aprovechar esto para publicar ejemplos de programación que le servirán a los becarios y a cualquier otra persona.

En la siguente página Ejemplos de Programación iré incorporando un índice a los ejemplos.

Espero que sirva.

 




Categorías: Programacion