ogramación - CETis No. 7cetis7.edu.mx/Microsoft/PROGRAMACION/GUIAS/PROGRAMACION.pdfogramación 10...
Transcript of ogramación - CETis No. 7cetis7.edu.mx/Microsoft/PROGRAMACION/GUIAS/PROGRAMACION.pdfogramación 10...
< > Programación
1
< > Programación
2
Somos una empresa 100% mexicana, con más de 20 años de experiencia siendo el Cen-
tro líder de Capacitación en informática.
Hoy en día, tener las mejores herramientas es sólo una parte del todo lo que signi-
fica que conviene siempre estar en permanente capacitación.
Grupo Eduit ha establecido un programa integrado capaz de identificar y perso-
nalizar las necesidades de los diferentes niveles educativos del país manteniéndose en
cada paso como asesor y colaborador, generando un “programa conforme a sus necesi-
dades”.
MisiónSatisfacer las necesidades de capacitación en tecnologías de informática a través de
programas de entrenamiento de calidad, siendo siempre una empresa a la vanguardia.
VisiónSer líder de soluciones de capacitación a nivel internacional.
< > Programación
3
1 Algoritmos 9
1.1 Lógica computacional 9
1.1.1 Sintaxis de la lógica de predicados 9
1.2 Algoritmos 10
1.2.1 Prueba de escritorio 11
1.3 ClasificacióndeAlgoritmos 13
1.3.1 Transcripción 13
1.3.2 Compilación y errores 13
1.4 Variables 14
1.4.1 Asignación de valores 14
1.5 Operadores 15
1.5.1 Operadores aritméticos y su prioridad 15
1.6 Estructuras Básicas 16
1.6.1 Primera estructura: Secuencia de acciones 16
1.6.2 Segunda estructura: Decisión de acción 17
1.6.3 Tercera Estructura: Ciclos de acciones 19
1.7 Técnicas para representar algoritmos 20
1.7.1 Diagramasdeflujo 20
< > Programación
4
2 Pseudocódigo 28
2.1 Introducción 28
2.2 Diagramas de Nassi Scheiderman (N-S) 28
2.2.1 Diagrama N-S de estructuras de decisión 28
2.3 Normas 30
2.4 Ciclos 35
2.4.1 Ciclo Mientras (While) 35
2.4.2 Ciclo Para (For) 36
2.4.3 Ciclo Hacer-Mientras (Repeat While) 38
2.4.4 Ciclo Hacer-Hasta (Repeat Until) 40
2.4.5 Ciclos Anidados 41
3 Almacenamiento persistente de datos 43
3.1 Diseño conceptual 43
3.1.1 Entidades 44
3.1.2 Relaciones 45
3.1.3 Modelo Entidad-Relación 46
3.2 Diseño lógico 50
< > Programación
5
3.2.1 Tipos de Datos 50
3.3 Lenguajedeconsulta 50
3.3.1 Sintaxisbásicadellenguajedeconsultaestructurado(SQL) 50
3.3.2 Sentencias de selección, inserción, actualización y borrado de datos 51
4 .NET 56
4.1 .NET Framework 56
4.1.1 Entornodeejecución 56
4.1.2 Biblioteca de Clase Base (BCL) 57
4.1.3 Sistema de tipo común (CTS) 58
4.1.4 Especificacióndellenguajecomún(CLS) 58
4.2 Entorno de Programación 58
4.2.1 Entorno de Desarrollo (IDE) 59
4.2.2 Descarga e Instalación 59
4.2.3 Interfaz de usuario 59
4.3 Introducción a la programación en C# 64
4.3.1 Estructura de un programa 64
4.3.2 Palabras reservadas 65
4.3.3 Literales 67
< > Programación
6
4.3.4 Variables 67
4.3.5 Tipos de Datos 68
4.3.6 Operadores 70
4.3.7 Constantes y enumeraciones 75
4.4 Sentencias de Control 78
4.4.1 Condicionales 78
4.4.2 Ciclos 81
4.4.3 Uso de Break y Continúe 86
4.5 Métodos, Arreglos y Colecciones 88
4.5.1 Métodos 88
4.5.2 Parámetros 93
4.5.3 Namespace 94
4.5.4 Arreglos 95
4.5.5 Declaración 96
4.5.6 Colecciones 100
4.5.7 Listas 100
4.5.8 Pilas 103
4.5.9 Colas 104
< > Programación
7
5 Programaciónorientadaaobjetos 108
5.1 ClasesyObjetos 108
5.1.1 Definicióndeclases 109
5.1.2 Accesibilidad 110
5.2 Interfaces de Usuario 111
5.2.1 Barra de herramientas y controles de usuario para formularios Windows 111
5.2.2 Controles de usuario y sus eventos asociados 112
5.3 Excepciones 116
5.3.1 Excepciones del sistema 117
5.3.2 Excepciones personalizadas 120
5.4 Archivos 121
5.4.1 Streams 122
•Comprender cuáles son las secuencias lógicas que se utilizan en programación así como su finalidad.
•Identificar el proceso para la construc ción de algoritmos.
•Clasificar a los algoritmos partiendo de los errores en las secuencias.
•Estimar el valor de una variable. •Evaluar el valor de las variables en diferentes operaciones.
•Manejar las estructuras básicas de los algoritmos.
•Conocer las técnicas para representar algoritmos.
< > Programación
9
1 Algoritmos
1.1 Lógica computacional
La lógica es muy importante ya que ayuda a determinar la forma en que se puede dar solución a un proble-ma. Sin ella no es posible organizar los pasos que generen lo que esperamos obtener.
Lacomputadoratrabajaconunalógicaespecial,exactaymatemática.
Todaslasactividadesquerealizasenlacomputadoraestánbasadasenunalógicaenformadeprocedimientos o secuencias de pasos que hay que realizar para lograr lo que se quiere.
1.1.1 Sintaxis de la lógica de predicados
La lógica de predicados se basa en la idea de que las sentencias expresan relaciones entre objetos, así como cualidades y atributos de estos objetos.
Losobjetospuedenserpersonas,objetosfísicos,oconceptosyseconocencomoargumentos o términos del predicado.
Y las cualidades, relaciones o atributos, se denominan predicados.
Pordefectoseconsideraquelospredicadossonverdaderos,yelhechodequeseanverdaderosdepende de sus términos.
Estosignificaqueunpredicadopuedeserverdaderoparaunconjuntodetérminos,perofalsopara otro.
Por ejemplo, el siguiente predicado:
color (pasto, verde) esverdadero
perosialmismopredicado,lecambiamoslosargumentos,esteyanoseráverdadero:
color(pasto,azul)ocolor(cielo,verde)
Otro ejemplo sería:
textura (algodón, suave) esverdadero
y textura (piedra , suave) ó textura (algodón, aspero) son falsos
Cuandolosargumentosrepresentanaunobjetoespecíficoestosargumentossellamancons-tantes.
Pero también existen argumentos que en determinado momento pueden ser desconocidos, es-tosargumentossontambiénllamadosvariables.
< > Programación
10
En el ejemplo:
color (pasto, X)
lavariableXpuedeserelcolorverde,haciendoqueelpredicadoseaverdadero;opuedeserelcolorazul, resultando un predicado falso.
1.2 Algoritmos
Unalgoritmoesunconjuntodeactividadesoprocesosformadosporunaseriedeinstruccionesotareasorganizadasdeformalógica,quenospermitenalcanzarunresultadooresolverunproblema.
Un algoritmo es un conjunto de instrucciones para resolver un problema.
Debe cumplir con dos reglas generales:
1.Elnúmerodepasosdebeserfinito.Deestamaneraelalgoritmodebeterminarenuntiempofinitoconla solución del problema,
2. El algoritmo debe ser capaz de determinar la solución del problema.
Lascaracterísticasprincipalesdeunalgoritmosonlassiguientes:
a) Precisión. Los pasos a seguir deben ser claros y correctos.
b)Determinismo.Elalgoritmo,dadounconjuntodedatosdeentradaidénticos,debearrojarsiemprelosmismos resultados.
c)Finitud.Elalgoritmo,independientedelacomplejidaddelmismo,siempredebeserdelongitudfinita.
Vistasdeotraformapodemosdefinirlosiguiente
1.Entrada:definirloquenecesitaelalgoritmo
2.Salida:definirloqueproduce.
3. No ambiguo: explícito, siempre sabe qué comando ejecutar.
4.Finito:Elalgoritmoterminaenunnúmerofinitodepasos.
5. Correcto: Hace lo que se supone que debe hacer. La solución es correcta
6.Efectividad:Cadainstrucciónsecompletaentiempofinito.Cadainstruccióndebeserlosuficientemen-te básica como para que en principio pueda ser ejecutada por cualquier persona usando papel y lápiz.
7.General:Debeserlosuficientementegeneralcomoparacontemplartodosloscasosdeentrada.
< > Programación
11
Ejemplo
Unclientesolicitauncréditoaunaempresa.Laempresabuscaensubasededatoslafichadelcliente;sielclienteessolventeentonceslaempresaotorgaelcrédito;encasocontrario,rechazaelcrédito.
Los pasos del algoritmo son:
1. Inicio.
2. Aceptar solicitud de crédito.
3.Examinarlafichadelcliente.
4.Sielclienteessolvente,otorgarcrédito;encasocontrario,rechazarelcrédito.
5. Fin.
1.2.1 Prueba de escritorio
Es la comprobación de forma lógica, de un algoritmo.
Parallevaracabounapruebadeescritorio,seutilizaráelsiguienteprocedimiento:
1. Con los datos de prueba, se seguirán cada uno de los pasos propuestos en el algoritmo de reso-lución.
2. Silapruebadeescritoriogeneraresultadosóptimos,quieredecirqueelalgoritmoposeeunalógica adecuada, en caso contrario el algoritmo tendrá que ser corregido.
Ejemplo:
suma: entero
entrada: entero
menor: entero
leer entrada
menor = entrada
suma = 0
mientras (entrada != 0)haga
si (entrada < menor) entonces
< > Programación
12
menor =entrada
fin_si
suma = suma + entrada
leer entrada
fin_mientras
escribir“valorMenor:”
escribir menor
escribir“Suma:”
escribir suma
Instrucción Entrada Menor Suma Pantallaleer entrada 10menor=entrada 10suma = 0 0suma=suma + entrada 10leer entrada 7menor=entrada 7suma=suma + entrada 17leer entrada 9suma=suma + entrada 26leer entrada 0Escribir“valormenor” ValorMenorEscribir menor 7Escribir“Suma” Suma:Escribir suma 26
La prueba de escritorio nos permite saber:
• Si el programa hace lo que debería hacer
• Sinohaceloquedeberíahacer,nospermitirádetectarerrorescomo:
o Si algún paso o instrucción no está en el orden correcto
o Si falta algo
o Si algo esta de más
< > Programación
13
o Silospasosoinstruccionesqueserepitenlohacenmásomenosvecesdelodebido
o Si las instrucciones están en un orden apropiado
o Otros errores que pueden presentarse
• Elegir los datos apropiados para la prueba
Lapruebadeescritorioesrealizarunprocesodesimulaciónconelalgoritmodesarrollado(observarquéprocesos realizaría una computadora). Este trabajo se realiza en base a una tabla cuyos encabezados son lasvariablesqueseusanenelalgoritmoydebajodecadaunadeellassevancolocandolosvaloresquevantomando,pasoapasoysiguiendoelflujoindicadoporelalgoritmo,hastallegaralfinal.
1.3 ClasificacióndeAlgoritmos
Algoritmo determinista: en cada paso del algoritmo se determina de forma única el siguiente paso.
Algoritmo no determinista:debendecidirencadapasodelaejecuciónentrevariasalternativasyagotar-las todas antes de encontrar la solución.
1.3.1 Transcripción
Eselprocesoatravésdelcualconvertimosunalgoritmoenunlistadodeinstruccionesentendiblesparalacomputadora.Estasinstruccionesdebenajustarsealasreglassintácticasdeunlenguajedeprogramación.Lasreglassintácticasdeunlenguajedeprogramaciónsonlasrestriccionestécnicassobrelascualesestáconstruido el lenguaje.
Podríamosdecirqueesla“traducción”deunalgoritmoconla“ortografía”deunLenguajedePrograma-ción.
1.3.2 Compilación y errores
Lacompilacióneselprocesomedianteel cual la computadora revisaqueelprogramaquehazescritocumplaconlasreglassintácticasdellenguajedeprogramaciónqueestésutilizando.Elcompiladoreselencargadodehacerestarevisiónyteayudaadetectarloserroresdesintaxisydeprecaución.
Cadalenguajedeprogramacióntienesusintaxispropiaporlotantoexisteuncompiladorespecíficoparacada uno.
Si el programa fuente está escrito de manera correcto, el compilador generará el código objeto, en caso contrario mostrará una lista con los errores encontrados, no generándose ningún programa objeto, para que podamos depurarlo.
< > Programación
14
1.3.2.1 Errores de compilación
También conocidos como errores del compilador, son errores que impiden que el programa se ejecute.
Lamayoríasedebenaerrorescometidosalescribirelcódigo.Porejemplo,puedesescribirmalunapalabraclaveuomitiralgunapuntuaciónnecesaria.
1.4 Variables
Unavariableesuntipodecajadealmacenamientoqueseutilizapararecordarvalores,deformaqueéstospuedanutilizarseomodificarsemásadelanteenelprograma.
Tambiénpodemosdecirqueunavariableesunelementoqueseempleaparaalmacenaryhacerreferenciaaotrovalor.
1.4.1 Asignación de valores
Sinoexistieranvariables,unprogramaquesumadosnúmerospodríaescribirsecomo:
resultado = 3 + 1
Elprogramaanteriorestanpocoútilquesólosirveparaelcasoenelqueelprimernúmerodelasumaseael3yelsegundonúmeroseael1.Encualquierotrocaso,elprogramaobtieneunresultadoincorrecto.
Sinembargo,elprogramasepuederehacerdelasiguientemanerautilizandovariablesparaalmacenaryreferirse a cada número:
numero_1 = 3
numero_2 = 1
resultado = numero_1 + numero_2
Los elementos numero_1 y numero_2sonvariablesquealmacenanlosvaloresqueutilizaelprograma.Elresultadosecalculasiempreenfuncióndelvaloralmacenadoporlasvariables,porloqueesteprogramafuncionacorrectamenteparacualquierpardenúmerosindicado.Sisemodificaelvalordelasvariablesnumero_1ynumero_2,elprogramasiguefuncionandocorrectamente.
Lasvariablessepuedencaracterizarpor:
Nombre: por el cuál la referenciamos dentro del algoritmo
Dirección: donde se almacena.
Tipo:laclasedevaloresquepuedealmacenar,implicauntamañodememoriayconjuntodeoperacionessobrelosvalores.
< > Programación
15
Valor:Eselcontenidoenunmomentodado.Puedenvariarsuvalor(contenido)alolargodelaejecucióndel programa.
Elvalordeunavariablepuedecambiaramedidaqueelprogramarealizasusecuenciadeoperaciones,peroelnombreesfijo.Elprogramadortienelalibertaddeelegirlosnombres,yrecomendamosescogeraquellosqueseansignificativosyfácilesderecordaroidentificar.
1.5 Operadores
En el código fuente de un programa un operador es un carácter o una secuencia de caracteres. Por ejem-plo: ‘+’ o ‘*’ Losoperadoresdefinenlasoperacionesquevanarealizarseconlosdatosuoperandos.Existendistintostiposdeoperadoresporejemplooperadoresaritméticos,decadenasdecaracteres,derelación, lógicos o booleanos, de bit y de conjuntos etc.
1.5.1 Operadores aritméticos y su prioridad
En el siguiente ejemplo:
area=longitud*ancho;
1. El carácter ‘*’hacequesemultipliquenlosvaloresalmacenadosenlongitudyancho
2. El símbolo igual ‘=’hacequeelresultadodelamultiplicaciónseasignea(sealmaceneen)área.
Acontinuaciónsemuestranlosoperadoresaritméticos,quesonsimilaresalosbotonesdecualquiercal-culadora.
Operador Significado* multiplicación/ división% módulo+ suma- resta
Observaquesehandivididolosoperadoresengruposparaindicarsu“precedencia”,esdecir,elordenenelqueserealizansusoperaciones.Porlotanto,lamultiplicación,divisiónymódulo(*,/y%)sellevanacabo antes que la suma y la resta (+ y –). También podemos usar paréntesis para agrupar los cálculos y for-zarlosallevarseacaboenunordenespecífico.Siuncálculoincluyeoperadoresdelamismaprecedencia,las operaciones se realizarán de izquierda a derecha.
< > Programación
16
1.6 Estructuras Básicas
Unaestructurasedefinecomounesquemaquenospermiterepresentardemanerasimplificadaalgunaidea y que bajo condiciones normales es constante.
1.6.1 Primera estructura: Secuencia de acciones
Cuandotienesquepensarquedebesirhastala paradadelautobúsatomareltransporteloquevasorganizando en tu mente es una secuencia de acciones que te permitan: acercarte a la parada, esperar el autobús correcto y tomarlo para ir a tu casa.
Puesbienesaeslaprimeraestructurasobrelacualsemueveelpensamientohumanoyeslaestructurade: Secuencia de Acciones.
Paraescribirunasecuenciadeaccionestodoloquetienesquehacerescolocarunanuevaordenounanuevaaccióndespuésdelaúltimaquehayascolocado.Deestamaneraseentiendelasecuencialidadyelorden en la ejecución de esas acciones.
Vamosadesarrollarunalgoritmoquenospermitaasomarnosalaventana,perovamosaasumirquelaventanaadondenosqueremosasomaryaestáabiertayquenoestamosmuydistantesdelaventana.Entonces diríamos:
Algoritmoparaasomarnosalaventana
Inicio
Ubicar la ventana por la que nos queremos asomar
Levantarnos del lugar en donde estemos sentados
Avanzarhacialaventana
Llegarhastatenerlaventanamuymuycerquita
Asomarnos por la ventana
Fin
En el ejemplo dado se puede notar que cada acción está antes de una y después de otra (excepto por supuestolaprimeraylaúltima).
Laestructuradesecuenciaavecesparecesertanobviayaquetodoloquetenemosquehaceresircolo-cando una acción tras otra y, por supuesto, ser muy racionales en el orden de dichas acciones porque en cuestióndealgoritmosel orden de los factores si altera el resultado.
< > Programación
17
1.6.2 Segunda estructura: Decisión de acción
Hasllegadoalaparadadelautobús,vescómopasanypasanautobusesperoningunotienelarutaquene-cesitas.Porcadaautobúsquepasamiraslarutayalverquenoes,esperaselsiguienteyasísucesivamentehastaquevesllegaralquenecesitas.Precisamenteestáeslasegundaestructurasobrelacualsebasaelpensamiento (o razonamiento) humano. Ésta es la estructura de Decisión de acción.
Graciasalacualpuedesescogerlamejoralternativadeentrevarias,siemprequetenemosquetomarunadecisióno,másbien,siemprequetengamosqueutilizarlaestructuradeDecisionesvamosadependerdeuna condición. La condición es la que nos permite que podamos decidir cuál es el camino lógico correcto a tomar.
Vamosadesarrollarelmismoalgoritmodeasomarnosalaventanaperoestaveznolevamosacolocarlascondicionesdequeestamoscercadelaventanaydequeéstaestáabierta.Paraellovamosaincor-porar una líneas de decisión que nos permitan tener un algoritmo más genérico y que nos permita lograr mejorelobjetivo,así:
Algoritmoparaasomarnosalaventana
Inicio
Ubicar la ventana por la que nos queremos asomar
Si estamos sentados
Levantarnos del lugar en donde estemos sentados
Orientarnoshacialaventana
De lo contrario
Orientarnoshacialaventana
Avanzarhacialaventana
Llegarhastatenerlaventanamuymuycerquita
Si esta cerrada
Abrirla
Asomarnos por la ventana
Fin
Elalgoritmohacambiadounpocoyporlotantoahoratieneunascondicionesquelepermitenserunasecuenciadeaccionesmásracional.Enestascondicioneselalgoritmoseconvierteenalgomásdepuradoymuchomásaproximadoalarealidad.Observalossiguientespuntosenestealgoritmo
< > Programación
18
1. Las palabras Siqueaparecensonexclusivamentecondicionalesynoafirmativascomopudierapensarseen algunos casos
2. Después de cada Sicondicionalvaunacondiciónqueeslaquepermitequesehagaunacosauotra.LacondiciónregulalasaccionesquevienendespuésyquedependendelSicondicionalinicial.Enladecisión:
Si estamos sentados
Levantarnos del lugar en donde estemos sentados
Orientarnoshacialaventana
De lo contrario
Orientarnoshacialaventana
Notamos que estar sentados es la condición de la cual depende si hacemos las dos acciones:
Levantarnos del lugar en donde estemos sentados
Orientarnoshacialaventana
O si sólo hacemos la acción
Orientarnoshacialaventana
3.Notaqueunadecisióncompletainvolucra:
Una pregunta que evalúa una condición
Unconjuntodeaccionesarealizarencasodequelacondiciónseaverdadera
Unconjuntodeaccionesarealizarencasodequelacondiciónseafalsa
Estaúltimaparte,dentrodeenunciado3,esrazóndeserdelaexistenciadelaacciónDe lo contrario.
4. No siempre que exista un condicional SidebeexistirunDe los contrario asociado a él. Siempre que exista un De lo contrario es porque está asociado a un Si condicional determinado. Tal es el caso de la Decisión
Si está cerrada
Abrirla
En donde si laventanaestáabiertapuesnohayquehacermásqueasomarseporellaperosi está cerrada debemos primero abrirla para poder asomarnos por ella.
< > Programación
19
1.6.3 Tercera Estructura: Ciclos de acciones
Acostumbras todos los días ir a la escuela a la misma hora y a esperar el autobús en la misma parada, SencillamentevivespracticandolaterceraestructurallamadaCiclos de acciones.
Quenoesmásquelaestructuraquenospermiterepetirunaovariasaccionesunacantidaddefinidadeveces.
Todos los días desayunas en tu casa por lo cual estarás en el ciclo de ir a desayunar a tu casa siempre pero enplenodesayunoelhechodequellevesmuchasveceslacucharadelplatoatubocarepresentaqueestaráshaciendolomismomientrasenelplatoexistatodavíaalgomásparacomer.
Vamosasuponerqueeresunsupervisordeunafábricayquecadamediahora,alolargodetodoeldía,debesestarvigilandodeterminadaaccióna travésdeunaventana..Enpalabras sencillas tendrásqueasomarteporunaventanamientrasnotermineeldíacadamediahorayduranteeltiempoquenoestésasomadoloquetienesquehaceresseguirentupuestodetrabajo.Deestaformapodrásestructurarunalgoritmo más o menos de la siguiente manera:
AlgoritmoparaVigilardesdeunaventana
Inicio
Llegarpuntualalahoradeiniciodelajornadalaboral
Ubicarnos en nuestro escritorio
Mientrasnoseaelfindeldía
Ubicar la ventana por la que nos queremos asomar
Si estamos sentados
Levantarnos del lugar en donde estemos sentados
Orientarnoshacialaventana
De los contrario
Orientarnoshacialaventana
Avanzarhacialaventana
Llegarhastatenerlaventanamuymuycerquita
Si esta cerrada
Abrirla
< > Programación
20
Asomarnos por la ventana
Regresar a nuestro escritorio
MientrasnohayapasadoMediaHora
Permanecer en nuestro escritorio
Fin_Mientras
Fin_Mientras
Fin
Variosfactoresnuevosentranenestealgoritmo
1. La palabra Mientras establece en relación con una condición el inicio de un conjunto de acciones que se repiten precisamente Mientras esa condición lo permita
2. Todo Mientras(porefectosdeclarificacióndelalgoritmo)debetenerunfinalizadorqueindiquehastadondellegaelbloquedeaccionesquedebemosrepetir.
3.Laindentaciónoloquecorrientementeseconocecomoel“Sangrado”deltextoesdecirelhechodequealgunas acciones estén más adentro de la hoja que otras, representa que existen bloques de acciones que tienenunacaracterística.
Las acciones contenidas entre el Inicio y el Fin indican que son las acciones que conforman el algoritmo en mención.
Las acciones comprendidas entre Mientras no sea Fin del día y su correspondiente Fin_Mientras sonelconjuntoobloquequesedeberepetir(o iterar)precisamentemientras lacondiciónseaVerdadera o sea Mientrasnoseafindeldía.
La acción comprendida entre MientrasnohayapasadoMediaHoraysucorrespondienteFin_Mientras es la acción que se deberá realizar hasta cuando se complete media hora.
4. Cada ciclo de acciones que se inicie con Mientras deberá tener un Fin_Mientrasasociadoyasuvezcada Fin_MientrasdeberáfinalizarunoysolouncicloiniciadoconMientras.
1.7 Técnicas para representar algoritmos
1.7.1 Diagramasdeflujo
Los Diagramas de Flujo parten de unos símbolos que nos permiten decir lo mismo que los algoritmos perodeunamaneragráficaymásentendible.
< > Programación
21
Lossiguientessonalgunosdelossímbolosyelsignificadodeellosquesehanacordadoutilizardentrodelos Diagramas de Flujo o Flujogramas:
Símbolo SignificadoRepresenta un proceso que no es más que una acción o una orden a ejecutarse de manera clara yconcreta.Porejemplolaasignacióndeunvaloraunavariable.
Permite representar una Decisión. En su interior podemos escribir la condición de la cual depen-de la decisión y por sus extremos derecho (o iz-quierdo) e inferior se pueden colocar las salidas para los casos en que la condición sea Falsa o sea Verdadera. Permite expresar un proceso de entrada o sali-da, teniendo en cuenta que una entrada en un algoritmoseconcibecomoel procesoatravésdel cual se recibe información y una salida es el procesoatravésdelcualseentregainformación.Permite representar la escritura de un resultado o lo que técnicamente se conoce como una sa-lida.
Representa el Inicio ó el Fin de un Algoritmo. Todoloquesetienequehaceresescribirlapa-labra Inicio o Fin Permite que coloquemos en él los parámetros de inicio de un ciclo cuando se ajusta a una de las formas establecidas por las normas de progra-mación. Representaunaentradadedatosutilizandoelte-clado del computador. Todo lo que tenemos que escribirensuinterioreselnombredelavariable(o lasvariables)endondequeremosqueseal-macene el dato que entra por el teclado.Estos símbolos se conocen como conectores ló-gicos.Nospermitenrepresentarlacontinuaciónde un Diagrama de Flujo cuando éste es tan lar-go que no cabe en una sola hoja.Permite representar una lectura de datos.
< > Programación
22
Este símbolo genera una salida de datos. repre-senta sencillamente una salida o una escritura de datos.
Representa una salida de datos pero escrita en la pantalla del computador.
Lasflechassonlossímbolosquenosvanaper-mitirrepresentarlaformadeconexiónentrelosdemás símbolos determinando igualmente el Flujo de ejecución o realización de acciones.
Estossímbolosfueronutilizadospormuchotiempopararepresentargráficamenteunaideaounalgoritmo.
¿Cómoseutilizaentoncesestasimbología?Tomemoselcasodelosdosalgoritmosqueconstruimosmien-trasconocíamoslasestructurasbásicas.Elenunciadofinalbuscabadesarrollarunalgoritmoquenosper-mitieraVigilarunaempresadesdeunaventanaasomándonoscadamediahoraporella.ElAlgoritmolohabíamosplanteadocomosigueacontinuación:
AlgoritmoparaVigilardesdeunaventana
Inicio
Llegarpuntualalahoradeiniciodelajornadalaboral
Ubicarnos en nuestro escritorio
Mientrasnoseaelfindeldía
Ubicar la ventana por la que nos queremos asomar
Si estamos sentados
Levantarnos del lugar en donde estemos sentados
Orientarnoshacialaventana
De lo contrario
Orientarnoshacialaventana
< > Programación
23
Avanzarhacialaventana
Llegarhastatenerlaventanamuymuycerquita
Si esta cerrada
Abrirla
Asomarnos por la ventana
Regresar a nuestro escritorio
MientrasnohayapasadoMediaHora
Permanecer en nuestro escritorio
Fin_Mientras
Fin_Mientras
Fin
SiqueremosllevarloalasimbologíadeDiagramasdeFlujosuequivalenteseríaelsiguiente:
Diagrama De Flujo Para Vigilar Desde Una Ventana
< > Programación
24
< > Programación
25
CabedestacaralgunosdetallessignificativosenesteDiagramadeFlujo:
1.Todadecisión,comoesobvio,tienedoscaminos:Uncaminonosllevaalaacciónolasaccionesarealizaren el caso de que la respuesta a la pregunta sea Verdadera y el otro camino es el que nos dice que debemos hacer en caso de que la respuesta a la pregunta sea Falsa.
2. Lo que en el algoritmo eran unos ciclos, en el diagrama se cambiaron por unas decisiones en donde uno deloscaminossedevuelve(instruccionesatrásobviamente).AlrealizarunseguimientodeesteDiagramadeFlujonotarásquesepodrádevolvertantasvecescomolopermitalacondicióndelaDecisiónquequedaalfinalyquesolosevaasalirdeesesciclocuandolacondiciónseaVerdaderaoseaqueelciclosemantie-ne mientras la condición sea Falsa lo cual concuerda con la teoría de los ciclos.
< > Programación
26
3.Enlaúltimadecisión,elcaminoFalsonosllevaaunaburbujaquetieneunnúmero1adentro.
Númeroquetambiénestáalprincipiodeldiagramaperoconlaflechaenelotrosentido(esdecir,nosa-liendo del diagrama sinoentrandoaél).SeutilizaestanotaciónsoloparasimplificarunpocoelDiagramade Flujo.
4.ConelDiagramadeFlujoustedpuedeverungráficodelasoluciónyconellohacerseunaideaclaradelasecuenciadepasosquenecesitaríaparaalcanzarelobjetivo.
5.SiemprequevayaadesarrollarunDiagramadeFlujotratedesermuyorganizadoymuyestético,puesnoseolvidequesivamosarepresentarunalgoritmocomputacional(endondesebuscaqueelcompu-tadorlogreunobjetivopornosotros)almomentodelatranscripciónserámuyimportanteelordenqueustedhayatenidoenlautilizacióndeestatécnica.
6.Cuandodiseñeunciclo,noseolvideverificarque,lógicamente,ladecisiónporlacualreemplaceelcicloalmomentodediseñarsudiagramadeflujotengaelmismocomportamientoesdecirpermitanquebajolasmismascondicionesunaacciónounconjuntodeaccionesserepitanunacantidadfinitadeveces.
7.Sielalgoritmoqueustedtieneparalograrestemismoobjetivoesdiferente,tengapresentaqueelDia-gramadeFlujotambiénvaaserdiferenteyaqueésteesunreflejográficodeaquel.
8.Esmuyimportantequesepaqueelsolohechodecambiarlallegadadeunadeterminadaflecha,cambiacompletamenteelalgoritmo.Puedeustednotarquelautilizacióndelossímbolosresultaserunatareamuysimplificada,peroloquesiesdelicadoeslacolocacióndelasflechasyaqueellassonlasquerepre-sentanelsentidoconquesevaa“mover”elflujodenuestrológica.
•Reconocer pseudocódigos.
•Identificar el Diagrama (N-S) y su aplicación en los algoritmos.
•Trabajar con algoritmos identificando decisiones simples, en secuencia o anidadas.
•Elegir el tipo de ciclo adecuado en la creación de algoritmos.
•Resolver problemas utilizando recorridos secuenciales.
< > Programación
28
2 Pseudocódigo
2.1 Introducción
Pseudocódigo es la representación textual de un algoritmo de manera que dicho texto se encuentre enmarcado en algunas normas técnicas que faciliten su posterior transcripción a un lenguaje de Progra-mación.
2.2 Diagramas de Nassi Scheiderman (N-S)
La técnica de Diagramas Rectangulares Estructurados o de Nassi Scheiderman permite tener unas herramientasgráficaspararepresentarlasoluciónaunproblemaconlaventajadequenobrindalaposi-bilidaddequeseamosdesordenadosennuestraconcepción.Sebasaenrepresentargráficamentetodoelalgoritmodentrodelmarcodeunrectánguloyadiferenciadelatécnicaanterior,semuevebásicamenteconlautilizacióndetressímbolosquecorrespondenacadaunadelasestructurasbásicasdelalógicadeprogramación.
2.2.1 Diagrama N-S de estructuras de decisión
Pararepresentarunadecisiónseutilizalafigura2.1endondeporelladoizquierdopodemoscolocarlasacciones o Instrucciones que correspondería ejecutar en el caso de que la condición fuera Verdadera y por el lado derecho colocaríamos las acciones o instrucciones a ejecutar cuando la condición fuera Falsa.
Figura 2.1
< > Programación
29
PerodefinitivamentelautilizaciónefectivadeestatécnicaderepresentaciónseveconunejemploenlaFigura 2.2.
Figura 2.2
Es importante hacer algunas precisiones acerca de este diagrama:
a. Nota que la correspondencia entre nuestra idea y su representación (bajo esta técnica) es mucho másexactaqueenelcasodelDiagramadeFlujoendondetuvimosquehaceralgunospequeños
< > Programación
30
cambios lógicos para que el diagrama correspondiera a la solución planteada.
b. La técnica de diagramación rectangular estructurada obliga a ser mucho más ordenado y no da ningúnespacioparaquenuestroalgoritmoseainentendibledadoquelasestructurassonrelativa-mente rígidas.
c. Paralautilizacióndeestatécnicasólotenemosqueconocertressímbolosyconellosrepresenta-mos todo lo que queramos dado que nuestra lógica se basa en estas tres estructuras.
d. Enmarcar nuestra idea en un rectángulo nos brinda una concepción más concreta de la solución planteada.
e. Realizar una prueba de escritorio con un diagrama basado en esta técnica se reduce a seguir la se-cuenciadeinstruccionesy(aligualqueconlosdiagramasdeflujo)arealizarunaaunaytalcomoestánallílasinstruccionesoacciones,lasdecisionesylarevisióndelascondicionesdelosciclos.
2.3 Normas
Para escribir un algoritmo bajo la forma de pseudocódigo algunas de las normas son las siguientes:
Primera Norma.- Siempre se le ha de colocar un nombre al algoritmo de manera que sea lo primero que selea.Esconvenienteacostumbrarseaquedichonombrenosuperelosochocaracteresypreferiblementequeseaaltamentemnemónicooseaquesunombrehagaunareferenciaaproximadaaloquecontiene.
Segunda Norma.-Luegodecolocadoelnombredelpseudocódigodebemosacontinuaciónquedeclararlasvariablesconlascualesvamosatrabajarduranteelprograma.Todaslasvariablesquevayanaserutili-zadasdebenserdeclaradas.Declararlassignificaescribireltipodedatoquevanaalmacenaryelnombrequedichasvariablesvanallevar.
Tercera Norma.-Todoelcuerpodelalgoritmodeberáir“encerrado”entrelaspalabrasInicioyFinindican-do en donde comienza y en donde termina el pseudocódigo.
Cuarta Norma.-
a. CuandoquierasquesalgauntítuloenlapantallatodoloquetienequehaceresutilizarlaordenEscribayacontinuacióncolocarentrecomillasdoblesloquequierasquesalgaenpantalla.Porejemplo
Escriba“Estaesunademostración”
GeneraráenpantallaeltítuloEstaesunademostración
< > Programación
31
b. SiquieresqueloquesalgaenpantallaseaelcontenidodeunavariabletodoloquetienesquehaceresutilizarlaordenEscribayacontinuaciónysincomillasdobleselnombredelavariableque quieres escribir. Por ejemplo:
N = 5
Escriba N
Mostraráenpantallaelvalor5
c. Siquieresqueenpantallasalgauntítuloyacontinuaciónsalgaelcontenidodelavariabletodoloquetienesquehacerescolocareltítuloentrecomillasdoblesy,luegodehaberlascerrado,colocarelnombredelavariablequequierasescribiralladodeltítulo.Porejemplo:
N = 8
Escriba“Elvalores“N
GeneraráenpantallaElvalores8
Siquieresmostrarenpantallaelcontenidodevariasvariablesentoncessimplementeacontinua-cióndelaordenEscribayseparadasporcomaspuedesescribirlosnombresdelasvariablesquequieres escribir. Por ejemplo:
N = 8
M = 4
Escriba“Losvaloresson“N, M
EscribiráenpantallaLosvaloresson84
Quinta Norma.-
a. Cuandovayasaleerundatoparaqueseaalmacenadoenunavariabledeterminadautilizalaor-den Lea. Para no tener que escribir (por ejemplo)
LeaundatoenteroyguárdeloenlavariableNquetambiénesentera
Sólotienesqueescribir
Lea N
< > Programación
32
y la computadora lo entenderá correctamente.
b. CuandonecesitesleermásdeundatoparaseralmacenadoendiferentesvariablestodoloquetienesquehaceresutilizarlaordenLeayescribirlasvariablesseparadasporcomas.Porejemplo
Lea a, b
Suponiendoquetantoacomobsonvariablesdetipoentero,estaordenleindicaráalacomputa-doraqueleaundatoenteroyloalmaceneenlavariableayluegoqueleaotrodatoenteroyloalmaceneenlavariableb.
c. NonecesariamentecuandoseleandosomasvariablesutilizandounasolaordenLea, éstas deben serdelmismotipo.Porejemplo:
Lea var_e, var_r, var_c
Asumiendoquevar_eesunavariabledetipoentero,var_resunavariabledetiporealyvar_cesunavariabledetipocarácter,estaordenleindicaráalacomputadoraqueleaunvalorenteroyloalmaceneenlavariablevar_e,luegoqueleaunvalorrealyloalmaceneenlavariablevar_ryluegoqueleauncarácteryloalmaceneenlavariablevar_c.
Sexta Norma.-CuandonecesitestomarunadecisióndeberásutilizarlaordenSi,acontinuaciónescribirlacondición correspondiente y luego las instrucciones que se han de realizar en caso de que la condición sea Verdadera. En caso de que la condición sea Falsa y tenga instrucciones a realizarse cuando así sea entonces deberáexistirunaalternativaDe los contrario.AlfinalizartodaladecisióndeberáexistirunindicadorFin_Si. La estructura entonces será la siguiente:
Si Condición
.
.
Instrucciones a ejecutar si la condición es Verdadera
.
.
De lo contrario
< > Programación
33
.
.
Instrucciones a ejecutar si la condición es Falsa
.
.
Fin_Si
LascondicionespuedenserexpresadasutilizandolossiguientesOperadoresRelacionalesquesonlossím-bolosquenosvanapermitirobtenerunarespuestaVerdaderaoFalsa:
>Mayorque
<Menorque
>=Mayoroiguala
<=Menoroiguala
= Igual a (también llamado igual de comparación)
<>Diferentede
Esimportanteresaltarqueelsignoigual(=)utilizadocomooperadorrelacionaltieneunafuncióndiferen-tequeelsignoigual(=)utilizadoparaasignarleunvaloraunavariable.Enelprimercasoseríautilizadoparapreguntar,porejemplo,sielcontenidodelavariableaesigualalvalor5yenelsegundocasoestaría-mosasignandoalavariableaelvalor5.Sondosusosrealmentediferentes.
Algunoslenguajesdiferenciansintácticamenteeligualdecomparación(==) del igual de asignación preci-samente para que el compilador no tenga la opción de realizar interpretaciones ambiguas.
Tambiénpodemosconectarexpresionesrelacionales(talescomoa<b)atravésdelosOperadores
Booleanosquenosonmásqueunossignosquenosvanapermitirexpresardichasrelaciones.
Cuandoéramosniñosynosdecían,almandarnosalatienda,traeunrefrescoyunpande$10teníamos
< > Programación
34
variasopciones.
a. De lo contrario traíamos ninguna de las dos cosas entonces no habíamos cumplido la orden.
b. De lo contrarionotraíamoselrefrescoperosí traíamoselpande$10 tampocohabíamoscumplido la orden
c. Sitraíamoselrefrescoperonotraíamoselpande$10tampocohabíamoscumplidolaorden
d. Si traíamoselrefrescoytambiéntraíamoselpande$10entonces síhabíamoscumplido laorden completamente.
Paraesteejemploasumimosquecumplirlaordeneshacerel“mandado”completo.Igualmentevamosaasumir la frase Hemos cumplido la orden como un Verdadero ( V ) y la frase No hemos cumplido la orden comounFalso(F).Deestaformapodríamosorganizarlasiguientetabladeverdad:
Condición 1
Trae un refresco
Condición 2
Traeunpande$10
Cond1 Y Cond2 Explicación textual
F F F No cumplimos
completamente la
ordenF V F No cumplimos
completamente la
ordenV F F No cumplimos
completamente la
ordenV V V Cumplimos
completamente la
orden
< > Programación
35
2.4 Ciclos
Un ciclopuededefinirsecomounaestructuraquenospermiterepetiroiterarunconjuntodeinstruccio-nesyquetienelassiguientescaracterísticas:
a) Elconjuntodeinstruccionesdebeserfinito
b) Lacantidaddevecesqueserepitadichoconjuntodeinstruccionestambiéndebeserfinita.
c) Debenestarclaramentedemarcadoselinicioyelfindelciclo.Enloscasosenloscualessóloexistauna instrucción a iterar, no serán necesarios dichas marcas.
d) Dentro de un ciclo podrá ir cualquiera de las otras estructuras que se han estudiado incluyendo otros ciclos.
2.4.1 Ciclo Mientras (While)
Eselesquemageneraldetrabajoparatodoslosciclos.Esútilquesepasqueesteciclotambiénesllamadoel Ciclo Mientras Que.
Su estructura general es la siguiente
Mientras Condición
.
.
Cuerpo del Ciclo
.
.
Fin_Mientras
Su forma de ejecución es muy sencilla: Mientras se cumpla que la condición sea Verdadera entonces se ejecutaráelCuerpodelCiclo.DemaneraquetambiénpodríamosdecirqueelCuerpodelCicloserepetirátantasvecescomolopermitalacondiciónomientrasdichacondiciónseaVerdadera.
< > Programación
36
Ejemplo
Escribir los números impares comprendidos entre 1 y 20.
ProgramaEjem_Ciclo_Mientras
Variables
Entero :Num
Inicio
Num = 1
Mientras Num < = 20
Escriba Num
Num = Num + 2
Fin_Mientras
Fin
2.4.2 Ciclo Para (For)
Permiteejecutarunaovariasinstruccionesmientraslosvaloresdeunaprogresiónaritméticaderazóncrecienteodecrecientesevayanasignandoaunavariablellamada“variable de control delciclopara”.Elcontroldelciclosehaceenformaautomática,conbaseenparámetrosqueestableceelprogramador.
LadiferenciaconelcicloMientrasesqueenelcicloPARA,lavariablecontroladoraseinicializa,seincre-mentaysecomparaautomáticamente.
Representación o forma general
PARA VC = LI, LF, INC HACER
Accion1
Accion2
Accion_ n
FIN_PARA
< > Programación
37
Dónde:
VC.- Variable de control del ciclo
LI.- Límite inicial
LF.-Límitefinal
INC.- Incremento
Enesteciclolavariabledecontroltomaelvalorinicialdelcicloyelcicloserepitehastaquelavariabledecontrolllegueallímitefinal.
Funcionamiento:
a. Si INCespositivo:(LI < LF)
Cuandoseactivalaestructura,automáticamenteseasignaelvalordeLI a VC y se compara VC con LF. Si VC>LF, no se ejecuta la secuencia de instrucciones o acciones. Si
VC<=LF,seejecutalasecuenciaunavezyautomáticamenteregresaalprincipiodelcicloaincre-mentarlavariablecontroladoraenelvalordeINC (VC=VC+INC)ysecomparanuevamenteelvalorde VC con LF.SinuevamenteVC<=LF,sevuelveaejecutarlasecuenciayseregresaalprincipiodelcicloarepetirlomismo.Siahora,VC>LF,seterminaelcicloautomáticamente.
b. Si INCesnegativo:
Se hace lo mismo pero se ejecuta la secuencia siempre y cuando VC>=LF y no se ejecuta si VC<LF. En ese caso LI>LF
< > Programación
38
Ejemplo:
Hacerunalgoritmoqueimprimalastablasdemultiplicarde1a5.
Definicióndevariables:
I:multiplicando
J:Multiplicador
P: Producto
Algoritmo:
INICIO
PARA I=1, 5, 1 HACER
PARA J=1, 5, 1 HACER
P=I*J
Imprimir I,“*”,J,“=”,P
FIN_PARA
FIN_PARA
FIN_INICIO
2.4.3 Ciclo Hacer-Mientras (Repeat While)
Repiteunprocesounaovariasveces,adiferenciadelMientras,elcuallorepiteceroomásveces,estodebido a que el REPETIRevalúalacondiciónalfinaldelproceso,mientrasqueenelMientraspuedeserque nunca llegue a entrar si la condición no se cumple desde un principio.
La forma de esta estructura es la siguiente:
REPETIR
Acción 1
< > Programación
39
Acción 2
.
.
Acción N
MIENTRAS <condición>
Funcionamiento:
Alentraralaestructuraseejecutalasecuenciadeaccionesoinstruccionesunavezyseevalúalacondi-ción.Siéstaesfalsa,sesaledelcicloysecontinúaconlasiguienteinstrucción;siesverdadera,seejecutanuevamentelasecuenciaysevuelveaevaluarlacondición.Elprocesoserepitemientraslacondiciónseaverdadera.
Ejemplo:
Hacer un algoritmo que encuentre la suma de los primeros N números naturales.
Algoritmo:
INICIO
SUMA=0
NUM=1
Leer N
REPETIR
SUMA=SUMA+NUM
NUM=NUM+1
MIENTRASNUM<=N
Imprimir“Lasumadelosprimeros“,N,“númerosnaturaleses:“,SUMA
FIN_INICIO
< > Programación
40
2.4.4 Ciclo Hacer-Hasta (Repeat Until)
Esta es otra de las formas que traen algunos de los lenguajes de programación para expresar un ciclo. Su estructura general es la siguiente
Haga
.
.
.
Cuerpo del Ciclo
.
.
.
Hasta Condición
EnestecicloelCuerpodelmismosevaaejecutarhastacuandosecumplaunacondiciónestoquieredecirqueelconjuntodeinstruccionesqueconformanelcuerpodelciclosevaarepetirmientraslaevaluacióndelacondiciónseaFalsa.EsunciclomuyparecidoalCicloMientrasconladiferenciadequeenéstelainstruccionesserepitenMientraslacondiciónseaFalsaynoverdaderacomoseríaenelCicloMientras.
< > Programación
41
2.4.5 Ciclos Anidados
Sedefinecomociclosanidadoslaestructuraenlacualuncicloestádentrodeotro(completamente).Estosignificaquesisetrataradeunaestructuramientrasanidadasuesquemaseríaelsiguiente:
Mientras Condición1
.
.
Mientras Condición2
.
.
Cuerpo del ciclo mas interno
.
.
Fin_Mientras Interno
.
.
Fin_Mientras Externo
Su forma de ejecución es muy sencilla: MientrasseaVerdaderalacondición1elcicloexternovaaejecutarel cuerpo del ciclo dentro del cual se encuentra un ciclo interno que está regido por la condición2 de tal manera que se ejecutará completamente el ciclo interno mientras la condición2 sea Verdadera. Cuando éstacondición2seaFalsaseejecutaránelrestodeinstruccionesdelcicloexternoysevolveráalacondi-ción1aevaluarsiaúnesverdaderaparavolveraentrarenelcuerpodedichociclo.
• Comprender la importancia de elaborar un diseño conceptual previo al diseño lógico.
• Implementar el diseño de la base de datos utilizando un SMBD a partir del diseño conceptual.
• Conocer un lenguaje que permita realizar consultas estructuradas.
< > Programación
43
3 Almacenamiento persistente de datos
Una base de datos es una herramienta para recopilar y organizar información. En las bases de datos, se puede almacenar información sobre personas, productos, pedidos, o cualquier otra cosa.
LasbasesdedatossoncreadasmedianteunsistemadeadministracióndebasesdedatosoDBMS.
3.1 Diseño conceptual
Por ejemplo, una base de datos muy sencilla podría ser una agenda de direcciones en la que anotemos datos de nuestros amigos.
Tendríamosuna”ficha”paracadaunodeestosamigos.Encadaficha,asuvez,existiráunaseriedeapar-tados, como el nombre, la dirección, el teléfono, etc.
Estonospermiteintroducirdosprimerosconceptosqueutilizaremos:cadaunadeestas“fichas”recibeelnombre de “registro”,ycadaunodelos“apartados”quecomponenlasfichassellama“campo”.
Una base de datos es un contenedor de objetos. Una base de datos puede contener más de una tabla. Por ejemplo,unsistemadeseguimientodeinventarioqueutilizatrestablasnoesunconjuntodetresbasesdedatos,sinounasolabasededatosquecontienetrestablas.
Elconjuntodelasfichas(registros)formaun“bloque”deinformación,quellamaremos“tabla”,yquesesuelerepresentarescribiendocadaficha(registro)enunafilaycadaapartado(campo) en una co-lumna, así:
Nombre Dirección Ciudad TeléfonoJosé C/ Rana 1 Alicante 111-11-11Jesús C/ Sapo 2 Madrid 222-22-22Juan C/ Boa 3 Barcelona 333-33-33
Cadaunodeestos“bloques”dedatosseráuna tabla,yestas tablasestaránrelacionadasentresí (porejemplo:unartículoserásuministradoporunciertoproveedor,yeseartículoapareceráenciertasfactu-ras, cada una de las cuales corresponderá a un cierto cliente).
Todo este conjunto de información que forman las tablas y las relaciones entre ellas (y alguna cosa más queyaveremos)seránuestra“basededatos”.Enconcreto,setratarádeloqueseconocecomouna“basededatosrelacional”.
< > Programación
44
Etapas de diseño
El primer paso antes de crear una base de datos es pararse a pensar. Ni más ni menos. Si en la programa-ción es muy peligroso eso de empezar a teclear según aparece una idea (a pesar de que hay bastante gente que lo hace, y alguno lo hace incluso bien... si el programa es corto), en la creación de bases de datos es muy raro que salga bien.
El segundo paso recomendable es ir anotando las ideas según surgen. Cuando creemos que ya está todo, deberíamosvolveraleertodaslasnotasquehabíamostomado,porqueesonosayudaráatenerunavisióndeconjuntoyanotarsifaltaalgoquenohayamosprevistoinicialmente.
El tercer pasoseráempezaradibujargarabatosquerepresentenesainformación.Paraelloveremosporencimaunmodelollamado“Entidad-Relación”.Eldibujonosayudaráatenerunanuevaversióndecon-junto,muchomás fácildeseguirymáscompletaque lasanotaciones.Aquíseverántodavíamejor lascarenciasylasincongruenciasquepuedanexistir.
El cuarto pasoseráconvertirestedibujoenlastablas.Estepasopuedesercasitotalmentemecánico.Porejemplo,laconversióndelmodeloEntidad-Relación(elqueveremos)aunabasededatosrelacional(lasquenormalmentemanejaremos)escasiinmediato.Seacabóeldiseño.
Podríamosañadirunquinto paso que sería la introducción de los datos y la creación de una serie de es-tructuras auxiliares, como formularios, consultas o informes.
3.1.1 Entidades
Una entidad es la representación de un objeto o concepto del mundo real que se describe en una base de datos.
Unaentidadsedescribeenlaestructuradelabasededatosempleandounmodelodedatos.
Porejemplo,nombresdeentidadespuedenser:
Alumno,Empleado,Artículo,etc.
Cadaentidadestáconstituidaporunoomásatributos.Porejemplo,laentidad“Alumno”podríatenerlosatributos:nombre,apellido,añodenacimiento,etc.
En el modelo de entidad-relaciónseempleandostiposdeentidades:entidad fuerte y entidad débil.
Lasentidadesfuertestienenatributosclaves,entantolasentidadesdébilesnotienenatributosclavespropios.
< > Programación
45
3.1.2 Relaciones
Enbasesdedatos,unarelaciónovínculoentredosomásentidadesdescribealgúnainteracciónentrelasmismas.Porejemplo,unarelaciónentreunaentidad“Empleado”yunaentidad“Sector”podríaser“tra-baja_en”,porqueelempleadotrabajaenunsectordeterminado.
Las relaciones se describen en la estructura de la base de datos empleando un modelo de datos.
Lasrelacionessonmuyempleadasenlosmodelosdebasesdedatosrelacionalyafines.
En SQL las relaciones son llamadas tablas.
Vamosverunprimerejemplo,quenosayudaráallevaralaprácticatodoestoyaintroducirelmodelo“Entidad-Relación”.
Imaginemos que nos proponen el siguiente problema:
“Sedeseaautomatizaruncentrodeestudiosdepequeñotamaño.Interesacontrolarexclusivamentelosasuntos académicos: qué alumnos tenemos, qué cursos/asignaturas han realizado, qué profesores tene-mosenplantilla,quiénhaimpartidocadaunodeloscursos,etc”.
Estas serían las indicaciones que nos daría el cliente (o que nosotros pensaríamos, si lo realizamos para nosotros).
Ahoratendríamosquepensarsivemosquefaltaalgo(ypreguntaralcliente,siprocede,cosascomosidesea guardar la dirección y demás datos postales de los alumnos y de los profesores, o si quiere saber la notaquecadaalumnoobtuvoencadacurso)oinclusosisobraalgo(porqueresultedemasiadodifícildellevaracabo-¿difícil,paranosotros?...lodudo-).
Pasamosadesglosarenbloquesdeinformación.Demomentotodavíanohablaremosdetablas,sinode“entidades”(unnombremásambiguoperomásadecuado)yde“relaciones”entreestasentidades.
Ennuestrocaso,las“cosas”(entidades)quetenemossonbásicamenteéstas:
• Alumnos.
• Cursos.
• Profesores.
Ylasrelacionesquehayentreestasentidadesson:
• LosprofesoresIMPARTENcursos.
• Los alumnos ASISTEN a cursos.
< > Programación
46
• Indirectamente,losalumnosylosprofesorestambiénestánrelacionados:unalumnohaasistidoauncursoquehaimpartidounciertoprofesor;estarelaciónyaquedareflejadaapartirdelasotrasdos,asíque no es necesario detallarla.
Auncomentaremosalgomássobrelasrelaciones.Unacaracterísticaimportantedelasrelacionesessu“cardinalidad”:porejemplo,enlarelacióndeque“losalumnosasistenaloscursos”,esimportantesiacadacursosólopuedeasistirunalumnoovarios,ysiunalumnopuedeasistiraunsolocursooavarios.
Tendremos cuatro posibilidades:
• Que cada alumno asista a uno y sólo uno de los cursos (se expresa como 1:1 -uno a uno-)
• Quecadaalumnopuedaasistiramuchoscursos,peroencadacursosólopuedehaberunalumno(1:M-unoamuchos-)
• Quecadaalumnopuedaasistiraunúnicocurso,peropuedahabervariosalumnosenuncurso(M:1-muchosauno-).
• Quecadaalumnopuedaasistiravarioscursos,yencadacursopuedahabervariosalumnos(M:M-muchos a muchos-)
Ennuestrocaso, larelación“asistir”esunarelaciónde“muchosamuchos”(M:M).Podríamospregun-tarnoslacardinalidaddelaotrarelación(“losprofesoresimpartencursos”).Enestecaso,cadaprofesorpuedeimpartirvarioscursos,ysupondremosquecadacursoesimpartidoporunúnicoprofesor(estoydandoporsupuestoqueseconsideradistintouncursode“BasesdeDatos”impartidoenunafechayotrodelamismatemáticaperoimpartidoenfechadistinta).Setrataríadeunarelación“deunoamuchos”1:M.
Unaobservación:enlasrelacionesesimportanteelsentidoenelqueseleen.Porejemplo,larelación“losprofesoresimpartencursos”esunarelación1:M(unoamuchos),mientrasquelarelaciónopuesta“loscursossonimpartidosporprofesores”esunarelaciónM:1(muchosauno).
Estasrelacionesquehemoscomentadoson“relacionesbinarias”(entredosentidades).
3.1.3 Modelo Entidad-Relación
Esteesunmodeloquenospermitirá“dibujar”lasentidadesylasrelacionesqueexistenentreellas.No-sotros usaremos el modelo “Entidad-Relación Extendido”(EER).Existenvariasnotacionesligeramentedistintas.Voyautilizarlaqueconsideromássencilla.
Enestanotaciónserepresentanlasentidadescomounrectánguloylasrelacionesbinariascomounrombopartidoporlamitad.Silarelaciónes1:M,unadelasmitades(laquecorrespondeal“muchos”)deberáestarsombreada,ysiesM:M,todoelromboestarásombreado,loantesmencionadopuedeobservarseen la Figura 3.1.
< > Programación
47
Figura 3.1
VamosavercómoquedaríaeldiagramaEntidad-Relacióndenuestroejemploenlafigura3.2:
Figura 3.2
Asídesencillo:tenemos3entidades(profesores,cursos,alumnos)ydosrelaciones(impartir,entreprofe-soresyalumnos,1:M,yasistir,entrealumnosycursos,M:M).
Realmente,yaaestenivelsesueleindicarlos“apartados”quehayencadaentidad(loqueseránlos“campos”denuestrastablas).Aestos“apartados”lesllamaremos“atributos”,yserepresentancomopequeñaselipsesquesalendelasentidades.
Vamosapensarprimeroquéatributosnospodríainteresarparanuestrasentidades:
Alumnos:
• CURP
• Nombre
• Dirección
• Ciudad
< > Programación
48
• Teléfono
• Fecha de nacimiento
• Fecha de alta en el centro
• Fotografía
Profesores:
• CURP
• Nombre
• Dirección
• Ciudad
• Teléfono
• Conocimientos
• Sueldo
• Cuenta bancaria
Cursos:
• Nombre del curso
• Fecha de comienzo
• Duración (horas)
• Importe (pesos)
• Número máximo de alumnos
Es sólo un ejemplo. Insisto en que de momento no estamos pensando en tablas, sino simplemente en qué información queremos almacenar. Según el sistema de bases de datos que empleemos realmente, puede ocurrirqueseaincómodo(oinclusoimposible)trabajarconalgunosdeestosdatosquehemosprevisto(porejemplo,la“fotografía”delalumno).Peroesoyanosloplantearemosdespués.
Loquesívamosapensaryaescualdeesosdatosnospermitirádistinguirunafichadeotra.Estosehaceporquepodemostenerdosalumnosconelmismonombre,peroclaramentesonpersonasdistintas,yde-bemos saber qué cursos ha realizado cada uno de ellos sin posibilidad de confusión, para no dar a uno el diploma que corresponda a otro, ni cobrarle un dinero de otro.
Enelcasode losalumnos,nosondatosúnicos lossiguientes:elnombre(puederepetirse, inclusoconapellidos), ladirección(doshermanosodosamigospuedenvivirenlamismacasa),elteléfono(ocurrelo mismo), la fecha de nacimiento (también podemos encontrar dos alumnos que hayan nacido el mismo día), etc.
< > Programación
49
LoquerealmentedistinguiráaunalumnodeotroessunúmerodeCURP(ClaveÚnicadeRegistrodePo-blación) o pasaporte, que sí es único.
Puesbien,estedatoquepuededistinguirunapersonadeotra(oengeneralunaficha-registro-deotra)esloquellamaremosla“clave”.
Puedeocurrirquenoexistanadaquenossirvaclaramentecomoclave,comoeselcasodeloscursos:noesúnicoelnombre(podemosimpartirmásdeuncursoconelmismocontenido),nilafechadecomienzo(varioscursospuedencomenzarelmismodía),niladuración,nielimporte,nielnúmeromáximodealum-nos.Enestoscasossesueleañadiralgoarbitrario,uncódigo,quenospermitadistinguiruncursodeotro(engeneralunaficha-registro-deotra).Ennuestrocaso,incluiríamosunnuevoatributo,llamado“Códigodecurso”.
UnúltimocomentarioantesdevercómoquedaríanuestrodiagramaEERconsusatributos.Puedeocurrirquenuestraentidadtengavariosatributosúnicos,todosloscualespuedanservircomoclave.Entonceses-cogemosunadeellascomo“claveprincipal”,yelrestoserán“clavesalternativas”,quenollegaremosausarcomoclaves.Eneldiagrama,elatributoquevayaautilizarsecomoclaveprincipalaparecerásubrayado.
Ahora ya sí. Nuestro diagrama quedaría como en la Figura 3.3 (no incluyo todos los atributos que habíamos pensado,sóloalgunoscomoejemplo,queesconlosquetrabajaremosapartirdeahora):
Figura 3.3
< > Programación
50
3.2 Diseño lógico
3.2.1 Tipos de Datos
Engeneral,lostiposdedatoshabituales,queencontraremosencasicualquiersistemadebasesdedatos,son los siguientes:
• Texto (o alfanumérico, o carácter), cuando nuestro campo deba almacenar letras y quizás algún otrotipodesímbolosdepuntuacióny/ocifrasnuméricas.
• Numérico, cuandonuestro campovayaa guardar cantidadesnuméricas, especialmente simásadelantenecesitaremosrealizaroperacionesaritméticasconestascantidadesnuméricas.
• Lógico,cuandosólohaydosposibilidades(verdaderoofalso,síono).
• Fecha, para almacenar fechas (y, en ocasiones, también horas).
• Memo, es un campo de texto especial, que permite una longitud ilimitada, pero a cambio su acce-so es más lento que el campo de texto normal.
• Otrosmenoshabitualesnospermitiránguardarimágenesoficherosengeneral,númerosqueseincrementenautomáticamente,hipervínculos (enlacesaunaciertadireccióndentrodenuestracomputadora u otro), etc.
3.3 Lenguajedeconsulta
3.3.1 Sintaxisbásicadellenguajedeconsultaestructurado(SQL)
SQLesunlenguajedecomputaciónquesirveparatrabajarconconjuntosdedatosylasrelacionesentreellos.
SQL se usa para describir conjuntos de datos que pueden ayudarle a responder preguntas. Cuando se usa SQL, debe emplear la sintaxis correcta. La sintaxis es el conjunto de reglas mediante las cuales se combinan los elementos de un lenguaje correctamente. La sintaxis de SQL se basa en la sintaxis del inglés.
Comandos
ExistendostiposdecomandosSQL:
• LosDLLquepermitencrearydefinirnuevasbasesdedatos,camposeíndices.
• LosDMLquepermitengenerarconsultasparaordenar,filtraryextraerdatosdelabasededatos(select, insert, update y delete)
< > Programación
51
Cláusulas
Lascláusulassoncondicionesdemodificaciónutilizadas paradefinir losdatosquedeseaseleccionaromanipular.
Cláusula Descripciónfrom Utilizadaparaespecificarlatabladelacualsevan
a seleccionar los registroswhere Utilizadaparaespecificarlascondicionesquede-
benreunirlosregistrosquesevanseleccionargroup by Utilizadaparaespecificarlosregistrosselecciona-
dosengruposespecíficoshaving Utilizadaparaexpresarlacondiciónquedebesa-
tisfacercadagrupoorder by Utilizadaparaordenarlosregistrosseleccionados
deacuerdoconunordenespecífico
Por ejemplo, una simple instrucción SQL que recupera una lista de los apellidos de contactos cuyo nombre esMaríapodríasersimilaraesto:
SELECT Apellidos
FROM Contactos
WHERENombre=‘María’;
3.3.2 Sentencias de selección, inserción, actualización y borrado de datos
Sentencias de Selección
Seutilizanparaindicaralmotordedatosquedevuelvainformacióndelasbasesdedatos,estainformaciónesdevueltaenformadeunconjuntoderegistrosquepuedenmodificarse.
Sintaxis:
SELECT Atributos FROM Tabla
Atributos: lista de propiedades que se deseen presentar
Tabla:nombredelatablaquecontienelosatributosapresentar
< > Programación
52
Ejemplo:
SELECTNombre,TelefonoFROM Clientes
Estaconsultadevuelveunrecordsetconelcamponombreyteléfonodelatablaclientes.
Sentencias de inserción
Paraalmacenardatosenunabasededatosdebemos insertarfilasen lastablas.ParaellosSQLponeanuestra disposición la sentencia INSERT.
Inserción individual de filas
PararealizarlainserciónindividualdefilasSQLposeelainstrucciónINSERTINTO.Lainserciónindividualdefilaseslaquemáscomúnmenteseutiliza.
Su sintaxis es la siguiente:
INSERT INTO <nombre_tabla>
[(<campo1>[,<campo2>,...])]
values
(<valor1>,<valor2>,...);
Comosepuedeobservar lasentenciatienedospartesclaramentediferenciadas,porun lado lapropiaINSERT INTO seguida de la lista de campos en los que queremos insertar los datos, y por otro la lista de valoresquequeremosinsertarenloscampos.Lamejorformadeverestoesatravésdeunejemplo.
INSERT INTOtCoches
(matricula,
marca ,
modelo ,
color ,
numero_kilometros)
< > Programación
53
values
(‘M1111CA’,
‘RENAULT’,
‘MEGANETR100’,
‘NEGRODIAMANTE’,
78000);
Nota:Hemosutilizadoelcolorrojoparalosdatosdetipotexto,entrecomilladosconlacomillasimple,yelazulparalosnuméricos.
Con esta sentencia INSERTcreamosunregistroenlatablatCochesconlosvaloresespecificados,esdecir,lamatriculatendráelvalorM-1111-CA,lamarcaseráRENAULTyasísucesivamente.
Sentencias de actualización
Para la actualización de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la ac-tualizacióndeunoovariosregistrosdeunaúnicatabla.LasintaxisdelasentenciaUPDATE es la siguiente:
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
LassiguientessentenciasactualizanlosdatosdelatablatCochesconlosvaloresdelatablatMarca.
UPDATEtCoches
SETmarca=‘1’
WHEREmarca=‘FORD’;
< > Programación
54
UPDATEtCoches
SETmarca=‘2’
WHEREmarca=‘RENAULT’;
UPDATEtCoches
SETmarca=‘3’
WHEREmarca=‘SEAT’;
Sentencias de borrado de datos
Paraborrardatosdeunatabla,debemosutilizarlasentenciaDELETE.
La sintaxis de la sentencia DELETE es la siguiente:
DELETE FROM <nombre_tabla>
[ WHERE <condicion>];
El siguiente ejemplo ilustra el uso de la sentencia DELETE.EsbuenaideaespecificarenlasentenciaWHE-REloscamposqueformanlaclaveprimariadelatablaparaevitarborrardatosquenoqueramoseliminar.
DELETE FROMtCoches
WHEREmarca=‘SEAT’;
Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes consideraciones:
• Sólo podemos borrar datos de una única tabla.
• Cuandoborramosdatosdeunavista,losestamosborrandotambiéndelatabla.Lasvistassonsólounaformadeverlosdatos,nounacopia.
• Identificar la plataforma .NET, también su kit de desarrollo .Net Framework, que le permitirán desarrollar aplicacio nes simples o complejas.
• Conocer el entorno de C# y su instalación.
• Describir los elementos que confor man un programa, conocerá los diferentes tipos de datos y como hacer la declaración de estos.
• Operar las sentencias de control.
• Conocer las definiciones de método, arreglo y colecciones, su uso e importancia.
< > Programación
56
4 .NET
4.1 .NET Framework
.NETFrameworkesunentornomulti-lenguajeparalaconstrucción,distribuciónyejecucióndeServiciosWebyaplicacionesdichodeotraformaesunaplataformadiseñadaparasimplificareldesarrollodeapli-caciones en el entorno distribuido de Internet.
.Netesunconjuntodebibliotecasquepuedenserutilizadasporaplicacionesparaacelerareldesarrollodeprogramasyoptimizarelrendimiento..Netofreceunentornodeejecucióndeaplicaciones,compila-dores,ypermiteeldesarrollodetodotipodeprogramasdeescritorio,aplicacionesparaInternet,paradispositivosmóviles,etc.
Características
• Proporciona un entorno coherente de programación orientada a objetos, en el que el código de los objetos se puede almacenar y ejecutar de forma local, ejecutar de forma local pero distribuida en Internet o ejecutar de forma remota.
• Proporcionaunentornodeejecucióndecódigoqueminimizalaimplementacióndesoftwareylosconflictosdecontroldeversiones.
• Ofreceunentornodeejecucióndecódigoquepromuevelaejecuciónseguradelmismo,inclusodel creado por terceros.
• Proporciona un entorno de ejecución de código que elimina los problemas de rendimiento de los entornosenlosqueseutilizanscriptsointérpretesdecomandos.
• Ofrecealprogramadorunaexperienciacoherenteentretiposdeaplicacionesmuydiferentes,como las basadas en Windows o en el Web.
4.1.1 Entornodeejecución
.NET proporciona un entorno de ejecución para aplicaciones llamada Common Language Runtime o CLR.CLReslaimplementacióndeMicrosoftdeunestándarllamadoCommon Language Infrastructure o CLI.ÉstefuecreadoypromovidoporMicrosoftperodesdehaceañosesunestándarreconocidomun-dialmente.
El CLR/CLI esencialmentedefineunentornode ejecución virtual independiente enel que trabajan lasaplicacionesescritasconcualquierlenguaje.NET.Esteentornovirtualseocupademultituddecosasim-portantesparaunaaplicación:desdelagestióndelamemoriaylavidadelosobjetoshastalaseguridadylagestióndesubprocesos.
< > Programación
57
TodosestosserviciosunidosasuindependenciarespectoaarquitecturascomputacionalesconviertenlaCLRenunaherramientaextraordinariamenteútilpuestoque,enteoría,cualquieraplicaciónescritaparafuncionarsegúnlaCLIpuedeejecutarseencualquiertipodearquitecturadehardware.
PorejemploMicrosoftdisponedeimplementaciónde.NETparaWindowsde32bits,Windowsde64bitseinclusoparaWindowsMobile,cuyohardwarenotienenadaqueverconlaarquitecturadeunordenadorcomún
4.1.2 Biblioteca de Clase Base (BCL)
Laplataforma.NET(Figura4.1)nosofreceinfinidaddefuncionalidades“defábrica”queseutilizancomopuntodepartidaparacrearaplicaciones.Existenfuncionalidadesbásicas(porejemplotodolorelaciona-doconlaE/Sdedatosolaseguridad)yfuncionalidadesavanzadasenlasquesefundamentancategoríasenteras de aplicaciones (acceso a datos, creación de aplicaciones Web...).Toda esta funcionalidad está im-plementadaenformadebibliotecasdefuncionesquefísicamenteseencuentranendiversasDLL (biblio-tecas de enlace dinámico). A su conjunto se le denomina Base Classes Library (Biblioteca de clases base o BCL)yformanparteintegraldelaplataforma.NET,esdecir,nosetratadeañadidosquesedebanobtener o adquirir aparte.
Figura 4.1
TodoloqueseencuentraenlaBCLformapartedelaplataforma.NET.Dehechoexistetalcantidaddefun-cionalidad integrada dentro de estas bibliotecas (hay decenas de miles de clases) que el mayor esfuerzo que todo programador que se inicia en .NET debe hacer es el aprendizaje de las clases más importantes. DetodosmodosVisualStudioofrecemuchaayudacontextual(documentación,Intellisense...)yunavezqueseaprendenlasbasesresultafáciliravanzandoenelconocimientodelaBCLamedidaquelovamosnecesitando.
< > Programación
58
4.1.3 Sistema de tipo común (CTS)
El sistema de tipos común define cómo sedeclaran, utilizan y administran lostiposenelmotor entiempodeejecución.Estambiénunaparteimportantedelacompatibilidadentiempodeejecuciónconlaintegraciónentrelenguajes.Elsistemadetiposcomúnrealizalasfuncionessiguientes:
• Estableceunmarcodetrabajoqueayudaapermitirlaintegraciónentrelenguajes,laseguridaddetiposylaejecucióndecódigoconaltorendimiento.
• Proporciona un modelo orientado a objetos que admite la implementación completa de muchos lenguajes de programación.
• Definereglasquedebenseguirloslenguajes,loqueayudaagarantizarquelosobjetosescritosendistintoslenguajespuedaninteractuarunosconotros.
ElSistemadetiposcomúneselmodeloquedefinelasreglasquesesiguenenCommonLanguageRuntimeparadeclarar,utilizaryadministrartipos.Estesistemaestableceunmarcodetrabajoquepermitelainte-graciónentrelenguajes,laseguridaddetiposyejecutarcódigodealtorendimiento.
Eslamateriaprimaapartirdelacualsepuedencrearbibliotecasdeclases.
4.1.4 Especificacióndellenguajecomún(CLS)
Common Language Specification (CLS)defineunconjuntodereglascomprobablesmedianteprogra-maciónquedeterminalainteroperacióndelostiposcreadosendistintoslenguajesdeprogramación.LaseleccióndeCLSesunmodoexcelentedegarantizarlainteroperaciónentrelenguajes.LosdiseñadoresdebibliotecasdeclasesadministradaspuedenutilizarCLSparaasegurarsedequelasAPIcreadassepuedenllamardesdeunaampliagamadelenguajesdeprogramación.TengaencuentaqueaunqueCLSpromueveeldiseñocorrectodebibliotecas,noloimpone.
4.2 Entorno de Programación
Eselbancodetrabajodelprogramador,seencargadedarsoportealasactividadesdelafasedecodifica-ción (preparación del código y prueba de unidades).
Losmismosproductossirventambiénparaeldiseñodetalladoyparalaspruebasdeintegración.Sesitúa,por tanto, en la parte central del ciclo de desarrollo.
< > Programación
59
4.2.1 Entorno de Desarrollo (IDE)
Seutilizaelacrónimo“IDE”(IntegratedDevelopmentEnvironment)parareferirnosalentornodedesa-rrollo integrado de C#. Al igual que los procesadores de palabras, programas que facilitan la creación de documentos, el IDE cuenta con herramientas para crear (desarrollar) programas. Todas las herramientas que requerimos para dicho propósito están integradas, por lo que podemos realizar la totalidad de nuestro trabajodentrodelIDEenvezdetenerqueusarotrosprogramas.Enotraspalabras,elIDEnosproporcionaun entorno de programación completo.
4.2.2 Descarga e Instalación
DescargaMicrosoftVisualC#2012ExpressEdition.Sigalasinstruccionesdeinstalaciónyregistreelpro-ducto si el proceso te pide hacerlo.Lo puedes descargar desde la sigueinte liga:
http://www.microsoft.com/visualstudio/esn/downloads
4.2.3 Interfaz de usuario
Acontinuacióndescribiremoslainterfazdeusuariodemanerageneralyparahacerdeunmodomássen-cillolaexplicaremosatravésdeunejemplo:
Elprogramaquecrearemosacontinuacióndesplegaráelmensaje“Holamundo”enlapantalladetucom-putadora. Independientemente de lo anterior, deberá seguir estos pasos generales para crear cualquier programa.
1. AbreelIDE.AcontinuaciónaparecerálaPáginadeinicio,comosemuestraenlaFigura4.2
2. HasclicenelvínculoCrear:Proyecto…AcontinuaciónsemostrarálaventanaNuevo
Proyecto (Figura 4.3) .
Figura 4.2
< > Programación
60
Figura 4.3
Asegúratedequeestéseleccionada laplantillaAplicacióndeWindowsForms.Elijeunnombreparatuproyecto,mismoqueseconvertirátambiénenlaidentificacióndeunacarpeta.Terecomendamosutilizarsóloletras,dígitosyespacios.EnnuestrocasoutilizamoselnombrePrimerHola.HazclicenAceptar.Acontinuaciónapareceráunáreadediseñosimilar(aunquenonecesariamenteidéntica)alaquesemuestraen la Figura 4.4.
Figura 4.4
< > Programación
61
3. ParafacilitartuincursiónenellenguajeC#,esconvenientequeelcuadrodeherramientasestésiemprevisible.HazclicenelmenúVeryseleccioneCuadrodeherramientas.Ahorahazclicenelsímbolode“chincheta”delcuadrodeherramientas(Figura4.5),elcuadrodeherramientasque-daráfijoyabiertodemanerapermanente.HazclicenTodoslosformulariosWindowsFormsparaverlalistadeherramientasdisponibles.
Figura 4.5
Los pasos anteriores son comunes en la realización de cualquier proyecto. Realicemos ahora una tarea específicaparaesteproyectoenparticular.Observaelformularioyelcuadrodeherramientasilustradosen la Figura 4.6.
Figura 4.6
< > Programación
62
Acontinuaciónseleccionaremosuncontroldelcuadrodeherramientas,ylocolocaremosenelformula-rio. Éstos son los pasos a seguir:
• Localiza el cuadro de herramientas y has clic en Control Label.
• Desplaza el puntero del ratón hacia el formulario. Has clic y, sin soltar el botón, arrastra para crearunaetiquetacomoenlaFigura4.7.
Figura 4.7
Ahoraestableceremosalgunaspropiedadesdelaetiqueta:hasclicconelbotónderechodelratónsobrelaetiquetayseleccionePropiedades.DesplazaelratónhacialalistaPropiedadesenlaparteinferior derecha de la pantalla, como se muestra en la Figura 4.8:
Figura 4.8
< > Programación
63
• DesplázatehastalapropiedadTextysustituyeeltextolabel1porHolaMundo.
• Ejecutemosahoraelprograma,haciendoclicenlaflechaqueseencuentraenlapartesuperiordelIDEsetratadelbotónIniciardepuraciónverFigura4.9.
Figura 4.9
Apareceráunanuevaventana,comosemuestraenlaFigura4.10.Eselprogramaquehazcreado.Sólomuestraalgodetexto,peroesunaverdaderaventanaencuantoaquepuedemoverla,cambiarsutamañoy cerrarla al hacer clic en el icono X que se encuentra en la esquina superior derecha.
Figura 4.10
Para guardar tu programa y poder usarlo más adelante:
• VealmenúArchivo y selecciona laopciónGuardar todo.A continuación aparecerá la ventanaGuardarproyecto.Apareceráunaventanacomoladelafigura4.11
Figura 4.11
• Haz clic en Guardar.
< > Programación
64
4.3 Introducción a la programación en C#
4.3.1 Estructura de un programa
LosprogramasenC#puedenconstardeunoovariosarchivos.Cadaarchivopuedecontenerceroovariosnamespaces.Unnamespacepuedecontenertiposcomoclases,estructuras,interfaces,enumeracionesydelegados,ademásdeotrosspacenames.Acontinuación,semuestralaestructuradeunprogramaenC#quecontienetodosestoselementos.
// Estructura general de un programa en C#
usingSystem;
namespace Ejemplo //Nombre del programa
{
class Program //Nombre de la clase
{
}
struct TuEstructura
{
}
interface TuInterfaz
{
}
delegate intEjemploDelegate();
enum EjemEnum
{
< > Programación
65
}
namespace TuNamespaceAnidado
{
struct Tu estructura
{
}
}
class TuClaseprincipal
{
static voidMain(string[] args)
{
//Tu programa inicia aquí...
}
}
}
4.3.2 Palabras reservadas
ExistenpalabrasparautilizaciónexclusivadeC#,demaneraqueelprogramadornolospuedereutilizar.Sedenominan palabras clave o palabras reservadas.Laspalabrasclavesonidentificadorespredefinidosreservadosquetienenunsignificadoespecialparaelcompilador.
Nosepuedenutilizarcomoidentificadoresenunprogramaamenosqueincluyanelcará[email protected],@ifesunidentificadorválidoperoifnoloesporqueifesunapalabraclave.
< > Programación
66
Palabras clave de instrucciones
EnlatablasiguientesemuestrantodaslaspalabrasclavedelasinstruccionesdeC#.
Categoría Palabras clave de C#
Instrucciones de selección
Una instrucción de selección hace que el control del programa se transfiera a un determinado punto del flujo de ejecución dependiendo de qué cierta condición sea verdadera o no.
if, else, switch, case
Instrucciones de iteración
Las instrucciones de iteración permiten crear bucles. En un bucle, las instrucciones internas se ejecutan un determinado número de veces, según el criterio de terminación del bucle. Estas instruc-ciones se ejecutan en orden, salvo cuando se en-cuentra una instrucción de salto.
do, for, foreach, in, while
Instrucciones de salto
La bifurcación del flujo secuencial normal de un programa se consigue mediante instrucciones de salto, las cuales producen una transferencia inme-diata del control del programa. Las siguientes pa-labras clave se utilizan en instrucciones de salto:
break, continue, default, goto, return, yield
Instrucciones de control de excepciones
C# incorpora mecanismos para el tratamiento de las situaciones anómalas, denominadas excepcio-nes, que pueden producirse durante la ejecución de un programa. Estas excepciones se controlan mediante código situado fuera del flujo normal de control.
throw, try-catch, try-finally, try-catch-finally
Checked y unchecked
Las instrucciones de C# se pueden ejecutar en un contexto comprobado (checked) o no compro-bado (unchecked). En un contexto comprobado, el desbordamiento aritmético produce una ex-cepción. En un contexto no comprobado, se hace caso omiso del desbordamiento aritmético y el resultado se trunca.
checked, unchecked
< > Programación
67
4.3.3 Literales
Unaliteraleslarepresentaciónexplícitadelosvaloresquepuedentomarlostiposbásicosdellenguaje.AcontinuaciónseexplicacuáleslasintaxisconqueseescribenlosliteralesenC#desglosándolossegúneltipodevaloresquerepresentan:
Literales enteros: Un número entero se puede representar en C# tanto en formato decimal como hexade-cimal. En el primer caso basta escribir los dígitos decimales (0-9) del número unos tras otros, mientras que enelsegundohayqueprecederlosdígitoshexadecimales(0-9,a-f,A-F)conelprefijo0x.Enamboscasosesposibleprecederelnúmerodelosoperadores+ó–paraindicarsiespositivoonegativo,aunquesinoseponenadaseconsideraráqueespositivo.
Ejemplos de literales enteros son 0, 5, +15, -23, 0x1A, -0x1a, etc.
Enrealidad,lasintaxiscompletaparalaescrituradeliteralesenterostambiénpuedeincluirunsufijoqueindiqueeltipodedatoenteroalquehadepertenecerelliteral.
Literales reales: Los números reales se escriben de forma similar a los enteros, aunque sólo se pueden es-cribir en forma decimal y para separar la parte entera de la real usan el tradicional punto decimal (carácter .)Tambiénesposiblerepresentarlosrealesenformatocientífico,usándoseparaindicarelexponenteloscaracteres e ó E.
Ejemplos de literales reales son 0.0, 5.1, -5.1, +15.21, 3.02e10, 2.02e-2, 98.8E+1, etc.
Literales lógicos:Losúnicosliteraleslógicosválidossontrueyfalse,querespectivamenterepresentanlosvaloreslógicosciertoyfalso.
Literales de carácter:Prácticamentecualquiercaráctersepuederepresentarencerrándoloentrecomillassimples.Porejemplo,‘a’(letraa),‘‘(carácterdeespacio),‘?’(símbolodeinterrogación),etc.
4.3.4 Variables
Una variablerepresentaunvalornuméricoodecadenaounobjetodeunaclase.Elvalorquelavariablealmacenapuedecambiar,peroelnombresiguesiendoelmismo.Unavariableesuntipodecampo.Elcódigosiguienteesunejemplosencillodecómodeclararunavariabledeentero,asignarleunvalory,acontinuación,asignarleunnuevovalor.
int x = 1; // a x se asigna el valor 1
x=2;//ahoraxvale2
< > Programación
68
EnC#,lasvariablessedeclaranconuntipodedatosyunaetiquetaconcretoademástienesqueespecificarsilavariableesdetipoint,float,byte,shortuotrocualquiera.
4.3.5 Tipos de Datos
Untipodedatossepuededescribircomo:
• Untipodedatosintegrado,comoint o char, o bien
• Untipodedatosdefinidosporelusuario,comoclass o interface.
4.3.5.1 int
Lapalabraclaveintdenotauntipoenteroquealmacenavaloressegúneltamañoyel intervaloqueseindica en la tabla siguiente:
Tipo Intervalo TamañoTipo de .NET Fra-mework
Valor prede-terminado
int De -2.147.483.648 a 2.147.483.647
Entero de 32 bits con signo
System.Int32 0
Lasvariablesdetipoint se pueden declarar e inicializar como en el siguiente ejemplo:
int i = 123;
4.3.5.2 double
Lapalabraclavedoubledenotauntiposimplequealmacenavaloresdepuntoflotantede64bits.Lasi-guientetablamuestralaprecisiónyelintervalodevaloresaproximadoparaeltipodouble.
TipoIntervalo aproxi-mado
PrecisiónTipo de .NET Fra-mework
double ±5,0 × 10−324 a ±1,7 × 10308
15-16 dígitos System.Double
De forma predeterminada, una literal numérica real en el lado derecho del operador de asignación se tratacomounvalordetipodouble por ejemplo:
double x = 3;
< > Programación
69
4.3.5.3 float
Lapalabraclavefloatdenotauntiposimplequealmacenavaloresdepuntoflotantede32bits.
Lasiguientetablamuestralaprecisiónyelintervalodevaloresaproximadoparaeltipofloat.
TipoIntervalo aproximado
Precisión Tipo de .NET Framework
float -3.4 × 1038to +3.4 × 1038
7 dígitos System.Single
De forma predeterminada, una literal numérica real en el lado derecho del operador de asignación se trata comodouble.Porconsiguiente,parainicializarunavariabledetipofloat,utilizaelsufijof o F, como en el ejemplo siguiente:
float x = 3.5 F;
4.3.5.4 char
LapalabraclavecharseutilizaparadeclararunainstanciadelaestructuradeSystem.Charque.NETFra-meworkutilizapararepresentaruncarácterUnicode.ElvalordeunobjetodeCharesunvalor(ordinal)numérico de 16 bits.
LoscaracteresUnicodeseutilizanpararepresentarlamayorpartedelosidiomasescritosenelmundo.
Tipo Intervalo SizeTipo de .NET Fra-mework
char De U+0000 a U+FFFF
Carácter Unicode de 16 bits
System.Char
Lasconstantesdetipochar se pueden escribir como literales de cadena, secuencias de escape hexadeci-malesorepresentacionesUnicode.Loscódigosdecaracteresintegralessepuedenconvertirexplícitamen-tealtipochar.
< > Programación
70
bool
LapalabraclaveboolesunaliasdeSystem.Boolean.Seutilizaparadeclararvariablesquealmacenanlosvaloresbooleanos,true y false.
Puedeasignarunvalorbooleanoaunavariabledetipobool.Tambiénpuedeasignarunaexpresiónqueseevalúecomoboolaunavariabledetipobool.
long
Lapalabraclavelongdenotauntipoenteroquealmacenavaloressegúneltamañoyelintervaloqueseindican en la tabla siguiente:
Tipo Intervalo Tamaño Tipo de .NET Framework
long –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
Entero de 64 bits con signo
System.Int64
Lasvariablesdetipolong se pueden declarar e inicializar como en el siguiente ejemplo:
long long1 = 4294967296;
4.3.6 Operadores
En C#, un operador es un término o un símbolo que acepta como entrada una o más expresiones, deno-minadas operandos,ydevuelveunvalor.Losoperadoresquerequierenunoperando,comoeloperadorde incremento (++) o new, se denominan operadores unarios. Los operadores que requieren dos ope-randos, como losoperadoresaritméticos (+, -, *, /) se denominan operadores binarios. El operador condicional (?:),utilizatresoperandosyeselúnicooperadorterciariodeC#.
Losoperadoresdeunaexpresiónseevalúanenunordenconcretoconocidocomoprioridaddeoperado-res.Latablasiguientedividealosoperadoresencategoríasbasadaseneltipodeoperaciónquerealizan.Las categorías se muestran en orden de prioridad.
< > Programación
71
Principal x.y, f(x), a[x], x++, x--, new, typeof, checked, un-checked
Unario +, -, !, ~, ++x, --x, (T)x
Aritméticos: multiplicativos *, /, %
Aritméticos: aditivos +, -
Desplazamiento <<, >>
Comprobación de tipos y relacio-nales
<, >, <=, >=, is, as
Igualdad ==, !=
Lógicos, en orden de prioridad &, ^, |
Condicionales, en orden de priori-dad
&&, ||, ?:
Asignación =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
Cuandodosoperadoresconlamismaprioridadestánpresentesenunaexpresión,seevalúansegúnsuasociatividad.Losoperadoresquesonasociativosporlaizquierdaseevalúanenordendeizquierdaade-recha.Porejemplo,x*y/zseevalúacomo(x*y)/z.Losoperadoresquesonasociativosporladerechaseevalúanenordendederechaaizquierda.
Losoperadoresdeasignaciónyeloperadorterciario(?:)sonasociativosporladerecha.Todoslosotrosoperadoresbinariossonasociativosporlaizquierda.
Sinembargo,elestándardeC#noespecificacuándoseejecutalaparte“fija”deunainstruccióndeincre-mento en una expresión. Por ejemplo, el resultado del código de ejemplo siguiente es 6:
int num1 = 5;
num1++;
System.Console.WriteLine(num1);
Losparéntesissepuedenutilizarparaenvolverunaexpresiónyhacerqueesaexpresiónseaevaluadaantesque cualquier otra. Por ejemplo, 2 + 3 * 2 normalmente darían 8 como resultado.
Estoesporquelosoperadoresmultiplicativostienenprioridadsobrelosoperadoresaditivos.Escribirlaex-presión (2 + 3) * 2 da como resultado 10, ya que ésta indica al compilador de C# que el operador de adición (+)sedebeevaluarantesqueeloperadordemultiplicación(*).
< > Programación
72
Operadores aritméticos
Losoperadoresaritméticossonlossiguientes:
Símbolo Acción* multiplicación/ división% módulo+ suma- resta
Lamultiplicación,divisiónymódulo(*, / y %)sellevanacaboantesquelasumaylaresta(+y–).Tambiénpodemosusarparéntesisparaagruparloscálculosyforzarlosallevarseacaboenunordenespecífico.Siuncálculo incluye operadores de la misma precedencia, las operaciones se realizarán de izquierda a derecha. He aquí algunos ejemplos:
int i;
int n = 3;
double d;
i = n + 3; // se convierte en 6
i = n * 4; // se convierte en 12
i = 7 + 2 * 4; // se convierte en 15
n=n*(n+2)*4; //seconvierteen60
d = 3.5 / 2; // se convierte en 1.75
n = 7 / 4; // se convierte en 1
Recuerde que las instrucciones forman una secuencia, la cual se ejecuta de arriba hacia abajo en la página. Siemprequeseutilicenparéntesis,loselementosqueéstoscontengansecalcularánprimero.
Lamultiplicaciónyladivisiónserealizanantesdelasumaylaresta.Porlotanto:
3 + 2 * 4
sellevaacabocomosisehubieraescritoasí:
3 + (2 * 4)
< > Programación
73
Elusodelosoperadores+,–y*esrazonablementeintuitivo,peroladivisiónesunpocomásengañosa,yaqueexigediferenciarentrelostiposintydouble.Enestesentido,loimportanteestomarencuentaque:
• Cuando el operador / trabaja con dos números double o con una mezcla de double e int se produ-ceunresultadodouble.Parafinesdecálculo,cualquiervalorintseconsideracomodouble.Asíescomofuncionaladivisiónenunacalculadoradebolsillo.
• Cuando / trabaja con dos enteros se produce un resultado entero. El resultado se trunca, lo cual significaqueseborranlosdígitosquepudierahaberdespuésdel“puntodecimal”.Éstanoeslaforma en que funcionan las calculadoras.
He aquí algunos ejemplos:
//divisiónconvaloresdouble
doubled;
d=7.61/2.1; //seconvierteen3.7
d=10.6/2; //seconvierteen5.3
Enelprimercasoladivisiónsellevaacabodelamaneraesperada.
Enelsegundoelnúmero2setratacomo2.0(esdecir,undouble)yladivisiónserealiza.
Sinembargo,ladivisiónconenterosesdistinta:
//divisiónconenteros
inti;
i=10/5; //seconvierteen2
i=13/5; //seconvierteen2
i=33/44; //seconvierteen0
Enelprimercasoseesperaunadivisiónconenteros;larespuestaexactaqueseproducees2.
Enelsegundocasoelresultadotambiénes2,debidoaquesetruncaelverdaderoresultado.
Eneltercercasosetruncalarespuesta“correcta”de0.75,conlocualobtenemos0.
< > Programación
74
El operador %
Porúltimoveremoseloperador% (módulo).Amenudoseutilizajuntoconladivisióndeenteros,yaqueprovee lapartedelresiduo.Sunombreprovienedeltérmino“módulo”.Anteriormentedijimosque losvaloresdoublesealmacenandemaneraaproximada,adiferenciadelosenteros,quelohacendeformaexacta.
Entonces¿cómopuedeserque33/44genereunresultadoenterode0?¿Acasoperder0.75significaqueelcálculonoespreciso?Larespuestaesquelosenterossíoperanconexactitud,peroelresultadoexactoestácompuestodedospartes:elcociente(esdecir,elresultadoprincipal)yelresiduo.Porlotanto,sidivi-dimos 4 entre 3 obtenemos como resultado 1, con un residuo de 1. Esto es más exacto que 1.3333333, etc.
En consecuencia, el operador %nosdaelresiduocomosisehubierallevadoacabounadivisión.
He aquí algunos ejemplos:
int i;
double d;
i=12%4; //seconvierteen0
i = 13 % 4; // se convierte en 1
i = 15 % 4; // se convierte en 3
d = 14.9 % 3.9; // se convierte en 3.2 (se divide 3.2 veces)
El uso más frecuente de % es con números int.
Veamosunproblemaqueinvolucraunresultadoconresiduo:convertirunnúmeroenterodecentavosendoscantidades:lacantidaddedólaresyelnúmerodecentavosrestantes.Lasoluciónes:
int centavos = 234;
int dolares, centavosRestantes;
dolares=centavos/100; //seconvierteen2
centavosRestantes = centavos %100; //seconvierteen34
Unión de cadenas con el operador +
Hastaahorahemosvistoelusodevariablesnuméricas,perotambiénesmuyimportanteelprocesamientodedatosdetexto.C#cuentaconeltipodedatosstring;lasvariablesstringpuedenguardarcualquierca-racter. La longitud máxima de una cadena es de aproximadamente dos mil millones de caracteres.
< > Programación
75
El siguiente es un ejemplo del uso de cadenas:
string primerNombre = “Salvador “;
string apellidoPaterno, nombreCompleto;
string saludo;
apellidoPaterno=“López”;
nombreCompleto = primerNombre + apellidoPaterno;
saludo=“Saludosde“+nombreCompleto; //seconvierteen“SaludosdeSalvadorLópez”
Enelejemploanteriordeclaramosalgunasvariablesstringylesasignamosvaloresinicialesmedianteelusodecomillasdobles.Despuésutilizamoslaasignación,enlacualelvalordelacadenaaladerechadelsigno=sealmacenaenlavariableutilizadaalaizquierdadelmismo,demanerasimilaralaasignaciónnu-mérica(siintentamosutilizarunavariablequenohayarecibidounvalor,C#nosinformaráquelavariableno está asignada y el programa no se ejecutará).
Las siguientes líneas ilustran el uso del operador +, que (de igual manera que al sumar números) opera sobrelascadenasylasuneextremoconextremo.Aestoseleconocecomo“concatenación”.
Después de la instrucción:
nombreCompleto = primerNombre + apellidoPaterno;
elvalordenombreCompletoesSalvadorLópez.
4.3.7 Constantes y enumeraciones
Constantes
Las constantessonvaloresinmutablesqueseconocenentiempodecompilaciónynocambianmientrasdura el programa.
Lasconstantessedeclaranconelmodificadorconst.SólolostiposintegradosdeC#(excluidoSystem.Ob-ject) se pueden declarar como const.
Eltipodeenumeraciónpermitedefinirconstantesconnombreparalostiposintegradosenteros(porejem-plo int, uint, long, etc.).
Las constantes se deben inicializar tal como se declaran. Por ejemplo:
class Calendar1
< > Programación
76
{
public const int meses = 12;
}
En este ejemplo, la constante meses siempre es 12 y no se puede cambiar. De hecho, cuando el compilador encuentraunidentificadordeconstanteenelcódigofuentedeC#(porejemplo,meses),sustituyedirecta-menteelvalorliteralenelcódigodelenguajeintermedio(IL)quegenera.
Sepuedendeclararvariasconstantesdelmismotipoalmismotiempo,porejemplo:
class Calendar2
{
const int meses = 12, semanas = 52, dias = 365;
}
Enumeraciones
enumeslapalabraclavequeseutilizaparadeclararunaenumeración,untipodistintoqueconsisteenunconjunto de constantes con nombre denominado lista de enumeradores.
Cadatipodeenumeracióntieneuntiposubyacente,quepuedesercualquiertipoexceptochar.Eltipopredeterminado subyacente de los elementos de la enumeración es int.
Deformapredeterminada,elprimerenumeradortieneelvalor0yelvalordecadaenumeradorsucesivose incrementa en 1.
Por ejemplo:
enumDias{Sab,Dom,Lun,Mar,Mie,Jue,Vie};
Enestaenumeración,Sabes0,Domes1,Lunes2yasísucesivamente.
Losenumeradorespuedentenerinicializadoresquereemplazanalosvalorespredeterminados.Porejem-plo:
enumDias{Sab=1,Dom,Lun,Mar,Mie,Jue,Vie};
Enestaenumeración,seobligaaquelasecuenciadeelementosempieceen1envezdeen0.
AunavariabledetipoDiasselepuedeasignarcualquiervalorenelintervalodeltiposubyacente;losvalo-
< > Programación
77
res no se limitan a las constantes con nombre.
ElvalorpredeterminadodeunenumEeselvalorproducidoporlaexpresión(E)0.
Nota: Un enumerador no puede contener espacio en blanco en su nombre.
Tipos de enumeraciones
Untipodeenumeraciónproporcionaunamaneraeficazdedefinirunconjuntodeconstantesconnombrequepuedenasignarseaunavariable.
Porejemplo,supongaquetienequedefinirunavariablecuyovalorrepresentaráundíadelasemana.Sólohaysietevaloressignificativosquealmacenarádichavariable.Paradefiniresosvalores,puedeutilizaruntipodeenumeración,quesedeclaramediantelapalabraclaveenum.
enumDias{Domingo,Lunes,Martes,Miércoles,Jueves,Viernes,Sabado};
enumMeses:byte{Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic};
Lasventajasdeutilizarunaenumeraciónenlugardeuntiponumérico:
• Seespecificaclaramenteparaelcódigodeclientequévaloressonválidosparalavariable.
• EnVisualStudio,IntelliSensemuestralosvaloresdefinidos.
• Sinoseespecificanvaloresparaloselementosenlalistadeenumeradores,losvaloresseincre-mentanautomáticamenteen1.
En el ejemplo anterior, Dias.Domingotieneunvalorde0,Dias.Lunes tieneunvalorde1,yasísucesiva-mente.AlcrearunnuevoobjetoDias,éstetendráunvalorpredeterminadodeDias.Domingo (0) de lo contrarioseleasignaunvalorexplícitamente.
Alcrearunaenumeración,seleccionaelvalorpredeterminadomáslógicoyasígnaleelvalorcero.
Deestaforma,todas lasenumeracionestendránesevalorpredeterminadosinose lesasignaunvalorexplícitamente al crearlas.
< > Programación
78
4.4 Sentencias de Control
4.4.1 Condicionales
Todoslossereshumanoshacemoseleccionesenlavidadiaria.Usamosunparaguassillueve;compramosunCDsitenemossuficientedinero.Laseleccionestambiénseutilizanmuchoenlosprogramas.
Lacomputadoraevalúaunvalorydeacuerdoconelresultado,tomauncursodeacciónuotro.Cadavezqueunprogramahaceunaselecciónentrevariasaccionesydeciderealizarunauotraseutilizaunains-trucción if o switch para describir la situación.
Algunasvecesdesearemosqueseevalúenciertosdatosyseelijaunadevariasaccionesdependiendodelresultadodelaevaluación.
Porejemplo,talveznecesitemosquelacomputadoraevalúelaedaddeunapersonayledigasipuedevo-taroesdemasiadojovenparahacerlo.Aestoseleconocecomoselección,yparallevarlaacaboseutilizauna instrucción conocida como if.
Las instrucciones ifsontanimportantesqueseutilizanentodosloslenguajesdeprogramaciónquesehaninventado.
4.4.1.1 La instrucción if
Se trata de un si condicional, por ejemplo siapruebas,tecomprounXboxyunvideojuego.Puesbien,enprogramación,esmásomenoslomismo.Escritoenpseudocódigoseveríadelasiguienteforma:
Si (apruebas)
{
tecomprounXbox;
tecomprounvideojuego;
}
En C# podemos poner el siguiente ejemplo:
if (num==10)
{
Console.WriteLine(“Elnúmeroesiguala10”);
}
< > Programación
79
Enesteejemplo,seevalúacomoverdaderoofalsoloqueestádentrodelosparéntesis,esdecir,num==10. Por lo tanto, el operador ==retornaráverdadero(true)siemprequenumvalga10,yfalso(false)sivaleotra cosa.
En C# == es el operador de comparación y = es de asignación.
NOTA: La condición a evaluar se encierra entre paréntesis; ésta es una regla de la sintaxis de C#. Observa también que para la prueba de igualdad se utiliza el operador == (no el operador =).
La instrucción if consta de dos partes:
•Lacondiciónaevaluar;
•Lainstrucciónosecuenciadeinstruccionesaejecutarsilacondiciónesverdadera.
Esmuyfrecuentequeselleveacabonosólounaacción,sinosecuenciascompletasdeaccionessielre-sultadodelaevaluaciónesverdadero.Enestecaso,lasaccionesarealizardebenirencerradasentreloscorchetes.
4.4.1.2 if ... else
Algunasvecesesnecesarioespecificardossecuenciasdeacciones:lasquesellevaránacabosilacondi-ciónesverdadera,ylasqueseránrealizadassiesfalsaparaesopodemoshacerusodelainstrucciónelse. Podríamosdecirquefuncionacomoun“delocontrario”,esdecir,si apruebas, te compro un Xbox y un videojuego;de lo contrario, tecastigoentucuartoytequedassincenar.Supseudocódigoseríaalgocomo esto:
Si (apruebas)
{
te compro un Xbox;
te compro un videojuego;
}
de lo contrario
< > Programación
80
{
tecastigoentucuarto;
te quedas sin cenar;
}
Veamos cómo se escribe esta instrucción en C#:
if(num==10)
{
Console.WriteLine(“Elnúmeroesiguala10”);
}
else
{
Console.WriteLine(“Elnúmeronoesiguala10”);
}
Esta instrucción if consta de tres partes:
• Lacondiciónaevaluar;
• Lainstrucciónosecuenciadeinstruccionesqueseejecutaránsi lacondiciónesverdadera;estapartedebeirencerradaentrecorchetes;
• Lainstrucciónoinstruccionesaejecutarsilacondiciónesfalsa;estapartedebeirencerradaentrecorchetes.
Elnuevoelementoenestecódigoeslapalabraclaveelse, que introduce la segunda parte de la instrucción if.
< > Programación
81
4.4.2 Ciclos
Lossereshumanosestamosacostumbradosarealizardeterminadasactividades—comocomer,dormirytrabajar—unayotravez.Lascomputadorasrealizanrepeticionessimilarescuando,porejemplo:
• sumanunalistadenúmeros;
• buscanciertainformaciónenunarchivo;
• resuelvenunaecuaciónmatemáticademaneraiterativa,obteniendocadavezmejoresaproxi-maciones;
• hacenqueunaimagengráficasemuevaenlapantalla(animación).
Ahoraveremoscómorepetirunasecuenciadeinstruccionesciertonúmerodeveces.Enparte,elpoderdelascomputadorasderivadesuhabilidadderealizarrepeticionesconextremarapidez.
Enellenguajedeprogramaciónalasrepeticionesselesconocecomociclos, bucles o loops.
4.4.2.1 for
El ciclo forvaasignandovaloresaunavariabledesdeunvalorinicialhastaunvalorfinal,ycuandolavaria-blecontieneunvalorqueestáfueradelintervaloelciclotermina.Veamoslasintaxis:
for (var=inicial;condición;siguientevalor)
{
Instrucciones
}
La explicación es la siguiente después de la sentencia forse indican lasespecificacionesdelcicloentreparéntesis.
Estasespecificacionesestándivididasentrespartesseparadasporpuntoycoma:
• lapartedeasignacióndelvalorinicialenprimerlugar;
• lapartequeverificalacontinuidaddelbucle(medianteunacondición)ensegundolugar;
• ylaparteenquesecalculaelsiguientevalorentercerlugar.
< > Programación
82
Por ejemplo:
Realicemos un ciclo for que imprima los números del 1 al 5:
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
La condición determina si el ciclo for se ejecuta o completa de cualquiera de las siguientes maneras:
• Silacondiciónesverdadera,seejecutaelcuerpodelciclo.
• Silacondiciónesfalsa,elcicloterminayseejecutanlasinstruccionesquevandespuésdelallavede cierre.
Tenencuentaqueesposibleescribirladeclaracióndeunavariabledentrodeunainstrucciónforjuntoconsuinicialización,algoquesehaceconfrecuencia.Estavariablepuedeutilizarsedentrodelcuerpodela instrucción for.
4.4.2.2 while
La traducción de “while”aespañolsignifica“mientras”,porlotantounciclowhileserepetirámientrasunacondicióndeterminadasecumpla,osea,verdadera(true).Veamossusintaxis:
while (expresión bool)
{
Instrucciones
}
Entonceslas“Instrucciones”quesehallendentrodelciclowhileseejecutaráncontinuamentemientraslaexpresióndetipobooleanseaverdadera(true).Porejemplo,podemosescribirunciclowhile para pedir unacontraseñadeusuario.EnC#quedaríasimilaraesto:
< > Programación
83
stringClave=”programacion123”;
stringRes=””;
while (Res!=Clave)
{
Console.Write(“Damelaclave:“);
Res=Console.ReadLine();
}
Console.WriteLine(“Laclaveescorrecta”);
string a=Console.ReadLine();
Enestepequeñoejemploelprogramapediráunayotravezlaclavealusuario,ycuandoéstetecleelaclavecorrectaserácuandofinalicelaejecucióndelmismo.
Algunasvecesseescribenciclosqueempiezanconunconteode0,ylaintencióndelaevaluaciónesveri-ficarsilacondiciónesmenorqueelnúmerorequerido,comosemuestraacontinuación:
conteo=0;
while (conteo < númeroRequerido)
{
// cuerpo
conteo=conteo++;
}
< > Programación
84
Enotrasocasioneselciclocomienzaconunconteode1ylaevaluaciónbuscacorroborarsilacondición es menor o igual al número requerido, como en el ejemplo siguiente:
conteo=1;
while (conteo <= númeroRequerido)
{
// cuerpo
conteo=conteo++;
}
4.4.2.3 do ... while
Cuandoseutilizanlasinstruccioneswhile o for,laevaluaciónserealizasiemprealprincipiodelarepeti-ción.
El ciclo doesunaestructuraalternativa,enlacuallaevaluaciónsellevaacaboalfinaldecadarepetición.Estosignificaqueelciclosiempreserepiteporlomenosunavez.
La sintaxis es la siguiente:
do
{
Instrucciones
} while(expresiónbool);
< > Programación
85
Realicemoselejemploanteriorquesolicitabaunacontraseña:
usingSystem;
namespace BuclesDo
{
class BuclesDoApp
{
staticvoidMain()
{
stringClave=”Compadre,cómprameuncoco”;
stringRes=””;
do
{
Console.Write(“Damelaclave:“);
Res=Console.ReadLine();
} while(Res!=Clave);
Console.WriteLine(“Laclaveescorrecta”);
stringa=Console.ReadLine();
}
}
}
El resultado sería el mismo que antes. La diferencia está en que aquí daría exactamente lo mismo lo que valieralavariableResantesdellegaralbucle,puestoqueestesevaaejecutarantesdecomprobardichovalor,yalejecutarse,elvalordeRessesustituyeporloqueseintroduzcaenlaconsola.
< > Programación
86
4.4.3 Uso de Break y Continúe
4.4.3.1 Break
Lainstrucciónbreakpermiteterminarelbucleenvolventemáscercanoolainstrucciónswitchenlacualaparece.Elcontrolsetransfierealainstrucciónquesiguealainstrucciónterminada,siexistealguna.
Enesteejemplo,lainstruccióncondicionalcontieneuncontadorquesesuponequecuentade1a100;sinembargo, la instrucción break termina el bucle tras 4 iteraciones.
//statements_break.cs
usingSystem;
class BreakTest
{
staticvoidMain()
{
for(inti=1;i<=100;i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
}
}
Resultados
1
2
3
4
< > Programación
87
4.4.3.2 Continue
La instrucción continuetransfiereelcontrolalasiguienteiteracióndelainstruccióndeiteraciónenvol-ventedondeaparece.
Ejemplo
Enesteejemplo,seinicializauncontadorquecuentade1a10.Utilizandolainstruccióncontinueconlaexpresión(i<9),seomitenlasinstruccionessituadasentrecontinueyelfinaldelcuerpodelbuclefor.
//statements_continue.cs
usingSystem;
classContinueTest
{
staticvoidMain()
{
for(inti=1;i<=10;i++)
{
if (i < 9)
{
continue;
}
Console.WriteLine(i);
}
}
}
< > Programación
88
4.5 Métodos, Arreglos y Colecciones
4.5.1 Métodos
Losprogramasgrandespuedensercomplejos,difícilesdecomprenderydedepurar.Latécnicamásimpor-tanteparareducirestacomplejidadconsisteendividirelprogramaensecciones(relativamente)indepen-dientes.Estonospermiteenfocarnosenunasecciónespecíficasindistraernosconelprogramacompleto.
Además,silaseccióntienenombrepodemos“llamarla”o“invocarla”(esdecir,hacerqueseautilizadaporotra instancia)consólohacerreferenciaaella.Trabajardeestamaneranospermite,enciertosentido,pensaraunnivelmásalto.
En C# a dichas secciones se les conoce como métodos.
4.5.1.1 Nuestro primer método
Vamos a construir una clase llamada Boligrafo.
Unaclaseesunaconstrucciónquepermitecreartipospersonalizadospropiosmediantelaagrupacióndevariablesdeotrostipos,métodosyeventos.Unaclaseescomounplano.Definelosdatosyelcomporta-mientodeuntipo.
Los métodos de nuestra clase Boligrafo serán, por ejemplo, Pintar y Recargar, que son las operaciones que se suelen efectuar con un bolígrafo.
Ambosmétodosmodificaránlacantidaddetintadelbolígrafo,valorquepodríamosponerenunapropie-dad llamada Tinta. Recordemos que un método es como un procedimiento o una función.
En determinadas ocasiones necesitaremos pasarle datos a los métodos para que estos puedan hacer su trabajo.
Siguiendoconelbolígrafo,puedequenecesitemosdecirlealmétodoPintarlacantidaddetintaquevamosagastar.Puesbien,estosdatossellamanargumentos.Vamosaverlo:
usingSystem;
classBoligrafo
{
protectedintcolor=0;
protectedbytetinta=100;
< > Programación
89
publicboolPintar(bytegasto)
{
if(gasto>this.tinta)returnfalse;
this.tinta-=gasto;
Console.WriteLine(“Segastaron{0}unidadesdetinta.”,gasto);
return true;
}
public void Recargar()
{
this.tinta=100;
Console.WriteLine(“Bolígraforecargado”);
}
public int Color
{
get
{
returnthis.color;
}
set
{
this.color=value;
}
}
publicbyteTinta
{
get
< > Programación
90
{
returnthis.tinta;
}
}
}
EnesteejemplotieneslosmétodosPintaryRecargar(prestaespecialatenciónalasintaxis).Elprimerodisminuyelacantidaddetinta,yelsegundoestableceestacantidadnuevamentea100,esdecir,rellenaelbolígrafodetinta.
El encabezado declara el nombre del método (que nosotros tenemos la libertad de elegir) y los elementos que deben suministrarse para controlar su operación.
C#utilizalostérminosargumentosyparámetrosparadefinirestoselementos.Alrestodelmétodoseleconocecomocuerpo,yvaencerradoentrellaves{};aquíesdondeserealizaeltrabajo.
Amenudoelencabezadoesunalíneaextensa,ynosotrospodemosoptarpordividirloenpuntosadecua-dos (aunque no en medio de una palabra).
Unaimportantedecisiónquedebetomarelprogramadoresellugardesdedondesepuedeinvocarelmé-todo;enestesentido,tenemosdosopciones:
• Elmétodosólopuedeserinvocadodesdeelinteriordelprogramaactual;enestecasoutilizamoslapalabraclaveprivate.
• Elmétodopuedeserinvocadodesdeotroprograma;enestecasoutilizamoslapalabraclavepu-blic.
Otra decisión que debe tomar el programador es:
• ¿Elmétodorealizaráunatareasinnecesidaddeproducirunresultado?Enestecasoutilizamoslapalabraclavevoiddespuésdeprivate.
< > Programación
91
• ¿Elmétodocalcularáunresultadoylodevolveráalaseccióndecódigoqueloinvocó?Enestecasotenemosquedeclarareltipodelresultado,envezdeusarvoid.Másadelanteenelcapítuloveremoscómohacerlo.
4.5.1.2 Cómo invocar métodos
ParainvocarunmétodoprivadoenC#espreciso indicarsunombrejuntoconunalistadeargumentosentre paréntesis. En nuestro programa la primera llamada es:
DibujarLogo(papel,miLapiz,10,20);
Estainstruccióntienedosefectos:
• Losvaloresdelosargumentossetransfierenalmétododemaneraautomática.Másadelanteha-blaremos sobre esto con mayor detalle.
• El programa salta al cuerpo del método (la instrucción después del encabezado) y ejecuta las ins-trucciones.Cuandoterminacontodaslasinstruccionesyllegaalcaracter},laejecucióncontinúaen el punto desde el que se hizo la llamada al método.
EstosefectossepuedenvisualizarenlaFigura4.12
Figura 4.12
< > Programación
92
Despuéssellevaacabolasegundallamada:
DibujarLogo(papel,miLapiz,100,100);
Sondosllamadasqueproducendoslogotipos.
4.5.1.3 Cómo pasar argumentos
Esimprescindiblecomprenderlomejorposiblecómosetransfieren(pasan)losargumentosalosmétodos.En nuestro ejemplo el concepto se muestra en las siguientes líneas:
DibujarLogo(papel,miLapiz,10,20);
privatevoidDibujarLogo(GraphicsareaDibujo,
Pen lápizAUsar,
int posX,
int posY)
Eláreaenlaquedebemosenfocarnosestáconstituidaporlasdoslistasdeelementosquesehallanentreparéntesis. En una llamada los elementos se denominan argumentos. En el encabezado del método los elementos se denominan parámetros. Para aclarar esta situación extraigamos los parámetros y los argu-mentos:
argumentos: papel miLapiz 10 20
parámetros: areaDibujo lapizAUsar posX posY
Recordemoslacomparaciónquehicimosdeunavariableconunacaja.Dentrodelmétodohayunconjuntodecajasvacías(losparámetros)queesperanlatransferenciadelosvaloresdelosargumentos.
DespuésdelatransferenciatenemoslasituaciónquesemuestraenlaFiguraNocontamosconvaloresnuméricosparapasarlosaláreadedibujoyellápiz,porloquenosenfocaremosencómosetransfierenlascoordenadas (Figura 4.13).
Figura 4.13
< > Programación
93
Latransferenciaserealizadeizquierdaaderecha.Lallamadadebeproporcionarelnúmeroytipocorrec-tos de cada argumento. Si el que hace la llamada (el usuario) recibe accidentalmente los argumentos en el orden incorrecto, el proceso de la transferencia no los regresará a su orden correcto.
CuandoelmétodoDibujarLogoseejecuta,estosvalorescontrolanelprocesodedibujo.Aunqueenesteejemploinvocamoselmétodoconnúmeros,tambiénpodemosutilizarexpresiones(esdecir,incluirvaria-bles y cálculos), como en el siguiente ejemplo:
intx=6;
DibujarLogo(papel,miLapiz,20+3,3*2+1);//23y7
DibujarLogo(papel,miLapiz,x*4,20);//24y20
4.5.2 Parámetros
4.5.2.1 Parámetros y argumentos
Enelanálisisqueestamosllevandoacaboestáninvolucradasdoslistasentreparéntesis,yesimportanteaclarar el propósito de cada una de ellas:
• El programador que escribe el método debe elegir cuáles son los elementos que éste solicitará por medio de parámetros. En el método DibujarLogo las medidas de los cuadrados anidados siempre seestablecenen20,40y60,demaneraquelainstanciaqueinvocaelmétodononecesitasumi-nistraresosdatos.Sinembargo,talvezquienhagalallamadaquieravariarlaposicióndellogotipo,utilizarun lápizdistintoo inclusodibujarloenuncomponentedistinto (comounbotón).Estoselementossehanconvertidoenparámetros.
• Elescritordelmétododebeelegirelnombredecadaparámetro.Siseutilizannombressimilaresenotrosmétodosnohayproblemaalguno,puescadaunodeellostieneunacopiapropiadesusparámetros.Enotraspalabras,elescritortienelalibertaddeelegircualquiernombre.
• Sedebeproporcionareltipodecadaparámetro;estainformacióndebeirantesdelnombredelmismo.Lostiposdependendelmétodoenparticular.Seutilizaunacomaparasepararlosparáme-tros entre sí. En el encabezado de DibujarLogo puede comprobar este acomodo.
• Quienhacelallamadadebeproveerunalistadeargumentosentreparéntesis,yéstostendránqueserdeltipocorrectoyestarenelordenadecuadoparaelmétodo.
Losdosbeneficiosqueconllevalautilizacióndeunmétodoparadibujarellogotiposon:evitamosduplicarlastres instruccionesDrawRectanglecuandoserequierenvarios logos,yaldarunnombreaestatareapodemosserdecididamentemáscreativos.
Porúltimo,sabemosquetalvezdeseeaplicarlashabilidadesdeprogramaciónquehaaprendidoaquía
< > Programación
94
otros lenguajes, pero debe saber que aún cuando los conceptos son similares la terminología podría ser distinta;porejemplo,enmuchoslenguajesquienhacelallamadaproveelos“parámetrosactuales”,yladeclaracióndelmétodotiene“parámetrosformales”.
4.5.3 Namespace
Un Namespaceesunaformadeagruparclases,funciones,tiposdedatosrelacionados,yotrosnamespa-ces.Seutilizaunaformajerárquicaparacrearunesquemaquenospermitahacerreferenciayorganizarlas clases de la BCL. Además las clases irán creciendo porque nos creemos nuestras propias clases o por-queconsigamosalgunadeotrosdesarrolladores.Unamismaclasepuedeaparecerenvariosespaciosdenombres.
4.5.3.1 La palabra clave using y los namespaces
C#incluyeunaenormebiblioteca(ocolección)declasesquepodemosutilizar.UnaspectomuyimportantedelaprogramaciónenC#radicaenlaposibilidaddeemplearestasclasesenvezdeescribirnuestropropiocódigo.Aestoseleconocecomo“reutilizacióndesoftware”.
Debidoaquehaymilesdeellas,lasclasesestánsubdivididasengruposcuyoámbitoesconocidomediantelapalabraclavenamespace.Porotrolado,parautilizarunaclaseprimerodebemosasegurarnosdequeseimporteanuestroprogramamediantelapalabraclaveusing.
Estopuedeocurrirdedosformas:algunosdelosespaciosdenombresqueseutilizanconmásfrecuenciaseimportandemaneraautomáticaencualquieraplicacióndeWindows.Estosnamespacesson:
System
System.Drawing
System.Collections
System.ComponentModel
System.Windows.Forms
System.Data
< > Programación
95
4.5.4 Arreglos
Enlavidarealesmuyfrecuentequetengamosquelidiarcondatosquenoestánaislados,sinoagrupadosencoleccionesdeinformación.Algunasvecesestetipodeinformaciónseencuentraalmacenadaentablas,talcomoocurreenelcasodelositinerariosdetrenes,losdirectoriostelefónicosolosestadosdecuentabancarios.Enprogramaciónaestascoleccionesdedatosselesconocecomoestructurasdedatos,ytienenlaparticularidaddequecadapartedelainformacióndelatablaestárelacionadadeciertaformaconelresto.
El arregloesunodelostiposmássimplesdeestructuradedatosenprogramación.
Unarreglosepuedeconsiderarsimplementecomounatablaconunasolafila(ocolumna)deinformaciónen forma de números, cadenas de caracteres o cualquier otra cosa.
La siguiente es una tabla de palabras que almacena los nombres de los miembros de un grupo musical:
C# denomina estas tablas como arreglos. En programación cada uno de los datos de un arreglo es conocido comoelemento,ynosreferimosaélporlaposiciónqueocupaenelarreglollamadaíndice,algunasvecesseutilizaeltérminocomponenteenvezdeelemento,yeltérminosubíndiceenvezdeíndice).
Desdenuestropuntodevista,elnombreJohnestáenlaposiciónunodelatablaanterior,peroC#cuentaloselementosapartirdecero.Enconsecuencia,lacadenadecaracteresRingoseencuentraenlaterceraposición del arreglo.
Alaposiciónqueocupaunelementoenunarregloseleconocecomoíndice.Así,podemosvisualizarlosarreglos y sus índices de la siguiente manera:
Recuerda que los índices no se guardan en la memoria de la computadora, sólo los datos. Los índices cons-tituyenelmecanismoquenospermitelocalizarlainformaciónenunarreglo.
Heaquíotroarreglo,estavezconteniendonúmeros.Tambiénsemuestransusíndices:
Enlosprogramas(aligualqueenlavidareal)porlogeneraltenemosquerealizarlassiguientesoperacio-nes con arreglos:
< > Programación
96
• Crearelarreglo:determinarcuálessulongitudyquétipodeelementosalmacenará.
• Colocar valores en el arreglo (equivalente, por ejemplo, a introducir números enundirectoriotelefónico personal).
• Desplegar en pantalla el contenido del arreglo (los arreglos se guardan en la memoria de la compu-tadoray,porende,soninvisibles).
• Buscarenelarreglociertovalor (algosimilarabuscarenel itinerariodetrenesunacorridaenhorarioconveniente).
• Sumarelcontenidodelarreglo(equivalenteaaveriguarcuántogastóunclienteenelsupermer-cado).
4.5.5 Declaración
EnC#losarreglossedeclarandelamismamaneraquecualquierotroobjeto:mediantelapalabraclavenew, y por lo general en la parte superior de una clase o de un método.
Además,elprogramadordebedarlenombre,comosemuestraacontinuación:
int[] edades = newint[6];
string[] grupo = newstring[4];
Lavariableedadesestáahoralistaparaguardarunarreglodeenteros.Elnúmeroentrecorchetesqueestádespuésdelnombredelarreglorepresentasutamaño.
El arreglo edades es lo bastante grande como para contener seis números (enteros, int), cuyos índices irán de 0 a 5.
Porsuparte,elarreglogrupotienecapacidadsuficienteparacontenercuatrocadenasdecaracteres(string)susíndicesvande0a3.
4.5.5.1 Índices
Parahacerreferenciaaunelementoindividualdeunarregloelprogramadebeespecificarelvalordelíndi-ce(algunasvecesllamadosubíndice)correspondiente.
Porlotanto,edades[3]hacereferenciaalelementoquetieneelíndice3enelarreglo:elvalor12enelcasodenuestroejemplo.Demanerasimilar,grupo[2]contienelacadenaGeorge.
Recuerdequelosíndicesempiezanen0,porloqueunarreglodelongitud4tieneíndicesquevande0a3.Porlotanto,sihiciéramosreferenciaagrupo[4]estaríamoscometiendounerror,elprogramasedetendríay aparecería un mensaje indicándolo.
< > Programación
97
Enresumen,losvaloresdelosíndices:
• empiezanencero;
• sonenteros;
• lleganhastaunnúmeromenosqueeltamañodelarreglo(elvalorqueseespecificaalmomentode declarar el arreglo).
Algunasvecesesconvenienteutilizarcomoíndiceelvalordeunavariable.Entalescasosutilizamosvaria-blesintcomoíndices.Porejemploparamodificarlosvaloresdeelementosindividualesdeunarregloatravésdeinstruccionesdeasignación,comoenelsiguienteejemplo:
edades[3]=99;
grupo[2]=“Mike”;
Parahacerreferenciaaloselementosindividualesdeunarreglo,entodosestosfragmentosdeprogramahemosespecificadoelvalordeuníndice.
Es frecuente que necesitemos hacer referencia al n-ésimo elemento en un arreglo, siendo nunavariable.Por ejemplo, supón que deseamos sumar todos los números de un arreglo (de números), e imagina que ésteconstadesieteelementosquerepresentanelnúmerodecomputadorasvendidasenunalmacéndu-rante cada día de la semana:
int[] venta = new int[7];
Parainsertarvaloresenelarregloemplearemosinstruccionesdeasignación.Supongaqueellunes(día0)sevendieron13computadoras:
venta[0]=13;
yelrestodelasemanasevendieronestascantidades:
venta[1] = 8;
venta[2] = 22;
venta[3] = 17;
venta[4] = 24;
venta[5] = 15;
venta[6] = 23;
Ahoraqueremosobtenerlaventatotaldelasemana.Unamanera(pocohábil)deobtenereseresultadoconsistiríaenescribirlosiguiente:
suma=venta[0]+venta[1]+venta[2]+venta[3]+venta[4]+venta[5]+venta[6];
< > Programación
98
Locualescorrecto,peronoaprovechalaregularidaddeunarreglo.
Laalternativaesusarunciclofor.Unavariable—digamos,númeroDía—seempleaparaalmacenarelvalordelíndicequerepresentaeldíadelasemana.Alprincipioelíndicesehaceiguala0,ysuvalorseincremen-tacadavezqueserepiteelciclo:
intsuma=0;
for(intnúmeroDía=0;númeroDía<=6;númeroDía++)
{
suma=suma+venta[númeroDía];
}
Encadaiteracióndelciclosesumaaltotalelsiguientevalordelarreglo.Enrealidadestefragmentodecó-digonoesmáscortoquelasoluciónanterior,perosindudaloseríasielarreglotuvieramilelementosquesumar.Otraventajaesqueelcódigomuestraexplícitamentequeestárealizandounaoperaciónsistemáticaen un arreglo.
Losíndicessonelúnicolugardelaprogramaciónenelquesepermite(algunasveces)elusodenombresunpococrípticos.Sinembargo,enelfragmentodeprogramaanteriorquedaclaroelusocomoíndicedenúmeroDía,yelnombreestáestrechamenterelacionadoconelproblemaaresolver.
4.5.5.2 Longitud de los arreglos
Unprogramaenejecuciónsiemprepuedeconocerlalongituddelosarreglosqueintervienenenél.
Por ejemplo, si tenemos un arreglo declarado de la siguiente forma:
int[]tabla=newint[10];
podemosconocersulongitudsiutilizamoslapropiedadLength,comoenelsiguienteejemplo:
inttamaño;
tamaño=tabla.Length;
Enestecaso,tamañotieneunvalorde10.Talvezleparezcainútilquerersaberlalongituddeunarreglo;después de todo tenemos que proporcionar ese dato al momento de declararlo.
Unavezquecreamosunarreglosulongitudesfija.
Aldiseñarunnuevoprogramadebemostenerencuentaeltamañodecualquierarregloqueintervengaenél.Enocasioneslanaturalezadelproblemahacequeestoresulteobvio.Porejemplo,silosdatosserela-cionan con los días de la semana, sabemos que el arreglo constará de siete elementos.
< > Programación
99
4.5.5.3 Inicialización de arreglos
Unaformacomúndeinicializarunarreglodemaneraexplícitaesalmomentodedeclararlo.Losvaloresinicialesrequeridosseencierranentrellavesyseseparanmediantecomas.Peroeltamañodelarreglonodebe proporcionarse en su posición usual. La siguiente inicialización:
int[]edades={23,54,96,13,7,32};
endondelalongituddelarreglonosedademaneraexplícita,esequivalentea:
int[]edades=newint[6];
edades[0]=23;
edades[1]=54;
edades[2]=96;
edades[3]=13;
edades[4]=7;
edades[5]=32;
Heaquíotroejemplo;enestecasoseinicializaunarreglodecadenasdecaracteres:
string[]grupo={“John”,“Paul”,“George”,“Ringo”};
Otra forma de inicializar un arreglo es mediante un ciclo, como en el siguiente ejemplo:
int[]tabla=newint[25];
for(intíndice=0;índice<tabla.Length;índice++)
{
tabla[índice]=0;
}
Sielprogramanecesitarestablecerperiódicamenteelarregloasusvaloresiniciales,podemosutilizarelciclo for anterior.
< > Programación
100
4.5.6 Colecciones
Las coleccionesproporcionanunmétodomásflexibleparatrabajarcongruposdeobjetos.Adiferenciadelos arreglos, el grupo de objetos con el que trabaja puede aumentar y reducirse dinámicamente a medida que cambian las necesidades de la aplicación.
Paraalgunascolecciones,puedeasignarunaclaveacualquierobjetoqueincluyaenlacolecciónparaquepuedarecuperarrápidamenteelobjetoconlaclaveasignada.
Una colecciónesunaclase,demodoqueantesdepoderagregarelementosaunanuevacolección,debedeclararla.
4.5.7 Listas
Cuando arrastramos un cuadro de lista al formulario desde el cuadro de herramientas, estamos creando unanuevainstanciadelaclaseListBox. Esta clase emplea otra clase llamada Listparallevaracabosusfun-ciones.Loscuadrosdelistasimplementedesplieganlainformaciónenelformulario,ymanejanloseventosdeclicderatón;porsuparte,laslistasalmacenanlainformaciónquesemuestraenaquellos.
Así,mientrasloscuadrosdelistasoportanloseventosClick y DoubleClick junto con propiedades tales comoSelectedItem,laslistasproveenmétodosparaagregaryeliminarelementosdeéstas.
Podemos obtener un conteo del número de elementos que conforman la lista (y el cuadro de lista) median-teelusodelapropiedadCount,comosemuestraacontinuación:
int númeroDeElementos = compras.Items.Count;
4.5.7.1 Adición de elementos a una lista
El programa de ejemplo que se muestra en la siguiente Figura 4.14 permite que el usuario agregue ele-mentos a un cuadro de lista.
Figura 4.14
< > Programación
101
Estemétodorespondealclicdelbotónycolocaunelementoacompraralfinaldelcuadrodelista.
privatevoidbutton1_Click(objectsender,EventArgse)
{
compras.Items.Add(textBox1.Text);
}
Enesteejemploelnombredelcuadrodelistaescompras.Comovimosantes,unadelaspropiedadesdeloscuadrosdelistaesItems,yrepresentasucontenidocomounainstanciadelaclaseList.Asuvez,estaclaseproporcionavariosmétodos,unodeloscualesesAdd,quenospermiteañadirelementosaunalista.Suparámetroeselvalorqueseagregaráalalista.
Tambiénpodemoscolocarelementosenuncuadrodelistaentiempodediseño.Alseleccionarlapropie-dadItemsdeuncuadrodelistaapareceunanuevaventanaquenospermiteinsertarelementosenél.
4.5.7.2 La longitud de una lista
Acontinuaciónveremosunmétodoquerespondealclicdeunbotóndesplegandouncuadrodemensajeconelnúmerodeelementosquecontieneelcuadrodelista.
privatevoidbutton1_Click(objectsender,EventArgse)
{
MessageBox.Show(Convert.ToString(compras.Items.Count));
}
UnavezmáspodemosvercómoseutilizalapropiedadItemsdelcuadrodelistallamadocompras.
AlmismotiemposeemplealapropiedadCountdelaclaseListparaobtenerelnúmerodeelementosquelo conforman.
< > Programación
102
4.5.7.3 Índices
Losprogramasutilizanuníndiceparahacerreferenciaaloselementosqueconstituyenuncuadrodelista.Uníndiceesunenteroqueindicaaquéelementosehacereferencia.Elprimerelementotieneelíndice0,el segundo 1, etcétera como se muestra en al Figura 4.15.
Figura 4.15
Elprogramadeejemploquesemuestraenlafigura4.16muestraalusuarioelnúmerodeíndicecorres-pondiente a cada elemento.
Figura 4.16
Ahoraanalicemosunprogramaquedemuestracómousarlosvaloresdelosíndices.Elusuariohaceclicenunelementodelcuadrodelista,yelprogramamuestraelvalordelíndiceequivalenteenuncuadrodetexto.
< > Programación
103
Cuandoocurreeleventodelclicinvocamoselsiguientemétodoparamanejarlo:
privatevoidcompras_SelectedIndexChanged(objectsender,EventArgse)
{
textBox1.Text=Convert.ToString(compras.SelectedIndex);
}
SelectedIndexesunapropiedaddelcuadrodelistaqueproporcionaelvalordelíndicedelelementoenelquesehizoclic(o21sinosehahechoselecciónalguna).Alejecutaresteprogramapodemosverquelosvaloresdelosíndicesnosealmacenancomopartedelcuadrodelista,sinoquelacomputadoraconocelosvaloresyéstospuedenusarsecomoycuandoseanecesario.Tambiénpodemosconfirmarquelosvaloresde los índices empiezan en cero y no en uno.
4.5.8 Pilas
Estaestructuraesbastanteusadaparasimularmétodosrecursivosyresolveralgunostiposdeproblemas.Estovienesimulandocomounmontóndeobjetosquesevanapilando(unoencimadeotro).Lafilosofíade una pila (stack) es “El último que entra es el primero que sale”.Puedenverunpocomásdequesetrataenlasiguientefigura4.17.
Figura 4.17
EsimportantetambiénseñalarqueestaclaseimplementalainterfazIEnumerable.
Unapilatieneunconstructorcontressobrecargas:
Pila vacía
Éste es el primer elemento en salir
< > Programación
104
Contructorpordefectoquecreaunapilavacía
Stack s = new Stack();
Podemosindicarlacantidadinicialdeelementosquetendrálapila
Stack s = new Stack(intinitialCapacity);
Podemos también pasarle una colección de elementos (List, Quee, ArrayList). Este constructor copiará to-dos estos elementos a la pila:
Stack s = new Stack(ICollection col);
4.5.9 Colas
Las Colas son una colección FIFO. Es decir, procesan información en un orden de primero-en-entrar, pri-mero-en-salir(delinglésfirst-in,first-out).Dichodeotramanera,manejaprimeroloselementosquereci-biómáslejanoseneltiempo.Pensemosunpocoenlalógicausadaparaprocesarpedidosenunaaplicaciónen C#.
LascolasFIFOsonfrecuentementeutilizadasdentrodeunsistemadecomputadorasparaalbergartareasqueaúnfaltansercompletadascuandoqueremosproveerserviciosenunabaseprimero-en-llegar,prime-ro-en-atender.
Podemos crear colas si nos apoyamos en la clase Queue. En una cola podremos introducir elementos por lacabeza(“Enqueue”,encolar)yextraerlosporelextremoopuesto,elfinaldelacola(“Dequeue”,desen-colar).EstetipodeestructurassenombranavecestambiénporlassiglasFIFO(FirstInFirstOut,loprimeroen entrar es lo primero en salir).
Unejemplobásicosimilaralanterior,quecrearaunacola,introdujeratrespalabrasyluegolasvolvieraamostrar sería:
< > Programación
105
Ejemplo:
usingSystem;
usingSystem.Collections;
public class ejemploCola1 {
publicstaticvoidMain(){
stringpalabra;
Queue Cola = new Queue();
Cola.Enqueue(“Hola,”);
Cola.Enqueue(“soy”);
Cola.Enqueue(“yo”);
for(bytei=0;i<3;i++){
palabra=(string)miCola.Dequeue();
Console.WriteLine(palabra);
}
}
}
Que mostraría:
Hola,
soy
yo
laimplementacióndeunacolaqueincluyeC#esmásavanzadaqueeso,conmétodos:
• “Peek”,quemiraelvalorquehayenlacabezadelacola,perosinextraerlo.
• “Clear”,queborratodoelcontenidodelacola.
• “Contains”,queindicasiunciertoelementoestáenlacola.
• “GetType”,parasaberdequétiposonloselementosalmacenadosenlacola.
< > Programación
106
• “ToString”,quedevuelveelelementoactualconvertidoaunstring.
• “ToArray”,quedevuelvetodalapilaconvertidaaunarray.
• “GetEnumerator”,quepermiteusar“enumeradores”pararecorrerlacola,unafuncionalidadqueveremosconalgúndetallemásadelante.
• Aligualqueenlapila,tambiéntenemosunapropiedad“Count”,quenosindicacuántoselemen-toscontiene.
• Reconocer el concepto de clase y el modo de acceso a estas en la programación con C#.
• Realizar interfaces graficas usando los diferentes controles que proporciona C# .
• Conocer y manejar excepciones en C#.
• Nombrar los requerimientos para el manejo de archivos en C#.
< > Programación
108
5 Programaciónorientadaaobjetos
En esencia, la programación orientada a objetos no es más que un modelo de programación donde un programaesdivididoenmódulosdesoftwareindependientesunosdeotrosperoconcapacidaddeinte-ractuarentresíparacumplirconunobjetivo.
Dichos módulos están conformados básicamente por datos y funciones que se encargan de manipularlos internamenteparamostraralexteriorúnicamentelosresultadosquenecesitaelprogramaquelosvaautilizar.
5.1 ClasesyObjetos
5.1.9.1 Clases
La clase es el elemento fundamental de la programación orientada a objetos con el lenguaje C#. Aunque, dentrodeestemodelodeprogramación,existenmuchasdefinicionesválidasparaelconceptodeclase,enlaprácticaunaclasenoesmásqueunaplantilladesoftwarequesirveparaconstruircualquiercantidadde objetos.
Porejemplo,en.NETexisteunaclasellamadaFormquesirvecomomoldeparaconstruircualquierven-tanaquenecesiteunaaplicacióntipoWindows.Lasventanasquenosotrosobservamosenlapantalladenuestrocomputador,sonlosobjetosgeneradosconesaplantilla.
Puedenhabermuchosobjetosgeneradosconesaplantilla,peroloquelospuedehacerdiferentesaunosdeotros,sonlosvaloresqueseasignanasusatributoscomo:alto,ancho,color,título,etc.
Desdelaperspectivadellenguajedeprogramación,unaclaseesuntipo,quealigualquelostiposestán-dar,sirveparadeclararvariablescuyaestructuraesunafielcopiadeella.
Estasvariablesrecibenelnombredeobjetosysonloselementosquemanipulaelprogramadorparade-sarrollar su programa.
5.1.9.2 Objetos
Cuandosediseñayprogramaunaaplicacióndesoftwareconelmodelode programaciónorientadaaobjetos,loquesehaceenlaprácticaesconstruirunconjuntodeplantillasdeobjetos,oloqueseconocecomoclases,lascualespermitendefinirvariablesenmemoriaqueseconocenconelnombredeobjetoso instancias de clase.
Desdeestaperspectiva,eltérminoclaseganamayorsignificado,yaquesepuededefinircomounaplanti-lla que permite generar una clase de objetos.
Para crear un objeto de una determinada clase, se procede básicamente en dos pasos:
• primerosedeclaraunavariableconeltipoquerepresentalaclasey
• luego se le asigna memoria con el operador new
< > Programación
109
5.1.1 Definicióndeclases
EnC#unaclasesedefinemediantelapalabraclaveclass y una sintaxis básica que encontramos para definirla,eslasiguiente:
class NombreClase
{
//Miembros
}
Porejemplo,supongamosquedeseamosuncomponentedesoftwareparaprocesosmatemáticosquenospermitan manipular números complejos.
LaclasequenospermitiráprocesarestosnúmeroslallamaremosComplejo,ysepuededefinircomo,
class Complejo
{
//MiembrosdelaclaseComplejo
}
5.1.1.1 Definición de objeto
Por ejemplo, tomando la clase Complejodefinidaanteriormente,lasiguientelíneacreaunobjetoapar-tirdeestaplantilla:
Complejoz;
Cuando el programa ejecuta esta línea, sólo posee una dirección de memoria donde se inicia la estructura delavariablez.
Paraasignarlelamemoriatotalconformealtamañodelaestructuraquedescribelaclase,esnecesarioaplicar el operador new, así:
z = new Complejo();
Apartirdeaquí,elsistemaconoceconexactitudlaubicaciónytamañoocupadoenmemoriaporlava-riablezyestaráencondicionesdecolocarenelsitioquecorrespondacadaunodelosdatosydemásele-mentos que conforman el objeto.
< > Programación
110
En C#, tanto la declaración como la asignación de memoria para un objeto puede hacerse en una sola línea de código, como se muestra enseguida para nuestro ejemplo:
Complejo z = new Complejo();
5.1.2 Accesibilidad
Sinembargo,lasclasesdebencumplirunosnivelesdeseguridadqueexigenelmanejodelcontroldeacce-sibilidadaellas,sobretodoporpartedeagentesexternosalproyectodesoftwaredondesehayandefini-do.Esporestoqueladefinicióndecualquierclasedebeirantecedidadeunapalabraclavequedeterminala accesibilidad que admite dicha clase.
LasintaxisC#paradefinirunaclaseeslasiguiente:
[public | private | protected | internal]
class NombreClase
{
//Miembros
}
Lasecciónentrecorchetes,queindicalaspalabrasclavedeaccesibilidad,public,private,protected,inter-nal,quepuedenutilizarseenladefinicióndeunaclase,esopcionaleindicacualeselniveldeaccesoquesevaapermitirsobrelaclase.
Sinoseespecificaningúnniveldeaccesibilidad,elcompiladorladefinepordefectocomointernal,locualsignificaquesolosepermiteelaccesoalasclasesquehacenpartedelmismoensamblado.
Mediantelaspalabrasdeaccesibilidadsepuedenespecificar los siguientescinconivelesdeprotecciónpara una clase:
Acceso Seguridadpublic No existe ninguna restricción de accesoprotected Sólo pueden tener acceso la clase contenedora o
lostiposderivadosdeéstaclaseinternal Únicamentesepermiteelaccesoalensamblado
actualinternal protected El acceso está limitado al ensamblado actual o a
lostiposderivadosdelaclasecontenedoraprivate Sólosepermiteelaccesoaltipocontenedor
Paranombrarunaclasesesugiereutilizarunacadenadecaracteresqueiniciaconunaletramayúscula
< > Programación
111
ycuyosignificadoesfamiliarparaelprogramador.Aquíesmuy importantetenerencuentacuales lafuncionalidadbásicadelaclase,paradarleunnombrequeresultesignificativoyfácilderecordarposte-riormente. Podemos tener clases como: Complejo, Estudiante, DocumentoImpresion, RedNeuronal, Co-nexionBaseDatos.
5.2 Interfaces de Usuario
La interfaz de usuario es el medio con que el usuario puede comunicarse con una máquina, un equipo o una computadora, y comprende todos los puntos de contacto entre el usuario y el equipo. Normalmente suelen ser fáciles de entender y fáciles de accionar.
Lainterfazvirtualointerfazgráfica(GUI)quepermite,medianteiconos(cursor+objetosgráficosmetafóri-cos),interactuarconloselementosgráficosconvirtiendoalserhumanoenusuariodelaaplicación.
Una interfaz debe cumplir las condiciones:
• Naturalidad.Elnuevosistemaautomatizadodebetenderaserlomássimilaralantiguo.
• Facilidaddeaprendizajeyuso,dosaspectosquenosiemprevanunidos.
• Consistencia.Lainterfazdebemanteneruniformidadencuantoaestilo,vocabulario,etc.
5.2.1 Barra de herramientas y controles de usuario para formularios Windows
5.2.1.1 El formulario
Elelementoprincipalymásrepresentativodeunaaplicaciónconinterfazgráficaesaquelqueseconocecon el nombre de ventana.DesdelavisióndelprogramadordeC#,elobjetoquedaorigenaesteelemen-to es el formulario.
La clase Form,quepertenecealNamespaceSystem.Windows.Forms,esquienseencargadedefinirtodoslosformulariosqueseannecesariosparalacreacióndelasventanasquepuedenecesitarunaaplicaciónconinterfazgráficadeusuario.
Generalmente,yenelcontextodelentornodedesarrollode.NET,aestetipodeaplicacionesseledeno-mina programas Windows Forms.
Formesunaclasequeencapsulatodaslaspropiedades,métodosyeventosquesenecesitanparadarfuncionalidadaunaventana.Aunqueelprogramadortambiénpuedeheredardeellaparacrearclasesquedefinanformulariosdeventanastotalmentepersonalizadasasusintereses.
< > Programación
112
Enelsiguienteejemplovamosamostrarunaventanatotalmenteautónoma,cuyo comportamientoesidénticoaldecualquierotraventanadeotrosprogramasdeWindows.
Ladiferenciaconelanteriorejemplo,radicaenlainclusióndeunciclodemensajesatravésdelaclaseApplication.
usingSystem.Windows.Forms;
publicclassProgramaGrafico
{
staticvoidMain()
{
Formventana=newForm();
ventana.Text=“¡Holaventana...!”;
ventana.Visible=true;
Application.Run(ventana);
}
}
5.2.2 Controles de usuario y sus eventos asociados
EnWindowsselellamacontrolacualquierelementográficocolocadosobreunaventanayquepermiterealizar alguna tarea de interés para la aplicación.
Ejemplos de controles son las barras de desplazamiento, los menús, botones de comando, botones de opción,casillasdeverificación,camposdeentradadetextoycuadrosdelista,entreotros.
Para.NETcualquiercontrolesunobjetoquepuedecrearseapartirdeunaclase,ysumanejoesigualalde cualquier otro objeto.
Conlaventajaqueyaexisteunaampliagamadeclasesquehansidoprogramadas,yhacenpartede.NETFramework,paratalfin.
Sehacemencióndetresclasesquepermitencrearloscontrolesmásbásicosdeunaaplicación:Button,paracrearbotonesdecomando;TextBox,paracrearcamposdeentradadetexto,yLabelparacrearlasllamadasetiquetas,quepermitenmostrarcadenasdetextosobrelaventana.
< > Programación
113
Las tres clases mencionadas exponen un conjunto de propiedades que son comunes a todos sus objetos. Entre ellas están las siguientes:
Propiedad DescripciónText Permite escribir o leer una cadena de texto hacia o
desde el controlLeft Establece o recupera la coordenada horizontal de
laesquinasuperiorizquierdadelcontrol(verFigu-ra 5.1)
Top Estableceorecuperalacoordenadaverticaldelaesquinasuperiorizquierdadelcontrol(verFigura5.1)
Width Establece o recupera el ancho de un controlHeight Establece o recupera el ancho de un control
Laspropiedadesdeposiciónydimensióndeuncontrolaceptanvaloresenterosquepordefectorepresen-tancantidadesdepíxeles.
Figura 5.1
Estaspropiedadesigualexistenparaunformulario,dondeLeftyTopestablecenodevuelvenlascoorde-nadas de la esquina superior izquierda con respecto a la pantalla.
ElformularioexponelapropiedadControls,queesunobjetodeltipoCollectionControls,elcualexponeelmétodoAddquepermiteagregaruncontrolalaventana.Susintaxiseslasiguiente:
Formulario.Controls.Add(Identificador);
ElparámetrodelmétodoAdd,eselidentificadordelavariablequerepresentaalobjetocontrol.
< > Programación
114
AcontinuaciónsemuestraunprogramaformadoporunaventanaquecontieneunbotónetiquetadoconAceptar.ElprogramahaceunaimplementacióndeleventoClickdelbotón.
usingSystem;
usingSystem.Windows.Forms;
publicclassProgramaGrafico
{
staticvoidMain()
{
FormformVentana=newForm();
ButtonbuttonAceptar=newButton();
// Botón Aceptar
buttonAceptar.Click+=newEventHandler(ButtonAceptarClick);
buttonAceptar.Text=“Aceptar”;
buttonAceptar.Left=100;
buttonAceptar.Top=150;
//Configurarlaventana
formVentana.Text=“Ventana”;
formVentana.Visible=true;
//Agregaruncontrolalaventana
formVentana.Controls.Add(buttonAceptar);
// Entrar al bucle de mensajes
Application.Run(formVentana);
}
//MétodoquecontrolaeleventoClickdelbotónAceptar
staticvoidButtonAceptarClick(objectsender,EventArgse)
< > Programación
115
{
MessageBox.Show(“¡Holabotón...!”,“Click”);
}
}
ElprogramadeesteejemplomuestracuatrobotonesdecomandoquegeneraneleventoClickyesteescontroladoporunúnicoevento.Estaesunabuenaformadeprogramarunconjuntodecontrolesquerealizan tareas muy similares.
SehaimplementadoelcontroladordeleventoClickdeloscuatrobotonesmedianteelmétodo
staticvoidButtonOperar(objectemisor,EventArgse)
{
ButtonbuttonEmisor=(Button)emisor;
MessageBox.Show(buttonEmisor.Text);
}
Lasclasesquedefinenobjetosvisualesimplementanunagrancantidaddeeventosyeltrabajodelprogra-mador de .NET es desarrollar los métodos que los controlen.
Elsiguienteprogramamuestradoseventosquehansidocontroladosparamostrarunmensajeenpanta-lla.EleventoLoadquesegeneracadaqueseestáiniciandoelprocesodecargadeunaventanayeleventoClickquesegeneraalhacerclicconelbotónprincipaldelratónsobrelaventana.
usingSystem;
usingSystem.Windows.Forms;
publicclassVentanaEventos
< > Programación
116
{
staticvoidMain()
{
FormformVentana=newForm();
formVentana.Load+=newEventHandler(FormVentanaLoad);
formVentana.Click+=newEventHandler(FormVentanaClick);
formVentana.Text=“Ventana”;
Application.Run(formVentana);
}
staticvoidFormVentanaLoad(objectemisor,EventArgse)
{
MessageBox.Show(“Cargando...”,“Load”);
}
staticvoidFormVentanaClick(objectemisor,EventArgse)
{
MessageBox.Show(“Clic...”,“Click”);
}
}
5.3 Excepciones
EnC#,eltérmino“excepción”seutilizaparatransmitirlaideadequealgohasalidomal;entérminoscomu-nes,significaquehaocurridounerrorosehapresentadouna“circunstanciaexcepcional”.
EnellenguajeC#,loserroresdelprogramasedifundenentiempodeejecuciónatravésdelprogramame-diante un mecanismo denominado excepciones. Las excepciones se producen cuando el código encuentra un error y se detectan mediante el código que puede corregir el error.
LasexcepcionessepuedenproducirmedianteelCommonLanguageRuntime(CLR)de.NETFrameworkomediantecódigodeunprograma.Unavezqueseproduceunaexcepción,éstasedifundealapiladella-madas hasta que se encuentra una instrucción catch para la excepción. Las excepciones no detectadas se identificanatravésdeuncontroladordeexcepcionesgenéricoproporcionadoporelsistema.
< > Programación
117
5.3.1 Excepciones del sistema
5.3.1.1 La clase System.Exception.
LaclaseSystem.Exceptioneseltipobasedetodaslasexcepciones.Entresuspropiedadesmásimportantesestán:
- Message:esunapropiedaddesólolecturaquecontieneunadescripcióndelacausadelaexcepción(enforma de cadena legible por el ser humano).
- InnerException:esunapropiedaddesólolecturaquecontienelaexcepcióninternadelaexcepción.Sisuvaloresdistintodenull,indicaquelaexcepciónactualhasidolanzadaenrespuestaaotraexcepción(que es a la que se llama la excepción interna).
ElvalordeestaspropiedadespuedeserespecificadoenelconstructordelaclaseSystem.Exception.
5.3.1.2 Activación de Excepciones.
Lasexcepcionespuedenseractivadasdedosmodos:
• Mediantelasentenciathrow:Activalaexcepcióndemodoinmediatoeincondicional.Enningúncasovuelveelcontrolalasentenciasiguientealthrow.
• Durante la ejecución de sentencias y expresiones C# se pueden dar situaciones en las que la ope-raciónnopuedacompletarsedemodonormalyseactiveunaexcepción.Porejemplo,unadivisiónenteraporcerolanzalaexcepciónSystem.DivideByZeroException.
5.3.1.3
ManejodeExcepciones.
Las excepciones se manejan mediante una sentencia try-catch-finally.
Por ejemplo:
try
{
strings=null;
x.MiFun(s);
}
catch(ArgumentNullExceptione)
< > Programación
118
{
Console.WriteLine(“{0}Primeraexcepcióncapturada”,e);
}
catch(Exceptione)
{
Console.WriteLine(“{0}Segundaexcepcióncapturada”,e);
}
Cuandoselanzaunaexcepcióndesdeelcódigoqueestáentrelasllavesdelacláusulatry,elsistemabuscalaprimeracláusulacatchquepuedamanejareltipodeexcepciónquesehalanzado(eltipodeexcepciónhadecoincidirconeldelparámetroqueesperalacláusulacatchobienserdeuntipoderivadoalqueespera la cláusula catch).
Si no se encuentra la cláusula catch adecuada se sigue buscando la excepción en el punto del código desde elquesehallamadoalmétodoquecontienelacláusulatrydondesehalanzadolaexcepción.Estaopera-ción se repite hasta encontrar una cláusula catchque“capture”laexcepción.
Es importante tener en cuenta que si se desea que una cláusula catch capture cualquier excepción ha de definirsesinparámetros.Unavezsehaencontradolacláusulacatchquemanejalaexcepción,setransfie-re el control a la primera sentencia de tal cláusula. Antes de ejecutar la primera sentencia de la cláusula catch,seejecutantodaslascláusulasfinallydelassentenciastryanidadasalaquecapturalaexcepción.
Si no se encuentra una cláusula catch puede ocurrir una de las dos opciones siguientes:
Si la búsqueda llega a un constructor staticoauninicializadordecamposstatic,selanzaunaexcepciónSystem.TypeInicializationExceptionenelpuntoenelqueseinvocóalconstructor.ElcampoInnerExceptiondelaexcepciónTypeInicializationExceptioncontienelaexcepciónoriginalmentelanzada.
Si la búsqueda llega al código que inicialmente comenzó el thread o el proceso, la ejecución del thread o elprocesofinalizan.
< > Programación
119
Ejemplo:
usingSystem;
classMiClase
{
publicstaticvoidMain()
{
MiClasex=newMiClase();
try
{
strings=null;
x.MiFun(s);
}
//Capturadelaexcepción(másespecífica):
catch(ArgumentNullExceptione)
{
Console.WriteLine(“{0}Primeraexcepcióncapturada“,e);
}
//Capturadelaexcepción(menosespecífica):
catch(Exceptione)
{
Console.WriteLine(“{0}Segundaexcepcióncapturada“,e);
}
}
publicvoidMiFun(strings)
{
if (s == null)
thrownewArgumentNullException();
} }
< > Programación
120
5.3.2 Excepciones personalizadas
.NETFrameworkproporcionaunajerarquíadeclasesdeexcepciónque,enúltimainstancia,derivandelaclasebaseException.Cadaunadeestasclasesdefineunaexcepciónespecífica,porloqueenmuchoscasos sólo hay que detectar la excepción. También se pueden crear clases de excepción personalizadas derivándolasdelaclaseException.
Cuandosecreenexcepcionespersonalizadas,esrecomendablefinalizarelnombrede laclasede laex-cepcióndefinidaporelusuarioconlapalabra“Excepción”.Tambiénserecomiendaimplementarlostresconstructores comunes recomendados, como se muestra en el ejemplo siguiente.
Enelejemplosiguiente,sederivaunanuevaclasedeexcepción,EmployeeListNotFoundException,deException.Sedefinentresconstructoresenlaclase,cadaunoconparámetrosdiferentes.
usingSystem;
publicclassEmployeeListNotFoundException:Exception
{
publicEmployeeListNotFoundException()
{
}
publicEmployeeListNotFoundException(stringmessage)
: base(message)
{
}
publicEmployeeListNotFoundException(stringmessage,Exceptioninner)
: base(message, inner)
{
}
}
< > Programación
121
5.4 Archivos
Losflujosnospermitenaccederaunarchivocomounasecuenciadeelementos.Eltérmino“flujo”seuti-lizaenelsentidodeunasucesióndedatosquesaleoentradelprograma.
Acontinuaciónexplicaremoselvocabularioasociadoalusodearchivos,queessimilarencasitodosloslenguajesdeprogramación.Sideseamosprocesarlosdatosqueseencuentranenunarchivoexistente,debemos:
1. Abrirelarchivo.
2. Leer(recibircomoentrada)losdatos,elementoporelemento,ycolocarlosenvariables.
3. Cerrarelarchivocuandoterminemosdetrabajarconél.
Paratransferirdatosdevariablesaunarchivo,debemos:
1. Abrirelarchivo.
2. Enviarcomosalida(escribir)nuestroselementosenlasecuenciarequerida.
3. Cerrarelarchivocuandoterminemosdetrabajarconél.
Alleerdatosdeunarchivo,loúnicoquepodemoshacerestrabajarelementoporelemento.Si,porejem-plo,sólonecesitamosexaminarelúltimoelementodeunarchivo,tendremosquecodificaruncicloparaleerunelementoalavezhastallegaralrequerido.
Paralarealizacióndemuchastareasesconvenientevisualizarlosarchivosdetextocomounaseriedelí-neas,cadaunacompuestadevarioscaracteres.Cadalíneasedaporterminadamedianteunmarcadordefindelíneaquepuedeserenelcarácterdenuevalínea,elcarácterderetorno,oambos.
AuncuandoelusuarioseconcretaaoprimirlateclaEnterparafinalizarunalínea,elsoftwaredeWindowscolocaráloscaracteresdenuevalíneayretornoparaindicarelfindelínea.C#seencargadeocultarlamayor parte de este complicado proceso.
Ademásdepodermanipularlosarchivosquecontienenlíneasdetexto,C#tambiénpuedemanejaraque-llosqueconstandedatosbinarios,comoimágenes.Sinembargo,porlogeneralestetipodedatosseorga-nizaenunformatomáscomplicadodentrodelosarchivos.
< > Programación
122
5.4.1 Streams
5.4.1.1 Las clases StreamReader y StreamWriter
Paraleeryescribirlíneasdetextoutilizaremos:
• El método ReadLine de StreamReader:lee toda una línea de texto y la coloca en una cadena, exclu-yendoelmarcadordefindelínea
• La clase StreamWriter. Consta de dos métodos principales: Write y WriteLine. Ambos escriben una cadenaenunarchivo,peroWriteLineagregaelmarcadordefindelíneadespuésdelacadena.TambiénpodemosusarWriteLinesinargumentosparaescribirsólounmarcadordefindelíneaenelarchivo.ComoalternativaaWriteLinepodemosutilizarWriteenviándoleloscaracteres\r\nentre comillas como argumento. Los métodos OpenText y CreateText de la clase File. Éstos son métodosestáticosquenosproporcionanunanuevainstanciadeunflujodetexto.
LasclasesdearchivoformanpartedelnamespaceSystem.IO.Comoestaclasenoseimportademaneraautomática,parahacerlodebemosusarlasiguientelínea:
usingSystem.IO;
enlapartesuperiordetodosnuestrosprogramasenlosqueseprocesenarchivos.
5.4.1.2 Operaciones de salida con archivos
ElprogramaArchivodesalidaabreunarchivoyescribetreslíneasenél.Lainterfazdeusuariosóloconsisteen un botón, por lo cual no la mostraremos aquí. El código es el siguiente:
privatevoidbutton1_Click(objectsender,EventArgse)
{
//escribevariaslíneasdetextoenelarchivo
StreamWriterflujoSalida=File.CreateText(@”c:\miarchivo.txt”);
flujoSalida.WriteLine(“Estearchivo”);
flujoSalida.WriteLine(“contienetres”);
flujoSalida.WriteLine(“líneasdetexto.”);
flujoSalida.Close();
}
< > Programación
123
Ahoraexaminemosnuestrocódigo.Primerocreamosyabrimoselarchivo:
StreamWriterflujoSalida=File.CreateText(@”c:\miarchivo.txt”);
EnestecasoutilizamoselmétodoestáticoCreateTextde la claseFile,ésta líneacreaunnuevoobjetoStreamWriteryabreelarchivo.Cabemencionarqueenestapartedelcódigohaydoselementosquehacenreferenciaalarchivo:
• Unacadenaespecificandoelnombredelarchivoqueutilizaelsistemaoperativocuandomuestralascarpetas:@”c:\miarchivo.txt”.Tenencuentalanecesidaddeutilizarelcarácter@,cuyafun-cióneshacerqueelcarácter\tengasuinterpretaciónnormalenvezdelusoqueseledaconloscaracteres de escape.
• UnavariablequeelegimosnombrarflujoSalida.EsunainstanciadelaclaseStreamWriterquenosproporcionaelmétodoWriteLine.AlutilizarCreateTextasociamosflujoSalidaconelarchivo“c:\miarchivo.txt”.
ParaescribirunalíneadetextoenelarchivoutilizamosWriteLine,comoenelsiguienteejemplo:
flujoSalida.WriteLine(“Estearchivo”);
Sielusuarioescribelosdatosquedeseamoscolocarenelarchivo(digamos,medianteuncuadrodetexto),podríamosutilizar:
flujoSalida.WriteLine(textBox1.Text)
Sielarchivoyaexistesucontenidooriginalseráeliminadoysustituidoporlastreslíneas.Porúltimo,ce-rramoselarchivo:
flujoSalida.Close();
Estoaseguraquelosdatosentránsitoseescribanenelarchivo,ytambiénnospermitevolveraabrirloparalectura o escritura.
ElprocesodeescrituratambiénhubierapodidollevarseacabomedianteelusodeWriteconloscaracteresdefindelínea,comoenelsiguienteejemplo:
flujoSalida.Write(“Doslíneas\r\ndetexto.\r\n”);
Algunasvecesestoesconvenientecuandomanipulamosunacadenaquecontienevariaslíneas.
Enresumen,elprocesoparaescribirdatosenunarchivoconsistióen:
• abrirelarchivo“c:\miarchivo.txt”
• enviar(escribir)algunascadenasalarchivo
• cerrarelarchivo
www.grupoeduit.com
01 800 808 62 40