Documente Academic
Documente Profesional
Documente Cultură
C# Pgina 2
INDICE
1. FUNDAMENTOS DE PROGRAMACION
EN .NET CON C#
1.1 Qu es C#?
1.2 La plataforma .Net
1.3 Estructuras de Control
1.4 Tipos de datos bsicos
1.5 Arrays, estructuras y cadenas de texto
2. FUNCIONES EN C#
2.1 Introduccin a las funciones.
2.2 Parmetros de una funcin.
2.3 Valor devuelto por una funcin. El valor void
2.4 Variables locales y variables globales.
2.5 Modificando parmetros.
2.6 El orden no importa.
2.7 Nmeros aleatorios.
2.8 Funciones matemticas.
5. MANEJO DE FICHEROS EN C#
5.1 Escritura en un fichero de texto.
5.2 Aadir a un fichero existente.
5.3 Ficheros en otras carpetas
5.4 Saber si un fichero existe.
5.5 Ms comprobaciones de errores: excepciones.
5.6 Conceptos bsicos sobre ficheros.
5.7 Leer datos bsicos de un fichero binario.
5.8 Leer bloques de datos de un fichero binario.
5.9 La posicin en el fichero.
C# Pgina 3
5.10 Escribir en un fichero binario.
C# Pgina 4
1. FUNDAMENTOS DE PROGRAMACION EN .NET CON C#
1.1 Qu es C#?
Permite el desarrollo de aplicaciones para Internet, para mviles y aplicaciones de
propsito general.
Orientado a objetos. Creado basndose en la estructura de C y C++, especialmente su
sintaxis y potencia.
Diseado para trabajar en .Net
C# Pgina 5
1.3 Estructura bsica de un programa C#
Main(): le informa al compilador por donde debe iniciar y tambin terminar un
programa.
Static: la cual permite utilizar la clase directamente, sin necesidad de instanciar un
objeto de ella.
Void: le dice al sistema que la funcin que viene no retornar ningn valor y que por lo
tanto no espere nada.
(string[] argumentos): los argumentos de inicio de ejecucin solo son vlidos para
programas de consola.
C# Pgina 6
WriteLine("Hola"); - "Hola" es el texto que queremos escribir, y WriteLine es la orden
encargada de escribir (Write) una lnea (Line) de texto en pantalla.
Console.WriteLine("Hola"); porque WriteLine es una orden de manejo de la "consola"
(la pantalla "negra" en modo texto del sistema operativo).
System.Console.WriteLine("Hola"); porque las rdenes relacionadas con el manejo de
consola (Console) pertenecen a la categora de sistema (System).
Ejercicios propuestos:
(1.1) Crea un programa que calcule el producto de los nmeros 121 y 132, usando
variables.
(1.2) Crea un programa que calcule la suma de 285 y 1396, usando variables.
(1.3) Crea un programa que calcule el resto de dividir 3784 entre 16, usando
variables.
C# Pgina 8
Tampoco podremos usar como identificadores las palabras reservadas de C#, como
int.
En C# las maysculas y minsculas se consideran diferentes.
Comentarios:
MEJORAS:
1. Podemos evitarnos el System al principio de las rdenes.
2. Podemos evitarnos avanzar a la lnea siguiente usando Write() en vez de WriteLine()
C# Pgina 9
Ejercicios propuestos:
(1.4) Crea un programa que calcule el producto de dos nmeros introducidos por el
usuario.
(1.5) Crea un programa que calcule la divisin de dos nmeros introducidos por el
usuario, as como el resto de esa divisin.
(1.6) Multiplicar dos nmeros tecleados por usuario. El programa deber contener un
comentario al principio, que recuerde cual es su objetivo.
(1.7) El usuario teclear dos nmeros (x e y), y el programa deber calcular cul es el
resultado de su divisin y el resto de esa divisin. Debers usar "Write" en vez de
"WriteLine" para pedir los datos, e incluir un comentario con tu nombre y la fecha en
que has realizado el programa.
(1.8) El usuario teclear dos nmeros (a y b), y el programa mostrar el resultado de la
operacin (a+b)*(a-b) y el resultado de la operacin a2-b2.
(1.9) Pedir al usuario un nmero y mostrar su tabla de multiplicar. Por ejemplo, si el
nmero es el 3, debera escribirse algo como
3x0=0
3x1=3
3x2=6
3 x 10 = 30
(1.10) Crea un programa que convierta de grados Celsius (centgrados) a Kelvin y a
Fahrenheit: pedir al usuario la cantidad de grados centgrados y usar las siguiente
tablas de conversin: kelvin = celsius + 273 ; fahrenheit = celsius x 18 / 10 + 32
(1.11) Pide al usuario una cantidad de "millas" y muestra la equivalencia en metros,
usando: 1 milla = 1609.344 metros.
C# Pgina 10
If-else
Ejercicios propuestos:
(1.12) Crear un programa que pida al usuario dos nmeros enteros y diga "Uno de los
nmeros es positivo", "Los dos nmeros son positivos" o bien "Ninguno de los nmeros
es positivo", segn corresponda.
(1.13) Crear un programa que pida al usuario tres nmeros y muestre cul es el mayor
de los tres.
(1.14) Crear un programa que pida al usuario dos nmeros enteros y diga si son
iguales o, en caso contrario, cul es el mayor de ellos.
C# Pgina 11
Introduccin a los diagramas de flujo
notaciones grficas, que nos permiten ver mejor qu se debe hacer y cuando.
4 elementos bsicos de un diagrama de flujo:
El inicio o el final del programa se indica dentro de un crculo. Los procesos internos,
como realizar operaciones, se encuadran en un rectngulo. Las entradas y salidas
(escrituras en pantalla y lecturas de teclado) se indican con un paralelogramo que
tenga su lados superior e inferior horizontales, pero no tenga verticales los otros dos.
Las decisiones se indican dentro de un rombo.
Programa que pida un nmero al usuario y diga si es positivo, negativo o cero:
C# Pgina 12
Operador condicional: ?
En C# hay otra forma de asignar un valor segn se cumpla una condicin o no.
nombreVariable = condicion ? valor1 : valor2;
C# Pgina 13
"si se cumple la condicin, toma el valor valor1; si no, toma el valor valor2".
numeroMayor = a>b ? a : b; es lo mismo que:
if ( a > b )
numeroMayor = a;
else
numeroMayor = b;
Ejercicios propuestos:
(1.15) Crear un programa que use el operador condicional para mostrar un el valor
absoluto de un nmero de la siguiente forma: si el nmero es positivo, se mostrar tal
cual; si es negativo, se mostrar cambiado de signo.
C# Pgina 14
Switch
C# Pgina 15
Estructuras repetitivas (bucles)
While
Ejercicios propuestos:
(1.16) Crear un programa que pida al usuario su contrasea (numrica). Deber
terminar cuando introduzca como contrasea el nmero 1111, pero volvrsela a pedir
tantas veces como sea necesario.
(1.17) Crear el diagrama de flujo y la versin en C# de un programa que d al usuario
tres oportunidades para adivinar un nmero del 1 al 10.
C# Pgina 16
do ... while: la condicin se comprueba al final
for
C# Pgina 17
Sentencia break: termina el bucle
Sentencia goto
En casos concretos puede ser muy til, por ejemplo, para salir de un bucle muy
anidado (un "for" dentro de otro "for" que a su vez est dentro de otro "for": en este
caso, "break" slo saldra del "for" ms interno).
C# Pgina 18
control errores: las excepciones en c#
C# Pgina 19
Ejercicios propuestos:
(1.18) Crear un programa que pregunte al usuario su edad y su ao de nacimiento. Si
la edad que introduce no es un nmero vlido, mostrar un mensaje de aviso, pero
aun as le preguntar su ao de nacimiento.
C# Pgina 20
Conversiones de cadena a entero
o No siempre nos servir Convert.ToInt32, porque no todos los datos son enteros
de 32 bits (4 bytes).
o Para "byte" usaramos Convert.ToByte (sin signo) y ToSByte (con signo).
o Para datos de 2 bytes tenemos ToInt16 (con signo) y ToUInt16 (sin signo).
o Para los de 8 bytes existen ToInt64 (con signo) y ToUInt64 (sin signo).
Incremento y decremento
o a++; es lo mismo que a = a+1;
o a--; es lo mismo que a = a-1;
o b = a++; si a vale 2 b vale 3
o b = ++a; si a vala 2 b vale 3 y a vale 3
En C# es posible hacer asignaciones mltiples:
o a = b = c = 1;
Operaciones abreviadas: +=
o a += b ; es lo mismo que a = a+b;
o a -= b ; es lo mismo que a = a-b;
o a *= b ; es lo mismo que a = a*b;
o a /= b ; es lo mismo que a = a/b;
o a %= b ; es lo mismo que a = a%b;
Tipo de datos real: Cuando queremos almacenar datos con decimales. Dos formas:
o Coma fija: el nmero mximo de cifras decimales est fijado de antemano, y el
nmero de cifras enteras tambin. Por ejemplo, con un formato de 3 cifras
enteras y 4 cifras decimales, el nmero 3,75 se almacenara correctamente
(como 003,7500),pero el 5,678642 se guardara como 5,6786 (se perdera a
partir de la cuarta cifra decimal) y el 1010 no se podra guardar (tiene ms de 3
cifras enteras).
o Coma flotante: el nmero de decimales y de cifras enteras permitido es
variable. La coma se encuentra en cualquier posicin.
Simple y doble precisin
o Tres tamaos para elegir, segn si queremos guardar nmeros con mayor
cantidad de cifras o con menos.
o Para nmeros con pocas cifras significativas (un mximo de 7 existe el tipo
"float" y para nmeros que necesiten ms precisin (unas 15 cifras, "doble
precisin") tenemos el tipo "double". En C# existe un tercer tipo de nmeros
reales, con mayor precisin todava, que es el tipo "decimal.
C# Pgina 21
Para definirlos:
o float x;
o float x = 12.56;
Pedir y mostrar nmeros reales: usaremos Convert.ToDouble cuando se trate de un
dato de doble precisin, Convert.ToSingle cuando sea un dato de simple precisin
(float) y Convert.ToDecimal para un dato de precisin extra (decimal):
C# Pgina 22
Tipo de datos carcter
Leer y mostrar caracteres : tenemos un tipo de datos que nos permite almacenar una
nica letra, el tipo "char.
char letra;
Asignar valores es sencillo: el valor se indica entre comillas simples
letra = 'a';
Para leer valores desde teclado, lo podemos hacer de forma similar a los casos
anteriores: leemos toda una frase con ReadLine y convertimos a tipo "char" usando
Convert.ToChar:
letra = Convert.ToChar(Console.ReadLine());
C# Pgina 23
Ejercicio propuesto
(1.19) Crear un programa que pida una letra al usuario y diga si se trata de una vocal.
C# Pgina 24
Cuando leemos con ReadLine, no hace falta convertir el valor obtenido.
Podemos comparar su valor usando "==" o "!=".
C# Pgina 26
Recorriendo los elementos de una tabla
C# Pgina 28
10 15 12
15 encontrado en la posicin 2
Aadiendo 6 al final
10 15 12 6
Borrando el segundo dato
10 12 6
Insertando 30 en la posicin 3
10 12 30 6
Ejercicios propuestos:
(1.20) Un programa que prepare espacio para un mximo de 10 nombres. Deber
mostrar al usuario un men que le permita realizar las siguientes operaciones:
Aadir un dato al final de los ya existentes.
Insertar un dato en una cierta posicin los que quedan detrs debern
desplazarse "a la derecha" para dejarle hueco.
Borrar el dato que hay en una cierta posicin.
Mostrar los datos que contiene el array.
Salir del programa.
Tablas bidimensionales:
Queremos guardar datos de dos grupos de alumnos, cada uno de los cuales tiene 20
alumnos.
int datosAlumnos[2,20]
Primer grupo datosAlumnos[0,i]
Segundo grupo datosAlumnos[1,i]
C# Pgina 29
La otra forma de tener arrays multidimensionales son los "arrays de arrays que pueden tener
distintos nmeros de elementos. Para saber su tamao usaremos Length.
Estructuras y registros:
Un registro es una agrupacin de datos, llamados campos, los cuales no
necesariamente son del mismo tipo. Se definen con la palabra "struct".
Primero deberemos declarar cual va a ser la estructura de nuestro registro, lo que no se
puede hacer dentro de "Main". Ms adelante, ya dentro de "Main", podremos declarar
variables de ese nuevo tipo.
Los datos que forman un "struct" pueden ser pblicos o privados.
C# Pgina 30
Para acceder a cada uno de los datos que forman el registro, tanto si queremos leer su
valor como si queremos cambiarlo, se debe indicar el nombre de la variable y el del
dato (o campo) separados por un punto.
Ejercicios propuestos:
(1.21) Un "struct" que almacene datos de una cancin en formato MP3: Artista, Ttulo,
Duracin (en segundos), Tamao del fichero (en KB). Un programa debe pedir los datos
de una cancin al usuario, almacenarlos en dicho "struct" y despus mostrarlos en
pantalla.
Arrays de estructuras:
Hemos guardado varios datos de una persona. Se pueden almacenar los de varias
personas.
C# Pgina 31
La inicial de la primera persona sera "persona[0].inicial
La edad del ltimo sera "persona[99].edad".
Estructuras anidadas:
Podemos encontrarnos con un registro que tenga varios datos, y que a su vez ocurra que
uno de esos datos est formado por varios datos ms sencillos.
Por ejemplo, una fecha de nacimiento podra estar formada por da, mes y ao.
C# Pgina 32
Como acceder a las letras que forman una cadena:
Podemos leer una de las letras de una cadena, de igual forma que leemos los elementos
de cualquier array: si la cadena se llama "texto", el primer elemento ser texto[0], el
segundo ser texto[1] y as sucesivamente.
OJO no podemos hacer texto[0]='a'.
Podemos saber cuantas letras forman una cadena con "cadena.Length". Esto permite
que podamos recorrer la cadena letra por letra, usando construcciones como "for".
C# Pgina 33
La bsqueda termina al final de la cadena, salvo que indiquemos que termine antes con
un tercer parmetro opcional:
if (nombre.IndexOf("Juan", 5, 15) >= 0) ...
De forma similar, LastIndexOf ("ltima posicin de") indica la ltima aparicin (es decir,
busca de derecha a izquierda).
Si solamente queremos ver si aparece, pero no nos importa en qu posicin est, nos
bastar con usar "Contains":
if (nombre.Contains("Juan")) ...
C# Pgina 34
Otra posibilidad es la de descomponer una cadena en trozos, que estn separados
por una serie de delimitadores (por ejemplo, espacios o comas). Para ello se puede
usar Split, que crea un array a partir de los fragmentos de la cadena,
C# Pgina 35
Ejercicios propuestos:
(1.22) Un programa que pida al usuario varios nmeros separados por espacios y
muestre su suma.
C# Pgina 36
Ejercicios propuestos:
(1.23) Un programa que pida una cadena al usuario y la modifique, de modo que las letras
de las posiciones impares (primera, tercera, etc.) estn en minsculas y las de las
posiciones pares estn en maysculas, mostrando el resultado en pantalla. Por ejemplo, a
partir de un nombre como "Nacho", la cadena resultante sera "nAcHo".
(1.24) Un programa que pida tu nombre, tu da de nacimiento y tu mes de nacimiento y lo
junte todo en una cadena, separando el nombre de la fecha por una coma y el da del mes
por una barra inclinada, as: "Juan, nacido el 31/12".
Ejercicios propuestos:
(1.25) Crearemos un programa que pueda almacenar datos de hasta 1000 ficheros
(archivos de ordenador). Para cada fichero, debe guardar los siguientes datos: Nombre del
fichero, Tamao (en KB, un nmero de 0 a 8.000.000.000). El programa mostrar un men
que permita al usuario las siguientes operaciones:
1- Aadir datos de un nuevo fichero
2- Mostrar los nombres de todos los ficheros almacenados
3- Mostrar ficheros que sean de ms de un cierto tamao (por ejemplo, 2000
KB).
4- Ver todos los datos de un cierto fichero (a partir de su nombre)
5- Salir de la aplicacin (como no usamos ficheros, los datos se perdern).
C# Pgina 37
2. FUNCIONES EN C#
2.1. Introduccin a las funciones.
Cuando resolvemos un problema lo dividimos en trozos mas pequeos. diseo
modular.
En C# todos los "trozos de programa" son funciones, incluyendo el propio cuerpo de
programa, Main.
Por ejemplo, podramos crear una funcin llamada "saludar", que escribiera varios
mensajes en la pantalla:
C# Pgina 38
Cuando queramos que nuestra funcin realice una serie de clculos y nos "devuelva"
(return, en ingls) el resultado de esos clculos, para poderlo usar desde cualquier otra
parte de nuestro programa.
Ejercicios propuestos:
(2.1) Crear una funcin que calcule el cubo de un nmero real (float) que se indique como
parmetro. El resultado deber ser otro nmero real. Probar esta funcin para calcular el
cubo de 3.2 y el de 5.
(2.2) Crear una funcin que calcule el menor de dos nmeros enteros que recibir como
parmetros. El resultado ser otro nmero entero.
C# Pgina 39
2.4. Variables locales y variables globales.
Variables locales :Las variables se pueden declarar dentro de un bloque (una funcin), y
entonces slo ese bloque las conocer, no se podrn usar desde ningn otro bloque del
programa .
Variables globales: si declaramos una variable al comienzo del programa, fuera de todos
los "bloques" de programa, a la que se podr acceder desde cualquier parte.
C# Pgina 40
2.6. El orden no importa.
En C# podemos usar una funcin antes de declararla.
Ejercicios propuestos:
(2.3) Crear un programa que genere un nmero al azar entre 1 y 100. El usuario tendr 6
oportunidades para acertarlo.
C# Pgina 41
2.8. Funciones matemticas.
Abs(x): Valor absoluto
Acos(x): Arco coseno
Asin(x): Arco seno
Atan(x): Arco tangente
Atan2(y,x): Arco tangente de y/x (por si x o y son 0)
Ceiling(x): El valor entero superior a x y ms cercano a l
Cos(x): Coseno
Cosh(x): Coseno hiperblico
Exp(x): Exponencial de x (e elevado a x)
Floor(x): El mayor valor entero que es menor que x
Log(x): Logaritmo natural (o neperiano, en base "e")
Log10(x): Logaritmo en base 10
Pow(x,y): x elevado a y
Round(x, cifras): Redondea un nmero
Sin(x): Seno
Sinh(x): Seno hiperblico
Sqrt(x): Raz cuadrada
Tan(x): Tangente
Tanh(x): Tangente hiperblica
C# Pgina 42
Para instanciar objetos de la clase Puerta hacemos:
C# Pgina 43
1. En C# las variables que forman parte de una clase (los "atributos") tienen un valor
inicial predefinido: 0 para los nmeros, una cadena vaca para las cadenas de
texto, o "False" para los datos booleanos.
2. Se accede a los mtodos y a los datos precediendo el nombre de cada uno por el
nombre de la variable y por un punto, como hacamos con los registros (struct).
3. Sin embargo, no podemos hacer directamente "p.abierta = true por dos motivos:
El atributo "abierta" no tiene delante la palabra "public"; por lo que no es pblico, sino
privado, y no ser accesible desde otras clases.
Se recomienda la ocultacin de datos, que no se acceda directamente a los atributos,
sino que siempre se modifiquen creando funciones auxiliares GetXXX y SetXXX
Ejercicio propuesto:
(3.1) Crear una clase llamada Persona, en el fichero "persona.cs". Esta clase deber
tener un atributo "nombre", de tipo string. Tambin deber tener un mtodo
"SetNombre", de tipo void y con un parmetro string, que permita cambiar el valor del
nombre. Finalmente, tambin tendr un mtodo "Saludar", que escribir en pantalla
"Hola, soy " seguido de su nombre. Crear tambin una clase llamada PruebaPersona.
Esta clase deber contener slo la funcin Main, que crear dos objetos de tipo
Persona, les asignar un nombre y les pedir que saluden.
C# Pgina 44
No tenemos por qu heredar todo; tambin podemos "redefinir" algo que ya exista. Por
ejemplo, nos puede interesar que "MostrarEstado" ahora nos diga tambin si la puerta est
bloqueada. Para eso, basta con volverlo a declarar y aadir la palabra "new" para indicar al
compilador de C# que sabemos que ya existe ese mtodo y que sabemos seguro que lo
queremos redefinir:
Por otro lado, los atributos de una Puerta, como el "ancho" y el "alto" estaban declarados
como "privados" , por lo que no van a ser accesibles a los descendientes. Debemos
declararlos como protected, por lo que sern accesibles por las clases derivadas de la actual,
pero por nadie ms:
C# Pgina 45
Ejercicios propuestos:
(3.2) Ampliar las clases del ltimo ejercicio creando un nuevo proyecto con las siguientes
caractersticas: La clase Persona no cambia. Se crear una nueva clase PersonaInglesa,
en el fichero "personaInglesa.cs". Esta clase deber heredar las caractersticas de la clase
"Persona", y aadir un mtodo "TomarTe", de tipo void, que escribir en pantalla "Estoy
tomando t". Crear tambin una clase llamada Prueba-Persona2, en el fichero
"pruebaPersona2.cs". Esta clase deber contener slo la funcin Main, que crear dos
objetos de tipo Persona y uno de tipo PersonaInglesa, les asignar un nombre, les pedir
que saluden y pedir a la persona inglesa que tome t.
(3.3) Ampliar las clases del ejercicio anterior creando un nuevo proyecto con las siguientes
caractersticas: La clase Persona no cambia. La clase PersonaInglesa se modificar para
que redefina el mtodo "Saludar", para que escriba en pantalla "Hi, I am " seguido de su
nombre. Se crear una nueva clase PersonaItaliana, en el fichero "personaItaliana.cs".
Esta clase deber heredar las caractersticas de la clase "Persona", pero redefinir el
mtodo "Saludar", para que escriba en pantalla "Ciao". Crear tambin una clase llamada
PruebaPersona3, en el fichero " pruebaPersona3.cs". Esta clase deber contener slo la
funcin Main, que crear un objeto de tipo Persona, dos de tipo PersonaInglesa, uno de
tipo PersonaItaliana, les asignar un nombre, les pedir que saluden y pedir a las
personas inglesas que tomen t.
Un constructor es una funcin especial, que se pone en marcha cuando se crea un
objeto de una clase, y se suele usar para dar valores iniciales.
Se declara usando el mismo nombre que el de la clase, y sin ningn tipo de retorno.
Por ejemplo, un "constructor" para la clase Puerta que le diera los valores iniciales de 100
para el ancho, 200 para el alto, etc., podra ser as:
C# Pgina 46
Ahora, si declaramos un objeto de la clase puerta con "Puerta p = new Puerta();" tendr de
ancho 100 y de alto 200, mientras que si lo declaramos con "Puerta p2 = new Puerta(90,220);"
tendr 90 como ancho y 220 como alto.
C# Pgina 47
3
C# Pgina 48
"Polimorfismo": funciones que tienen el mismo nombre, pero distintos parmetros, y
que quiz no se comporten de igual forma.
Ejemplo : Puerta() y Puerta(int an,int alt)
Sobrecarga: dos funciones estn sobrecargadas cuando se llaman igual, reciben el
mismo nmero de parmetros, pero se plican a objetos distintos .
puerta.Abrir ();
libro.Abrir (); Abrir() est sobrecargada
Cuando creamos objetos de una clase derivada, antes de llamar a su constructor se llama
a los constructores de las clases base, empezando por la ms general y terminando por la
ms especfica.
Ejemplo:
Clase : Animal Gato GatoSiames
Constructores : Animal
Gato
GatoSiames
Ejercicio propuesto:
(3.4) Crear un programa que contenga las siguientes clases:
Una clase Trabajador, cuyo constructor escriba en pantalla "Soy un trabajador".
Una clase Programador, que derive de Trabajador, cuyo constructor escriba en
pantalla "Soy programador".
Una clase Analista, que derive de Trabajador, cuyo constructor escriba en
pantalla "Soy analista".
Una clase Ingeniero, que derive de Trabajador, cuyo constructor escriba en
pantalla "Soy ingeniero".
Una clase IngenieroInformatico, que derive de Ingeniero, cuyo constructor
escriba en pantalla "Soy ingeniero informtico".
Una clase "PruebaDeTrabajadores", que cree un objeto perteneciente a cada
una de esas clases.
(3.5). Crear un programa que contenga la clase Empleado.cs con dos atributos
nombre y sueldo(se inicializa con un valor de 1000) y un mtodo imprimir que
recibir como parmetro el nombre del empleado e imprimir por consola El nombre
del empleado es XXXX y su sueldo es de XXXX. Crear, asi mismo, una clase
program.cs cuyo Main pedir el nombre del empleado al usuario y mandar imprimir.
C# Pgina 49
(3.6). Crear un programa que contenga la clase Concatena.cs con dos atributos
nombre y apellido. Tendr un constructor que recibir esos dos parmetros y un
mtodo concatenar que devolver (return) el nombre correctamente concatenado al
apellido. Crear, asi mismo, una clase program.cs cuyo Main pedir el nombre y el
apellido del usuario e imprimir por pantalla el nombre concatenado.
(3.7). Crear un programa que contenga la clase Estadstica.cs cuyo constructor
recibir tres nmeros y dos mtodos suma y media que devolvern la suma y la
media respectivamente.
Crear, as mismo, una clase program.cs cuyo Main pedir los tres nmeros al
usuario e imprimir por pantalla los valores resultantes.
Desde una funcin "static" no se puede llamar a otras funciones que no lo sean. Por eso,
como nuestro "Main" debe ser static, deberemos siempre elegir entre:
C# Pgina 50
Que todas las dems funciones de nuestro fuente tambin estn declaradas como
"static", por lo que podrn ser utilizadas desde "Main".
Declarar un objeto de la clase correspondiente, y entonces s podremos acceder a sus
mtodos desde "Main.
Es muy frecuente que no nos baste con tener un objeto de cada clase, sino que necesitemos
manipular varios objetos pertenecientes a la misma clase.
En ese caso, podramos almacenar todos ellos en un "array".
Al declararlo, deberemos reservar memoria primero para el array, y luego para cada uno de
los elementos.
Perro[] misPerros = new Perro[5];
for (byte i = 0; i < 5; i ++)
misPerros[i] = new Perro();
Adems, podemos crear un array de "Animales", pero luego indicar que unos de ellos son
perros,gatos, etc.
Animal[] misAnimales = new Animal[3];
misAnimales[0] = new Perro();
misAnimales[1] = new Gato();
misAnimales[2] = new GatoSiames();
C# Pgina 51
Vemos que si creamos un array de animales, no se comporta correctamente, a pesar de que
despus digamos que el primer elemento del array es un perro.
Sera interesante no necesitar crear un array de perros y otros de gatos, sino poder crear un
array de animales, y que contuviera animales de distintos tipos.
Para conseguir esto declaramos el mtodo "Hablar" como "virtual", y empleamos en las clases
hijas la palabra "override" en vez de "new.
C# Pgina 52
4.2 Llamando a un mtodo de la clase padre
Si en un mtodo de una clase hija no nos interese redefinir por completo las posibilidades del
mtodo equivalente, sino ampliarlas, no hace falta que volvamos a teclear todo lo que haca el
mtodo de la clase base, sino que podemos llamarlo precedindolo de la palabra "base".
Podemos hacer que un Gato Siams hable igual que un Gato normal, pero diciendo "Pfff"
despus :
Los "operadores" son los smbolos que se emplean para indicar ciertas operaciones. Por
ejemplo + (sumar).
En C# se puede "sobrecargar" operadores, es decir, redefinir su significado, para poder sumar
(por ejemplo) objetos que nosotros hayamos creado, de forma ms cmoda y legible.
Por ejemplo, para sumar dos matrices, en vez de hacer algo como
"matriz3 = suma( matriz1, matriz2 )"
Podramos hacer simplemente
" matriz3 = matriz1 + matriz2"
C# Pgina 53
Ejercicios propuestos:
Desarrolla una clase Matriz, que represente a una matriz bidimensional con un
nmero de filas y columnas suministradas por el usuario, as mismo, los datos de la
matriz sern introducidos por el usuario. Tendr un mtodo imprimir y otro que
imprimir nicamente la ltima fila.
Ejercicios propuestos:
(5.1) Crea un programa que vaya leyendo las frases que el usuario teclea y las guarde en
un fichero de texto llamado "registroDeUsuario.txt". Terminar cuando la frase introducida
sea "fin" (esa frase no deber guardarse en el fichero).
C# Pgina 54
Las diferencias son:
Para leer de un fichero no usaremos StreamWriter, sino StreamReader.
Si queremos abrir un fichero que ya existe, usaremos OpenText, en lugar de
CreateText.
Para leer del fichero, usaramos ReadLine, como hacamos en la consola
Ejercicios propuestos:
(5.2) Crea un programa que lea las tres primeras lneas del fichero creado en el
apartado anterior y las muestre en pantalla.
C# Pgina 55
Ejercicios propuestos:
(5.3) Un programa que pida al usuario que teclee frases, y las almacene en el fichero
"frases.txt". Acabar cuando el usuario pulse Intro sin teclear nada. Despus deber
mostrar el contenido del fichero.
C# Pgina 56
5.3 Ficheros en otras carpetas.
Si un fichero al que queremos acceder se encuentra en otra carpeta, basta con que
indiquemos la ruta.
Como la barra invertida que se usa para separar los nombres de los directorios, coincide con
el carcter de control que se usa en las cadenas de C# , deberemos escribir dichas barras
invertidas repetidas.
string nombreFichero = "d:\\ejemplos\\ejemplo1.txt"; // Ruta absoluta
string nombreFichero2 = "..\\datos\\configuracion.txt"; // Ruta relativa
Como esta sintaxis puede llegar a resultar incmoda, en C# existe una alternativa: podemos
indicar una arroba (@) justo antes de abrir las comillas, y entonces no ser necesario delimitar
los caracteres de control:
string nombreFichero = @"d:\ejemplos\ejemplo1.txt";
C# Pgina 57
El resultado, si ese fichero no
existe, sera:
Introduzca el nombre del fichero
prueba
Ha habido un error: No se pudo
encontrar el archivo
'C:\Curso#\prueba'.
Lo razonable no es interceptar "todas las excepciones a la vez", sino crear un anlisis para
cada caso.
Se suelen crear varios bloques "catch".
Trabajando con ficheros se pueden producir las siguientes excepciones:
El fichero existe y es de slo lectura (se lanzar una excepcin del tipo "IOException").
La ruta del fichero es demasiado larga (excepcin de tipo "PathTooLongException").
El disco puede estar lleno (IOException).
C# Pgina 58
Ejercicios propuestos:
(5.4) Un programa que pida al usuario el nombre de un fichero de origen y el de un fichero
de destino, y que vuelque al segundo fichero el contenido del primero, convertido a
maysculas. Se debe controlar los posibles errores, como que el fichero de origen no
exista, o que el fichero de destino no se pueda crear.
C# Pgina 59
La forma de abrir un BinaryReader es algo ms incmoda que con los ficheros de texto,
porque nos obliga a llamar a un constructor y a indicarle ciertas opciones sobre el modo de
fichero (la habitual ser simplemente "abrirlo", con "FileMode.Open").
Pero a cambio podemos leer cualquier tipo de dato, no slo texto: ReadByte lee un dato
"byte", ReadInt32 lee un "int", ReadSingle lee un "float", ReadString lee un "string", etc.
C# Pgina 60
Ejercicios propuestos:
(5.5) Abrir un fichero con extensin EXE y comprobar si realmente se trata de un
ejecutable, mirando si los dos primeros bytes del fichero corresponden a una letra "M" y
una letra "Z", respectivamente. Se deben leer ambos bytes a la vez, usando un array.
5.9 La posicin en el fichero.
FileStream tiene tambin un mtodo ReadByte, que permite leer un nico byte.
Nos interesar situarnos en la posicin exacta en la que se encuentra el dato.
Esto podemos conseguirlo mediante acceso aleatorio, sin necesidad de leer todos los bytes
anteriores.
Para ello, tenemos el mtodo "Seek". 2 parmetros:
la posicin a la que queremos saltar .
el punto desde el que queremos que se cuente esa posicin (desde el comienzo del
fichero SeekOrigin.Begin-, desde la posicin actual SeekOrigin.Current- o desde el
final del fichero SeekOrigin.End-).
La posicin es un Int64, porque puede ser un nmero muy grande e incluso un nmero
negativo (si miramos desde el final del fichero, porque desde l habr que retroceder).
De igual modo, podemos saber en qu posicin del fichero nos encontramos, consultando la
propiedad "Position", as como la longitud del fichero, mirando su propiedad "Length.
C# Pgina 61
Ejercicios propuestos:
(5.6) Abrir un fichero con extensin EXE y comprobar si su segundo byte corresponde a
una letra "Z", sin leer su primer byte.
Ejemplo: crearemos un fichero, guardaremos datos, lo leeremos para comprobar que todo es
correcto, aadiremos al final, y volveremos a leer.
1
C# Pgina 62
2
C# Pgina 63
3
Si queremos escribir datos bsicos de C# (float, int, etc.) en vez de un array de bytes,
podemos usar un "BinaryWriter", que se maneja de forma similar a un "BinaryReader", con la
diferencia de que no tenemos mtodos WriteByte, WriteString y similares, sino un nico
mtodo "Write", que se encarga de escribir el dato que le indiquemos, sea del tipo que sea.
1
C# Pgina 64
2
C# Pgina 65
6. ACCESO A DATOS EN C#.
C# Pgina 66
Creacin de una base
Definicin de tablas.
C# Pgina 67
Al editar la tabla, se est trabajando directamente con SQL Server 2005 que se encargar de
almacenar y recuperar los datos, cumplir las restricciones, etc.
Al cerrar la edicin, los cambios son permanentes en la BD del servidor.
Desde la barra de herramientas Diseador de consultas se puede disear consultas SQL.
C# Pgina 68
ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para
programadores de .NET.
Es la evolucin de ADO (ActiveX Data Objects) y proporciona una serie de clases para
acceder a datos actualizadas al entorno .Net
Incluye una serie de proveedores que actan como intermediarios entre la base de datos y la
aplicacin:
SqlClient.
OracleClient.
OleDB
ODBC
6.4 NameSpaces.
Para trabajar con ADO .Net debemos tener los siguientes using:
using System;
using System.Data;
Dependiendo del proveedor de base de datos:
o using sytem.data.sqlClient proveedor sql
o using system.data.OleDb proveedor OleDb (Access)
o using system.data.OracleClient proveedor Oracle
o using system.data.Odbc proveedor Odbc (cualquier proveedor de base de
datos que disponga de un driver Odbc como MySql)
C# Pgina 69
6.5 Clases y Objetos de ADO.Net.
Clases bsicas.
6.6 DataReader.
Datos de slo lectura y hacia delante.
Mtodos:
o ExecuteReader: Ejecuta una SQL.Usando su mtodo Read() nos movemos a
travs del conjunto de resultados devueltos.
C# Pgina 71
Programar con ADO.Net (Datareader).
6.7 DataSet.
Es un contenedor que sirve para guardar datos en memoria.
Cuando trabajamos con Datasets usamos el DataAdapter para consultar y el mtodo Fill()
para poblar el DataSet con resultados:
6.8 DataTable.
Un DataSet es capaz de alojar mltiples tablas(objeto DataTable), por tanto, dentro del
DataSet tendremos lo siguiente:
DataTable mytabla= objDS.Tables[0];
C# Pgina 72
As mismo, cada tabla tendr a su vez mltiples registros(filas): objeto DataRow
DataTable mytabla= objDS.Tables[0];
foreach(DataRow row in myTabla.Rows)
{
Response.Write (row[0] + "<BR>");
//O bien:
Response.Write (row[column1] + "<BR>");
}
Ejercicios propuestos:
(6.1) Crear un programa que muestre en la consola un listado de todos los empleados
en formato :
EMPLEADOS DE LA CIUDAD DE LONDRES
APELLIDO : LastName
NOMBRE : firstName
(6.2) Crear un programa que muestre en la consola un listado de todos los Productos
en formato :
Listado de Productos:
Nmero: ProductID
Producto: ProductName
Utilizar DataTable;
C# Pgina 73
6.9 Alta, Baja y Modificacin.
Una vez establecido el objeto SqlConnection, podemos utilizar el objeto SqlDataAdapter para
operaciones de ABM con los siguientes comands:
SqlDataAdapter.InsertCommand INSERTAR
SqlDataAdapter.UpdateCommand MODIFICAR
SqlDataAdapter.DeleteCommand ELIMINAR
Ejercicios propuestos:
(6.3) Crear un programa que aumente el precio de todos los productos en un 2%.
Imprimir por pantalla los productos(Cdigo de Producto, Nombre y Precio) que tienen
un precio superior a 50.
(6.4). Se quiere saber a que productos se les ha aplicado un descuento superior a 0.10
%. Sacar por pantalla un listado(ordenado alfabticamente por nombre del producto)
con los siguientes datos:
Cdigo de Factura(OrderID),
Cdigo de Producto(ProductID),
Nombre de Producto (ProductName),
Porcentaje de Descuento (Discount)
(6.5). Se quiere eliminar de la tabla de Detalle de Pedidos (OrderDetails) todos los
pedidos realizados de el producto Pavlova por suspensin de pagos de la empresa
suministradora. Crear un programa que realice esta gestin mostrando el nmero de
registros afectados.
C# Pgina 74
7. GESTIN DINMICA DE MEMORIA. PUNTEROS EN C#.
Lo ideal sera aprovechar mejor la memoria que tenemos en el ordenador, para guardar en
ella todas las fichas o al menos todas aquellas que quepan en memoria.
La solucin suele ser crear estructuras DINMICAS, que puedan ir creciendo o disminuyendo
segn nos interese.
Este tipo de estructuras se suele llamar tambin con las siglas "LIFO" (Last In First Out: lo
ltimo en entrar es lo primero en salir).
Para utilizar la clase "Stack" y la mayora de las que veremos en este tema, necesitamos
incluir en nuestro programa una referencia a "System.Collections".
Ejemplo bsico que crea una pila, introduce tres palabras y luego las vuelve a mostrar:
Yo
soy
hola
Ejercicios propuestos:
(7.1): Dado el siguiente array:
string[] frutas = new string[3];
frutas[0] = "melon";
frutas[1] = "sandia";
C# Pgina 76
frutas[2] = "limon";
Pasar los datos de este array a una pila.
Imprimir los valores almacenados en la pila.
Una cola en C#
Podemos crear colas con en la clase Queue.
En una cola podremos introducir elementos por la cabeza ("Enqueue", encolar) y extraerlos
por el extremo opuesto, el final de la cola ("Dequeue", desencolar).
Siglas FIFO (First In First Out, lo primero en entrar es lo primero en salir).
Un ejemplo bsico similar al anterior, que creara una cola, introdujera tres palabras y luego las
volviera a mostrar sera:
Hola
soy
yo
Al igual que en la pila, tambin tenemos una propiedad "Count", que nos indica cuntos
elementos contiene.
C# Pgina 77
Ejercicios propuestos:
(7.2) Crea un programa que lea el contenido de un fichero de texto, lo almacene lnea
por lnea en una cola, luego muestre este contenido en pantalla y finalmente lo vuelque
a otro fichero de texto.
Nota: Si no especificamos ruta guardar los ficheros de texto en la carpeta ./bin/Debug
Las listas.
Es una estructura dinmica en la que se puede aadir elementos sin tantas restricciones.
Se pueden introducir nuevos datos en ambos extremos, as como entre dos elementos
existentes
Incluso de forma ordenada, de modo que cada nuevo dato se introduzca automticamente en
la posicin adecuada para que todos ellos queden en orden.
En C# no tenemos ninguna clase "List" que represente una lista genrica, pero s dos
variantes: una lista ordenada ("SortedList") y una lista a cuyos elementos se puede acceder
como a los de un array ("ArrayList").
Arraylist.
Aadir datos en la ltima posicin con "Add"
Insertar en cualquier otra con "Insert"
Recuperar cualquier elemento usando corchetes.
Ordenar toda la lista con "Sort"
C# Pgina 78
1
C# Pgina 79
2
C# Pgina 80
El resultado de este programa es:
Contenido actual:
Hola,
soy
yo
La segunda palabra es: soy
Contenido tras insertar:
Hola,
Como estas?
soy
Yo
La palabra "yo" est en la posicin 3
Contenido tras ordenar
Como estas?
Hola,
soy
yo
Ahora "yo" est en la posicin 3
Contenido dar la vuelta y tras eliminar dos:
Hola,
Como estas?
La frase "Hasta Luego"...
No est. El dato inmediatamente mayor es el 1: Hola,
Explicacin del smbolo ~: BinarySearch devuelve un nmero negativo cuando el texto que
buscamos no aparece, pero ese nmero negativo tiene un significado: es el "valor
complementario" de la posicin del dato inmediatamente mayor (es decir, el dato cambiando
los bits 0 por 1 y viceversa). En el ejemplo anterior, "posicin" vale -2, lo que quiere decir que
el dato no existe, y que el dato inmediatamente mayor est en la posicin 1 (que es el
"complemento a 2" del nmero -2, que es lo que indica la expresin "~posicin").
A efectos prcticos, lo que nos interesa es que si quisiramos insertar la frase "Hasta Luego",
su posicin correcta para que todo el ArrayList permaneciera ordenado sera la 1, que viene
indicada por "~posicion".
C# Pgina 81
Ejercicios propuestos:
(7.3) Crea un programa que lea el contenido de un fichero de texto, lo almacene lnea
por lnea en un ArrayList, luego muestre en pantalla las lneas impares (primera,
tercera, etc.) y finalmente vuelque a otro fichero de texto las lneas pares (segunda,
cuarta, etc.).
NOTAS:
1. Para controlar el indice en un bucle foreach usaremos IndexOf() de la
siguiente manera:
foreach (Citizen citizen in MyTown)
if (citizen.firstName == mySearchedFirstName)
return MyTown.IndexOf(citizen);
2. Si no especificamos ruta guardar los ficheros de texto en la carpeta
./bin/Debug
Sortedlist.
En un SortedList, los elementos estn formados por una pareja: una clave y un valor (como en
un diccionario: la palabra y su definicin).
Se puede aadir elementos con Add.
Acceder a los elementos mediante su ndice numrico (con "GetKey").
O acceder mediante su clave (sabiendo en qu posicin se encuentra una clave con
"IndexOfKey")
C# Pgina 82
Cantidad de palabras en el
diccionario: 3
Lista de palabras y su significado:
adis = good bye
hasta luego = see you later
hola = hello
Traduccin de "hola": hello
La "tabla hash" usa una "funcin de dispersin" para colocar los elementos, de forma que no
se pueden recorrer secuencialmente, pero a cambio el acceso a partir de la clave es muy
rpido, ms que si hacemos una bsqueda secuencial (como en un array) o binaria (como en
un ArrayList ordenado).
C# Pgina 83
Si un elemento que se busca no existe, se lanzara una excepcin, por lo que deberamos
controlarlo con un bloque try..catch. Lo mismo ocurre si intentamos introducir un dato que ya
existe.
Una alternativa a usar try..catch es comprobar si el dato ya existe, con el mtodo "Contains" (o
su sinnimo "ContainsKey"):
Otras posibilidades son: borrar un elemento ("Remove"), vaciar toda la tabla ("Clear"), o ver si
contiene un cierto valor ("ContainsValue", mucho ms lento que buscar entre las claves con
"Contains").
Una tabla hash tiene una cierta capacidad inicial, que se ampla automticamente cuando es
necesario. Como la tabla hash es mucho ms rpida cuando est bastante vaca que cuando
est casi llena, podemos usar un constructor alternativo, en el que se le indica la capacidad
inicial que queremos, si tenemos una idea aproximada de cuntos datos vamos a guardar:
Hashtable miDiccio = new Hashtable(500);
C# Pgina 84
Los enumeradores.
Estructura auxiliar que permite recorrer las estructuras dinmicas de forma secuencial. Tienen
un mtodo GetEnumerator, que permite obtener un enumerador para recorrer todos sus
elementos.
Como se puede ver, los enumeradores tendrn un mtodo "MoveNext", que intenta moverse
al siguiente elemento y devuelve "false" si no lo consigue.
En el ejemplo tenemos una tabla hash, que tiene dos campos (clave y valor) por lo que, el
enumerador a usar ser un "enumerador de diccionario" (IDictionaryEnumerator), que
contiene los campos Key y Value.
Para las colecciones "normales", como las pilas y las colas, el tipo de Enumerador a usar ser
un IEnumerator, con un campo Current para saber el valor actual (ver ejemplo siguiente)
C# Pgina 85
8. BIBLIOTECAS ADICIONALES DE USO FRECUENTE EN C#.
Algunas de las propiedades ms tiles son: Now (fecha y hora actual de este equipo), Today
(fecha actual); Day (da del mes), Month (nmero de mes), Year (ao); Hour (hora), Minute
(minutos), Second (segundos), Millisecond (milisegundos); DayOfWeek (da de la semana:
su nombre en ingls, que se puede convertir en un nmero del 0-domingo- al 6-sbado- si se
convierte a entero anteponindole "(int)"); DayOfYear (da del ao).
C# Pgina 86
Para calcular nuevas fechas, podemos usar mtodos que generan un nuevo objeto DateTime,
como: AddDays , AddHours, AddMilliseconds, AddMinutes, AddMonths, AddSeconds,
AddHours, o bien un Add ms genrico (para sumar una fecha a otra) y un Subtract tambin
genrico (para restar una fecha de otra).
Cuando restamos dos fechas, obtenemos un dato de tipo "intervalo de tiempo" (TimeSpan),
del que podemos saber detalles como la cantidad de das (sin decimales, Days, o con
decimales, TotalDays).
C# Pgina 87
Ejercicios propuestos:
(8.1) Crea un programa que pida al usuario su fecha de nacimiento, y diga de qu da
de la semana se trataba.
C# Pgina 88
Lectura de directorios.
Si queremos analizar el contenido de un directorio, podemos emplear las clases Directory y
DirectoryInfo.
La clase Directory contiene mtodos para crear un directorio (CreateDirectory),
borrarlo (Delete), moverlo (Move), comprobar si existe (Exists), etc.
string miDirectorio = @"c:\ejemplo1\ejemplo2";
if (!Directory.Exists(miDirectorio))
Directory.CreateDirectory(miDirectorio);
Tambin tenemos el mtodo "GetFiles()" que nos permite obtener la lista de ficheros
que contiene un directorio.
string miDirectorio = @"c:\";
string[] listaFicheros;
listaFicheros = Directory.GetFiles(miDirectorio);
foreach(string fich in listaFicheros)
Console.WriteLine(fich);
Recordar: Using System.IO
C# Pgina 89
DirectoryInfo obtener informacin sobre fechas de creacin, modificacin y acceso.
Ejercicios propuestos:
(8.2) Crea un programa que muestre en pantalla el contenido de un fichero de texto,
cuyo nombre escoja el usuario. Si el usuario no sabe el nombre, podr pulsar "Intro" y
se le mostrar la lista de ficheros existentes en el directorio actual.
C# Pgina 90
Cuando tenemos varias constantes, cuyos valores son nmeros enteros, hasta ahora estamos
dando los valores uno por uno, as:
const int LUNES = 0, MARTES = 1,
MIERCOLES = 2, JUEVES = 3,
VIERNES = 4, SABADO = 5,
DOMINGO = 6;
Hay una forma alternativa de hacerlo, especialmente til si son nmeros enteros consecutivos.
Se trata de enumerarlos:
enum diasSemana { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO,
DOMINGO };
La primera constante valdr 0, y las dems irn aumentando de una en una, de modo que en
nuestro caso valen:
LUNES = 0, MARTES = 1, MIERCOLES = 2, JUEVES = 3, VIERNES = 4,
SABADO = 5, DOMINGO = 6
C# Pgina 91
9.2 Propiedades.
La poltica en c# es declarar las propiedades de una clase como private y acceder a ellas
con dos mtodos: get() para lectura y set() para escritura.
Si una propiedad tiene un "get", pero no un "set", ser una propiedad de slo lectura, no
podremos hacer cosas como "Anchura = 4", porque el programa no compilara.
Ejercicios propuestos
C# Pgina 92
(9.1) Crear una clase Actor con una propiedad "nombre de lectura y escritura y una
propiedad sueldo de solo lectura que valdr 10000, luego en un Main() contratar a un
actor.
C# Pgina 93
1. Control, UserControl y Form: La clase Control es la clase base que tiene la
funcionalidad de todos los controles que se usan en un formulario (clase Form).
Mientras que la clase User Control sirve para crear controles personalizados que estn
compuestos por otros controles Windows.
2. Controls: Se refiere a los controles Windows que al arrastrarse a un formulario se
muestran en el diseador de formularios de Visual Studio .NET, tales como controles
de entrada de datos: TextBox y ComboBox, de salida de datos: Label y ListView, de
comandos: Button y ToolBar, etc.
3. Componentes: Los componentes son clases similares a los controles pero que no
heredan del Control y que al arrastrarse a un formulario no se ven en el diseador de
formularios sino en el diseador de componentes de visual studio .NET, tales como
componentes de informacin al usuario: ToolTip y ErrorProvider, componentes de
mens: MainMenu y ContextMenu, componentes de ayuda: Help y HelpProvider.
4. 4. Common Dialog Boxes: Los cuadros de dilogos comunes son objetos que al
arrastrarse al formulario tambin se ubican en el Diseador de Componentes de Visual
Studio .NET, tales como dilogos de archivos: OpenFileDialog y SaveFIleDialog,
dilogos de color: ColorDialog, dilogos de Fuentes: FontDialog y los dilogos de
impresin: PrintDialog, PageSetupDialog y PrintPreviewDialog.
C# Pgina 94
C# Pgina 95
Como primer ejemplo, vamos a aadir a nuestro formulario un botn (Button) y una etiqueta
de texto (Label), para hacer un primer programa que cambie el texto de la etiqueta cuando
pulsemos el botn.
Ahora vamos a hacer un programa que calcule y muestre la suma de dos nmeros, y
cuidaremos un poco ms la apariencia.
En el formulario, aadiremos dos Label para incluir textos explicativos, tres TextBox (casillas
de introduccin de texto) para los datos y el resultado, y tambin un botn para que se calcule
dicho resultado:
1: Alinear los controles.
2: Cambiar sus propiedades.
C# Pgina 96
Algunas de las propiedades son:
Name, el nombre con el que se acceder desde el cdigo.
Text, el texto que muestra un elemento.
ForeColor, el color con el que se muestra el componente.
BackColor, el color de fondo.
TextAlign, para indicar la alineacin del texto (y poder centrarlo, por ejemplo).
Enabled, para poder activar o desactivar un elemento.
Location, la posicin en que se encuentra (que podemos ajustar inicialmente con el
ratn).
Size, el tamao (ancho y alto, que tambin se puede ajustar inicialmente con el ratn).
Font, el tipo de letra.
ReadOnly, para poder hacer que un TextBox sea slo de lectura y no se pueda
modificar su contenido.
Ejercicios propuestos:
(10.1) Mejora el ejemplo anterior para que las casillas tengan el texto alineado a la
derecha.
(10.2) Crea una nueva versin del programa, que no solo muestre la suma, sino
tambin la resta, la multiplicacin, la divisin y el resto de la divisin.
C# Pgina 97
MessageBox.Show("Ese nmero no es vlido", "Aviso");
Ejercicios propuestos:
(10.3) Mejora el ejemplo 10.1 para que muestre un mensaje de alerta si las casillas
estn vacas o contienen texto en lugar de nmeros.
C# Pgina 98
10.2 Una aplicacin con dos ventanas.
Vamos a crear un segundo formulario, y llamarlo desde la ventana principal.
Vamos a crear en el primer formulario una casilla de texto (TextBox) en la que no se podr
escribir, sino que slo se mostrarn resultados, y un botn que har que aparezca la ventana
secundaria, en la que s podremos introducir datos.
Cambiamos el "Text" de la etiqueta para que muestre "Nombre y apellidos", y cambiamos la
propiedad "ReadOnly" de la casilla de texto para que sea "true" (verdadero), de modo que no
se pueda escribir en esa casilla.
La ventana sera as:
C# Pgina 99
El resultado sera una secuencia como esta:
Ejercicios propuestos
(10.4) Crea un programa que solicita nombre, apellidos y edad; y en una segunda
ventana vuestra el nombre concatenado con los apellidos en un primer textbox y en un
segundo textbox los das vividos hasta la fecha.
C# Pgina 100
10.3 Eventos en Windows Forms.
C# Pgina 101
Label: nos permite mostrar un texto
Ejercicios propuestos
(10.5) Crea un programa que con una Label muestre el siguiente mensaje: "Esta de
acuerdo con las normas del servicio?", luego un CheckBox y finalmente un objeto de
C# Pgina 102
tipo Button desactivado (propiedad Enabled con false). Cuando se tilde el CheckBox
debemos activar el botn.
Ejercicios propuestos
(10.6) Permitir el ingreso de dos nmeros en controles de tipo TextBox y mediante dos
controles de tipo RadioButton permitir seleccionar si queremos sumarlos o restarlos. Al
presionar un botn mostrar en una Label el resultado de la operacin.
ComboBox: permite seleccionar un string de una lista. Para inicializar los string que
contendr el ComboBox debemos acceder a la propiedad Items. Un evento muy til con
este control es cuando el usuario selecciona un Item de la lista. Para capturar la
seleccin de un item debemos codificar el evento SelectedIndexChanged.
Ejemplo: Cargar en un ComboBox los nombres de varios colores. Al seleccionar
alguno mostrar en la barra de ttulo del Form el string seleccionado.
Ejercicios propuestos
(10.7) Cargar en un combobox una tabla de paises (4). En un textbox pedir al usuario
su nombre y que seleccione su pais. Al presionar un botn mostrar un textbox
Resultado el nombre ingresado y el pas seleccionado.
C# Pgina 103
DateTimePicker(Calendario): Muestra y permite seleccionar una fecha sobre un
calendario.
Ejemplo: Mostrar un calendario y cuando el usuario seleccione una fecha mostrar el da de
la semana en una caja de texto.
ProgressBar (Barra de progreso): Indica visualmente el progreso en una operacin.
Ejemplo: Simular un proceso e implementar una barra de progreso que indique el avance
de ese proceso.
C# Pgina 104
Utilizando un dataReader:
Ejercicios Propuestos
(10.8): Utilizando un datareader mostrar en un datagridview el nombre, apellido y cargo
de todos los registros de la tabla Employees de la base de datos Northwind.
C# Pgina 106
Ejercicios Propuestos
(10.10): Rellenar una combo con los siguientes datos : CategoryID y CategoryName de
la tabla Categories.
Recuperar en un textbox el valor seleccionado por el usuario.
Ejercicio propuesto
(10.11) Crear una aplicacin Windows con una primera pantalla en la que cargaremos
un datagridview con todos los clientes de Alemania.
Cuando el usuario seleccione un cliente cargar una segunda pantalla con un combo
que mostrar todos los gastos de viaje (Freight) para el cliente seleccionado en el
datagridview.
En esta segunda pantalla cargar en dos cajas de texto el OrderID y el Freight para el
elemento seleccionado en la combo.
C# Pgina 107
Con el valor seleccionado se cargar un dataGridView con todos los productos de ese
proveedor (TABLA: Products)(CAMPOS: ProductName,QuantityPerUnit,UnitPrice y
UnitsInStock)
(10.13) Crear un Maestro-Detalle
Vaciar Cajas
Campo:
Notes
C# Pgina 108
Ejercicios anexos:
Ejercicio Propuesto (Anexo 1):
Crear una aplicacin formada por dos formularios Windows. En el primer formulario
recogemos el nombre y apellido1 de un alumno. Igualmente, en este formulario
recogemos las notas de tres asignaturas ( con un decimal). Tendr tres botones :
Aceptar(manda los datos al segundo formulario), Borrar (deja todas las cajas vacias) y
Salir(Cierra la aplicacin).
Con las tres notas, el segundo formulario calcula la media. Si esta es superior a 4.9
entonces mostrar una label con la leyenda:
Apellido1, Nombre ha superado el curso
Si no, Nombre, vuelva a intentarlo otro ao
Ejercicio Propuesto (Anexo 2):
Aplicacin formada por dos formularios Windows:
1: Dos cajas de texto, dos label y un botn. Recoger el nombre y apellido en
MAYUSCULAS. El botn Aceptar mandar la informacin al segundo
formulario que la convertir en MINSCULAS, pero previamente preguntar al
usuario si est de acuerdo con la conversin. Si es afirmativo mandar al
segundo formulario. Si es negativo cerrar la aplicacin.
2: Una caja de texto, una label y un botn. Recoger en MINSCULAS
concatenados el nombre y apellido del primer formulario. Si el usuario est de
acuerdo, el botn Aceptar devolver la informacin al primer formulario en las
condiciones originales, es decir, en MAYUSCULAS y el nombre y el apellido en
sus respectivas cajas.
Ejercicio Propuesto (Anexo 3):
Aplicacin para el clculo del sueldo de un trabajador. Dos formularios:
En form1 sueldo es de solo lectura. Se rellena con los datos introducidos en form2
que ser llamado por calcular.
C# Pgina 109
C# Pgina 110