Professional Documents
Culture Documents
Aun as, mi intencin es que resulte til, as que le rogara que me comunique
Este texto se distribuye "tal cual", sin garanta de ningn tipo, implcita ni explcita.
autor, no se puede hacer uso comercial (no se puede "vender" este curso), no se
www.nachocabanes.com
Este texto ha sido escrito por Nacho Cabanes. Si quiere conseguir la ltima
evitar que un exceso de teora en los primeros temas haga el texto pesado de
seguir.
0.4. Pseudocdigo_______________________________________________________________________________________ 14
Contenido _________________________________________________________________________________ 2
Contenido
lenguaje C#.
Introduccin a la programacin
con C#
5.4. Valor devuelto por una funcin. El valor "void" _____________________________________________ 160
Ap5.2. Cambios de apariencia. Casillas de texto para sumar dos nmeros ___________________ 424
Ap1.2. Unidades de medida empleadas en informtica (2): los bits ____________________________ 386
ciertas cosas como el nombre del programa o dnde empieza y termina ste, pero,
Otros lenguajes, como Pascal, nos obligan a ser algo ms estrictos y detallar
PRINT "Hola"
lenguaje, escribir el texto Hola en pantalla, sera tan sencillo como usar la orden
comparar con lenguajes de bajo nivel, que son los ms cercanos al ordenador.
Vamos a ver en primer lugar algn ejemplo de lenguaje de alto nivel, para despus
control del ordenador que a veces no se puede alcanzar con otros lenguajes. Por
que los fallos sean ms difciles de descubrir y corregir, a cambio de que podemos
los lenguajes humanos. Eso hace que sean ms difciles de aprender y tambin
Por el contrario, los lenguajes de bajo nivel son ms cercanos al ordenador que a
print("Hello")
regla, y algunos se han diseado de forma que las tareas simples sean (de nuevo)
Como se puede observar, a medida que los lenguajes evolucionan, son capaces de
muy parecidos al idioma ingls, aunque siguen unas reglas mucho ms estrictas.
En C# hay que dar todava ms pasos para conseguir lo mismo, porque, como
int main(()
{
printf(("Hola");
return 0;
}
#include <stdio.h>
begin
write('Hola');
end.
program Saludo;
resultan difciles para nosotros, porque son muy distintos de los que nosotros
de comprender.
Estas rdenes se le deben dar en un cierto lenguaje, que el ordenador sea capaz
ax,4C00h
21h
ah,9
dx,offset saludo
21h
ax,@data
ds,ax
Como hemos visto, las rdenes que nosotros hemos escrito (lo que se conoce
entornos de programacin, para que nos sea ms fcil descubrir ciertos errores).
(Nota: los colores de los ejemplos anteriores son una ayuda que nos dan algunos
convertiran a lo siguiente:
las rdenes "mov ds, ax" y "mov ah, 9" (en cuyo significado no vamos a entrar) se
mov
int
main endp
end main
mov
mov
int
.code
main proc
mov
mov
.data
,0dh,0ah,'$'
saludo db 'Hola',
dosseg
.model small
.stack 100h
de
realizar
todo
esto
son
los
".java", que se compilan a ficheros ".class". Estos ficheros ".class" se podran llevar
es la idea que se aplica en Java: los fuentes son ficheros de texto, con extensin
exista una "mquina virtual" capaz de entender esos ejecutables genricos. Esta
Actualmente existe una alternativa ms, algo que parece intermedio entre un
servidor web es habitual crear programas usando lenguajes como PHP, ASP o
Los intrpretes siguen siendo muy frecuentes hoy en da. Por ejemplo, en un
orden, justo en el momento en que hay que procesar cada una de las rdenes.
Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos saluda
ensamblador.
hacer funcionar en otro ordenador similar al que habamos utilizado para crearlo,
compiladores.
encargadas
nosotros.
como
herramientas
el sistema operativo MsDos y con un procesador de la familia Intel x86 sera algo
Las
a cualquier ordenador que tenga instalada una "mquina virtual Java" (las hay para
"plataforma .Net", algo que suele ocurrir en las versiones recientes de Windows y
usar cualquier "ordenador clsico" (de principios de los aos 80) y otros
Ejercicios propuestos
buscando concretar las ideas ms que la forma real de llevarlas a cabo. Por
Por ejemplo, un algoritmo que controlase los pagos que se realizan en una tienda
programacin.
algoritmo debe estar formado por un nmero finito de pasos. Por tanto, un
A pesar de que los lenguajes de alto nivel se acercan al lenguaje natural (ingls),
programas que creemos con herramientas como Visual Studio sern unos
Ejercicios propuestos
0.4. Pseudocdigo
llamada "Dot Net Framework" (algo as como "plataforma punto net"): los
Esta misma idea se sigue en el lenguaje C#, que se apoya en una mquina virtual
Proceso EjemploDeSuma
Escribir 2+3
FinProceso
La mayora de los compiladores actuales permiten dar todos estos pasos desde un
de textos.
desarrollo muy avanzado, y est disponible tambin en una versin gratuita (Visual
los primeros temas, junto con un editor de texto para programadores. Cuando los
que est disponible para Windows, Linux, Mac OS X y otros sistemas operativos.
plataforma .NET, pero fue estandarizado posteriormente por ECMA y por ISO, y
Java. Los programas creados con C# no suelen ser tan rpidos como los creados
class
Ejemplo_01_02a
De
momento
pensaremos
que
public
del nombre del bloque que comienza (el "estilo Java"), as:
bloque "Main". Los detalles de por qu hay que poner delante "public static
y donde empieza la siguiente son los puntos y coma y las llaves. Por ese
espacios entre medias. Lo que realmente indica donde termina una orden
bsicos de programacin.
para nosotros. Debemos creernos que "se debe hacer as". Poco a poco iremos
Como se puede ver, mucha parte de este programa todava es casi un "acto de fe"
public static void Main() : Main indica cual es "el cuerpo del programa", la
System.Console.WriteLine("Hola");
pantalla.
detalles los aplazaremos para ms adelante. En este primer anlisis, iremos desde
Esto escribe "Hola" en la pantalla. Pero hay muchas "cosas raras" alrededor de ese
detalle:
de los que "hacen algo til". Se trata de escribir un texto en pantalla. La apariencia
En este caso, yo comentar los pasos necesarios para usar Linux Mint (en su
VirtualBox, crear una nueva mquina virtual y "cargar esa imagen de CD" para
permite tener un "ordenador virtual" dentro del nuestro, e instalar Linux en ese
enorme lista de software que podemos instalar. En esta lista, aparece una casilla
Synaptic":
puede sonar a que se trata de algo apto slo para expertos. Eso no
Para alguien acostumbrado a sistemas como Windows o Mac OS, hablar de Linux
que para las versiones de Linux Mint basadas en escritorios derivados de Gnome
en ingls o abreviaturas de stas, pero hay que tener en cuenta que C# distingue
poco menos de espacio; en los primeros fuentes usaremos el "estilo C", que
de texto llamada "Filtro rpido", en la que podemos teclear "mcs" para que nos
editor de texto, pero eso es algo que viene preinstalado en cualquier Linux. Por
En este editor podemos teclear nuestro programa, que inicialmente se ver con
fichero).
http://www.mono-project.com/
del fuente: "mcs ejemplo01.cs" (recuerda que en Linux debes respetar las
complicado que para Linux, pero deberemos descargarlo desde su pgina oficial y
Si (utilices Linux o no) has ledo las instrucciones para compilar usando Linux,
probar el programa:
En esa "pantalla negra" ya podemos teclear las rdenes necesarias para compilar y
Si alguno de los pasos ha fallado, tendrs que comprobar si has dado los pasos
editor sabr que se trata de un fuente en lenguaje C# y nos mostrar cada palabra
podemos cambiarla por otra carpeta o incluso por otra unidad de disco:
nos lleva a una nueva pgina en la que debemos elegir la plataforma para la que
cuenta para profundizar. El servidor web XSP es algo claramente innecesario por
texto, pero aun as puede ser interesante para quien quiera investigar por su
interfaces de usuario con Gtk# queda fuera del alcance que se pretende con este
carpeta llamada "Mono x.x.x for Windows", y dentro de ella un acceso a "Mono-
Mono est listo para usar. En nuestro men de Inicio deberamos tener una nueva
se ha completado:
Windows 7 o Windows 8; los detalles exactos dependern del nombre del usuario
(Esa sera la forma de hacerlo para un usuario llamado "Yo" en un sistema con
cd \users\yo\desktop\programas
En ese caso, podemos crear una carpeta en nuestro escritorio, llamada (por
editores que incorporan los sistemas Linux. La alternativa ser usar otro editor
responder que s:
Aparecer la pantalla del "Bloc de notas", junto con un aviso que nos indica que no
notepad ejemplo01.cs
Para crear un programa, el primero paso ser teclear el "fuente". Para ello
Quiz se nos lleve a una carpeta que est dentro de "Documents and settings" o
prompt"), la pantalla negra del sistema operativo, pero con el "path" (la ruta de
ruta
de Microsoft):
Revisin 0.99zz Pgina 31
correspondiente versin de ."Net" (es una descarga gratuita desde la pgina web
Pero en ocasiones puede ocurrir que el ejecutable sea para una versin de la
la
opcin
"Iniciar
en".
Si
antes
copiado)
que
lo
conseguiremos
("pegando"
que
el
habamos
veremos
"Propiedades".
para
(botn
Ctrl+C)
OsX), quiz no sea necesario decir que queremos que sea Mono quien lance
esa
ratn
"copiar"
del
memorizarla.
derecho
Podemos
de Mono.
evitar tener que comenzar siempre con la orden "cd" para cambiar a nuestra
ser cierto en las ltimas versiones de Windows, y que no ocurrir en Linux ni Mac
ejemplo01
Si en nuestro ordenador est instalado el "Dot Net Framework" (algo que debera
mono ejemplo01.exe
el programa tecleando
mcs ejemplo01.cs
en la pantalla negra del smbolo del sistema. Nuestro fuente ya est escrito y
Guardamos los cambios, salimos del "Bloc de notas" y nos volvemos a encontrar
Suma
Resta, negacin
Multiplicacin
Divisin
Resto de la divisin ("mdulo")
*
/
%
Operador
+
Operacin
Parece evidente que el smbolo de la suma ser un +, y podemos esperar cual ser
1.5.1. Operadores
lenguaje).
a teclear cada nuevo ejercicio te ayudar a memorizar las estructuras bsicas del
Ejercicios propuestos:
hacer:
contenido para ver qu puede significar. Por ejemplo, para sumar 3 y 4 bastara
ayuda para que compruebes que estn funcionando correctamente desde ciertos
(Nota: no debers entregar tus programas con ese "ReadLine" al final: es una
editor tan rpido que no da tiempo a ver los resultados. Una solucin provisional
Hay un posible problema que se debe tener en cuenta: algunos de estos entornos
programas, incluso los de gran tamao que estn formados por varios ficheros, en
cmo instalarlo y configurarlo, pero todava no, para que durante los primeros
compilar y lanzar los programas desde el propio editor, sin necesidad de salir al
nuestros fuentes.
Luego la negacin.
multiplicacin).
Sencillo:
Ejercicios propuestos:
Para usar una cierta variable primero hay que declararla: indicar su nombre y el
Como primer ejemplo, vamos a ver lo que haramos para sumar dos nmeros
variables.
y en las que guardemos los datos con los que vamos a trabajar y tambin los
Por eso necesitaremos reservar zonas de memoria a las que datemos un nombre
programa. Pero esto tampoco es "lo habitual", sino que esos nmeros dependern
all y nos permita sumar dos nmeros que habamos prefijado en nuestro
los lmites exactos ms adelante, pero de momento nos basta saber que si el
El espacio del que disponemos para almacenar los nmeros es limitado. Veremos
forma:
nmeros enteros; una de ellas se llama primerNumero y tiene como valor inicial
234 y la otra se llama segundoNumero y tiene como valor inicial 567).
se indican con "int" (abreviatura del ingls "integer"). Despus de esta palabra se
Una vez que sabemos cmo mostrar un nmero en pantalla, es sencillo mostrar el
Tambin podemos dar un valor inicial a las variables ("inicializarlas") antes de que
primerNumero = 234;
primerNumero = 237;
Hay que tener en cuenta que esto no es una igualdad matemtica, sino una
int primerNumero;
...
primerNumero = 234;
Ya sabemos todo lo suficiente para crear nuestro programa que sume dos
necesario, y tras el texto incluiremos los nombres de cada una de esas variables,
aparecer cada una de ellas, usando {0}, {1} y tantos nmeros sucesivos como sea
forma:
variable, podemos indicar el texto entre comillas, detallando con {0} en qu parte
System.Console.WriteLine(suma);
pero si se trata de una variable es idntico (sin comillas, para que el compilador
System.Console.WriteLine(3+4);
Ejercicio propuesto (1.6.2.1): Ampla el ejercicio 1.6.1.1, para que las tres
variables n1, n2, n3 estn declaradas en la misma lnea y tengan valores iniciales.
Esa orden reserva espacio para almacenar un nmero entero, que podr tomar
Despus ya podemos hacer operaciones con las variables, igual que las hacamos
(esta lnea reserva espacio para dos variables, que usaremos para almacenar
El primer tipo de datos que usaremos sern nmeros enteros (sin decimales), que
int primerNumero;
;
primerNumero = 234;
segundoNumero = 567;
suma = primerNumero + segundoNumero;
primerNumero,
pantalla.
(1.6.3.2) Crea un programa que calcule la suma de 285 y 1396, usando variables.
usando variables.
(1.6.3.1) Crea un programa que calcule el producto de los nmeros 121 y 132,
Ejercicios propuestos:
sumar
segundoNumero = 567;
llamaremos suma.
int suma; reserva espacio para guardar un tercer nmero entero, al que
llamaremos primerNumero.
llaves: { y }
Main() indica donde comienza el cuerpo del programa, que se delimita entre
"void").
PrimerNumero = 234;
primernumero = 234;
variable (pero no vamos a incluir ahora una lista de palabras reservadas de C#, ya
entero, as que esa palabra "int" no la podremos usar tampoco como nombre de
Por ejemplo, la palabra "int" se refiere a que cierta variable guardar un nmero
aceptable).
1numero
un numero
Ao1
MsDatos
letras "estndar" en todos los idiomas, as que no se pueden utilizar como parte de
letra o subrayado.
formados por letras, nmeros o el smbolo de subrayado (_) y deben comenzar por
Los nombres de variables (lo que se conoce como "identificadores") pueden estar
1.7. Identificadores
operacin n1+n2*n3.
variables.
(1.6.3.3) Crea un programa que calcule el resto de dividir 3784 entre 16, usando
suele ser aconsejable que el programa comience con un comentario, que nos
nuestros programas que puedan resultar menos claras a simple vista. Incluso
corregirlo.
tiles para nosotros mismos, haciendo que sea ms fcil recordar el cometido un
Podemos escribir comentarios, que el compilador ignorar, pero que pueden ser
1.8. Comentarios
(1.8.1) Crea un programa que convierta una cantidad prefijada de metros (por
Ejercicios propuestos:
En este texto, a partir de ahora los fuentes comenzarn con un comentario que
resuma su cometido, y en ocasiones incluirn tambin comentarios intermedios.
Tambin es posible declarar otro tipo de comentarios, que comienzan con doble
(1.7.4) Crea una nueva versin del programa que calcula el producto de los
/* Esto
es un comentario que
ocupa ms de una lnea
*/
los nmeros 87 y 94, usando esta vez variables llamadas "numero 1" y "numero 2".
(1.7.3) Intenta crear una nueva versin del programa que calcula el producto de
los nmeros 87 y 94, usando esta vez variables llamadas "1numero" y "2numero".
(1.7.2) Intenta crear una nueva versin del programa que calcula el producto de
(1.7.1) Crea un programa que calcule el producto de los nmeros 87 y 94, usando
Ejercicios propuestos:
int primerNumero;;
por el usuario.
Revisin 0.99zz Pgina 43
Ejercicios propuestos:
Un ejemplo de programa que sume dos nmeros tecleados por el usuario sera:
pero eso ocurrir un poco ms adelante, cuando veamos cmo manejar textos. De
texto = System.Console.ReadLine();
necesitamos una nueva orden, que nos permita leer desde teclado. Pues bien, al
Si queremos que sea el usuario de nuestro programa quien teclee los valores,
mundo real. Es mucho ms habitual que los datos los introduzca el usuario, o que
Hasta ahora hemos utilizado datos prefijados, pero eso es poco frecuente en el
"using System":
principio de la mayora de las rdenes que tienen que ver con el sistema (por
(1.9.2) Crea un programa que calcule la divisin de dos nmeros introducidos por
legible), as
Revisin 0.99zz Pgina 45
calculados y textos prefijados. Pero hay otra alternativa, que adems nos permite
En el apartado 1.6.3 vimos cmo usar {0} para escribir en una misma lnea datos
(1.10.2) Crea una nueva versin del programa que calcula la divisin de dos
objetivo.
(1.10.1) Crea una nueva versin del programa que calcula el producto de dos
Ejercicios propuestos:
segundoNumero = Convert.ToInt32(Console.ReadLine());
suma = primerNumero + segundoNumero;
(1.11.3) Crear una variante del programa anterior, que pide al usuario un
3 x 10 = 30
3x2=6
3x1=3
3x0=0
algo como
Ejercicios propuestos:
if (x % 2 == 0) ).
Este programa pide un nmero al usuario. Si es positivo (mayor que 0), escribe en
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
if (numero>0) Console.WriteLine("El nmero es positivo.");
using System;
// Ejemplo_02_01_01a.cs
// Condiciones con if
// Introduccin a C#, por Nacho Cabanes
if (condicin) sentencia;
Esa
using System;
// Ejemplo_02_01_02a.cs
// Condiciones con if (2): Sentencias compuestas
// Introduccin a C#, por Nacho Cabanes
primero es mltiplo del segundo (pista: igual que antes, habr que ver si el resto
(2.1.1.3) Crea un programa que pida al usuario dos nmeros enteros y diga si el
el mayor de ellos.
(2.1.1.2) Crea un programa que pida al usuario dos nmeros enteros y diga cul es
(pista: habr que comprobar si el resto que se obtiene al dividir entre dos es cero:
(2.1.1.1) Crea un programa que pida al usuario un nmero entero y diga si es par
Ejercicios propuestos:
if (numero>0)
Console.WriteLine("El nmero es positivo.");
Si la orden "if" es larga, se puede partir en dos lneas para que resulte ms legible:
pretendamos hacer.
Como nuestros fuentes irn siendo cada vez ms complejos, a partir de ahora
otro, usamos el smbolo ">". Para ver si dos valores son iguales, usaremos dos
Es decir, debe empezar con la palabra "if", la condicin se debe indicar entre
if (condicin) sentencia;
2.1.1. if
repita.
esos pasos debern ser repetitivos. Vamos a ver cmo podemos comprobar si se
Casi cualquier problema del mundo real que debamos resolver o tarea que
2. Estructuras de control
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
if (numero > 0)
{
Console.WriteLine("El nmero es positivo.");
Console.WriteLine("Recuerde que tambin puede usar negativos.");
} // Aqu acaba el "if"
// Aqu acaba "Main"
// Aqu acaba "Ejemplo06
int numero;
cumple la condicin del "if" est an ms a la derecha. Este "sangrado" del texto
espacios, para que fuentes ms complejos quepan entre los mrgenes del papel.
Operador
<
>
<=
>=
==
!=
Operacin
Menor que
Mayor que
Menor o igual que
Mayor o igual que
Igual a
No igual a (distinto de)
mayor que otro. El smbolo de "menor que" tambin es sencillo, pero los dems
Hemos visto que el smbolo ">" es el que se usa para comprobar si un nmero es
using System;
// Ejemplo_02_01_04a.cs
// Condiciones con if (4): caso contrario ("else")
// Introduccin a C#, por Nacho Cabanes
2.1.4. if-else
entre cero".
Ejercicios propuestos:
Ejercicios propuestos:
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
if (numero != 0)
Console.WriteLine("El nmero no es cero.");
using System;
// Ejemplo_02_01_03a.cs
// Condiciones con if (3): "distinto de"
// Introduccin a C#, por Nacho Cabanes
la derecha que los anteriores, para que sea fcil ver dnde comienza y termina
compuesta).
luego... escribir otro! (no es gran cosa; ms adelante iremos encontrando casos
using System;
// Ejemplo_02_01_04c.cs
// Condiciones con if (6): condiciones encadenadas
// Introduccin a C#, por Nacho Cabanes
Podemos enlazar varios "if" usando "else", para decir "si no se cumple esta
if (numero <= 0)
Console.WriteLine("El nmero es cero o negativo.");
if (numero > 0)
Console.WriteLine("El nmero es positivo.");
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
using System;
// Ejemplo_02_01_04b.cs
// Condiciones con if (5): caso contrario, sin "else"
// Introduccin a C#, por Nacho Cabanes
otro, as:
Console..WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
if (numero > 0)
Console.WriteLine("El nmero es positivo.");
else
Console.WriteLine("El nmero es cero o negativo.");
Y
O
No
&&
||
!
...
using System;
// Ejemplo_02_01_05a.cs
// Condiciones con if enlazadas con &&
// Introduccin a C#, por Nacho Cabanes
podra ser:
As, un programa que dijera si dos nmeros introducidos por el usuario son cero,
if ((opcion=
==1) && (usuario===2)) ...
if ((opcion=
==1) || (opcion=
==3)) ...
if ((!(opcion=
==opcCorrecta)
)) || (tecla=
==ESC)))
Significado
Operador
Las condiciones se puede encadenar con "y", "o", "no". Por ejemplo, una partida
Ejercicio propuesto:
if (numero > 0)
Console.WriteLine("El nmero es positivo.");
else
if (numero < 0)
Console.WriteLine("El nmero es negativo.");
else
Console.WriteLine("El nmero es cero.");
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
(2.1.5.6) Crea un programa que pida al usuario dos nmeros enteros y diga si (al
(2.1.5.5) Crea un programa que pida al usuario dos nmeros enteros y diga si
es mltiplo de 2 ni de 3.
mltiplo de 2 pero no de 3.
Console.WriteLine("Introduce un nmero");
numero = Convert.ToInt32(Console.ReadLine());
if (numero = 0)
using System;
mltiplo de 2 y de 3 simultneamente.
// Ejemplo_02_01_06a.cs
// Condiciones con if: comparacin incorrecta
// Introduccin a C#, por Nacho Cabanes
implicitly convert type 'int' to 'bool'" (no puedo convertir un "int" a "bool"). Es el caso
algo cuyo resultado sea "verdadero" o "falso" (lo que pronto llamaremos un dato
En el caso del lenguaje C#, este riesgo no existe, porque la "condicin" debe ser
"aviso", lo que permite que se genere un ejecutable, y podramos pasar por alto el
(2.1.5.10) Crea un programa que pida al usuario dos nmeros enteros y diga si son
(2.1.5.9) Crea un programa que pida al usuario tres nmeros y muestre cul es el
de los nmeros es positivo", "Los dos nmeros son positivos" o bien "Ninguno de
(2.1.5.8) Crea un programa que pida al usuario dos nmeros enteros y diga "Uno
(2.1.5.7) Crea un programa que pida al usuario dos nmeros enteros y diga si uno
mltiplo de 2 o de 3.
Ejercicios propuestos:
toda la expresin. Lo mismo ocurrira si hay dos condiciones enlazadas con "o", y
el valor de "usuario", porque, sea el que sea, no podr hacer que sea "verdadera"
podr ser cierta. Eso supone que en el primer ejemplo anterior, if ((opcion===1)
dos condiciones que estn enlazadas con "Y" se hace "en cortocircuito": si la
...
Es decir:
diagramas de flujo, que nos permiten ver mejor qu se debe hacer y cuando.
las que siguen a un "if" deben ir entre llaves y cuales no. Generalmente la
A veces puede resultar difcil ver claro donde usar un "else" o qu instrucciones de
Ejercicios propuestos:
if (0 == numero)
Nota: en lenguajes como C y C++, en los que s existe este riesgo de asignar un
Console.
.WriteLine("El nmero es cero.");
else
if (numero < 0)
Console.WriteLine("El nmero es negativo.");
else
Console.WriteLine("El nmero es positivo.");
rectngulo.
Eso s, hay que tener en cuenta que sta es una notacin anticuada, y que no
en su salida "no".
ejemplo 11) debe ser casi inmediato: sabemos como leer de teclado, como escribir
using System;
// Ejemplo_02_01_08a.cs
// El operador condicional
// Introduccin a C#, por Nacho Cabanes
queramos optar entre dos valores posibles para una variable, dependiendo de si
if ( a > b )
numeroMayor = a;
else
numeroMayor = b;
numeroMayor = a>b ? a : b;
de dos nmeros:
valor valor2". Un ejemplo de cmo podramos usarlo sera para calcular el mayor
y equivale a decir "si se cumple la condicin, toma el valor valor1; si no, toma el
asignar un valor segn se cumpla una condicin o no, ms compacta pero tambin
En C#, al igual que en la mayora de lenguajes que derivan de C, hay otra forma de
(2.1.7.3) Crea el diagrama de flujo para el programa que pide tres nmeros al
(2.1.7.2) Crea el diagrama de flujo para el programa que pide al usuario dos
(2.1.7.1) Crea el diagrama de flujo para el programa que pide dos nmeros al
Ejercicios propuestos:
Ejercicios propuestos:
using System;
// Ejemplo_02_01_08b.cs
// El operador condicional (2)
// Introduccin a C#, por Nacho Cabanes
escoja, sera:
Un segundo ejemplo, que sume o reste dos nmeros segn la opcin que se
mayor = a>b ? a : b;
Si queremos ver varios posibles valores, sera muy pesado tener que hacerlo con
posibles.
Si dos casos tienen que hacer lo mismo, se aade "goto case" a uno de
Los pasos (porque pueden ser varios) que se deben dar si la expresin tiene
using System;
// Ejemplo_02_01_09a.cs
// La orden "switch" (1)
// Introduccin a C#, por Nacho Cabanes
nos basta que deberemos usar Convert.ToChar si lo leemos desde teclado con
cifra numrica, un espacio u otro smbolo. Para ello usaremos un dato de tipo
Vamos a ver un ejemplo, que diga si el smbolo que introduce el usuario es una
x
x
Es decir:
switch (expresin)
{
case valor1: sentencia1;
break;
case valor2: sentencia2;
sentencia2b;
break;
case valor3:
goto case valor1;
...
case valorN: sentenciaN;
break;
default:
otraSentencia;
break;
}
cuya sintaxis es
2.1.9. switch
int a,
, b, mayor;
switch (letra)
{
case ' ': Console.WriteLine("Espacio.");
break;
case '1':
case '2':
case '3':
case '4':
case '5':
using System;
// Ejemplo_02_01_09b.cs
// La orden "switch" (variante sin break)
// Introduccin a C#, por Nacho Cabanes
caso no haga absolutamente nada excepto dejar pasar el control al siguiente caso,
errores provocados por una "break" olvidado) con la nica excepcin de que un
C# siempre obliga a usar "break" o "goto" al final de cada cada caso (para evitar
Cuidado quien venga del lenguaje C: en C se puede dejar que un caso sea
switch (letra)
{
case ' ': Console.WriteLine("Espacio.");
break;
case '1': goto case '0';
case '2': goto case '0';
case '3': goto case '0';
case '4': goto case '0';
case '5': goto case '0';
case '6': goto case '0';
case '7': goto case '0';
case '8': goto case '0';
case '9': goto case '0';
case '0': Console.WriteLine("Dgito.");
break;
default: Console.WriteLine("Ni espacio ni dgito.");
break;
}
Ejercicios propuestos:
Revisin 0.99zz Pgina 62
Console.WriteLine("Bienvenido, Juan.");
break;
case "Pedro": Console.WriteLine("Que tal estas, Pedro.");
break;
default:
Console.WriteLine("Procede con cautela,
desconocido.");
break;
}
}
}
switch (nombre)
{
case "Juan":
Console.WriteLine("Introduce tu nombre");
nombre = Console.ReadLine();
using System;
// Ejemplo_02_01_09c.cs
// La orden "switch" con cadenas de texto
// Introduccin a C#, por Nacho Cabanes
entre comillas dobles. Por ejemplo, un programa que nos salude de forma
declara con la palabra "string", se puede leer de teclado con ReadLine (sin
texto ("strings").
'6':
'7':
'8':
'9':
'0': Console.WriteLine("Dgito.");
break;
default: Console.WriteLine("Ni espacio ni dgito.");
break;
case
case
case
case
case
Un ejemplo que nos diga si cada nmero que tecleemos es positivo o negativo, y
while (condicin))
sentencia;;
bloque repetitivo.
cumpla una cierta condicin, usaremos la orden "while". Esta orden tiene dos
2.2.1. while
conseguirlo.
Hemos visto cmo comprobar condiciones, pero no cmo hacer que una cierta
(2.2.1.1.4) Crea una versin mejorada del programa anterior, que, tras introducir
del segundo.
Ejercicios propuestos:
while (numero != 0)
{
if (numero > 0) Console.WriteLine("Es positivo");
else Console.WriteLine("Es negativo");
valores, sino que se puede hacer con "if ((simbolo >= '0') && (simbolo <='9'))").
las cfras numricas del 0 al 9 estn ordenadas, no hace falta comprobar los 10
using System;
// Ejemplo_02_02_01_01a.cs
// La orden "while": mientras...
// Introduccin a C#, por Nacho Cabanes
(2.1.9.5) Repite el ejercicio 2.1.9.2, empleando "if" en lugar de "switch" (pista: como
trata de una vocal, una cifra numrica o una consonante, usando "switch".
(2.1.9.3) Crea un programa que lea una letra tecleada por el usuario y diga si se
carcter, usando "switch" (pista: habr que usar un dato de tipo "char").
trata de un signo de puntuacin (. , ; :), una cifra numrica (del 0 al 9) o algn otro
(2.1.9.2) Crea un programa que lea una letra tecleada por el usuario y diga si se
do
sentencia;
;
while (condicin));
se comprueba al final, de modo que siempre se dar al menos una pasada por la
Este es el otro formato que puede tener la orden "while": en este caso, la condicin
(2.2.1.2.2) Crea un programa que escriba en pantalla los nmeros pares del 26 al
usando "while".
(2.2.1.2.1) Crea un programa que escriba en pantalla los nmeros del 1 al 10,
Ejercicios propuestos:
Console.WriteLine("Aceptada.");
}
while (clave != valida);
if (clave != valida)
Console.WriteLine("No vlida!");
using System;
// Ejemplo_02_02_02b.cs
// La orden "do..while" (2)
// Introduccin a C#, por Nacho Cabanes
un texto en vez de un nmero, los cambios al programa son mnimos, basta con
Como veremos con detalle un poco ms adelante, si preferimos que la clave sea
using System;
using System;
// Ejemplo_02_02_02a.cs
// La orden "do..while" (repetir..mientras)
// Introduccin a C#, por Nacho Cabanes
// Ejemplo_02_02_01_02a.cs
// Contar con "while"
// Introduccin a C#, por Nacho Cabanes
do
{
5, as:
while (n < 6)
{
Console.WriteLine(n);
n = n + 1;
}
Como ejemplo, vamos a ver cmo sera el tpico programa que nos pide una clave
1, que aumentara una unidad en cada repeticin y se repetira hasta llegar al valor
Al igual que en el caso anterior, si queremos que se repitan varias rdenes (es lo
Ahora que sabemos "repetir" cosas, podemos utilizarlo tambin para contar. Por
Console.WriteLine("Aceptada.");
"i=i+1":
letra "i" como contador cuando se trata de tareas muy sencillas, as que el valor
As, para contar del 1 al 10, tendramos "1" como valor inicial, "<=10" como
for (valorInicial;
; CondicinRepeticin;; Incremento)
)
Sentencia;;
sta es la orden que usaremos habitualmente para crear partes del programa que
2.2.3. for
contrasea "Peter".
(2.2.2.3) Crea un programa que escriba en pantalla los nmeros pares del 26 al 10
usando "do..while".
(2.2.2.2) Crea un programa que escriba en pantalla los nmeros del 1 al 10,
Ejercicios propuestos:
if (clave != valida)
Console.WriteLine("No vlida!");
}
while (clave != valida);
do
{
string clave;
;
(pista: en cada pasada habr que descontar 1, por ejemplo haciendo i=i-1, que se
(2.2.3.5) Crea un programa que muestre los primeros ocho nmeros pares: 2 4 6 8
(2.2.3.1.3) Crea un programa que muestre los nmeros del 100 al 200 (ambos
sean mltiplos de 3 (pista: habr que recorrer todos esos nmeros y ver si el resto
(2.2.3.2) Crea un programa que escriba en pantalla los nmeros del 1 al 50 que
incluidos.
(2.2.3.1) Crea un programa que muestre los nmeros del 10 al 20, ambos
Ejercicios propuestos:
using System;
// Ejemplo_02_02_03a.cs
// Uso bsico de "for"
// Introduccin a C#, por Nacho Cabanes
En general, ser preferible usar nombres de variable ms descriptivos que "i". As,
La orden para incrementar el valor de una variable ("i = i+1") se puede escribir de
using System;
// Ejemplo_02_02_05a.cs
// "for" anidados
// Introduccin a C#, por Nacho Cabanes
Los bucles se pueden anidar (incluir uno dentro de otro), de modo que podramos
(2.2.4.2) Crea un programa que contenga un bucle sin fin que muestre los
(2.2.4.1) Crea un programa que contenga un bucle sin fin que escriba "Hola " en
Ejercicios propuestos:
while (1 == 1)
indica una condicin que siempre vaya a ser cierta, como sta:
Tambin se puede crear un bucle sin fin usando "while" y usando "do..while", si se
for ( ; ; )
que siga al "for". El programa no termina nunca. Se trata de un "bucle sin fin".
Console.WriteLine();
using System;
// Ejemplo_02_02_06a.cs
// "for" anidados (2)
// Introduccin a C#, por Nacho Cabanes
queremos mejorar el ejemplo anterior haciendo que deje una lnea en blanco
sentencia.
En los ltimos ejemplos que hemos visto, despus de "for" haba una nica
entre 7.
incluidos) diga si son divisibles entre 5, si son divisibles entre 6 y si son divisibles
(2.2.5.2) Crea un programa escriba 4 veces los nmeros del 1 al 5, en una misma
(2.2.5.1) Crea un programa escriba 4 veces los nmeros del 1 al 5, en una misma
Ejercicios propuestos:
(Es decir: tenemos varias tablas, del 1 al 5, y para cada tabla queremos ver el
int tabla,
, numero;
using System;
// Ejemplo_02_02_07b.cs
// "for" que descuenta
// Introduccin a C#, por Nacho Cabanes
"for" y en la parte que lo incrementa. As, podramos escribir las letras de la "z" a la
uno.
using System;
// Ejemplo_02_02_07a.cs
// "for" que usa "char"
// Introduccin a C#, por Nacho Cabanes
usar letras, si el contador lo declaramos como "char" y los valores inicial y final se
Para "contar" no necesariamente hay que usar nmeros. Por ejemplo, podemos
****
****
****
(2.2.6.2) Crea un programa que pida al usuario el ancho (por ejemplo, 4) y el alto
(2.2.6.1) Crea un programa que escriba 4 lneas de texto, cada una de las cuales
Ejercicios propuestos:
using System;
// Ejemplo_02_02_08a.cs
// Reutilizacion incorrecta de la variable de un "for"
// Introduccin a C#, por Nacho Cabanes
hemos vuelto a inicializar la variable "n", as que ya est por encima del valor 10 y
dos veces la tabla de multiplicar del 3, pero el "while" no muestra nada, porque no
trabajar, porque ayuda a evitar un fallo frecuente: reutilizar variables pero olvidar
Se puede incluso declarar una nueva variable en el interior de "for", y esa variable
(mayscula, descendiendo).
Ejercicios propuestos:
Por eso, una alternativa recomendable es incluir siempre las llaves, aunque
Console.WriteLine();
using System;
using System;
// Ejemplo_02_02_09a.cs
// "for" anidados de forma incorrecta, sin llaves
// Introduccin a C#, por Nacho Cabanes
terminar el programa:
siguiente, sino que slo se escribir una lnea en blanco al final, justo antes de
Por ejemplo, el siguiente fuente puede parecer correcto, pero si lo miramos con
incluir siempre las llaves, aunque esperemos repetir slo una una orden.
repetitiva y olvidar las llaves. llaves. Por eso, una alternativa recomendable es
repetir inicialmente una nica orden, aadir despus una segunda orden
que lo mismo ocurre con "while", "do-while" e "if". Pero un error frecuente es
Sabemos que las "llaves" no son necesarias cuando una orden "for" va a repetir
como en el ejercicio 2.2.6.2. Debers usar las variables "ancho" y "alto" para los
(2.2.8.2) Crea un programa que pida al usuario el ancho (por ejemplo, 4) y el alto
estar formada por los nmeros del 1 al 7. Debes usar dos variables llamadas
(2.2.8.1) Crea un programa que escriba 6 lneas de texto, cada una de las cuales
Ejercicios propuestos:
// Ejemplo_02_02_08c.cs
// "for" anidados, variables en "for"
// Introduccin a C#, por Nacho Cabanes
Esta idea sea puede aplicar a cualquier fuente que contenga un "for". Por ejemplo,
using System;
// Ejemplo_02_02_08b.cs
// Intento de reutilizacion incorrecta de la variable
// de un "for": no compila
// Introduccin a C#, por Nacho Cabanes
Console.WriteLine();
using System;
// Ejemplo_02_02_10a.cs
// "for" interrumpido con "break"
// Introduccin a C#, por Nacho Cabanes
using System;
// Ejemplo_02_02_10c.cs
// alternativa a un "for" interrumpido con "break"
// Introduccin a C#, por Nacho Cabanes
"break":
divisores comunes. Debes usar llaves en todas las estructuras de control, aunque
using System;
// Ejemplo_02_02_10b.cs
// "for" interrumpido con "break" (2)
// Introduccin a C#, por Nacho Cabanes
ser mostrar los nmeros del 105 al 120 hasta encontrar uno que sea mltiplo de
reescribir la condicin del bucle de otra forma. En el ejemplo anterior, bastara que
difciles de leer, en los que no se cumple la condicin de repeticin del bucle, sino
Es una orden que se debe tratar de evitar, porque puede conducir a programas
valor 10).
1 2 3 4
(2.2.9.2) Crea un programa que pida al usuario dos nmeros y escriba sus
de 9 que haya entre 1 ese nmero. Debes usar llaves en todas las estructuras de
(2.2.9.1) Crea un programa que pida un nmero al usuario y escriba los mltiplos
Ejercicios propuestos:
using System;
// Ejemplo_02_02_09b.cs
// "for" anidados, variables en "for", llaves "redundantes"
// Introduccin a C#, por Nacho Cabanes
1 2 3 4 6 7 8 9 10
continue;
if (contador==5)
using System;
// Ejemplo_02_02_11a.cs
// "for" interrumpido con "continue"
// Introduccin a C#, por Nacho Cabanes
(2.2.11.1) Crea un programa que escriba los nmeros del 20 al 10, descendiendo,
int n=1;
Console.WriteLine();
using System;
// Ejemplo_02_02_12a.cs
// "for" y "while" equivalente
// Introduccin a C#, por Nacho Cabanes
(2.2.11.2) Crea un programa que escriba los nmeros pares del 2 al 106, excepto
Ejercicios propuestos:
using System;
// Ejemplo_02_02_11b.cs
// Alternativa a "for" interrumpido con "continue"
// Introduccin a C#, por Nacho Cabanes
todos los nmeros a partir del mayor de ambos, de forma creciente; cuando
comn mltiplo (pista: una solucin lenta pero sencilla es probar con un "for"
(2.2.10.2) Crea un programa que pida al usuario dos nmeros y escriba su mnimo
los nmeros descendiendo a partir del menor de ambos, hasta llegar a 1; cuando
comn divisor (pista: una solucin lenta pero sencilla es probar con un "for" todos
(2.2.10.1) Crea un programa que pida al usuario dos nmeros y escriba su mximo
Ejercicios propuestos:
int contador=
=105;
por un espacio, sin avanzar de lnea, usando "for". En la siguiente lnea, vuelve a
(2.2.12.1) Crea un programa que escriba los nmeros del 100 al 200, separados
Ejercicios propuestos:
4, porque cuando se llega al nmero 5, la orden "continue" hace que dicho valor
provoca un bucle sin fin y el programa se queda "colgado" tras escribir el nmero
En este caso, el "for" muestra todos los valores menos el 5, pero en el "while" se
int n=1;
while (n<=10)
{
if (n == 5)
continue;
Console.Write("{0} ", n);
n++;
}
Console.WriteLine();
using System;
// Ejemplo_02_02_12b.cs
// "for" y "while" equivalente... con "continue"
// Introduccin a C#, por Nacho Cabanes
while (n<=10)
{
Console.Write("{0} ", n);
n++;
}
ya tiene el valor 5.
modo que repite cuatro veces una orden vaca, y cuando termina el "for", "i"
principio.
problemas:
ejercicios resueltos, que te ayudarn a "entrenar la vista" para localizar ese tipo de
que el programa se comporte de forma errnea. Por eso, aqu tienes varios
un "punto" y coma tras una orden "for" o "while" puede hacer que nada se repita y
Existen varios errores frecuentes en el manejo de los bucles. Por ejemplo, incluir
(2.2.12.2) Crea un programa que escriba los nmeros pares del 20 al 10,
salida:
Console.Write("Fin del programa");
using System;
// Ejemplo_02_03a.cs
// "for" y "goto"
// Introduccin a C#, por Nacho Cabanes
donde:
goto donde;
El formato de "goto" es
slo saldra del "for" ms interno). Al igual que ocurra con la orden "break", ser
dentro de otro "for" que a su vez est dentro de otro "for": en este caso, "break"
puede ser muy til, por ejemplo, para salir de un bucle muy anidado (un "for"
Su uso indisciplinado est muy mal visto, porque puede ayudar a hacer
la orden "if".
Respuesta: escribe 5, porque no hay llaves tras el "for", luego slo se repite
0.
2.
4.
6.
8.
10.
12.
14.
16.
18.
20.
0.
2.
4.
6.
condicin):
repita (una flecha que vuelve hacia atrs, al punto en el que se comprobaba la
Por su parte, un bucle "while" se vera como una condicin que hace que algo se
condiciones encadenadas.
(2.3.1) Crea un programa que escriba los nmeros del 1 al 10, separados por un
espacio, sin avanzar de lnea. No puedes usar "for", ni "while", ni "do..while", slo
"if" y "goto".
Ejercicios propuestos:
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 0 y j vale
i vale 1 y j vale
i vale 1 y j vale
i vale 1 y j vale
i vale 1 y j vale
Fin del programa
repite:
mayor"
Decir "n1 es
mayor"
// Ejemplo_02_05a.cs
// Primer ejemplo de "foreach"
// Introduccin a C#, por Nacho Cabanes
todava con muy poco detalle) es la cadena de texto, "string", de la que podramos
datos de uno en uno. De momento, el nico dato compuesto que hemos visto (y
de datos ms complejas, que es en las que la nos resultar til para extraer los
Nos queda por ver otra orden que permite hacer cosas repetitivas: "foreach" (se
2.5. foreach
Cerrar fichero
Ejercicios propuestos:
queremos que se repita (por ejemplo: 10 veces sera "for (i=1; i<=10; i++)").
"for" hace que sea especialmente til cuando sabemos exactamente cuantas veces
Leer dato
llegue a repetir nunca (por ejemplo: cuando leemos un fichero, si el fichero est
En general, nos interesar usar "while" cuando puede que la parte repetitiva no se
(2.5.1) Crea un programa que cuente cuantas veces aparece la letra 'a' en una
Ejercicios propuestos:
using System;
Mostrar dato
Abrir fichero
(do..while):
no
Decir "n2 es
si
n1>n2?
Pedir nmero n2
Pedir nmero n1
comprobando cada una de los posibles situaciones que pueden dar lugar a un
situaciones de error. Por eso, los lenguajes modernos, como C#, permiten una
alternativa: el manejo de "excepciones".
fila (o columna) de asteriscos y cuyo interior est formado por espacios en blanco,
con el tamao que indique el usuario, hasta un mximo de 9. Por ejemplo, si desea
(2.6.9) Crea un programa que "dibuje" un cuadrado formado por cifras sucesivas,
Precio? 1
Pagado? 100
Su cambio es de 99: 50 20 20 5 2 2
Precio? 44
Pagado? 100
Su cambio es de 56: 50 5 1
cantidad ilimitada de monedas (o billetes) de 100, 50, 20, 10, 5, 2 y 1, y que no hay
monedas (o billetes) del mayor valor posible. Supondremos que tenemos una
derecha, con la altura que indique el usuario. Por ejemplo, si el usuario dice que
con el ancho y el alto que indique el usuario. Por ejemplo, si desea anchura 4 y
La forma "clsica" del control de errores es usar instrucciones "if", que vayan
indique el usuario. Por ejemplo, si el usuario dice que desea 4 caracteres de alto, el
using System;
// Ejemplo_02_07a.cs
// Excepciones (1)
// Introduccin a C#, por Nacho Cabanes
errores:
con un primer ejemplo, que intente dividir dos nmeros, e intercepte los posibles
x
x
"convencional".
por rdenes que no tienen que ver con el problema en s, sino con las posibles
error, a medida que estas situaciones llegan. Esto tiende a hacer el programa ms
22222
33333
44444
55555
el ancho y el alto que indique el usuario, usando dos "for" anidados. Por ejemplo,
(2.6.4) Crea un programa que "dibuje" un rectngulo formado por asteriscos, con
multiplicaciones sucesivas.
using System;
Ejercicios propuestos:
// Ejemplo_02_07b.cs
// Excepciones (2)
// Introduccin a C#, por Nacho Cabanes
alternativa es la menos deseable, porque quiz pasemos por alto algn tipo de
toint32" nos llevar a una pgina en la que podemos ver que hay dos excepciones
catch (FormatException)
{
Console.WriteLine("No es un nmero vlido");
}
catch (DivideByZeroException)
{
Console.WriteLine("No se puede dividir entre cero");
}
try
{
Como se ve en este ejemplo, si no vamos a usar detalles adicionales del error que
sino uno por uno (con varias sentencias "catch"), para poder tomar distintas
respuesta
errorEncontrado.Message)
}
catch (Exception errorEncontrado)
{
Console.WriteLine("Ha habido un error: {0}",
errorEncontrado.Message);
}
try
{
Los tipos de datos enteros que podemos usar en C#, junto con el espacio que
manejar nmeros con ms de 9 cifras, as que un dato "int" se les quedara corto.
que es de suponer que existir algn tipo de datos ms adecuado, que desperdicie
de tipo "int" puede guardar nmeros de hasta unas nueve cifras, tanto positivos
importante que hemos esquivado hasta ahora es el tamao de los nmeros que
cmo usar variables para reservar espacio y as poder trabajar con datos cuyo
sbyte
byte
short
ushort
int
uint
long
ulong
}
signo), y para los de 8 bytes existen ToInt64 (con signo) y ToUInt64 (sin signo).
(con signo), para datos de 2 bytes tenemos ToInt16 (con signo) y ToUInt16 (sin
bytes). Para datos de tipo "byte" usaramos Convert.ToByte (sin signo) y ToSByte
Si queremos obtener estos datos a partir de una cadena de texto, no siempre nos
a++;
a--;
decremento):
es lo mismo que
es lo mismo que
a = a+1;
a = a-1;
Revisin 0.99zz Pgina 94
existe una notacin ms compacta para esta operacin, y para la opuesta (el
Pues bien, en C# (y en otros lenguajes que derivan de C, como C++, Java y PHP),
a = a + 1;
tambin existe una operacin que es muy frecuente cuando se crean programas,
su resta y su producto.
(3.1.2.3) Pide al usuario dos nmeros enteros largos ("long") y muestra su suma,
pantalla.
aparentas 20 aos").
continuacin, le debers decir que no aparenta tantos aos (por ejemplo, "No
Ejercicios propuestos:
using System;
// Ejemplo_03_01_02a.cs
// Conversiones para otros tipos de nmeros enteros
// Introduccin a C#, por Nacho Cabanes
Ejercicios propuestos:
using System;
// Ejemplo_03_01_01a.cs
// Tipos de nmeros enteros
// Introduccin a C#, por Nacho Cabanes
un "int".
edades sera "byte", que permite valores entre 0 y 255, y ocupa 3 bytes menos que
Como se puede observar en esta tabla, el tipo de dato ms razonable para guardar
0 a 18446744073709551615
9223372036854775807
-9223372036854775808 a
0 a 4294967295
-2147483648 a 2147483647
0 a 65535
-32768 a 32767
0 a 255
-128 a 127
Nombre
b
b
b
b
b
;
;
;
;
;
es
es
es
es
es
lo
lo
lo
lo
lo
mismo
mismo
mismo
mismo
mismo
que
que
que
que
que
a
a
a
a
a
=
=
=
=
=
a+b;
a-b;
a*b;
a/b;
a%b;
tambin
podemos
distinguir
postdecremento
(a--)
b=b*5; a=a*2; Calclalo a mano y luego crea un programa que lo resuelva, para
(3.1.3.2) Cul sera el resultado de las siguientes operaciones? a=5; b=++a; c=a++;
programa.
(3.1.3.1) Crea un programa que use tres variables x,y,z. Sus valores iniciales sern
Ejercicios propuestos:
predecremento (--a).
supuesto,
// Ejemplo_03_01_05a.cs
// Asignaciones mltiples
// Introduccin a C#, por Nacho Cabanes
a = b = c = 1;
(3.1.4.2) Cul sera el resultado de las siguientes operaciones? a=5; b=a+2; b-=3;
Por
15, -10, 214. Debers incrementar el valor de estas variables en 12, usando el
(3.1.4.1) Crea un programa que use tres variables x,y,z. Sus valores iniciales sern
Ejercicios propuestos:
using System;
// Ejemplo_03_01_04a.cs
// Operaciones abreviadas
// Introduccin a C#, por Nacho Cabanes
All van
a +=
a -=
a *=
a /=
a %=
An hay ms. Tenemos incluso formas reducidas de escribir cosas como "a = a+5".
b = ++a;
En cambio, si escribimos
As, si "a" vala 2, lo que esta instruccin hace es dar a "b" el valor de "a" y
b = a++;
using System;
// Ejemplo_03_01_03a.cs
// Incremento y decremento
// Introduccin a C#, por Nacho Cabanes
significativas:
Revisin 0.99zz Pgina 98
reales, con mayor precisin todava, el tipo "decimal", que se acerca a las 30 cifras
// Ejemplo_03_02_01a.cs
// Nmeros reales (1: float)
// Introduccin a C#, por Nacho Cabanes
el tipo "float" y para nmeros que necesiten ms precisin (unas 15 cifras, "doble
mximo de 7, lo que se conoce como "un dato real de simple precisin") usaremos
Ejercicios propuestos:
Vamos a dividir
El resultado es
Vamos a dividir
El resultado es
programa es:
float f1 = 2, f2 = 3;
float divisionF;
using System;
lo que importa es el nmero de cifras significativas (a partir del ltimo 0). Por
5,678642 se guardara como 5,6786 (se perdera a partir de la cuarta cifra decimal)
nmero de cifras enteras tambin. Por ejemplo, con un formato de 3 cifras enteras
"reales" (con decimales). Al igual que ocurra con los nmeros enteros, tendremos
"int". Necesitamos otro tipo de datos que s est preparado para guardar nmeros
Cuando queremos almacenar datos con decimales, no nos sirve el tipo de datos
using System;
32
float
3,41038
15-16
1,710308
5,010-324
64
double
28-29
7,91028
1,010-28
128
decimal
}
}
nmero, para indicar al compilar que debe ser tratado como un "float":
// Ejemplo_03_02_03a.cs
Al igual que hacamos con los enteros, podemos leer como cadena de texto, y
perder precisin:
(3.2.2.2) Calcula el rea de un crculo, dado su radio, que ser un nmero entero
Ejercicios propuestos:
Console.WriteLine("Introduce el radio");
radio = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("La longitud de la circunferencia es");
Console.WriteLine(2 * pi * radio);
using System;
// Ejemplo_03_02_02a.cs
// Nmeros reales: valor inicial de un float
// Introduccin a C#, por Nacho Cabanes
As, podemos crear un programa que pida al usuario el radio de una circunferencia
de muy poco.
Otra forma alternativa es forzar una "conversin de tipos", como veremos dentro
float x = 2;
using System;
// Ejemplo_03_02_02a.cs
// Nmeros reales (2: double)
// Introduccin a C#, por Nacho Cabanes
resultado ms preciso:
Cifras significativas 7
Valor ms grande
Tamao en bits
dinero obtenido viene dado por la frmula del inters compuesto: Resultado = e
(3.2.3.3) Halla las soluciones de una ecuacin de segundo grado del tipo y = Ax2 +
tiempo necesario para recorrerla (como tres nmeros: horas, minutos, segundos),
(3.2.3.2) Crea un programa que pida al usuario a una distancia (en metros) y el
(3.2.3.1) Calcula el volumen de una esfera, dado su radio, que ser un nmero de
Ejercicios propuestos:
punto, que ser ignorado. Por ejemplo, ocurre si introducimos los datos 23,6 y
operativo, de modo que si ste sabe que en nuestro pas se usa la "coma" para
using System;
longitud = 2 * pi * radio;
Console.WriteLine("Introduce el radio");
radio = Convert.ToDouble(Console.ReadLine());
using System;
// Ejemplo_03_02_04a.cs
// Nmeros reales: typecast
// Introduccin a C#, por Nacho Cabanes
"double".
resultados hasta esa cantidad de trminos. Debes hacer todas las operacion con
expresin: pi/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 ... El usuario deber
x2 - 1
(1+ i)n Aplicarlo para calcular en cuanto se convierten 1.000 euros al cabo de 10
Una forma de conseguirlo es crear una cadena de texto a partir del nmero,
slo un decimal.
dos cifras decimales, o que una nota se muestre redondeada, sin decimales, o con
puede interesar que una cifra que corresponde a dinero se muestre siempre con
pantalla, para mostrar slo una cierta cantidad de decimales: por ejemplo, nos
tantos trminos como indique el usuario. Debes hacer todas las operacion con
de PI mediante la expresin: pi/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 (...) con
(3.2.4.2) Crea una nueva versin del un programa que calcula una aproximacin
(3.2.4.1) Crea un programa que calcule la raz cuadrada del nmero que
Ejercicios propuestos:
numero.ToString("N1") );
numero.ToString("N3") );
numero.ToString("0.0") );
numero.ToString("0.000") );
numero.ToString("#.#") );
numero.ToString("#.###") );
#.###
12,3
12,340
12,3
12,340
12,3
12,34
Console.WriteLine(
Console.WriteLine(
Console.WriteLine(
Console.WriteLine(
Console.WriteLine(
Console.WriteLine(
using System;
// Ejemplo_03_02_05a.cs
// Formato de nmeros reales
// Introduccin a C#, por Nacho Cabanes
Introduce el radio
2,3456789
La longitud de la circunferencia es
14,7383356099727
Y con simple precisin
14,73834
Y como nmero entero
14
decimales".
Su resultado sera:
este texto)
reales, y nos bastar con dos cifras decimales. Se deber pedir al usuario los
ancho y alto (permetro = suma de los cuatro lados; rea = base x altura; diagonal,
usando el teorema de Pitgoras). Muestra todos ellos con una cifra decimal.
f7
11110111
Su resultado sera:
using System;
using System;
// Ejemplo_03_02_06b.cs
// De hexadecimal y binario a decimal
// Introduccin a C#, por Nacho Cabanes
// Ejemplo_03_02_06a.cs
// De decimal a hexadecimal y binario
// Introduccin a C#, por Nacho Cabanes
es as: un nmero que empiece por 0 (no por 0x) se considera que est escrito en
10). En los lenguajes C y C++, un valor precedido por "0" se considera octal, de
modo que para "int n2 = 013;" el valor decimal de n2 sera 8+3=11, pero en C# no
destacar que una constante hexadecimal se puede expresar precedida por "0x",
informtica son tambin muy frecuentes la base 2 (el sistema binario) y la base 16
(3.2.6.1) Crea un programa que pida nmeros (en base 10) al usuario y muestre su
(3.2.5.2) Crea un programa que use tres variables x,y,z. Las tres sern nmeros
Ejercicios propuestos:
(Si quieres saber ms sobre el sistema hexadecimal, mira los apndices al final de
Ejercicios propuestos:
letra = 'a';
Console.WriteLine("La letra es {0}", letra);
using System;
// Ejemplo_03_03_01a.cs
// Tipo de datos "char"
// Introduccin a C#, por Nacho Cabanes
As, un programa que de un valor inicial a una letra, la muestre, lea una nueva letra
letra = Convert.ToChar(Console.ReadLine());
anteriores: leemos toda una frase (que debera tener slo una letra) con ReadLine
Para leer valores desde teclado, lo podemos hacer de forma similar a los casos
letra = 'a';
char letra;;
Ejercicios propuestos:
19 26 13 12 201
Que mostrara:
Secuencia
Significado
\a
Emite un pitido
\b
Retroceso (permite borrar el ltimo carcter)
\f
Avance de pgina (expulsa una hoja en la impresora)
\n
Avanza de lnea (salta a la lnea siguiente)
\r
Retorno de carro (va al principio de la lnea)
\t
Salto de tabulacin horizontal
\v
Salto de tabulacin vertical
se avanzar a la lnea siguiente de pantalla (es preferible evitar este ltimo, porque
dobles, con \' unas comillas simples, con \\ se escribe una barra invertida y con \n
algn otro carcter poco habitual. Por ejemplo, con \" se escribirn unas comillas
una barra invertida (\) y que nos permiten conseguir escribir esas comillas dobles y
indicados entre parntesis y entre comillas dobles. Entonces surge una dificultad:
Como hemos visto, los textos que aparecen en pantalla se escriben con WriteLine,
(por ejemplo, 3) y una letra (por ejemplo, X) y escriba un rectngulo formado por
(3.3.1.3) Crea un programa que pida al usuario el ancho (por ejemplo, 4) y el alto
"aceg...".
(3.3.1.2) Crea un programa que muestre una de cada dos letras entre la que teclee
vocal.
(3.3.1.1) Crea un programa que pida una letra al usuario y diga si se trata de una
Ejercicios propuestos
deberamos
duplicar
todas
las
barras
invertidas:
ruta = @"c:\datos\ejemplos\curso\ejemplo1"
Windows,
otro salto
Comillas dobles: " y simples ', y barra \
Juguemos mas:
x
x
x
if (frase == "Hola!")
Console.WriteLine("Hola a ti tambin! ");
using System;
// Ejemplo_03_04a.cs
// Uso basico de "string"
// Introduccin a C#, por Nacho Cabanes
As, un ejemplo que diera un valor a un "string", lo mostrara (entre comillas, para
son tan fciles de manejar como los dems tipos de datos que hemos visto. Los
muestre en pantalla juntas, pero en orden inverso, y entre comillas dobles. Por
(3.3.2.1) Crea un programa que pida al usuario que teclee cuatro letras y las
Ejercicio propuesto
using System;
// Ejemplo_03_03_02a.cs
// Secuencias de escape
// Introduccin a C#, por Nacho Cabanes
\'
\"
\\
\0
complejas (es la alternativa ms natural a los "break"). Un ejemplo que pida una
letra y diga si es una vocal, una cifra numrica u otro smbolo, usando variables
"bool" podra ser:
// Ejemplo_03_05a.cs
// Variables bool
// Introduccin a C#, por Nacho Cabanes
prximo tema.
Ejercicios propuestos:
ultimoNivel)))"
sino
simplemente
"if
}
// Ejemplo ms desarrollado
if (enemigos ==0) && (nivel == ultimoNivel)
partidaTerminada = true;
else
partidaTerminada = true;
// Notacin alternativa, sin usar "if"
partidaTerminada = (enemigos ==0) && (nivel == ultimoNivel);
// Ejemplo bsico
partidaTerminada = false;
if (vidas == 0) partidaTerminada = true;
// Notacin alternativa, sin usar "if"
partidaTerminada = vidas == 0;
operador condicional.
(3.5.4) Crea una versin alternativa del ejercicio 3.5.3, que use "if" en vez del
(3.5.3) Crea un programa que use el operador condicional para dar a una variable
operador condicional.
(3.5.2) Crea una versin alternativa del ejercicio 3.5.1, que use "if" en vez del
llamada "iguales" (booleana) el valor "true" si los dos nmeros que ha tecleado el
(3.5.1) Crea un programa que use el operador condicional para dar a una variable
==
Ejercicios propuestos:
(nivel
comparacin:
&&
A las variables "bool" tambin se le puede dar como valor el resultado de una
0)
}
==
if (esCifra)
Console.WriteLine("Es una cifra numrica.");
else if (esVocal)
Console.WriteLine("Es una vocal.");
else
Console.WriteLine("Es una consonante u otro smbolo.");
(partidaTerminada) ..."
((enemigos
Este tipo de datos har que podamos escribir de forma sencilla algunas
bool encontrado;;
encontrado = true;
contrasea se debe introducir dos veces. Si las dos contraseas no son iguales, se
// Ejemplo_04_01_01a.cs
// Primer ejemplo de tablas (arrays)
// Introduccin a C#, por Nacho Cabanes
Revisin 0.99zz Pgina 113
ejemplo[0] = 15;
(ejemplo) y el nmero de elemento que nos interesa, pero con una precaucin: se
suma = numeros[0] +
// Hallamos la suma
numeros[1] + numeros[2] + numeros[3] + numeros[4];
Console.WriteLine("Su suma es {0}", suma);
using System;
// Ejemplo_04_01_02a.cs
// Segundo ejemplo de tablas: valores iniciales con []
// Introduccin a C#, por Nacho Cabanes
En este caso, los indicaremos todos entre llaves, separados por comas:
Al igual que ocurra con las variables "normales", podemos dar valor inicial a los
datos tecleados.
declaramos la variable:
Ejercicios propuestos:
numeros[0] = 200;
// Les damos valores
numeros[1] = 150;
numeros[2] = 100;
numeros[3] = -50;
numeros[4] = 300;
suma = numeros[0] +
// Y calculamos la suma
numeros[1] + numeros[2] + numeros[3] + numeros[4];
Console.WriteLine("Su suma es {0}", suma);
// Nota: esta es la forma ms ineficiente e incmoda
// Lo mejoraremos...
using System;
Cuando sepamos cuantos datos vamos a guardar (por ejemplo 4), podremos
int[
[] ejemplo;
un conjunto de elementos, todos los cuales son del mismo tipo, y a los que
Una tabla, vector, matriz o array (que algunos autores traducen por "arreglo") es
Ejemplo_04_01_03a.cs
Tercer ejemplo de tablas: valores iniciales con llaves
y recorrido con "for"
Introduccin a C#, por Nacho Cabanes
using System;
//
//
//
//
suma = 0;
for (int i=0; i<=4; i++)
suma += numeros[i];
un array, sin tener siempre que repetirlos todos, como hemos hecho en
(4.1.2.1) Un programa que almacene en una tabla el nmero de das que tiene
Ejercicios propuestos:
necesario usar "new" junto con el tamao, ya que el compilador lo puede deducir
Ejercicios propuestos:
suma = 0;
// Y calculamos la suma
for (int i=0; i<=4; i++)
suma += numeros[i];
using System;
// Ejemplo_04_01_03b.cs
// Cuarto ejemplo de tablas: introducir datos repetitvos
// Introduccin a C#, por Nacho Cabanes
En este caso, que slo sumbamos 5 nmeros, no hemos escrito mucho menos,
suma = 0;
for (int i=0; i<=4; i++)
suma += numeros[i];
frecuentes: buscar si existe un cierto dato, aadir un dato al final de los existentes,
insertar un dato entre dos que ya hay, borrar uno de los datos almacenados, etc.
Por eso, vamos a ver las pautas bsicas para realizar estas operaciones, y un
fuente de ejemplo.
(4.1.3.4) Un programa que almacene en una tabla el nmero de das que tiene
365).
(4.1.3.5) A partir del ejercicio anterior, crea otro que pida al usuario que le indique
respuesta muestre en pantalla el nmero de das que quedan hasta final de ao.
ver si est por encima o debajo de ese mximo o mnimo provisional, y cambiarlo
si fuera necesario.
dir si se encuentra o no entre los 10 que se han tecleado antes. Volver a pedir
teclee "fin".
pulse Intro sin teclear nada, momento en el que dejarn de pedirse ms nombres
desplazarse "hacia 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.
pida al usuario sus valores y calcule la suma de ambos vectores (su primera
que hasta ese momento es el mximo provisional. El valor inicial de este mximo
// Ejemplo_04_01_04a.cs
Revisin 0.99zz Pgina 118
huecos. Como en el caso anterior, habr que actualizar el contador, pero ahora
hay que comparar cada uno de los valores que tiene almacenados el array con el
muestre) cul es el mayor de ellos. Nota: para calcular el mayor valor de un array,
provisional no debera ser cero (porque el resultado sera incorrecto si todos los
Si se quiere borrar el dato que hay en una cierta posicin, los que estaban a
Para insertar un dato en una cierta posicin, los que queden detrs debern
al usuario valores para dichas componentes (por ejemplo [2, -5, 7]) y muestre su
Para poder aadir un dato al final de los ya existentes, necesitamos que el array
(4.1.3.6) Un programa que pida 10 nombres y los memorice (pista: esta vez se
Para ver si un dato existe, habr que recorrer todo el array, comparando el valor
cada mes (de un ao no bisiesto), pida al usuario que le indique un mes (ej. 2 para
introducir (por ejemplo, 10), le pida todos esos nmeros, los guarde en un array y
mostrarlos).
los muestre en orden inverso (pista: usa un array para almacenarlos y "for" para
(4.1.3.1) Crea un programa que pida al usuario 6 nmeros enteros cortos y luego
int i;
// Buscamos el mximo
int maximo = datos[0];
for (i=1; i<cantidad; i++)
if (datos[i] > maximo)
maximo = datos[i];
Console.WriteLine("El mximo es {0} ", maximo);
// Mostramos el array
for (i=0; i<cantidad; i++)
Console.Write("{0} ",datos[i]);
Console.WriteLine();
int capacidad = 5;
int cantidad = 3;
using System;
no es vlida.
(4.1.4.4) Crea una variante del ejemplo anterior (04_01_04a) que borre el dato que
posicin escogida es incorrecta (porque est ms all del final de los datos).
(4.1.4.3) Crea una variante del ejemplo anterior (04_01_04a) que inserte un dato
(4.1.4.2) Crea una variante del ejemplo anterior (04_01_04a) que aada un dato
dato a buscar, avise si ese dato no aparece, y que diga cuntas veces se ha
(4.1.4.1) Crea una variante del ejemplo anterior (04_01_04a) que pida al usuario el
Ejercicios propuestos:
"else", porque en cada pasada del bucle "for" no sabemos si el dato no existe, slo
testigo, de forma que al final nos avise si el dato no exista (no sirve emplear un
buscando. Se puede mejorar usando una variable "booleana" que nos sirva de
Este programa "no dice nada" cuando no se encuentra el dato que se est
10 15 12
15 encontrado en la posicin 2
El mximo es 15
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
using System;
// Cantidad de datos
Revisin 0.99zz Pgina 121
int datosAlumnos[2][20]
segundo ejemplo.
en C es emplear
y entonces sabemos
// Ejemplo_04_01_05a.cs
// Quinto ejemplo de tablas: constantes
// Introduccin a C#, por Nacho Cabanes
int datosAlumnos[2,20]
datosAlumnos[1,i] son los del segundo.
daremos ms detalles.
int datosAlumnos[40]
Se puede usar
que los datos de la forma datosAlumnos[0,i] son los del primer grupo, y los
quiere guardar datos de dos grupos de alumnos, cada uno de los cuales tiene 20
del ao. El usuario podr elegir entre verlos en orden natural (de Enero a
(4.1.5.1) Crea un programa que contenga un array con los nombres de los meses
Ejercicios propuestos:
As, una nueva versin del fuente del apartado 4.1.3 (b), usando una constante
en maysculas:
que la modifiquemos por error. Adems, por convenio, para que sea fcil
palabra "const" para indicar que debe ser constante, y el compilador no permitir
una variable. Dado que el valor de sta no debera cambiar, podemos usar la
mantenimiento del programa, puede ser preferible no usar el valor numrico, sino
4.1.5. Constantes
"adios"
Borrar el dato que hay en una cierta posicin (como se ha visto, lo que
quedn detrs debern desplazarse "a la derecha" para dejarle hueco; por
suma = 0;
// Y calculamos la suma
for (int i=0; i<MAXIMO; i++)
suma += numeros[i];
operaciones:
int[
[] numeros = new int[MAXIMO];
int suma;
// Ejemplo_04_02b.cs
// Array de arrays (array de dos dimensiones al estilo C)
// Introduccin a C#, por Nacho Cabanes
elementos de distinto tamao. En ese caso nos puede interesar saber su longitud,
La otra forma de tener arrays multidimensionales son los "arrays de arrays", que,
complejos que los que hemos visto hasta ahora. Si ya has estudiado la teora de
Este tipo de tablas de varias dimensiones son las que se usan tambin para
using System;
// Ejemplo_04_02a.cs
// Array de dos dimensiones "rectangulares" (estilo Pascal)
// Introduccin a C#, por Nacho Cabanes
arrays con valores prefijados, como arrays para los que reservemos espacio con
[2,20], lo que podramos llamar el "estilo Pascal". En este ejemplo usaremos tanto
} // Fin de "Main"
(4.2.3) Un programa que pregunte al usuario el tamao que tendrn dos bloques
Ejercicios propuestos:
2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0123456789
using System;
using System;
// Ejemplo_04_03_01a.cs
// Registros (struct)
// Introduccin a C#, por Nacho Cabanes
punto:
Ya desde el cuerpo del programa, para acceder a cada uno de los datos que
por lo que siempre les aadiremos delante la palabra "public" para indicar que
nosotros nos interesar que sean accesibles desde el resto de nuestro programa,
Los datos que forman un "struct" pueden ser pblicos o privados. Por ahora, a
dependientes.
(4.2.6) Un programa que calcule si las filas de una matriz son linealmente
pedir los datos para ambos bloques de datos. Finalmente deber mostrar el
persona.nombre = "Juan";
persona.inicial = 'J';
persona.edad = 20;
persona.nota = 7.5f;
Console.WriteLine("La edad de {0} es {1}",
persona.nombre, persona.edad);
personas[0].nombre = "Juan";
personas[0].inicial = 'J';
personas[0].edad = 20;
personas[0].nota = 7.5f;
Console.WriteLine("La edad de {0} es {1}",
using System;
// Ejemplo_04_03_02a.cs
// Array de struct
// Introduccin a C#, por Nacho Cabanes
vimos anteriormente.
varias personas si combinamos el uso de los "struct" con las tablas (arrays) que
debe pedir los datos de una cancin al usuario, almacenarlos en dicho "struct" y
Artista, Ttulo, Duracin (en segundos), Tamao del fichero (en KB). Un programa
(4.3.1.1) Crea un "struct" que almacene datos de una cancin en formato MP3:
Ejercicios propuestos:
2000), alto en pxeles (por ejemplo, 3000), tamao en Kb (por ejemplo 145,6). El
// Ejemplo_04_03_03a.cs
// Registros anidados
// Introduccin a C#, por Nacho Cabanes
partir de otras si las unimos con el smbolo de la suma (+), lo que llamaremos
Vamos a repasar todas esas posibilidades, junto con la de formar una cadena a
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. Para
Podemos encontrarnos con un registro que tenga varios datos, y que a su vez
cierto nombre.
todas las fichas (nmero y nombre de cada imagen), buscar la ficha que tenga un
su capacidad est llena). Debe permitir las opciones: aadir una ficha nueva, ver
De cada imagen se debe guardar: nombre (texto), ancho en pxeles (por ejemplo
programa debe ser capaz de almacenar hasta 700 imgenes (deber avisar cuando
Ejercicios propuestos:
persona.nombre = "Juan";
persona.inicial = 'J';
persona.diaDeNacimiento.dia = 15;
persona.diaDeNacimiento.mes = 9;
persona.nota = 7.5f;
Console.WriteLine("{0} naci en el mes {1}",
persona.nombre, persona.diaDeNacimiento.mes);
struct tipoPersona
{
public string nombre;
public char inicial;
public fechaNacimiento diaDeNacimiento;
public float nota;
}
using System;
nueva cancin, mostrar el ttulo de todas las canciones, buscar la cancin que
hasta 100 canciones. Deber tener un men que permita las opciones: aadir una
(4.3.2.1) Amplia el programa del ejercicio 4.3.1.1, para que almacene datos de
Ejercicios propuestos:
cadenas de texto).
"new", sus valores se dejan "vacos" (0 para los nmeros, cadenas vacas para las
La edad de Juan es 20
La edad de Pedro es 0
sera "personas[99].edad".
personas[1].nombre = "Pedro";
Console.WriteLine("La edad de {0} es {1}",
personas[1].nombre, personas[1].edad);
personas[[0].nombre, personas[0].edad);
"suma", el resultado sera 9). La operacin debes tomarla como una cadena de
using System;
con los operadores matemticos "+", "-", "*" y "/". Para multiplicar tambin se
// Ejemplo_04_04_03a.cs
// Cadenas de texto (3: longitud)
// Introduccin a C#, por Nacho Cabanes
como "for".
una operacin que realizar con ellos. La operacin podr ser "suma", "resta",
(4.4.1.4) Crea un programa que pida al usuario dos nmeros enteros y despus
una coma y el da del mes por una barra inclinada, as: "Juan, nacido el 31/12".
permite que podamos recorrer la cadena letra por letra, usando construcciones
Podemos saber cuantas letras forman una cadena con "cadena.Length". Esto
es su inicial.
Ejercicios propuestos:
using System;
// Ejemplo_04_04_02a.cs
// Cadenas de texto (2: acceder a una letra)
// Introduccin a C#, por Nacho Cabanes
adelante.
texto[0]='a'. Para eso habr que usar una construccin auxiliar, que veremos ms
Podemos leer una de las letras de una cadena, de igual forma que leemos los
Ejercicios propuestos:
if (nombre == "Alberto")
Console.WriteLine("Dices que eres Alberto?");
else
Console.WriteLine("As que no eres Alberto?");
using System;
// Ejemplo_04_04_01a.cs
// Cadenas de texto (1: manejo bsico)
// Introduccin a C#, por Nacho Cabanes
if (nombre.Contains("Juan")) ...
De forma similar, LastIndexOf ("ltima posicin de") indica la ltima aparicin (es
using System;
Para ver si una cadena contiene un cierto texto, podemos usar IndexOf ("posicin
Juan
Jua
Ju
pantalla:
a n".
cada letra de la siguiente con un espacio, similar al 4.4.3.1, pero esta vez usando
Ejercicios propuestos:
// Ejemplo_04_04_04a.cs
// Cadenas de texto (4: substring)
// Introduccin a C#, por Nacho Cabanes
saludo = frase.Substring(0,4);
Podemos extraer parte del contenido de una cadena con "Substring", que recibe
letra a letra.
(por ejemplo, de 30 cifras), que se debern pedir como cadena de texto y analizar
a letra.
ejemplo, de 30 cifras), que se debern pedir como cadena de texto y analizar letra
(4.4.3.4) Un programa capaz de sumar dos nmeros enteros muy grandes (por
finalmente diga si aparece esa letra como parte de esa frase o no.
(4.4.3.3) Un programa que pida al usuario una frase, despus una letra y
(4.4.3.2) Un programa que pida una frase al usuario y la muestra en orden inverso
Ejercicios propuestos:
nombre.Replace("Pepe", "Jose");
Revisin 0.99zz Pgina 133
Y su resultado sera
modificar. Pero s podemos realizar ciertas operaciones sobre ellas para obtener
exactamente al principio.
(4.4.5.2) Crea una versin del ejercicio 4.4.5.1 en la que, en caso de que alguno de
aparece como parte de alguno de los elementos del array. Terminar cuando el
luego le pregunte textos de forma repetitiva, e indique si cada uno de esos textos
using System;
using System;
Ejercicios propuestos:
// Ejemplo_04_04_06a.cs
// Cadenas de texto (6: manipulaciones diversas)
// Introduccin a C#, por Nacho Cabanes
// Ejemplo_04_04_05a.cs
// Cadenas de texto (5: substring)
// Introduccin a C#, por Nacho Cabanes
0
1
2
3
=
=
=
=
uno
dos
tres
cuatro
using System;
// Ejemplo_04_04_07a.cs
// Cadenas de texto: partir con "Split"
// Introduccin a C#, por Nacho Cabanes
Afortunadamente, C# nos permite hacerlo con Split, que crea un array a partir de
especialmente sencillo.
subcadenas que hay entre cada dos espacios y las guardaramos en el array. No es
dos espacios, tendremos tres palabras). En una segunda pasada, obtendremos las
saber el tamao del array que deber almacenar las palabras (por ejemplo, si hay
y muestre su suma.
(4.4.7.2) Un programa que pida al usuario varios nmeros separados por espacios
orden inverso.
(4.4.7.1) Un programa que pida al usuario una frase y muestre sus palabras en
Ejercicios propuestos:
using System;
// Ejemplo_04_04_07b.cs
// Cadenas de texto: partir con "Split" - 2
// Introduccin a C#, por Nacho Cabanes
seran mnimos:
cadena en varios fragmentos que estn delimitados por ciertos separadores. Por
Fragmento
Fragmento
Fragmento
Fragmento
siguiente).
redundantes que contenga (debe quedar slo un espacio entre cada palabra y la
(4.4.6.2) Un programa que pida al usuario una frase y elimine todos los espacios
(4.4.6.1) Una variante del ejercicio 4.4.5.2, que no distinga entre maysculas y
Ejercicios propuestos:
La
La
En
En
Si
Si
Si
cadenas
maysculas
antes
de
convertir,
bien
empleando
son algo ms complejos de manejar: hay de reservarles espacio con "new" (igual
Insert.
de unir varios substring o de borrar un fragmento con Remove y aadir otro con
Deberamos formar una nueva cadena en la que modificsemos esa letra a base
(4.4.8.2) Un programa que pida al usuario cinco frases, las guarde en un array y
(4.4.8.1) Un programa que pida al usuario dos frases y diga cual sera la "mayor"
Ejercicios propuestos:
Si escribimos "hOLa", que coincide con "hola" salvo por las maysculas, una
Si tecleamos una palabra como "gol", que comienza por G, que alfabticamente
string frase;
using System;
// Ejemplo_04_04_08a.cs
// Cadenas de texto y comparacin alfabtica
// Introduccin a C#, por Nacho Cabanes
String.Compare, al que indicamos las dos cadenas y un tercer dato booleano, que
ambas
if (frase.CompareTo("hola") > 0)
Console.WriteLine("La frase es mayor que hola");
mayor que 0 si la nuestra cadena es mayor que la que indicamos como parmetro
que" (>) que usamos con los nmeros no se puede aplicar directamente a las
otra, y eso algo que es necesario si queremos ordenar textos. El operador "mayor
palabra a adivinar, se muestre sta oculta con guiones (-----) y el programa acepte
los siguientes datos: Nombre del fichero, Tamao (en KB, un nmero de 0 a
siguientes operaciones:
Revisin 0.99zz Pgina 140
de hasta 1000 ficheros (archivos de ordenador). Para cada fichero, debe guardar
adelante).
de datos, como los arrays y las cadenas de texto (y otras que veremos ms
Vamos a hacer un ejemplo completo que use tablas ("arrays"), registros ("struct") y
Existe una construccin parecida a "for", pensada para recorrer ciertas estructuras
correctas cada vez que acierte (por ejemplo, a---a-t-). La partida terminar cuando
(4.5.1) Un programa que pida tu nombre y lo muestre con un espacio entre cada
que las letras de las posiciones impares (primera, tercera, etc.) estn en
las letras que introduzca el segundo usuario, cambiando los guiones por letras
Ejercicios propuestos:
using System;
// Ejemplo_04_05a.cs
// Ejemplo de "foreach"
// Introduccin a C#, por Nacho Cabanes
Ejercicios propuestos:
string cadenaNormal;
cadenaNormal = cadenaModificable.ToString();
Console.WriteLine("Cadena normal a partir de ella: {0}",
cadenaNormal);
using System;
using System.Text; // Usaremos un System.Text.StringBuilder
// Ejemplo_04_04_09a.cs
// Cadenas modificables con "StringBuilder"
// Introduccin a C#, por Nacho Cabanes
que hacamos en ciertas ocasiones con los Arrays), y se pueden convertir a una
// Ejemplo_04_06a.cs
// Tabla con muchos struct y men para manejarla
// Introduccin a C#, por Nacho Cabanes
comprobar varias opciones con "switch", etc. Aun as, haremos una ltima
Por otra parte, para revisar todas las fichas existentes, recorreremos desde la
espacio para 1000 datos, pero iremos aadiendo de uno en uno. Basta con contar
No debera resultar difcil. Vamos a ver directamente una de las formas en que se
3- Mostrar ficheros que sean de ms de un cierto tamao (por ejemplo, 2000 KB).
do {
// Menu principal, repetitivo
Console.WriteLine();
Console.WriteLine("Escoja una opcin:");
Console.WriteLine("1.- Aadir datos de un nuevo fichero");
Console.WriteLine("2.- Mostrar los nombres de todos los ficheros");
Console.WriteLine("3.- Mostrar ficheros por encima de un cierto
tamao");
Console.WriteLine("4.- Ver datos de un fichero");
Console.WriteLine("5.- Salir");
struct tipoFicha {
public string nombreFich;
public long tamanyo;
};
using System;
almacene en un "struct" y luego muestre los tres datos en una misma lnea,
(4.6.1) Un programa que pida el nombre, el apellido y la edad de una persona, los
Ejercicios propuestos:
ficheros.
cuando salgamos del programa se borrarn todos los datos que habamos
ejemplo, una pausa tras mostrar cada 25 datos). Por descontado, se nos pueden
que sera deseable que parase cuando se llenase la pantalla de informacin (por
ocurrir que aparezcan en pantalla tan rpido que no nos d tiempo a leerlos, as
Si nos muestra todos los datos en pantalla y se trata de muchos datos, puede
informacin que slo esos dos apartados de ejemplo que hemos previsto esta vez.
Por supuesto, en un caso real es habitual que cada ficha tenga que guardar ms
Este programa funciona, y hace todo lo que tiene que hacer, pero es mejorable.
una pgina; recuerda que puedes usar estilo Java si lo prefieres, pero en general el
anteriores, abre las llaves al final de cada lnea -estilo Java- y usa tabulaciones de 2
(Como quiz hayas notado, este fuente, que es un poco ms largo que los
fichas[
[i].nombreFich, fichas[i].tamanyo);
break;
x
x
x
ordenar los datos por nombre. Para ello, debers buscar informacin sobre algn
(4.6.9) Ampliar la base de datos de ficheros (ejemplo 04_06a) para que se permita
cadena vaca.
indicar que no desea modificar un cierto dato, en vez de reemplazarlo por una
esa modificacin, se deber permitir al usuario pulsar Intro sin teclear nada, para
modificar un cierto dato a partir de su nmero (por ejemplo, el dato nmero 3). En
(4.6.8) Mejorar la base de datos de ficheros (ejemplo 04_06a) para que se pueda
borrar un cierto dato (habr que "mover hacia atrs" todos los datos que haba
(4.6.7) Ampliar la base de datos de ficheros (ejemplo 04_06a) para que se pueda
los datos que lo contienen (por ejemplo, primero los que contienen "j", luego "ju",
usuario ir indicando letra a letra el texto que quiere buscar, y se mostrar todos
(4.6.6) Ampliar el ejercicio anterior (4.6.5) para que la bsqueda sea incremental: el
muestre todos los ficheros que contienen ese fragmento (usando "Contains" o
(4.6.5) Ampliar la base de datos de ficheros (ejemplo 04_06a) para que incluya una
(4.6.4) Mejorar la base de datos de ficheros (ejemplo 04_06a) para que no permita
(lgicamente, este men debe repetirse hasta que se escoja la opcin de "salir").
pulse Intro sin teclear nada). Entonces deber aparecer un men que permita:
pidiendo los datos uno por uno, hasta que un nombre se introduzca vaco (se
mostrar en pantalla los datos de las personas que cumplan los aos durante ese
Seleccin directa
(Nota: algunos autores hacen el bucle exterior creciente y otros decreciente, as:)
Mtodo de burbuja
Existen ligeras mejoras (por ejemplo, cambiar uno de los "for" por un "while", para
datos existen. Por tanto, para un array con 1.000 datos, podran llegar ser
pasada quede ordenado un nico dato, y habr que dar dan tantas pasadas como
mayora de ellos se basan en dos bucles "for" anidados, de modo que en cada
// BURBUJA
// (Intercambiar cada pareja consecutiva que no est ordenada)
// Para i=1 hasta n-1
//
Para j=i+1 hasta n
//
Si A[i] > A[j]
//
Intercambiar ( A[i], A[j])
Console.WriteLine("Ordenando mediante burbuja... ");
for(i=0; i < n-1; i++)
{
foreach (int dato in datos) // Muestro datos
Console.Write("{0} ",dato);
Console.WriteLine();
using System;
// Ejemplo_04_07a.cs
// Ordenaciones simples
// Introduccin a C#, por Nacho Cabanes
(Es mejorable, no intercambiando el dato que se mueve con cada elemento, sino
Insercin directa
Nota: el smbolo "<>" se suele usar en pseudocdigo para indicar que un dato es
}
Console.Write("Ordenado:");
if (i != menor)
{
datoTemporal = datos2[i];
datos2[i] = datos2[menor];
datos2[menor] = datoTemporal;
}
int menor = i;
for(j=i+1; j < n; j++)
if (datos2[j] < datos2[menor])
menor = j;
// SELECCIN DIRECTA:
// (En cada pasada busca el menor, y lo intercambia al final de la
// INSERCION DIRECTA:
// (Comparar cada elemento con los anteriores -que ya estn
ordenados// y desplazarlo hasta su posicin correcta).
// Para i=2 hasta n
//
j=i-1
//
mientras (j>=1) y (A[j] > A[j+1])
//
Intercambiar ( A[j], A[j+1])
//
j = j - 1
Console.WriteLine("Ordenando mediante insercin directa... ");
pasada)
datoTemporal = datos[i];
datos[i] = datos[j];
datos[j] = datoTemporal;
}
Console.Write("Ordenado:");
Y su resultado sera:
}
Console.Write("Ordenado:");
j = i-1;
while ((j>=0) && (datos3[j] > datos3[j+1]))
{
datoTemporal = datos3[j];
datos3[j] = datos3[j+1];
datos3[j+1] = datoTemporal;
j--;
}
int[
[] datos3 = {5, 3, 14, 20, 8, 9, 1};
for(i=1; i < n; i++)
{
foreach (int dato in datos3) // Muestro datos
Console.Write("{0} ",dato);
Console.WriteLine();
using System;
// Ejemplo_04_07b.cs
// Bsqueda binaria
// Introduccin a C#, por Nacho Cabanes
bsqueda lineal har 500 comparaciones como media, mientras que una
puede suponer una enorme ganancia en velocidad: si tenemos 1.000 datos, una
entre un conjunto de datos que tiene la mitad de tamao que el anterior. Esto
buscado es mayor que el del punto central, se busca esta vez slo en la mitad
Una vez que los datos estn ordenados, podemos buscar uno concreto dentro de
ordenado, la bsqueda no se har hasta el final de los datos, sino hasta que se
usuario pueda "preguntar" si un cierto valor est en el array. Como el array est
(4.7.4) Amplia el ejercicio anterior, para aadir una segunda fase en la que el
aadir cada nuevo dato (todos los datos se mostrarn en la misma lnea,
(4.7.3) Un programa que pida al usuario varios nmeros, los vaya aadiendo a un
(4.7.1) Un programa que pida al usuario 6 nmeros en coma flotante y los muestre
Ejercicios propuestos:
{3},"+
2;
while(! terminado)
{
int puntoMedio = limiteInferior+(limiteSuperior-limiteInferior) /
int limiteInferior = 0;
int limiteSuperior = 999;
bool terminado = false;
// Y comenzamos a buscar
int valorBuscado = 1001;
Console.WriteLine("Buscando si aparece {0}...", valorBuscado);
en
la
que
nos
encontrar
las
llaves
completos
de
aadir cada nuevo dato (todos los datos se mostrarn en la misma lnea,
ordenar: un programa que pida al usuario varios nmeros, los vaya aadiendo a
(4.7.6) Crea una variante del ejercicio 4.7.3, pero usando esta vez Array.Sort para
Ejercicios propuestos:
permite compilar y ejecutar nuestros programas sin necesidad de salir del editor:
cambio tiene menos "plugins" para ampliar sus funcionalidades) es Geany, que s
using System;
bloques
columna
// Ejemplo_04_07c.cs
// Array.Sort
// Introduccin a C#, por Nacho Cabanes
problemas...
hace todo por nosotros... pero recuerda que no (slo) se trata de que conozcas la
punto medio del array; si nuestro dato es menor, se vuelve a probar en el punto
(4.7.5) Realiza una variante del ejercicio 4.7.4, que en vez de hacer una bsqueda
Ejercicios propuestos:
gestor de paquetes (Synaptic o el que sea) y todo suele funcionar a la primera (si
resultados:
Si, por el contrario, todo ha sido correcto, la ventana que nos muestra la ejecucin
nuestro compilador Mono (mcs.exe) seguida por "%f" para indicar que hay que
Nos aparecer una ventana de la que nos interesan dos casillas: la que permite
errores:
el Bloc de Notas. Van desde editores sencillos como Notepad2 o Scite hasta
gastar dinero y que harn tu rutina de programador mucho ms cmoda que con
Por supuesto, existen otros muchos editores gratuitos, que puedes utilizar sin
Nota: Las comillas dobles que rodean a "%e.exe" (y a "%f") permiten que se lance
"%e.exe"
En este caso, en la casilla "Ejecutar" bastar con escribir "%e.exe", para que se
que configurarlo una vez en Geany y se utilizar automticamente cada vez que
primeros programas, pero una vez que usamos editores ms avanzados, slo hay
Esto habra sido muy trabajoso para compilar desde lnea de comando nuestros
C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc "%f"
con "%f" para decir a Geany que cuando lance el compilador debe indicarle el
compilador se llama "csc.exe", y, al igual que para Mono, la lnea debe terminar
una carpeta que indica el nmero de versin de la plataforma .Net (por ejemplo,
muy pronto. Despus, entre llaves indicaremos todos los pasos que queremos que
palabras reservadas, como "public static void", cuyo significado iremos viendo
de unos parntesis vacos, como hacamos con "Main", y precedindolo por ciertas
hecho, la forma bsica de definir una funcin ser indicando su nombre seguido
En C#, al igual que en C y los dems lenguajes derivados de l, todos los "trozos de
o "funciones". En el lenguaje C y sus derivados (entre los que est C#), el nombre
sean ms sencillos).
varias ventajas:
trozos ms pequeos, que sean ms fciles de resolver. Esto nos puede suponer
pasos. Esto es razonable cuando los problemas son sencillos, pero puede no ser la
Hasta ahora hemos estado pensando los pasos que deberamos dar para resolver
LeerDatosDeFichero();
Revisin 0.99zz Pgina 157
datos simple como las que hicimos en el tema anterior, podra ser simplemente:
using System;
// Ejemplo_05_02a.cs
// Funcion "Saludar"
// Introduccin a C#, por Nacho Cabanes
"Saludar" seran parte de nuestra "class", es decir, el fuente completo sera as:
funcin:
Ahora desde dentro del cuerpo de nuestro programa, podramos "llamar" a esa
mensajes en la pantalla:
Por ejemplo, podramos crear una funcin llamada "Saludar", que escribiera varios
MostrarMenu();
opcion = PedirOpcion();
switch( opcion ) {
case 1: BuscarDatos(); break;
case 2: ModificarDatos(); break;
case 3: AnadirDatos(); break;
...
tomara como "double", que permite mayor precisin... pero a cambio nosotros
(recordemos que el sufijo "f" sirve para indicar al compilador que trate ese nmero
EscribirNumeroReal(2.3f);
interese (que podra ser con exactamente 3 decimales). Lo podramos hacer as:
resultar til crear una funcin auxiliar que nos los muestre con el formato que nos
Por ejemplo, si escribimos en pantalla nmeros reales con frecuencia, nos puede
nombre.
uno de ellos, deberemos indicar su tipo de datos (por ejemplo "int") y luego su
del parntesis que sigue al nombre de la funcin, separados por comas. Para cada
que queremos que trabaje. Los llamaremos "parmetros" y los indicaremos dentro
Es muy frecuente que nos interese indicarle a nuestra funcin ciertos datos con los
entre varias funciones debern estar fuera de todas ellas, y debern estar
modo que el "Main" sea breve y ms legible (Pista: las variables que se compartan
formato por 3 filas con 3 asteriscos cada una. Incluye un "Main" para probarla.
(5.2.1) Crea una funcin llamada "BorrarPantalla", que borre la pantalla dibujando
Ejercicios propuestos:
do {
por una letra mayscula (y recordemos que, hasta que conozcamos las
verbo.
del ancho y alto que se indiquen como parmetros. Incluye un Main para probarla.
Pero eso no es lo que ocurre con las funciones matemticas que estamos
"Saludar".
como hacamos hasta ahora con "Main" y como hicimos con nuestra funcin
podemos hacerlo indicando al principio que el tipo de datos va a ser "void" (nulo),
Cuando queremos dejar claro que una funcin no tiene que devolver ningn valor,
using System;
// Ejemplo_05_03b.cs
// Funcion "EscribirSuma"
// Introduccin a C#, por Nacho Cabanes
De modo que un programa completo de ejemplo para una funcin con dos
una letra que tambin se indique como parmetro. Completa el programa con un
rectngulo hueco del ancho y alto que se indiquen como parmetros, formado por
tipo y el nombre para cada uno de ellos (incluso si todos son del mismo tipo), y
del ancho (y alto) que se indique como parmetro. Completa el programa con un
Ejercicios propuestos:
x= 5.1f;
Console.WriteLine("El primer numero real es: ");
EscribirNumeroReal(x);
Console.WriteLine(" y otro distinto es: ");
EscribirNumeroReal(2.3f);
using System;
// Ejemplo_05_03a.cs
// Funcion "EscribirNumeroReal"
// Introduccin a C#, por Nacho Cabanes
Console.Write( a+b );
using System;
// Ejemplo_05_04a.cs
// Funcion "Cuadrado"
// Introduccin a C#, por Nacho Cabanes
resultado = Cuadrado( 5 );
nmero entero. Eso s, todas nuestras funciones seguirn siendo "public static"
as:
ejemplo, podramos crear una funcin para elevar un nmero entero al cuadrado
clculos, para poderlo usar desde cualquier otra parte de nuestro programa. Por
De igual modo, para nosotros tambin ser habitual crear funciones que realicen
nmero).
operacin (por ejemplo, la raz cuadrada de un nmero tiene como resultado otro
texto. Prueba esta funcin para calcular la primera letra de la frase "Hola".
(5.4.4) Crea una funcin "Inicial", que devuelva la primera letra de una cadena de
cero.
(5.4.3) Crea una funcin llamada "Signo", que reciba un nmero real, y devuelva un
(5.4.2) Crea una funcin "Menor" que calcule el menor de dos nmeros enteros
se indique como parmetro. El resultado deber ser otro nmero real. Prueba esta
(5.4.1) Crea una funcin "Cubo" que calcule el cubo de un nmero real (float) que
Ejercicios propuestos:
hacer que una funcin mal diseada haga que el compilador nos d un aviso de
segundo ejemplo, podemos hacer una funcin que nos diga cul es el mayor de
numero=
= 5;
resultado = Cuadrado(numero);
Console.WriteLine("El cuadrado del numero {0} es {1}",
numero, resultado);
Console.WriteLine(" y el de 3 es {0}", Cuadrado(3));
Vamos a ver el uso de variables locales con un ejemplo. Crearemos una funcin
"atributos"
Aun as, esta restriccin es menos grave en lenguajes modernos, como C#, que en
trozo de programa pueda afectar al resto. La forma correcta de pasar datos entre
programa trabaje con sus propios datos, y ayudamos a evitar que un error en un
locales (lo ideal sera que todas lo fueran). As hacemos que cada parte del
deber llevar siempre la palabra "static" (dentro de poco veremos el motivo real y
acceder desde cualquier parte. Por ahora, para nosotros, una variable global
todos los "bloques" de programa, ser una "variable global", a la que se podr
slo ese bloque las conocer, no se podrn usar desde ningn otro bloque del
Hasta ahora, hemos declarado las variables dentro de "Main". Ahora nuestros
un cuadrado que tenga como lado el nmero que se ha indicado como parmetro.
3 3 3 3 3
i=5;
obtendramos un
modificarlo), slo desde "Main". Este ejemplo no contiene ninguna variable global.
mensaje de error. De igual modo, "num1" y "num2" son locales para "Main": desde
En este caso, las variables "temporal" e "i" son locales a la funcin "potencia": para
using System;
// Ejemplo_05_05a.cs
// Ejemplo de funcin con variables locales
// Introduccin a C#, por Nacho Cabanes
usaremos la orden "for" para multiplicar tantas veces como haga falta:
cosas como "6 elevado a 100" (o en general nmeros que pueden ser grandes),
de texto. Prueba esta funcin para calcular la ltima letra de la frase "Hola".
3 elevado a 5
cuerpo del programa que la use. La forma de conseguir elevar un nmero a otro
(5.4.5) Crea una funcin "UltimaLetra", que devuelva la ltima letra de una cadena
using System;
// Ejemplo_05_06a.cs
// Dos variables locales con el mismo nombre
// Introduccin a C#, por Nacho Cabanes
**
***
****
"tringulo" formado por esa letra, que tenga como anchura inicial la que se ha
(5.5.6) Crea una funcin "Tringulo" que reciba una letra y un nmero, y escriba un
devuelva como resultado la suma de sus dgitos. Por ejemplo, si el nmero fuera
(5.5.5) Crea una funcin "SumaCifras" que reciba un numero cualquiera y que
2 veces).
devuelva la cantidad de veces que dicha letra aparece en la cadena. Por ejemplo, si
(5.5.4) Crea una funcin "ContarLetra", que reciba una cadena y una letra, y
(5.5.3) Crea una funcin "EsPrimo", que reciba un nmero y devuelva el valor
nmero entero, y escriba la tabla de multiplicar de ese nmero (por ejemplo, para
aceptable. Deber pedir al usuario que introduzca el valor tantas veces como sea
(5.5.1) Crea una funcin "PedirEntero", que reciba como parmetros el texto que
Ejercicios propuestos:
una palabra reservada en C#, que no podremos usar como nombre de variable).
static int n = 7;
using System;
// Ejemplo_05_06b.cs
// Una variable global
// Introduccin a C#, por Nacho Cabanes
todas ellas:
funcionamiento del programa, siguen siendo distintas, porque cada una est en
de "Main". El hecho de que las dos variables tengan el mismo nombre no afecta al
Por qu? Sencillo: tenemos una variable local dentro de "cambiaN" y otra dentro
n vale 5
Ahora n vale 5
dichos datos.
valor", es decir, la funcin no recibe los datos originales, sino una copia de ellos. Si
llamar a una funcin que tenga parmetros por referencia si los parmetros no
Esto se debe a que, si no indicamos otra cosa, los parmetros "se pasan por
devolver un valor de una funcin, pero con parmetros pasados por referencia
posibilidad que no se podra conseguir de otra forma: con "return" slo se puede
El hecho de poder modificar valores que se reciban como parmetros abre una
n vale 5
El valor recibido vale 5
y ahora vale 10
Ahora n vale 10
using System;
n vale 5
El valor recibido vale 5
y ahora vale 10
Ahora n vale 5
using System;
// Ejemplo_05_07a.cs
// Modificar una variable recibida como parmetro - acercamiento
// Introduccin a C#, por Nacho Cabanes
ejemplo:
// Ejemplo_05_07b.cs
// Modificar una variable recibida como parmetro - correcto
// Introduccin a C#, por Nacho Cabanes
as:
En algunos lenguajes, una funcin debe estar declarada antes de usarse. Esto no
Tambin, una forma simple de obtener un nico nmero "casi al azar" entre 0 y
crear un objeto de tipo "Random" (una nica vez), y luego llamaremos a "Next"
funciona correctamente.
usando parmetros por referencia. Crea un "Main" que te permita comprobar que
y devuelva las letras N y C (primera letra, y letra situada tras el primer espacio),
(5.7.2) Crea una funcin "Iniciales", que reciba una cadena como "Nacho Cabanes"
y para un juego s suele ser conveniente que haya algo de azar, para que una
que la pruebe.
no es habitual que podamos permitir que las cosas ocurran al azar. Pero los juegos
using System;
// Ejemplo_05_08a.cs
// Funcin tras Main
// Introduccin a C#, por Nacho Cabanes
(5.7.1) Crea una funcin "Intercambiar", que intercambie el valor de los dos
Ejercicios propuestos:
Si pruebas este ejemplo, vers que no compila si cambias "out" por "ref", a no ser
using System;
// Ejemplo_05_07c.cs
// Parmetros "out"
// Introduccin a C#, por Nacho Cabanes
tienen valor inicial. Por ejemplo, una funcin que devuelva la primera y segunda
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
(5.9.1.3) Mejora el programa del ahorcado (4.4.9.3), para que la palabra a adivinar
array de dos dimensiones (con tamaos 24 para el alto y 79 para el ancho), que
(5.9.1.4) Crea un programa que genere un array relleno con 100 nmeros reales al
no sea tecleada por un segundo usuario, sino que se escoja al azar de un "array"
Ejercicios propuestos:
using System;
// Ejemplo_05_09_01a.cs
// Nmeros al azar
// Introduccin a C#, por Nacho Cabanes
seno, coseno y tangente. Recuerda que las funciones trigonomtricas esperan que
(5.9.2.6) Crea una funcin "Distancia", que calcule la distancia entre dos puntos
encuentra ms cerca de ese dato en valor absoluto (es decir, el ms prximo, sea
guarde en un array, pida un nuevo dato y muestre el valor del array que se
(5.9.2.5) Crea un programa que pida al usuario 5 datos numricos reales, los
guarde en un array, pida un nuevo dato y muestre el valor del array que se
(5.9.2.4) Haz un programa que pida al usuario 5 datos numricos enteros, los
calcula con
existe, se devolver como valor 100.000 para esa solucin. Pista: la solucin se
Deber devolver los valores de las dos soluciones x1 y x2. Si alguna solucin no
(5.9.2.3) Haz un programa que resuelva ecuaciones de segundo grado, del tipo ax
elevar 2 a 1/3.
(por ejemplo, 3 para la raz cbica). Pista: hallar la raz cbica de 2 es lo mismo que
(5.9.2.2) Crea un programa que halle cualquier raz (de cualquier orden) de un
(5.9.2.1) Crea un programa que halle (y muestre) la raz cuadrada del nmero que
Ejercicios propuestos:
using System;
1! = 1
El factorial de 1 es 1:
mismo problema. Una funcin recursiva es aquella que se "llama a ella misma",
5.10. Recursividad
que hasta ahora hemos llamado "rdenes", son realmente "funciones", como
palabras reservadas (int, float, string, if, switch, for, do, while...), gran parte de lo
(5.9.2.7) Crea un programa que pida al usuario un ngulo (en grados) y muestre su
// Ejemplo_05_09_02a.cs
// Ejemplo de funciones trigonometricas
// Introduccin a C#, por Nacho Cabanes
using System;
// Ejemplo_05_10a.cs
// Funciones recursivas: factorial
// Introduccin a C#, por Nacho Cabanes
programar as:
n! = n (n-1)!
siguiente nmero:
cmo pasar del caso "n-1" al caso "n" (por ejemplo, si ya has invertido las 5
base (qu longitud debera tener una cadena para que sea trivial darle la vuelta) y
(5.10.6) Crea un programa que emplee recursividad para dar la vuelta a una
(5.10.5) Crea un programa que emplee recursividad para calcular el mayor de los
primeros).
elemento, cmo podras emplear esta informacin para conocer la suma de los 7
sumar para que dicha suma sea trivial) y cmo pasar del caso "n-1" al caso "n" (por
hasta). Nuevamente, piensa cul ser el caso base (cuntos elementos podras
(5.10.4) Crea un programa que emplee recursividad para calcular la suma de los
serie Fibonacci (en la que los dos primeros elementos valen 1, y para los restantes,
nmero entero a otro nmero entero de forma NO recursiva (lo que llamaremos
(5.10.2) Como alternativa, crea una funcin que calcule el valor de elevar un
puede calcular de forma trivial) y cmo pasar del caso "n-1" al caso "n" (por
debe crear de forma recursiva. Piensa cul ser el caso base (qu potencia se
(5.10.1) Crea una funcin que calcule el valor de elevar un nmero entero a otro
Ejercicios propuestos:
recursividad.
as:
ciertas opciones que le indicamos como argumentos. Por ejemplo, bajo Linux o
En este caso, la orden sera "ls", y las dos opciones (argumentos o parmetros) que
ls l *.cs
"return" cuando nos interese (igual que antes, por convenio, devolviendo 0 si todo
y Windows se puede leer desde un fichero BAT o CMD usando "IF ERRORLEVEL",
cualquier otro sistema operativo de la familia Unix, podemos ver la lista detallada
Este valor se podra comprobar desde el sistema operativo. Por ejemplo, en MsDos
algn error.
Es decir, entre parntesis indicamos un cierto cdigo, que suele ser (por convenio)
Environment.Exit(1);
como
Pues bien, estas opciones que se le pasan al programa se pueden leer desde C#.
dir *.cs
recursiva a Quicksort para cada una de las dos mitades. El caso base de la funcin
luego se recoloca el array de modo que los elementos menores que el pivote
por tomar un elemento del array, llamado "pivote" (por ejemplo, el punto medio);
siguiente idea: para ordenar un array entre dos posiciones "i" y "j", se comienza
formada a partir de sus letras en orden. Por ejemplo, si recibes la palabra "Hhoola"
(5.10.10) Crea una funcin que reciba una cadena de texto, y una subcadena, y
letra a letra. Una funcin debe ser iterativa y la otra debe ser recursiva.
de una cadena. No puedes usar "Contains" ni "IndexOf", sino que debes analizar
(5.10.9) Crea dos funciones que sirvan para saber si un cierto texto es subcadena
entero positivo que divide a ambos: - Dividir m por n para obtener el resto r (0 r
y n, tal que m > n, para encontrar su mximo comn divisor, es decir, el mayor
"DABALEARROZALAZORRAELABAD" es un palndromo.
(5.10.7) Crea, tanto de forma recursiva como de forma iterativa, una funcin diga
...
return 0;
Por
cdigo 2 si alguno de los dos nmeros con los que se quiere operar no tiene un
(5.11.4) Crea una variante del ejercicio 5.11.3, en la que Main devuelva tambin el
(5.11.3) Crea una variante del ejercicio 5.11.2, en la que Main devuelva el cdigo 1
(5.11.2) Crea una calculadora bsica, llamada "calcula", que deber sumar, restar,
ejemplo, si se teclea "suma 2 3" deber responder "5", si se teclea "suma 2"
(5.11.1) Crea un programa llamado "suma", que calcule (y muestre) la suma de dos
Ejercicios propuestos:
return 0;
if (args.Length == 0)
{
Console.WriteLine("No ha indicado ningn parmetro!");
Environment.Exit(1);
}
using System;
// Ejemplo_05_11a.cs
// Parmetros y valor de retorno de "Main"
// Introduccin a C#, por Nacho Cabanes
aparece una pantalla de bienvenida, que nos recuerda detalles como la cantidad
de la descripcin del problema, y subrayar los nombres con un color y los verbos
Una forma de "descubrir" los objetos que forman parte de un programa es partir
colaboran entre s.
bloque tenga unas responsabilidades claras, y que cada bloque no dependa de los
Esta descomposicin no debe ser arbitraria. Por ejemplo, ser deseable que cada
personas.
Y cuando comenzamos una partida, veremos una pantalla como sta, que vamos a
x
x
x
x
x
x
x
objetos.
en otro color), que indicarn las acciones que puede realizar cada uno de esos
subrayamos con un rotulador de marcar), que indicarn los objetos en los que
A partir de esa descripcin, podemos buscar los nombres (puede ayudar si los
pasamos por una pantalla de "bienvenida", que muestra una animacin que nos
pantalla o cuando impactan con algo. Si un disparo del enemigo impacta con
Tanto nuestro disparo como los de los enemigos desaparecen cuando salen de la
se destruyen poco a poco cuando les impactan los disparos. Nos atacan (nos
que puede disparar. Nuestra nave se esconde detrs de "torres defensivas", que
de partida):
posiblemente habra que refinar ms adelante, pero que nos servir como punto
podramos hacer una primera descripcin del juego en lenguaje natural (que
clase "Coche".
Revisin 0.99zz Pgina 183
objetos que tienen una serie de caractersticas comunes. Por ejemplo, un Honda
(simplificado):
x
x
una posicin, dada por sus coordenadas "x" e "y". Ser capaz de hacer
ms genrico).
Tanto la "Nave" como las "Torres", los "Enemigos" y el "Ovni" son tipos
disparar.
x
x
un "Ovni".
podran ser de tres tipos distintos, pero no afinaremos tanto por ahora) y
Algunos de los detalles que se pueden leer de ese diagrama (y que deberan
elementos que deban moverse por ellos mismos, como los enemigos o el
de ficheros en C#.
legibilidad o dejar hueco para nuevas clases que hayamos descubierto que
distintos tipos de diagramas para representar los posibles "casos de uso" de una
int ancho;
// Ancho en centimetros
int alto;
// Alto en centimetros
int color;
// Color en formato RGB
bool abierta; // Abierta o cerrada
herramientas grficas que nos ayuden a visualizar las clases y las relaciones que
existen entre ellas, como hemos hecho para el Space Invaders. Tambin se puede
parte de "un todo", en vez de estar separados en distintas partes del programa.
Como curiosidad, cabe mencionar que en los proyectos grandes es habitual usar
realizar ese objeto, que llamaremos sus "mtodos"). Atributos y mtodos formarn
Las clases en C# se definen de forma parecida a los registros (struct), slo que
empezaremos a crear proyectos sencillos en los que colaboren varias clases, que
otra del movimiento del bloque de enemigos, otra de las peculiaridades de cada
Nosotros no vamos a hacer proyectos tan grandes (al menos, no todava), pero s
Ejercicio propuesto:
En los prximos ejemplos partiremos de una nica clase en C#, para ampliar
actualizados).
aplicacin, la secuencia de acciones que se debe seguir, las clases que la van a
int ancho;
// Ancho en centimetros
int alto;
// Alto en centimetros
int color;
// Color en formato RGB
bool abierta; // Abierta o cerrada
using System;
// Ejemplo_06_02a.cs
// Primer ejemplo de clases
// Introduccin a C#, por Nacho Cabanes
Vamos a completar un programa de prueba que use un objeto de esta clase (una
correctamente).
(y adems, nos pueden "mostrar su estado", para comprobar que todo funciona
parte de una clase (los "atributos") tienen un valor inicial predefinido: 0 para los
Se puede ver que en C# (pero no en todos los lenguajes), las variables que forman
Vamos a abrir...
Ancho: 0
Alto: 0
Color: 0
Abierta: True
Valores iniciales...
Ancho: 0
Alto: 0
Color: 0
Abierta: False
(Nota: al compilar, puede que obtengas algn "Aviso" -warning- que te dice que
Este fuente ya no contiene una nica clase (class), como todos nuestros ejemplos
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
pblico, sino privado, y no ser accesible desde otras clases (en nuestro
ser:
Revisin 0.99zz Pgina 189
As, una nueva versin del programa, que incluya ejemplos de Get y Set, podra
palabras inglesas "Get" y "Set" para leer y cambiar un valor, respectivamente. As,
cmo llamar a a estos mtodos en espaol, por lo que es frecuente usar las
CambiarAncho, que lo reemplazase por otro valor. No hay un convenio claro sobre
Por ejemplo, para conocer y modificar los valores del "ancho" de una puerta,
Aun as, en nuestro caso no podemos hacer directamente "p.abierta = true" desde
registros (struct).
de cada uno por el nombre de la variable y por un punto, como hacamos con los
Vemos tambin que se accede a los mtodos y a los datos precediendo el nombre
booleanos.
nmeros, una cadena vaca para las cadenas de texto, "false" para los datos
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.SetAncho(80);
p.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
int ancho;
// Ancho en centimetros
int alto;
// Alto en centimetros
int color;
// Color en formato RGB
bool abierta; // Abierta o cerrada
using System;
// Ejemplo_06_02b.cs
// Clases, get y set
// Introduccin a C#, por Nacho Cabanes
hecho en el curso hasta ahora, no era necesario, porque eran muy simples).
fichero fuente, de forma que se puedan localizar con rapidez (en los que hemos
Main de prueba.
"cilindrada" (nmero entero), potencia (nmero real). No hace falta que crees un
(6.2.4) Crea una clase "Coche", con atributos "marca" (texto), "modelo" (texto),
int ancho;
// Ancho en centimetros
int alto;
// Alto en centimetros
int color;
// Color en formato RGB
bool abierta; // Abierta o cerrada
using System;
tambin un Main (en la misma clase), que cree un objeto de la clase Libro, d
Geany permite crear "proyectos" formados por varios fuentes, pero no resulta una
teclear una orden como la anterior, pero no supone ninguna gran ganancia;
Mono:
En ese caso, el ejecutable obtenido tenda el nombre del primero de los fuentes
// Puerta.cs
// Clases, get y set
// Introduccin a C#, por Nacho Cabanes
strings) y mtodos Get y Set adecuados para leer su valor y cambiarlo. Prepara
Para compilar un programa formado por varios fuentes, basta con indicar los
clase "Libro", que contendr atributos "autor", "titulo", "ubicacion" (todos ellos
(6.2.3) Para guardar informacin sobre libros, vamos a comenzar por crear una
para salir" y se parar hasta que el usuario pulse Intro. Prepara tambin un Main
anterior, crea una clase Juego,que slo contenga un mtodo Lanzar, void, sin
que crear dos objetos de tipo Persona, les asignar un nombre a cada uno y les
clase llamada PruebaPersona. Esta clase deber contener slo la funcin Main,
que escribir en pantalla "Hola, soy " seguido de su nombre. Crea tambin una
(6.2.1) Crea una clase llamada Persona, en el fichero "persona.cs". Esta clase
Ejercicios propuestos:
VisualStudio (del que existe una versin gratuita, conocida como Express), que nos
Aun as, para estos proyectos formados por varias clases, lo ideal es usar algn
Y lo compilaramos con:
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.SetAncho(80);
p.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
using System;
// Ejemplo_06_03a.cs
// Usa la clase Puerta
// Introduccin a C#, por Nacho Cabanes
algn error).
momento de escribir este texto tambin existe una versin 5.0, pero todava est
para las versiones 2.0 a 4.5.1 de la plataforma .Net, ocupa unos 15 Mb. En el
para Windows.
puede requerir un equipo relativamente potente, vamos a comenzar por ver una
lo que un programador novel como nosotros puede necesitar. Aun as, como
errores...
rpidamente, que marquen dentro del propio editor la lnea en la que estn los
permitan crear todas las clases con comodidad, saltar de una clase a clase otra
En nuestro caso, comenzaremos por crear una "Nueva solucin", desde el men
Cuando hagamos doble clic en nuestro nuevo icono, veremos la pantalla principal
Se nos mostrar los tipos de proyectos para los que se nos podra crear un
"Tools" (herramientas):
Podemos cambiar el idioma del interfaz, para que todos los mens y opciones
Elemento:
del fuente, para que ste se detenga hasta que pulsemos la tecla Intro).
leerla, nos puede interesar aadir provisionalmente una lnea ReadLine() al final
(Si la ventana de nuestro programa se cierra tan rpido que no tenemos tiempo de
completar.
y obtendramos un nuevo esqueleto vaco (esta vez sin "Main"), que deberamos
deberemos indicar:
Normalmente, el tipo de elemento que nos interesar ser una clase, cuyo nombre
ISO de DVD", deberemos grabarla en un DVD o extraerla con 7-zip o WinRar para
que se reciban los ficheros necesarios. Si, por el contrario, descargamos la "imagen
lo suficientemente moderna).
que se complete el proceso (puede ser necesario tener que reiniciar el ordenador
fichero, hacer doble clic para comenzar (si descargamos y esperar un momento a
Windows Desktop-)
http://www.visualstudio.com/es-es/products/visual-studio-express-vs
de:
visto. La versin Express, que es gratuita para uso personal, se puede descargar
una cierta fluidez. Instalar y emplear este entorno es muy similar a lo que hemos
Si nuestro equipo es moderno, posiblemente nos permitir usar Visual Studio con
ejecutara de la misma forma que cuando estaba integrado por una nica clase.
Nuestro programa, que ahora estara formado por dos clases, se compilara y se
(para Visual Studio 2013; puede ser ligeramente distinta en otras versiones o si
La pantalla principal, una vez completada la instalacin, debera ser similar a sta
interfaces de usuario).
corriente elctrica.
fuente, que en este caso no contiene "Main". Cuando el programa est listo,
para jugar". El mtodo Lanzar de la clase Partida escribir en pantalla "sta sera la
para Visual Studio o SharpDevelop. Adems de la clase "Juego", crea una clase
(6.3.3) Crea un proyecto a partir de la clase Libro (ejercicio 6.2.3). El "Main" pasar
contener slo la funcin Main, que crear dos objetos de tipo Persona, les asignar
que escribir en pantalla "Hola, soy " seguido de su nombre. Crea tambin una
ficheros: Crea una clase llamada Persona, en el fichero "persona.cs". Esta clase
(6.3.2) Modifica el fuente del ejercicio 6.2.1 (clase Persona), para dividirlo en dos
(6.3.1) Crea un proyecto con las clases Puerta y Ejemplo_06_03a. Comprueba que
Ejercicio propuesto:
instalar apenas en un par de clics con el gestor de paquetes del sistema (por
VisualStudio, pero tiene una alternativa muy similar, desarrollada por el mismo
Puedes usar
// Ejemplo_06_04a.cs
using System;
Puedes observar que ese "MostrarEstado" no dice nada sobre el ancho ni el alto
programa como vlido; ms adelante veremos que existe una alternativa a "new" y
que ya existe ese mtodo y que sabemos seguro que lo queremos redefinir (si no
nos diga tambin si la puerta est bloqueada. Para eso, basta con volverlo a
algo que ya exista. Por ejemplo, nos puede interesar que "MostrarEstado" ahora
No tenemos por qu heredar todo tal y como era; tambin podemos "redefinir"
que un Portn tendr un cierto ancho, o un color, o que se puede abrir: todo eso
que ya habamos definido para Puerta. Por eso, no hace falta indicar nuevamente
ser:
Con "public class Porton: Puerta" indicamos que Porton debe "heredar" todo lo
bool bloqueada;
// Porton.cs
// Clase que hereda de Puerta
// Introduccin a C#, por Nacho Cabanes
color, abierto o no), pero adems se podr bloquear, lo que supondr un nuevo
"Puerta". Un portn tendr las mismas caractersticas que una puerta (ancho, alto,
existente. Por ejemplo, vamos a crear una clase "Porton" a partir de la clase
Vamos a ver ahora cmo definir una nueva clase de objetos a partir de otra ya
6.4. La herencia
que crear un objeto de tipo coche, pedir al usuario su marca, modelo, cilindrada
clase Coche, existir una clase PruebaDeCoche, que contendr la funcin "Main",
juego.
finalmente esperar a que el usuario pulse Intro para terminar la falsa sesin de
El mtodo Lanzar de la clase Partida crear una nave en las coordenadas (500,
Crea tambin clase Enemigo, con los mismos atributos. Su imagen podra ser "][".
pantalla (como esta versin es para consola, la X tendr que rebajarse para que
mueva a una nueva posicin, y un mtodo Dibujar, que muestre esa imagen en
pensando en una pantalla de 1024x768), e imagen (un string formado por dos
Nave, con atributos "x" e "y" (nmeros enteros, "x" de 0 a 1023 e "y" entre 0 y 767,
(6.3.6) Ampla el esqueleto del ConsoleInvaders (ejercicio 6.3.5): Crea una clase
Intro para jugar o ESC para salir". Puedes comprobar si se pulsa ESC con
Intro.
pantalla de juego. Pulse Intro para salir" y se parar hasta que el usuario pulse
Se
crear
una
nueva
clase
PersonaInglesa,
en
el
fichero
(6.4.1) Crea un proyecto con las clases Puerta, Portn y Ejemplo_06_04a. Prueba
Slo querramos que esos datos estuvieran disponibles para todos los tipos de
Ejercicios propuestos:
Nos podramos sentir tentados de declarar como "public" los atributos como el
ser pblico, porque nuestras clases y su "Main" lo han sido siempre hasta ahora.
Hemos manejado con frecuencia la palabra "public", para indicar que algo debe
6.5. Visibilidad
Vehiculo contendr todos los atributos y mtodos que antes estaban en Coche, y
(6.4.5) Ampla el proyecto de la clase Coche (ejercicio 6.3.7): Crea una clase
ahora).
los atributos y mtodos que son comunes a las antiguas (todos los existentes, por
(6.4.4) Ampla el esqueleto del ConsoleInvaders (ejercicio 6.3.6): Crea una clase
Get y Set.
de la que Libro heredar todos sus atributos y mtodos. Ahora la clase Libro
(6.4.3) Ampla el proyecto del ejercicio 6.3.3 (Libro): crea una clase "Documento",
nombre, les pedir que saluden y pedir a la persona inglesa que tome t.
crear dos objetos de tipo Persona y uno de tipo PersonaInglesa, les asignar un
fichero "pruebaPersona2.cs". Esta clase deber contener slo la funcin Main, que
"personaInglesa.cs".
cambia.
(6.4.2) Crea una variante ampliada del ejercicio 6.3.2. En ella, la clase Persona no
Ahora el portn...
Portn.
Bloqueada: True
Vamos a abrir...
Ancho: 80
Alto: 0
Color: 0
Abierta: True
Valores iniciales...
Ancho: 0
Alto: 0
Color: 0
Abierta: False
Y su resultado sera:
Console.WriteLine("Ahora el portn...");
Porton p2 = new Porton();
p2.SetAncho(300);
p2.Bloquear();
p2.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.SetAncho(80);
p.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
using System;
int ancho;
//
int alto;
//
int color;
//
bool abierta; //
Ancho en centimetros
Alto en centimetros
Color en formato RGB
Abierta o cerrada
Console.WriteLine("Ahora el portn...");
Console.WriteLine();
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.SetAncho(80);
p.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
using System;
// Ejemplo_06_05a.cs
// Portn, que hereda de Puerta, con "protected"
// Introduccin a C#, por Nacho Cabanes
As, un nico fuente completo que declarase la clase Puerta, la clase Porton a partir
hayamos indicados
general, ser preferible usar "private" a no escribir nada, por legibilidad, para
Si quisiramos dejar claro que algn elemento de una clase debe ser totalmente
protected
protected
protected
protected
ms:
"protected" ser accesible por las clases derivadas de la actual, pero por nadie
int ancho;
//
int alto;
//
int color;
//
bool abierta; //
Ancho en centimetros
Alto en centimetros
Color en formato RGB
Abierta o cerrada
// Porton.cs
// Clase que hereda de Puerta
// Introduccin a C#, por Nacho Cabanes
// ------------------------------------------
protected
protected
protected
protected
// Puerta.cs
// Clases, get y set
// Introduccin a C#, por Nacho Cabanes
// ------------------------------------------
bool bloqueada;
tambin
una
clase
llamada
PruebaPersona3,
en
el
fichero
"
el usuario pulse Intro sin hacer nada, sino que ahora usar un do-while que
ejemplo, puede haber otro constructor que nos permita indicar el ancho y el alto:
(6.5.3) Retoca el proyecto del ejercicio 6.4.3 (Libro): los atributos de la clase
tome t.
public Puerta()
{
ancho = 100;
alto = 200;
color = 0xFFFFFF;
abierta = false;
}
valores iniciales de 100 para el ancho, 200 para el alto, etc., podra ser as:
tipo de retorno. Por ejemplo, un "constructor" para la clase Puerta que le diera los
reservar memoria si fuera necesario, para leer informacin desde fichero, etc.
un objeto de una clase, y se suele usar para dar esos valores iniciales, para
Pero puede ocurrir que nosotros deseemos dar valores iniciales que no sean cero.
defecto para los atributos. Por ejemplo, para un nmero entero, se le da el valor 0.
Hemos visto que al declarar una clase, automticamente se dan valores por
(6.5.5) Mejora el proyecto de la clase Coche (ejercicio 6.4.5): todos los atributos
("Console.Clear();").
Si se pulsan las flechas, la nave se mover a un lado o a otro (con los mtodos que
compruebe si pulsa ESC (para salir) o flecha izquierda o flecha derecha (para
asignar un nombre, les pedir que saluden y pedir a la persona inglesa que
crea
"Persona", pero redefinir el mtodo "Saludar", para que escriba en pantalla "Ciao";
modificar para que redefina el mtodo "Saludar", para que escriba en pantalla
(6.5.2) Ampla las clases del ejercicio 6.4.2, creando un nuevo proyecto con las
(6.5.1) Crea un proyecto a partir del ejemplo 06.05a, en el que cada clase est en
Ejercicios propuestos:
int ancho;
//
int alto;
//
int color;
//
bool abierta; //
Ancho en centimetros
Alto en centimetros
Color en formato RGB
Abierta o cerrada
public Puerta()
{
ancho = 100;
alto = 200;
color = 0xFFFFFF;
abierta = false;
}
protected
protected
protected
protected
// ------------------------------------------
Console.WriteLine();
Console.WriteLine("Para la segunda puerta...");
p2.MostrarEstado();
Console.WriteLine();
Console.WriteLine("Vamos a abrir...");
p.Abrir();
p.MostrarEstado();
Console.WriteLine("Valores iniciales...");
p.MostrarEstado();
using System;
// Ejemplo_06_06a.cs
// Constructores
// Introduccin a C#, por Nacho Cabanes
Un programa de ejemplo que usara estos dos constructores para crear dos
tendr de ancho 100 y de alto 200, mientras que si lo declaramos con "Puerta p2 =
nombre.
Revisin 0.99zz Pgina 214
constructor alternativo para esta clase que permita escoger cualquier otro
constructores. Los constructores de casi todas las clases estarn vacos, excepto
(6.6.1) Ampliar las clases del ejercicio 6.5.2, para que todas ellas contengan
Ejercicios propuestos:
~Puerta()
{
// Liberar memoria
// Cerrar ficheros
}
necesitarn.
tampoco sabemos). Nuestros programas son tan sencillos que todava no los
ancho = an;
alto = al;
color = 0xFFFFFF;
abierta = false;
(6.7.2) Ampla el proyecto del ejercicio 6.6.2 (Libro): la clase Libro tendr un
segundo constructor que permita dar valores al autor y el ttulo, pero no a la
ubicacin, que tomar el valor por defecto "No detallada".
(6.7.3) Ampla el esqueleto del ConsoleInvaders (6.6.3): La clase Nave tendr un
segundo constructor, sin parmetros, que prefijar su posicin inicial a (500,600).
La clase Enemigo tendr un segundo constructor, con parmetros X e Y, para
poder colocar un enemigo en cualquier punto desde Main.
(6.7.4) Crea dos nuevos mtodos en la clase Vehiculo (ejercicio 6.6.4): uno llamado
Circular, que fijar su "velocidad" (un nuevo atributo) a 50, y otro Circular(v), que
fijar su velocidad al valor que se indique como parmetro.
(6.6.2) Ampla el proyecto del ejercicio 6.5.3 (Libro): la clase Libro tendr un
iniciales, para que se puedan cambiar desde el cuerpo del programa. Elimina las
"Puerta(int ancho, int alto)", que se llaman igual pero reciben distintos
mtodo Saludar, que reciba un parmetro, que ser el texto que debe decir esa
(6.7.1) A partir de las clases del ejercicio 6.6.1, aade a la clase "Persona" un nuevo
Ejercicios propuestos:
// ------------------
Gato a4
= new Gato();
Console.WriteLine();
Perro a3
= new Perro();
Console.WriteLine();
using System;
// Ejemplo_06_08a.cs
// Orden de llamada a los constructores
// Introduccin a C#, por Nacho Cabanes
"GatoSiams", que deriva de una clase "Gato", que a su vez procede de una clase
puede tener varias formas, ya sea porque reciba distintos tipos de parmetros y/o
public Animal()
{
Console.WriteLine("Ha nacido un animal");
}
Ejercicios propuestos:
Ha nacido un animal
Ha nacido un gato
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un gato
Ha nacido un gato siams
Ha nacido un animal
// ------------------
// ------------------
// ------------------
trabajador".
(6.8.4) Crea una versin alternativa de las clases Vehiculo, Coche, Moto (6.7.4), que
funcionamiento.
(6.8.3) Crea una versin alternativa del esqueleto del ConsoleInvaders (6.7.3) en la
funcionamiento.
(6.8.2) Crea una variante del proyecto Libro (ejercicio 6.7.2) en la que el
using System;
la cantidad ms frecuente).
todos los coches que podamos encontrar tendrn 4 ruedas, aunque esa sea
habitual, y por eso casi nunca usaremos atributos "static" (por ejemplo, no
para cualquier objeto que pertenezca a esa clase (cualquier coche). Por eso,
que es una "variable de clase", es decir, que su valor es el mismo para todos
// Ejemplo_07_01a.cs
// Mtodos "static"
// Introduccin a C#, por Nacho Cabanes
nuestros objetos no los estamos declarando como "static". Vamos a ver el motivo:
Desde un principio, nos hemos encontrado con que "Main" siempre iba
Ampla
el
ejemplo
07_01a
con
un
funcin
llamada
(7.1.1)
Ejercicios propuestos:
using System;
"static"
"clases").
// Ejemplo_07_01b.cs
// Alternativa a 07_01a, sin mtodos "static"
// Introduccin a C#, por Nacho Cabanes
Por eso, como nuestro "Main" debe ser static, deberemos siempre elegir entre:
Desde una funcin "static" no se puede llamar a otras funciones que no lo sean.
Hardware.
.BorrarPantalla();
Console.WriteLine("Borrado!");
// ------------------
// ------------------
using System;
// Ejemplo_07_02a.cs
// Array de objetos
// Introduccin a C#, por Nacho Cabanes
Perro[
[] misPerros = new Perro[5];
for (byte i = 0; i < 5; i ++)
misPerros[i] = new Perro();
luego para cada uno de los elementos. Por ejemplo, podramos partir del ejemplo
Deberemos usar "new" dos veces: primero para reservar memoria para el array, y
Es muy frecuente que no nos baste con tener un nico objeto de una clase, sino
(7.1.3) Crea una nueva versin del ejercicio 5.2.3 (base de datos de ficheros,
nacido
nacido
nacido
nacido
nacido
nacido
nacido
nacido
nacido
nacido
un
un
un
un
un
un
un
un
un
un
animal
perro
animal
perro
animal
perro
animal
perro
animal
perro
// Ejemplo_07_02b.cs
Un ejemplo ms detallado:
que realmente contenga objetos de distintas subclases (en este caso, unos de
en una misma fila (todos compartirn una misma coordenada Y, pero tendrn
(7.2.3) Ampla el esqueleto del ConsoleInvaders (6.7.3), para que haya 10 enemigos
hasta 1.000 libros. Main mostrar un men que permita aadir un nuevo libro o
(7.2.2) Ampla el proyecto Libro (ejercicio 6.7.2), de modo que permita guardar
tres objetos.
(7.2.1) Crea una versin ampliada del ejercicio 6.8.1 (clase Trabajador y
Ejercicio propuesto:
Ha
Ha
Ha
Ha
Ha
Ha
Ha
Ha
Ha
Ha
public Perro()
{
Console.WriteLine("Ha nacido un perro");
}
// ------------------
// ------------------
// ------------------
// ------------------
using System;
usar una "imagen" diferente. Puedes usar la "imagen" que quieras (siempre que
filas). Cada tipo de enemigos ser una subclase de Enemigo, que se distinguir por
enemigos de un mismo tipo, pero distinto del tipo de los elementos de las otras
enemigos, y un array que contenga 3x10 enemigos (3 filas, cada una con 10
(7.2.6) Ampla el esqueleto del ConsoleInvaders (7.2.3), para que haya tres tipos de
(7.2.5) Ampla el proyecto Libro (ejercicio 7.2.2), de modo que permita guardar
clase.
(7.2.4) A partir del ejemplo 07.02b y del ejercicio 6.8.1 (clase Trabajador y
Ejercicios propuestos:
Ha nacido un animal
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un gato
Ha nacido un gato siams
Ha nacido un animal
Ha nacido un gato
Ha nacido un animal
Ha nacido un perro
// ------------------
misAnimales[0].Hablar();
misAnimales[1].Hablar();
misAnimales[2].Hablar();
miPerro.Hablar();
miGato.Hablar();
miAnimal.Hablar();
using System;
// Ejemplo_07_03a.cs
// Array de objetos, sin "virtual"
// Introduccin a C#, por Nacho Cabanes
nico mtodo "Hablar", que se redefinir en cada una de las clases hijas, y
una de las clases derivadas, y hemos visto que los constructores se llaman
En el ejemplo anterior hemos visto cmo crear un array de objetos, usando slo la
miPerro.Hablar();
miGato.Hablar();
miAnimal.Hablar();
gato debera decir "Miau" y un animal genrico debera comunicarse. Eso es lo que
Estoy comunicndome...
Estoy comunicndome...
Estoy comunicndome...
Guau!
Miauuu
Estoy comunicndome...
eso es lo que deseas". Equivale a un "s, s que estoy redefiniendo este mtodo").
algo como "ests redifiniendo este mtodo; aade la palabra new para indicar que
void Hablar" sirve simplemente para anular un "warning" del compilador, que dice
(Recuerda que, como vimos en el apartado 6.4, ese "new" que aparece en "new
// ------------------
// ------------------
using System;
// Ejemplo_07_03b.cs
// Array de objetos, con "virtual"
// Introduccin a C#, por Nacho Cabanes
subclases), y emplear en las clases hijas la palabra "override" en vez de "new" (para
clases hijas, y que, en ese caso, debe prevalecer lo que indiquen las clases hijas.
el mtodo "Hablar" que se usa en la clase Animal quiz sea redefinido por otras
un array de perros y otros de gatos, sino poder crear un array de animales, y que
Guau!
Miauuu
Estoy comunicndome...
Revisin 0.99zz Pgina 228
// ------------------
// ------------------
// ------------------
pesar de que hayamos indicado que se trata de un Perro u otra subclase distinta.
misAnimales[0].Hablar();
misAnimales[1].Hablar();
misAnimales[2].Hablar();
miPerro..Hablar();
miGato.Hablar();
miAnimal.Hablar();
misAnimales[0].Hablar();
misAnimales[1].Hablar();
misAnimales[2].Hablar();
Animal[
[] misAnimales = new Animal[3];
pesar de que despus digamos que el primer elemento del array es un perro, el
La nave que
ampliarlas. En ese caso, no hace falta que volvamos a teclear todo lo que haca el
Puede ocurrir que en un mtodo de una clase hija no nos interese redefinir por
tipo de enemigos debe ser de un color distinto. (Nota: para cambiar colores
como debe.
formada por ttulo, autor y ubicacin, separados por guiones. Crea una clase
clase Libro, tendrn un mtodo ToString, que devuelva una cadena de texto
(7.3.4) Ampla el proyecto Libro (ejercicio 7.2.5): tanto la clase Documento como la
"new".
(7.3.3) Crea una variante del ejercicio anterior (7.3.2), que use "override" en vez de
clase, y exista un mtodo "Saludar" que se redefina en todas las clases hijas,
que se cree un nico array "de trabajadores", que contenga un objeto de cada
(7.3.2) Crea una variante del ejercicio 7.2.2 (array de Trabajador y derivadas), en la
(7.3.1) Crea una versin ampliada del ejercicio 6.5.1 (Persona, PersonaInglesa, etc),
Ejercicios propuestos:
programa, y especialmente si todos esos objetos van a ser parte de un nico array
Nota: Esto que nos acaba de ocurrir va a ser frecuente. Si el compilador nos avisa
Guau!
Miauuu
Estoy comunicndome...
// Linea en blanco
// ------------------
// ------------------
// ------------------
miGato.Hablar();
Console.WriteLine();
miGato2.Hablar();
using System;
// Ejemplo_07_04a.cs
// Ejemplo de clases: Llamar a la superclase
// Introduccin a C#, por Nacho Cabanes
Por ejemplo, podemos hacer que un Gato Siams hable igual que un Gato normal,
de la palabra "base".
Articulo.
(7.4.3) Refina el proyecto Libro (ejercicio 7.3.4), para que el mtodo ToString de la
(7.4.2) Crea una versin ampliada del ejercicio 7.4.1, en la que el constructor de
(7.4.1) Crea una versin ampliada del ejercicio 7.3.3, en la que el mtodo "Hablar"
Ejercicios propuestos:
parmetros).
de una clase derivada. Por ejemplo, si tenemos una clase "RectanguloRelleno" que
Miauuu
Pfff
Miauuu
Su resultado sera
En muchos casos, podemos evitar este uso de "this". Por ejemplo, normalmente es
// ------------------
using System;
// Ejemplo_07_05a.cs
// Primer ejemplo de uso de "this": parmetros
// Introduccin a C#, por Nacho Cabanes
que stos:
uso es dar valor a los atributos, incluso si los parmetros tienen el mismo nombre
Podemos hacer referencia al objeto que estamos usando, con "this". Un primer
// ------------------
using System;
// Ejemplo_07_05b.cs
// Segundo ejemplo de uso de "this": constructores
// Introduccin a C#, por Nacho Cabanes
// ------------------
// ------------------
using System;
// Ejemplo_07_05c.cs
// Dos clases que se usan mutuamente: recursividad indirecta
// Introduccin a C#, por Nacho Cabanes
valor de X.
este otro constructor, que recibe X e Y, y que se basa en el anterior para fijar el
entre s, y nos podramos sentir tentados de hacer que la clase Jugador tenga un
Jugador, heredar de ella las clases Jugador1 y Jugador2, que sern muy parecidas
La palabra "this" se usa mucho tambin para que unos objetos "conozcan" a los
private int x;
private int y;
private string texto;
Pero "this" tiene tambin otros usos. Por ejemplo, podemos crear un constructor
public Jugador1()
{
adversario = new Jugador2();
}
// ------------------
using System;
// Ejemplo_07_05d.cs
// Dos clases que se usan mutuamente: "Main" coordina
// Introduccin a C#, por Nacho Cabanes
ste crea un nuevo jugador1 (en vez de utilizar el ya existente), que a su vez crea
estamos creando una recursividad indirecta sin fin: el jugador1 crea un jugador2,
// ------------------
"puertas"), pero las clases contenidas no saben nada de la clase que las contiene
contenedora sabe los detalles de las clases contenidas (la "casa" conoce a sus
Hay que recordar que, en general, cuando una clase contiene a otras, la clase
// Y yo soy su adversario
adversario.SetAdversario( this );
public Jugador()
{
}
// ------------------
using System;
// Ejemplo_07_05e.cs
// Dos clases que se usan mutuamente: "this"
// Introduccin a C#, por Nacho Cabanes
Otra alternativa es que un Jugador le pueda decir a otro "yo soy tu adversario", y
como parmetros:
mtodo llamado "operador +", y que devolvera un dato esttico del tipo con el
hacer algo como "matriz3 = suma( matriz1, matriz2 )" podramos hacer
creado, de forma ms cmoda y legible. As, para sumar dos matrices, en vez de
significado, para poder sumar (por ejemplo) objetos que nosotros hayamos
operaciones. Por ejemplo, el operador "+" se usa para indicar que queremos
Los "operadores" son los smbolos que se emplean para indicar ciertas
puertas.
programa de prueba que cree una casa y muestre sus datos y los de sus tres
"MostrarEstado" que escriba su superficie. Cada casa debe contener 3 puertas. Las
(7.5.3) Crea una clase Casa, con una superficie (por ejemplo, 90 m 2) y un mtodo
(7.6.3) Crea una clase "Fraccion", que represente a una fraccin, formada por un
Crea tambin mtodos "get" y "set" para leer y modificar los valores de dichos
represente a un nmero complejo (formado por una parte "real" y una parte
(7.6.2) Si has estudiado los "nmeros complejos", crea una clase "Complejo", que
cambiar su valor).
crear mtodos "get" y "set" para leer los valores de posiciones de la matriz y para
sobrecargar el operador "+", pero no el operador "[]", de modo que tendrs que
mtodos para indicar el valor que hay en una posicin, leer el valor de una
(7.6.1) Desarrolla una clase "Matriz", que represente a una matriz de 3x3, con
Ejercicios propuestos:
una posicin.
mtodos Get para acceder a una posicin y mtodos Set para cambiar el valor de
corchetes estn entre los que no podremos cambiar. En su lugar, deberas crear
Eso s, debes tener presente que "no todo se puede redefinir". Por ejemplo,
simplemente
tres puertas.
Desde "Main", calcularamos una matriz como suma de otras dos haciendo
return nuevaMatriz;
otro mtodo "MostrarEstado" que escriba "Casa" y luego muestre el estado de sus
que muestre su ancho y su alto. Crea una clase Casa, que contenga 3 puertas y
(7.5.2) Crea una clase Puerta con un ancho, un alto y un mtodo "MostrarEstado"
(7.5.1) Crea una versin ampliada del ejercicio 7.4.2, en la que el constructor sin
Ejercicios propuestos:
que estamos (por ejemplo, una Matriz) y recibira dos datos de ese mismo tipo
"this" para que la conozcan, en vez de crear una nueva clase contenedora con
ejemplo.
Escribir, que escriba la fraccin en la forma "3 / 2". Redefine los operadores "+", "-",
"*" y "/" para que permitan realizar las operaciones habituales con fracciones.
dimensiones. Redefine los operadores "+" y "-" para sumar y restar dos vectores,
"*" para hallar el producto escalar de dos vectores y "%" para calcular su producto
vectorial.
(7.7.8) Crea en el proyecto Libro una clase ListaDeDocumentos, que oculte a Main
los detalles de que internamente se trata de un array: deber permitir opciones
como aadir un documento, obtener los datos de uno de ellos, buscar entre la
lista de todos ellos, etc. Los criterios de diseo quedan a tu criterio. Por ejemplo,
puedes hacer que la bsqueda devuelve un array con los nmeros de ficha
prueba es crear algn proyecto de una cierta complejidad, que incluya diferentes
clases, herencia, arrays de objetos, comunicacin entre dichos objetos, etc. Aqu
tienes unos cuantos ejercicios propuestos, sin solucin (y para los que no existir
laberinto de fondo, cuyas paredes no se puedan "pisar" (la clase Laberinto puede
premios que recoger, tres vidas para nuestro personaje y varios laberintos
casa, tambin existir un panel de control, desde el que el usuario podra controlar
hacia arriba hasta que desaparezca por la parte superior de la pantalla. Existir un
proyecto
el
en
ya
(7.7.10) Crea una clase Disparo en ConsoleInvaders. Cuando el usuario pulse cierta
usado
Console.Readkey
habrs
posiblemente
comprobar la posicin inicial del primer enemigo y la posicin final del ltimo
movimiento quedan a tu criterio, pero podran ser "wasd" o las flechas del cursor.
(que
mover a un personaje (que puede ser representado por una letra X). Las teclas de
clase
Dibujar, que mostrar todo el array en pantalla, y un mtodo Mover, que mover
una
con
(7.5.4),
ConsoleInvaders
de
correctamente.
esqueleto
el
(7.7.9)
Ampla
(7.7.1) Crea un proyecto "Space Invaders" con todas las clases que vimos al
ellas.
jugador y que se van rompiendo poco a poco cada vez que un disparo impacta con
de presentacin.
uno de esos disparos impacta con la nave, se perder una vida y el disparo
una nueva clase o ampliar las funcionalidades de la clase Disparo que ya tienes).
puedan disparar (los disparos de los enemigos "va hacia abajo"; piensa si crear
puntuacin y la cantidad de vidas restantes (que por ahora, siempre ser 3).
obtendr 10 puntos.
x
x
// Para StreamWriter
fichero = File.CreateText("prueba.txt");
fichero.WriteLine("Esto es una lnea");
fichero.Write("Esto es otra");
fichero.WriteLine(" y esto es continuacin de la anterior");
fichero.Close();
using System;
using System.IO;
// Ejemplo_08_01a.cs
// Escritura en un fichero de texto
// Introduccin a C#, por Nacho Cabanes
tendremos que comprobar los posibles errores. Por ejemplo, puede ocurrir que
Abrir el fichero.
pasos:
8. Manejo de ficheros
hacemos en la consola.
// Para StreamWriter
// Para StreamWriter
using System;
using System.IO;
// Ejemplo_08_01c.cs
// Escritura en un fichero de texto, con "using"
// Introduccin a C#, por Nacho Cabanes
Existe otra sintaxis, ms compacta, que nos permite olvidarnos (hasta cierto
using System;
using System.IO;
// Ejemplo_08_01b.cs
// Escritura en un fichero de texto, con constructor
// Introduccin a C#, por Nacho Cabanes
// Para StreamReader
// Ejemplo_08_02b.cs
// Lectura de un fichero de texto, con constructor
Revisin 0.99zz Pgina 244
CreateText.
fichero = File.OpenText("prueba.txt");
linea = fichero.ReadLine();
Console.WriteLine( linea );
Console.WriteLine( fichero.ReadLine() );
fichero.Close();
using System;
using System.IO;
// Ejemplo_08_02a.cs
// Lectura de un fichero de texto
// Introduccin a C#, por Nacho Cabanes
(8.1.3) Amplia el proyecto Libro (ejercicio 7.7.8), de modo que todos los datos se
programa.
que todos los datos se vuelquen a un fichero de texto al terminar la ejecucin del
(8.1.2) Crea una versin de la base de datos de ficheros (ejercicio 5.2.3), de modo
(8.1.1) Crea un programa que vaya leyendo las frases que el usuario teclea y las
Ejercicios propuestos:
// Para StreamReader
// Para StreamReader
Normalmente no querremos leer slo una frase del fichero, sino procesar todo su
alternativa de "using".
(8.2.3) Crea una versin alternativa del ejercicio 8.2.2, empleando la sintaxis
StreamReader.
(8.2.2) Crea una versin alternativa del ejercicio 8.2.1, usando el constructor de
(8.2.1) Crea un programa que lea las tres primeras lneas del fichero creado en el
Ejercicios propuestos:
using System;
using System.IO;
// Ejemplo_08_02c.cs
// Lectura de un fichero de texto, con "using"
// Introduccin a C#, por Nacho Cabanes
using System;
using System.IO;
si
queremos
procesar
todo
fichero.Close();
un
fichero,
esta
lectura
se lean desde fichero (si existe) en el momento de lanzar el programa (puedes usar
(8.3.4) Ampla la base de datos de ficheros (ejercicio 8.1.2), de modo que los datos
fichero.
lneas, para que d tiempo a leerlo. Cuando el usuario pulse la tecla Intro, se
(8.3.2) Crea una variante del ejemplo 08_03a, empleando "using" en vez de "Close".
"File.OpenText".
(8.3.1) Crea una variante del ejemplo 08_03a, empleando un constructor en vez de
Ejercicios propuestos:
fichero = File.OpenText("prueba.txt");
do
{
linea = fichero.ReadLine();
if (linea != null)
Console.WriteLine( linea );
}
while (linea != null);
using System;
using System.IO;
public class Ejemplo_08_03a
{
public static void Main()
{
StreamReader fichero;
string linea;
// Ejemplo_08_03a.cs
// Lectura de un fichero de texto completo
// Introduccin a C#, por Nacho Cabanes
Habitualmente,
una lnea, y comprobar si el resultado ha sido "null", lo que nos indicara que no se
fichero "log.txt", que puede existir anteriormente (y que no deber borrarse, sino
aadir al final de su contenido). Cada sesin acabar cuando el usuario pulse Intro
forma:
using System;
using System.IO;
// Ejemplo_08_04b.cs
// Aadir a un fichero de texto, con constructor y "using"
// Introduccin a C#, por Nacho Cabanes
pero entonces tendremos que emplear un segundo parmetro booleano, que ser
fichero = File.AppendText("prueba2.txt");
fichero.WriteLine("Segunda lnea");
fichero.Close();
fichero = File.CreateText("prueba2.txt");
fichero.WriteLine("Primera lnea");
fichero.Close();
using System;
using System.IO;
// Ruta absoluta
// Ruta relativa
(8.5.1) Crea un programa que pida al usuario pares de nmeros enteros y escriba
Ejercicios propuestos:
podemos indicar una arroba (@) justo antes de abrir las comillas, y entonces no
Como esta sintaxis puede llegar a resultar incmoda, en C# existe una alternativa:
para separar los nombres de los directorios, coincide con el carcter de control
Debemos recordar que, como la barra invertida que se usa en sistemas Windows
Si un fichero al que queremos acceder se encuentra en otra carpeta, basta con que
(8.4.1) Un programa que pida al usuario que teclee frases, y las almacene en el
// Ejemplo_08_04a.cs
// Aadir a un fichero de texto
// Introduccin a C#, por Nacho Cabanes
Ejercicios propuestos:
contengan esa frase. Cada frase se debe preceder del nmero de lnea (la primera
una frase a buscar, y que muestre en pantalla todas las lneas de ese fichero que
(8.3.5) Amplia el proyecto Libro (ejercicio 8.1.3), de modo que los datos se lean
de saber si existe).
Por ello, una forma ms eficaz de comprobar si ha existido algn tipo de error es
// Ejemplo_08_06a.cs
// Saber si un fichero existe
// Introduccin a C#, por Nacho Cabanes
booleana de control.
Revisin 0.99zz Pgina 249
(8.6.2) Mejora el ejemplo 08_06a para que no use "while (true)", sino una variable
(8.6.1) Mejora el ejercicio 8.3.4 para que compruebe antes si el fichero existe, y
Ejercicios propuestos:
using System;
using System.IO;
por ejemplo).
de intentar abrirlo:
try
{
fichero = File.OpenText(nombre);
do
{
linea = fichero.ReadLine();
if (linea != null)
Console.WriteLine( linea );
Revisin 0.99zz Pgina 250
using System;
using System.IO;
// Ejemplo_08_07a.cs
// Excepciones y ficheros (1)
// Introduccin a C#, por Nacho Cabanes
y los mensajes de error y/o acciones correctoras estarn en el bloque "catch". As,
Tpicamente, los pasos que puedan ser problemticos irn dentro del bloque "try"
del tema 2.
comprobar las posibles "excepciones", con las que ya tuvimos un contacto al final
El uso de "File.Exists" nos permite saber si el fichero existe, pero ese no es el nico
el prximo apartado.
realmente si el fichero existe o no, lo que puede suponer que nuestro programa
Hasta ahora, estamos intentando abrir ficheros para lectura, pero sin comprobar
se
pudo
encontrar
el
archivo
ruta
del
fichero
es
demasiado
"PathTooLongException").
La
"IOException").
larga
(excepcin
de
tipo
El fichero existe y es de slo lectura (se lanzar una excepcin del tipo
using System;
using System.IO;
// Ejemplo_08_07b.cs
// Excepciones y ficheros (2)
// Introduccin a C#, por Nacho Cabanes
que una simple "Exception", de forma que el mensaje de aviso sea ms concreto, o
As, dentro de cada bloque "catch" podramos indicar una excepcin ms concreta
"catch". Por ejemplo, en el caso de que queramos crear un fichero, podemos tener
recuperarse del error y seguir adelante, para lo que se suelen crear varios bloques
excepciones a la vez", sino crear un anlisis para cada caso, que permita
}
catch (Exception exp)
{
Console.WriteLine("Ha habido un error: {0}", exp.Message);
return;
}
fichero.Close();
}
while (linea != null);
resultado de dichos clculos (con la forma "15 * 6 = 90"). Debe controlar los
Ejercicios propuestos:
un texto).
Hay que recordar que, como la consola se comporta como un fichero de texto
las ltimas que analicemos, y las ms especficas debern ser las primeras.
fichero = File.CreateText(nombre);
fichero.WriteLine( linea );
fichero.Close();
}
catch (PathTooLongException e)
{
Console.WriteLine("Nombre demasiado largo!");
}
catch (IOException e)
{
Console.WriteLine("No se ha podido escribir!");
Console.WriteLine("El error exacto es: {0}", e.Message);
}
try
{
string linea;
;
vamos
ver
cmo
abrir
un
fichero
(no
fichero lgico.
video, etc.
nos interesar un nico modo, que ser "FileMode.Open", que nos permite leer
ficheros en los que la informacin est estructurada como una secuencia de bytes,
recibir dos parmetros: el nombre del fichero y el modo de apertura. Por ahora,
}
catch (Exception e)
{
Console.WriteLine("Error: "+e.Message);
return;
}
de cada lnea de texto, as que no podremos saltar hasta una cierta lnea).
ficheros de texto.
fichero si queremos llegar hasta cierto punto (como ocurre con las cintas de
fichero = File.OpenRead(nombre);
unDato = (byte) fichero.ReadByte();
Console.WriteLine("El byte leido es un {0}",
unDato);
fichero.Close();
try
{
using System;
using System.IO;
datos de una persona: nombre, direccin, e-mail, telfono, etc. Cada uno
estn guardados en distintos ficheros fsicos, pero los abramos y los leamos
ficheros fsicos (por ejemplo, los mapas de los niveles de un juego, que
// Ejemplo_08_09a.cs
// Ficheros binarios: lectura de un byte con FileStream
// Introduccin a C#, por Nacho Cabanes
Esta clase tiene un mtodo ReadByte, que devuelve un entero con valor -1 en caso
"agenda.txt".
acercamiento,
primer
Como
Llega el momento de concretar algunos conceptos que hemos pasado por encima,
posibles errores, como que los datos no sean numricos, la divisin entre cero, o
}
catch (Exception e)
try
{
using System;
using System.IO;
// Ejemplo_08_09c.cs
// Ficheros binarios: lectura de un byte con FileStream, using
// Introduccin a C#, por Nacho Cabanes
}
catch (Exception e)
{
Console.WriteLine("Error: "+e.Message);
return;
}
try
{
using System;
using System.IO;
// Ejemplo_08_09b.cs
// Ficheros binarios: lectura de un byte con FileStream, constructor
// Introduccin a C#, por Nacho Cabanes
Console.WriteLine("Error: "+e.Message);
return;
using System;
using System.IO;
// Ejemplo_08_10a.cs
// Ficheros binarios: lectura completa de un FileStream
// Introduccin a C#, por Nacho Cabanes
A partir de entonces, podramos usar un "for" para recorrer todo el fichero, as:
primera es descubrir el tamao del fichero, que podemos obtener con ".Length".
Tenemos dos formas de leer byte a byte todos datos que forma un FileStream. La
G, I, F.
(8.9.3) Abre una imagen GIF y comprueba si sus tres primeros bytes son las letras
bytes del fichero corresponden a una letra "B" y una letra "M", respectivamente.
(8.9.2) Abre una imagen BMP (cuyo nombre introducir el usuario) y comprueba si
bytes del fichero son un 77 (que corresponde a una letra "M", segn el estndar
(8.9.1) Abre un fichero con extensin EXE (cuyo nombre introducir el usuario) y
Ejercicios propuestos:
Los otros modos de apertura posibles (cuyos nombre en ingls son casi
using System;
using System.IO;
// Ejemplo_08_10b.cs
// Ficheros binarios: lectura completa de un FileStream
// Introduccin a C#, por Nacho Cabanes
un -1. Cuando esto ocurra, ser que seal de que se ha llegado al final del fichero.
La segunda forma de leer hasta el final del fichero es comprobar si el dato ledo es
using System;
using System.IO;
// Ejemplo_08_11a.cs
// Ficheros binarios: lectura por bloques de un FileStream
// Introduccin a C#, por Nacho Cabanes
(porque puede ser menos de lo que le hemos pedido, si hay un error de lectura o
devuelve un valor, que es la cantidad de datos que se han podido leer realmente
datos (no la posicin en el fichero, sino en el array, de modo que casi siempre ser
array guardar esos datos, a partir de qu posicin del array debe introducir los
Para eso, dentro de la clase "FileStream" tenemos mtodo "Read", que nos
Leer byte a byte puede ser cmodo, pero tambin es lento. Por eso, en la prctica
binario.
(8.10.4) Crea un programa que extraiga a un fichero de texto todos los caracteres
(8.10.3) Crea un programa que diga si un fichero (binario) contiene una cierta
fichero binario.
Ejercicios propuestos:
retroceder).
nmero negativo (si miramos desde el final del fichero, porque desde l habr que
Para ello, tenemos el mtodo "Seek". A este mtodo se le indican dos parmetros:
encuentra el dato que nos interesa leer. En un fichero binario, esto podemos
Cuando leemos byte a byte (y tambin a veces en el caso de leer todo un bloque),
Debers leer toda la cabecera (los primeros 54 bytes) con una sola orden.
mirando el valor del byte en la posicin 30 (empezando a contar desde 0). Si ese
(8.11.3) Abre una imagen GIF y comprueba si sus tres primeros bytes son las letras
bytes del fichero corresponden a una letra "B" y una letra "M", respectivamente.
(8.11.2) Abre una imagen BMP (cuyo nombre introducir el usuario) y comprueba
un array.
letra "M" y una letra "Z", respectivamente. Debes leer ambos bytes a la vez, usando
un ejecutable, mirando si los dos primeros bytes del fichero corresponden a una
Ejercicios propuestos:
fichero.Close();
mirando el valor del byte en la posicin 30 (empezando a contar desde 0). Si ese
Ejercicios propuestos:
hemos abierto permite realmente que nos movamos a unas posiciones u otras).
(Nota: existe una propiedad "CanSeek" que nos permite saber si el fichero que
using System;
using System.IO;
// Ejemplo_08_12a.cs
// Ficheros binarios: posicin
// Introduccin a C#, por Nacho Cabanes
(8.13.2) Abre una imagen en formato BMP y comprueba si comienza con el entero
using System;
using System.IO;
debajo, a su "BaseStream",
SeekOrigin.Begin);
as:
1,
ficheroEntrada.BaseStream.Seek(
directamente a nuestro fichero, sino al "Stream" (flujo de datos) que hay por
corto 19778.
corto 23117.
// Ejemplo_08_13b.cs
// Ficheros binarios: lectura de un short, byte a byte
// Introduccin a C#, por Nacho Cabanes
(8.13.1) Abre un fichero con extensin EXE y comprueba si comienza con el entero
Ejercicios propuestos:
using System;
using System.IO;
// Ejemplo_08_13c.cs
// Ficheros binarios: lectura de un short, con BinaryReader, using
// Introduccin a C#, por Nacho Cabanes
automticamente, as:
Si preferimos hacer esta lectura byte a byte, podremos usar tanto un FileStream
using System;
using System.IO;
// Ejemplo_08_13a.cs
// Ficheros binarios: lectura de un short, con BinaryReader
// Introduccin a C#, por Nacho Cabanes
usaremos la clase "BinaryReader". Por ejemplo, podramos leer el entero corto que
leer otros tipos de datos bsicos existentes en C# (short, int, float, etc.). Para eso
Un FileStream es cmodo para leer byte a byte, pero no tanto cuando queremos
TIPO DE INFORMACIN
Tipo de fichero (letras BM)
Tamao del archivo
POSICIN EN EL ARCHIVO
0-1
2-5
Un fichero BMP est compuesto por las siguientes partes: una cabecera de
fichero, una cabecera del bitmap, una tabla de colores y los bytes que
definirn la imagen.
fichero BMP.
posicin 22. Ampla el ejemplo 08_13d, para que muestre tambin el alto de ese
Ejercicios propuestos:
using System;
using System.IO;
// Ejemplo_08_13d.cs
// Ficheros binarios: Seek, con BinaryReader
// Introduccin a C#, por Nacho Cabanes
6-7
8-9
10-13
14-17
18-21
22-25
26-27
28-29
30-33
34-37
38-41
42-45
46-49
50-53
if (! File.Exists( nombre) )
{
Console.WriteLine("No encontrado!");
}
else
{
BinaryReader fichero = new BinaryReader(
File.Open(nombre, FileMode.Open));
using System;
using System.IO;
// Ejemplo_08_14a.cs
// Informacin de un fichero BMP, con BinaryReader
// Introduccin a C#, por Nacho Cabanes
Por tanto, ser fcil hacer que se nos muestren algunos detales, como su ancho,
Reservado
Reservado
Inicio de los datos de la imagen
Tamao de la cabecera de bitmap
Anchura (pxeles)
Altura (pxeles)
Nmero de planos
Tamao de cada punto
Compresin (0=no comprimido)
Tamao de la imagen
Resolucin horizontal
Resolucin vertical
Tamao de la tabla de color
Contador de colores importantes
using System;
using System.IO;
// Ejemplo_08_14b.cs
// Informacin de un fichero BMP, con FileStream
// Introduccin a C#, por Nacho Cabanes
otras operaciones, como el clculo de los valores enteros, que habr que
como la lectura, que se puede hacer toda en un bloque, pero a cambio complicar
fichero.Close();
// A continuacin: alto
int alto = fichero.ReadInt32();
Console.WriteLine("Alto: {0}", alto);
if (cantidadLeida != tamanyoCabecera)
{
Console.WriteLine("No se ha podido leer la cabecera");
}
else
{
// Analizo los dos primeros bytes
char marca1 = Convert.ToChar( cabecera[0] );
char marca2 = Convert.ToChar( cabecera[1] );
if (! File.Exists( nombre) )
{
Console.WriteLine("No encontrado!");
}
else
{
FileStream fichero = File.OpenRead(nombre);
int tamanyoCabecera = 54;
byte[] cabecera = new byte[tamanyoCabecera];
using System;
using System.IO;
// Ejemplo_08_15a.cs
// Ficheros binarios: escritura en FileStream
// Introduccin a C#, por Nacho Cabanes
volveremos a leer:
Vamos a ver un ejemplo que junte todo ello: crearemos un fichero, guardaremos
imagen GIF.
un programa que diga el ancho, alto y nmero de colores de una imagen PCX.
en el fichero).
(Nota: existe una propiedad "CanWrite" que nos permite saber si se puede escribir
}
catch (Exception e)
{
Console.WriteLine("Problemas: "+e.Message);
return;
}
try
{
Ejercicios propuestos:
nombre = "datos.dat";
datos = new byte[TAMANYO_BUFFER];
byte[
[] datos;
Console.
.WriteLine("Resolucin Vertical: {0}", resolV);
Console.WriteLine("Creando fichero...");
// Primero vamos a grabar datos
try
{
ficheroSalida = new BinaryWriter(
File.Open(nombre, FileMode.Create));
unDatoByte = 1;
unDatoInt = 2;
unDatoFloat = 3.0f;
unDatoDouble = 4.0;
unDatoString = "Hola";
ficheroSalida.Write(unDatoByte);
ficheroSalida.Write(unDatoInt);
ficheroSalida.Write(unDatoFloat);
ficheroSalida.Write(unDatoDouble);
ficheroSalida.Write(unDatoString);
ficheroSalida.Close();
}
catch (Exception e)
{
Console.WriteLine("Problemas al crear: "+e.Message);
return;
}
En este caso hemos usado "FileMode.Create" para indicar que queremos crear el
}
catch (Exception e)
{
Console.WriteLine("Problemas al leer: "+e.Message);
return;
}
ficheroEntrada.BaseStream.Seek(1, SeekOrigin.Begin);
unDatoInt = ficheroEntrada.ReadInt32();
Console.WriteLine("El int leido es un {0}",
unDatoInt);
ficheroEntrada.Close();
unDatoString = ficheroEntrada.ReadString();
Console.WriteLine("El string leido es \"{0}\"",
unDatoString);
Console.WriteLine("Volvamos a leer el int...");
unDatoDouble = ficheroEntrada.ReadDouble();
Console.WriteLine("El double leido es un {0}",
unDatoDouble);
unDatoFloat = ficheroEntrada.ReadSingle();
Console.WriteLine("El float leido es un {0}",
unDatoFloat);
using System;
using System.IO;
unDatoByte = ficheroEntrada.ReadByte();
Console.WriteLine("El byte leido es un {0}",
unDatoByte);
unDatoInt = ficheroEntrada.ReadInt32();
Console.WriteLine("El int leido es un {0}",
unDatoInt);
try
{
// Ejemplo_08_15b.cs
// Ficheros binarios: escritura en BinaryWriter
// Introduccin a C#, por Nacho Cabanes
Si queremos que escribir datos bsicos de C# (float, int, etc.) en vez de un array de
cero bytes.
// Ejemplo_08_16a.cs
// Lectura y escritura en fichero binario
// Introduccin a C#, por Nacho Cabanes
movernos dentro de l con "Seek", leer datos con "Read" o "ReadByte", y grabar
Una vez que hayamos indicado que queremos leer y escribir del fichero, podremos
necesidad de crear una copia, o para poder crear herramientas como un editor
ejemplo, para poder modificar algn dato errneo, o para encriptar un fichero sin
Tambin es posible que nos interese leer y escribir en un mismo fichero (por
primeros bytes. Para desencriptar, bastar con volver a intercambiar esos dos
extensin BAK.
(8.15.1) Crea una copia de un fichero EXE. La copia debe tener el mismo nombre y
Ejercicios propuestos:
excepcin System.IO.FileNotFoundException.
IOException.
Ejercicios propuestos:
fichero.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return;
}
fichero.Seek(2, SeekOrigin.Begin);
nuevoDato = fichero.ReadByte();
Console.WriteLine("Ahora el tercer byte es un {0}", nuevoDato);
fichero.Seek(2, SeekOrigin.Begin);
fichero.WriteByte( 4 );
fichero.Seek(2, SeekOrigin.Begin);
int nuevoDato = fichero.ReadByte();
Console.WriteLine("El tercer byte es un {0}", nuevoDato);
try
{
int posicion = 0;
nombre = "datos.dat";
datos = new byte[TAMANYO_BUFFER];
using System;
using System.IO;
formato y sobre la cabecera ID3 V1, que se encuentra -si est presente- en los
(8.16.10) Crea un programa que compare si dos ficheros son iguales, volcando
uno de ellos.
(8.16.9) Crea un programa que compare si dos ficheros son iguales byte a byte,
no existir parmetros.
un nuevo fichero, byte a byte. El nombre del fichero de salida se tomar del
int numero;
using System;
using System.IO;
// Ejemplo_09_01a.cs
// Primer acercamiento a la persistencia
// Introduccin a C#, por Nacho Cabanes
cada uno de los atributos en un fichero y otro mtodo que recupere cada uno de
(8.16.4) Mejora la base de datos de ficheros (ejemplo 04_06a) para que los datos
forman el programa.
convencional", sino pedir al sistema que se conserve el estado de los objetos que
9. Persistencia de objetos
ejemplo2.Cargar( "ejemplo.dat" );
Console.WriteLine("Y ahora: {0}", ejemplo2.GetNumero());
misma clase: debern estar en una clase auxiliar, que se encargue de salvar los
En segundo lugar, como vamos a sobrescribir todo el objeto, en vez de slo los
[Serializable]
public class Persist02
(9.1.1) Ampla la clase Persona (ejercicio 6.2.1), para que permita guardar su
Ejercicios propuestos:
"array") que a su vez contienen otros objetos. Por eso, existen maneras ms
Pero esta forma de trabajar se complica mucho cuando nuestro objeto tiene
Valor: 5
Valor 2: 0
Y ahora: 5
System;
System.IO;
System.Runtime.Serialization;
System.Runtime.Serialization.Formatters.Binary;
int numero;
[Serializable]
public class Persist02
{
using
using
using
using
// Ejemplo_09_02a.cs
// Ejemplo bsico de persistencia
// Introduccin a C#, por Nacho Cabanes
Y crear una segunda clase, que sea la encargada de guardar y recuperar los datos:
[Serializable]
public class ClaseAGuardar
{
Ejemplo e;
Una solucin un poco ms elegante podra ser encapsular la clase (o clases) que
(9.2.1) Crea una variante del ejercicio 9.1.1, que use serializacin para guardar y
Ejercicios propuestos:
Valor: 5
Valor 2: 0
Y ahora: 5
System;
System.IO;
System.Runtime.Serialization;
System.Runtime.Serialization.Formatters.Binary;
int numero;
[Serializable]
public class Ejemplo
{
using
using
using
using
// Ejemplo_09_03a.cs
// Ejemplo de persistencia
// Introduccin a C#, por Nacho Cabanes
De modo que un nico fuente que contuviera estas tres clases podra ser:
formatter..Serialize(stream, objeto);
stream.Close();
System;
System.IO;
System.Runtime.Serialization;
System.Runtime.Serialization.Formatters.Binary;
public Ejemplo()
{
mini = new MiniEjemplo[100];
for (int i=0; i<100; i++)
{
int numero;
float numero2;
MiniEjemplo[] mini;
// ----[Serializable]
public class Ejemplo
{
[Serializable]
public class MiniEjemplo
{
int dato;
using
using
using
using
// Ejemplo_09_03b.cs
// Ejemplo de persistencia
// Introduccin a C#, por Nacho Cabanes
haciendo que nuestra clase contenga varios atributos, entre ellos un array de
s.
.Guardar(guardador);
Valor: 5
Valor 2: 0
Y ahora: 5
dato 50: 500
}
}
[Serializable]
public class ClaseAGuardar
{
Ejemplo e;
mini[
[i] = new MiniEjemplo();
mini[i].SetDato( i*2 );
public Ejemplo()
int numero;
float numero2;
MiniEjemplo[] mini;
[Serializable]
public class Ejemplo
{
[Serializable]
public class MiniEjemplo
{
int dato;
using System;
using System.IO;
using System.Runtime.Serialization;
// Para la siguiente lnea, puede ser necesario aadir a las referencias
// del proyecto "System.Runtime.Serialization.Formatters.Soap.dll"
using System.Runtime.Serialization.Formatters.Soap;
// Ejemplo_09_04a.cs
// Ejemplo de persistencia (XML)
// Introduccin a C#, por Nacho Cabanes
sistema en el que quiz el orden de los bytes sea distinto), los cambios son
serializacin.
(9.3.1) Crea una variante del ejercicio 9.2.1, que use una clase auxiliar para la
Ejercicios propuestos:
[Serializable]
public class ClaseAGuardar
{
Ejemplo e;
anterior:
Por ejemplo, este es un fragmento del fichero de datos generado por el programa
cambio se podr analizar con mayor cantidad de herramientas, al ser texto puro.
Dentro de esta opcin, deberemos buscar dentro de las referencias que ya estn
referencia":
hacer clic con el botn derecho en "References" e indicar que deseamos "Agregar
nombre = nombreFich;
<a1:MiniEjemplo
id="ref-104"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<dato>198</dato>
</a1:MiniEjemplo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<item href="#ref-102"/>
<item href="#ref-103"/>
<item href="#ref-104"/>
</SOAP-ENC:Array>
<a1:MiniEjemplo
id="ref-5"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<dato>0</dato>
</a1:MiniEjemplo>
<a1:MiniEjemplo
id="ref-6"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<dato>2</dato>
</a1:MiniEjemplo>
...
<SOAP-ENV:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAPENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"
SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:ClaseAGuardar
id="ref-1"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<e href="#ref-3"/>
</a1:ClaseAGuardar>
<a1:Ejemplo
id="ref-3"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<numero>5</numero>
<numero2>0</numero2>
<mini href="#ref-4"/>
</a1:Ejemplo>
<SOAP-ENC:Array
id="ref-4"
SOAP-ENC:arrayType="a1:MiniEjemplo[100]"
xmlns:a1="http://schemas.microsoft.com/clr/assem/persist05%2C%20Version%3D0.0
.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<item href="#ref-5"/>
<item href="#ref-6"/>
<item href="#ref-7"/>
...
04_06a) para que use objetos en vez de struct, y que guarde los datos (en formato
(9.4.1) Crea una variante del ejercicio 9.3.1, que guarde los datos en formato XML.
Ejercicios propuestos:
Este formato nos obliga a indicar valores para todos los campos, y exactamente en
"ejemplo1". Esta base de datos contendr una nica tabla, llamada "agenda", que
Como primer ejemplo, crearemos una base de datos sencilla, que llamaremos
"values" los valores para los campos de texto entre comillas, y los valores para
campos numricos sin comillas, as:
modificarla.
algunas de las rdenes que podemos usar para almacenar y obtener datos, y
permite hacer consultas a una base de datos relacional. Por eso, vamos a ver
distinto tamao. Si usamos "INT" para indicar que nos basta con un entero no muy
referirnos a texto hasta una cierta longitud, y varios tipos de datos numricos de
Cada gestor de bases de datos tendr una forma de llamar a esos tipos de datos.
gestor de bases de datos habr que drselo bastante cuadriculado. Por ejemplo,
contendr los datos de nuestros amigos. Por tanto, el siguiente paso ser decidir
Adems, existen relaciones entre las tablas: por ejemplo una factura es
electrnico, etc).
Cada registro est formado por varios "campos" (de cada cliente podemos
Cada tabla est formada por una serie de "registros" (por ejemplo, el
tabla de "productos").
En nuestro caso, nuestra base de datos almacenar una nica tabla, que
Para crear la base de datos que contiene todo usaremos "create database",
primera base de datos, no pretendemos que sea perfecta, sino sencilla, as que
Normalmente no querremos ver todos los datos que hemos introducido, sino slo
+--------+-----------+
| nombre | direccion |
+--------+-----------+
| juan | su casa |
| pedro | su calle |
+--------+-----------+
y obtendramos
comas:
Si queremos ver slo ciertos campos, detallamos sus nombres, separados por
+--------+-----------+------+
| nombre | direccion | edad |
+--------+-----------+------+
| juan | su casa | 25 |
| pedro | su calle | 23 |
+--------+-----------+------+
que, con nuestros datos, dara como resultado (en el intrprete de comandos de
un asterisco:
campos FROM tabla". Si queremos ver todos los campos, lo indicaremos usando
Para ver los datos almacenados en una tabla usaremos el formato "SELECT
campos, as:
otra opcin: detallar tambin en la orden "insert" los nombres de cada uno de los
listo
para
usar
http://nachocabanes.com/csharp
ejemplo
desde
Visual
en
para
Studio
En nuestro caso, para acceder a SQLite desde C#, tenemos disponible alguna
o bien como un fichero en C que se podra integrar con los fuentes de nuestro
lenguaje SQL para las consultas, y del que existe una versin que se distribuye
+--------+-----------+
| nombre | direccion |
+--------+-----------+
| pedro | su calle |
+--------+-----------+
calles que contengan la palabra "calle", precedida por cualquier texto (%) y con
que nos dira el nombre y la direccin de nuestros amigos llamados que viven en
que usaramos la palabra "like", y para las partes que no conozcamos usaremos el
nombre de la calle). En ese caso, no compararamos con el smbolo "igual" (=), sino
contenido del campo (por ejemplo, porque slo sepamos un apellido o parte del
A veces no querremos comparar con un texto exacto, sino slo con parte del
+--------+-----------+
| nombre | direccion |
+--------+-----------+
| juan | su casa |
+--------+-----------+
25);";
// Creamos la tabla
string creacion = "create table personas ("
+" nombre varchar(20),direccion varchar(40),edad int);";
SQLiteCommand cmd = new SQLiteCommand(creacion, conexion);
cmd.ExecuteNonQuery();
using System;
// Es necesario aadir la siguiente DLL a la "referencias" del proyecto
using System.Data.SQLite;
// EjemploSQLite1.cs
// Ejemplo de acceso a bases de datos con SQLite (1)
// Introduccin a C#, por Nacho Cabanes
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc ejemploSQLite.cs
/r:System.Data.SqLite.dll /platform:x86
"/platform:x86", as:
Este fichero DLL es de 32 bits, de modo que si usamos una versin de Windows 64
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc ejemploSQLite.cs
/r:System.Data.SqLite.dll
misma carpeta que nuestro ejecutable, para que ste funcione correctamente.
mono ejemploSQLite.exe
Console.WriteLine("Creada.");
Nos devolver la cantidad de filas afectadas, que en nuestro caso, para una
ya existe.
Con esta biblioteca, los pasos a seguir para crear una base de datos y guardar
segundo y as sucesivamente.
using System;
Revisin 0.99zz Pgina 295
// EjemploSQLite2.cs
// Ejemplo de acceso a bases de datos con SQLite (2)
// Introduccin a C#, por Nacho Cabanes
intermedios:
Para mostrar los datos, el primer y ltimo paso seran casi iguales, pero no los
Database Browser.
previamente desde el propio entorno de SQLite, o con algn gestor auxiliar, como
pestaa "Examinar":
comienzo de la siguiente.
realmente guarde en una base de datos (de SQLite) los datos que maneja. Deber
(10.3.1) Crea una versin de la base de datos de ficheros (ejemplo 04_06a) que
Ejercicios propuestos:
y dato [2] (el tercer dato, la edad) pero no el dato intermedio, dato[1] (la direccin).
Nota: en este segundo ejemplo, mostrbamos dato[0] (el primer dato, el nombre)
Que mostrara:
Si usamos Visual Studio o SharpDevelop, tendramos que aadir ese fichero DLL a
Por otra parte, hemos tecleado mal uno de los datos: en la tercera ficha no hemos
un cdigo de ciudad, por ejemplo "a", gastaramos menos espacio (en este
+---------+-----------+-----------+
| nombre | direccion | ciudad
|
+---------+-----------+-----------+
| juan
| su casa | alicante |
| alberto | calle uno | alicante |
| pedro | su calle | alicantw |
+---------+-----------+-----------+
Veamos un ejemplo:
inconsistencias:
Espacio desperdiciado.
dos problemas:
redundantes: existira gran cantidad de datos repetitivos, y esto puede dar lugar a
Por otra parte, habr ocasiones en que veamos que los datos, a pesar de que se
misma tabla.
tendremos datos como los artculos que distribuimos y los clientes que nos los
Por una parte, podemos tener bloques de informacin claramente distintos. Por
tabla.
Puede haber varios motivos por los que nos interese trabajar con ms de una
Mientras que la tabla de personas sera casi igual al ejemplo anterior, pero
La forma de crear la tabla con esos dos campos y con esa clave primaria sera:
sucesivamente.
ciudad. Por ejemplo, hay una ciudad llamado "Toledo" en Espaa, pero tambin
su cdigo. Este cdigo ser el que acte como "clave primaria", para distinguir otra
Vamos a crear la tabla de ciudades, que guardar el nombre de cada una de ellas y
ningn dato claro que nos sirva, en ocasiones aadiremos un "cdigo de cliente",
solucionar guardando algn dato adicional que s sea nico para cada cliente,
llamados "Juan Lpez". Si son nuestros clientes, debemos saber cul es cul, para
forma clara los datos que tenemos almacenados. Por ejemplo, el nombre de una
Generalmente, ser necesario tener algn dato que nos permita distinguir de
+---------+-----------+-----------+
| nombre | direccion | nombre
|
+---------+-----------+-----------+
| juan
| su casa | alicante |
| pedro | su calle | alicante |
| alberto | calle uno | alicante |
| juan
| su casa | barcelona |
| pedro | su calle | barcelona |
| alberto | calle uno | barcelona |
| juan
| su casa | madrid
|
| pedro | su calle | madrid
|
tabla de personas con TODOS los datos de la tabla de ciudades, de modo que
Pero esto todava tiene problemas: estamos combinando TODOS los datos de la
+---------+-----------+-----------+
| nombre | direccion | nombre
|
+---------+-----------+-----------+
| alberto | calle uno | barcelona |
+---------+-----------+-----------+
Revisin 0.99zz Pgina 300
"like":
Y para saber las personas de ciudades que comiencen con la letra "b", usaramos
+--------+-----------+------+
| nombre | direccion | edad |
+--------+-----------+------+
| pedro | su calle | 23 |
+--------+-----------+------+
where
deber terminar comprobando que los dos cdigos coinciden. Por ejemplo, para
Por eso, una consulta bsica sera algo parecido (slo parecido) a:
Ese s es el resultado correcto. Cualquier otra consulta que implique las dos tablas
Cuando queremos mostrar datos de varias tablas a la vez, deberemos hacer unos
consulta sera:
cdigo de ciudad que aparece en la persona debe ser el mismo que el cdigo que
debera mostrarse junto al nombre "alicante". Nos falta indicar esa condicin: "el
Pero esos datos no son reales: si "juan" vive en la ciudad de cdigo "a", slo
+---------+-----------+-----------+
| nombre | direccion | nombre
|
+---------+-----------+-----------+
| juan
| su casa | alicante |
| alberto | calle uno | barcelona |
| pedro | su calle | madrid
|
+---------+-----------+-----------+
cambio, salvo por el hecho de que no se nos permitira introducir dos ciudades
Para introducir datos, el hecho de que exista una clave primaria no supone ningn
);
direccion varchar(40),
edad decimal(3),
codciudad varchar(3)
// E insertamos datos
Console.WriteLine(" Introduciendo ciudades");
string insercion = "insert into ciudades values "
+"('a', 'alicante');";
cmd = new SQLiteCommand(insercion, conexion);
int cantidad = cmd.ExecuteNonQuery();
if (cantidad < 1)
Console.WriteLine("No se ha podido insertar");
using System;
// Es necesario aadir la siguiente DLL a la "referencias" del proyecto
using System.Data.SQLite;
// EjemploSQLite3.cs
// Ejemplo de acceso a bases de datos con SQLite (3)
// Introduccin a C#, por Nacho Cabanes
Si en nuestra tabla puede haber algn dato que se repita, como la direccin,
"
from", y con "where" indicamos las condiciones que se deben cumplir, de forma
Podemos borrar los datos que cumplen una cierta condicin. La orden es "delete
un ao, con
mostrarlos. Por ejemplo, podemos mostrar cul era la edad de una persona hace
tamao, guarde una categora (por ejemplo, "utilidad" o "vdeo"). Estas categoras
sino que actualice con cada nueva modificacin: inserte los nuevos datos inme-
(10.5.1) Crea una versin del ejercicio 10.5.1 que no guarde todos los datos al salir,
Ejercicios propuestos:
(al igual que habamos visto para "select" y para "delete", si no indicamos la parte
corregir con:
Para modificar datos de una tabla, el formato habitual es "update tabla set
tabla "personas".
Esto borrara todas las personas llamadas "juan" que estn almacenadas en la
(10.4.1) Mejora el ejercicio 10.3.1 para que, adems de el nombre del fichero y su
Ejercicios propuestos:
Su resultado sera:
Console..WriteLine("Datos:");
// Leemos los datos de forma repetitiva
while (datos.Read())
{
// Y los mostramos
Console.WriteLine(" {0} - {1} - {2}",
Convert.ToString(datos[0]), Convert.ToString(datos[1]),
Convert.ToString(datos[2]));
}
+----------+------+
| count(*) | edad |
+----------+------+
|
1 | 22 |
|
1 | 23 |
|
1 | 25 |
+----------+------+
+--------+---------+---------+
| 5/2
| 5 div 2 | 5 mod 2 |
+--------+---------+---------+
| 2.5000 |
2 |
1 |
+--------+---------+---------+
entonces pidiendo una valor agrupado (count, sum, avg, ...) para cada uno de esos
base de datos, sino tambin la cantidad de clientes que viven en cada ciudad.
Por ejemplo: saber no slo la cantidad de clientes que hay registrados en nuestra
(el total, la media, la cantidad de datos), sino el resultado para un grupo de datos.
Puede ocurrir que no nos interese un nico valor agrupado para todos los datos
10.7 Grupos
saber cuntas personas tienen una direccin que comience por la letra "s", as:
muestren todos los datos que cumplen una condicin. Por ejemplo, podramos
datos de una tabla. Por ejemplo, podemos saber cul es la edad ms baja de entre
// AgendaSQLite.cs
// Ejemplo de acceso a bases de datos con SQLite: agenda
// Introduccin a C#, por Nacho Cabanes
Revisin 0.99zz Pgina 306
datos, mostrar todos ellos o buscar los que cumplan una cierta condicin:
Vamos a crear un pequeo ejemplo que, para una nica tabla, permita aadir
(10.7.1) Crea una versin del ejercicio 10.4.1 que permita saber cuntos ficheros
Ejercicios propuestos:
En el lenguaje SQL existe mucho ms que lo que hemos visto aqu, pero para
+----------+------+
| count(*) | edad |
+----------+------+
|
1 | 25 |
+----------+------+
que mostrara
select count(*), edad from personas group by edad having edad > 24;
La condicin que se aplica a los grupos no se indica con "where", sino con "having"
Pero podemos llegar ms all: podemos no trabajar con todos los grupos posibles,
try
{
}
else
{
// Si ya existe, abrimos
conexion = new SQLiteConnection(
"Data
Source=agenda.sqlite;Version=3;New=False;Compress=True;");
conexion.Open();
}
}
// Y creamos la tabla
string creacion = "CREATE TABLE persona "
+ "(nombre VARCHAR(30), direccion VARCHAR(40), "
+ " edad INT );";
SQLiteCommand cmd = new SQLiteCommand(creacion, conexion);
cmd.ExecuteNonQuery();
// Constructor
public AgendaSQLite()
{
AbrirBD();
}
using System;
using System.IO; // Para File.Exists
// ------------------------------------------------------------------
~AgendaSQLite()
{
conexion.Close();
}
catch (Exception e)
{
return false; // Si no se ha podido insertar (codigo repetido?)
}
return true; // Si todo ha ido bien, devolvemos true
(10.8.4) Ampla el ejemplo 10.8.2 con una tabla de ciudades, que se deber pedir (y
(10.8.3) Ampla el ejemplo 10.8.2, para que permita exportar los datos a un fichero
(10.8.1) Ampla este ejemplo (AgendaSQLite), para que se pueda borrar un dato a
Ejercicios propuestos:
opcion = Console.ReadLine();
switch (opcion)
{
case "1":
Console.Write("Nombre? ");
string n = Console.ReadLine();
Console.Write("Direccin? ");
string d = Console.ReadLine();
Console.Write("Edad? ");
int e = Convert.ToInt32(Console.ReadLine());
agenda.InsertarDatos(n, d, e);
break;
case "2":
Console.WriteLine(agenda.LeerTodosDatos());
break;
case "3":
Console.Write("Texto a buscar? ");
string txt = Console.ReadLine();
Console.WriteLine(agenda.LeerBusqueda(txt));
break;
}
} while (opcion != "0");
do
{
Por ejemplo, existe un "DataGridView", que nos permite recorrer los datos en una
(en un apndice de este texto vers las nociones bsicas sobre cmo crearlos),
preparar una agenda contando con 1000 fichas, aunque supongamos que no
la gente llega por un sitio (la cola) y sale por el opuesto (la cabeza). Al igual
Las colas. Una "cola de datos" se comportar como las del cine (en teora):
using System;
// Ejemplo_11_02a.cs
// Ejemplo de clase "Stack" (Pila)
// Introduccin a C#, por Nacho Cabanes
As, un ejemplo bsico que creara una pila, introdujera tres palabras y luego las
dejarlos en otro sitio distinto. De igual modo, se supone que la pila no tiene
Para utilizar la clase "Stack" y la mayora de las que veremos en este tema,
Las pilas. Una "pila de datos" se comportar de forma similar a una pila de
facilidad.
Este tipo de estructuras se suele denotar tambin usando las siglas "LIFO" (Last In
ltimas versiones de C++, existen esqueletos ya creados que podemos utilizar con
despus
bsicamente artesanal, mientras que en lenguajes modernos como C#, Java o las
Para crear una pila, emplearemos la clase Stack. Una pila nos permitir introducir
".Net"
plataforma
la
incluye
La solucin real suele ser crear estructuras dinmicas, que puedan ir creciendo o
que
comentaremos los pasos para crear una estructura dinmica de forma "artesanal".
usar acceso aleatorio para leer cada ficha desde disco cuando sea necesario, pero
posibilidades
usando
las
obliga a conocer bien los datos con los que vamos a trabajar, sigue pudiendo verse
trataremos, como los rboles, en los que cada elemento puede tener varios
Este tipo de variables son sencillas de usar y rpidas... si slo vamos a manejar
cualquier posicin.
Hasta ahora tenamos una serie de variables que declarbamos al principio del
tamao indefinido.
(string)
elementos contiene.
Revisin 0.99zz Pgina 313
pila.
"Peek", que mira el valor que hay en la cima, pero sin extraerlo.
"objetos", que deberemos convertir al tipo de datos que nos interese utilizando un
using System;
using System.Collections;
// Ejemplo_11_03a.cs
// Ejemplo de clase "Queue" (Cola)
// Introduccin a C#, por Nacho Cabanes
que creara una cola, introdujera tres palabras y luego las volviera a mostrar sera:
estructuras se nombran a veces tambin por las siglas FIFO (First In First Out, lo
Podemos crear colas si nos apoyamos en la clase Queue. En una cola podremos
Como se puede ver en este ejemplo, no hemos indicado que sea una "pila de
strings", sino simplemente "una pila". Por eso, los datos que extraemos son
convierte en: apilar 3, apilar 4, sacar dos datos y sumarlos, guardar 7, terminado.
proceso termina cuando slo hay un dato en la pila. Por ejemplo, "3 4 +" se
parntesis y que se puede resolver usando una pila: si se recibe un dato numrico,
ejemplo, en vez de "3+4" se escribira "3 4 +". Es una notacin que no necesita
(11.2.3) Crea una clase que imite el comportamiento de una pila, pero usando
muestre en orden inverso las lneas que lo forma, empleando una pila.
(11.2.1) Crea un programa que pida al usuario 5 nmeros enteros y luego los
Ejercicios propuestos:
yo
soy
Hola,
using System.Collections;
Al igual que en la pila, tambin tenemos una propiedad "Count", que nos
almacene lnea por lnea en una cola, luego muestre este contenido en pantalla y
frase vaca. En ese momento, mostrar todas las frases que se haban introducido.
(11.3.2) Crea un programa que pida frases al usuario, hasta que introduzca una
(11.3.1) Crea un programa que pida al usuario 5 nmeros reales de doble preisin,
Ejercicios propuestos:
cola.
"Peek", que mira el valor que hay en la cabeza de la cola, pero sin extraerlo.
Al igual que ocurra con la pila, la implementacin de una cola que incluye C# es
Hola,
soy
yo
que mostrara:
using System;
using System.Collections;
// Ejemplo_11_04_01a.cs
// Ejemplo de ArrayList
// Introduccin a C#, por Nacho Cabanes
sus posibilidades:
incluso ordenar toda la lista con "Sort". Vamos a ver un ejemplo de la mayora de
11.4.1. ArrayList
("SortedList").
genrica, pero s dos variantes especialmente tiles: una lista a cuyos elementos se
En el caso de C#, no tenemos ninguna clase "List" que represente una lista
Una lista es una estructura dinmica en la que se puede aadir elementos sin
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
// Invertimos la lista
miLista.Reverse();
// Ordenamos
miLista.Sort();
// Buscamos un elemento
Console.WriteLine( "La palabra \"yo\" est en la posicin {0}",
miLista.IndexOf("yo") );
almacene lnea por lnea en un ArrayList, luego muestre en pantalla las lneas
pantalla.
usuario qu texto desea buscar y muestre las lneas que contienen ese texto.
Ejercicios propuestos:
Veremos los operadores a nivel de bits, como ~, en el tema 13, que estar
en la posicin 1 (que es el "complemento a 2" del nmero -2, que es lo que indica
que quiere decir que el dato no existe, y que el dato inmediatamente mayor est
cambiando los bits 0 por 1 y viceversa). En el ejemplo anterior, "posicin" vale -2, lo
Casi todo debera resultar fcil de entender, salvo quiz el smbolo ~. Esto se debe
Su resultado sera
using System;
using System.Collections;
// Ejemplo_11_04_02a.cs
// Ejemplo de SortedList: Diccionario esp-ing
// Introduccin a C#, por Nacho Cabanes
elementos con "Add", o acceder a los elementos mediante su ndice numrico (con
En un SortedList, los elementos estn formados por una pareja: una clave y un
11.4.2. SortedList
impares (primera, tercera, etc.) y finalmente vuelque a otro fichero de texto las
x
x
x
x
using System;
using System.Collections;
// Ejemplo_11_05a.cs
// Ejemplo de Tabla Hash: Diccionario de informtica
// Introduccin a C#, por Nacho Cabanes
para un dato concreto, pero que no se puede recorrer en orden), podra ser:
En una "tabla hash", los elementos estn formados por una pareja: una clave y un
cadena vaca. salo para convertir un abrir un fichero que contenga un fuente en
Ejercicios propuestos:
// Ejemplo_11_06a.cs
// Ejemplo de Enumeradores en una Tabla Hash
// Introduccin a C#, por Nacho Cabanes
using System;
using System.Collections;
(11.5.2) Crea una versin alternativa del ejercicio 11.4.2.2, pero que tenga las
(11.5.1) Crea una versin alternativa del ejercicio 11.4.2.1, pero que tenga las
Ejercicios propuestos:
bastante vaca que cuando est casi llena, podemos usar un constructor
Una tabla hash tiene una cierta capacidad inicial, que se ampla automticamente
else
Console.
.WriteLine( "El significado de PC es: {0}",
miDiccio["pc"]);
using System;
using System.Collections;
// Ejemplo_11_05b.cs
// Ejemplo de Tabla Hash: Diccionario de informtica
// Introduccin a C#, por Nacho Cabanes
en este ejemplo:
using System;
using System.Collections;
// Ejemplo_11_06b.cs
// Ejemplo de Enumeradores en una pila (Stack)
// Introduccin a C#, por Nacho Cabanes
usar ser un IEnumerator, con un campo Current para saber el valor actual:
Para las colecciones "normales", como las pilas y las colas, el tipo de Enumerador a
funcin de dispersin.
caso de las tablas hash, que tiene dos campos (clave y valor), el enumerador a usar
Contenido:
pc = personal computer
byte = 8 bits
kilobyte = 1024 bytes
cuyo resultado es
miDiccio.
.Add("pc", "personal computer");
miDiccio.Add("kilobyte", "1024 bytes");
anterioridad a ste.
using System;
// Ejemplo_11_07a.cs
// Ejemplo de clase "Pila" basada en un array
// Introduccin a C#, por Nacho Cabanes
modo que el siguiente dato que se obtuviera sera el que se introdujo con
Creamos tambin una funcin "Desapilar", que devuelve el dato que hay en
Creamos una funcin "Apilar", que aade en la primera posicin libre del
Por ejemplo, podramos imitar una pila dando los siguientes pasos:
http://msdn.microsoft.com/es-es/library/system.collections(en-us,VS.71).aspx#
Contenido:
yo
soy
Hola,
que escribira
while ( miEnumerador.MoveNext() )
Console.WriteLine("{0}", miEnumerador.Current);
} // Fin de la clase
// Constructor
public PilaString()
{
posicionPila = 0;
datosPila = new string[MAXPILA];
}
Con slo estos dos cambios, el ejemplo de uso de ArrayList que vimos en el
using System.Collections.Generic;
extraigamos un dato.
adaptado a un tipo de datos, y no necesite una conversin de tipos cada vez que
En ocasiones puede ser interesante algo un poco ms rgido, que con las ventajas
Esto obliga a que hagamos una "conversin de tipos" con cada dato que
string, luego un nmero entero, luego uno de coma flotante, despus un struct
que hemos visto, es que permiten guardar datos de cualquier tipo, incluso datos
(11.7.4) Crea una cola que almacene un bloque de datos (struct, con los campos
un array.
clave-valor como los SortedList). Debe contener un mtodo "Insertar", que aadir
(11.7.2) Crear una clase "ListaOrdenada", que almacene un nico dato (no un par
dato que se introduzca debe ser el primero que se obtenga). Debe tener un
permita introducir datos (nmeros enteros) y obtenerlos en modo FIFO (el primer
(11.7.1) Usando esta misma estructura de programa, crea una clase "Cola", que
Ejercicios propuestos:
// Invertimos la lista
miLista.Reverse();
// Ordenamos
miLista.Sort();
// Buscamos un elemento
Console.WriteLine( "La palabra \"yo\" est en la posicin {0}",
miLista.IndexOf("yo") );
using System;
using System.Collections.Generic;
// Ejemplo_11_08b.cs
// Ejemplo de Dictionary
// Introduccin a C#, por Nacho Cabanes
podramos crear una versin alternativa del ejemplo 11_05b. Los nicos cambios
As, con un diccionario que tenga tanto claves string como valores string,
usar una cadena como clave, pero un nmero entero como valor obtenido:
ser strings, sino el tipo de datos que nosotros decidamos. Por ejemplo, podemos
equivale a una tabla Hash, pero en la que las claves y los valores no tienen por qu
No slo tenemos listas. Por ejemplo, tambin existe un tipo "Dictionary", que
Console.
.WriteLine( frase );
using System;
using System.Collections.Generic;
// Ejemplo_11_08a.cs
// Ejemplo de List<string>
// Introduccin a C#, por Nacho Cabanes
bien que le pidamos al compilador que nos reserve un espacio de memoria (ms
adelante veremos cmo).
una lista de strings y luego lo muestre en orden inverso (de la ltima lnea a la
int numero;
int* posicion;
que acompaan al lenguaje bsico. Aun as, veremos algn ejemplo que nos
compilarlo":
compilador "s, s que este programa tiene zonas no seguras, pero aun as quiero
Por tanto, deberemos compilar con la opcin /unsafe como forma de decir al
mcs unsafe1.cs
unsafe1.cs(15,31): error CS0227: Unsafe code requires the `unsafe' command
line
option to be specified
Compilation failed: 1 error(s), 0 warnings
Como los punteros son "peligrosos" (es frecuente que den lugar a errores muy
posicion = №
11.9.1. Qu es un puntero?
haba reservado para la variable "numero", lo haramos usando el smbolo "&", as:
habitual que tomemos una direccin de memoria que ya contiene otro dato, o
primera).
podremos hacer cosas como posicion=5; porque nada nos garantiza que la
posicin 5 de la memoria est disponible para que nosotros la usemos. Ser ms
int *posicion;
es correcto escribir
variable. Ese asterisco puede ir junto a cualquiera de ambos, por lo que tambin
Ejercicios propuestos:
if (miDiccio.ContainsKey("pc"))
Console.WriteLine( "El significado de PC es: {0}",
miDiccio["pc"]);
else
Console.WriteLine( "No existe la palabra PC");
// Damos un valor a x
x = 2;
// punteroAEntero ser la direccin de memoria de x
punteroAEntero = &x;
// Los dos estn en la misma direccin:
Console.WriteLine("x vale {0}", x);
Console.WriteLine("En punteroAEntero hay un {0}", *punteroAEntero);
using System;
// Ejemplo_11_09_03a.cs
// Primer ejemplo de punteros
// Introduccin a C#, por Nacho Cabanes
valor en l:
using System;
// Ejemplo_11_09_04a.cs
// Segundo ejemplo de punteros
// Introduccin a C#, por Nacho Cabanes
Tambin podemos hacer que slo una parte de un programa sea insegura,
encuentran dos variables y que luego muestre sus contenidos en pantalla, para
Ejercicios propuestos:
viceversa.
x vale 2
En punteroAEntero hay un 2
x vale 5
En punteroAEntero hay un 5
Ejercicios propuestos:
vamos a profundizar.
// Mostramos el array
for (int i = 0; i < tamanyoArray; i++)
{
Console.WriteLine(datos[i]);
}
// Rellenamos el array
for (int i = 0; i < tamanyoArray; i++)
{
datos[i] = i*10;
}
using System;
// Ejemplo_11_09_05a.cs
// Tercer ejemplo de punteros: stackalloc
// Introduccin a C#, por Nacho Cabanes
Podemos reservar espacio para una variable dinmica usando "stackalloc". Por
Incrementar(
(&i);
// Y mostramos el resultado
Console.WriteLine (i);
using System;
// Ejemplo_11_09_06a.cs
// Cuarto ejemplo de punteros: aritmtica de punteros
// Introduccin a C#, por Nacho Cabanes
su direccin pasar a ser 40.004 (porque cada entero ocupa 4 bytes). Vamos a
posicin capaz de almacenar un dato como el que corresponde a su tipo base. Por
(11.9.5.1) Crea una programa que pida al usuario 5 strings, los almacene usando
using System;
// Ejemplo_11_09_07a.cs
// Quinto ejemplo de punteros: fixed
// Introduccin a C#, por Nacho Cabanes
asignaciones son peligrosas y obligar a que usemos la palabra "fixed" para indicar
y haya borrado.
ocupado por variables que ya no se usan. Esto puede suponer algn problema
avisa de que esa variable es de "slo lectura" (read-only). Por eso, para cambiarla,
*posicionDato);
(11.9.6.1) Crea una programa que pida al usuario 4 nmeros reales, los almacene
1242200
1242204
1242208
1242212
Ejercicios propuestos:
Posicion actual:
Posicion actual:
Posicion actual:
Posicion actual:
Contenido:
0
10
20
30
40
Para calcular nuevas fechas, podemos usar mtodos que generan un nuevo
(nmero de mes), Year (ao); Hour (hora), Minute (minutos), Second (segundos),
hora actual de este equipo), Today (fecha actual); Day (da del mes), Month
Algunos de las propiedades ms tiles de este tipo de datos son: Now (fecha y
programa se detenga una cierta cantidad de tiempo, no hace falta que usemos un
using System;
TimeSpan diferencia =
fechaActual.Subtract(fechaNacimiento) ;
using System;
// Ejemplo_12_01b.cs
// Diferencia entre dos fechas
// Introduccin a C#, por Nacho Cabanes
(TimeSpan), del que podemos saber detalles como la cantidad de das (sin
ms genrico (para sumar una fecha a otra) y un Subtract tambin genrico (para
// Ejemplo_12_01a.cs
// Ejemplo bsico de manejo de fechas
// Introduccin a C#, por Nacho Cabanes
(Day), el mes (Month) o el ao (Year) de una fecha, entre otros. Tambin podemos
Dentro de ese tipo de datos DateTime, tenemos las herramientas para saber el da
ello, tenemos el tipo de datos DateTime. Por ejemplo, podemos hallar la fecha (y
Desde C#, tenemos la posibilidad de manejar fechas y horas con facilidad. Para
lu ma mi ju vi
1
4 5 6 7 8
11 12 13 14 15
18 19 20 21 22
25 26 27 28
Mayo 2015
algo como:
s
2
9
16
23
do
3
10
17
24
"bool")
using System;
pantalla.
KeyAvailable: indica si hay alguna tecla disponible para ser leda (es un
x
parmetro
El
(12.1.4) Crea un programa que muestre el calendario del mes actual (pista:
teclado.
sin permitir que se vea en pantalla ("true" para que no se vea, "false" para
desde
qu da de la semana se trataba.
tecla
una
lee
pantalla).
Readkey(interceptar):
(12.1.2) Crea un reloj que se muestre en pantalla, y que se actualice cada segundo
mostrarse con un cero inicial, de modo que siempre aparezcan con dos cifras.
x
las milsimas). Si los minutos o los segundos son inferiores a 10, debern
correspondiente), la hora, los minutos, los segundos y las dcimas de segundo (no
x
del mes (usa un array para almacenar los nombres y accede a la posicin
resultar ms tiles:
net". Vamos a ver algunas de las funcionalidades adicionales que nos pueden
(12.1.1) Crea una versin mejorada del ejemplo 12_01a, que muestre el nombre
Ejercicios propuestos:
using System;
using System.Threading;
// Ejemplo_12_01c.cs
// Pausas
// Introduccin a C#, por Nacho Cabanes
Console.ForegroundColor = ConsoleColor.Blue;
Console.SetCursorPosition(10, 15);
Console.Write("Pulsa 1 o 2: ");
ConsoleKeyInfo tecla;
do
{
tecla = Console.ReadKey(false);
}
while ((tecla.KeyChar != '1') && (tecla.KeyChar != '2'));
Key, que se refiere a la tecla (porque hay teclas que no tienen un carcter
KeyChar, que representa el carcter que se escribira al pulsar esa tecla. Por
(Nota: no todas las posibilidades que se aplican en este ejemplo estn disponibles
NumPad7,
NumPad8,
NumPad9,
Multiply
(Tecla
que
permite
comprobar
si
se
han
pulsado
// Ejemplo_12_02b.cs
// No bloquear el programa con Console.Readkey
// Introduccin a C#, por Nacho Cabanes
ninguna tecla:
alguna tecla que haya que analizar, como en este ejemplo, que permite mover un
tecla. Si queremos hacer algo mientras que el usuario no pulse ninguna tecla,
Console.Readkey hace que el programa se quede parado hasta que se pulse una
o Modifiers,
de Windows)
Divisin)
NumPad6,
D9
o Teclas numricas, como: D0 (Tecla 0), D1, D2, D3, D4, D5, D6, D7, D8,
O, P, Q, R, S, T, U, V, W, X, Y, Z
FLECHA ABAJO)
DarkGreen (verde
los bordes de la pantalla. Para que no se mueva demasiado rpido, haz una pausa
(12.2.1) Crea un programa que muestre una "pelota" (la letra "O") rebotando en
Ejercicios propuestos:
azulado claro), Red (rojo), Magenta (fucsia), Yellow (amarillo), White (blanco).
DarkGray (gris oscuro), Blue (azul), Green (verde), Cyan (aguamarina o verde
Los colores que tenemos disponibles (y que se deben escribir precedidos con
animacin no sea demasiado rpida como para no hacer un consumo muy alto de
Al igual que en este ejemplo, ser recomendable hacer una pequea pausa entre
Console.Clear();
Console.SetCursorPosition(posX, posY);
Console.Write( simbolos[ simboloActual ]);
Thread.Sleep(500);
if (Console.KeyAvailable)
{
ConsoleKeyInfo tecla = Console.ReadKey(true);
if (tecla.Key == ConsoleKey.RightArrow) posX++;
if (tecla.Key == ConsoleKey.LeftArrow) posX--;
if (tecla.Key == ConsoleKey.Escape) terminado = true;
}
simboloActual++;
if (simboloActual > 3) simboloActual = 0;
}
while ( ! terminado );
do
{
using System;
using System.Threading;
(la clase Directory est declarada en el espacio de nombres System.IO, por lo que
using System.IO;
// Ejemplo_12_03a.cs
// Crear un directorio
// Introduccin a C#, por Nacho Cabanes
borrarlo (Delete), moverlo (Move), comprobar si existe (Exists), etc. Por ejemplo,
Directory y DirectoryInfo.
pantalla).
(12.2.5) Crea una versin mejorada del programa 12.1.2 (mostrar el reloj
permita escribir ms caracteres (por ejemplo, las letras), as como mostrar ayuda
(12.2.4) Crea una versin del programa de "dibujar" en consola (12.2.3), que
con las flechas del teclado y pulsando "espacio" para dibujar un punto o borrarlo.
del usuario, y que no necesite pulsar Intro tras escoger cada opcin.
use colores para ayudar a distinguir los mensajes del programa de las respuestas
(12.2.2) Crea una versin de la "base de datos de ficheros" (ejemplo 04_06a) que
}
}
permite conseguir informacin similar sobre un fichero. Podramos usar estas dos
clases para ampliar el ejemplo anterior, y que no slo muestre el nombre de cada
(12.3.4) Mejora el ejercicio 12.3.3 para que muestre directorios (en primer lugar) y
lista usando las flechas del cursor. El elemento seleccionado se mostrar en color
(12.3.3) Crea un programa que permita "pasear" por la carpeta actual, al estilo del
(12.3.2) Crea un programa que cree un fichero de texto a partir del contenido de
Ejercicios propuestos:
using System;
using System.IO;
// Ejemplo_12_03d.cs
// Lista detallada de ficheros en un directorio
// Introduccin a C#, por Nacho Cabanes
using System;
using System.IO;
// Ejemplo_12_03c.cs
// Lista de ficheros en un directorio
// Introduccin a C#, por Nacho Cabanes
con:
ejemplo, podramos saber todos los fuentes de C# ("*.cs") de la carpeta actual (".")
deben seguir los nombres de los ficheros que buscamos, como "*.txt". Por
listaFicheros = Directory.GetFiles(miDirectorio);
foreach(string fichero in listaFicheros)
Console.WriteLine(fichero);
using System;
using System.IO;
// Ejemplo_12_03b.cs
// Lista de ficheros en un directorio
// Introduccin a C#, por Nacho Cabanes
directorio con:
Comandante Norton") para que, si se pulsa Intro sobre un cierto fichero, lance el
correspondiente proceso.
using System;
using System.Diagnostics;
// Ejemplo_12_04a.cs
// Lanzar otro proceso y esperar
// Introduccin a C#, por Nacho Cabanes
proc.WaitForExit();
using System;
using System.Diagnostics;
// Ejemplo_12_05a.cs
// Informacin sobre el sistema
// Introduccin a C#, por Nacho Cabanes
necesario esperar a que termine otra la tarea, sino que nuestro programa puede
con:
(12.4.3) Crea un programa que mida el tiempo que tarda en ejecutarse un cierto
trabaje por nosotros. La forma de llamar a otras rdenes del sistema operativo
sistema operativo s es capaz de hacer por nosotros, podemos hacer que ella
Si hay algo que no sepamos o podamos hacer, pero que alguna utilidad del
(12.4.1) Mejora el ejercicio 12.3.3 (la versin bsica del programa "tipo
debe mostrar una "barra de progreso" de color amarillo, que indicar el porcentaje
(12.4.2) Aplica esta misma mejora al ejercicio 12.3.5 (la versin con dos paneles del
Ejercicios propuestos:
pulsa F5, los ficheros seleccionados en la carpeta actual del panel actual se
otro, cada uno de los cuales podr estar mostrando el contenido de un directorio
(12.3.5) Mejora el ejercicio 12.3.4 para que contenga dos paneles, uno al lado del
TcpListener para recibir, y en ambos casos trataremos los datos como un tipo
fichero o escribiramos en l.
using System;
using System.IO; // Para Stream
using System.Net; // Para System.Net.WebClient
// Ejemplo_12_06a.cs
// Ejemplo de descarga y anlisis de una web:
// Muestra las lneas que contienen "Pascal"
// Introduccin a C#, por Nacho Cabanes
Como primer ejemplo, vamos a ver cmo podramos recibir una pgina web (por
System;
System.IO;
// Para
System.Text; // Para
System.Net;
// Para
System.Net.Sockets;
Stream
Encoding
Dns, IPAddress
// Para NetworkStream
conexion.Close();
cliente.Close();
conexion.Write(secuenciaLetras, 0, secuenciaLetras.Length);
using
using
using
using
using
// Ejemplo_12_06b.cs
// Ejemplo de envio y recepcin de frases a travs de la red
// Introduccin a C#, por Nacho Cabanes
Muchos de los servicios que podemos obtener de Internet o de una red local son
Otra posibilidad que tampoco es complicada (aunque s algo ms que sta ltima)
28:
<li><a href="pascal/index.php">Pascal/Delphi</a></li>
54: | <a href="pascal/index.php">Pascal / Delphi</a>
204:
<li><a href="pascal/index.php">Pascal/Delphi</a></li>
int contador = 0;
while ( (linea=lector.ReadLine()) != null )
{
contador ++;
if (linea.IndexOf("Pascal") >= 0)
Console.WriteLine("{0}: {1}", contador, linea);
}
conexion.Close();
panel derecho.
escoger una de ellas, y esa pasar a ser la unidad activa en el panel izquierdo. Si se
Comandante Norton") para que se pueda pasar a "navegar" por otra unidad de
(12.5.1) Mejora el ejercicio 12.4.2 (la versin ms completa del programa "tipo
Ejercicios propuestos:
Console.
.WriteLine("Unidades lgicas: {0}",
String.Join(", ", discos));
Console.WriteLine("Carpeta de sistema: {0}",
Environment.GetFolderPath(Environment.SpecialFolder.System));
1
Esperando...
return frase;
cliente.Close();
listener.Stop();
"dispare" por turnos, escogiendo una casilla (por ejemplo, "B5"), y siendo avisado
jugador decida dnde quiere colocar sus barcos, y luego cada uno de ellos
(12.6.5) Crea un juego de "barquitos" en red, para dos jugadores, en el que cada
procesar los enlaces internos (en el mismo sitio web), no las pginas externas
de forma recursiva las pginas que corresponden a dichos enlaces. Slo deber
pgina que indique el usuario, analizando los enlaces que contiene y descargando
jugador escoja un movimiento, pero ambos vean un mismo estado del tablero.
(12.6.1) Crea un juego de "3 en raya" en red, para dos jugadores, en el que cada
Ejercicios propuestos:
en vez de los TcpClient, o de un modo "no fiable", usando el protocolo UDP en vez
Esto se puede conseguir a un nivel algo ms alto, usando los llamados "Sockets"
uno de ellos.
en el que hubiera que avisar a otros jugadores de los cambios realizados por cada
sino la IP del otro equipo), como podra ser un chat o cualquier juego multijugador
Esta misma idea se podra usar como base para programas ms elaborados, que
Enviando... Enviado
Prueba de texto
Recibido
(12.6.6) Mejora el juego de "barquitos" (12.6.5) para que el aviso de impacto sea
juego terminar cuando uno de los jugadores hunda toda la flota del otro.
propio tablero y los impactos que ha conseguido en el tablero del otro jugador. El
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
using
using
using
using
de nombres que se llamar igual que el proyecto. Esta es apariencia del fuente si
nuevo proyecto, el fuente "casi vaco" que se nos propone contendr un espacio
.Net.
de otros. Por ejemplo, si yo quisiera crear mi propia clase "Console" para el acceso
Por eso, se recomienda usar "espacios de nombres", que permitan distinguir unos
esperada.
La idea detrs de ese "using" es que puede ocurrir que distintos programadores
plataforma .Net.
"System.Console" o bien "using System". Esa palabra "System" indica que las
Cambiar
Complemento (not)
&
y ~
WriteLine.
Una
es
la
original
de
C#,
que
invocaramos
con
mtodo
Como se puede ver, este ejemplo tiene dos clases Console, y ambas tienen un
namespace ConsolaAmpliada
{
public class Console
{
public static void WriteLine(string texto)
{
System.Console.ForegroundColor = ConsoleColor.Blue;
System.Console.WriteLine("Mensaje: "+texto);
}
}
}
ceros
ceros
~1100 = 0011
Ejemplo
using System;
// Ejemplo_13_02a.cs
// Operaciones a nivel de bits
// Introduccin a C#, por Nacho Cabanes
derecha
izquierda
using System;
distintos
es 1
por
C#
En
viceversa
Resultado
Operacin
Podemos hacer desde C# operaciones entre bits de dos nmeros (AND, OR, XOR,
Hola
Mensaje: Hola otra vez
clases Console accesibles desde el mismo programa, sin que existan conflictos
// Ejemplo_13_01a.cs
// Ejemplo de uso de "namespaces"
// Introduccin a C#, por Nacho Cabanes
espacio de nombres, que cree una nueva clase Console y que utilice las dos (la
namespace PruebaDeNamespaces
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
using System;
primera vista. Por ejemplo: desplazar a la izquierda es una forma muy rpida de
0010 0001 = 33
Desplazar los bits una posicin a la derecha es como dividir entre dos:
Desplazar los bits una posicin a la izquierda es como multiplicar por dos:
0110 0010 = 98
1^0 = 1, 0^0 = 0
La suma lgica exclusiva devuelve un 1 cuando los dos bits son distintos: 1^1 = 0,
1, 0+0 = 0
0110 0011 = 99
Despus hacemos su suma lgica, sumando cada bit, de modo que 1+1 = 1, 1+0 =
(Al igual que las constantes de cualquier otro tipo, se puede escribir en maysculas
Hay una forma alternativa de hacerlo, especialmente til si son nmeros enteros
Cuando tenemos varias constantes, cuyos valores son nmeros enteros, hasta
0000 0001 = 1
13.3. Enumeraciones
haciendo un XOR de los caracteres que la forman con un cierto dato prefijado (y
(13.2.1) Crea un programa que lea un fichero de texto, encripte cada lnea
Ejercicios propuestos
x <<= 2;
x &= 2;
x |= 2;
...
x += 2;
contrario, puede servir para obligar a que ciertos bits sean 1...
que se puede usar para comprobar mscaras de red); la suma lgica, por el
mensajes; el producto lgico nos permite obligar a que ciertos bits sean 0 (algo
67 = 0100 0011
33 = 0010 0001
Para comprobar que es correcto, podemos convertir al sistema binario esos dos
La variable a vale 67
y b vale 33
El complemento de a es: -68
El producto lgico de a y b es: 1
Su suma lgica es: 99
Su suma lgica exclusiva es: 98
Desplacemos a a la izquierda: 134
Desplacemos a a la derecha: 33
El resultado es:
cualquiera de las contantes, y las siguientes irn aumentando de uno en uno. Por
ejemplo, si escribimos
MIERCOLES);
Nosotros hemos usado enumeraciones muchas veces hasta ahora, sin saber
y su resultado ser:
{0}",
using System;
// Ejemplo_13_03a.cs
// Ejemplo de enumeraciones
// Introduccin a C#, por Nacho Cabanes
// -------------------------
using System;
// Ejemplo_13_04a.cs
// Ejemplo de propiedades (1)
// Introduccin a C#, por Nacho Cabanes
mismo efecto, empleando las llamadas "propiedades", que tienen una forma
privados, y se acceda a ellos a travs de mtodos "get" (para leer su valor) y "set"
Hasta ahora estbamos siguiendo la poltica de que los atributos de una clase sean
13.4. Propiedades
(13.3.1) Crea una versin de la base de datos de ficheros con colores (ejercicio
Ejercicios propuestos
Nota: las enumeraciones existen tambin en otros lenguajes como C y C++, pero la
Si queremos que los valores no sean exactamente estos, podemos dar valor a
anchura = value;
return anchura;
ejemplo.Anchura = 6;
Console.WriteLine("La anchura es {0}",
ejemplo.Anchura );
ejemplo.SetAltura(5);
Console.WriteLine("La altura es {0}",
ejemplo.GetAltura() );
// El "Main" de prueba
public static void Main()
{
EjemploPropiedades ejemplo
= new EjemploPropiedades();
que si se usa un simple "Contains". Por ejemplo, podemos comprobar con una
class PruebaExprRegulares
{
public static bool EsNumeroEntero(String cadena)
{
Regex patronNumerico = new Regex("[^0-9]");
return !patronNumerico.IsMatch(cadena);
}
Ejercicios propuestos
(13.4.1) Crea una nueva versin del ejercicio de la clase Persona (6.7.1), en la que
using System;
using System.Text.RegularExpressions;
// Ejemplo_13_05a.cs
// Ejemplo de expresiones regulares
// Introduccin a C#, por Nacho Cabanes
ms veces", ? para "0 o una vez", como en [a-z]+, que quiere decir "uno o
x
x
orden breve si todos los caracteres de una cadena son numricos, o si empieza
propiedad de slo lectura, no podremos hacer cosas como "Anchura = 4", porque
Una curiosidad: si una propiedad tiene un "get", pero no un "set", ser una
set
{
get
{
// -------------------------
if (EsAlfabetico("hola"))
Revisin 0.99zz Pgina 363
if (EsNumeroConDecimales("23,45,67"))
Console.WriteLine("23,45,67 es un nmero con decimales");
else
Console.WriteLine("23,45,67 NO es un nmero con decimales");
if (EsNumeroConDecimales("23,45"))
Console.WriteLine("23,45 es un nmero con decimales");
else
Console.WriteLine("23,45 NO es un nmero con decimales");
if (EsNumeroEntero2("23,45"))
Console.WriteLine("23,45 es entero (forma 2)");
else
Console.WriteLine("23,45 NO es entero (forma 2)");
if (EsNumeroEntero("23,45"))
Console.WriteLine("23,45 es un nmero entero");
else
Console.WriteLine("23,45 NO es un nmero entero");
if (EsNumeroEntero2("1942"))
Console.WriteLine("1942 es entero (forma 2)");
else
Console.WriteLine("1942 NO es entero (forma 2)");
if (EsNumeroEntero("1942"))
Console.WriteLine("1942 es un nmero entero");
else
Console.WriteLine("1942 NO es un nmero entero");
ejemplo:
Revisin 0.99zz Pgina 364
contador, pero esto no tiene por qu ser siempre as. Vamos a verlo con un
Cuando vimos la orden "for", siempre usbamos una nica variable como
(13.5.2) Crea una funcin que diga si una cadena que se le pase como parmetro
postal vlido.
(13.5.1) Crea una funcin que valide cdigos postales espaoles (5 cifras
Ejercicios propuestos
http://msdn.microsoft.com/eses/library/system.text.regularexpressions.regex(VS.80).aspx
por otras. Como ver muchos ms detalles podra hacer el texto demasiado
sino que tambin permite otras operaciones, como reemplazar unas expresiones
llegar a ser difcil de seguir. Por otra parte, el manejo en C# no se limita a buscar,
Las expresiones regulares son algo complejo. Por una parte, su sintaxis puede
Su salida es:
Console.WriteLine("hola NO es alfabetico");
Console.
.WriteLine("hola es alfabetico");
if (EsAlfanumerico("hola1"))
Console.WriteLine("hola1 es alfanumerico");
else
Console.WriteLine("hola1 NO es alfanumerico");
else
0
1
2
3
4
5
y
y
y
y
y
y
j
j
j
j
j
j
vale
vale
vale
vale
vale
vale
1
3
5
7
9
11
// Ejemplo_13_07a.cs
// Ejemplo de uso de "var"
// Introduccin a C#, por Nacho Cabanes
Revisin 0.99zz Pgina 365
tipo de una variable, sino que sea el propio compilador el que lo deduzca del
operaciones booleanas):
hasta que se cumplen las dos condiciones (algo que no es vlido en C#, ya que la
terminacin tambin podra tener una coma, y entonces no se sale del bucle "for"
vale
vale
vale
vale
vale
vale
usando una sintaxis que recuerda a la de SQL (aunque se escribe "casi al revs":
Studio 2008, que nos permite hacer consultas a cualquier coleccin de datos
Ejercicios propuestos
i
i
i
i
i
i
x
}
var pi = 3.1416;
Console.WriteLine("pi vale {0} y es de tipo {1}",
pi, pi.GetType());
var condicion = 5 == 7;
Console.WriteLine("condicion vale {0} y es de tipo {1}",
condicion, condicion.GetType());
using System;
using System;
// Ejemplo_13_06a.cs
// Operador coma
// Introduccin a C#, por Nacho Cabanes
var resultado =
from nombre in nombres
orderby nombre
select nombre;
using System;
using System.Linq;
using System.Collections.Generic;
// Ejemplo_13_08b.cs
// Segundo ejemplo de LINQ
// Introduccin a C#, por Nacho Cabanes
foreach(int i in result)
Console.Write("{0} ", i);
Console.WriteLine();
var result =
from n in datos
where n > 10
select n;
El preprocesador.
Entornos grficos (Windows Forms, WPF).
Uso en servidores Web (ASP.Net).
x
x
x
Funciones lambda.
Delegados (delegate).
LINQ.
en una lista y luego muestre todos los que sean positivos, ordenados, empleando
(13.8.1) Crea un programa que pida al usuario varios nmeros enteros, los guarde
Ejercicios propuestos
using System;
using System.Linq;
https://msdn.microsoft.com/es-es/library/bb397926.aspx
quieres saber ms, puedes acudir a la propia referencia oficial en lnea, en MSDN:
Profundizar en LINQ es algo que queda fuera del propsito de este texto. Si
// Ejemplo_13_08a.cs
// Ejemplo bsico de LINQ
// Introduccin a C#, por Nacho Cabanes
Por ejemplo, podemos obtener los nmeros enteros de un array cuyo valor es
a = 5;
b = a + 2;
b -= 3;
c = -3;
c *= 2;
++c;
a *= b;
namespace EjemploDeOperaciones
{
class Program
{
static void Main(string[] args)
{
int a, b, c;
using System;
Veremos como ejemplo el caso de Visual Studio 2008 Express, pero las diferencias
avanzar paso a paso para ver cmo avanza realmente nuestro programa, y
Para eliminar esos fallos que hacen que un programa no se comporte como
"bugs" (bichos).
Para avanzar paso a paso y ver los valores de las variables, entramos al men
programa:
con la lista de variables, y un nuevo cursor amarillo, que se queda al principio del
Si escogemos esa opcin del men o pulsamos F11, aparece una ventana inferior
pantalla, ser el propio entorno de desarrollo de Visual Studio el que nos muestre
los valores de las variables.
los esperados.
que todo se comporta como debera. As, antes de dar por definitiva una versin
nuevos. Por eso, una forma habitual de garantizar la calidad de los programas es
Si ahora iniciamos la depuracin del programa, saltar sin detenerse hasta ese
como alternativa, podemos hacer clic con el ratn en el margen izquierdo del
puntos de ruptura" (tecla F9). Aparecer una marca granate en la lnea actual
Aqu hemos avanzado desde el principio del programa, pero eso no es algo
x2 -1 = 0 x1 = 1, x2 = -1
Revisin 0.99zz Pgina 373
Es decir, si alguna solucin no existe, se devuelve un valor falso, que no sea fcil
if (discriminante < 0)
{
x1 = -9999;
x2 = -9999;
}
else if (discriminante == 0)
{
x1 = - b / (2*a);
x2 = -9999;
}
else
{
x1 = (float) ((- b + Math.Sqrt(discriminante))/ 2*a);
x2 = (float) ((- b - Math.Sqrt(discriminante))/ 2*a);
}
float discriminante;
Console.Write("Probando x2 - 1 = 0 ...");
ecuacion.Resolver((float)1, (float) 0, (float) -1,
out soluc1, out soluc2);
if ((soluc1 == 1) && (soluc2 == -1))
Console.WriteLine("OK");
if (discriminante < 0)
{
x1 = -9999;
x2 = -9999;
}
else if (discriminante == 0)
{
x1 = - b / (2*a);
x2 = -9999;
}
else
{
x1 = (float) ((- b + Math.Sqrt(discriminante))/ 2*a);
x2 = (float) ((- b - Math.Sqrt(discriminante))/ 2*a);
}
float discriminante;
using System;
// Ejemplo_14_03a.cs
// Ejemplo de realizacin de pruebas
// Introduccin a C#, por Nacho Cabanes
2x2 -2 = 0 x1 = 1, x2 = -1
x2 -3x = 0 x1 = 3, x2 = 0
// Ejemplo_14_03b.cs
// Segundo ejemplo de realizacin de pruebas, con Assert
// Introduccin a C#, por Nacho Cabanes
entre (2*a), de modo que estamos diviendo entre 2 y luego multiplicando por a.
Vemos que en uno de los casos, la solucin no es correcta. Revisaramos los pasos
Probando
Probando
Probando
Probando
Probando
Console.WriteLine("Falla");
Console.Write("Probando x2 = 0 ...");
ecuacion.Resolver((float)1, (float)0, (float)0,
out soluc1, out soluc2);
if ((soluc1 == 0) && (soluc2 == -9999))
Console.WriteLine("OK");
else
Console.WriteLine("Falla");
else
Console.Write("Probando x2 = 0 ...");
ecuacion.Resolver((float)1, (float)0, (float)0,
out soluc1, out soluc2);
Debug.Assert((soluc1 == 0) && (soluc2 == -9999));
Console.Write("Probando x2 - 1 = 0 ...");
ecuacion.Resolver((float)1, (float) 0, (float) -1,
out soluc1, out soluc2);
Debug.Assert((soluc1 == 1) && (soluc2 == -1));
if (discriminante < 0)
{
x1 = -9999;
x2 = -9999;
}
else if (discriminante == 0)
{
x1 = - b / (2*a);
x2 = -9999;
}
else
{
x1 = (float) ((- b + Math.Sqrt(discriminante))/ 2*a);
x2 = (float) ((- b - Math.Sqrt(discriminante))/ 2*a);
}
float discriminante;
using System;
using System.Diagnostics;
plasmar de una forma grfica lo que un usuario podr hacer con el sistema.
principal, para evitar que se omitan cosas que se "den por supuestas".
detectado.
Por tanto, las pruebas slo permiten asegurar que el programa falla en caso de
batera de pruebas anterior solo contuviera las tres primeras pruebas, no habra
programa sea correcto, sino slo que no falla en ciertos casos. Por ejemplo, si la
un programa, por lo que se puede aplicar tras cada pocos cambios para
La ventaja de crear bateras de pruebas es que es una forma muy rpida de probar
con el texto "Error de asercin" al llegar a la lnea 67, con botones para Salir,
ecuacion.
.Resolver((float)2, (float)0, (float)-2,
out soluc1, out soluc2);
Debug.Assert((soluc1 == 1) && (soluc2 == -1));
{
...
// son correctos
modificacin
cdigo.html
http://www.variablenotfound.com/2007/12/13-consejos-para-comentar-tu-
Por eso, este apartado se va a centrar en algunas de las pautas que los expertos
problema: los comentarios que aclaren todo aquello que no sea obvio.
Aun as, hay un tipo de documentacin que s debe estar presente en cualquier
Casi todos esos diagramas caen fuera del alcance de este texto: en una
// Generar factura
En palabras del genial Phil Haack, "tan pronto como una lnea de cdigo sale de la
pantalla y volvemos a ella, estamos en modo mantenimiento de la misma"
Hay quien opina que los comentarios deberan ser escritos para que los
es un regalo que dejas para la posteridad del que slo obtendr beneficios el
6. No pierdas el tiempo
referencia para saber qu es lo que hay que hacer y, segundo, que una vez
Hay incluso quien opina que los comentarios que describen un bloque deberan
Evita comentarios del tipo "ahora compruebo que el estpido usuario no haya
5. S correcto
...
if (a == 5)
hacerlo. Olvida las posturas "no tengo tiempo de comentar, voy muy apurado", "el
final, puesto que entonces te costar ms del doble de tiempo, si es que llegas a
return 0;
lo sustituyen por un nmero determinado de espacios, que suelen variar segn las
Ojo a las tabulaciones. Hay editores de texto que usan el carcter ASCII (9) y otros,
implementar:
de un fuente en C#:
Por ejemplo, la herramienta (gratuita) Doxygen genera pginas como sta a partir
Esta documentacin tpicamente ser una serie pginas HTML enlazadas, o bien
adicional que puede resultar muy til: usar comentarios que nos ayuden a crear
Pero en algunos lenguajes modernos, como Java y C#, existe una posibilidad
Conocemos los comentarios de bloque (/* hasta */) y los comentarios hasta final
trabajo en equipo.
Console.WriteLine("Resultado: " +
new Calculator()
.Set(0)
.Add(10)
.Multiply(2)
.Substract(4)
.Get()
);
explicativos adicionales:
programadores a los que no les gusta comentar su cdigo ;-), es totalmente cierto
hable por s mismo. Aunque se sospecha que este movimiento est liderado por
Es uno de los principios bsicos para muchos desarrolladores: deja que tu cdigo
(...)
Revisin 0.99zz Pgina 382
/**
* Personaje: uno de los tipos de elementos graficos del juego
*
*
@see ElemGrafico Juego
*
@author 1-DAI 2008/09
*/
informacin sobre el valor que devuelve una funcin, o como @see, para detallar
<example>
<paramref>
<summary>
<exception>
<permission>
https://msdn.microsoft.com/en-us/library/5ast78ax.aspx
Puedes leer ms sobre el uso que se sugiere para cada una de ellas aqu:
<seealso>
Las etiquetas que sugiere Microsoft son <c> <para> <see> <code> <param>
Terabytes).
Revisin 0.99zz Pgina 385
memoria RAM entre 4 y 8 Gb, as como un disco duro de entre 500 y 2.000 Mb (2
correspondencia 1 Gb = 1024 Mb. As, es habitual que un equipo actual tenga una
o Mb, que es 1000 Kb (en realidad 1024 Kb) o algo ms de un milln de bytes. Por
letras) y 4 Kb.
Por otra parte, una pgina mecanografiada suele ocupar entre 2 K (cerca de 2000
Los Kb eran unidades tpicas para medir la memoria de ordenadores: 640 Kb fue
es 1 Kb = 1024 bytes.
(pronto veremos por qu), por lo que se usa 210 =1024. As, la equivalencia exacta
bytes, pero en los ordenadores conviene buscar por comodidad una potencia de 2
En teora, el prefijo kilo querra decir "mil", luego un kilobyte debera ser 1000
Un byte se queda corto a la hora de manejar textos o datos algo ms largos, con lo
sobre los tipos de letra que se han utilizado, cursivas, negritas, mrgenes y
Eso s, suele ocurrir que realmente un texto de 2000 letras que se guarde en el
nuestro disco.
por 2000 letras, podemos esperar que ocupe unos 2000 bytes de espacio en
pensar que un byte es el equivalente a una letra. Si un cierto texto est formado
Byte
1024 Mb
1024 Gb
Gigabyte (Gb)
Terabyte (Tb)
00000000
00000001
00000010
00000011
byte. Las matemticas elementales (combinatoria) nos dicen que si agrupamos los
dos valores: 0 1), por lo que se usa un conjunto de ellos, 8 bits, que forman un
Un bit es demasiado pequeo para un uso normal (recordemos: slo puede tener
(Ap1.1.3) Cuntos diskettes de 1,44 Mb haran falta para hacer una copia de
de capacidad?
3.500 Kb, cuntas se podran guardar en un reproductor MP3 que tenga 256 Mb
(Ap1.1.2) Si suponemos que una cancin tpica en formato MP3 ocupa cerca de
tenga 32 Kb de capacidad?
Ejercicios propuestos:
1024 Kb
Megabyte (Mb)
-
Unidad
(binario)
(binario)
(binario)
(binario)
=
=
=
=
0
1
2
3
(decimal)
(decimal)
(decimal)
(decimal)
0000
0001
0010
0011
son estndar para todos los ordenadores. Por eso, existen estndares ms
cambiarn, pero las letras internacionales (como la o las vocales con acentos)
Aun as, hay un inconveniente con el cdigo ASCII: slo los primeros 127 nmeros
el 65, la "B", el 32, el "0" el 48, el "1" el 49, etc. As se tiene una forma muy cmoda
(realmente, con una secuencia de 8 bits): la "a" es el nmero 97, la "b" el 98, la "A"
informacin), que relaciona cada letra, nmero o smbolo con una cifra del 0 al 255
0000
0000
0000
0000
...
1111
1111
Tambin existe una correspondencia entre cada grupo de bits y un nmero del 0
poco ms adelante).
Por ejemplo, se podra decir que cada vez que encontremos la secuencia 00000010
que suficientes para almacenar una letra, o un signo de puntuacin, o una cifra
como un byte), nos encontramos con 256 posibilidades distintas, que ya son ms
ordenador, pero no para nosotros) los utilizamos en grupos de 8 (lo que se conoce
Por tanto, si en vez de tomar los bits de 1 en 1 (que resulta cmodo para el
00000100
...
11111110
11111111
Ejercicios propuestos:
sino que se usa la potencia de 2 ms cercana: 210 =1024. Por eso, la equivalencia
no lo son, es lo que explica que el prefijo kilo no quiera decir "exactamente mil",
resulta ms fcil manejar los nmeros que son potencia de 2 que los nmeros que
Nota: Eso de que realmente el ordenador trabaja con ceros y unos, por lo que le
000
010
020
030
040
050
060
070
080
090
100
110
120
0
NUL
LF
DC4
RS
(
2
<
F
P
Z
d
n
x
1
SOH
VT
NAK
US
)
3
=
G
Q
[
e
o
y
2
3
STX ETX
FF CR
SYN ETB
SP
!
*
+
4
5
>
?
H
I
R
S
\
]
f
g
p
q
z
{
4
EOT
SO
CAN
"
,
6
@
J
T
^
h
r
|
5
6
7
8
ENQ ACK BEL BS
SI DLE DC1 DC2
EM
SUB ESC FS
#
$
%
&
.
/
0
7
8
9
:
A
B
C
D
K
L
M
N
U
V
W
X
_
`
a
b
i
j
k
l
s
t
u
v
}
~
9
HT
DC3
GS
'
1
;
E
O
Y
c
m
w
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ejemplo, aunque estos smbolos que van del nmero 128 al 255 no son estndar,
tambin vocales acentuadas, ees, y otros smbolos para dibujar recuadros, por
bits, que permite 256 smbolos (del 0 al 255), lo que permite que se puedan usar
Hoy en da, casi todos los ordenadores incluyen un cdigo ASCII extendido de 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Los cdigos estndar "visibles" van del 32 al 127. Los cdigos del 0 al 31 son
Por ejemplo, en cualquier ordenador que use cdigo ASCII, la secuencia de bits
letra.
El cdigo ASCII estndar es de 7 bits, lo que hace que cada grupo de bits desde el
Intercambio de Informacin.
El nombre del cdigo ASCII viene de "American Standard Code for Information
(Ap2.1) Crea un programa en C# que muestre una tabla ASCII bsica, desde el
Ejercicios propuestos:
de memoria" que estn completamente vacas (0) o completamente llenas (1), slo
Por eso, dentro del ordenador cualquier nmero se deber almacenar como ceros
+ 1 2
+ 0 2
+ 1 2
13 = 1 2
o, ms detallado:
13 = 1 8 + 1 4 + 0 2 + 1 1
Para los ordenadores no es cmodo contar hasta 10. Como partimos de "casillas
00 = 0
0+0 = 0
decimal:
01 = 0
0+1 = 1
10 = 0
1+0 = 1
11 = 1
1+1 = 10
(en decimal: 2)
01101101).
buscbamos:
Si "juntamos" los cocientes que hemos obtenido, aparece el nmero binario que
divisiones:
sencilla es ir dividiendo entre las potencias de 2, y coger todos los cocientes de las
Convertir un nmero de decimal a binario resulta algo menos intuitivo. Una forma
o ms detallado todava:
sin pensar.
11111111+00101101.
rapidsimo
(Ap3.1.5) Crea un programa en C# que convierta a binario los nmeros (en base
que
el sistema
binario
cuando
haya
que
expresar
cifras
254 = 3 8
de modo que
+ 7 8
+ 6 8
ejemplo:
decimal a binario ser, como siempre dividir entre las potencias de la base. Por
"compactos"
(Ap3.1.5) Crea un programa en C# que convierta a octal los nmeros (en base 10)
(Ap3.2.4) Expresar en el sistema decimal los nmeros octales 162, 76, 241, 102.
(Ap3.2.3) Expresar en el sistema binario los nmeros octales 171, 243, 105, 45.
(Ap3.2.1) Expresar en sistema octal los nmeros decimales 17, 101, 83, 45.
Ejercicios propuestos:
el hexadecimal...
o bien
nmero 423 (octal) sera 423 (octal) = 100 010 011 (binario)
de modo que
Pero adems existe una correspondencia muy sencilla entre el sistema octal y el
anterior.
ocupa 3 cifras en decimal, y tambin 3 cifras en octal, frente a las 8 cifras que
01100110+10110010,
nmeros
los
(Ap3.1.3)
Suma
o bien
(Ap3.1.1) Expresa en sistema binario los nmeros decimales 17, 101, 83, 45.
Ejercicios propuestos:
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
o bien
254 = 15 16
de modo que
+ 14 16
difcil:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
11, 12, 13, 14 y 15, que utilizaremos en el sistema hexadecimal. Para representar
del 0 al 9, de modo que no tenemos cifras de un solo dgito para los nmeros 10,
Pero hay una dificultad: estamos acostumbrados al sistema decimal, con nmeros
convertir de binario a octal y viceversa es muy sencillo, pero un byte est formado
+ 4 16
+ 3 16
+ 11 16
+ 2 16
+ 11 16
+ 5 16
= 41653
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
(hexadecimal)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
(decimal)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
(binario)
A2B5 (hexadecimal) = 10 16
es decir
254 = 13 16
o bien
de modo que
salen bien, y que slo tiene como inconveniente que hay dos formas de expresar
el nmero 0 (0000 0000 o 1111 1111), lo que complica algunos trabajos internos
del ordenador.
3 (decimal) = 0011
6 (decimal) = 0110
-3 = 1011
-6 = 1110
visto.
-3 = 1101
-6 = 1010
con el que las operaciones con nmeros negativos siempre se realizan de forma
3 (decimal) = 0011
6 (decimal) = 0110
Complemento a 2: para los negativos, se cambian los ceros por unos y se suma
uno al resultado.
binario, usando complemento a uno para expresar los nmeros negativos. Calcula
Ejercicio propuesto: convierte los nmeros decimales 13, 34, -13, -34 a sistema
-3 = 1100
-6 = 1001
3 (decimal) = 0011
6 (decimal) = 0110
negativos.
Complemento a 1: se cambian los ceros por unos para expresar los nmeros
2A.
(Ap3.3.4) Expresa en el sistema decimal los nmeros hexadecimales 1B2, 76, E1,
1A2.
(Ap3.3.3) Expresa en el sistema binario los nmeros hexadecimales 2F, 37, A0,
(Ap3.3.1) Expresa en sistema hexadecimal los nmeros decimales 18, 131, 83, 245.
Ejercicios propuestos:
110010100100100101010100111 =>
0110 0101 0010 0100 1010 1010 0111 = 6524AA7
podra tomar valores entre 0 y 65.535, mientras que un "short" (entero corto con
primer bit se puede utilizar como parte de los datos, y podemos almacenar
primer bit para el signo. Por eso, si declaramos una variable como "unsigned", ese
En general, todos los formatos que permiten guardar nmeros negativos usan el
sistema binario, usando complemento a dos para expresar los nmeros negativos.
Ejercicio propuesto (Ap3.4.1): Convierte los nmeros decimales 13, 34, -13, -34 a
// Inicializamos SDL
Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
Revisin 0.99zz Pgina 400
using Tao.Sdl;
using System; // Para IntPtr (puntero: imgenes, etc)
// sdl01.cs
// Primer acercamiento a SDL
// Introduccin a C#, por Nacho Cabanes
funciones.
modo grfico, cargar una imagen, dibujarla en pantalla, esperar cinco segundos y
Vamos a ver un primer ejemplo, bsico pero completo, que muestre cmo entrar a
detalles de SDL creando nuestras propias clases "Hardware", "Imagen", etc., como
realizar tareas muy bsicas. Por eso, muchas veces es preferible "ocultar" los
Tao.SDL es una adaptacin de esta librera, que permite emplearla desde C#. Las
para diversos sistemas operativos y que permite tanto dibujar imgenes como
SDL es una conocida biblioteca para la realizacin de juegos, que est disponible
destructor).
"doble buffer").
SDL_Flip vuelca esa pantalla oculta a la pantalla visible (el paso final de ese
volcar toda esa pantalla oculta a la pantalla visible, con lo que se evitan
// Y esperamos 5 segundos
System.Threading.Thread.Sleep( 5000 );
SDL_LoadBMP carga una imagen en formato BMP (si slo usamos SDL
referencia").
Compilar y probar.
x
adicionales.
/r:Tao.Sdl.dll /platform:x86
gmcs sdl01.cs
Compilar con:
// Dibujamos la imagen
short x = 400;
short y = 300;
short anchoImagen = 50;
short altoImagen = 50;
Sdl.SDL_Rect origen = new Sdl.SDL_Rect(0,0,anchoImagen,altoImagen);
Sdl.SDL_Rect dest = new Sdl.SDL_Rect(x,y,anchoImagen,altoImagen);
Sdl.SDL_BlitSurface(imagen, ref origen, pantallaOculta, ref dest);
pantallaOculta = Sdl.SDL_SetVideoMode(
anchoPantalla,
altoPantalla,
bitsColor,
flags);
// Inicializamos SDL
Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
pantallaOculta = Sdl.SDL_SetVideoMode(
anchoPantalla,
altoPantalla,
bitsColor,
flags);
using Tao.Sdl;
using System; // Para IntPtr (puntero: imgenes, etc)
// sdl02.cs
// Segundo acercamiento a SDL
// Introduccin a C#, por Nacho Cabanes
con las flechas del teclado, a una velocidad de 50 fotogramas por segundo, as:
imgenes que se mostrarn de forma repetitiva (por ejemplo, 10 veces, con medio
Ejercicios propuestos
http://www.nachocabanes.com/fich/descargar.php?nombre=SdlBasico.zip
Puedes descargar este fuente, incluyendo el proyecto de Visual Studio 2010, los
// Y esperamos 20 ms
System.Threading.Thread.Sleep( 20 );
// Borramos pantalla
Sdl.SDL_Rect origen = new Sdl.SDL_Rect(0,0,
anchoPantalla,altoPantalla);
Sdl.SDL_FillRect(pantallaOculta, ref origen, 0);
// Dibujamos en sus nuevas coordenadas
origen = new Sdl.SDL_Rect(0,0,anchoImagen,altoImagen);
Sdl.SDL_Rect dest = new Sdl.SDL_Rect(x,y,
anchoImagen,altoImagen);
Sdl.SDL_BlitSurface(imagen, ref origen,
pantallaOculta, ref dest);
// Comprobamos sucesos
Sdl.SDL_PollEvent(out suceso);
teclas = Sdl.SDL_GetKeyState(out numkeys);
} while (!terminado);
do
{
// Parte repetitiva
bool terminado = false;
short x = 400;
short y = 300;
short anchoImagen = 50;
short altoImagen = 50;
Sdl.SDL_Event suceso;
int numkeys;
byte[] teclas;
analizar.
cada tecla. Luego podemos mirar cada una de esas teclas accediendo a ese
// Parte repetitiva
bool terminado = false;
short x = 400;
short y = 300;
Revisin 0.99zz Pgina 405
// sdl03.cs
// Tercer acercamiento a SDL: clases auxiliares
// Introduccin a C#, por Nacho Cabanes
Por ejemplo, podemos buscar que el programa anterior quede simplemente as:
legible:
auxiliares que nos permitan ocultar los detalles de SDL y hacer un Main ms
(al menos) dos imgenes, para dar una impresin de movimiento ms real.
(Ap4.3.1) Ampla el ejemplo 2 de SDL (sdl02.cs) para que al moverse alterne entre
Ejercicios propuestos
Usamos un bucle "do...while" para repetir hasta que se pulse la tecla ESC.
} while (!terminado);
// Y esperamos 20 ms
h.Pausa(20);
// Dibujar en pantalla
h.BorrarPantallaOculta();
h.DibujarImagenOculta(img);
h.VisualizarOculta();
// Inicializamos SDL
Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
pantallaOculta = Sdl.SDL_SetVideoMode(
anchoPantalla,
Revisin 0.99zz Pgina 406
IntPtr pantallaOculta;
// hardware.cs
// Clases auxiliar Hardware para SDL
// Introduccin a C#, por Nacho Cabanes
Para eso necesitaramos una clase "Hardware", que oculte los detalles del acceso a
do
{
// Definiciones de teclas
public static int TECLA_ESC = Sdl.SDLK_ESCAPE;
public static int TECLA_ARR = Sdl.SDLK_UP;
public static int TECLA_ABA = Sdl.SDLK_DOWN;
~Hardware()
{
Sdl.SDL_Quit();
}
altoPantalla,
,
bitsColor,
flags);
Ejercicios propuestos
public
public
public
public
public
// imagen.cs
// Clases auxiliar Imagen para SDL
// Introduccin a C#, por Nacho Cabanes
comprobar colisiones):
adelante nos resultarn tiles, como el ancho y el alto (que nos servirn para
Y una clase "Imagen" podra ocultar ese "IntPtr", adems de aadirle datos
Hacer una pausa al final de cada "fotograma", para que la velocidad del
void inicializar()
{
h = new Hardware(800, 600, 24, pantallaCompleta);
img = new Imagen("personaje.bmp", 50, 50);
x = 400;
y = 300;
using Tao.Sdl;
using System; // Para IntPtr (puntero: imgenes, etc)
// sdl04.cs
// Cuarto acercamiento a SDL: bucle de juego
// Introduccin a C#, por Nacho Cabanes
de joystick...)
// Bucle de juego
do
{
j.comprobarTeclas();
j.moverElementos();
bool partidaTerminada()
{
return terminado;
}
void pausaFotograma()
{
// Esperamos 20 ms
h.Pausa(20);
}
void dibujarElementos()
{
h.BorrarPantallaOculta();
h.DibujarImagenOculta(img);
h.VisualizarOculta();
}
void moverElementos()
{
// Todavia no hay ningun elemento que se mueva solo
}
void comprobarColisiones()
{
// Todavia no comprobamos colisiones con enemigos
// ni con obstaculos
}
void comprobarTeclas(()
{
if (h.TeclaPulsada(Hardware.TECLA_ARR))
y -= 2;
if (h.TeclaPulsada(Hardware.TECLA_ABA))
y += 2;
if (h.TeclaPulsada(Hardware.TECLA_IZQ))
x -= 2;
if (h.TeclaPulsada(Hardware.TECLA_DER))
x += 2;
if (h.TeclaPulsada(Hardware.TECLA_ESC))
terminado = true;
img.MoverA(x, y);
}
// fuente.cs
// Clases auxiliar Fuente para SDL
// Introduccin a C#, por Nacho Cabanes
ocurra con las imgenes, por lo que, igual que hicimos con stas, podemos crear
El tipo de letra estar accesible a travs de un puntero genrico "IntPtr", igual que
SdlTtf.TTF_Init();
(Ap4.5.1) Refina el ejercicio Ap4.4.1, para que tenga un fuente modular, siguiente
Ejercicios propuestos
j.
.comprobarColisiones();
j.dibujarElementos();
j.pausaFotograma();
} while (!j.partidaTerminada());
void dibujarElementos()
{
h.BorrarPantallaOculta();
Y escribiremos el texto que nos interese, en las coordenadas que queramos y con
void inicializar()
{
h = new Hardware(800, 600, 24, pantallaCompleta);
img = new Imagen("personaje.bmp", 50, 50);
letra = new Fuente("FreeSansBold.ttf", 18);
x = 400;
y = 300;
}
Y ya lo podemos usar desde nuestro juego. Por una parte, cargaremos el tipo de
nosotros lo pasos que son necesarios en SDL: crear una imagen a partir del texto,
misma posicin.
En cualquier juego habr que comprobar colisiones: recoger premios, perder una
Ejercicios propuestos
h.
.DibujarImagenOculta(img);
h.EscribirTextoOculta("Texto de ejemplo",
200, 100, // Coordenadas
255, 0, 0, // Color: rojo
letra);
h.VisualizarOculta();
using Tao.Sdl;
using System; // Para IntPtr (puntero: imgenes, etc)
// sdl06.cs
// Sexto acercamiento a SDL: colisiones
// Introduccin a C#, por Nacho Cabanes
xEnemigo += velocXEnemigo;
yEnemigo += velocYEnemigo;
imgEnemigo.MoverA(xEnemigo, yEnemigo);
alcance:
if (imgPersonaje.ColisionCon(imgPremio))
{
puntos += 10;
xPremio = (short)generadorAzar.Next(750);
yPremio = (short)generadorAzar.Next(550);
imgPremio.MoverA(xPremio, yPremio);
}
if (imgPersonaje.ColisionCon(imgEnemigo))
{
terminado = true;
}
partida:
ver si un enemigo toca a nuestro personaje, para que en ese momento acabe la
void comprobarColisiones()
{
// Si toca el premio: puntos y nuevo premio
if (imgPersonaje.ColisionCon(imgPremio))
{
puntos += 10;
xPremio = (short)generadorAzar.Next(750);
yPremio = (short)generadorAzar.Next(550);
imgPremio.MoverA(xPremio, yPremio);
}
void comprobarTeclas()
{
if (h.TeclaPulsada(Hardware.TECLA_ARR))
y -= 4;
if (h.TeclaPulsada(Hardware.TECLA_ABA))
y += 4;
if (h.TeclaPulsada(Hardware.TECLA_IZQ))
x -= 4;
if (h.TeclaPulsada(Hardware.TECLA_DER))
x += 4;
if (h.TeclaPulsada(Hardware.TECLA_ESC))
terminado = true;
imgPersonaje.MoverA(x, y);
}
void inicializar()
{
h = new Hardware(800, 600, 24, pantallaCompleta);
imgPersonaje = new Imagen("personaje.bmp", 32, 30);
imgEnemigo = new Imagen("enemigo.bmp", 36, 42);
imgPremio = new Imagen("premio.bmp", 36, 14);
letra = new Fuente("FreeSansBold.ttf", 18);
generadorAzar = new Random();
x = 400; y = 300;
xEnemigo = 100; yEnemigo = 100;
velocXEnemigo = 3; velocYEnemigo = -3;
xPremio = (short) generadorAzar.Next(750);
yPremio = (short) generadorAzar.Next(550);
imgPremio.MoverA(xPremio, yPremio);
puntos = 0;
}
Fuente letra;
;
bool terminado = false;
short x, y;
short xEnemigo, yEnemigo, velocXEnemigo, velocYEnemigo;
short xPremio, yPremio;
int puntos;
Random generadorAzar;
// Bucle de juego
do
{
j.comprobarTeclas();
j.moverElementos();
j.comprobarColisiones();
j.dibujarElementos();
j.pausaFotograma();
} while (!j.partidaTerminada());
bool partidaTerminada()
{
return terminado;
}
void pausaFotograma()
{
// Esperamos 20 ms
h.Pausa(20);
}
void dibujarElementos()
{
h.BorrarPantallaOculta();
h.DibujarImagenOculta(imgPersonaje);
h.DibujarImagenOculta(imgPremio);
h.DibujarImagenOculta(imgEnemigo);
h.EscribirTextoOculta("Puntos: "+puntos,
200, 100, // Coordenadas
255, 0, 0, // Color: rojo
letra);
h.VisualizarOculta();
}
void moverElementos(()
{
xEnemigo += velocXEnemigo;
yEnemigo += velocYEnemigo;
imgEnemigo.MoverA(xEnemigo, yEnemigo);
// Para que rebote en los extremos de la pantalla
if ((xEnemigo < 10) || (xEnemigo > 750))
velocXEnemigo = (short) (-velocXEnemigo);
if ((yEnemigo < 10) || (yEnemigo > 550))
velocYEnemigo = (short)(-velocYEnemigo);
}
imgenes JPG).
Revisin 0.99zz Pgina 417
(para imgenes PNG), zlib1.dll (auxiliar para el anterior) y jpeg.dll (si queremos usar
Los nuevos ficheros que necesitamos son: SDL_image.dll (el principal), libpng13.dll
en el programa.
tenemos que incluir unos cuantos ficheros DLL ms y hacer un pequeo cambio
vez de una; si se recogen todos los premios, comenzar un nuevo nivel, con mayor
partida terminar.
formada por varios segmentos; cada vez que se recoga un premio, la serpiente se
(Ap4.7.4) Ampla el ejercicio Ap4.7.3, para que el jugador sea una serpiente,
jugador no se mover slo cuando se pulse una flecha, sino que continuar
partida.
una serie de obstculos, que "nos maten": si el personaje los toca, acabar la
Ejercicios propuestos
http://www.nachocabanes.com/fich/descargar.php?nombre=SdlClases04.zip
desde
la animacin.
Revisin 0.99zz Pgina 418
manejo, podemos crear una clase ElementoGrfico, de modo que sea una
Si queremos que una imagen sea "animada", es decir, formada por varios
uso del ratn y de joystick/gamepad. Para ver el estado del ratn se usara
profundizar:
que el lector pueda intentar implementarlas o, al menos, saber por dnde podra
que muchas cosas quedan en el tintero. Aun as, vamos a mencionar algunas, para
de la pantalla, y que los premios sean imgenes PNG con transparencia, a travs
(Ap4.8.1) Mejora el juego de la serpiente, para que tenga una imagen JPG de fondo
Ejercicios propuestos
imagen = SdlImage.IMG_Load("personaje.png");
de mantener.
(Ap4.9.1) Crea una versin del juego de la serpiente en la que la lgica est
proyecto:
Cuando lanzamos Visual Studio 2010, aparece una pantalla que nos muestra los
es gratis para uso personal y se mueve con una soltura razonable en un ordenador
manejo muy similar a ste. Aun as, dado que la versin Express de Visual Studio
imgenes.
En C# podemos crear con una cierta facilidad programas en entornos grficos, con
Ejercicios propuestos
mens y listas desplegables. Ambos los podemos aadir desde el men "Ver":
por las distintas clases que forman nuestro proyecto. La segunda es el "Cuadro de
izquierdo) y luego clic dentro del formulario, para que aparezca un botn en esa
una etiqueta de texto (Label), para hacer un primer programa que cambie el texto
por
crear
un
nuevo
proyecto
llamado
feo
y,
posiblemente,
con
los
componentes
(por
ejemplo)
herramientas:
de ellos con el ratn, cuando lo movamos es fcil que aparezcan unas rayas para
desalineados:
ser
de Windows Forms".
Comenzamos
poco ms la apariencia.
cambiado el texto del botn, ni su tamao, ni el tipo de letra. Ahora vamos a hacer
Hemos visto cmo colocar un botn y una casilla de texto, pero no hemos
no est guardado.
Antes de ver con ms detalle por qu ocurre todo esto y mejorarlo, vamos a
as:
botn. Para eso, hacemos doble clic sobre dicho botn, y aparecer un esqueleto
Ahora vamos a hacer que nuestro programa responda a un clic del ratn sobre el
posicin. De igual modo, hacemos clic en Label para indicar que queremos una
x
x
x
x
con componentes X e Y:
x
x
almacenar el resultado:
convertir a int32 para poder sumar, y luego volver a convertir a string para
otros TextBox. Eso s, como las casillas de texto contienen cadenas, habr que
doble clic sobre l. En este caso, el texto de tbResultado ser la suma de los de los
lbNumero2.
con el ratn).
Font, el tipo de letra.
cambiar el texto de un Label desde cdigo, pero tambin podemos hacerlo desde
ejemplo).
Una vez que estn colocados, vamos a cambiar sus propiedades. Sabemos
etiquetas de texto el equivalente del nmero actual. Pista: al hacer doble clic sobre
convertir el nmero a binario, octal y hexadecimal. En vez de eso, cada vez que en
(Ap5.2.4) Haz una variante del programa anterior, que no use un botn para
decimal). Cada vez que se pulse el botn, se mostrar en las 3 etiquetas de texto el
(Ap5.2.2) Crea una nueva versin del programa, que no solo muestre la suma, sino
lugar de nmeros.
a la derecha y para que no falle si las casillas estn vacas o contienen texto en
(Ap5.2.1) Mejora el ejemplo anterior para que las casillas tengan el texto alineado
Ejercicios propuestos:
propuestos.
Es muy mejorable, pero algunas de las mejoras son parte de los ejercicios
Y la tercera variante permite indicar adems el que ser el botn por defecto:
iconos de aviso:
MessageBox.
.Show("Ese nmero no es vlido", "Aviso");
dado:
podemos mostrar un cierto texto de aviso en una ventana que tenga un ttulo
mensaje de aviso, o pedir una confirmacin al usuario. Para ello podramos crear
Cancelar).
(Ap5.3.1) Mejora el ejercicio Ap5.2.1, para que muestre un mensaje de aviso si las
Ejercicios propuestos:
elemento.
"Control".
programacin, como Visual Basic), as que deberamos crear nosotros esa ventana
operativo. Como el color de fondo de la ventana es "Control" (el color que tengan
sino que slo se mostrarn resultados, y un botn que har que aparezca la
Vamos a crear en ella una casilla de texto (TextBox) en la que no se podr escribir,
Si queremos una ventana auxiliar, que permita al usuario introducir varios datos,
MessageBox.
.Show("Seguro que desea continuar?", "Confirma, por favor",
MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1);
Nos aparecer una nueva ventana, en su vista de diseo. Aadimos dos casillas de
Para crear el segundo formulario (la ventana auxiliar), usamos la opcin "Agregar
devolver el nombre y el apellido como parte de una nica cadena de texto, as:
podemos hacer que sus componentes sean pblicos, o, mejor, crear un mtodo
Adems, para que desde la ventana principal se puedan leer los datos de sta,
doble clic, para que nos aparezca la funcin que se lanzar con el suceso Click del
consola.
texto.
(Ap5.4.2) Crea un programa que muestre una casilla de texto en la que el usuario
Ejercicios propuestos
// Dibujamos
ventanaGrafica.DrawLine(contornoRojo, 200, 100, 300, 400);
ventanaGrafica.FillEllipse(rellenoAzul, new Rectangle(0, 0, 200, 300));
void Button1Click(
(object sender, EventArgs e)
{
// Creamos la pluma, el relleno y la ventana grfica
System.Drawing.Pen contornoRojo = new System.Drawing.Pen(
System.Drawing.Color.Red);
System.Drawing.SolidBrush rellenoAzul = new System.Drawing.SolidBrush(
System.Drawing.Color.Blue);
System.Drawing.Graphics ventanaGrafica;
ventanaGrafica = this.CreateGraphics();
ejemplo que dibujara una lnea roja y una elipse azul cuando pulsemos un botn
contornos) y las "brochas" ("Brush", para los rellenos) que queramos usar. Un
nuestro formulario. Deberemos preparar tambin las "plumas" ("Pen", para los
dibujando lneas, crculos y dems figuras bsicas. En efecto, podemos usar las
DrawEllipse, para dibujar una elipse, a partir del rectngulo que la contiene.
patbulo".
Revisin 0.99zz Pgina 435
(Ap5.6.1) Crea una versin del "juego del ahorcado" (ejercicio 5.9.1.2) basada en
Ejercicios propuestos
http://msdn.microsoft.com/es-es/library/system.drawing.graphics_methods.aspx
la misma que el fuente), y puede estar en formato BMP, GIF, PNG, JPG o TIFF.
Esta imagen debera estar en la carpeta del programa ejecutable (que quiz no sea
void Button2Click(
(object sender, EventArgs e)
{
Graphics ventanaGrafica = this.CreateGraphics();
Image imagen = new Bitmap("MiImagen.png");
ventanaGrafica.DrawImage(imagen,20,20,100,90);
}
Por otra parte, un ejemplo de cmo mostrar una imagen predefinida podra ser:
puntos.
(estructuras Point).
DrawBezier, para una curva spline de Bzier definida por cuatro puntos
clase Graphics. Algunos de los mtodos que sta contiene y que pueden ser tiles
Los mtodos para dibujar lneas, rectngulos, elipses, curvas, etc. son parte de la
ejercicios propuestos en los apartados 4.4.8, 5.5 (2), 5.7 (2), 5.9.1.
(por ejemplo, 2.1, 2.2, 3.1.2, 3.1.9, 4.1.4). Aadido el apartado 6.13 sobre
sobre la instalacin y uso bsico de Visual Studio (en sus versiones 2008
datos con SQLite en 10.10. Ampliado el apartado 2.2.3 para ver cmo
que el apartado sobre "otras bibliotecas" pase a ser el ltimo de esos tres.
0.95, de 01-jun-10. Recolocados (en distinto orden) los temas 8, 9, 10, para
(en los apartados 1.2, 1.4, 1.8, 3.1.4, 3.1.5, 3.1.9, 3.2.1, 3.2.2, 3.2.3, 4.1.1,
&
?, 58
: (goto), 82
/, 34
/**, 382
//, 42
///, 382
/=, 96
.Net, 13
,, 364
*, 34
*=, 96
&, 356
& (direccin de una variable, 330
&&, 52
%, 34
%=, 96
#, 104
0x (prefijo), 106
>, 49
>>, 356
=, 37
-=, 96
==, 49
<, 49
<<, 356
<> (Generics), 326
+, 34
++, 68, 94
+=, 96
~, 214, 356
|, 356
||, 52
{ y }, 17, 48
^, 356
\, 109
--, 94
-, 34
!, 52
!=, 49
@, 109, 383
ndice alfabtico
>
<
BackgroundColor, 340
bajo nivel, 10
base, 230
Base numrica, 105
Bases de datos, 292
Bases de datos con SQLite, 289
BaseStream, 262
BASIC, 9
Begin (SeekOrigin), 259
Binario, 105, 391
BinaryReader, 261
BinarySearch, 318
BinaryWriter, 269
bit, 386
Bloque de programa, 70
BMP (tipo de fichero), 263
bool, 111
Booleanos, 111, 121
Borrar en un array, 118
borrar la pantalla, 340
break, 60
bucle de juego, 409
bucle sin fin, 69
Bucles, 63
Abs, 172
Acceso aleatorio, 253
Acceso secuencial, 253
Acos, 172
Add (ArrayList), 316
AddDays, 337
Al azar, nmeros, 170
Aleatorio, acceso, 253
Aleatorios, nmeros, 170
algoritmo, 14
alto nivel, 9
and, 356
Aadir a un array, 118
Aadir a un fichero, 247
Apilar, 312
Aplicacin Windows, 420
Append, 271
AppendText, 247
Arco coseno, 172
Arco seno, 172
Arco tangente, 172
args, 178
Argumentos de un programa, 177
Aritmtica de punteros, 334
array, 113
Array de objetos, 221
ArrayList, 316
Arrays bidimensionales, 122
Arrays de struct, 126
arreglo, 113
ASCII, 387, 389, 400, 420
Asignacin de valores, 37
Asignacin en un "if", 54
asignaciones mltiples, 96
Asin, 172
Atan, 172
Atan2, 172
azar, 170
Ch
C, 10
C#, 10
Cadena modificable, 138
Cadenas de caracteres, 128
Cadenas de texto, 110
Cambio de base, 105
Campo (bases de datos), 290
Carcter, 107
Carpetas, 248
case, 60
Caso contrario, 50
catch, 88, 250
Bucles anidados, 69
bug, 369
burbuja, 145
Buscar en un array, 118
Button, 422
byte, 93, 385
E, 172
ejecutable, 12
elevado a, 172
else, 50
Encolar, 314
End (SeekOrigin), 259
Enqueue, 314
ensamblador, 10
ensambladores, 11
enteros negativos, 397
Entorno, 347, 348
enum, 358
Enumeraciones, 358
DataGridView, 310
DateTime, 337
Day, 337
debug, 369
decimal, 99
Decimal (sistema de numeracin), 391
Declarar una variable, 36
Decremento, 94
default, 60
Depuracin, 369
Dequeue, 314
Desapilar, 312
Desbordamiento, 36
Descomposicin modular, 156
Desplazamiento a la derecha, 356
Desplazamiento a la izquierda, 356
destructor, 214
Diagramas de Chapin, 83
Diagramas de flujo, 55
Dibujo con Windows Forms, 434
Diccionario, 319
Dinmica, memoria, 311
Direccin de memoria, 329
Directorios, 344
DirectoryInfo, 344
Diseo modular de programas, 156
Distinto de, 49
Divisin, 34
do ... while, 65
Doble precisin, 97, 98
Documentacin, 377
Documentacin desde comentarios, 381
Dos dimensiones (array), 122
Dos ventanas (Windows Forms), 430
Dot Net Framework, 13
double, 99
Doxygen, 381
DrawLine, 435
Hash, 320
Generics, 326
get, 360
Get, 189
GetEnumerator, 322
GetFiles, 345
GetKey, 319
gigabyte, 385
Global (variable), 163
gmcs, 31
goto, 82
goto case, 60
factorial, 175
false, 111, 121
falso, 111, 121
Fecha y hora, 337
Fibonacci, 176
Fichero fsico, 253
Fichero lgico, 253
Ficheros, 242
Ficheros binarios, 253
Ficheros de texto, 242
Ficheros en directorio, 345
FIFO, 314
File.Exists, 249
FileAccess.ReadWrite, 271
FileStream, 258
fin de fichero, 245
fixed, 335
float, 99
for, 67
foreach, 139
ForegroundColor, 340
Formatear nmeros, 102, 103
fuente, 16
Funcin de dispersin, 320
Funciones, 156
Funciones matemticas, 171
Funciones virtuales, 225
Enumeradores, 322
Environment, 348
Environment.Exit, 178
ERRORLEVEL, 178
Escritura indentada, 49
Espacios de nombres, 354
Estructuras, 125
Estructuras alternativas, 47
Estructuras anidadas, 127
Estructuras dinmicas, 311
Estructuras repetitivas, 63
Euclides, 177
Excepciones, 88, 250
EXE, 12
Exists (ficheros), 249
Exit, 178
Exp, 172
Exponencial, 172
Expresiones regulares, 361
Ll
llaves, 17
Label, 424
LastIndexOf, 132
Lectura y escritura en un mismo fichero, 271
Length (cadenas), 130
Length (fichero), 260
lenguaje C, 10
lenguaje mquina, 9
LIFO, 312
Lnea de comandos, 177
Lneas, dibujar, 434
List, 326
lista, 316
Key, 341
KeyAvailable, 340
KeyChar, 341
kilobyte, 385
JavaDoc, 383
JPG, 417
Juegos, 400
Identificadores, 40
if, 47
Igual a, 49
Imgenes con SDL, 400
Incremento, 94
IndexOf, 132
Inseguro (bloque "unsafe"), 330
Insercin directa, 146
Insert, 133, 316
Insertar en un array, 118
int, 36, 37, 93
Internet, 349
intrprete, 12
Interrumpir un programa, 178
Introduccin de datos, 43
IOException, 271
iterativa, 176
O, 52
Objetos, 180
octal, 393
Octal, 105
Ocultacin de datos, 189
OpenOrCreate, 271
OpenText, 244
OpenWrite, 267
Operaciones abreviadas, 96
Operaciones aritmticas, 34
Operaciones con bits, 356
operador coma, 364
Operador condicional, 58
Operadores, 34
Operadores lgicos, 52
Operadores relacionales, 49
Operator (sobrecarga de operadores), 237
or, 356
Ordenaciones simples, 145
n, 108
namespace, 354
Negacin, 34
Negativos (nmeros, representacin), 397
Net, 13
NetworkStream, 350
new (objetos), 187
new (redefinir mtodos), 206
Next (nmeros al azar), 170
nibble, 392
No, 52
not, 356
Notepad++, 33
Now, 337
null (fin de fichero), 246
Nmeros aleatorios, 170
nmeros enteros, 34
Nmeros reales, 97
Main, 17
mquina virtual, 12
matemticas, funciones, 171
matriz, 113
Mayor que, 49
maysculas, 133
Maysculas y minsculas, 40
mcs, 31
megabyte, 385
Memoria dinmica, 311
Menor que, 49
MessageBox, 428
mtodos, 219
Mientras (condicin repetitiva), 63
Modificar parmetros, 167
Mdulo (resto de divisin), 34
Mono, 16, 19
MonoDevelop, 204
Month, 337
Mostrar el valor de una variable, 38
MoveNext, 323
Multiplicacin, 34
Queue, 314
Palabra reservada, 40
Parmetros de Main, 177
Parmetros de una funcin, 158
parmetros por referencia, 168
parmetros por valor, 167
Pascal, 9
Paso a paso (depuracin), 370
Pausa (Sleep), 338
Peek, 313
Persistencia de objetos, 274
Pi, 172
Pila, 312
PNG, 417
Polimorfismo, 215
POO, 180
pop, 312
Posicin del cursor, 340
Posicin en el fichero, 259
postdecremento, 95
postincremento, 95
Potencia, 172
Pow, 172
Precedencia de los operadores, 35
predecremento, 95
preincremento, 95
Prioridad de los operadores, 35
private, 209
Process.Start, 347
Producto lgico, 356
programa, 9
Programacin orientada a objetos, 180
Propiedades, 360
protected, 208
Prueba de programas, 372
Pseudocdigo, 14
public, 18
public (struct), 125
Punteros, 311, 329
Punto Net, 13
Puntos de ruptura, 372
push, 312
Python, 10
Overflow, 36
override, 225
Sangrado, 49
sbyte, 93
SDL, 400
Secuencial, acceso, 253
Secuencias de escape, 108
Seek, 259
SeekOrigin, 259
Seleccin directa, 145
Seno, 172
Sentencias compuestas, 48
Serializable, 275
set, 360
Set, 189
SetByIndex, 320
SetCursorPosition, 340
SharpDevelop, 420
short, 93
Si no, 50
Signo y magnitud, 397
Simple precisin, 98
Sin, 172
Sistema (informacin), 348
Sistema (llamadas), 347
Sistema binario, 391
Sistema de numeracin, 105
Sistema decimal, 391
Sleep, 338
SOAP, 283
Sobrecarga, 215
Sobrecarga de operadores, 237, 239
Sort, 316
SortedList, 319
Split, 135
SQL, 289
SQLite, 292
Sqrt, 172
Stack, 312
stackalloc, 333
static, 219
StreamReader, 244
StreamWriter, 242
string, 62, 110
String.Compare, 137
StringBuilder, 138
struct, 125
struct anidados, 127
Subcadena, 131
Subcadenas, 135
Substring, 131
Suma, 34
Suma exclusiva, 356
uint, 93
tabla, 113
Tabla (bases de datos), 289
Tablas bidimensionales, 122
Tablas hash, 320
Tan, 172
Tangente, 172
Tanh, 172
Tao.SDL, 400
TcpCliente, 350
Teclado, 340
Teclado con SDL, 403
Teclas en consola, 341
Temporizacin, 337
TextBox, 424
Texto con SDL, 411
this, 232
Thread, 338
Thread.Sleep, 338
Tipo de datos carcter, 107
Tipos de datos enteros, 92
Title, 340
ToByte, 93
ToDecimal, 100
ToInt16, 93
ToInt32, 43, 93
ToInt64, 93
ToLower, 133
ToSbyte, 93
ToSingle, 100
ToString, 103
ToUInt16, 93
ToUpper, 133
true, 111
Truncate, 271
try, 88
Y, 52
Year, 337
XML, 283
xor, 356
WaitForExit, 347
while, 63, 65
Windows Forms, 420
Write (BinaryWriter), 269
Write (FileStream), 267
WriteByte, 267
WriteLine, 17
WriteLine (ficheros), 243
ulong, 93
UML, 185
Unicode, 390
Unidades de disco, 348
Unidades de medida, 385
unsafe, 330
ushort, 93
using, 44