Sunteți pe pagina 1din 110

C#

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.

3. PROGRAMACIN ORIENTADA A OBJETOS EN C#.


3.1 Objetos y clases en C#
3.2 La herencia. Visibilidad.

4. UTILIZACIN AVANZADA DE CLASES EN C#


4.1 La palabra static.
4.2 Llamando a un mtodo de la clase padre.

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.

6. ACCESO A DATOS EN C#.


6.1 Explorador de Servidores.
6.2 Conexin a una base de datos existente.
6.3 Introduccin a ADO.Net.
6.4 NameSpaces.
6.5 Clases y Objetos de ADO.Net.
6.6 DataReader.
6.7 DataSet.
6.8 DataTable.
6.9 Alta, Baja y Modificacin.

7. GESTIN DINMICA DE MEMORIA. PUNTEROS EN C#.


7.1 Por qu usar estructuras dinmicas?

8. BIBLIOTECAS ADICIONALES USO FRECUENTE EN C#.


8.1 Fecha y hora. Temporizacin.
8.2 Castellanizando fechas.

9. CARACTERSTICAS AVANZADAS EN C#.


9.1 Espacios de nombres.
9.2 Propiedades.
9.3 El operador coma.

10. WINDOWS FORMS.


10.1 Usando ventanas predefinidas.
10.2 Una aplicacin con dos ventanas.
10.3 Eventos en Windows Forms.
10.4 Trabajar con datos en Windows Forms.
10.5 Volcar datos en un formulario.

11. EJERCICIOS ANEXOS.

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

1.2. La plataforma .NET


NET, en esencia es una librera de clases que contienen o encapsulan una gran
cantidad de funciones.
dichas clases tienen una estructura comn para todos los lenguajes que trabajen sobre
esta plataforma, con lo que una clase que sea programada en C#, podr ser heredada
o utilizada en cualquier lenguaje de la plataforma, como pueden ser Visual Basic .NET
o Jscript.
el entorno que maneja todo esto es .Net framework.

Ejemplo1. Mi primer programa con C#


el lenguaje C# exige que todo programa debe incluir un punto de acceso, el cual se
debe identificar con la funcin Main().
C# es un lenguaje totalmente orientado a objetos, cualquier funcin que se desee
implementar debe estar inmersa dentro de una clase y la funcin Main() no es la
excepcin.

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.

Mtodos tiles para trabajar con la consola


Console.WriteLine():
Escribe una nueva lnea en la consola, es como presionar Enter y escribir una lnea.
Por ejemplo, podemos hacer:
Console.WriteLine(Lo que quiera q salga en la consola);
Console.Write():
Hace lo mismo que Console.WriteLine() pero sin cambiar de lnea.
Console.ReadLine()
Se usa para leer lo que el usuario escribi en la consola, y podemos guardarlo en una
variable para despus usarlo en nuestro programa

Ejemplo 2: Programa de consola para ingresar y mostrar datos

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).

Mostrar nmeros enteros en pantalla

Orden de prioridad de los operadores:


En primer lugar se realizarn las operaciones indicadas entre parntesis.
Luego la negacin.
Despus las multiplicaciones, divisiones y el resto de la divisin.
Finalmente, las sumas y las restas.
En caso de tener igual prioridad, se analizan de izquierda a derecha.

Introduccin a las variables: int


Para usar una cierta variable primero hay que declararla: indicar su nombre y el tipo de
datos que querremos guardar.
int: nmeros enteros (sin decimales):
int primerNumero;
Para asignar el valor:
primerNumero = 234;
O bien : int primerNumero = 234;
O incluso : int primerNumero = 234, segundoNumero = 567;
C# Pgina 7
Mostrar el valor de una variable en pantalla.
int suma=3+4;
System.Console.WriteLine(suma);
Si queremos mostrar un texto adems del valor de la variable, indicamos con {0} en
qu parte del texto queremos que aparezca el valor de la variable:
System.Console.WriteLine("La suma es {0}", suma);
Si se trata de ms de una variable, indicaremos todas ellas tras el texto, y detallaremos
dnde debe aparecer cada una de ellas, usando {0}, {1}, etc.
System.Console.WriteLine("La suma de {0} y {1} es {2}",
primerNumero, segundoNumero, suma);

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.

Los nombres de las variables se conocen como identificadores.


Pueden estar formados por letras, nmeros o el smbolo de subrayado (_) y deben
comenzar por letra o subrayado.
No deben tener espacios entre medias, y hay que recordar que las vocales acentuadas
y la ee son problemticas, porque no son letras "estndar" en todos los idiomas .

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:

Datos por el usuario: ReadLine


Si queremos que sea el usuario quien teclee los valores, necesitamos una
orden, que nos permita leer desde teclado:
texto = System.Console.ReadLine();
primerNumero = System.Convert.ToInt32(
System.Console.ReadLine());

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.

1.3 Estructuras de control


If: Operador Operacin
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
== Igual a
!= No igual a (distinto de)

C# Pgina 10
If-else

Operadores lgicos: &&, ||, !


Operador Significado
&& Y
|| O
! No
De modo que podremos escribir cosas como
if ((opcion==1) && (usuario==2)) ...
if ((opcion==1) || (opcion==3)) ...
if ((!(opcion==opcCorrecta)) || (tecla==ESC)) ...

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 continue: fuerza la siguiente iteracin (podemos saltar alguna repeticin


del 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#

Si escribimos un texto en vez de un nmero, obtendramos como respuesta :


Introduzca el primer nmero :
El usuario introduce hola
Ha habido un error: La cadena de entrada no tiene el formato correcto.
Y si el segundo nmero es 0, se nos dira
Introduzca el primer nmero :
3
Introduzca el segundo nmero :
0
Ha habido un error: Intento de dividir por cero.
Una alternativa ms elegante es no "atrapar" todos los posibles errores a la vez, sino uno por
uno (con varias sentencias "catch"), para poder tomar distintas acciones, o al menos dar
mensajes de error ms detallados

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.

1.4 Tipos de datos bsicos


Tipo de datos entero
Los tipos de datos enteros que podemos usar en C#, junto con el espacio que ocupan en
memoria y el rango de valores que os permiten almacenar son:

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):

Formatear nmeros: En ms de una ocasin nos interesar formatear los nmeros


para mostrar una cierta cantidad de decimales: por ejemplo, nos puede interesar que
una cifra que corresponde a dinero se muestre siempre con dos cifras decimales, o
que una nota se muestre redondeada, sin decimales.
Una forma de conseguirlo es crear una cadena de texto a partir del nmero, usando
"ToString". por ejemplo: suma.ToString("0.00") . Algunos de los cdigos que se
pueden conseguir son:

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.

Secuencias de escape: \n y otras :

Toma de contacto con las cadenas de texto:


Se declaran con "string".
Si queremos dar un valor inicial, ste se indica entre comillas dobles.

C# Pgina 24
Cuando leemos con ReadLine, no hace falta convertir el valor obtenido.
Podemos comparar su valor usando "==" o "!=".

Los valores "booleanos":


puede tomar dos valores: verdadero ("true") o falso ("false").
bool encontrado;
encontrado = true;
A las variables "bool" tambin se le puede dar como valor el resultado de una
comparacin:
partidaTerminada = false;
partidaTerminada = (enemigos ==0) && (nivel == ultimoNivel);
if (vidas == 0) partidaTerminada = true;
Ejemplo pide una letra y dice si es una vocal, una cifra numrica u otro smbolo, usando
variables "bool"

1.5 Arrays, estructuras y cadenas de texto


Conceptos bsicos sobre arrays o tablas:
Una tabla, vector, matriz o array.
C# Pgina 25
Conjunto de elementos, todos los cuales son del mismo tipo.
Estos elementos tendrn todos el mismo nombre, y ocuparn un espacio contiguo en la
memoria .
Si queremos definir un grupo de nmeros enteros, el tipo de datos que usaremos para
declararlo ser "int[]" .
Si sabemos desde el principio cuantos datos tenemos (por ejemplo 4), les
reservaremos espacio con "= new int[4]: int[] ejemplo = new int[4];
Para acceder a los elementosejemplo[0],ejemplo[1],ejemplo[2] y ejemplo`[3]
Definir un grupo de 5 nmeros enteros y hallar su suma

Valor inicial de un array


Si conocemos todos los valores podemos dar valor a los elementos de una tabla al
principio del programa.

C# Pgina 26
Recorriendo los elementos de una tabla

Datos repetitivos introducidos por el usuario

1.6 Operaciones habituales: buscar, aadir, insertar y borrar.


Para ver si un dato existe, habr que recorrer todo el array, comparando el valor
almacenado con el dato que se busca.
Para poder aadir un dato al final de los ya existentes, necesitamos que el array no est
completamente lleno, y llevar un contador de cuntas posiciones hay ocupadas, para
poder guardar el dato en la primera posicin libre.
C# Pgina 27
Para insertar un dato en una cierta posicin, los que quedn detrs debern
desplazarse "a la derecha" para dejarle hueco. Este movimiento debe empezar desde el
final para que cada dato que se mueve no destruya el que estaba a continuacin de l.
Tambin habr que actualizar el contador, para indicar que queda una posicin libre
menos.
Si se quiere borrar el dato que hay en una cierta posicin, los que estaban a
continuacin debern desplazarse "a la izquierda" para que no haya huecos. Habr que
actualizar el contador para indicar que queda una posicin libre ms.

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".

Extraer una subcadena:


Podemos extraer parte del contenido de una cadena con "Substring", que recibe dos
parmetros: la posicin a partir de la que queremos empezar y la cantidad de
caracteres que queremos obtener.
saludo = frase.Substring(0,4);
Podemos omitir el segundo nmero, y entonces se extraer desde la posicin indicada
hasta el final de la cadena.

Buscar en una cadena:


Para ver si una cadena contiene un cierto texto, podemos usar IndexOf ("posicin de"),
que nos dice en qu posicin se encuentra, siendo 0 la primera posicin (o devuelve el
valor -1, si no aparece):
if (nombre.IndexOf("Juan") >= 0)
Console.Write("Bienvenido, Juan");
Podemos aadir un segundo parmetro opcional, que es la posicin a partir de la que
queremos buscar:
if (nombre.IndexOf("Juan", 5) >= 0) ...

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")) ...

Otras manipulaciones de cadenas:


ToUpper() convierte a maysculas: nombreCorrecto = nombre.ToUpper();
ToLower() convierte a minsculas: password2 = password.ToLower();
Insert(int posicin, string subcadena): Insertar una subcadena en una cierta posicin de
la cadena inicial: nombreFormal = nombre.Insert(0,"Don");
Remove(int posicin, int cantidad): Elimina una cantidad de caracteres en cierta posicin:
apellidos = nombreCompleto.Remove(0,6);
Replace(string textoASustituir, string cadenaSustituta): Sustituye una cadena (todas las
veces que aparezca) por otra: nombreCorregido = nombre.Replace("Pepe", "Jose");

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.

Una cadena modificable: StringBuilder


Si necesitamos modificar una cadena letra a letra, no podemos usar un "string"
convencional, deberemos recurrir a un "StringBuilder.
Hay que reservarles espacio con "new.
Se pueden convertir a una cadena "convencional" usando "ToString()

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".

Recorriendo con "foreach":


Construccin parecida a "for", pensada para recorrer ciertas estructurasde datos, como
los arrays .
Se usa con el formato "foreach (variable in ConjuntoDeValores)":

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:

Ahora desde el cuerpo del programa haramos:

2.2. Parmetros de una funcin.


Es frecuente que interese pasarle a nuestra funcin ciertos datos con los que queremos
que trabaje.

Y esta funcin se podra usar desde el cuerpo de nuestro programa as:


escribeNumeroReal(2.3f);
Si hay ms de un parmetro, deberemos indicar el tipo y el nombre para cada uno de
ellos, y separarlos entre comas:

2.3. Valor devuelto por una funcin. El valor void.


Cuando queremos dejar claro que una funcin no tiene que devolver ningn valor,
indicamos al principio que el tipo de datos va a ser "void" (nulo), como hacamos hasta
ahora con "Main.

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.

La llamada sera : resultado = cuadrado( 5 );

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.

2.5. Modificando parmetros.


Los parmetros "se pasan por valor", es decir, la funcin no recibe los datos originales,
sino una copia de ellos. Si modificamos algo, estamos cambiando una copia de los datos
originales, no dichos datos.
Si queremos que los cambios se conserven, basta con hacer un pequeo cambio: indicar
que la variable se va a pasar "por referencia", lo que se indica usando la palabra "ref",
tanto en la declaracin de la funcin como en la llamada.

C# Pgina 40
2.6. El orden no importa.
En C# podemos usar una funcin antes de declararla.

2.7. Nmeros aleatorios.


Random generador = new Random();
int aleatorio = generador.Next(1, 101);

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

3.PROGRAMACIN ORIENTADA A OBJETOS EN C#

3.1. Objetos y clases en C#


Las clases en C# se definen de forma parecida a los registros (struct), slo que ahora
tambin incluirn funciones.

C# Pgina 42
Para instanciar objetos de la clase Puerta hacemos:

Con lo que la llamada sera:

Por lo tanto, ya no tendramos una unica class sino dos:


La clase "Puerta.
La clase "Ejemplo59", que representa a nuestra aplicacin.
Cosas a tener en cuenta:

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.

3.2. La herencia. Visibilidad.


Vamos a crear una clase "Porton" a partir de la clase "Puerta". Un portn tendr las mismas
caractersticas que una puerta (ancho, alto, color, abierto o no), pero adems se podr
bloquear, lo que supondr un nuevo atributo y nuevos mtodos para bloquear y desbloquear.

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:

Podemos tener ms de un constructor, cada uno con distintos parmetros.


Por ejemplo, puede haber otro constructor que nos permita indicar un ancho y
un alto determinado:

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

"Destructor: se encarga de liberar la memoria que pudiramos haber reservado en


nuestra clase o para cerrar ficheros abiertos.
se llama igual que la clase, pero precedido por el smbolo "~", no tiene tipo de
retorno, y no necesita ser "public",
~Puerta()
{
// Liberar memoria
// Cerrar ficheros
}

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.

4. UTILIZACIN AVANZADA DE CLASES EN C#

4.1 La palabra static


La palabra "static" delante de un atributo (una variable) de una clase, indica que es una
"variable de clase", es decir, que su valor es el mismo para todos los objetos de la clase.
Por ejemplo si el atributo "numeroDeRuedas" va a valer 4 para cualquier objeto que
pertenezca a la clase Coche. Se podra declarar como "static".
Si un mtodo (una funcin) est precedido por la palabra "static", indica que es un "mtodo
de clase", es decir, un mtodo que se podra usar sin necesidad de declarar ningn objeto de
la clase.
Queremos que se pueda usar la funcin "BorrarPantalla" de una clase "Hardware" sin
necesidad de crear primero un objeto perteneciente a esa clase:

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 :

Tambin podemos llamar a un constructor de la clase base desde un constructor de una


clase derivada.
Por ejemplo, si tenemos una clase "RectanguloRelleno" que hereda de otra clase
"Rectangulo" y queremos que el constructor de "RectanguloRelleno" que recibe las
coordenadas "x" e "y" se base en el constructor equivalente de la clase "Rectangulo:

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"

Desde Main haramos:


Matriz 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.

5. MANEJO DE FICHEROS EN C#.

5.1 Escritura en un fichero de texto.


Para manejar ficheros, siempre deberemos realizar tres operaciones bsicas:
Abrir el fichero.
Leer datos de l o escribir datos en l.
Cerrar el fichero.

StreamWriter es la clase que representa a un fichero en el que podemos escribir.


El fichero de texto lo creamos con el mtodo CreateText, que pertenece a la clase File.
Para escribir en el fichero, empleamos Write y WriteLine, al igual que en la consola.
Cerramos con Close()

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.

Lectura hasta el final del fichero.


Normalmente no querremos leer slo una frase del fichero, sino procesar todo su contenido,
de principio a fin.
En un fichero de texto, la forma de saber si hemos llegado al final es intentar leer una lnea, y
comprobar si el resultado ha sido "null", lo que nos indicara que no se ha podido leer y que,
por tanto estamos en el final del fichero.

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.

5.2 Aadir a un fichero existente


La idea es sencilla: en vez de abrirlo con CreateText ("crear texto"), usaremoS AppendText
("aadir texto")

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";

5.4 Saber si un fichero existe.


Si intentamos abrir ficheros para lectura, pero sin comprobar realmente si el fichero existe o
no, el programa puede fallar en caso de que el fichero no se encuentre donde nosotros
esperamos.
Una primera solucin es usar "File.Exists(nombre)", para comprobar si est, antes de
intentar abrirlo.

5.5 Ms comprobaciones de errores: excepciones.


Podemos encontrar ms problemas al abrir un fichero. Puede ocurrir que no tengamos
permiso para acceder al fichero, a pesar de que exista, o que intentemos escribir en un
dispositivo que sea slo de lectura (como un CD-ROM, por ejemplo).
Podemos usar las excepciones.
Los pasos que puedan ser problemticos irn dentro del bloque "try" y los mensajes de error
y/o acciones correctoras estarn en el bloque "catch".

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.

5.6 Conceptos bsicos sobre ficheros.


Fichero fsico. Es un fichero que existe realmente en el disco, como "agenda.txt".
Fichero lgico. Es un identificador que aparece dentro de nuestro programa, y que
permite acceder a un fichero fsico. Por ejemplo, si declaramos "StreamReader
fichero1", esa variable "fichero1" representa un fichero lgico.
Registro: Un bloque de datos que forma un "todo", como el conjunto de los datos de
una persona: nombre, direccin, e-mail, telfono, etc.
Acceso secuencial: Cuando debemos "recorrer" todo el contenido de un fichero si
queremos llegar hasta cierto punto.
Acceso aleatorio: Cuando podemos saltar hasta cualquier posicin del fichero
directamente, sin necesidad de recorrer todo lo anterior.

5.7 Leer datos bsicos de un fichero binario.


Fichero binario: ficheros en los que la informacin est estructurada como una secuencia de
bytes, ms o menos ordenada. Esto ocurre en las imgenes, los ficheros de sonido, de video,
etc.
Vamos a ver cmo abrir un fichero y leer el primer byte que contiene.
Usaremos una clase especficamente diseada para leer datos de los tipos bsicos existentes
en C# (byte, int, float, etc.), la clase "BinaryReader":

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.

5.8 Leer bloques de datos de un fichero binario


Leer byte a byte (o float a float) puede ser cmodo, pero tambin es lento. Por eso, en la
prctica es ms habitual leer grandes bloques de datos. Tpicamente, esos datos se
guardarn como un array de bytes.
Para eso, en vez de "BinaryReader", usaremos la clase "FileStream", ms genrica.
Esta clase tiene un mtodo "Read", que nos permite leer una cierta cantidad de datos desde
el fichero.
Le indicaremos en qu array guardar esos datos, a partir de qu posicin del array debe
introducir los datos, y qu cantidad de datos se deben leer.
Nos devuelve un valor, que es la cantidad de datos que se han podido leer realmente.

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.

5.10 Escribir en un fichero binario.


Para escribir en un FileStream, usaremos la misma estructura que para leer:
Un mtodo Write, para escribir un bloque de informacin (desde cierta posicin de un
array, y con cierto tamao).
Un mtodo WriteByte, para escribir slo un byte.

Adems, a la hora de abrir el fichero, tenemos dos alternativas:


Abrir un fichero existente con "OpenWrite".
Crear un nuevo fichero con "Create".

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#.

6.1 Explorador de Servidores.


La ventana se hace visible desde el men Ver Explorador de servidores.
Permite abrir conexiones a datos y conectar con servidores para explorar sus bases de datos.
Tambin permite crear nuevas bases de datos, definir tablas, acceder a su contenido, etc.
Las conexiones se muestran en el nodo Conexiones de datos.
Cada conexin representa un nodo que contiene: tablas, vistas, procedimientos
almacenados, etc.

Conexin a una base de datos existente.


Desde el nodo Conexiones de Datos podremos conectar a una base de datos existente.

C# Pgina 66
Creacin de una base

Definicin de tablas.

Edicin de una tabla.


Desde el explorador de servidores podremos efectuar sobre la tabla operaciones de insercin,
modificacin, borrado, agrupacin, filtrado, etc.

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.

6.2 Orgenes de Datos.


Con el Explorador de Servidores se obtienen las cadenas de conexin a las bases de datos.
Estas Cadenas de conexin nos permitirn definir uno o ms orgenes de datos.
Un Origen de datos es un objeto de la aplicacin que representa un conjunto de datos que
residen en algn lugar (normalmente SGBDR). Los orgenes de datos facilitan el acceso y
edicin de los datos que la aplicacin necesita.
Mostrar la ventana orgenes de datos:
Datos Mostrar Orgenes de datos

6.3 Introduccin a ADO.Net


Para trasladar datos entre un almacn de datos y una aplicacin, en primer lugar debemos
tener una conexin con el almacn de datos.

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)

Objetivos de diseo de ADO.Net.


Acceso simple a datos. A travs de clases fciles de usar que representan tablas,
filas y columnas de la BD.
Extensibilidad para soporte a diferentes orgenes de datos. Esto permite crear
nuevos proveedores de datos para .Net, p.ej. MySQL.
Soporte para aplicaciones multicapa. Es la arquitectura actual de las aplicaciones
de negocios y comercio electrnico. ADO.Net utiliza XML para la comunicacin entre
capas.
Unificacin de XML y Acceso a Datos Relacionales. .Net esta basado en XML y
ADO.Net es el puente entre los datos relacionales y la estructura jerrquica de los
documentos XML.

C# Pgina 69
6.5 Clases y Objetos de ADO.Net.
Clases bsicas.

Objetos ADO.Net. Las clases de ADO.Net estn definidas en el espacio de nombres


System.Data. Trabaja en modo desconectado: El programa no requiere una conexin
persistente con la BD. La conexin se abre y se cierra cuando se necesita.

Objetos del proveedor.


Todos los objetos llevan el prefijo nico del proveedor:
SqlXxxxxxx, OleDbXXXXXX, .etc:

Connection. Establece la conexin con el origen de datos. SqlConnection,


OdbcConnection,
Command. Recupera datos del proveedor. (SELECT*FROM) Ej.: SqlCommand,
OdbcCommand, OleDbCommand,
CommandBuilder. Permite hacer consultas SQL para modificar datos de objetos
basados en una sola tabla. Ej.: SqlCommandBuilder, OdbcCommandBuilder,.
Data Reader. Permite recuperar datos de slo lectura y slo hacia delante de un
origen de datos. Ej.: SqlDataReader, OdbcDataReader,
Data Adapter. Representa un conjunto de comandos SQL y una conexin al origen de
datos para rellenar el objeto DataSet y actualizar los datos. Ej.: SqlDataAdapter,

A nivel de programacin podremos tomar dos caminos


1. Trabajar con un objeto DataReader.
2. Trabajar con un objeto DataSet.
En cualquiera de los dos casos necesitaremos realizar antes una conexin (objeto conexin) a
la base de datos.
SqlConnection objConnect = new SqlConnection (cadena de conexion);
objConnect.Open();
Mtodos del objeto connection.
Open(): Abre la conexin a la BBDD.
C# Pgina 70
Close(): Cierra la conexin a la BBDD
Dispose():Cierra conexin y libera recursos de memoria.
State(): Indica el estado actual de la conexin.

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.

SqlCommand objCommand = new SqlCommand(Sql String, objConnect);


SqlDataReader objDataReader = objCommand.ExecuteReader();
While (objDataReader.Read())
{
Response.Write (objDataReader[0].ToString() + "<BR>");
}
bien
{
Response.Write (objDataReader["Column1"].ToString() + "<BR>");
}

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:

SqlDataAdapter objDataAdapter = new SqlDataAdapter


("Select
CompanyName, ContactName, City, Country, Region from
Suppliers", objConnect);

DataSet objDS = new DataSet();


objDataAdapter.Fill (objDS);

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#.

7.1 Por qu usar estructuras dinmicas?

Variables ESTATICAS: tienen un tamao asignado desde el momento en que se crea el


programa.
Resultan poco eficientes si tenemos estructuras cuyo tamao no sea siempre el
mismo.
Agenda: tenemos una serie de fichas, e iremos aadiendo ms. Si reservamos espacio
para 10, no podremos llegar a aadir la nmero 11.

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.

Algunos ejemplos de estructuras de este tipo son:


Las pilas. Como una pila de libros: vamos apilando cosas en la cima, o cogiendo de la
cima. Se supone que no se puede tomar elementos de otro sitio que no sea la cima.
De igual modo, se supone que la pila no tiene un tamao mximo definido, sino que
puede crecer arbitrariamente
Las colas. Como las del cine: la gente llega por un sitio (la cola) y sale por el opuesto
(la cabeza). Al igual que antes, supondremos que un elemento no puede entrar a la
cola ni salir de ella en posiciones intermedias y que la cola puede crecer hasta un
tamao indefinido.
Las listas, en las que se puede aadir elementos en cualquier posicin, y borrarlos de
cualquier posicin.

Todas estas estructuras tienen en comn que, si se programan correctamente, pueden ir


creciendo o decreciendo segn haga falta, al contrario que un array, que tiene su tamao
prefijado.

Una pila en C#.


Para crear una pila usamos la clase Stack.
Los mtodos habituales que debera permitir una pila son :
Introducir un nuevo elemento en la cima ("apilar", en ingls "push").
C# Pgina 75
Quitar el elemento que hay en la cima ("desapilar", en ingls "pop").

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

Adems, C# permite tambin los siguientes mtodos:


"Peek", que mira el valor que hay en la cima, pero sin extraerlo.
"Clear", que borra todo el contenido de la pila.
"Contains", que indica si un cierto elemento est en la pila.
"GetType", para saber de qu tipo son los elementos almacenados en la pila.
"ToString", que devuelve el elemento actual convertido a un string.
"ToArray", que devuelve toda la pila convertida a un array.
"GetEnumerator", que permite usar "enumeradores" para recorrer la pila
"Count", que nos indica cuntos elementos contiene.

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

Tiene mtodos similares a los de antes:


"Peek", que mira el valor que hay en la cabeza de la cola, pero sin extraerlo.
"Clear", que borra todo el contenido de la cola.
"Contains", que indica si un cierto elemento est en la cola.
"GetType", para saber de qu tipo son los elementos almacenados en la cola.
"ToString", que devuelve el elemento actual convertido a un string.
"ToArray", que devuelve toda la pila convertida a un array.
"GetEnumerator", que permite usar "enumeradores" para recorrer la cola..

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

Otras posibilidades de la clase SortedList son:


"Contains", para ver si la lista contiene una cierta clave.
"ContainsValue", para ver si la lista contiene un cierto valor.
"Remove", para eliminar un elemento a partir de su clave.
"RemoveAt", para eliminar un elemento a partir de su posicin.
"SetByIndex", para cambiar el valor que hay en una cierta posicin.

Las tablas Hash.


Los elementos estn formados por una pareja: una clave y un valor, como en un SortedList,
pero la diferencia est en la forma en que se manejan internamente estos datos.

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#.

8.1 Fecha y hora. Temporizacin.


Tipo de datos DateTime.
DateTime fecha = DateTime.Now;
Dentro podemos saber el dia(Day), el mes (Month) y el ao (Year).
Tambin podemos calcular otras fechas sumando a la actual una cierta cantidad de segundos
(AddSeconds), das (AddDays), etc.

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).

8.2 Castellanizando fechas.

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).

Han pasado 7170 das


Si lo quieres con decimales:
7170,69165165654 das
Y si quieres ms detalles:
7170.16:35:58.7031250

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.

Aparte de ReadLine y WriteLine:


Clear: borra la pantalla.
ForegroundColor: cambia el color de primer plano(por ejemplo "ConsoleColor.Black"
).
BackgroundColor: cambia el color de fondo (para el texto que se escriba a partir de
entonces; si se quiere borrar la pantalla con un cierto color, se deber primero cambiar
el color de fondo y despus usar "Clear").
SetCursorPosition(x, y): cambia la posicin del cursor ("x" se empieza a contar desde
el margen izquierdo, e "y" desde la parte superior de la pantalla).

Readkey(interceptar): lee una tecla desde teclado. El parmetro "interceptar" es un


"bool", y es opcional. Indica si se debe capturar la tecla sin permitir que se vea en
pantalla ("true" para que no se vea, "false" para que se pueda ver). Si no se indica este
parmetro, la tecla se muestra en pantalla.
KeyAvailable: indica si hay alguna tecla disponible para ser leda (es un "bool")
Title: el ttulo que se va a mostrar en la consola (es un "string")

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.

FileInfo nos permite conseguir informacin similar sobre un fichero.


DirectoryInfo dir = new DirectoryInfo(miDirectorio);
FileInfo[] infoFicheros = dir.GetFiles();
foreach (FileInfo infoUnFich in infoFicheros)
{
Console.WriteLine("{0}, de tamao {1}, creado {2}",
infoUnFich.Name,
infoUnFich.Length,
infoUnFich.CreationTime);

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.

9. CARACTERSTICAS AVANZADAS EN C#.

9.1 Espacios de nombres.


La idea detrs de los "using" es que puede ocurrir que distintos programadores en distintos
puntos del mundo creen funciones o clases que se llamen igual, y, esto podra dar lugar a
programas que no compilaran correctamente.
Por eso, se recomienda usar "espacios de nombres(namespace), que permitan distinguir
unos de otros.
Visual Studio: cuando creamos un nuevo proyecto, el fuente "casi vaco" que se nos propone
contendr un espacio de nombres que se llamar igual que el proyecto: namespace
ConsoleApplication1;
Este ejemplo tiene dos clases Console, y ambas tienen un mtodo WriteLine. Una es la
original de C#, que invocaramos con "System.Console". Otra es la que hemos creado para el
ejemplo, que escribe un texto modifica y en color (ayudndose de System.Console), podemos
tener dos clases Console accesibles desde el mismo programa, sin que existan conflictos
entre ellas.

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

Si necesitamos que tengan otro valor podemos hacer:


enum diasSemana { LUNES=1, MARTES, MIERCOLES, JUEVES=6, VIERNES,
SABADO=10, DOMINGO }; de modo que tendremos que:
LUNES = 1, MARTES = 2, MIERCOLES = 3, JUEVES = 6, VIERNES = 7,
SABADO = 10, DOMINGO = 11

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.

9.3 El operador coma.


Cuando vimos la orden "for", siempre usbamos una nica variable como contador, pero esto
no tiene por qu ser siempre as:

Vemos lo que pasa:


Los valores iniciales son i=0, j=1.
Se repetir mientras que i <= 5 y j <= 30.
Al final de cada paso, i aumenta en una unidad, y j en dos unidades.

Lo que no vamos a ver...


Delegados (delegate).
Indexadores.
LINQ

10. WINDOWS FORMS.

Windows Forms es la plataforma de desarrollo para crear Aplicaciones en Microsoft Windows.


Es una parte del .NET Framework que tiene un conjunto de clases orientadas a objetos que
se usan para desarrollar complejas y robustas aplicaciones Windows.
Este conjunto de clases del .NET Framework se encuentra fisicamente dentro de la librera
System.Windows.Forms.dll ubicada en el directorio donde est instalada la versin del .NET
Framework.
Por lo tanto, nuestro proyecto tendr:
using System.Windows.Forms;
Los objetos visuales de Windows Forms se dividen en 4 categorias:

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.

10.1 Usando ventanas predefinidas.


En una aplicacin basada en ventanas, tendremos que mostrar algn mensaje de aviso, o
pedir una confirmacin al usuario.
"ventanas de mensaje que se pueden crear llamando a "MessageBox.Show", que tiene
varias sintaxis posibles, segn el nmero de parmetros que queramos utilizar.

C# Pgina 97
MessageBox.Show("Ese nmero no es vlido", "Aviso");

Indicar adems qu botones queremos mostrar, y qu iconos de aviso:


MessageBox.Show("Ese nmero no es vlido", "Aviso",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

Indicar adems el que ser el botn por defecto:


MessageBox.Show("Seguro que desea continuar?", "Confirma, por favor",
MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1);

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:

El segundo formulario sera:

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

Las propiedades ms comunes de este control


son:

Text: Es el string que muestra el control.


BackColor: Define el color de fondo del control.
ForeColor: Define el color del texto.
Font: Define la fuente del texto.
BorderStyle: Define si la label tiene un borde
visible.
AutoSize: Permite o no redimensionar la label en
forma automtica.
Cursor: Definimos el cono del cursor a mostrar
cuando disponemos el mouse dentro del control.
Visible: Determina si el control est visible u oculto
cuando ejecutamos el programa.

Button. Ver caractersticas y propiedades


Ejemplo: Formulario que muestra tres objetos de la clase Button, disponer como
etiqueta en cada botn los valores 1,2 y 3. Cuando se presiona el botn mostrar en el
ttulo del formulario el valor de la etiqueta del botn presionado.
TextBox : Control para entrada de datos. Ver caractersticas y propiedades.
Ejemplo: Confeccionar un programa que permita ingresar dos valores enteros por
teclado y al presionar un botn mostrar en una Label la suma de dichos valores.
CheckBox: cuadro de seleccin (bsicamente un botn de dos estados: seleccionado o
no seleccionado)
Ejemplo: Confeccionar un programa que muestre 3 objetos de la clase CheckBox con
etiquetas de tres idiomas. Cuando se presiona un botn mostrar en la barra de ttulos
del Form todos los CheckBox seleccionados hasta el momento.

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.

RadioButton : conjunto de botones de radio que permite la seleccin de uno de ellos.


Ejemplo: Confeccionar un programa que muestre 3 objetos de la clase RadioButton
que permitan configurar el ancho y alto del Form. Cuando se presione un botn
actualizar el ancho y alto.

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.

1.4 Trabajar con Datos en Windows Forms.


DataGridView:
Proporciona una forma eficaz y flexible de mostrar datos en formato de tabla.
Puedes mostrar vistas de slo lectura de una cantidad pequea de datos o puedes ajustar
su tamao para mostrar vistas modificables de conjuntos muy grandes de datos.
Es un control que permite mediante cdigo crear procesos propios de ordenacin y
personalizar su apariencia eligiendo entre varias propiedades.
Se pueden utilizar muchos tipos de almacenes de datos como origen de datos.

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.

Utilizando un dataTable: (+ sencillo)

Para mostrar el valor de una celda determinada del DataGridView haremos:


C# Pgina 105
Ejercicios Propuestos
(10.9): Utilizando un datatable mostrar en un datagridview el nombre de la compaa y
persona de contacto de la ciudad de Berlin en la tabla Customers de la base de datos
Northwind.
Cargar en dos cajas de texto los valores de la fila seleccionada(con clic o con doble
clic).

Si queremos recuperar el valor de la fila seleccionada tendremos:

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.

10.5 Volcar datos en un formulario.


DTable.Rows[1][0].ToString();
La parte de ToString() lo puedes variar ya que depende del dato que tengas ahi y donde lo
quieras meter digamos que lo quieres meter en una variable entera entonces sera:
int a = Convert.ToInt32(DTable.Rows[1][0])
Pueden ser muchas variantes en fin lo que mejor te sirva ... por cierto el numero uno indica el
indice del renglon y el nmero cero el de la columna sin embargo puedes poner el nombre de
la columna si lo deseas y se puede ver as
int a = Convert.ToInt32(DTable.Rows[1]["Columna0"])

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.

(10.12) Crear Aplicacin de un formulario con un combo y un dataGridView.


La combo cargar todos los proveedores (TABLA: Suppliers)(CAMPOS : SupplierID y
CompanyName).

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

S-ar putea să vă placă și