viernes, 26 de agosto de 2011

Examen Final

Instrucciones para todos (Vespertino y Nocturno):


  1. El exámen será basado en la base de datos Chinook. Si no la tienen pueden bajarla aqui.  Este archivo es un script que tendrán que ejecutar en el sql server a como lo hicimos en clase.
  2. El programa a desarrollar constará de tres pantallas
    a) El Menu Principal
    b) Un mantenimiento de una tabla de la base de datos
    c) Una pantalla para mostar la consulta en la base de datos de un grupo de registros en un datagridview.
  3. El exámen deberán enviarlo por correo a más tardar el día Domingo para corregirlos y registrar las notas el día Lunes 29/08/2011.  Si el correo no llega el día requerido nos vemos en el extraordinario.
GRUPOS:

Matutino
GRUPO 1 : Meylling / Milvia   Examen 1
GRUPO 2:  Samuel / David      Examen 1
GRUPO 3:  Hellen                    Examen 2
GRUPO 4:  José Luis / Jarvin   Examen 2
GRUPO 5:  Ana / Lestwin        Examen 1

Nocturno
GRUPO 1:  Martin / Heidi          Examen 1
GRUPO 2:  Vanessa / Wendy    Examen 2


Menu Principal:
Debe contener lo que ustedes quieran, un menu, dos botones, lo que sea, para poder accesar a las dos pantallas principales que son el mantenimiento y la consulta a la base con el SqlDataAdapter.

Por ejemplo imaginemos que tenemos tres formularios:
Form1  - El menui
Form2  - El mantenimiento de clientes
Form3  - El formulario con el datagridview

Si tomamos el Form1 y le colocamos dos botones (button1 y button2) , podemos ponerle al texto de cada uno "Mantenimiento de Clientes" y "Resumen de Clientes por Ciudad" respectivamente.  Si tomamos el botón 1 le damos click deberíamos llamar al otro formulario de mantenimiento mediante la siguiente sintaxis

Form2 f = new Form2();
f.ShowDialog();

y así con el otro formulario.

EXAMENES

Examen 1:
Cree un programa que permita hacer el mantenimiento de la tabla de Empleados de la base de datos Chinook (Employee).  Este mantenimiento debe permitir crear nuevos empleados, consultar un empleado o eliminar uno ya creado.  Tomar cuidad al ingresar que en el campo ReportsTo (Reporta a ) hay que colocar a un empelado existente para que el nuevo le reporte..

En el mismo programa en un segundo formulario mostrar en un datagridview el número de clientes por ciudad y en un cuadro de texto cuantos se registro se devuelven en el datatable ocupado para cargar el datagridview

Examen 2:
Crear un programa que permita el mantenimiento de la tabla  de clientes (Customers).  El programa debe permitir incluir clientes, borrar clientes, y consultar un cliente.  En el segundo formulario mostrar en un datagridview el monto total (de la tabla Invoices) comprado por cada cliente (hacer una unión entre la tabla Customer y la tabla Invoice).






miércoles, 22 de junio de 2011

Ejemplo realizado sobre Clases

Ejercicio de la cuenta bancaria.  En este ejercicio se pretende simular el comportamiento de una Cuenta de un banco. La cuenta se puede crear y al hacer esto se crea un objeto a partir de una clase.  La clase deberá contar con los campos necesarios para obtener el número de la cuenta, el nombre del titular, el tipo de cuenta y el saldo inicial.  Además deberíamos tener los métodos para poder efectuar depósitos y retiros en la cuenta.  Para los retiros debemos validar si el saldo que se tiene en la cuenta es suficiente para realizar el retiro en caso contrario no se debe permitir hacer el retiro.  Para el método retiro se pude hacer un método que devuelva un valor verdadero o falso para saber si se efectúa el retiro o no.  Si el saldo el suficiente se debería efectuar la operación.

Usaremos dos formularios el principal será el que creará la cuenta bancaria a partir de una clase llamada CuentaBancaria y el segundo formulario será para realizar retiros. En el código aprenderemos también como se hacen los métodos y además como podemos usar variables públicas para pasar de un formulario a otro ya sea una variable o un objeto.

El código se adjunta en el siguiente enlace para que lo prueben. Es el mismo que hicimos en clase.

Ejercicio Cuenta Bancaria

Toca a ustedes hacer el formulario para hacer los depósitos a la cuenta.

Programación Orientada a Objetos en C#

La programación en C# está fuertemente ligada a la POO. De hecho todo en C# es una clase (o casi todo). Por ejemplo cuando usamos programas en modo consola, utilizamos la Clase Console para usar los métodos WriteLine, ReadLine, ReadKey, etc.

Una clase es una colección de código y de variables. Las clases gestionan el estado, en forma de las variables que contienen y comportamientos en forma de los métodos que contienen. Sin embargo una clase es solo una plantilla. Nunca se crea una clase en el código, en su lugar se crean objetos.

Los objetos son casos concretos de una clase. Los objetos se construyen usando una clase como plantilla. Cuando se crea un objeto, este gestiona su propio estado. El estado de un objeto puede ser diferente de otro de la misma clase.

Como declarar una clase
Una clase se declara de acuerdo al siguiente diseño
  • Modificadores de clase opcionales
  • La palabra clave class
  • Un identificador que da nombre a la clase
  • Información opcional de la clase base
  • El cuerpo de la clase
La declaración mínima de una clase en C# es parecida a la siguiente:
class miclase
{
}

Las llaves delimitan el cuerpo de la clase. Los métodos, variables, campos, propiedades y otros componentes de clase van dentro de las llaves.

El cuerpo de la clase puede incluir instrucciones cuya función se incluya en una de estas categorías


  • Constantes
  • Campos
  • Métodos
  • Propiedades
  • Eventos
  • Indizadores
  • Operadores
  • Constructores
  • Destructores
  • Tipos

Trabajo con Métodos

TRABAJO CON METODOS
Los métodos son bloques de instrucciones que devuelven algún tipo de valor cuando se ejecutan.  Pueden ser llamados mediante el nombre y llamar a un método hace que las instrucciones del método se ejecuten y regresen a la línea siguiente después del llamado en el código.  Un método especial de C# es el método Main().  Aunque C# permite poner todo el código en el método Main() probablemente quiera definir sus clases para definir más de un método.

Estructura de un método
Como mínimo un método está compuesto de las siguientes partes
  • Tipo devuelto
  • Nombre del método
  • Lista de parámetros
  • Cuerpo del método
Todos los métodos se encierran en una clase.  No puede existir un método fuera de una clase
Tipo devuelto
Un método comienza definiendo el tipo de dato que devolverá cuando se llame.  Por ejemplo, suponga que quiere escribir un método  que suma dos números enteros y devuelve el resultado.  En este caso si los números son enteros deberá escribir int.  

C# también permite que un método no devuelva nada. Por ejemplo puede ser que escriba un método que muestre algo en un formulario o en la consola, pero no calcule ningún dato.  En este caso puede usar la palabra clave void para indicar al compilador de C# que el método no devuelve ningún dato.  Esto es similar en C++ y en Java.

Si se quiere devolver un valor de un método se usa la palabra clave return para especificar el valor que debe devolverse.  La palabra clave va seguida de una variable o expresión.

Nombre del Método
Todos los métodos deben tener un nombre.  El nombre del método es un identificador y deben seguir las normas de la nomenclatura de cualquier identificador.

Lista de Parámetros
Se pueden llamar a los métodos con los parámetros que se usan para pasar los datos al método.   Por ejemplo si queremos sumar dos números, entonces deberemos pasar estos dos números al método para que realice los cálculos y devuelva como resultado su suma.  La lista de parámetros deberá estar entre paréntesis enseguida del nombre del método.  Cada parámetro de la lista está separado con una coma e incluye el tipo de dato seguido por su nombre.

Ambito
Los métodos también puede tener un ámbito, es decir, hasta donde pueden ser visibles.  Si un método es privado (private) solo podrá ser visible dentro de la clase que lo contiene, pero si es público (public), podrá ser visible en todo el programa.  Si usamos métodos en la clase Program, es muy seguro que debamos colocar a nuestro método la palabra reservada static, esto debido a que está declarada el método Main() como static.

Ejemplo
Tomemos con ejemplo el Ejemplo2 del artículo anterior donde calculámos la nota final del estudiante.  En ese ejercicio hacemos dos cálculos, el primero es la nota final y el segundo el estado del estudiante.  Podríamos crear dos métodos para cada cálculo.  





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejemplo2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Declaramos la variables a utilizar
            int np1, np2, nta, nef;
            String nombre;
            String carnet;
            String estado;

            // Obtener los datos
            Console.WriteLine("CALCULO DE NOTA FINAL");
            Console.WriteLine("=====================");
            Console.Write("No. Carnet del Estudiante : ");
            carnet = Console.ReadLine().ToString();
            Console.Write("Nombre del Estudiante     : ");
            nombre = Console.ReadLine().ToString();
            Console.Write("Nota del Primer Parcial   : ");
            np1 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota del Segunda Parcial  : ");
            np2 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Trabajo Acumulado    : ");
            nta = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Exámen Final         : ");
            nef = Convert.ToInt32(Console.ReadLine());

            // Calcular la nota final
            int nf = CalcularNF(np1, np2, nta, nef)
            
            // Obtener el estado
            estado = ObtenerEstado(nf);


            // Imprimir el resultado
            Console.WriteLine("La nota final es {0} y su estado es {1}", nf, estado);

            // Esto lo ponemos para que se detenga la pantalla y nos deje ver el
            // resultado
            Console.ReadKey();
        }

        static int CalcularNF(int n1, int n2, int ta, int ef)
        {
            int notafinal = Convert.ToInt32(np1 * 0.20 + np2 * 0.20 + nta * 020 + nef * 0.4);
            return notafinal;
        }

        static String ObtenerEstado(int nota)
        {
            String estado;

            // Verificar el estado en base a su nota
            if (nf >= 70)
            {
                estado = "APROBADO";
            }
            else
            {
                estado = "REPROBADO";
            }
            return estado;
        }

    }
}

Note que tenemos dos métodos nuevos llamados CalcularNF y ObtenerEstado. Si quisieramos ahorrar variables y memoria al programa podríamos usarlos directamente al mandar imprimir el resultado en este caso nuestro programa quedaría así.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejemplo2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Declaramos la variables a utilizar
            int np1, np2, nta, nef;
            String nombre;
            String carnet;

            // Obtener los datos
            Console.WriteLine("CALCULO DE NOTA FINAL");
            Console.WriteLine("=====================");
            Console.Write("No. Carnet del Estudiante : ");
            carnet = Console.ReadLine().ToString();
            Console.Write("Nombre del Estudiante     : ");
            nombre = Console.ReadLine().ToString();
            Console.Write("Nota del Primer Parcial   : ");
            np1 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota del Segunda Parcial  : ");
            np2 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Trabajo Acumulado    : ");
            nta = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Exámen Final         : ");
            nef = Convert.ToInt32(Console.ReadLine());

            // Imprimir el resultado
            Console.WriteLine("La nota final es {0} y su estado es {1}", CalcularNF(np1, np2, nta, nef), ObtenerEstado(CalcularNF(np1, np2, nta, nef));

            // Esto lo ponemos para que se detenga la pantalla y nos deje ver el
            // resultado
            Console.ReadKey();
        }

        static int CalcularNF(int n1, int n2, int ta, int ef)
        {
            int notafinal = Convert.ToInt32(np1 * 0.20 + np2 * 0.20 + nta * 020 + nef * 0.4);
            return notafinal;
        }

        static String ObtenerEstado(int nota)
        {
            String estado;

            // Verificar el estado en base a su nota
            if (nf >= 70)
            {
                estado = "APROBADO";
            }
            else
            {
                estado = "REPROBADO";
            }
            return estado;
        }

    }
}

martes, 21 de junio de 2011

Ejercicios Resueltos

Voy a presentarles cinco ejercicios resueltos en modo consola y posteriormente les dejaré otros cinco ejercicios para ser resueltos por Ustedes y entregados a más tardar el día 29 de Junio 2011.

Ejemplo1:  Suma de los números del 1 al 100.  Para realizar el ejercicio debemos tener claro que lo que queremos hacer es encontrar la suma de todos los números desde el 1 al 100, es decir realizar la operación siguiente:
suma = 1 + 2 + 3 + 4 + 5 + 6 + ....... + 100
y encontrar el resultado.
La solución a esto es utilizar un ciclo for inicializando el contador i en 1, la condición para que el ciclo repita las instrucciones será i <= 100, es decir que mientras el valor de i sea menor o igual a 100 repetirá las instrucciones necesarias.  En cada vuelta del ciclo la i debe ser incrementada en 1 (i++).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejemplo1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Sumar los números del 1 al 100
            int suma = 0;
            for (int i = 1; i <= 100; i++)
            {
                suma = suma + i;
            }
            Console.WriteLine("LA SUMA DE LOS NUMEROS ES {0}", suma);
            Console.ReadKey();
        }
    }
}

Ejemplo No. 2
Encontrar la nota final de un estudiante asumiendo que el estudiante realiza durante el cuatrimestre dos exámenes parciales, cada uno con un valor de un 20% sobre la nota final, un trabajo acumulado con un valor del 20% y un exámen final con un valor de 40% sobre la nota final. En base a la nota final obtenida debemos encontrar el estado del estudiante el cual puede ser aprobado o reprobado. Se toman como aprobados las de 70 a más.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejemplo2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Declaramos la variables a utilizar
            int np1, np2, nta, nef;
            String nombre;
            String carnet;
            String estado;

            // Obtener los datos
            Console.WriteLine("CALCULO DE NOTA FINAL");
            Console.WriteLine("=====================");
            Console.Write("No. Carnet del Estudiante : ");
            carnet = Console.ReadLine().ToString();
            Console.Write("Nombre del Estudiante     : ");
            nombre = Console.ReadLine().ToString();
            Console.Write("Nota del Primer Parcial   : ");
            np1 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota del Segunda Parcial  : ");
            np2 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Trabajo Acumulado    : ");
            nta = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nota Exámen Final         : ");
            nef = Convert.ToInt32(Console.ReadLine());

            // Calcular la nota final
            int nf = Convert.ToInt32(np1 * 0.20 + np2 * 0.20 + nta * 020 + nef * 0.4);

            // Verificar el estado en base a su nota
            if (nf >= 70)
            {
                estado = "APROBADO";
            }
            else
            {
                estado = "REPROBADO";
            }

            // Imprimir el resultado
            Console.WriteLine("La nota final es {0} y su estado es {1}", nf, estado);

            // Esto lo ponemos para que se detenga la pantalla y nos deje ver el
            // resultado
            Console.ReadKey();
        }
    }
}



Aplicaciones en Modo Consola

Estas aplicaciones utilizan la consola para la entrada y salida de información.  Este había sido la forma de comunicación entre el usuario y la pantalla hasta la aparición de las aplicaciones gráficas como formularios de windows o aplicaciones web.


En Visual Studio 2008 es fácil crear aplicaciones en modo consola, sobre todo para C#.  Es más o menos parecido a crear aplicaciones para java en modo consola.


Para hacer una aplicación en modo consola en C#, iniciemos el Visual Studio utlizando C#, vamos a File (Archivo) / New (Nuevo) / Project (Proyecto).  Aparecerá una pantalla como la siguiente

Aquí usted podrá colocar el nombre de la aplicación consola, la ubicación del proyecto y el nombre de la solución.


Un programa en modo consola solo creará el archivo Program.cs el cual tendrá la estructura siguiente



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejemplo1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}


El acceso a la consola lo facilita la clase Console, declarada en el espacio de nombres System. Esa clase proporciona la compatibilidad básica para aplicacionesque leen y escriben caracteres en la consola. No es necesario realizar ninguna acción para poder obtener datos de la consola a partir de la entrada estándar (teclado) o presentarlos en la salida estándar (consola) ya que estos flujos (junto con el del error estándar) se asocian a la consola de manera automática, como ocurre en C++, por ejemplo, con cincout y cerr.
Los métodos básicos de la clase Console son WriteLine y ReadLine, junto con sus variantes Write y Read:


  • WriteLine escribe una línea en la salida estándar, entendiendo que escribe el terminador de línea actual (por defecto la cadena "\r\n").
    La versión más simple de este método recibe un único argumento (una cadena) cuyo valor es el que se muestra:
    Console.WriteLine ("!Hola, " + "mundo!"); 
       // Escribe: !Hola, mundo!
    
    Otra versión permite mostrar variables de diferentes tipos (sin necesidad de convertirlas a string. La llamada tiene un número indeterminado de argumentos: el primero es una cadena de formato en la que las variables a mostrar se indican con {0}{1}, etc. y a continuación se enumeran las variables a mostrar, entendiendo que la primera se "casa" con {0}, la segunda con {1}, etc. Esta manera de mostrar los datos recuerda a la instrucciónprintf de C, que cayó en desuso con C++ ...
    int TuEdad = 25; 
       string TuNombre = "Pepe";
       Console.WriteLine ("Tienes {0} años, {1}.", TuEdad, TuNombre); 
       // Escribe: Tienes 25 años, Pepe.
    
  • El método Write hace lo mismo que WriteLine aunque no escribe el terminador de línea.
  • ReadLine lee la siguiente línea de caracteres de la secuencia de entrada estándar (el teclado, por defecto), eliminando del buffer de entrada el terminador de línea. Devuelve la cadena leida, que no contiene el carácter o los caracteres de terminación.
  • Read lee el siguiente carácter de la secuencia de entrada estándar y devuelve un valor de tipo int. La lectura se realiza del buffer de entrada y no se termina (no devuelve ningún valor) hasta que se encuentra al caracter de terminación (cuando el usuario presionó la tecla ENTER). Si existen datos disponibles en el buffer, la secuencia de entrada contiene los datos introducidos por el usuario, seguidos del carácter de terminación.


Veamos un sencillo ejemplo sobre el uso de estos métodos.

E/S simple
using System;

class PideNombre
{
   static void Main(string[] args)
   {
      Console.Write ("Introduzca su nombre: ");    // 1 
      string nombre = Console.ReadLine();          // 2
      
      Console.WriteLine ("Su nombre es: " + nombre);//3
      Console.ReadLine();                           //4
   }
}
La instrucción 1 muestra la cadena Introduzca su nombre: pero no avanza a la siguiente línea de la consola, por lo que cuando se ejecuta la instrucción 2 lo que escribe el usuario se muestra a continuación, en la misma línea. La cadena que escribe el usuario se guarda en la variable nombre y se elimina del buffer de entrada el terminador de línea. Cuando se valida la entrada (al pulsar ENTER) se avanza a la siguiente línea. La instrucción 3 muestra una cadena, resultado de concatenar un literal y la cadena introducida por el usuario. Finalmente, la instrucción 4 es necesaria para detener la ejecución del programa (realmente, la finalización del mismo) hasta que el usuario pulse ENTER. Observar que aunque el métodoReadline devuelva una cadena, éste valor devuelto no es usado. En la siguiente figura mostramos dos ejemplos de ejecución.

Saludos


Proyectos en .NET

La plataforma .NET tiene varios lenguajes de programación entre los cuales encontramos Visual Basic, Visual C# (C Sharp), Visual C++, Visual Web Developer.  Los dos lenguajes mas altamente usados son el C# y el Visual Basic y realmente el Web Developer en una interface para programación web que permite crear aplicaciones tomando como base el C# y el Visual Basic.

Podemos ver entonces que dentro de un mismo lenguaje de programación podemos tener varias opciones dependiendo del tipo de aplicación que queremos desarrollar.

En el curso vamos a utilizar el Visual C#.  Este permite desarrollar varios tipos de aplicaciones entre las más comunes:
- Aplicaciones de Consola
- Aplicaciones de Formularios de Windows

A su vez las aplicaciones de Formularios de Windows pueden tener dos tipos SDI (Single Document Interface) o MDI (Multiple Document Interface).

Vamos a hacer un articulo para cada tipo.

Saludos