Вы находитесь на странице: 1из 199

C#

.Net para Docentes y


Alumnos
Programando en C#
Texto adaptado para la Unidad Curricular de
Programacin de los Alumnos y Docentes de la
Especialidad Computacin de la Ciudad de Buenos
Aires.
Gustavo E. Romay

.NET para Docentes y Alumnos. Programando en C#

Introduccin
En la actualidad, existen gran variedad de lenguajes para el desarrollo de
sistemas, sin embargo, muchos de ellos poseen puntos en comunes, entre ellos
y de suma actualidad e importancia, la forma de poder llegar a resolver un
sistema utilizando la programacin orientada a objetos, el manejo de los tipos
de variables, la existencia de procesos como los ciclos, la toma de decisin,
funciones, etc.
Este manual lo he dedicado, para que aprendamos a conocer el lenguaje
C#, lenguaje que forma parte de la plataforma .NET desarrollado por la
empresa Microsoft.
Les dir, que poco a poco, C# super con creces todas mis expectativas,
pues es un lenguaje moderno, potente, flexible y netamente orientado a objetos.
Todo lo que hecho, lo he probado utilizando los sistemas operativos
Windows XP y Windows Vista, y se darn cuenta inmediatamente que los
cdigos expuestos son sencillos y podrn ser mejorados y optimizados por
ustedes.
Con respecto al desarrollo de este apunte, he dividido al manual; para un
mejor orden y entendimiento, en unidades, y fundamentalmente con una
secuencia de complejidad en aumento que notarn a medida que vayan
avanzando.
Decid empezar con una breve introduccin a la tecnologa .NET,
continu con la programacin en el lenguaje C# propiamente dicha (variables,
decisin, ciclo, funciones, etc.), utilizando la programacin estructura solo con
un fin pedaggico -, y a medida que fui avanzando introduje los conceptos
bsicos de la programacin orientada a objetos para terminar explicando lo
referente a la interfaz visual que provee el software.
Todo comienzo es complejo, ronda ese halo de incertidumbre, les podr
pasar que les cueste creer las excelencias de este lenguaje y de la
programacin orientada a objetos, pero tengan confianza, que a medida que
uno se involucra en el aprendizaje, le dedique horas de prctica, lo ir
entendiendo, y formar parte de un conjunto de herramientas mentales para
proponer soluciones informticas de calidad.
Por cada problema a resolver que nos surja, vamos a tener que analizar,
disear y programar todo lo que una aplicacin necesita para llegar a la
solucin solicitada, esto ya auspicia un trabajo arduo pero tambin un desafo
personal que debemos aceptar.
Mi consejo, es que tengan un poco de paciencia. Cuando empecemos a
confeccionar pequeos programas para consola y ms adelante a desarrollar
aplicaciones con entorno grafico bajo Windows, vers lo til que fue haber
aprendido a programar sentencia por sentencia en consola para crear
pequeos programas, funciones, clases, etc.
Hay que tener en cuenta que los objetos ms utilizados para el desarrollo
de aplicaciones, ya fueron desarrollados por Microsoft (ventanas, botones,
cajas de texto, cuadros de dilogo, etc.) por lo tanto solamente tendremos que

.NET para Docentes y Alumnos. Programando en C#

aplicarles bloques de cdigo con un mnimo esfuerzo, para obtener los


resultado requeridos para cada aplicacin.
He dejado para el final el desarrollo de aplicaciones bajo Windows,
creyendo que hubiese sido complicado que comprendan este lenguaje sin el
conocimiento previo resumido en el prrafo anterior.
Ha llegado el momento de comenzar a aprender, espero que lo disfruten
como yo lo hecho al escribir este manual.

.NET para Docentes y Alumnos. Programando en C#

Conceptos
fundamentales de C#.

.NET para Docentes y Alumnos. Programando en C#

ndice
Unidades
Unidad 1

Pagina
6

Introduccin al .NET
Unidad 2

15

Elementos bsicos de un programa en C#


Unidad 3

36

Toma de Decisiones
Unidad 4

52

Los Ciclos
Unidad 5

68

Las funciones y los mtodos


Unidad 6

90

Los Arreglos
Unidad 7

Las Colecciones

108

.NET para Docentes y Alumnos. Programando en C#

Unidad 1
Introduccin al .NET y C#.

Tiempo Estimado: 60 minutos

Programar bajo Windows era una tarea realmente compleja y difcil, pues
requera un alto grado de especializacin. Hoy en da existen varios framework,
desarrollados por diferentes empresas que se hacen valer en el mercado
informtico, dando cada vez ms y mejores prestaciones, provocando que
encuentren adeptos y fanticos de los mismos.
Entre las empresas ms importantes que han estado desarrollando
lenguajes para desarrollo de sistemas, nos encontramos con las compaas de
renombre como Sun con su lenguaje Java, y Microsoft con .NET.
El lenguaje que vamos a utilizar este curso, va ser uno de los que provee
.Net, denominado C#.
El primer componente que debemos conocer del .NET, es el CLR
(common lenguaje runtime), este es un programa que lee lnea a lnea y
ejecuta los programas que iremos creando.
Cuando programemos en C# el programa fuente generado por el
programador, se compilar en un modulo denominado assenbly, que contiene
el programa escrito en CIL (lenguaje intermedio para ser ejecutado por el
runtime), gracias al assenbly y el runtime el .NET nos permite tener una gran
flexibilidad y que las aplicaciones sean multiplataforma.
El .NET posee un CLS (especificaciones comunes de lenguaje), cuyo
fin es el de permitir utilizar diferentes lenguajes de programacin, siempre
cuando se posean especificaciones especficas, para poder interactuar con el
runtime.
Para empezar a trabajar, deberemos instalar el .NET es vuestras
computadoras. En caso no tener una versin comercial como el .Net Visual
Studio 2005, 2008 o 2010, pueden bajarse de la pgina web de Microsoft, la
versin express que es totalmente gratuita (solo debern registrase dentro de
los 30 das, luego de haberla instalada). Actualmente ya est la versin 2010
express esperndolos, lista para ser bajada.

.NET para Docentes y Alumnos. Programando en C#

Vamos ya, a confeccionar nuestra primera aplicacin.


Ejecutemos el .NET y nos aparecer la siguiente ventana.

Luego accedan al men, y en la parte superior seleccionen con el mouse


o el teclado: Archivo, Nuevo proyecto y aplicacin de consola.
Un nueva ventana se presentar ante la vista de ustedes, indicndole la
posibilidad de ponerle un nombre y una ubicacin a la aplicacin. Le he puesto
como nombre a la aplicacin ejemplo1 y la ubicacin del mismo es en una
carpeta que debemos crear; por ejemplo, c:/cursonet/ejemplos, esto ser
fundamental para llevar un orden de lo que iremos trabajando y ademas facil de
ubicar a la hora de buscar un programa.
Luego presionen el botn de Aceptar, para continuar con la aplicacin.

.NET para Docentes y Alumnos. Programando en C#

Luego de los pasos anteriores, veremos una nueva ventana dividida en


varias reas, adems de una estructura ya conformada con varias lneas de
programacin proporcionada por el IDE (entorno de desarrollo integrado).
Y ya se estarn preguntando que es todo esto.
Dadme un poco de tiempo!, y a medida que avancemos con el curso, les
ir explicando lnea por lnea; por ahora agreguemos una sola lnea a nuestro
ejemplo1.
La lnea que debemos agregar dentro de la funcin principal llamada
Main() - a ejemplo1, es la siguiente:
System.Console.WriteLine("Hola Mundo");
C# cuenta con IntelliSense, a medida que vamos tipeando nos aparecer
una ventana con la lista de los miembros de esa clase, al encontrarlo pueden
presionar Enter y se dispone el miembro seleccionado en el editor.

El editor cuenta con el resaltado de sintaxis por colores, indicando azul


para las palabras claves, los comentarios con verde, rojo las cadenas de
caracteres y con negro el resto del texto.
Esta lnea nos permitir mostrar por consola un mensaje. Es muy
importante respetar las palabras claves, maysculas y minsculas y el punto y
coma al final de cada lnea.
Nuestro cdigo, quedar de la siguiente manera:
using System;
using System.Collections.Generic;

.NET para Docentes y Alumnos. Programando en C#

using System.Text;
namespace ejemplo1
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hola Mundo");
}
}
}
Para poder probarlo, deberemos acceder al tem del Men, Depurar y
luego iniciar sin depurar. Deberamos ver el siguiente resultado:

Ya funciona, por lo tanto lo podemos guardar, para eso debemos ir al


Men, Guardar todo.
Solo a pedido de vuestra curiosidad, veamos en detalle algunas de las
lneas del cdigo dispuesto. Las primeras lneas comienzan con la palabra
Using, esta es una directiva que ayuda al compilador para ubicar una clase
que se utiliza en esta aplicacin. El lenguaje C#, provee un conjunto de clases
que se conoce con el nombre de Biblioteca de Clases del .NET Framework
(FCL), donde podremos encontrar una cantidad de herramientas ya definidas
para nuestros sistemas.
Otra lnea que debemos tener en cuenta es class Program, en ella se
declara la clase (dentro de una clase ingresaremos las variables y los mtodos
o funciones de nuestra aplicacin). Presten atencin que luego de la instruccin
se abre una llave, indicando el comienzo de la clase y al final debe existir una
llave de cierre.
La lnea siguiente es static void Main(string[] args), esta es
la funcion principal Main(), debe estar presente para que una aplicacin
funcione, tambin se abre y cierra con llaves. Luego de la palabra reservada
Main siguen un par de parntesis, esto nos indica que es un mtodo.
Para finalizar la sentencia System.Console.WriteLine("Hola
Mundo"); , se denomina instruccin y es la que realizar la tarea de mostrar
por consola el mensaje hola Mundo. Que aparezca por pantalla el mensaje o
que uno puede ingresar alguno, se debe a una clase denominada Console,
palabra tambien reservada dentro de nuestra instruccin, luego de Console y

.NET para Docentes y Alumnos. Programando en C#

separado por un punto vemos WriteLine, este es el mtodo por el cual nos
muestra informacin por consola. El mensaje se encuentra encerrado entre
parentesis y comillas, este se conoce como una cadena de caracteres, literal o
simplemente cadena.

Veamos otro ejemplo para esta unidad. El objetivo ser mostrar


un mensaje en varias lineas, pero solo con una instruccin.

Vamos a ser uso de 2 caracteres, la barra diagonal inversa


(\) y la letra n. la barra \ se denomina carcter de escape y sirve para indicarle;
combinada con la letra n, que imprima y continue en la linea siguiente.
using System;
using System.Collections.Generic;
using System.Text;
namespace ejemplomustraenvariaslineas
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenidos \nal mundo de \nla
Programacion!");
}
}
}

Luego de ejecutar el programa, vemos lo siguiente:

Existen otros caracteres de escape, lo dispongo en al siguiente tabla:


Secuenci
a de
Escape
\n
\t
\r
\\
\

Descripcin
Posiciona el curso en la linea siguiente.
Desplaza al cursor a la primera tabulacion horizontal.
Posiciona el curso al inicio sin saltar a la linea siguiente.
Se utiliza para colocar un barra inversa en la cadena.
Lo utilizamos para colocar la doble comilla en la cadena.

.NET para Docentes y Alumnos. Programando en C#

Cuando damos formato a una cadena, haremos uso de los elementos de


formato explicados anteriormente, ellos van entre llaves y un valor que indica la
posicin del argumento a mostrar dentro de una lista de argumentos. Empieza
en 0 (cero). Por ejemplo:
Console.WriteLine("{0}\n{1}","Bienvenidos al","Mundo de la
programacin!");

El resultado se ve del siguiente modo:

Ya hemos terminado la primera unidad. El objetivo era que


podamos dar el primer paso para empezar a programar en C#. Y para eso era
fundamental tener el .NET, instalarlo y saber iniciarlo. Luego agregamos una
sola lnea en el editor ya provisto por el .NET. Y para finalizar aprendimos a
ejecutarlo, para que nos muestre el mensaje programado por consola.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 1.

1. Crear un nuevo proyecto que muestre por consola, nuestro Nombre y


Apellido.
2. Quitar al ejemplo anterior un punto y coma y ver el error que se genera.
3. Realizar un programa que muestra la informacin concerniente a
nuestra entidad educativa o empresa laboral. Disponer la informacin
en varios renglones.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 1.

1. Cdigo de la Aplicacin.
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0}", "Gustavo E. Romay");
}
}
}

Visualiza lo siguiente:

2. Cdigo del Problema anterior y he sacado el punto y coma de la


instruccin donde se imprime por consola.
Console.WriteLine("{0}", "Gustavo E. Romay")

Lista de errores.

3. el cdigo es el siguiente:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program

.NET para Docentes y Alumnos. Programando en C#

{
static void Main(string[] args)
{
Console.WriteLine("{0}\n{1}", "SG", "Sistemas de
Informacin.");
Console.WriteLine("\n");
Console.WriteLine("{0}\n{1}\n{2}", "Av. Boedo 640",
"Ciudad Autonoma de Buenos Aires.","Argentina");
Console.WriteLine("\n \n");
Console.WriteLine("{0}\n{1}", "II/2009","*******");
}
}
}

Visualiza lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

Unidad 2
Los elementos bsicos de un
Programa en C#.

Tiempo estimado: 120 minutos

Comencemos con la segunda unidad, presentando los elementos bsicos


que conformarn un programa hecho en el lenguaje C#.
Para comunicarnos con nuestra computadora, vamos a necesitar un
lenguaje de programacin, y como he dicho, este ser el C#, poderoso y
sencillo de aprender.
No solo basta saber las instrucciones de un lenguaje de programacin
para crear una aplicacin, adems, deberemos aprender algn mtodo o forma
de programacin, es decir, los pasos que deber cumplir la PC para resolver
algn problema que se nos ha planteado.
Esta lista de pasos que lleva a un determinado fin o solucin, nos va a
generar un Algoritmo. Un Algoritmo podemos definirlo como, una lista bien
definida, ordenada y finita de operaciones que nos permitir hallar la solucin a
un problema determinado. Posee un estado inicial, pasos sucesivos y bien
definidos para llegar a un estado final, obteniendo la solucin necesaria para
nuestra aplicacin.

Veamos un ejemplo.

Propongo realizar un programa, que nos muestre los pasos a


seguir para organizar un baile con nuestros amigos.
Los pasos a seguir que propongo son: fijar el da y el horario, realizar las
invitaciones, repartir las invitaciones, recibir las confirmaciones de los invitados,
encargar los sndwich, comprar las bebidas y seleccionar la mejor msica.
Podemos ya editarlo.

.NET para Docentes y Alumnos. Programando en C#

using System;
using System.Collections.Generic;
using System.Text;
namespace organizacionbaile
{
class Program
{
// funcion principal del programa.
// aqui comienza la aplicacion.
static void Main(string[] args)
{
System.Console.WriteLine("BAILE");
System.Console.WriteLine("fijar el da y el horario");
System.Console.WriteLine("Realizar las invitaciones");
System.Console.WriteLine("Repartir las invitaciones");
System.Console.WriteLine("Recibir las confirmaciones de
los invitados");
System.Console.WriteLine("Encargar los sndwich");
System.Console.WriteLine("Comprar las bebidas");
System.Console.WriteLine("Seleccionar la mejor msica");
/* si me olvide de algo ustedes
* lo pueden agregar */;
}
}
}

Voy a comentar lo que he hecho, en base a la estructura del programa


que estamos trabajando.
En C# existen varias secciones en el programa, ellas cumplen
determinadas funciones. La ms importante y principal es la funcin Main(),
pues es invocada por el sistema operativo para que inicie nuestra aplicacin.
En nuestro programa he puestos algunos comentarios, eso significa, que
no ser tomado en cuenta por nuestro compilador. Si el comentario es de solo
una lnea bastar utilizar la doble barra // seguido del comentario, si en cambio
queremos realizar un cometario de varios renglones, deberemos abrir con barra
y asterisco /* seguir con el comentario y cerrar con asterisco y barra

*/.

Veamos algunos ejemplos de comentarios:


// declaracion e inicio de variables.

/* Sistema desarrollado por GER


Calculo del promedio de notas de alumnos.*/

Ya hemos hablado de Main(), en ella hemos dispuesto un bloque de


cdigo definido entre llaves {}. Todo lo que este entre llaves va a pertenecer a
la funcin principal Main(), fuera de ella pertenecer a otra funcin u otra

.NET para Docentes y Alumnos. Programando en C#

caracterstica del programa que iremos viendo. En nuestro ejemplo


encontramos los pasos del algoritmo. Cada paso lo denominaremos Sentencia.
Una sentencia es una instruccin que se ejecutar cuando sea invocada.
Notemos que en la estructura existe una clase denominada Class
Program, que tambin tiene un bloque de cdigo cerrado por llaves, esta
contiene a la funcin principal Main().
Adentrndonos en C#, puedo decir, que este es un lenguaje orientado a
Objetos, por lo tanto ser necesario definir una clase para luego crear nuestro
programa. La clase Class Program, ya viene definida cuando creamos un
nuevo proyecto, pero el objetivo en poco tiempo, es que nosotros empecemos a
armar nuestras propias clases.
Antes hemos definido el namespace denominado por nosotros con el
nombre de organizacionbaile, aqu se dispone de otro bloque de cdigo y la
clase se encuentra dentro de l, ya volveremos a profundizar sobre estos
temas, por ahora he querido hacer notar la importancia de estas secciones que
conforman un programa.
Continuando con las sentencias, vemos que esta invoca a un mtodo
denominado WriteLine(). Un mtodo es similar a una funcin, por lo tanto
deben pertenecer a una clase, en este caso la clase se llama Console.
En la clase Console, encontraremos una cantidad de mtodos
necesarios para trabajar por consola, puedo enumerar algunos de ellos, como
el de mostrar mensajes, ingresar datos, etc.
Para invocarlos lo haremos se la siguiente manera:
Console.WriteLine(HOLA);
A los mtodos se les pasa informacin para que puedan trabajar, esta
informacin se dispone entre parntesis y la llamaremos parmetro. Adems
cada mtodo necesita de un tipo de dato, en el caso de WriteLine (), le hace
falta un parmetro de tipo cadena es decir conformado por letras, nmeros o
caracteres especiales encerrado entre comillas dobles, en este caso la cadena
es HOLA.
Para finalizar cada sentencia se deber en forma obligatoria, disponer de
un punto y coma ;. Esto es, de suma importancia, pues el compilador de C#;
gracias a este smbolo, reconocer la finalizacin de la sentencia, la ejecutar y
continuar con la instruccin siguiente.
Una vez que ejecutemos el programa, veremos lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

Errores en los programas.


Una parte importante de la programacin, es poder reconocer los errores
que irn apareciendo; a medida que vayamos programando, con el fin de
corregirlo y que el programa trabaje correctamente.
Tendremos 2 tipos de errores, errores de sintaxis y los errores de
lgica.
Los errores de sintaxis una vez que el compilador los detecte - se
dispondrn en una ventana en la parte inferior, con una descripcin del mismo
indicando la lnea en que este se haya producido, por lo tanto nos limitaremos a
corregirlos.
Siempre empecemos a corregir de arriba hacia abajo, pues puede ocurrir
que los errores estn encadenados con los de las primeras sentencias y los que
siguen no posean error alguno de sintaxis.
Los errores de lgica, son ms difciles de corregir, pues, ellos son cuando
no tenemos errores de sintaxis y sin embargo nuestro programa no realiza lo
que deseamos. Para este caso se requiere un buen anlisis del problema, y
corregir el algoritmo que se ha adoptado para la aplicacin que estemos
desarrollando.
Para probar el tema de errores y ver lo que sucede, he sacado unas
comillas correspondiente a la cadena de la ltima sentencia, inmediatamente
nos mostrar el error de sintaxis que esto ha generado.
Observemos, que a pesar de ser un nico error, aparecen una cantidad de
lneas; casi tantas como las sentencias del bloque de instrucciones que
contiene el cdigo.

.NET para Docentes y Alumnos. Programando en C#

Deben probarlo, saquen unas comillas y vean que pasa.

Luego corrijamos los errores en mi caso haba sacado la comillas de la


ltima sentencia - , vuelvan a compilar y todo se ha solucionado y funciona
correctamente.

Diferencia entre el mtodo Write() y el WriteLine().


Hemos visto, que en nuestra aplicacin, el mtodo WriteLine() nos ha
permitido disponer de un mensaje en la consola, y luego se ha producido un
salto de lnea. Si en cambio, hubisemos utilizado el mtodo Write(), este, una
vez que dispone el mensaje, no produce un salto de lnea, por lo tanto, si a
continuacin se dispone de otro mensaje, se ubicar a su lado.
Vemoslo con un ejemplo:

Mostrar mi nombre y la actividad que desempeo.


using System;
using System.Collections.Generic;
using System.Text;
namespace writeywriteline
{
class Program
{
static void Main(string[] args)
{

.NET para Docentes y Alumnos. Programando en C#

System.Console.Write("Mi nombre es: ");


System.Console.WriteLine("GUSTAVO");
System.Console.Write("Actividad que desempeo: ");
System.Console.WriteLine("DOCENTE");
}
}
}

Por consola vemos lo siguiente:

Las variables en C#.


Una computadora para trabajar necesita poder almacenar y manipular
informacin, y sin duda, esta ser de diferentes tipos. Entendindose por tipo si
es un nombre de una persona, en este caso el tipo ser una cadena, un sueldo
de un empleado ser numrico, la fecha de cumpleaos, un tipo fecha, etc.
Para el manejo de la informacin; a utilizar en nuestros sistemas, lo
haremos a travs del uso de las variables.
Las variables funcionan en forma similar a una caja de almacenaje. Para
poder acceder a estas cajas o variables, deberemos ponerle un nombre o
etiqueta, cuyo fin es la de poder identificarlas cuando las necesitemos.
En C#, para poder hacer uso de una variable deberemos declararla, es
decir indicar, el nombre de la misma y el tipo que le corresponde. Para esto,
les dar las siguientes recomendaciones:

Los nombres de las variables deben empezar con alguna letra.


Puede contener nmeros, pero no al inicio del nombre.
No pueden llevar signos salvo el guion abajo _.
No pueden llevar acento.
Recomiendo que se escriban en minsculas, para diferenciar de las
clases, funciones, etc.
C# es sensible a las maysculas y minsculas por lo tanto una
variable llamada costo es diferente a otra llamada Costo.
Con respecto al tipo de variable a requerir y recordando que se debe
utilizar el tipo de variable especfica, nos va a permitir ahorrar memoria y
optimizar la informacin que utilizaremos, presento la siguiente tabla de tipos de
variables ms comunes:

.NET para Docentes y Alumnos. Programando en C#

Tipo
Bool
Byte
Char
Float
Int
String

Informacin que guarda


Variable booleana. Guarda solo verdadero o falso (true
y false).
Guarda un byte de informacin, es decir un valor
entero entre 0 y 255.
Guarda un carcter (character) de tipo Unicode.
Guarda valores numricos decimales.
Este tipo, guarda valores numricos de tipo entero.
Se utiliza para guardar valores de tipo cadena.

Los pasos a seguir ser el de declarar y luego inicializar las variables,


para que puedan ser usadas en las aplicaciones. Para declarar la variable,
basta con poner el tipo y luego el nombre de la misma. No deben olvidarse de
terminar con un punto y coma.
Les presento algunos ejemplos.
Int edad;
Float sueldo;
String nombre;
Int contador,cantidad;

Al inicializar las variables, tambin podemos indicarle un valor por primera


vez. Lo realizaremos, utilizando un operador de asignacin el signo igual =
y a continuacin el valor asignado.
Ejemplos:
edad=0;
sueldo=0.00f;
nombre=patricia;
contador=0;
cantidad=50;

Por comodidad podemos declarar e inicializar las variables en una sola


sentencia, por ejemplo:
String nombre=patricia;

Si quisiramos mostrar los valores de las variables en la consola,


podemos utilizar los mtodos Write() y WriteLine(), con la posibilidad de
poder definir una cadena de formato y una lista de variables.
En la cadena de formato indicaremos el mensaje, y la posicin de la
variable en el mismo. La posicin de la variable est indicada por llaves {} y
un ndice que indica la posicin empezando por el valor 0, quedara as {0}, {1},
en la lista de variables. En la lista, dispondremos de las variables que queremos
mostrar.

.NET para Docentes y Alumnos. Programando en C#

Programemos un ejemplo.

Realizar un programa que Indique el precio de lista y el de


costo de un artculo.
using System;
using System.Collections.Generic;
using System.Text;
namespace declarainiciavariables
{
class Program
{
static void Main(string[] args)
{
string producto = "camisa";
float precio = 50.00f;
float costo = 30.00f;
Console.WriteLine("El articulo {0} tiene un precio al
publico de {1}$ y su costo {2}$", producto, precio, costo);
}
}
}

Luego de ser depurado, debera verse as:

Las operaciones aritmticas.


Ya que hemos aprendido y sabemos como guardar la informacin,
debemos aprender la manera de poder manipularla. Comencemos con las
operaciones aritmticas bsicas como, la suma, la resta, la multiplicacin, la
divisin, etc. Cada operacin aritmtica tiene su propio operador, que es el
encargado de procesar los valores, en un determinado clculo y obtener un
resultado final numrico.
Operador

Descripcin
Asignacin.

Suma valores.

Resta de valores.

Ejemplo
Int a=10;
Int b=5;
Float resultado =0.00f;
resultado=a+b+5;
En resultado se asignar 20.
resultado=a-b;
En resultado se asignar 5.

.NET para Docentes y Alumnos. Programando en C#

*
/
%

Multiplicacin de valores.

resultado=a*b;
En resultado se asignar 50.
Divisin decimal de valores.
resultado=a/b;
En resultado se asignar 2.
Mdulo de la divisin, nos resultado = a%b;
provee el resto de la misma.
En resultado se asignar 0.

Antes de comenzar con un ejemplo de operaciones aritmticas, es


importante destacar la precedencia de los operadores dentro de operaciones
aritmticas complejas.
En el caso de esta expresin total = 2 * 5 6, podemos inferir que el
resultado sea 4 (si hacemos 2 * 5 y luego le restamos 6) o -2 (si hacemos 5
menos 6 por 2), para salvar lo visto, el orden de operacin que indica el
compilador del lenguaje C# es el siguiente:
1

Y en caso de querer cambiar el orden de ejecucin de las operaciones,


tendremos que utilizar el parntesis (). Este nos ayudar a crear las
expresiones aritmticas que necesitemos para resolver nuestros clculos. Pues
el parntesis precede a todos los dems operadores.
Observen las expresiones y sus resultados que he dispuesto como
ejemplos.
Resultado= 4 * 3 + 10 = 22
Resultado= 4 * (3 + 10) = 42

Ingresemos el nuevo ejemplo, codificando diferentes casos de


operaciones aritmticas:
using System;
using System.Collections.Generic;
using System.Text;
namespace operacionesaritmeticas
{
class Program
{
static void Main(string[] args)
{
// declaracion e inicio de variables.
float a, b, resultado;
a = 10;
b = 5;
resultado = 0;
//suma
resultado=a+b;
Console.WriteLine("la suma de 10 + 5 es {0}", resultado);

.NET para Docentes y Alumnos. Programando en C#

//resta
resultado = a - b;
Console.WriteLine("la resta de 10 - 5 es {0}",
resultado);
//multiplicacion
resultado = a * b;
Console.WriteLine("la multiplicacion de 10 * 5 es {0}",
resultado);
//division
resultado = a / b;
Console.WriteLine("la division de 10 / 5 es {0}",
resultado);
//modulo
resultado = a % b;
Console.WriteLine("El modulo entre 10 % 5 es {0}",
resultado);
}
}
}

Debera verse de la siguiente manera por consola:

El ingreso de Datos, el mtodo ReadLine()


Hasta el momento, los valores que hemos utilizados estaban en el cdigo
del programa, a partir de ahora, con el mtodo ReadLine(), el usuario podr
ingresar el dato que desee para realizar las operaciones que correspondan.
No hace falta incluir ningn parmetro en sus parntesis, si debern tener
en cuenta, que siempre devuelve una cadena de caracteres. Esta cadena se
deber inmediatamente asignar a una variable creada por nosotros, adems de
convertirla en el tipo de dato necesaria para poder operar, caso contrario, se
perder el valor ingresado o aparece un mensaje de error.
Su estructura es la siguiente:
nombre = Console.ReadLine();

Veamos un ejemplo para ver como funciona.

.NET para Docentes y Alumnos. Programando en C#

En este ejemplo, podemos ingresar nuestro nombre por


teclado, y luego visualizarlo por consola, junto con mensaje adicional.
using System;
using System.Collections.Generic;
using System.Text;
namespace metodoreadline
{
class Program
{
static void Main(string[] args)
{
string nombre = "";
Console.Write("Escriba su nombre: ");
nombre = Console.ReadLine();
Console.WriteLine("Hola {0} como esta usted.", nombre);
}
}
}

Visualizacin por consola:

Conversin del tipo de Variables.


Tal vez, ya hemos notado que el mtodo ReadLine(), nos presenta una
limitacin, pues, solo nos devuelve una cadena de caracteres, no
permitindonos realizar operaciones de tipo aritmticas. Para salvar esta
situacin, deberemos convertir la cadena ingresada a un tipo de dato numrico.
C#, nos provee de una clase, llamada Convert. Y para ser uso de la
misma; deber referirme a la conversin entre diferentes tipos de variables, al
momento de programar, utilizaremos para esta tarea los mtodos que detallo a
continuacin:
Clase: Convert
Mtodo
ToInt32()
ToSingle()
ToBoolean()

Conversin que realiza


Convierte de string a int.
Convierte de string a Float.
Convierte de string a Booleana

.NET para Docentes y Alumnos. Programando en C#

Un ejemplo del uso de esta clase Convert y utilizando el mtodo ToInt32,


es el siguiente:
a=Convert.ToInt32(entrada);

Ahora vemoslo, en un ejemplo completo:

Realizar un programa, que incremente, el sueldo de un


empleado, en funcin de un porcentaje dado.
Se deber ingresar los datos del empleado (nombre, sueldo y porcentaje
de aumento) y mostrarlos por consola.
using System;
using System.Collections.Generic;
using System.Text;
namespace conversionvariables
{
class Program
{
static void Main(string[] args)
{
string entrada = "";
string nombre = "";
float sueldo = 0.00f;
float porcentajeaumento = 0.00f;
Console.Write("Escriba el nombre del empleado: ");
nombre = Console.ReadLine();
Console.Write("Ingrese el Sueldo: ");
entrada = Console.ReadLine();
sueldo = Convert.ToSingle(entrada);
Console.Write("Ingrese el Porcentaje de Aumento: ");
entrada = Console.ReadLine();
porcentajeaumento = Convert.ToSingle(entrada);
sueldo = sueldo * (1 + (porcentajeaumento / 100));
Console.WriteLine("El Empleado {0} debera cobrar {1} .",
nombre,sueldo);
}
}
}

Una vez que lo hemos ejecutado el programa, su visualizacin es la


siguiente:

.NET para Docentes y Alumnos. Programando en C#

Metodologa
computadora.

para

la

resolucin

de

problemas

por

El mtodo ms adecuado, para resolver problemas utilizando el lenguaje


C# de .Net, es el lenguaje Orientado a Objetos, sin embargo utilizaremos al
inicio de este manual, la metodologa estructurada, con el objetivo de obtener
conocimientos de los mtodos que vamos a usar y mayor experiencia en la
resolucin de problemas, y luego con estos buenos antecedentes, encarar la
Orientacin a Objetos con mayor seguridad.
La metodologa estructurada, se basa en el concepto de la subdivisin del
problema a resolver. Es decir que tomamos el problema general y lo dividimos
en problemas ms pequeos o sub-problemas, hasta que lo podamos resolver
directamente.
Los pasos que debemos seguir son:

Entender el problema.
Reconocer los datos que estarn en juego.
Armar el algoritmo.
Pasar el cdigo con el lenguaje que estemos utilizando a la
computadora.
Ejecutarlo.
En caso de error, corregir.

Empecemos por resolver un problema sencillo y fcil de entender.

Confeccionemos un programa, para el clculo del rea y del


permetro de un rectngulo.

.NET para Docentes y Alumnos. Programando en C#

La primera etapa era entender el problema por lo tanto, debemos


abocarnos a la tarea de entender el problema, y luego, ya lo podemos
subdividir.
Luego de pensar un rato, me ha quedado de la siguiente manera.
Me he ayudado, para visualizar mejor la solucin de este problema, la
utilizacin de una estructura de tipo organigrama, pues se ajusta
perfectamente a nuestro anlisis.

Un organigrama es un modelo abstracto y sistemtico, que


permite obtener una idea uniforme acerca de la estructura formal o problema.
Lo representamos con bloques relacionados de con un orden de importancia de
arriba hacia abajo y de izquierda a derecha.

Pedir
Datos

Calculo de Area y
Perimetro del
Rectangulo
Calcular
Calcular
Perimetr
Area
o

Mostrar
Resultad
os

Pedir
ancho

Mostrar
Area

Pedir alto

Mostrar
Perimetr
o

El paso siguiente, es el de reconocer los datos para nuestro ejemplo, a


continuacin los detallo:
Nombre de la variable
area
perimetro
ancho
alto
valor

Tipo
Float
Float
Float
Float
String

Inicializacin
0.0
0.0
1.0
1.0

El paso que sigue, es el del armado del algoritmo que se deduce del
anlisis realizado con el organigrama. Para ello utilizaremos la siguiente
simbologa o pseudocdigo:
Inicio
Pedir ancho

.NET para Docentes y Alumnos. Programando en C#

Pedir alto
area = ancho*alto
perimetro = 2*(ancho*alto)
mostrar area
mostrar permetro
Fin

Lo vemos en un lenguaje o idioma, donde solo destacamos las


directivas que debern realizarse.
Y ahora ya podemos crear el cdigo de nuestra aplicacin.

Realizar un programa, donde le usuario ingrese el alto y


ancho de un rectngulo, y luego, determine y muestre el resultado de su rea y
permetro.
using System;
using System.Collections.Generic;
using System.Text;
namespace areaperimetrorectangulo
{
class Program
{
static void Main(string[] args)
{
// declaramos las variales que necesitamos
float area = 0.0f;
float perimetro = 0.0f;
float ancho = 0.0f;
float alto = 1.0f;
string valor = "";
Console.Write("Ingrese el Ancho: ");
valor = Console.ReadLine();
ancho = Convert.ToSingle(valor);
Console.Write("Ingrese el Alto: ");
valor = Console.ReadLine();
alto = Convert.ToSingle(valor);
area = ancho * alto;
perimetro = 2 * (alto + ancho);
Console.WriteLine("El Area es {0}", area);
Console.WriteLine("El Perimetro es {0}", perimetro);
}
}
}

En la consola vemos:

.NET para Docentes y Alumnos. Programando en C#

En resumen, para programar una computadora,


necesitaremos conocer un lenguaje de programacin y una metodologa
correcta para la resolucin de los problemas que se nos van a presentar. En
nuestro caso el lenguaje C# es el indicado y como metodologa estamos viendo
la programacin estructura para luego; y sin problemas, adoptar la
programacin orientada a objetos.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 2.

1. Realizar un programa, que calcule la superficie y el permetro de un


crculo. (se sabe que la Superficie= pi * radio al cuadrado y el Permetro
=2 pi * radio). Valor de pi=3,14
2. Hacer un programa, que convierta centmetros en pulgadas. (1 pulgada =
2,5 centmetros).
3. Generar una aplicacin, que convierta la moneda pesos en dlares. El
usuario deber ingresar el monto en pesos y la cotizacin del da del dlar
(u$s) y por consola el sistema deber mostrar la conversin.
4. Una empresa necesita un programa que calcule el sueldo neto de un
empleado. Para esto, el usuario deber ingresar el nombre del empleado,
el sueldo bruto, el descuento y la bonificacin. Para finalizar se deber
mostrar el resultado por la consola.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 2.
1. Cdigo fuente de la resolucin del problema nmero 1 es:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
// declaracion e inicializacion de variables.
float pi = 3.14f;
float radio = 0.0f;
float superficie = 0.0f;
float perimetro = 0.0f;
string cadena = "";
Console.WriteLine("Clculo de la superficie y Primetro
de un Crculo.");
Console.Write("\n\nIngrese el Radio del Crculo: ");
cadena = Console.ReadLine();
radio = Convert.ToSingle(cadena);
superficie = pi * (radio * radio);
perimetro = 2 * pi * radio;
Console.WriteLine("\n La superficie es: {0} \n El
Primetro es: {1}",superficie,perimetro);
}
}
}

La visualizacin por consola es:

2. La solucin a este problema, es la siguiente:


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

.NET para Docentes y Alumnos. Programando en C#

namespace solucion2
{
class Program
{
static void Main(string[] args)
{
// declaracion e inicializacion de variables
float medidacentimetros = 0.0f;
float medidapulgadas = 0.0f;
float pulgada = 2.5f;
string cadena = "";
Console.WriteLine("Conversin de Centmetros a
Pulgadas.");
Console.Write("\n\n Ingrese los centimetros: ");
cadena = Console.ReadLine();
medidacentimetros = Convert.ToSingle(cadena);
medidapulgadas = medidacentimetros / pulgada;
Console.WriteLine("\n\n {0} centimetros son {1}
pulgadas.",medidacentimetros,medidapulgadas);
}
}
}

Su visualizacin debera quedar as:

3. El cdigo del tercer problema a resolver es el siguiente:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program
{
static void Main(string[] args)
{
// declaracion e inicialzacion de la variables
float pesos = 0.0f;
float dolares = 0.0f;
float cotizacion = 0.0f;
string cadena = "";
Console.WriteLine("Conversin de Peso ($) a Dolar
(u$s).");
Console.Write("\n\n Ingrese la Cotizacion del Dolar: ");
cadena = Console.ReadLine();
cotizacion = Convert.ToSingle(cadena);

.NET para Docentes y Alumnos. Programando en C#

Console.Write("Ingrese la Cantidad en Pesos: ");


cadena = Console.ReadLine();
pesos= Convert.ToSingle(cadena);
dolares = pesos / cotizacion;
Console.WriteLine("\n{0} Pesos son {1}
dolares.",pesos,dolares);
}
}
}

Por consola se debe ver lo siguiente:

4. La respuesta al ltimo problema es la siguiente:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion4
{
class Program
{
static void Main(string[] args)
{
// declaracion e inicialzacion de la variables
string nombre = "";
float sueldobruto = 0.0f;
float descuento = 0.0f;
float bonificacion = 0.0f;
float sueldoneto = 0.0f;
string cadena = "";
Console.WriteLine("Calculo de un Sueldo Neto de un
Empleado.");
Console.Write("\n\n Ingrese el Nombre del Empleado: ");
cadena = Console.ReadLine();
nombre = cadena;
Console.Write("\nIngrese el sueldo Bruto: ");
cadena = Console.ReadLine();
sueldobruto= Convert.ToSingle(cadena);
Console.Write("\nIngrese la Bonificacion: ");
cadena = Console.ReadLine();
bonificacion = Convert.ToSingle(cadena);
Console.Write("\nIngrese el Descuento: ");
cadena = Console.ReadLine();
descuento = Convert.ToSingle(cadena);
sueldoneto = sueldobruto+bonificacion-descuento;
Console.Write("\n\n*******************************");
Console.WriteLine("\n Empleado: {0}\n Sueldo Neto a
cobrar: {1}.",nombre,sueldoneto);

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("*******************************");
}
}
}

Por consola:

.NET para Docentes y Alumnos. Programando en C#

Unidad 3
Toma de Decisiones.

Tiempo estimado: 120 minutos

No todos los problemas que tengamos que resolver, podremos utilizar una
solucin del tipo lineal. A veces, el programa deber tomar una decisin, frente
a una o ms alternativas, y luego ejecutar una o varias sentencias de la opcin
que se ha elegido.
Por ejemplo, si hace mucho frio nos podemos poner una campera
abrigada para salir a nuestro trabajo, otra opcin podra ser ponernos un buzo.
Es decir, que necesitamos que exista una condicin para poder tomar una
decisin. En el lenguaje C#, se provee la posibilidad de crear expresiones
relacionales y expresiones lgicas, que se evaluarn, y en funcin del
resultado de esa evaluacin, se llevaran a cabo ciertas sentencias o no, en
funcin del algoritmo que conforma nuestro programa.

Operadores Relacionales
A los operadores relacionales, los necesitaremos para expresar la
relacin que existen entre dos valores. Estos valores, pueden ser expresados
en forma explcita (Ejemplo: 5, 12.4, -3) o implcita, por medio de variable
(Ejemplo: nombre, sueldo). Las expresiones que se conforman con los valores y
los operadores relacionales se evalan, y nos dan un resultado, este puede ser
Verdadero o Falso (True o False).
Los operadores relaciones son:
Signo

==

Operador
Igualdad

!=

No igual

>

Mayor

<

Menor

Ejemplo
5==5
4==(1-5)
6!=5
8!=(2*4)
6>-1
(2-10)>11
(2-3)<7
10<2

resultado
True
False
True
False
True
False
True
False

.NET para Docentes y Alumnos. Programando en C#

>=

Mayor e igual

<=

Menor e igual

(10*2)>=20
12>=20
18<=(40*3)
16<=5

True
False
True
False

La Decisin (If).
En el lenguaje C#, tenemos un tipo de estructuras, denominadas
selectivas.
Las estructuras selectivas, son aquellas que nos permiten seleccionar, un
camino, entre 2 o ms caminos posibles. Cada uno de estos caminos, puede
poseer o no sentencias para ser ejecutadas por el compilador del lenguaje. La
seleccin del camino a seguir, se lleva a cabo luego de evaluar una expresin
relacional o una variable y obtener el resultado (verdadero o falso).
Una de las estructuras selectivas que posee C#, es el si condicional,
materializado en la sentencia If(), cuya estructura es la siguiente:
If (expresin)
Sentencia a ejecutar;
En expresin, se presentar las expresiones relacionales, cuyo resultado;
como ya lo he dicho, solo puede ser Verdadero o Falso.
Un ejemplo:
If(valor>5)
Valor=valor*15;
En caso de ser falsa la expresin, se ignorar las sentencias a ejecutar.

Veamos un ejemplo:

Evaluar el ingreso de un nmero, indicando si es positivo o


negativo.
using System;
using System.Collections.Generic;
using System.Text;
namespace positivonegativo
{
class Program
{
static void Main(string[] args)
{
// inicializacion de variables
int numero = 0;

.NET para Docentes y Alumnos. Programando en C#

string valor = "";


Console.Write("Ingrese un Numero: ");
valor = Console.ReadLine();
numero=Convert.ToInt32(valor);
if (numero>=0)
Console.WriteLine("El valor {0} es positivo",numero);
if (numero < 0)
Console.WriteLine("El valor {0} es negativo",
numero);
}
}
}

En este ejemplo he usado 2 decisiones (If), el nmero ingresado por el


usuario, ser evaluado en ambas, pero solo ejecutar las sentencias, donde el
resultado de la evaluacin se considere verdadera (true).
Hasta el momento, solo hemos ejecutado una sola sentencia, si
quisiremos que el compilador ejecute un Bloque de Cdigo (varias
sentencias agrupadas) la estructura sera la siguiente:
If (expresin)
{
Sentencia
Sentencia
Sentencia

Sentencia
}

1;
2;
3;
n;

Un ejemplo para este caso, es el que detallo a continuacin:

Ingresar el sueldo de un empleado, e incrementarlo en un


10%, si este es menor a 1000$.
using System;
using System.Collections.Generic;
using System.Text;
namespace sueldoaumento
// aumento de un 10% para los sueldos menores a 1000$
{
class Program
{
static void Main(string[] args)
{
Double sueldo = 0.00;
string valor = "";
Console.Write("Ingrese el Sueldo de un Empleado:");
valor = Console.ReadLine();
sueldo = Convert.ToDouble(valor);
if (sueldo < 1000)
{
sueldo = sueldo * 1.1;

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("El sueldo Incrementado en un 10%


es {0}", sueldo);
}
}
}
}

El uso del Else (sino)


En los problemas anteriores solo se han ejecutado las sentencias, si la
expresin era verdadera, pero es muy comn frente a una decisin, tener que
realizar alguna tarea si esta es falsa; para esto, ampliamos la sentencia If con el
Else.
Esta es la nueva estructura:
If (expresin)
Sentencia;
else
Sentencia;

En caso de utilizar un Bloque de Cdigo, la estructura se conforma del


siguiente modo.
If (expresin)
{
Sentencia
Sentencia

Sentencia
}
else
{
Sentencia
Sentencia

Sentencia
}

1;
2;
n;

1;
2;
n;

Realizaremos un ejemplo, para cada uno de los casos, con solo una
sentencia y con un bloque de cdigo.

.NET para Docentes y Alumnos. Programando en C#

Para el primer caso con solo una sentencia para ejecutar - , el problema
a resolver es el siguiente:

Ingresar un valor entero, e indicar si es par o impar.


using System;
using System.Collections.Generic;
using System.Text;
namespace paroimpar
{
class Program
{
static void Main(string[] args)
{
int numero = 0;
string valor = "";
Console.Write("ingrese un valor entero:");
valor=Console.ReadLine();
numero = Convert.ToInt32(valor);
// decision - utilizamos el operador de modulo %
if (numero%2==0)
Console.WriteLine("el valor {0} es par", numero);
else
Console.WriteLine("el valor {0} es impar", numero);
}
}
}

Para probar el if else, con un bloque de cdigo, construiremos el


siguiente caso:

Ingresar 2 valores, y obtener el cociente de ambos. (Tener en


cuenta, que no existe en el campo de los nmeros reales, la divisin por 0
(cero)).
using System;
using System.Collections.Generic;
using System.Text;
namespace obtenercociente
{

.NET para Docentes y Alumnos. Programando en C#

class Program
{
static void Main(string[] args)
{
float dividendo = 0.0f;
float divisor = 0.0f;
float cociente = 0.0f;
string valor = "";
Console.Write("ingrese el valor del dividendo:");
valor = Console.ReadLine();
dividendo = Convert.ToInt32(valor);
Console.Write("ingrese el valor del divisor:");
valor = Console.ReadLine();
divisor = Convert.ToInt32(valor);
if (divisor != 0)
{
cociente = dividendo / divisor;
Console.WriteLine("el cociente entre {0} y {1} es
{2}", dividendo, divisor, cociente);
}
else
{
Console.WriteLine("No se puede obtener un
Cociente.");
Console.WriteLine("NO se puede dividir por 0.");
}
}
}
}

Decisiones anidadas.
En un bloque de cdigo pueden ir todo tipo de instrucciones, por lo tanto
puede existir otra decisin, es decir que nos podemos encontrar con una
decisin dentro de una decisin (Un If dentro de otro If), esto se denomina
decisiones anidadas. No nos resultar ningn problema, si respetamos las
estructuras que hemos visto y adems nos cuidamos de los errores lgicos; que
como programadores, podemos llegar a cometer frente a un anlisis mal hecho.

.NET para Docentes y Alumnos. Programando en C#

Una de la maneras de resolver el problema, de ingresar 3


nmeros enteros e indicar cal es el mayor, puede ser la siguiente.
(utilizaremos if anidados).
Para resolver este problema vamos a hacer uso de una variable auxiliar
denominada mayor.
using System;
using System.Collections.Generic;
using System.Text;
namespace numeromayordetres
{
class Program
{
static void Main(string[] args)
{
int a = 0;
int b = 0;
int c = 0;
int mayor = 0;
string valor = "";
// ingreso de numeros a, b y c
Console.Write("ingrese el valor de a:");
valor = Console.ReadLine();
a = Convert.ToInt32(valor);
Console.Write("ingrese el valor de b:");
valor = Console.ReadLine();
b = Convert.ToInt32(valor);
Console.Write("ingrese el valor de c:");
valor = Console.ReadLine();
c = Convert.ToInt32(valor);
if (a > b)
{
if (a > c)
{
mayor = a;
Console.WriteLine("el valor mayor entre {0} ,{1}
y {2} es {3}", a, b, c, mayor);
}
else
{
mayor = c;
Console.WriteLine("el valor mayor entre {0} ,{1}
y {2} es {3}", a, b, c, mayor);
}
}
else
{
if (b > c)
{
mayor = b;
Console.WriteLine("el valor mayor entre {0} ,{1}
y {2} es {3}", a, b, c, mayor);
}
else
{
mayor = c;

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("el valor mayor entre {0} ,{1}


y {2} es {3}", a, b, c, mayor);
}
}

}
}
}

Expresiones lgicas.
C# tambien posee operadores lgicos, utilizados, para el armado de
expresiones lgicas. Ellos son:
Operador

&&
||

Significado
Y (conjuncion)
O (disyuncion)
No

Ejemplo
(5==5) && (5<10)
(-2=4) || (7>10)
!(9=9)

Resultado
True
False
False

Para obtener los resultados de una operacin lgica, tendrn que hacer
uso de las tablas lgicas.
Las que deben conocer, son las de conjuncin, disyuncin y negacin.
Aqu las desarrollo, para que luego podamos darles uso en los programas.
p
True
True
False
False

Q
True
False
True
False

p&&q
True
False
False
False

p||q
True
True
True
False

!(p)
False
False
True
True

Podemos ejemplificar lo visto, con el siguiente programa.

Realizar un programa, que nos indique si una persona est


habilitada para conducir automviles. Para eso, deber tener la edad suficiente;
mayor de 18 aos. En caso de ser menor de 18 y mayor de 16, podr conducir
con el permiso de los padres.

.NET para Docentes y Alumnos. Programando en C#

using System;
using System.Collections.Generic;
using System.Text;
namespace expresioneslogicas
{
class Program
{
static void Main(string[] args)
{
int edad = 0;
bool permiso = false;
bool habilitado = false;
string valor="";
Console.Write("Ingrese la edad: ");
valor = Console.ReadLine();
edad=Convert.ToInt32(valor);
if (edad >= 18)
{
habilitado = true;
}
else
{
Console.Write("Posee Permiso de sus Padres: ");
valor = Console.ReadLine();
permiso = Convert.ToBoolean(valor);
if (((edad >= 16) && (edad < 18)) && (permiso ==
true))
{
habilitado= true;
}
else
{
habilitado = false;
}
}
if (habilitado == true)
Console.WriteLine("Esta habilitado para conducir.");
else
Console.WriteLine("NO, esta habilitado para
conducir.");
}
}
}

Switch

.NET para Docentes y Alumnos. Programando en C#

La sentencia Switch, es otra estructura selectiva que se utiliza en el


lenguaje de C# de .NET. La particularidad de este, es que permite tomar una
opcin de varias, dependiendo del valor de una variable.
El valor de la variable, se compara con los diferentes casos que hemos
armado en la estructura selectiva, en caso de coincidir, se ejecutar el Bloque
de Cdigo que pertenece a esa opcin. Si la variable no ha encontrado ninguna
opcin, se puede poner al final una opcin por defecto denominada Default.
Para indicar el final dentro de un bloque de cdigo, utilizaremos la
sentencia Break. Esta nos permitir salir de la estructura selectiva Switch en la
cual est trabajando, en caso contario seguir analizando las opciones
siguientes hasta el final.
La estructura de Switch, es la siguiente:
switch (opcin)
{
Case 1:
Sentencias;
Break;
Case 2:
Sentencias;
Break;
Case n:
Sentencias;
Break;
Default:
Sentencias;
Break
}

El Switch es utilizado a menudo, en aquellos programas donde


necesitamos armar un men, con diferentes opciones.

Crear un programa, que el usuario pueda ingresar 2 valores y


le permita elegir la opcin de cmo operar dichos valores; entre ellas, de sumar,
restar o salir.
using System;
using System.Collections.Generic;
using System.Text;
namespace menuswitch
{
class Program
{

.NET para Docentes y Alumnos. Programando en C#

static void Main(string[] args)


{
int a = 0;
int b = 0;
int opcion = 0;
int resultado = 0;
string valor="";
Console.Write("Ingrese un valor: ");
valor = Console.ReadLine();
a = Convert.ToInt32(valor);
Console.Write("Ingrese otro valor: ");
valor = Console.ReadLine();
b = Convert.ToInt32(valor);
// armado del menu de opciones
Console.WriteLine("1 - Suma");
Console.WriteLine("2 - Resta");
Console.WriteLine("3 - Salir");
Console.Write("Ingrese la opcion deseada: ");
valor = Console.ReadLine();
opcion = Convert.ToInt32(valor);
switch (opcion)
{
case 1:
resultado = a + b;
Console.WriteLine("la suma de {0} mas {1} es
{2}", a, b, resultado);
break;
case 2:
resultado = a - b;
Console.WriteLine("la resta de {0} menos {1} es
{2}", a, b, resultado);
break;
case 3:
Console.WriteLine("Sale del Programa");
break;
default:
Console.WriteLine("Ha ingresado una opcin no
vlida");
break;
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

En esta unidad, hemos vistos estructuras selectivas que


les permitirn a nuestros programas la toma de decisiones. Es fundamental, la
prctica intensiva de estas sentencias, pues involucra el uso de expresiones
relacionales y lgicas que el programador debe usar con suma confianza para
la complejidad de las aplicaciones que desarrollar en el futuro.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 3.

1. El usuario deber Ingresar un valor, y determinar si este es par o impar.

2. Crear un programa, que permita realizar un descuento del 10%, de un


importe si este supera los 2000$. Dicho importe debe ser ingresado por el
usuario del sistema.

3. Hacer un programa, donde el usuario, pueda ingresar un valor del 1 al 7, y


el sistema indique el da de la semana que le corresponde en funcin de su
posicin (ejemplo 1 lunes, 2-martes, etc.).

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 3.

1. Cdigo del primer problema a desarrollar.


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
/*
El usuario deber Ingresar un valor, y determinar
si este es par o impar
*/
int valor = 0;
Console.Write("Ingrese un valor: ");
valor = Convert.ToInt32(Console.ReadLine());
if (valor % 2 == 0)
{
Console.WriteLine("El valor {0} es Par.",valor);
}
else
{
Console.WriteLine("El valor {0} es Inpar.", valor);
}
}
}
}

Muestra por consola

2. El cdigo es:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion2

.NET para Docentes y Alumnos. Programando en C#

{
class Program
{
static void Main(string[] args)
{
/*
*Crear un programa, que permita realizar un descuento
* del 10%, de un importe si este supera los 2000$.
* Dicho importe debe ser ingresado por el usuario del
* sistema.
*/
float importe = 0.0f;
int descuento = 20;
Console.Write("Ingrese el Importe: ");
importe = Convert.ToSingle(Console.ReadLine());
if (importe >= 2000)
{
importe = importe - (importe * descuento / 100);
}
Console.WriteLine("El importe a abonar es: {0}",importe);
}
}
}

Por consola nos da:

3. El ltimo problema lo he resuelto de la siguiente manera.


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program
{
static void Main(string[] args)
{
/* Hacer un programa, donde el usuario, pueda ingresar
* un valor del 1 al 7, y el sistema indique el da de
* la semana que le corresponde en funcin de su posicin
* (ejemplo 1 lunes, 2-martes, etc.).
*/
int valor = 0;
Console.Write("Ingrese un valor (1 a 7): ");
valor =Convert.ToInt32( Console.ReadLine());
switch (valor)
{
case 1:
Console.WriteLine("LUNES");

.NET para Docentes y Alumnos. Programando en C#

break;
case 2:
Console.WriteLine("MARTES");
break;
case 3:
Console.WriteLine("MIERCOLES");
break;
case 4:
Console.WriteLine("JUEVES");
break;
case 5:
Console.WriteLine("VIERNES");
break;
case 6:
Console.WriteLine("SABADO");
break;
case 7:
Console.WriteLine("DOMINGO");
break;
default:
Console.WriteLine("Error en el ingreso del
Valor.");
break;
}
}
}
}

Por consola debemos ver.

.NET para Docentes y Alumnos. Programando en C#

Unidad 4
Los Ciclos.
Tiempo estimado: 120 minutos

En nuestra vida hay tareas semejantes, que las realizamos en forma


reiterada durante da, en la semana, etc. Me atrevo hacer algunas referencias
como, desayunar, algn deporte en forma semanal, la concurrencia a nuestras
escuelas o trabajos; donde tomamos el mismo colectivo, a la misma hora, etc.,
es decir que tenemos las actividades casi estandarizadas.
En nuestras aplicaciones, tambin, habr sentencias que debern
ejecutarse en forma repetitiva. Para estos casos, vamos a ver en C#, algunas
estructuras de suma utilidad. Entre ellas el ciclo for (para), while (mientras),
etc.

Ciclo Para (For).


El primer ciclo que aprenderemos, es el ciclo For (en ingls significa
para). Este ciclo lo utilizaremos, cuando tengamos definido, la cantidad de
reiteraciones del Bloque de Cdigo que tengamos que realizar.
La estructura de esta sentencia es la siguiente.
For (inicializacin ; condicin ; incremento)
{
Bloque de cdigo
}

Analizaremos cada uno de las partes, que conforma la estructura del ciclo
For, en el orden que el compilador las interpreta:
El orden es el siguiente, Inicializacin, condicin, bloque de cdigo y por
ltimo el incremento.
Inicializacin: se le da un valor inicial a la variable que va a controlar
el bucle. La inicializacin se realizara como una asignacin normal,

.NET para Docentes y Alumnos. Programando en C#

ejemplo: n=1. Hay que realizar la asignacin de la variable antes del


bucle.
Condicin: en esta seccin debe ir una operacin relacional. Esta,
va a controlar cuando termina el bucle, ejemplo: n<=20. Seguir en
el bucle mientras n sea menor o igual que 20.
Bloque de cdigo: aqu irn, las instrucciones (cualquier sentencia
en C#) que se realizarn mientras se cumpla el ciclo.
Incremento: indicamos como se modificar el valor de la variable de
control (inicializada en el primer punto) para cada vuelta del ciclo,
ejemplo: n=n+1
El funcionamiento es el siguiente:
Al ejecutarse un bucle For, lo primero que se lleva a cabo es la
inicializacin de la variable de control y luego la condicin. Si la condicin es
verdadera (true), se pasa al cdigo y por ltimo, se produce el incremento e la
variable de control. En caso que la condicin sea falsa (False), se salta el
bloque de cdigo y continua con las sentencias siguientes del programa.

Empezaremos con un ejemplo sencillo, para ver como funciona el bucle


definido For.

Realizar un programa, que permita mostrar los primeros 10


numero naturales (1, 2, 3,. 10).
using System;
using System.Collections.Generic;
using System.Text;
namespace numerosnaturales
{
class Program
{
static void Main(string[] args)
{
int n = 0; // inicializando la variable de control
Console.WriteLine("Comienza el bucle");
for (n = 1; n <= 10; n = n + 1)
{
Console.WriteLine("{0}",n);
}
Console.WriteLine("finaliza el bucle");
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Podemos tambin probar; con las siguientes modificaciones, el ciclo For


que les muestro a continuacin:

Inicializamos con -10 y mostrar los nmeros enteros entre los


valores -10 y 10.
for (n = -10; n <= 10; n = n + 1)
{
Console.WriteLine("{0}",n);
}

En caso que muestro a continuacin, he cambiado la variable


de control, y he modificado el incremento. En este caso va en decremento
y muestra los valores desde 100 hasta 0.
for (n = 100; n >= 0; n = n - 1)
{
Console.WriteLine("{0}",n);
}

En este ltimo caso, se mostrar los valores entre 1 y 10 pero


en dos en dos.
for (n = 1; n <= 10; n = n + 2)
{
Console.WriteLine("{0}",n);
}

Por pantalla se visualiza lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

Contadores y Acumuladores.
Hay 2 conceptos muy importantes y necesarios a la hora de programar,
ellos son los contadores y los acumuladores.
El contador, es un variable que tiene la capacidad de incrementar o
disminuir su valor en uno.
Un ejemplo:
n=n+1;
Si quisiramos saber cuntos alumnos hay en un curso, deberamos
contarlos, por lo tanto, haramos uso de un contador.
En cambio el acumulador, tambin es una variable pero, permite
incrementar o disminuir su valor en cualquier nmero.
Un ejemplo:
Sueldo = sueldo+500;
Un caso posible, es aquel, si tenemos que sumar lo recaudado por un
local de ventas en un da, para determinarlo, deberamos hacer uso de un
acumulador.

Apliquemos lo que hemos aprendido en un ejemplo.

Procesar los primeros 100 nmeros naturales, he indicar


cuantos pares hay y sumar la totalidad de los valores.
using System;
using System.Collections.Generic;
using System.Text;
namespace contadoracumulador
{

.NET para Docentes y Alumnos. Programando en C#

class Program
{
static void Main(string[] args)
{
int n = 0; // inicializando la variable de control
int cuentapares = 0;
int acumulatodo = 0;
Console.WriteLine("Comienza el bucle");
for (n = 1; n <= 100; n = n + 1)
{
if (n % 2 == 0)
cuentapares = cuentapares + 1; // contador
acumulatodo = acumulatodo + n; // acumulador
}
Console.WriteLine("Existen {0} pares.", cuentapares);
Console.WriteLine("La suma de todos los valores es
{0}",acumulatodo);
}
}
}

En C# tenemos unos contadores especiales, denominados, operador de


incremento (++) y operador de decremento (--). Estos sern usados, como
sufijos o prefijos de la siguiente manera.
Contador

Sufijo

prefijo

n=n+1
n=n-1

n++
n--

++n
--n

En el caso de que el operador acte como sufijo, evaluar la expresin,


con el valor actual de la variable y luego incrementar la variable.
En cambio cuando usamos el prefijo, primero se incrementa y luego se
evala la expresin.
Puedo ver la cara de ustedes!
Vamos con un ejemplo, que aclare lo enunciado:
using System;
using System.Collections.Generic;
using System.Text;

.NET para Docentes y Alumnos. Programando en C#

namespace sufijoprefijo
{
class Program
{
static void Main(string[] args)
{
int numero = 10;
Console.WriteLine("valor inicial: {0}", numero);
Console.WriteLine("el valor incial con numero++: {0}",
numero++);
Console.WriteLine("valor inicial luego de numero++: {0}",
numero);
Console.WriteLine("el valor con ++numero: {0}", +
+numero);
}
}
}

Hay otros operadores de suma utilidad, que paso a detallar:


Acumulador
numero=numero+5
numero=numero-5
numero=numero*5
numero=numero/5

Operador
+=
-=
*=
/=

Ejemplo
numero+=5
numero-=5
numero*=5
numero/=5

Resolvamos el siguiente problema. Se desea determinar el


promedio general y el de cada alumno de un curso de un establecimiento
educativo. Se sabe, que el curso est compuesto por 5 alumnos, y cada alumno
posee 3 notas.

Aclaracin. En este caso podemos aplicar un bucle que


tenga en cuenta los 5 alumnos, y tambin, sera bueno aplicar otro bucle para
ingresar las 3 notas de cada alumno.
using System;
using System.Collections.Generic;
using System.Text;
namespace promedioalumnos
{
class Program

.NET para Docentes y Alumnos. Programando en C#

{
static void Main(string[] args)
{
// inicializacion y asginacion de variables
int cantidadalumno=0;
int cantidadnotas = 0;
float nota = 0.0f;
float acumulanotaalumnos = 0.0f;
float acumulapromedio = 0.0f;
float promediototal = 0.0f;
float promedioalumno = 0.0f;
string valor = "";
// controla la cantidad de alumnos
for (cantidadalumno = 1; cantidadalumno <= 5;
cantidadalumno++)
{
Console.WriteLine(" **** Calculo del Promedio del Alumno
{0} **** ",cantidadalumno);
acumulanotaalumnos = 0;
// controla la cantidad de notas
for (cantidadnotas = 1; cantidadnotas <= 3;
cantidadnotas++)
{
Console.Write("Ingrese la {0} nota del alumno:
",cantidadnotas);
valor = Console.ReadLine();
nota = Convert.ToSingle(valor);
acumulanotaalumnos = acumulanotaalumnos + nota;
}
// muestra solo el promedio del alumno
promedioalumno = acumulanotaalumnos / 3;
Console.WriteLine("El promedio del Alumno es: {0}",
promedioalumno);
acumulapromedio = acumulapromedio + promedioalumno;
}
// muestra el promedio Total
promediototal = acumulapromedio / 5;
Console.WriteLine("
**************************************************** ",
promediototal);
Console.WriteLine(" **** El promedio General de los
Alumnos es: {0} **** ", promediototal);
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Ciclo Mientras (Do While).


Cuando estudiamos el ciclo For, indique que era un bucle definido, pues
sabamos de antemano, cuantas veces se ira a realizar el proceso.
Pero, existen problemas, donde el nmero de bucle a realizarse se
desconoce, para estos casos usaremos el bucle indefinido While (mientras). Es
decir que el bucle, se va realizar, mientras se cumpla una expresin relacional,
y esta sea verdadera.
El ciclo Do While, posee la siguiente estructura:
Do
{
Bloque de Cdigo;
} While (condicin);
Vemos, que esta estructura de Do While, realiza la evaluacin al final, por
lo tanto, ya sea esta verdadera o falsa, siempre se ejecutar el bloque de
cdigo, al menos una vez. En caso que sea falsa saldr del bucle, y en caso
contrario, de que sea verdadera, saltar al inicio del bucle donde esta Do.
En resumen, se garantiza la entrada al bucle.
Vamos a resolver un problema de conversin de unidades mtricas, para
ver como funciona el bucle Do While.

El usuario ingresar una medida en pulgadas y desear


saber, a cuantos centmetros equivale. Al final, se le deber preguntar al usuario
si quiere seguir trabajando con el sistema (de esta forma, le permitimos al
usuario, que ejecute el programas las veces que este quiera).

.NET para Docentes y Alumnos. Programando en C#

using System;
using System.Collections.Generic;
using System.Text;
namespace conversionpulgadacentimetros
{
class Program
{
static void Main(string[] args)
{
string opcion = "n";
string valor = "";
float medidapulgada = 0.0f;
float medidacentimetro = 0.0f;
// comienza el bucle Do While
do
{
Console.Write("Ingrese su medida en Pulgadas:");
valor = Console.ReadLine();
medidapulgada = Convert.ToSingle(valor);
medidacentimetro = medidapulgada * 2.54f;
Console.WriteLine("{0} pulgadas es igual a {1}
centimetros.",medidapulgada,medidacentimetro);
Console.Write("Desea continuar s/n ...");
opcion = Console.ReadLine();
}while (opcion=="s");
// finaliza el ciclo Do While
}
}
}

Ciclo Mientras (While).


Habiendo visto y comprendido el bucle Do While, estamos en condiciones
de ver el bucle While. Se asemeja al Do While, pero difiere, que este realiza la
evaluacin al principio de una expresin lgica, por lo tanto puede ocurrir que el
bloque de cdigo, nunca se ejecute si la evaluacin es Falsa. Su estructura es
as:
While (condicin);
{
Bloque de Cdigo;
}

.NET para Docentes y Alumnos. Programando en C#

Aplicaremos el bucle While, en un programa.

Realizar un programa que disminuya en 1 en 1 la temperatura


de una piscina hasta 23 grados y lo muestre. Dicho proceso se realiza, siempre
que la temperatura ingresada por el Usuario, sea mayor de 23 grados.
using System;
using System.Collections.Generic;
using System.Text;
namespace temperatura
{
class Program
{
static void Main(string[] args)
{
int temperatura = 0;
string valor = "";
Console.Write("Ingrese la Temperatura de la Piscina: ");
valor = Console.ReadLine();
temperatura = Convert.ToInt32(valor);
while (temperatura > 23)
{
temperatura = temperatura - 1;
Console.WriteLine("La temperatura es
{0}",temperatura);
}
}
}
}

Al igual que el If, los bucles (For, Do While y While) pueden


estar anidados, siempre y cuando respetemos las estructuras de cada uno de
ellos, y para eso, debern prestar mucha atencin, en el momento de
confeccionar los programas.

.NET para Docentes y Alumnos. Programando en C#

En resumen, los ciclos que hemos visto, nos permiten


optimizar aquellos programas que poseen un bloque de cdigo que se deba
repetir. En el caso del For nos permite repetir un bloque un nmero determinado
de veces, bajo la inspeccin de una variable de control.
En cambio el ciclo Do While, nos permite repetir el cdigo un nmero
indeterminado de veces, dependiendo de una relacin lgica. Es importante
tener en cuenta, que al menos una vez se ejecutar el bloque de instrucciones.
El ciclo While, tambin debe evaluar una expresin lgica, pero a
diferencia de Do While lo realiza al inicio del bucle. Eso puede provocar que
nunca se realice el bucle; por ende no se ejecute el bloque de cdigo,
dependiendo del resultado de la relacin lgica.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 4.

1. Calcular el factorial de un nmero. Recordamos que el factorial de 0 y de


1 es 1, y el resto de los valores naturales se calculan, multiplicando todos
los valores desde 1 hasta el valor que deseamos saber su factorial. Un
ejemplo del factorial de 5 es: 5!=5*4*3*2*1=120
2. Hacer un programa donde se ingrese un valor y mostrar la tabla de
multiplicar del mismo, con el producto del mismo con el valor 1 al 12.
3. Hacer un programa que encuentre los valores primos entre 1 y 500.
4. Un globo aerosttico en ascenso, toma el valor de la temperatura en 10
oportunidades, determinar:
Temperatura promedio.
Temperatura mayor.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 4.
1. Para la solucin del primer problema, he desarrollado el siguiente
cdigo.
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
// Calcular el factorial de un nmero
// declaracion de variables
int valor = 0;
int n = 0;
int factorial = 1;
Console.Write("Ingrese el valor: ");
valor = Convert.ToInt32(Console.ReadLine());
for (n = 1; n <= valor;n++ )
{
factorial=factorial*n;
}
Console.WriteLine("El factorial de {0} es {1}.", valor,
factorial);
}
}
}

La vista por consola es:

.NET para Docentes y Alumnos. Programando en C#

2. El cdigo del siguiente problema es:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion2
{
class Program
{
static void Main(string[] args)
{
/*Hacer un programa donde se ingrese un valor y mostrar
la tabla de multiplicar del mismo, con el producto del
mismo con el valor 1 al 12.
*/
// inicializacion y declaracion de variables
int n=0;
int producto = 0;
int valor = 0;
Console.Write("Ingrese el valor : ");
valor = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\n \n *** Tabla del {0} ***",valor);
for (n = 1; n <= 12; n++)
{
producto = n * valor;
Console.WriteLine("{0} x {1} =
{2}",n,valor,producto);
}
}
}
}

Por consola veremos:

3. El cdigo es:
using System;
using System.Collections.Generic;
using System.Text;

.NET para Docentes y Alumnos. Programando en C#

namespace solucion3
{
class Program
{
static void Main(string[] args)
{
/* Hacer un programa que encuentre los valores primos
* entre 1 y 500.
*/
// inicializacion y declaracion de variables
int n = 0;
int m = 0;
int contadordivisible = 0;
Console.WriteLine("\n \n *** Valores Primos entre 1 y 500
***");
for (n = 1; n <= 500; n++)
{
for (m = 1; m <= n;m++ )
{
if (n % m == 0)
contadordivisible = contadordivisible + 1;
}
if (contadordivisible == 2 || contadordivisible == 1)
Console.Write(", {0}",n);
contadordivisible = 0;
}
Console.WriteLine("\n Fin del Programa");
}
}
}

Se muestra por pantalla lo siguiente:

4. La solucin del ltimo problema es:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion4
{
class Program
{
static void Main(string[] args)
{
/* Un globo aerosttico en ascenso, toma el valor de la
* temperatura en 10 oportunidades, determinar:

.NET para Docentes y Alumnos. Programando en C#

* Temperatura promedio.
* Temperatura mayor.
*/
// variables
int n=0;
float temperatura = 0.0f;
float suma = 0.0f;
float promedio = 0.0f;
float temperaturamayor = 0.0f;
for (n = 1; n <= 20; n++)
{
Console.Write("Ingrese una temperatura:");
temperatura = Convert.ToSingle(Console.ReadLine());
suma = suma + temperatura;
if ((temperatura > temperaturamayor) || (n == 1))
temperaturamayor = temperatura;
}
Console.WriteLine("la suma es : {0}", suma);
promedio=suma/20;
Console.WriteLine("el promedio es: {0}",promedio);
Console.WriteLine("La temperatura mayor es: {0}",
temperaturamayor);
}
}
}

Por consola vemos lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

Unidad 5
Las Funciones y los Mtodos.

Tiempo estimado: 120 minutos

Son muchas las ventajas, de aprender a utilizar funciones y mtodos en


nuestros programas, entre ellas podemos enumerar que: son cdigo
reutilizables, permiten trabajar en forma ms ordenada, los programas son ms
legibles a la hora de visualizar, realizan procesos especficos, etc.
Con el conocimiento de las funciones y los mtodos, nos estamos
encaminando hacia la programacin orientada a objetos.

Las Funciones
Las funciones, son un elemento ms de los programas, que contiene
cdigo y pueden ser ejecutadas.
Dentro de los programas, vamos a llamar o invocar a la funcin y esta
ejecutar, el bloque de sentencias que se encuentren en su interior, luego
cuando finaliza y ejecuta la ltima lnea del bloque, regresa a la lnea siguiente
del programa que la ha invocado.

Ya hemos utilizado un funcin, que es la que se dispone cuando nos


ubicamos en un nuevo proyecto, ella es la funcin principal llamada Main(), y a

.NET para Docentes y Alumnos. Programando en C#

partir de ah podemos crear la cantidad de funciones que necesitemos para


nuestra aplicacin.
En la programacin orientada a objetos (POO), existen las clases, estas
contienen cdigo, y este cdigo se encuentra en una funcin que se denomina
mtodo.
Por ejemplo, cuando convertimos una cadena en un valor flotante,
hemos utilizado el mtodo tosingle(), que se encuentra dentro de la clase
convert.
La estructura de una funcin, consta de 5 secciones, ellas son:
Modificador tipo nombre (parmetro)
{
Bloque de cdigo;
}

Explicare cada una de estas secciones, y para que se entienda mejor


empezar por la definicin del tipo de funcin, dejando el modificador para lo
ltimo.
Tipo: indicaremos el tipo de informacin que regresa la funcin. En caso
de no regresar nada se denuncia como void.
Nombre: todas las funciones sern identificadas por su nombre, pues se
utilizar para invocarla desde el programa. Es prctico, comenzar la funciones
con letra mayscula (Ej.: Promedio), y en caso de utilizar ms de una palabra,
empezar cada una de ellas con mayscula sin dejar espacio (Ejemplo:
PromedioTriangulo). Adems es importante que el nombre tenga referencia con
lo que hace la funcin.
Parmetro: algunas funciones necesitan informacin para trabajar,
denominada parmetros. Los parmetros, son un conjunto de variables, en
caso de no tener la necesidad de enviar datos o variables, se disponen los
parntesis vacios.
Bloque de cdigo: Son el conjunto de sentencia en lenguaje C#. Todo lo
que hemos visto hasta el momento puede ir dentro del bloque de cdigo.
Modificador: por ltimo; como lo he dicho, los modificadores cambian el
funcionamiento de la funcin. Nosotros, vamos a usar el modificar static, pues
nos va a permitir usar la funcin, sin tener que declarar un objeto de la clase a
la que pertenecemos (temas a desarrollar ms adelante).
En un programa, podemos pensar que todos son objetos que pertenecen
a una clase, y esta debe estar declarada para poderse utilizar en nuestro
sistema.

.NET para Docentes y Alumnos. Programando en C#

Tipos de funciones.
A la hora de programar, nos podemos encontrar con 4 tipos de funciones,
ellas son las que:

Solo ejecutan cdigo.


Regresan valores.
Reciben parmetros.
Reciben parmetros y regresan valores.

Explicare cada una de ellas, como tambin expondr un ejemplo de cada


tipo de funcin.

Funciones que solo ejecutan cdigo


Estas funciones solo llevan a cabo una tarea o funcin, al momento de ser
invocadas, por lo tanto el tipo de la misma ser void.
Para poder utilizar una funcin habr que declararla, esto se realiza
dentro del bloque de cdigo de una clase. En nuestros ejemplo los hacemos en
la clase class Program, que ya viene definida, cuando disponemos de un
nuevo proyecto. Recordamos que nuestra funcin principal Main() (que acta
como administradora del programa) tambin, ya viene definida dentro de la
clase class Program.
Manos al teclado, y comenzamos con el desarrollo de nuestra primera
funcin.

Realizar un programa donde el usuario, ingrese dos nmeros


e indicar el promedio de los mismos.
using System;
using System.Collections.Generic;
using System.Text;
namespace ejecutasolocodigo
{
class Program
{
static void Main(string[] args)
{
Promedio(); // invocacion a la funcion
}
// declaracion de la funcion promedio
static void Promedio()
{
// declaracion de variables
float a = 0.0f;
float b = 0.0f;
float resultadopromedio = 0.0f;

.NET para Docentes y Alumnos. Programando en C#

string valor = "";


Console.Write("ingrese un valor:");
valor = Console.ReadLine();
a = Convert.ToSingle(valor);
Console.Write("ingrese otro valor:");
valor = Console.ReadLine();
b = Convert.ToSingle(valor);
resultadopromedio = (a + b) / 2;
Console.WriteLine("El promedio es :
{0}",resultadopromedio);
}
}
}

Las variables que hemos utilizados, las he declarado


dentro de la funcin y solo tiene validez en ese contexto. Estas variables se
denominan locales y solamente sern reconocidas dentro de esa funcin.

Funciones que regresan valores.


Nuestro siguiente tipo de funcin, es aquella que puede regresar un valor.
Quiere decir que al invocar la funcin, se ejecutar el cdigo y regresar un
valor como resultado de la ejecucin del bloque de cdigo de la misma.
Recordamos que aqu, deberemos poner el tipo de variable que va
retornar, adems la funcin utilizar un comando especial para regresar este
valor denominado return.
Antes de ir al ejemplo, monto una estructura simple, de cmo debemos
programar este tipo de funcin.
En Main()
Float resultadopromedio=0.0f;
resultadopromedio=Promedio();
En la funcin:
Return resultadopromedio;

.NET para Docentes y Alumnos. Programando en C#

Utilizamos el ejemplo anterior; el de ingresar dos nmeros e


indicar su promedio. Pero, el resultado lo recibe dentro de la funcin Main(),
desde donde fue invocada la funcin Promedio().
using System;
using System.Collections.Generic;
using System.Text;
namespace regresaunvalor
{
class Program
{
static void Main(string[] args)
{
// declaracion de las variables
float resultadoregresado = 0.0f;
// invocacion de la funcion
resultadoregresado = Promedio();
Console.WriteLine("El promedio es : {0}",
resultadoregresado);
}
// declaracion de la funcion promedio
static float Promedio()
{
// declaracion de variables
float a = 0.0f;
float b = 0.0f;
float resultadopromedio = 0.0f;
string valor = "";
Console.Write("ingrese un valor:");
valor = Console.ReadLine();
a = Convert.ToSingle(valor);
Console.Write("ingrese otro valor:");
valor = Console.ReadLine();
b = Convert.ToSingle(valor);
resultadopromedio = (a + b) / 2;
return resultadopromedio;
}
}
}

El resultado que se muestra, luego de ser ejecutado el


programa, debe ser igual que el anterior.

Funciones que reciben parmetros.

.NET para Docentes y Alumnos. Programando en C#

Los tipos de funciones que hemos visto, piden directamente al usuario los
valores de las variables necesarias para trabajar. Ahora, en la invocacin de la
funcin, le enviaremos los valores que la funcin necesita. Estos valores, se
denominan parmetros, y deben estar definidos con su nombre y tipo.
Nuevamente, dispongo de una estructura simple, de como debemos
programar este tipo de funcin.
En Main()
Float valor1=0.0f;
Float valor2=0.0f;
Promedio(valor1,valor2);
En la funcin
Static void promedio(float a, float b)

Utilizaremos el ejemplo anterior, pero esta vez el resultado se


muestra en la funcin, luego de enviarle los valores, invocando la funcin desde
Main().
using System;
using System.Collections.Generic;
using System.Text;
namespace recibeparametros
{
class Program
{
static void Main(string[] args)
{
// declaracion de variables
float valor1 = 0.0f;
float valor2 = 0.0f;
string valor = "";
Console.Write("ingrese un valor: ");
valor = Console.ReadLine();
valor1 = Convert.ToSingle(valor);
Console.Write("ingrese otro valor: ");
valor = Console.ReadLine();
valor2 = Convert.ToSingle(valor);
Promedio(valor1, valor2);
}
// declaracion de la funcion promedio
static void Promedio(float a, float b)
{

.NET para Docentes y Alumnos. Programando en C#

// declaracion de variables
float resultadopromedio = 0.0f;
resultadopromedio = (a + b) / 2;
Console.WriteLine("El promedio es :
{0}",resultadopromedio);
}
}
}

Utilizamos en el envo de parmetros, valores implcitos


(promedio(valor1,valor2)) pero, no habra ningn tipo de problema, si
quisiramos haber enviado valores explcitos (promedio(4.0f,7.5f)).

Funciones que reciben parmetros y regresan valores.


El ltimo caso de la funciones que analizaremos, es aquella invocada
que enva parmetros, llevar a cabo las tareas incluidas en el bloque de
instrucciones, y el resultado, lo devolver al lugar donde se invoc la funcin.
Nuevamente haremos uso de la instruccin return, para regresar el valor
calculado.
Debemos prestar suma atencin, con el tipo de parmetros y valores que
se regresan, generalmente son del mismo tipo.
Monto una estructura simple, de cmo deberemos programar este tipo de
funcin.
En Main()
Float valor1=0.0f;
Float valor2=0.0f;
Float resultado=0.0f;
resultado=Promedio(valor1,valor2);

En la funcin
Static float promedio(float a, float b)
Float resultadopromedio;

.NET para Docentes y Alumnos. Programando en C#

return resultadopromedio;

Por ltima vez, utilizamos el mismo ejemplo de ingreso de dos


valores y la obtencin de su promedio. Y esta vez, el resultado se muestra
dentro de la funcin Main(), mientras que en la funcin, luego de tomar los
valores, calcula el resultado y lo retorna.
using System;
using System.Collections.Generic;
using System.Text;
namespace enviaparametrosrecibevalores
{
class Program
{
static void Main(string[] args)
{
// declaracion de variables
float valor1 = 0.0f;
float valor2 = 0.0f;
float resultado = 0.0f;
string valor = "";
Console.Write("ingrese un valor: ");
valor = Console.ReadLine();
valor1 = Convert.ToSingle(valor);
Console.Write("ingrese otro valor: ");
valor = Console.ReadLine();
valor2 = Convert.ToSingle(valor);
resultado=Promedio(valor1, valor2);
Console.WriteLine("El promedio es : {0}", resultado);
}
// declaracion de la funcion promedio
static float Promedio(float a, float b)
{
// declaracion de variables
float resultadopromedio = 0.0f;
resultadopromedio = (a + b) / 2;
return resultadopromedio;
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Nuevamente no ha cambiado la pantalla que muestra el resultado del


problema propuesto.
Antes de pasar a otro tema, propongo un problema para resolver y
profundizar las funciones.

Confeccionar un programa, que permita al usuario elegir si


muestra el precio de una artculo, en dlares (u$s) o en euros (). El precio
inicial, es ingresado en pesos ($) por el mismo usuario.

Sin duda, que antes de empezar, merece un anlisis. Pero a


priori, creo que podemos hacer 3 funciones, una para el ingreso del precio
original y las otras dos restantes para la conversin.
using System;
using System.Collections.Generic;
using System.Text;
namespace conversiondolareseuros
{
class Program
{
static void Main(string[] args)
{
// inicializacion de variables
string opcionsalida = "s";
string valor = "";
int opcion = 0;
float preciopeso = 0.0f;
float precioconvertido = 0.0f;
do
{
Console.WriteLine("Conversin de Pesos ($).");
Console.WriteLine("1 - A Dolares (u$s)");
Console.WriteLine("2 - A Euros ()");
Console.Write("Elija la opcion deseada de
Conversin...");
valor = Console.ReadLine();
opcion = Convert.ToInt32(valor);
if (opcion == 1)
{
preciopeso=Ingresaprecioenpesos();
precioconvertido = Pesoadolar(preciopeso);
Console.WriteLine("El articulo de {0} $ es
equivalente a {1} u$s",preciopeso,precioconvertido);
}
if (opcion == 2)
{
preciopeso = Ingresaprecioenpesos();
precioconvertido = Pesoaeuro(preciopeso);

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("El articulo de {0} $ es


equivalente a {1} ", preciopeso, precioconvertido);
}
// opcion para continuar en el sistema
Console.Write("Desea continuar ... s/n ");
valor = Console.ReadLine();
opcionsalida = valor;
} while (opcionsalida == "s");
}
// funcion de ingreso de precio en peso
static float Ingresaprecioenpesos()
{
float precio;
string valor = "";
Console.Write("Ingrese el precio del articulo en pesos
($)");
valor = Console.ReadLine();
precio = Convert.ToSingle(valor);
return precio;
}
// funcion de conversion de peso a dolar
static float Pesoadolar(float a)
{
float resultado = 0.0f;
resultado=a*3.44f;
return resultado;
}
// funcion de conversion de peso a Euro
static float Pesoaeuro(float a)
{
float resultado = 0.0f;
resultado = a*4.44f;
return resultado;
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Paso de valores por Copia y por Referencia.


Es importante saber y determinar, el mbito, en el cual las variables que
se han definido mantienen su valor.
Para esto debemos introducir dos conceptos muy importantes:
1 las variables solo pueden ser utilizadas, en el mbito (parte del
programa) donde fueron creadas. Solo puedo copiar el contenido de la
variable.
2 si invocamos una funcin y pasamos parmetros, una copia del
valor y del parmetro pasa a la funcin.
Para entender mejor estos conceptos vamos a ver 2 ejemplos.

El cdigo que se encuentra a continuacin; de esta breve


explicacin terica, est diseado para explicar el primer concepto.
En el programa, tendremos 2 funciones (Main() y Cambiar()), adems
vamos a declarar y asignar una variable (numero=10).
Ingresemos el ejemplo a nuestro editor.
using System;
using System.Collections.Generic;
using System.Text;
namespace pasoporcopia
{
class Program
{
static void Main(string[] args)
{
// inicializamos las variables a utilizar
int numero = 10;
Console.WriteLine("Valor antes de invocar a la funcion:
{0}", numero);
cambiar(numero);
Console.WriteLine("Valor nuevamente en la Main(): {0}",
numero);
}
static void cambiar(int numero)
{
// cambio el valor de la variable
Console.WriteLine("Valor dentro de la funcion antes de
cambiar: {0}", numero);
numero = 20;
Console.WriteLine("Valor dentro de la funcion cambiada:
{0}", numero);
}
}
}

.NET para Docentes y Alumnos. Programando en C#

He mostrado el valor que se le ha asignado la variable, en diferentes


instancias del programa. Y vemos, que la variable fue afectada dentro de la
funcin, pero al salir de la misma regresa a su valor original.
En realidad, lo que ha pasado, es que no se paso la variable al invocar la
funcin, sino que solo se ha pasado su valor.

Para nuestro segundo concepto, vamos a modificar el cdigo


recin expuesto.
En este caso, ha diferencia del anterior, voy a disponer de una nueva
instruccin ref, cuando declare las variables en la funcin y cuando la invoque.
En este ejemplo no solo pasaremos el valor, sino, que tambin la
referencia de la variable que estamos utilizando. Por lo tanto cuando regrese a
la funcin principal Main(), el valor de la variable mantiene el valor modificado
en la funcin cambiar().

Esto es muy til, cuando deberemos devolver varios


valores, pues return solo regresa un nico valor.
Nuevamente, utilicemos el editor para probar el siguiente ejemplo:
using System;
using System.Collections.Generic;
using System.Text;
namespace pasoporreferencia
{
class Program
{
static void Main(string[] args)
{
// inicializamos las variables a utilizar
int numero = 10;
Console.WriteLine("Valor antes de invocar a la funcion:
{0}", numero);
cambiar(ref numero);
Console.WriteLine("Valor nuevamente en la Main(): {0}",
numero);

.NET para Docentes y Alumnos. Programando en C#

}
static void cambiar(ref int numero)
{
// cambio el valor de la variable
Console.WriteLine("Valor dentro de la funcion antes de
cambiar: {0}", numero);
numero = 20;
Console.WriteLine("Valor dentro de la funcion cambiada:
{0}", numero);
}
}
}

Como ltimo ejercicio de esta unidad, vamos a resolver el


problema de, dados 2 valores asignados a las variables a y b, intercambiar los
valores en dichas variables.
using System;
using System.Collections.Generic;
using System.Text;
namespace intercambiovariables
{
class Program
{
static void Main(string[] args)
{
// inicializamos las variables a utilizar
int a = 10;
int b = 20;
Console.WriteLine("el valor de a es {0} y el de b {1} ",
a, b);
Intercambiar(ref a, ref b);
Console.WriteLine("luego del cambio.");
Console.WriteLine("El valor de a es {0} y el de b {1} ",
a, b);
}
// intercambio del valor de las variables
static void Intercambiar(ref int a, ref int b)
{
// incializa una variable auxiliar
int auxiliar = 0;
auxiliar = a;
a = b;
b = auxiliar;
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Las funciones nos van admitir tener en nuestras


aplicacines, secciones especiales de cdigo. Esto nos permitir tener
programas ordenados, cdigos reutilizables, fcil de localizar las diferentes
secciones luego de un tiempo que no lo tocamos o por otro programador que ve
por primera vez el cdigo, etc.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 5.

1. Realizar un programa que el usuario pueda seleccionar una opcin entre


sumar, multiplicar, restar, dividir dos valores. Por cada opcin se deber
invocar a una funcin que realice el proceso.
2. Confeccionar una aplicacin, donde un cliente de un Banco, puede operar
(solicitar saldo, depositar o retirar dinero) hasta que este, no necesite
realizar ninguna operacin ms.
3. Confeccionar una aplicacin, que permita determinar cuanto debe pagar
un usuario de telefona en funcin, del plan que ha adquirido. Se
ingresaran los pulsos consumidos por el usuario y el plan de telefonia
adoptado.
Plan familiar el pulso 0,19 / pulso excedente 0.17 / hasta 800
pulsos
Plan comercial el pulso 0,17 / pulso excedente 0.15 / hasta 1000
pulsos
Se deber confeccionar el clculo de cada plan en una funcin.
El usuario determina cuando quiere salir de la aplicacin.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 5.
1 la solucin del primer programa es:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
/*Realizar un programa que el usuario pueda seleccionar una
*opcin entre sumar, multiplicar, restar, dividir dos
* valores. Por cada opcin se deber invocar a una
* funcin que realice el proceso.
*/
// definicion de variables
float unvalor = 0.0f;
float otrovalor = 0.0f;
int opcion = 0;
float resultado = 0.0f;
string operacion = "";
Console.Write("Ingrese un valor: ");
unvalor = Convert.ToSingle(Console.ReadLine());
Console.Write("Ingrese otro valor: ");
otrovalor = Convert.ToSingle(Console.ReadLine());
Console.Write("\n\n Opciones \n 1 - Suma \n 2 Multiplica \n 3 - Resta \n 4 - Divide \n\n Ingrese la opcion
deseada .... " );
opcion = Convert.ToInt32(Console.ReadLine());
switch (opcion)
{
case 1:
resultado=suma(unvalor,otrovalor);
operacion = "suma";
break;
case 2:
resultado = multiplicacion(unvalor, otrovalor);
operacion = "multiplicacion";
break;
case 3:
resultado = resta(unvalor, otrovalor);
operacion = "resta";
break;
case 4:
if (otrovalor == 0)
{
Console.WriteLine("No existe la division. El
Divisor debe ser distinto de cero.");
resultado = 0;

.NET para Docentes y Alumnos. Programando en C#

operacion = "Opcion es no valida";


}
else
{
resultado = division(unvalor, otrovalor);
operacion = "divisin";
}
break;
default:
resultado = 0;
operacion = "Opcion es no valida";
break;
}
Console.WriteLine("la {0} de {1} y {2} es
{3}",operacion,unvalor,otrovalor,resultado);
}
// funcion suma
static float suma(float a, float b)
{
float resultadofuncion=0.0f;
resultadofuncion=a+b;
return resultadofuncion;
}
// funcion resta
static float resta(float a, float b)
{
float resultadofuncion = 0.0f;
resultadofuncion = a - b;
return resultadofuncion;
}
// funcion multiplicacion
static float multiplicacion(float a, float b)
{
float resultadofuncion = 0.0f;
resultadofuncion = a * b;
return resultadofuncion;
}
// funcion division
static float division(float a, float b)
{
float resultadofuncion = 0.0f;
resultadofuncion = a / b;
return resultadofuncion;
}
}
}

Se muestra por consola lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

2 - para el segundo problema, el cdigo solucin es el siguiente:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion2
{
class Program
{
static void Main(string[] args)
{
/*Confeccionar una aplicacin, donde un cliente de un Banco
, puede operar (solicitar saldo, depositar o retirar
dinero) hasta que este, no desee realizar ninguna
operacin mas.
*/
// inicializacion de variables
string opcion="";
int codigooperacion = 0;
float saldo = 0.0f;
float importe = 0.0f;
do
{
Console.Write("\n\n Operacin a Realizar.\n 1consulta de saldo \n 2-Deposito \n 3-Extraccin \n\n\nIngrese el tipo
de operacin ...");
codigooperacion =
Convert.ToInt32(Console.ReadLine());
switch (codigooperacion)
{
case 1:
Console.WriteLine("\n\n **** el saldo es: {0}
****",saldo);
break;
case 2:
Console.Write("Ingrese el importe a
depositar: ");
importe =
Convert.ToSingle(Console.ReadLine());
saldo=Deposito(ref saldo,importe);
break;
case 3:
Console.Write("Ingrese el importe a extraer:
");
importe =
Convert.ToSingle(Console.ReadLine());
if (importe <= saldo)

.NET para Docentes y Alumnos. Programando en C#

saldo = Extraer(ref saldo, importe);


else
Console.WriteLine("No es posible su saldo
es menor al importe ha extraer.");
break;
default:
Console.Write("*** no es una operacion valida
***");
break;
}
Console.Write("\n\n Desea continuar s/n ...");
opcion = Console.ReadLine();
} while (opcion == "s");
}
// funcion Depositar
static float Deposito(ref float saldo,float auximporte)
{
saldo=saldo+auximporte;
return saldo;
}
// funcion Extraer
static float Extraer(ref float saldo, float auximporte)
{
saldo = saldo - auximporte;
return saldo;
}
}
}

Por consola vemos:

.NET para Docentes y Alumnos. Programando en C#

3 para el ltimo problema, he desarrollado el siguiente cdigo:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program
{
static void Main(string[] args)
{
/* Confeccionar una aplicacin que permita determinar
cuanto debe pagar un usuario de telefona en funcin
del plan que ha adquirido.
Se ingresaran los pulsos consumidos por el usuario y
el plan de telefonia adoptado.
Plan familiar el pulso 0,19 / pulso excedente 0.17 /
hasta 800 pulsos
* Plan comercial el pulso 0,17 / pulso excedente 0.15 /
hasta 1000 pulsos
Se deber confeccionar el clculo de cada plan en
una funcin. El usuario determina cuando quiere
salir de la aplicacin.
*/
// definicion de variables
int pulsos = 0;
string plan = "";

.NET para Docentes y Alumnos. Programando en C#

string opcion="";
float costopulso=0.0f;
float costopulsoexcedente = 0.0f;
int pulsosexcedente = 0;
float apagar = 0.0f;
do
{
Console.Write("ingrese la cantidad de Pulsos
consumidos:");
pulsos = Convert.ToInt32(Console.ReadLine());
Console.Write("ingrese el plan familiar/comercial:");
plan = Console.ReadLine();
if (plan == "familiar")
{
costopulso = 0.19f;
costopulsoexcedente = 0.17f;
pulsosexcedente = 800;
apagar =
PulsosPagar(pulsos,costopulso,costopulsoexcedente,pulsosexcedente);
}
if (plan == "comercial")
{
costopulso = 0.17f;
costopulsoexcedente = 0.15f;
pulsosexcedente = 1000;
apagar = PulsosPagar(pulsos, costopulso,
costopulsoexcedente, pulsosexcedente);
}
Console.WriteLine("\n\n El abonado del plan {0}
consumio {1} pulsos. Debe pagar {2}$", plan, pulsos, apagar);
Console.Write("Desea continuar ... s/n. ");
opcion = Console.ReadLine();
} while (opcion == "s");
}
// funcion calculo de los pulsos a pagar
static float PulsosPagar(int apulsos,float acostopulso,float
acostopulsoexcedente,int apulsosexcedente)
{
float apagarauxiliar=0.0f;
float apagarexcedido = 0.0f;
if (apulsos <= apulsosexcedente)
{
apagarauxiliar = apulsos * acostopulso;
}
else
{
apagarexcedido = (apulsos - apulsosexcedente) *
acostopulsoexcedente;
apagarauxiliar = (apulsosexcedente * acostopulso)
+apagarexcedido;
}
return apagarauxiliar;
}
}

.NET para Docentes y Alumnos. Programando en C#

Vemos en consola:

.NET para Docentes y Alumnos. Programando en C#

Unidad 6
Los Arreglos.
Tiempo estimado: 120 minutos

Los arreglos (array), nos permitirn administrar la informacin fcilmente


y en forma optima, cuando necesitemos gran cantidad de variables. En lenguaje
C#, existen varias instrucciones, para gestionar el trabajo que se realiza
utilizando los arreglos.
Retomando el problema que ha resuelto los promedios de los 5 alumnos,
recordamos que al finalizar, obtenamos el ltimo promedio. Pero que pasara,
si quisiramos, mostrar el primer, o el tercer promedio de los alumnos; con
excepcin del ltimo que ya est en pantalla; sera imposible volver atrs. Pues,
hemos trabajado con una nica variable. Para este caso; e infinidad de casos
ms, como gestionar una lista de precios, el armado de una agenda personal,
los gastos de las semana, etc.; vamos hacer uso de los arreglos.
Los arreglos, son un grupo de variables referenciadas por un nico
nombre y un ndice. Este ndice, se basa en ndice 0 (cero), es decir que el
primer elemento no es el 1 sino que es el 0. Cuando hablemos del tamao de
un arreglo, nos estaremos refiriendo a la cantidad de elementos que este
posee. Este valor debe estar prefijado, ya sea en forma explcita (por un valor
Ej.: 10) o implcita (por una variable Ej. cantidad).
Los arreglos pueden tener diferentes dimensiones, comenzaremos el
estudio de los mismos, con aquellos de una solo dimensin, llamados tambin
unidimensionales o vectores.
Los arreglos deben ser declarados antes de su uso, y lo haremos de la
siguiente manera:
Tipo[ ] nombre =new tipo [cantidad];
Los arreglos en C# son Objetos, por lo tanto deben ser creados, para eso
utilizamos la instruccin New. Al inicio debemos definir el tipo de dato que va a
contener el arreglo, luego el nombre (es conveniente utilizar letra minscula,
pues son considerados como variables), la instruccin New y por ltimo,
volvemos a indicar el tipo que hemos elegido, con la cantidad de elementos que
posee.
Ejemplos de declaracin de arreglos.

.NET para Docentes y Alumnos. Programando en C#

float[ ] notas =new float[10];


En nuestro caso el arreglo ser de tipo flotante, lo identificamos con el
nombre notas, luego New para crearlo y por ultimo instanciamos con [ ]
indicando que tendr 10 elementos (de 0 a 9).
Otros ejemplos de declaracin de arreglos vlidos:
Int cantidad=10;
float[ ] notas =new float[cantidad];
float[ ] notas = {1.5f,3.0f,2.4f} // si ya conocemos
los valores;
Para asignarle un valor, a algn elemento del arreglo unidimensional,
deberemos conocer su nombre y su posicin, indicada como ndice y entre
corchetes.
Ejemplo:
nota[3] = 7.5f;
Lo ms usual, va ser utilizar como ndice, una variable de control de algn
bucle; tema que ya hemos visto.
En este ejemplo, muestro los valores de los elementos que lo componen
(no se pueden mostrar ms elementos que la cantidad asignada, el compilador
dar error al intentar acceder a leer un elemento inexistente).
For (n=0; n>=10; n++)
{
Console.writeLine(el valor es: {0}, nota[n]);
}

Para el uso de elementos de los arreglos, deberemos considerar, que los


elementos del arreglo son variables, por lo tanto, se podrn realizar todas las
operaciones que estas realizan.
impuestoiva= precio[3] * 2.1f;
Ya estamos en condiciones de realizar nuestra primera aplicacin
utilizando arreglos.

Hagamos una aplicacin, donde el usuario, ingrese 10 valores


y pueda determinar el promedio, el valor mayor y el menor.
using System;
using System.Collections.Generic;

.NET para Docentes y Alumnos. Programando en C#

using System.Text;
namespace arreglospromediomayormenor
{
class Program
{
static void Main(string[] args)
{
// definicion y declaracion de variables
string valor = "";
int n = 0;
float promedio = 0.0f;
float acumula = 0.0f;
float minimo = 0.0f;
float maximo = 0.0f;
float[] numero = new float[10];// creamos el arreglo
for (n=0;n<10;n++)
{
Console.Write("Ingrese un valor: ");
valor = Console.ReadLine();
numero[n]=Convert.ToSingle(valor);
}
maximo = numero[0]; // incializamos a maximo con el
primer elemento
minimo = numero[0];// incializamos a minimo con el primer
elemento
for (n = 0; n < 10; n++)
{
if (numero[n] > maximo)
maximo = numero[n];
if (numero[n] < minimo)
minimo = numero[n];
acumula = acumula + numero[n];
}
promedio = acumula / 10;
Console.WriteLine("El promedio es : {0}",promedio);
Console.WriteLine("El valor mayor es : {0}",maximo);
Console.WriteLine("El valor menor es : {0}",minimo);
}
}
}

.NET para Docentes y Alumnos. Programando en C#

En resmen, es ms sencillo manejar arreglos como una lista, que gran


cantidad de variables con diferentes nombres.

Arreglos con 2 dimensiones (bidimensional o matriz)


Todos hemos solicitado una carta de precios en algn restaurant, y en ella
vemos los platos de comida y su respectivo precio. Si lo pasamos a un arreglo
bidimensional, podemos pensar que son 2 columnas, una corresponde a los
platos de comida y la otra contiene los precios, y si contamos la cantidad de
platos que ese restaurant ofrece, estaramos deduciendo la cantidad de filas
(por ejemplo 50 platos). Es decir que tendramos una matriz compuesta de 2
columnas y 50 filas.
Plato

Precio

Milanesa con papas fritas


Filete de merluza con
ensalada

Zapallitos rellenos

18 $
20 $

15 $

Declaracin de los arreglos bidimensionales.


La declaracin de los arreglos bidimensionales, es similar a los de solo
una dimensin.
Ejemplo de la declaracin de arreglos bidimensionales.
float[ , ] precios =new float [2,10];
En nuestro caso la tabla ser de tipo flotante, lo identificamos con el
nombre precios, luego New para crearlo y por ultimo instanciamos con [ , ]
indicando que tendr 2 columnas y 10 filas es decir 20 elementos en total.
Otros ejemplos de declaracin de arreglos bidimensionales vlidos:
Int fila=10;
Int columna=2;
float[ , ] precios =new float [fila , columna];
Para asignarle un valor a algn elemento al arreglo bidimensional,
deberemos conocer su nombre y su posicin dentro de la matriz (la fila y su
columna).
Ejemplo:
precio[2,3] = 10.5f;

.NET para Docentes y Alumnos. Programando en C#

Lo ms usual, va ser cargar una matriz utilizando bucles. Para eso, vamos
a tener que utilizar dos bucles anidados, uno con una variable de control de las
filas y el otro con una variable diferente de control, correspondiente a las
columnas.

Vamos a confeccionar un ejemplo:

Confeccionar una matriz compuesta por 5 productos, con sus


precios de costo y los de lista.
Producto

Precio Costo

Precio lista

550 $
220 $

100 $

700$
300$

Tv
DVD

Licuadora

150$

using System;
using System.Collections.Generic;
using System.Text;
namespace cargamatriz
{
class Program
{
static void Main(string[] args)
{
int fila = 5;
int columna = 3;
string valor = "";
// declaracion de la matriz
string[,] productos = new string[fila,columna];
for (fila=0;fila<=4;fila++)
{
for (columna = 0; columna <= 2;columna++ )
{
Console.Write("ingrese informacion fila {0}
columna {1} :", fila, columna);
valor = Console.ReadLine();
productos[fila, columna] = valor;
}
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Hay mucho para discutir, como porque se ingresaron precios en formato


string, en el ingreso de los datos dice informacin y no definir que estamos
ingresando realmente, etc. Ya vamos a ver como mejorar, pero la idea era, que
vean como se carga una matriz con bucles anidados.

Vamos a confeccionar una nueva aplicacin utilizando matrices.

Fuimos contratados por una empresa de turismo, que desea


saber:
Cul es el destino con el pasaje ms caro.
Cul es el precio del pasaje ms barato.
Existe el destino Mar del plata.
Dicha empresa posee en la actualidad 10 destinos. (Por lo tanto podemos
crear una matriz de 10 filas por 2 columnas).
Destino
Bariloche
Mar del plata

Jujuy
using System;
using System.Collections.Generic;
using System.Text;
namespace agenciaturismo
{
class Program
{
static void Main(string[] args)
{
int fil = 10;
int col = 2;

Pasaje ($)
190 $
75 $

180 $

.NET para Docentes y Alumnos. Programando en C#

bool existe = false;


string[,] turismo = new string[fil, col]; // declaro la
matriz turismo
for (fil = 0; fil <= 9; fil++) // Carga de destinos y
precios
{
Console.Write("Ingrese el destino: ");
turismo[fil,0] = Console.ReadLine();
Console.Write("Ingrese el costo del Pasaje: ");
turismo[fil,1] = Console.ReadLine();
Console.WriteLine("*******************************");
}
// declaracion de variables
string destinocaro="";
float pasajecaro=0.0f;
float pasajebarato=0.0f;
// inicializacion
destinocaro = turismo[1, 0];
pasajecaro = Convert.ToSingle(turismo[1, 1]);
pasajebarato = Convert.ToSingle(turismo[1, 1]);
for (fil = 0; fil <= 9; fil++)
{
// determina el destino mas caro
if (Convert.ToSingle( turismo[fil, 1]) > pasajecaro)
{
destinocaro = turismo[fil, 0];
pasajecaro = Convert.ToSingle(turismo[fil, 1]);
}
// determina el pasaje mas barato
if (Convert.ToSingle(turismo[fil, 1]) < pasajebarato)
{
pasajebarato = Convert.ToSingle(turismo[fil, 1]);
}
// determina si existe o no el destino mar del plata
if (turismo[fil, 0] == "mar del plata")
{
existe=true;
}
}
Console.WriteLine("El destino mas caro es {0} a un precio
{1}: ", destinocaro, pasajecaro);
Console.WriteLine("El pasaje mas barato es {0}",
pasajebarato);
if (existe == true)
{
Console.WriteLine("Existe el destino Mar del
Plata.");
}
else
{
Console.WriteLine("NO Existe el destino Mar del
Plata.");
}
}

.NET para Docentes y Alumnos. Programando en C#

}
}

Arreglos del tipo Jagged


Existe un tipo de arreglos especial denominado Jagged. Este tipo de
arreglo lo podremos utilizar cuando necesitamos de una matriz con columnas
de diferentes filas. Pues si utilizamos el tipo de matriz que hemos visto, para
este problema determinado, posiblemente estaramos desperdiciando memoria.
Por ejemplo, si queremos procesar las notas de alumnos de diferentes
cursos, puede llegar a ocurrir que en un curso tenga 10 alumnos pero en otro
15. Para este ejemplo sera adecuado utilizar este nuevo tipo de arreglo.
Curso0
7
8
9

Curso1
5
8

Curso2
4
8
9
6

Curso3
10

Este arreglo, acta como contenedor de otros arreglos, deber ser


declarado de una forma especial para poder utilizarlo. Para esto, primero
deberemos declarar el arreglo contenedor y luego cada uno de los arreglos
independientes.
Aqu le muestro una estructura de un arreglo jagged:
// declaramos el arreglo contenedor para la carga
// de edades de 4 familias

.NET para Docentes y Alumnos. Programando en C#

int[][] edades = new int[4][];


// declaramos los arreglos - edades por familia
edades[0] = new int[4]; // esta familia posee
edades[1] = new int[3]; // esta familia posee
edades[2] = new int[5]; // esta familia posee
edades[3] = new int[7]; // esta familia posee

4
3
5
7

integrantes
integrantes
integrantes
integrantes

Declaramos un arreglo jagged con el nombre de edades, podemos


observar que junto al tipo he puesto dobles corchetes (int [ ][ ]), esto indica que
es un arreglo de arreglo y no una matriz o arreglo estndar. En el lado derecho
del signo igual la instruccin New para la creacin del objeto, el tipo y el primer
corchete con un numero 4 indicando que va tener en su interior 4 arreglos (en
este caso la cantidad de familias); el corchete siguiente vacio pues no sabemos
la cantidad que va a contener cada columna o que la cantidad es variable.
Luego, he inicializado cada uno de los vectores con la cantidad de
elementos que estos posee, en nuestro caso la primera familia tiene 4
integrantes, la segunda 3 y as sucesivamente.
Si conociramos las edades de cada familia, otra manera de declarar e
inicializar el arreglo jagged, seria de esta manera:
int [][] edades=new int[4][];
edades[0] = new int[] {45,39,16,9};
edades[1] = new int[] {25,23,3};
edades[2] = new int[] {47,42,17,16,10};
edades[3] = new int[] {62,56,25,22,18,15,10};

Otra manera ms de declaracin de arreglos tipo Jagged es la siguiente:


Presten atencin a las llaves y a la separacin por coma de cada uno de los
vectores.
int[][] edades = new int[][]
{
new int[] { 45, 39, 16, 9 },
new int[] { 25, 23, 3 },
new int[] { 47, 42, 17, 16, 10 },
new int[] { 62, 56, 25, 22, 18, 15, 10 }
};

Para acceder a un elemento del arreglo Jagged para asignarle un valor no


solo necesitamos el nombre del mismo sino que tambin los ndices de su
ubicacin. Ejemplo:
Edades[1][4]=9; // le asignamos 9 al cuarto integrante de la
primera familia, es decir primera columna y cuarta fila.

Y para mostrar por consola los elementos del arreglo Jagged, podemos
editar los siguiente:
Console.WriteLine("la edad es : {0}",edades[2][3]);

.NET para Docentes y Alumnos. Programando en C#

Vamos a realizar un problema viendo un arreglo jagged.

Carguemos las edades de cuatro familias con diferentes


cantidades de integrantes. Luego mostrar las edades de cada familia por
pantalla.

Para resolver este problema utilizaremos una funcin especial


denominada getlength esta permite determinar la cantidad de elementos del
arreglo.
using System;
using System.Collections.Generic;
using System.Text;
namespace arreglojagged
{
class Program
{
static void Main(string[] args)
{
int n=0;
int m = 0;
int cantidadintegrantes = 0;
// declaramos el arreglo contenedor para la carga
// de edades de 4 familias
int [][] edades=new int[4][];
// declaramos los arreglos - edades por familia
edades[0] = new int[] {45,39,16,9};
edades[1] = new int[] {25,23,3};
edades[2] = new int[] {47,42,17,16,10};
edades[3] = new int[] {62,56,25,22,18,15,10};
for (n = 0; n <= 3;n++ )
{
cantidadintegrantes = edades[n].GetLength(0);
// getlength determina la cantidad de elementos del
arreglo
Console.WriteLine("longitud de cada familia {0}",
cantidadintegrantes);
for (m = 0; m < cantidadintegrantes;m++ )
{
Console.WriteLine("de la familia {0} la edad del
integrante {1}", n,edades[n][m]);
}
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Los arreglos utilizados como parmetros en funciones.


Hasta el momento, los arreglos fueron utilizados dentro de Main(), pero es
posible que tengamos que utilizarlo como parmetro y enviarlo a una funcin.
Vemos en una estructura simple, de cmo deberemos programar:
En Main()
Int[] numeros =new int[10]; // declaramos un arreglo

Muestranumeros(numeros); // invocamos la funcin


En la funcin
Static void Muestranumeros(int[] arreglo)// recibe el
arreglo
{
...
}

Hagamos el ltimo problema de esta unidad.

Carguemos 10 valores y luego lo mostraremos en una funcin.


using System;
using System.Collections.Generic;
using System.Text;
namespace arreglocomoparametro
{
class Program
{
static void Main(string[] args)
{

.NET para Docentes y Alumnos. Programando en C#

int n = 0;
string valor = "";
// declaramos el arreglo
int[] numeros=new int[10];
for (n = 0; n <= 9; n++)
{
Console.Write("Ingrese un valor: ");
numeros[n] = Convert.ToInt32(Console.ReadLine());
}
Muestranumeros(numeros); // invoca a la funcin
}
// definimos la funcion
static void Muestranumeros(int[] arreglo)
{
int m=0;
for (m = 0; m <= 9;m++ )
{
Console.WriteLine("Posicion {0} valor del arreglo {1} ",
m,arreglo[m]);
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 6.

1 . Realizar un programa, donde el usuario pueda cargar en un arreglo o


vector, las 20 temperaturas tomadas a orilla de un rio cada una hora.
Luego determinar:
a. Temperatura promedio
b. Temperatura mayor
c. A qu hora se determin la temperatura menor.
2 . Una concesionaria de automviles carga en una matriz su listado de 10
automviles, con sus respectivos precios.
Automvil
Ford fiesta
Fiat siena

Renault 19

precio ($)
25000 $
26500 $

18000 $

Determinar:
a. Suma total de precios.
b. Cul es el automvil de mayor precio.
c. Hay en existencia un automvil Citron 3cv.

3 .Cargar en un arreglo jagged las ventas en pesos realizadas en la


semana:
Lunes
20 35 40 100
Martes
35 90
mircole 100 56 15 25 - 100 - 26
s
Jueves
200 -15 56
Viernes
15 12 - 50 60
Sbado
120 25 -30 -70
a.
b.
c.
d.

Determinar en que da se ha realizado la venta mayor.


Total de ventas en pesos.
Cantidad de ventas por da.
Cuantas ventas superaron los 50$.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 6.
1 la solucin al primer problema es:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion1
{
class Program
{
static void Main(string[] args)
{
/*Realizar un programa, donde el usuario pueda cargar en un
* arreglo o vector, las 20 temperaturas tomadas a orilla de
* un rio cada una hora. Luego determinar:
* a.Temperatura promedio
* b.Temperatura mayor
* c.A que hora se determino la temperatura menor.
*/
// declaracion de variables y arreglos
int x = 0;
string valor = "";
int temmayor = 0;
int temmenor = 0;
int horamenor = 0;
float promedio=0.0f;
int[] tenperaturas= new int[10];
//proceso
for(x=0;x<10;x++)
{
System.Console.Write("\n Ingrese la temperatura de la
hora {0} : ",x+1);
valor = System.Console.ReadLine();
tenperaturas[x] = System.Convert.ToInt32(valor);
}
//determina y muestra las soluciones
for (x = 0; x < 10; x++)
{
promedio = promedio + tenperaturas[x];
if ((x==0)||(tenperaturas[x]>temmayor))
{
temmayor=tenperaturas[x];
}
if ((x == 0) || (tenperaturas[x] < temmenor))
{
temmenor = tenperaturas[x];
horamenor = x+1;
}
}
promedio = promedio / 10;
System.Console.WriteLine("El promedio es: {0}",promedio);
System.Console.WriteLine("La Temperatura Mayor es: {0}",
temmayor);

.NET para Docentes y Alumnos. Programando en C#

System.Console.WriteLine("La hora de la temperatura Menor


es: {0}", horamenor);
}
}
}

Su visualizacin es:

2 la solucin al siguiente problema es:


using System;
using System.Collections.Generic;
using System.Text;
namespace solucion2
{
class Program
{
static void Main(string[] args)
{
/*Una concesionaria de automviles carga en una matriz
* su listado de 10 automviles, con sus respectivos precios.
* Determinar:
* a.Suma total de precios.
* b.Cual es el automvil de mayor precio.
* c.Hay en existencia un automvil Citroen 3cv.
*/
// inicializacion de variables y arreglos
int x = 0;
string valor = "";
float totalprecios = 0.0f;
float preciomayor = 0.0f;
string autopreciomayor = "";
bool existe3cv = false;
string[,] autos = new string[20,2];
for (x = 0; x < 10; x++)
{

.NET para Docentes y Alumnos. Programando en C#

System.Console.Write("Ingrese la marca del Automovil:


");
valor = System.Console.ReadLine();
autos[x,0] = valor;
System.Console.Write("Ingrese el precio: ");
valor = System.Console.ReadLine();
autos[x,1] = valor;
}
// procesos para responder las preguntas
for (x = 0; x < 10; x++)
{
totalprecios=totalprecios+System.Convert.ToSingle(autos[x,1]);
if ((x == 0)||
(System.Convert.ToSingle( autos[x,1])>preciomayor))
{
preciomayor=System.Convert.ToSingle(autos[x,1]);
autopreciomayor = autos[x, 0];
}
if (autos[x, 0] == "Citroen 3cv")
{
existe3cv = true;
}
}
System.Console.WriteLine("El total de precio es:
{0}",totalprecios);
System.Console.WriteLine("El auto de precio mayor es:
{0}", autopreciomayor);
if (existe3cv == true)
{
System.Console.WriteLine("Existe el Citroen 3cv");
}
else
{
System.Console.WriteLine("NO Existe el Citroen 3cv");
}
}
}
}

Por monitor debe mostrarse lo siguiente:

3 la solucin al ltimo problema es:

.NET para Docentes y Alumnos. Programando en C#

using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program
{
static void Main(string[] args)
{
/*3
Cargar en un arreglo jagged las ventas en pesos
realizadas
* en la semana
* a.Determinar en que da se ha realizado la venta
mayor.
* b.Total de ventas en pesos.
* c.Cantidad de ventas por da.
* d.Cuantas ventas superaron los 50$.
*/
// inicializacion de variables y arreglos
int x = 0;
int y = 0;
int contador = 0;
float totalventas = 0.0f;
int cantidadventas = 0;
int mayorventa = 0;
int numerodiamayorventa = 0;
string nombredia = "";
int [][] ventas=new int[6][];
ventas[0]=new int[]{20,35,40,100};
ventas[1]=new int[]{35,90};
ventas[2]=new int[]{100,56,15,25,100,26};
ventas[3]=new int[]{200,15,56};
ventas[4]=new int[]{15,12,50,60};
ventas[5] = new int[] { 120, 25, 30, 70 };
// proceso
mayorventa=ventas[0][0];
for (x = 0; x <= 5;x++)
{
cantidadventas = ventas[x].GetLength(0);
System.Console.WriteLine("Cantidad de ventas del dia
{0}: {1}",x+1,cantidadventas);
for (y = 0; y <= cantidadventas-1; y++)
{
totalventas=totalventas+ventas[x][y];
if (ventas[x][y] > 50)
contador = contador + 1;
if (ventas[x][y]>mayorventa)
{
mayorventa=ventas[x][y];
numerodiamayorventa = x;
}
}
}
System.Console.WriteLine("Total de Ventas en ($) {0}",
totalventas);
System.Console.WriteLine("Cantidad de Ventas que superan
los 50$: {0}",contador);
switch (numerodiamayorventa)
{

.NET para Docentes y Alumnos. Programando en C#

case 0:
nombredia
break;
case 1:
nombredia
break;
case 2:
nombredia
break;
case 3:
nombredia
break;
case 4:
nombredia
break;
case 5:
nombredia
break;

= "Lunes";
= "Martes";
= "Miercoles";
= "Jueves";
= "Viernes";
= "Sabado";

}
System.Console.WriteLine("el dia de la venta mayor
es: {0}",nombredia);
}
}
}

Por consola vemos:

.NET para Docentes y Alumnos. Programando en C#

Unidad 7
Las Colecciones.
Tiempo estimado: 120 minutos

Las colecciones son de suma utilidad. Poseen las ventajas de permitirnos


guardar datos dinmicos (permite el ingreso y borrado de datos), acceder a una
mayor flexibilidad en la gestin de los mismos, se pueden utilizar todos los tipos
de datos que hemos visto sin ningn inconveniente (float, int, string, etc.), etc.
El lenguaje C#, dispone de colecciones importantes para el manejo de
datos dinmicos, y nosotros aprenderemos a manejar las siguientes:
Arraylist: Es la ms parecida a un arreglo, con la posibilidad de
cambiar la cantidad de elementos cuando lo necesitemos.
Stack: O pila, es decir que es una estructura de tipo LIFO (lo ltimo
que entra es los primero en salir).
Queue: O cola, estructura del tipo FIFO (el primero en entrar, es el
primero en salir).
Hashtable: Es una coleccin indexada, es decir que deberemos
tener en todo momento un ndice y un valor referenciado a este.
Ampliar con explicaciones y ejemplos, las colecciones enumeradas
recientemente:

Coleccin Arraylist
El Arraylist guardar la informacin en forma de lista, y sobre ella
podremos realizar diferentes tipos de actividades con los elementos que la
conforman.
Para poder gestionar los elementos de esta coleccin, se poseen
propiedades importantes que nos permitir conocer el tamao que este ocupa
(capacidad), otra llamada conteo, que nos indicar la cantidad de elementos,
etc.
Para que nuestra aplicacin acepte este nuevo Objeto, al Arraylist
deberemos declararlo de la siguiente manera:

.NET para Docentes y Alumnos. Programando en C#

Antes de indicarle como se deben declarar las colecciones


que he enumerado, debern asegurarse que estn usando las colecciones del
sistema. Por lo tanto, en la parte superior del cdigo, deber estar indicado de
la siguiente manera:
using System.Collections;

Luego ya podemos declarar el ArrayList


ArrayList nombredelarraylist = new ArrayList(3);

En la declaracin, ArrayList es el nombre de la clase, luego sigue la


denominacion nombredelaarraylist de este coleccin dado por nosotros, y en
la parte derecha realizamos el instanciamiento que se lleva a cabo con New.
He instanciado el arreglo con un valor (3); de esta forma indico la cantidad de
elementos, pero pueden dejarlo vacia si no saben cuantos elementos voy a
tener que ingresar.
Una vez que hemos creado el ArrayList, les mostar los mtodos mas
tiles.

Add(). Agregar datos en ArrayList


El mtodo para agregar un nuevo dato a nuestro arreglo es Add(). Este
nuevo elemento se incorporar siempre al final de la lista. Necesita de un nico
parmetro, que es valor del dato que queremos guardar.
Ejemplos:
nombredelarraylist.Add(5); // variable explicita
nombredelarraylist.Add(numero); // variable implicita
nombredelarraylist.Add(azul); // una cadena

El mtodo Add(), tambin nos da la informacin del ndice donde fue


ingresado el elemento. En este cdigo de ejemplo, aado el valor 10 al arreglo
y asigno el ndice a una variable, para luego mostrarla por consola (dos tareas
en un solo paso).
int indice = 0;
indice = velocidades.Add(10);
Console.WriteLine("Se ha ingresado
{0}",indice);

el

dato

en

la

posicion

Cmo acceder a la informacin cargada? Ser sencillo haciendo uso del


nombre y del ndice de la posicin que el elemento ocupa en el arreglo.
Recuerden, que el primer elemento posee la posicin 0 (cero).
Para mostrar por consola.
Console.WriteLine("Primer elemento {0}", nombredelarraylist[3]);

Utilizar el valor en una expresion aritmetica.

.NET para Docentes y Alumnos. Programando en C#

Resultado=nombredelarraylist[5]*0.15f;

Asignar un valor.
nombredelarraylist[2]= amarillo;

foreach. Un nuevo ciclo.


Antes de continuar, veamos un nuevo ciclo especifico interador, para la
colecciones que estamos viendo.
Este ciclo, nos permitir recorrer el contenido de la coleccin en forma
secuencial, uno por uno hasta que no tenga ms elementos.
La estructura del mismo es:
foreach (tipo identificador in expresion)
{
sentencias;
}

El tipo se refiere al tipo de informacin que se guarda en la coleccin.


Luego una variable que representa al elemento en el arreglo, denominada
identificador. El trmino expresin, se refiere a la coleccin que recorreremos
con el ciclo. Por ltimo; sentencias, es el cdigo de bloque que se ejecutar en
cada vuelta.

Les muestro un ejemplo muy sencillo. He cargado 4 valores


enteros y los muestro en el ciclo.
using System;
using System.Collections;
using System.Text;
namespace aplicacionarraylist
{
class Program
{
static void Main(string[] args)
{
ArrayList nombredelarraylist = new ArrayList(3);
nombredelarraylist.Add(15);
nombredelarraylist.Add(35);
nombredelarraylist.Add(55);
nombredelarraylist.Add(99);
foreach (int numero in nombredelarraylist)
{
Console.WriteLine("Elemento {0}", numero);
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Count. Cantidad de elementos


Vamos a poder determinar con Count, la cantidad de elementos que
posee el ArrayList. Devuelve un valor entero.
int cantidadelementos = 0;
cantidadelementos = nombredelarraylist.Count;
Console.WriteLine("posee {0} elementos", cantidadelementos);

Insert. Inserta un elemento.


Tambin es posible insertar un elemento, es decir agregarlo en el lugar
que nosotros necesitemos que este. No nos debemos preocupar por el tamao
del arreglo, automticamente el compilador de C# lo administrar. Para esto
harn falta dos parmetros, el ndice o posicin del elemento y el valor del
elemento a insertar.
nombredelarraylist.Insert(2, 5); // estamos ingresando el valor
5 en la tercera posicion del arreglo.

Removeat(). Elimina un elemento.


Para eliminar un elemento de la lista utilizaremos el mtodo Removeat().
Para esto deberemos conocer el ndice del elemento a eliminar.
nombredelarraylist.RemoveAt(3);

Clear(). Elimina Todos los elementos.


Con clear(), se eliminar todos los elementos que contenga el ArrayList,
sin previa indicacin del usuario, por lo tanto, deber utilizarse con sumo
cuidado.
velocidades.Clear();

Indexof(). Encuentra un elemento.


Con el mtodo indexof() podemos determina la posicin de un elemento
dentro de la lista. Para eso, lo nico que necesitamos, es un parmetro, el valor
del elemento a buscar y la funcin nos devolver la posicin dentro de la
coleccin.

.NET para Docentes y Alumnos. Programando en C#

A tener en cuenta: el valor que nos devuelve corresponde a


la primera ocurrencia y si el elemento no se encuentra devuelve -1.
int posicion = 0;
posicion=nombredelarraylist.IndexOf(99);
Console.WriteLine("posicion del elemento buscado {0}",posicion);

Para ver el funcionamiento del ArrayList, crearemos una nueva


aplicacin:

Crear una aplicacin usando ArrayList, que permita al usuario


elegir alguna de las opciones del men, con respecto a datos concernientes a
velocidades de automviles.
Opciones a tener en cuenta:

Ingresar una nueva velocidad y que muestre la posicin.


Mostrar la totalidad del arreglo.
Exponer un valor en funcin de su posicin.
Modificacin de una velocidad existente.
Eliminar un elemento existente.
Localizar la posicin de un elemento existente.
Borrar todo el contenido de la lista.

using System;
using System.Collections;
using System.Text;
namespace aplicacionarraylist
{
class Program
{
static void Main(string[] args)
{
// declaracion de variable
int opcion = 0;
int dato = 0;
int indice = 0;
// declaramos el Arraylist
ArrayList velocidades = new ArrayList();
do
{
Console.WriteLine(" **** Menu de Opciones ****");
Console.WriteLine("1 - Ingreso de una nueva
velocidad");
Console.WriteLine("2 - Muestra las velocidades.");
Console.WriteLine("3 - Expone una velocidad en
funcion de su posicion.");
Console.WriteLine("4 - Modificacin de una
velocidad.");

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("5 - Insertar una velocidad en una


posicion.");
Console.WriteLine("6 - Eliminar una Velocidad.");
Console.WriteLine("7 - Localiza la posicion de una
velocidad.");
Console.WriteLine("8 - Borra el contenido de la
lista.");

Console.WriteLine("9 - Sale de la Aplicacion.");


Console.Write("ingrese la opcion deseada .... ");
opcion = Convert.ToInt32(Console.ReadLine());
// uso del Add - ingreso de datos
if (opcion == 1)
{
Console.Write("ingrese una velocidad: ");
dato= Convert.ToInt32(Console.ReadLine());
//velocidades.Add(dato);
indice = velocidades.Add(dato);
Console.WriteLine("Se ha ingresado el dato en la
posicion {0}",indice);
}
// invoca una funcion para mostra los valores
if (opcion == 2)
{
Muestra(velocidades);
}
// Expone un dato en funcion del indice
if (opcion == 3)
{
Console.Write("ingrese la posicion en el Listado:
");
indice = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("La velocidad ubicada en la
posicion {0} es {1}", indice, velocidades[indice]);
}
// modifica un valor existente
if (opcion == 4)
{
Console.Write("ingrese la posicion de la
Velocidad a Modificar: ");
indice = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("La velocidad ubicada en la
posicion {0} es {1}", indice, velocidades[indice]);
Console.WriteLine("Ingrese el nuevo valor de la
velocidad: ");
dato = Convert.ToInt32(Console.ReadLine());
velocidades[indice] = dato;
}
// modifica un valor existente
if (opcion == 5)
{
Console.Write("Ingrese la posicion de la
Velocidad a Insertar: ");
indice = Convert.ToInt32(Console.ReadLine());
Console.Write("Ingrese el valor de la Velocidad a
Insertar: ");

.NET para Docentes y Alumnos. Programando en C#

dato = Convert.ToInt32(Console.ReadLine());
velocidades.Insert(indice, dato);
}
// Elimina un valor existente
if (opcion == 6)
{
Console.Write("Ingrese la posicion de la
Velocidad a Eliminar: ");
indice = Convert.ToInt32(Console.ReadLine());
velocidades.RemoveAt(indice);
}
// localiza la posicion de un valor existente
if (opcion == 7)
{
Console.Write("Ingrese la Velocidad a Localizar:
");
dato = Convert.ToInt32(Console.ReadLine());
indice = velocidades.IndexOf(dato);
Console.WriteLine("La velocidad {1} esta ubicada
en la posicion {0} es {1}", indice, dato);
}
// Borra el contenido de la lista
if (opcion == 8)
{
velocidades.Clear();
Console.WriteLine("Se eliminaron todos las
velocidades");
}
} while (opcion != 9); // sale de la aplicacion
}
static void Muestra(ArrayList arreglo)
{
Console.WriteLine(" **** Listado de Velocidades ****");
foreach(int auxvelocidad in arreglo)
{
Console.WriteLine("Velocidades: {0}",auxvelocidad );
}
Console.WriteLine(" **** Fin del Listado de Velocidades
****");
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Coleccin Stack.
Otro tipo de coleccin conocida es la Stack o Pila, al igual que la lista nos
va a permitir operar dinmicamente, pero con la salvedad que esta coleccin
trabaja en forma diferente.
El Stack es una estructura de tipo LIFO (last in first out), es decir que el
primer elemento que entra es el ltimo en salir. Los datos ingresados se irn
apilando uno arriba de otro.
Para crear un Stack, deberemos instanciarlo al igual que hicimos con
otros objetos. Y dentro de la clase Stack, encontraremos varios mtodos para el
manejo de los elementos que lo compongan.
Stack arreglopila = new Stack();

Push(). Ingreso de datos.


El mtodo para colocar un nuevo dato se denomina Push(). Este mtodo
colocar al nuevo dato en la parte superior de la pila. Solo necesita un
parmetro que es el valor del dato que se quiere ingresar.
Por ejemplo:
arreglopila.Push(5);

Pop(). Toma un valor.


El mtodo Pop(), lo utilizaremos para tomar un dato (el que se encuentra
en la parte superior). Luego de la operacin, se elimina el dato de la lista.

Count. Cantidad de elementos


Vamos a poder determinar con Count, la cantidad de elementos que
posee el Stack. Devuelve un valor entero.
int cantidad = 0;
cantidad = arreglopila.Count;

Clear(). Elimina Todos los elementos.


Con clear() se eliminara todos los elementos que contenga el Stack.
arreglopila.Clear();

Contains(). Indica la existencia de un elemento.


Con el mtodo Contains(), podremos determina si existe un elemento
dentro de la pila. Para eso, lo nico que necesitamos es un parmetro; el valor
del elemento a buscar, y la funcin nos devuelve un valor de tipo booleano (true
o false).
bool esta = false;
esta = arreglopila.Contains(9);

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("la existencia es {0}", esta);

foreach.
Utilizaremos este ciclo para ver los elementos de las colecciones que
estamos desarrollando.
Haremos un pequeo programa que nos muestre lo aprendido con
respecto a la coleccin Stack.

Esta aplicacin, aade 5 valores a una pila y aplica los


mtodos recin vistos.
using System;
using System.Collections;
using System.Text;
namespace aplicacionstack
{
class Program
{
static void Main(string[] args)
{
// declaracion de variable
int cantidad = 0;
bool esta = false;
// declaracion del Stack
Stack arreglopila = new Stack();
arreglopila.Push(1);
arreglopila.Push(3);
arreglopila.Push(5);
arreglopila.Push(7);
arreglopila.Push(9);
Mostrar(arreglopila); // muestra la pila
esta = arreglopila.Contains(9);
Console.WriteLine("la existencia es {0}",esta);
arreglopila.Pop(); // elimina el primer valor
Console.WriteLine("luego del Pop().");
Mostrar(arreglopila);
cantidad = arreglopila.Count;
Console.WriteLine("Cantidad de elementos: {0}",cantidad);
arreglopila.Clear();
Console.WriteLine("luego del Clear().");
cantidad = arreglopila.Count;
Console.WriteLine("Cantidad de elementos: {0}",
cantidad);
}
static void Mostrar(Stack pila)
{
foreach(int elemento in pila)
{
Console.WriteLine("el elemento de la pila es
{0}",elemento);
}

.NET para Docentes y Alumnos. Programando en C#

}
}
}

Coleccin Queue.
La coleccin siguiente se conoce con el nombre Queue o cola. La
manera en que trabaja es la siguiente, va acumulando los valores en una cola
es decir uno tras el otro.
Para declarar un Queue(), lo haremos de la siguiente manera:
Queue arreglocola = new Queue();

Una vez que esta instanciado, podremos hacer uso de los mtodos que
nos provee la clase.

Enqueue(). Ingresa nuevo valor


Para ingresar un nuevo elemento a la cola, utilizaremos este mtodo,
Enqueue(). Lo dispondr al final y solo requiere un parmetro el valor que
deseamos incorporar a la cola.
Ejemplo:
arreglocola.Enqueue(109);

Dequeue(). Extrae un valor


Para extraer un elemento de la cola utilizaremos el mtodo Dequeue().
Tomar el primer valor ingresado, o el que se encuentra en la parte superior o al
inicio.
arreglocola.Dequeue();

Contains(). Indica la existencia de un elemento.


Con el mtodo Contains(), podemos determinar si existe o no, un
elemento dentro de la cola. Para eso, lo nico que necesitamos es un
parmetro que es el valor del elemento a buscar y la funcin nos devolver un
valor booleano (true o false).

.NET para Docentes y Alumnos. Programando en C#

bool esta = false;


esta = arreglocola.Contains(5);

Count. Cantidad de elementos


Vamos a poder determinar con Count, la cantidad de elementos que
posee el Queue. Devuelve un valor entero.
int cantidad = 0;
cantidad = arreglocola.Count;

Clear(). Elimina Todos los elementos.


Con Clear() se eliminara todos los elementos que contenga el Queue.
arreglocola.Clear();

foreach.
Una vez ms, utilizaremos este ciclo para ver los elementos de las
colecciones que estamos desarrollando.
Probaremos los mtodos vistos en una coleccin del tipo Queue.

Una vez ingresados 5 valores, probar los mtodos


enunciados.
using System;
using System.Collections;
using System.Text;
namespace aplicacionqueue
{
class Program
{
static void Main(string[] args)
{
// definicion de variables
bool esta = false;
int cantidad = 0;
// definicion del Queue
Queue arreglocola = new Queue();
arreglocola.Enqueue(1);
arreglocola.Enqueue(3);
arreglocola.Enqueue(5);
arreglocola.Enqueue(7);
arreglocola.Enqueue(9);
Mostrar(arreglocola);
arreglocola.Dequeue();
Console.WriteLine("luego de Dequeue");

.NET para Docentes y Alumnos. Programando en C#

// luego de dequeue
Mostrar(arreglocola);
//indica si esta el valor 5
esta = arreglocola.Contains(5);
if (esta)
{
Console.WriteLine("el valor 5 esta en la cola");
}
else
{
Console.WriteLine("el valor 5 no esta en la cola");
}
arreglocola.Clear();
cantidad = arreglocola.Count;
Console.WriteLine("Existen {0} valores en el
Queue.",cantidad);
}
static void Mostrar(Queue arreglo)
{
foreach(int elemento in arreglo)
{
Console.WriteLine("el elemento es: {0}", elemento);
}
}
}
}

Coleccin Hashtable
Esta ltima coleccin de datos que veremos en este texto, es la ms
compleja, su nombre es Hashtable. Es una coleccin indexada, es decir, que
deberemos tener en todo momento un ndice (Key o llave) y un valor (value)
referenciado a este.
La declaracin del Hashtable es la siguiente:
Hashtable arregloindexado = new Hashtable();

Add(). Agrega un elemento.


Podemos agregar cualquier cantidad de elementos a la coleccin solo
bastar utilizar el mtodo Add(). Aqu vamos a necesitar 2 parmetros, el
primero es el Key o ndice que ser usado para indexar el elemento (puede ser
de cualquier tipo) y el segundo ser el valor a insertar.
Ejemplo:

.NET para Docentes y Alumnos. Programando en C#

arregloindexado.Add("carlos", 18);

foreach.
Una vez ms, utilizaremos este ciclo para ver los elementos de las
colecciones que estamos desarrollando. Pero, deberemos hacer uso de una
clase denominada DictionaryEntry pues deberemos guardar pareja de datos
(key - value);
El formato es el siguiente:
foreach(DictionaryEntry datos in arreglo)
{
Console.WriteLine("indice {0} elemento {1}",datos.Key,
datos.Value);
}

Clear(). Elimina Todos los elementos.


Con Clear(), se eliminar todos los elementos que contenga la coleccin
Hashtable.
arregloindexado.Clear();

Contains(). Indica la existencia de un elemento.


Con el mtodo Contains(), podremos determinar si existe o no un
elemento dentro de esta coleccin indexada. Para eso, lo nico que
necesitamos, es un parmetro el valor del elemento a buscar y la funcin nos
devuelve un valor booleano (true o false).
bool esta = false;
esta = arregloindexado.Contains(carlos);

Count. Cantidad de elementos


Vamos a poder determinar con Count, la cantidad de elementos que
posee el Hashtable. Devuelve un valor entero.
int cantidad = 0;
cantidad = arregloindexado.Count;

Remove(). Elimina un elemento.


Para eliminar un elemento del arreglo indexado utilizaremos el mtodo
Remove(). Para llevar poder eliminar necesitamos conocer el ndice, que ser
utilizado como parmetro.
arregloindexado.Remove(3);

.NET para Docentes y Alumnos. Programando en C#

Realicemos un ejemplo para ver este caso de coleccin.

Una vez ingresados 5 valores, probemos los mtodos


enunciados en el siguiente ejemplo.
using System;
using System.Collections;
using System.Text;
namespace aplicacionhashtable
{
class Program
{
static void Main(string[] args)
{
// declaracion de variables
bool existe = false;
int cantidad = 0;
//declaracion de la coleccion Hashtable
Hashtable arregloindexado = new Hashtable();
arregloindexado.Add("carlos", 18);
arregloindexado.Add("martin", 17);
arregloindexado.Add("daniela",15);
arregloindexado.Add("mariano",10);
arregloindexado.Add("silvina",16);
Mostrar(arregloindexado); // invocacion de la funcion
para mostrar
existe = arregloindexado.Contains("carlos");
Console.WriteLine("El seor Carlos su existencia es {0}",
existe);
arregloindexado.Remove("carlos");
Mostrar(arregloindexado);
cantidad = arregloindexado.Count;
Console.WriteLine("Hay {0} elementos", cantidad);
arregloindexado.Clear();// borro todos los elementos
cantidad = arregloindexado.Count;
Console.WriteLine("luego de Clear() Hay {0} elementos",
cantidad);
}
static void Mostrar(Hashtable arreglo)
{
foreach(DictionaryEntry datos in arreglo)
{
Console.WriteLine("indice {0} elemento {1}",datos.Key,
datos.Value);
}
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Hemos visto en esta unidad que las colecciones nos


permiten guardar elementos, y a diferencia a los arreglos lo podemos hacer en
forma dinmica.
Vimos tambin diferentes colecciones, y cada una de ellas posee
diferentes mtodos para llevar a cabo las diferentes operaciones segn la
necesidad del desarrollo a realizar.
El tema no est agotado, pues existen ms tipo de colecciones y
mtodos. Es tarea de ustedes profundizar sobre ellos, en la actualidad, existen
gran cantidad de bibliografa y pginas web sobre este tema.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 7.

A. Realizar un programa que calcule el promedio, el valor mximo, y el


valor mnimo de las medidas de varillas ingresadas por el usuario.
Realizarlo con ArrayList.

B. Realizar un programa que pueda ser utilizado como un diccionario


(palabra - definicin). Utilizar Hashtable.

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 7.

.NET para Docentes y Alumnos. Programando en C#

Unidad 8
Las Cadenas.
Las cadenas nos permiten manipular y guardar la informacin en formatos
adecuados para nuestra aplicacin. C# no provee una clase con diversos
mtodos denominado String, en su interior la cadena se comporta como una
coleccin y cada elemento que conforma la cadena es un elemento.
Para declarar una cadena, creamos una nueva instancia de la clase String
y le asignamos el valor que va contener entre comillas. Ejemplo:
string nuestracadena = "seguimos programando en c#";

ToString()
El mtodo ToString() lo usaremos para convertir el tipo de dato en
cadena, para luego desplegarlo para que el usuario.
La cadena de un valor entero la podemos convertir a cadena de la
siguiente manera:
int valor = 890;
string cadena = valor.ToString();
Console.WriteLine("nueva cadena {0}",cadena);

Un uso bastante comn es con la clase DateTime, que nos provee hora,
da, mes, etc.
DateTime ahora = DateTime.Now;

Now es una propiedad que nos provee la hora y da del sistema, el paso a
seguir es otorgarle un formato, para eso de la clase String usaremos el mtodo
Format() y los especificadores de formato.
Especificador
d
dd
ddd
dddd
h
hh
H
HH
m
mm
M
MM
MMM
MMMM
s
ss

Descripcin
Da del mes.
Da del mes con 2 dgitos.
Presenta el nombre del da abreviado.
Nombre del da completo.
Hora en el rango 1 a 12.
Hora en el rango 01 a 12.
Hora en el rango 0 a 23.
Hora en el rango de 0 ,01 a 23.
Minutos 1 a 60.
Minutos 01 a 60.
Meses 1 a 12.
Meses de 01 a 12.
Nombre del mes pero abreviado.
Nombre del mes completo.
Segundos 1 a 60.
Segundos 01 a 60.

.NET para Docentes y Alumnos. Programando en C#

t
tt
yyyy

Despliega A o P segn corresponda Am o PM.


Despliega AM o PM, segn corresponda
Muestra el ao.

Si deseamos tener una cadena que muestre la fecha y hora actual, la


podemos mostrar de la siguiente manera.
string formatofecha = "";
formatofecha = String.Format("la fecha de hoy es: {0:dddd dd
MMMM yyyy}",DateTime.Now);
Console.WriteLine("{0}",formatofecha);

Tambin tenemos especificadores de formato para los valores numricos,


ellos son:
Especificador
#
.
,
%
EO
;

Descripcin
Digito.
Punto decimal.
Separ miles.
Porcentaje.
Notacin cientfica.
Separador de secciones si el valor es positivo,
negativo o cero. Dos secciones, una para positivo
y el cero y la otra para los negativos.
3 secciones positivos, negativos y cero.

Veamos un ejemplo:
float valor = 0.0f;
string formatovalor= string.Format("{0: $#,###0.00;Neg
$#,###0.00;Cero}",valor);
Console.WriteLine("El valor es: {0}", formatovalor);
valor = 12155.25f;
formatovalor = string.Format("{0: $#,###0.00;Neg
$#,###0.00;Cero}", valor);
Console.WriteLine("El valor es: {0}", formatovalor);
valor = -4562.125f;
formatovalor = string.Format("{0: $#,###0.00;Neg
$#,###0.00;Cero}", valor);
Console.WriteLine("El valor es: {0}", formatovalor);

.NET para Docentes y Alumnos. Programando en C#

Concatenacin.
Otra manipulacin muy til con las cadenas es la concatenacin, es decir
unir dos o ms cadenas, para eso podemos utilizar:
El smbolo +.
String minombre = "gustavo";
String miapellido = "romay";
String minombrecompleto = minombre + " " + miapellido;
Console.WriteLine("Mi nombre y Apellido es {0}",
minombrecompleto);

El mtodo Concat().
Pertenece a la clase String y solo requiere de 2 parmetros que son las
cadenas que deseamos concatenar. Este regresa una cadena.
minombrecompleto = String.Concat(minombre, miapellido);

Permite realizar una concatenacin mltiple.


minombrecompleto = String.Concat(minombre,String.Concat("
",miapellido));

StringBuilder.
Otra clase que provee C# es StringBuilder. Esta nos permite construir
cadenas eficientes, utilizarla en concatenaciones, posee propiedades tiles, etc.
Propiedades del StringBuilder.
Length
Obtiene la longitud.
int cantidad=0;
StringBuilder cadena = new StringBuilder("buen dia para
programar");
cantidad = cadena.Length;
Console.WriteLine("Cantidad de caracteres: {0}", cantidad);

Append()
Lleva a cabo una concatenacin.
StringBuilder cadena = new StringBuilder("buen dia para
programar");

.NET para Docentes y Alumnos. Programando en C#

cadena.Append(" y nos acompaamos con un rico cafe.");


Console.WriteLine("Cadena concatenada: {0}", cadena);

Appendformat()
Permite concatenar y formatear una salida al igual que los hace
writeline(). Para eso primero colocamos la cadena de forma y en el segundo
lugar la lista de variables a utilizar.
StringBuilder nuevacadena = new StringBuilder("producto mas
vendido");
int precio = 45;
string producto = "dvd";
nuevacadena.AppendFormat("fue el {0} a un precio de {1}", producto,
precio);
Console.WriteLine("Cadena concatenada: {0}", nuevacadena);

ToString()
Es uno de los mtodos ms importante de esta clase, nos permite
convertir un StringBuilder en una cadena. Para usarlo solo debemos hacer
una sencilla asignacin nueva cadena y luego de aplicar el mtodo en la
nuevacadena tendr en su interior la cadena creada.
StringBuilder cadenafinal = new StringBuilder("cadena declarada
StringBuilder");
string nuevacadena = "";
nuevacadena = cadenafinal.ToString();
Console.WriteLine("Cadena final: {0}", nuevacadena);

Compare()
Para realizar comparaciones entre cadenas, podemos utilizar el mtodo
Compare(). Este mtodo necesita 2 parmetros, que son las cadenas a
comparar y regresa un valor entero indicando el grado de relacin que existen

.NET para Docentes y Alumnos. Programando en C#

entre las cadenas (0 cadenas iguales, negativo cadena1 menor que cadena2 y
si es positivo cadena 1 mayor que cadena 2).
int auxcomparacion = 0;
string cadena1 = "buen dia para programar";
auxcomparacion = string.Compare("unidad 8", cadena1);
if (auxcomparacion == 0)
Console.WriteLine("son dos cadenas iguales");
else
Console.WriteLine("NO son dos cadenas iguales");

En este mtodo no hizo falta declarar un objeto de tipo String.

Equals()
Tambin podemos realizar comparaciones entre 2 cadenas, utilizando el
mtodo Equals(). Este mtodo necesita 2 parmetros, que son las cadenas a
comparar y regresa un valor booleano indicando el grado de relacin que
existen entre las dos cadenas (true cadenas iguales y false cadenas distintas).
bool auxcomparacion = false;
string cadena1 = "buen dia";
auxcomparacion = string.Equals("buen dia", cadena1);
if (auxcomparacion == true)
Console.WriteLine("son dos cadenas iguales");
else
Console.WriteLine("NO son dos cadenas iguales");

Contains()
Si deseamos saber si una subcadena esta dentro de otra cadena
principal, utilizaremos el mtodo Contains(). Este mtodo debe ser invocado
desde la cadena a la que se realizara la bsqueda, por o tanto solo va a
necesitar un parmetro (la subcadena a buscar). El mtodo regresa un bool, si
encontr la cadena regresara true en caso contrario false. Tengan en cuenta
que es sensible a maysculas y minsculas. Un ejemplo:
bool auxcomparacion = false;
string cadenacompleta = "radio tv dvd video";
string abuscar = "dvd";
auxcomparacion = cadenacompleta.Contains(abuscar);
if (auxcomparacion == true)
Console.WriteLine("la ha encontrado");
else
Console.WriteLine("NO la ha encontrado");

Substring().

.NET para Docentes y Alumnos. Programando en C#

Este mtodo el Substring() nos va permitir extraer una subcadena, de


una cadena principal. Harn falta 2 parmetros de tipo enteros, el primero
indica el ndice adentro de la cadena principal, y el segundo es la cantidad de
caracteres que tiene la subcadena. Por lo tanto el mtodo regresa una cadena
que contiene la subcadena obtenida.
string cadenaprincipal = "esta es una cadena de prueba";
string resultado = "";
resultado = cadenaprincipal.Substring(22,6);
Console.WriteLine("subcadena : {0}", resultado);

EndsWith()
Tambin es posible saber si una cadena finaliza en una subcadena en
particular (termina con una palabra determinada, punto y aparte, etc.), para eso
hacemos uso del mtodo EndsWith(). Solo necesitar un parmetro que es la
cadena que debe buscar y devolver un bool.
string cadenaprincipal = "esta es una cadena de prueba";
bool resultado = false;
resultado = cadenaprincipal.EndsWith("prueba");
if(resultado==true)
Console.WriteLine("La cadena termina con prueba");
else
Console.WriteLine("La cadena NO termina con prueba");

CopyTo()
En algunas aplicaciones va ser necesario obtener una copia de una parte
en particular de una cadena, para eso usaremos el mtodo CopyTo(). Este
mtodo necesita 4 parmetros y no devuelve ningn valor. Si extrae una
cadena y se coloca en un arreglo de tipo Char.
El primer parmetro indica en la cadena principal a partir donde se
empezara a copiar.
El segundo parmetros es la cadena tipo Char, donde se va alojar la
cadena que se extrae.
Con el tercer parmetro, es el ndice que indica a partir de donde se
copiara la cadena en el arreglo (podemos empezar en cualquier parte del
arreglo no solo del inicio).

.NET para Docentes y Alumnos. Programando en C#

En cuarto y ltimo parmetro indica la cantidad de caracteres que se


copiaran.
Veamos un ejemplo:
int n=0;
char[] arreglo = new Char[10];
string cadena = "seguimos programando en C#";
cadena.CopyTo(9,arreglo,0,8);
for (n=0; n<=9;n++)
{
Console.Write("{0}",arreglo[n]);
}

Insert()
Va ser posible insertar una cadena en otra cadena existente. Esta tarea
nos va ser til cuando necesitemos agregar nueva informacin a un string y no
nos baste con la concatenacin o el formato.
Para eso usaremos el mtodo Insert(), que para su uso necesita dos
parmetros, uno indicando el ndice donde a partir de que posicin se insertara
la cadena y el otro parmetro es la cadena a insertar que podr ser insertada
en forma explicita o por medio de una variable de tipo String.
Insert() regresa un valor tipo String, que seria la instancia de la nueva
cadena con la insercin.
string cadenaprincipal = "Cuenta de ahorro Nro del Banco Nacion";
string cadenaainsertar = " 45-5623-1 ";
string resultado = "";
resultado=cadenaprincipal.Insert(21,cadenaainsertar);
Console.WriteLine("La cadena final queda: {0}",resultado);

LastIndexof()

.NET para Docentes y Alumnos. Programando en C#

El mtodo LastIndexof() nos ayudara a encontrar determina subcadena


dentro de otra cadena base, nos devolver un valor entero correspondiente al
ndice de la ultima posicin encontrada (). Presten atencin, porque si la cadena
posee varias ocurrencias solo tiene en cuenta la ltima.
int indice = 0;
string cadenaprincipal = "Cuenta de ahorro Nro del Banco Nacion";
indice = cadenaprincipal.LastIndexOf("Banco");
Console.WriteLine("Banco esta en la posicion {0}.",indice);

PadLeft(). Justifica a la derecha


En caso de querer justificar el texto hacia la derecha, el mtodo a utilizar
es PadLeft(). Es decir insertara espacios en blanco a la izquierda de la cadena
original. Requiere un parmetro, que debe ser un valor entero correspondiente
a la longitud de la cadena luego de insertar a la izquierda los espacios en
blanco.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.PadLeft(20);
Console.WriteLine("Cadena final ajustada a la derecha
{0}.",resultado);

PadRight(). Justifica a la izquierda


Si queremos justificar el texto hacia la izquierda, el mtodo a utilizar es
PadRight(). Inserta espacios en blanco a la derecha de la cadena original.
Tambin va a requerir un parmetro, que debe ser un valor entero
correspondiente a la longitud de la cadena luego de insertar a la derecha los
espacios en blanco.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.PadRight(20);
Console.WriteLine("Cadena final ajustada a la derecha {0} .",
resultado);

.NET para Docentes y Alumnos. Programando en C#

Remove(). Elimina caracteres.


Para eliminar caracteres dentro de una cadena, C# utiliza el mtodo
Remove(). Para borrar parte de la cadena tendremos que utilizar 2 parmetros,
uno indicando el ndice a partir de cual van a empezar a eliminar los caracteres
y el otro es la cantidad de caracteres que se intentara borrar. El mtodo regresa
una nueva cadena resultante luego de la eliminacin.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.Remove(5,7);
Console.WriteLine("Cadena final con los caracteres eliminados: {0}",
resultado);

Replace(). Reemplaza en una cadena.


Para reemplazar una parte de la cadena principal por otra cadena,
podemos utilizar el mtodo Replace(). La gestin de este mtodo, es compleja,
pues deber en primera instancia encontrar la cadena a reemplazar, luego
eliminarla, y por ultimo insertar la nueva cadena. Se debe tener en cuenta que
se realizar el reemplazo en las coincidencias que la cadena original tuviese.
Este mtodo utiliza 2 parmetros, el primero es la cadena que se desea
reemplazar, y el segundo es la cadena con que reemplazaremos. El mtodo
regresa una cadena resultante con el reemplaza llevado a cabo.
Un ejemplo va a aclarar este mtodo.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.Replace("Nacion","Ciudad");
Console.WriteLine("Cadena final luego del reemplazo: {0}",
resultado);

.NET para Docentes y Alumnos. Programando en C#

ToLower() convierte a minscula.


Con este mtodo convertimos a la cadena original con todos sus
caracteres en minscula. Esto nos va ayudar en las bsquedas al tener todos
los caracteres en forma homognea. Esta funcin no necesita ningn parmetro
y devuelve la cadena convertida.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.ToLower();
Console.WriteLine("Cadena final luego de la conversion: {0}",
resultado);

ToUpper() convierte a mayscula.


Con este mtodo convertimos a la cadena original con todos sus
caracteres en mayscula.
string cadenaprincipal = "Banco Nacion";
string resultado = "";
resultado = cadenaprincipal.ToUpper();
Console.WriteLine("Cadena final luego de la conversion: {0}",
resultado);

Trim() elimina espacios en blanco.


Con este mtodo nos va permitir eliminar los espacios en blanco que se
encuentre tanto al inicio como al final de la cadena. No necesita ningn
parmetro y regresa una nueva cadena con los espacios suprimidos.
Para ver como se utiliza veamos un ejemplo:
string cadenaprincipal = "
Banco Nacion
";
string resultado = "";
Console.WriteLine("Cadena original: {0}", cadenaprincipal);
resultado = cadenaprincipal.Trim();
Console.WriteLine("Cadena final luego de supresion de los
espacios: {0}", resultado);

.NET para Docentes y Alumnos. Programando en C#

TrimStart() elimina espacios en blanco al inicio.


Con este mtodo nos va permitir eliminar los espacios en blanco que se
encuentre tanto al inicio de la cadena. Necesita un nico parmetro, formado
por un arreglo de caracteres que indica los caracteres que deseamos eliminar.
string cadenaprincipal = "XX
Banco Nacion
";
string resultado = "";
Console.WriteLine("Cadena original: {0}", cadenaprincipal);
resultado = cadenaprincipal.TrimStart(' ','X');
Console.WriteLine("Cadena final luego de supresion de los espacios:
{0}", resultado);

TrimEnd() elimina espacios en blanco al final.


Con este mtodo nos va permitir eliminar los espacios en blanco que se
encuentre tanto al final de la cadena. Su funcionamiento es similar a
TrimStart().
string cadenaprincipal = "
Banco Nacion
XX";
string resultado = "";
Console.WriteLine("Cadena original: {0}", cadenaprincipal);
resultado = cadenaprincipal.TrimEnd(' ','X');
Console.WriteLine("Cadena final luego de supresion de los espacios:
{0}", resultado);

En esta unidad hemos aprendido unas clases y mtodos sobre la


posibilidad que tiene C# para el manejo de cadenas. Sin duda que esto solo

.NET para Docentes y Alumnos. Programando en C#

una muestras de lo que provee este poderos lenguaje. Ser de suma utilidad
cuando empiecen a hacer aplicaciones reales, sobre todo en el manejo de base
de datos.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 8.

A. Realizar un programa que permita al usuario ingresar una cadena y


desde el men pueda este seleccionar el formato que lo deber
mostrar (todo mayscula, sin espacios, etc.)

Soluciones de las tareas a desarrollar,


de la Unidad 8.

.NET para Docentes y Alumnos. Programando en C#

Unidad 9
Estructuras y Enumeraciones.

Las estructuras son tipos de datos, definidos por el programador. Al crear


una estructura de datos, estamos definiendo un nuevo tipo y dentro de el
podremos colocar datos. Estos datos se conocen con el nombre de campo, que
se representa por una variable con su respectivo tipo.
Una estructura conocido por todos es el de una agenda personal.
Agenda
Nombre
Direccin
Telfono
Edad

String
String
String
Edad

Para definir una estructura deberemos llevar los siguientes pasos:


Acceso
{
Acceso
Acceso

Acceso
}

struct nombre
tipo campo1;
tipo campo1;
tipo campo n;

El acceso indica en la estructura puede verse por afuera del mbito en


cual se ha definido, puede ser publica o privada (public o private). Si el tipo
de acceso es publico, estaremos indicando que puedo ingresar a la estructura
fuera del mbito de donde fue creada, en caso contrario lo declararemos como
privada.
La palabra struct indica que va ser una estructura, luego va seguido del
nombre que va ser la identificacin de la estructura. Y entre llaves estar
dispuesto un bloque de cdigo con la definicin de los campos. De nuestro
ejemplo, agenda se desprende la siguiente estructura.

El cdigo de la estructura debe ir ubicado por encima de


Main().

.NET para Docentes y Alumnos. Programando en C#

// declaracion de la estructura de la Agenda


public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
}

Luego que hemos definido la estructura, se deber definir sus variables


para guardar informacin. Para definir una variable (amigos) solo nos basta
saber el tipo, y en este caso el tipo lo acabamos de definir (Agenda), por lo
tanto lo haremos de la siguiente manera:
Agenda.amigos;

A partir de ahora en la variable amigos se encuentran los campos


nombre, direccin, edad y telfonos.
Ahora tenemos que ver como hacemos para acceder a los campos para
ingresar informacin, mostrar sus datos, etc.
Empecemos explicando como vamos a mostrar la informacin, pues
teneos la complicacin de posee campos de diferentes tipos. Por lo tanto
haremos uso del mtodo ToString(). Este debe estar: dentro del bloque cdigo
de la estructura, con acceso publico para ser invocado del exterior, regresar un
String y no necesita ningn parmetro.
Dispongo del cdigo al menos como va quedando // declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}

Con override, le indicamos al compilador una nueva


implementacin que usar nuestra estructura creada por nosotros en lugar de
la versin base.

.NET para Docentes y Alumnos. Programando en C#

Tambin deberemos crear un arreglo de la estructura para ir colocar los


datos que vamos a ingresar.
// declaracion de un arreglo
Agenda[] amigos=new Agenda[15];

Ahora ya si podemos ingresar informacin, y lo haremos de la siguiente


manera:
amigos[0].nombre = "GARCIA JUAN ALBERTO";
amigos[0].direccion = "BOEDO 789";
amigos[0].edad = 25;
amigos[0].telefono = "495-5623";

Y para mostrarlo, solo basta:


Console.WriteLine(amigos[0].ToString());

Ahora veamos el ejemplo dispuesto en forma completa:


using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}
static void Main(string[] args)
{
// declaracion de un arreglo
Agenda[] amigos=new Agenda[15];
amigos[0].nombre = "GARCIA JUAN ALBERTO";
amigos[0].direccion = "BOEDO 789";
amigos[0].edad = 25;
amigos[0].telefono = "4495-5623";
// muestra la informacion ingresada en la posicion 1era
Console.WriteLine(amigos[0].ToString());
amigos[1].nombre = "PEREZ MARIO";
amigos[1].direccion = "COLOMBRES 485 DEPTO 3";
amigos[1].edad = 36;
amigos[1].telefono = "4602-8956";

.NET para Docentes y Alumnos. Programando en C#

// muestra la informacion ingresada en la posicion 2DA


Console.WriteLine(amigos[1].ToString());
}
}
}

Los Constructores.
Una utilidad realmente importante, es la de poder crear un constructor
para la estructura del ejemplo que estamos desarrollando.
Un constructor, es un mtodo con caractersticas especiales, pues nos va
permitir inicializar las variables, llevar el nombre de la estructura a la cual
pertenece, se invoca automticamente cuando llevamos a cabo el
instanciamiento de la variable de la estructura, no posee tipo, debe contener al
menos un parmetro, y tampoco regresa nada. Veamos un ejemplo:
public Agenda(string auxnombre, string auxdireccion, int auxedad,
string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
telefono = auxtelefono;
}

Destaco que el acceso es pblico, pues lo vamos a invocar fuera de este


mbito donde fue declarado. El nombre Agenda, es igual a la estructura y luego
sigue la lista de parmetros.
La declaracin de la variable la podremos usar de la siguiente manera:
Agenda amigos = new Agenda("RODRIGUEZ MARIA", "MAZA 467", 29, "48964523");

El cdigo completo es el siguiente:


using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de la estructura de la Agenda

.NET para Docentes y Alumnos. Programando en C#

public struct Agenda


{
public string nombre;
public string direccion;
public int edad;
public string telefono;
// constructor
public Agenda(string auxnombre, string auxdireccion, int
auxedad, string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
telefono = auxtelefono;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}
static void Main(string[] args)
{
Agenda amigos = new Agenda("RODRIGUEZ MARIA", "MAZA 467",
29, "4896-4523");
Console.WriteLine(amigos.ToString());
}
}
}

Y se visualiza de la siguiente manera:

Otra ventaja del constructor es la de poder validar la informacin que se


ira ingresando. Sin duda que algunos de los campos de nuestra estructura,
necesita de datos validados, ya sea un rango numrico para la edad, algn
mensaje al no ingresar el domicilio, etc.
Para todo esto deberemos programar el constructor.
Empecemos verificando la longitud del campo telfono, Este no pude ser
mayor a 9 caracteres, si esto ocurriese ingresar un mensaje Telfono no
valido.
// constructor

.NET para Docentes y Alumnos. Programando en C#

public Agenda(string auxnombre, string auxdireccion, int auxedad,


string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
if (auxtelefono.Length<=9)
telefono = auxtelefono;
else
telefono = "Telefono no vlido";
}

Les muestro el cdigo y he creado 2 nuevas variables de tipo Agenda.


using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
// constructor
public Agenda(string auxnombre, string auxdireccion, int
auxedad, string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
if (auxtelefono.Length<=9)
telefono = auxtelefono;
else
telefono = "Telefono no vlido";
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}
static void Main(string[] args)
{
// creamos una variable amigos tipo Agenda
Agenda amigos = new Agenda("RODRIGUEZ MARIA", "MAZA 467",
29, "4896-4523");
Console.WriteLine(amigos.ToString());
// creamos una variable clientes tipo Agenda

.NET para Docentes y Alumnos. Programando en C#

Agenda clientes = new Agenda("COCA COLA S.A.",


"CORRIENTES 126", 36, "5620-84520");
Console.WriteLine(clientes.ToString());
}
}
}

Luego de ejecutar, veramos lo siguiente:

Sobrecarga del Constructor.


Los constructores poseen pueden ser sobrecargados, brindndonos de
esta manera mayor flexibilidad. Por ejemplo si tuvisemos amigos que no
tengan telfono, no tendran sentido hacer un nuevo constructor para estos
casos, deberemos crear una sobrecarga. Pasemos a realizarla la sobrecarga
modificando nuestro constructor original:
using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
// constructor
public Agenda(string auxnombre, string auxdireccion, int
auxedad, string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
if (auxtelefono.Length<=9)
telefono = auxtelefono;
else
telefono = "Telefono no vlido";
}
// sobrecarga del constructor

.NET para Docentes y Alumnos. Programando en C#

public Agenda(string auxnombre, string auxdireccion, int


auxedad)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
telefono = "Sin telefono";
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}
static void Main(string[] args)
{
// creamos una variable amigos tipo Agenda
Agenda amigos = new Agenda("RODRIGUEZ MARIA", "MAZA 467",
29, "4896-4523");
// creamos una variable clientes tipo Agenda
Agenda clientes = new Agenda("COCA COLA S.A.",
"CORRIENTES 126", 36, "5620-84520");
// creamos una variable parientes tipo Agenda
Agenda parientes = new Agenda("TIO JORGE", "BELGRANO
4562", 50);
Console.WriteLine(amigos.ToString());
Console.WriteLine(clientes.ToString());
Console.WriteLine(parientes.ToString());
}
}
}

Compilamos la aplicacin y vemos lo siguiente:

Podemos hacer una sobrecarga, donde el usuario pueda ingresar la


informacin de algunos de los campos.
Una vez que definamos la variable con el tipo Agenda, el compilar detecta
la cantidad de parmetros y lo relaciona con el constructor con igual de
parmetros correspondiente, en este caso solo enviaremos un parmetro.
Agenda empresas = new Agenda("ADIDAS");

.NET para Docentes y Alumnos. Programando en C#

El cdigo de este ejemplo, es el siguiente:


using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public string direccion;
public int edad;
public string telefono;
// constructor
public Agenda(string auxnombre, string auxdireccion, int
auxedad, string auxtelefono)
{
// llevamos a cabo la asgnacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
if (auxtelefono.Length<=9)
telefono = auxtelefono;
else
telefono = "Telefono no vlido";
}
// Sobrecarga del constructor - Sin telefono
public Agenda(string auxnombre, string auxdireccion, int
auxedad)
{
// llevamos a cabo la asignacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
telefono = "Sin telefono";
}
// Sobrecarga del constructor
// Solicta direccion,edad y telefono
public Agenda(string auxnombre)
{
// llevamos a cabo la asignacion del nombre
nombre = auxnombre;
// pedimos la direccion
Console.Write("ingrese la direccion:");
direccion = Console.ReadLine();
// pedimos la edad
Console.Write("ingrese la edad:");
edad = Convert.ToInt32(Console.ReadLine());
// pedimos el Telefono
Console.Write("ingrese el Telefono:");
telefono = Console.ReadLine();
if (telefono.Length > 9)
telefono = "Telefono no vlido";
}

.NET para Docentes y Alumnos. Programando en C#

public override string ToString()


{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0}, Direccion: {1}, Edad:
{2}, Telefono: {3}",nombre,direccion,edad,telefono);
return (sb.ToString());
}
}
static void Main(string[] args)
{
// creamos una variable amigos tipo Agenda
Agenda amigos = new Agenda("RODRIGUEZ MARIA", "MAZA 467",
29, "4896-4523");
// creamos una variable clientes tipo Agenda
Agenda clientes = new Agenda("COCA COLA S.A.",
"CORRIENTES 126", 36, "5620-84520");
// creamos una variable parientes tipo Agenda
Agenda parientes = new Agenda("TIO JORGE", "BELGRANO
4562", 50);
// creamos una variable empresas tipo agenda
Agenda empresas = new Agenda("ADIDAS");
Console.WriteLine(amigos.ToString());
Console.WriteLine(clientes.ToString());
Console.WriteLine(parientes.ToString());
Console.WriteLine(empresas.ToString());
}
}
}

La consola nos muestra:

Estructuras entrelazadas.
Las estructuras tambin nos dan la posibilidad de poder agrupar
informacin relacionada dentro de un mismo elemento. En nuestro ejemplo el
campo direccin puede desglosarlo en 2 campos nuevos calle y nmero.
La estructura quedara de la siguiente forma:
// declaracion de estructura de direccion
public struct domicilio
{

.NET para Docentes y Alumnos. Programando en C#

public string calle;


public int numero;
public domicilio(string auxcalle, indexer auxnumero)
{
calle = auxcalle;
numero = auxnumero;
}
}

Lo he hecho de la misma manera que cuando creamos la


estructura de Agenda, adems cree el constructor para ayudarnos a colocar la
informacin cuando se instancie una variable de este tipo.
Ahora ya podemos usarlo en la estructura Agenda, pero deberemos hacer
algunos cambios.
public struct Agenda
{
public string nombre;
public int edad;
public string telefono;
public domicilio direccion;

Solo definimos la variable y al tipo que corresponde ( public domicilio


direccion). Pero nos falta instancia el campo direccin, y eso lo haremos
cuando se asignan datos en el constructor.
public Agenda(string auxnombre, string auxdireccion, int auxedad)
{
// llevamos a cabo la asignacion
nombre = auxnombre;
direccion = auxdireccion;
edad = auxedad;
telefono = "Sin telefono";
direccion = new domicilio("Sin direccion", 0);
}

No debemos olvidar de modificar la sobrecarga y el mtodo ToString()


donde lo utilizamos para visualizar los datos.
Una vez que lo hemos modificado debera verse el cdigo de la siguiente
manera:
using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraagenda
{
class Program
{
// declaracion de estructura de direccion
public struct Direccion

.NET para Docentes y Alumnos. Programando en C#

{
public string calle;
public int numero;
public Direccion(string auxcalle, int auxnumero)
{
calle = auxcalle;
numero = auxnumero;
}
public override String ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Direccion: {0} nro {1}", calle,
numero);
return (sb.ToString());
}
}
// declaracion de la estructura de la Agenda
public struct Agenda
{
public string nombre;
public int edad;
public string telefono;
public Direccion domicilio;
// constructor
public Agenda(string auxnombre, int auxedad, string
auxtelefono, string auxcalle, int auxnumero)
{
// llevamos a cabo la asignacion
nombre = auxnombre;
edad = auxedad;
if (auxtelefono.Length<=9)
telefono = auxtelefono;
else
telefono = "Telefono no vlido";
domicilio = new Direccion(auxcalle,auxnumero);
}
// Sobrecarga del constructor - Sin telefono
public Agenda(string auxnombre,int auxedad)
{
// llevamos a cabo la asignacion
nombre = auxnombre;
edad = auxedad;
telefono = "Sin telefono";
domicilio = new Direccion("Sin direccion", 0);
}
// Sobrecarga del constructor
// Solicita direccion,edad y telefono
public Agenda(string auxnombre)
{
// llevamos a cabo la asignacion del nombre
nombre = auxnombre;
// pedimos la edad
Console.Write("ingrese la edad:");
edad = Convert.ToInt32(Console.ReadLine());
// pedimos el Telefono
Console.Write("ingrese el Telefono:");

.NET para Docentes y Alumnos. Programando en C#

telefono = Console.ReadLine();
if (telefono.Length > 9)
telefono = "Telefono no vlido";
// pedimos la calle del domicilio
Console.Write("ingrese la calle:");
domicilio.calle= Console.ReadLine();
// pedimos el numero de la calle del domicilio
Console.Write("ingrese Numero:");
domicilio.numero =
Convert.ToInt32(Console.ReadLine());
domicilio = new Direccion(domicilio.calle,
domicilio.numero);
}
public override String ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Nombre: {0},Edad: {1}, Telefono:
{2}",nombre,edad,telefono);
// adicionamo la cadena que viene de direccion
sb.Append(domicilio.ToString());
return (sb.ToString());
}
}
static void Main(string[] args)
{
// creamos una variable amigos tipo Agenda
Agenda amigos = new Agenda("RODRIGUEZ MARIA",29,"48964523","Av. INDEPENDENCIA",3565);
// creamos una variable clientes tipo Agenda
Agenda clientes = new Agenda("COCA COLA S.A.",36,"562084520","RIVADAVIA",124);
// creamos una variable parientes tipo Agenda
Agenda parientes = new Agenda("TIO JORGE", 50);
// creamos una variable empresas tipo agenda
Agenda empresas = new Agenda("ADIDAS");
Console.WriteLine(amigos.ToString());
Console.WriteLine(clientes.ToString());
Console.WriteLine(parientes.ToString());
Console.WriteLine(empresas.ToString());
}
}
}

La visualizacin por consola es:

.NET para Docentes y Alumnos. Programando en C#

Enumeraciones.
Existe una tipo de estructura denominada enumeracin, esta tiene la
caracterstica que es finita (numero determinado de elementos con su
respectivo tipo). Tiene el beneficio de reducir la lgica, mejora el desempeo de
la aplicacin, etc.
Vamos utilizar esta estructura cuando conozcamos los valores y la
cantidad de los mismos, por ejemplo, los meses, los das de la semana, etc.
Hagamos un ejemplo donde necesitemos guardar los das de la semana:
Para declararla y asignarle los valores, debemos aplicar el siguiente
formato:
enum nombre{valor 1,valor 2,,valor n};
En primer lugar vemos enum, es la palabra clave para definir las
enumeraciones, luego nombre que es la forma de denominar la enumeracin y
por ultimo cerradas con llaves {}, los valores. Hay que tener en cuenta que el
valor de la primera posicin es 0.
Ejemplo:
Enum diassemana {lunes, martes, mircoles, jueves, viernes,
sbado, domingo};
Si queremos que la enumeracin parta de la posicin 1, la estructura es la
siguiente:
Enum diassemana {lunes=1,
viernes, sbado, domingo};

martes,

mircoles,

jueves,

Luego se crea la variable:


diassemana midia;
Declaramos a la variable midia de tipo diassemana.
Y por ultimo la tenemos que inicializar:
midia=diassemana.viernes;
Tambin podemos crear e inicializar la variable en una sola lnea:
diassemana midia= diassemana.viernes;
Para pasar de enumeracin a valor numrico vamos a utilizar un type
cast.
Int valor=0;
Valor= (int)midia;

.NET para Docentes y Alumnos. Programando en C#

Tambin las enumeraciones las podemos utilizar en expresiones


aritmticas y lgicas.
Sueldo=600*((int)midia);
If (midia==diassemana.martes)
If ((int)midia==4)
If (midia==diassemana.martes && (int)midia<4)
Veamos un ejemplo de aplicacin, utilizando las enumeraciones.
using System;
using System.Collections.Generic;
using System.Text;
namespace estructuraenumeracion
{
class Program
{
// declaracion de las enumeraciones
enum diassemana
{lunes,martes,miercoles,jueves,viernes,sabado,domingo};
enum mesdelao
{enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre
,noviembre,diciembre};
static void Main(string[] args)
{
// declaracion de variables
int numerico = 0;
string mensaje = "El mes es ";
// declaro variable tipo enumeracion
diassemana midia;
// inicializo
midia = diassemana.domingo;
numerico = (int)midia;
Console.WriteLine("el dia {0} esta ubicado en {1}
posicion",midia,numerico);
// declaro e inicializa
mesdelao mimes = mesdelao.noviembre;
numerico = (int)mimes;
Console.WriteLine("el mes es {0} con la posicion
{1}.",mimes,numerico );
mensaje = mensaje + mimes.ToString();
Console.WriteLine("{0}.", mensaje);
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Las estructuras nos permiten crear un tipo nuevo de dato, que se ajusta a
nuestras aplicaciones.
Adems, podemos agruparlas frente a las necesidades del diseo de la
informacin que surja para la optimizacin de los sistemas que debamos
desarrollar.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 9.

1. Crear una estructura que nos permita guardar la informacin


correspondiente a los productos de un negocio de
electrodomsticos.
2. Crear una estructura para el manejo de una cuenta bancaria.
3. Crear una estructura enlazada con la informacin de las pelculas de
un video club. (desglosar actores en 3 variables actor1,actor2 y
actor3)

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 9.

.NET para Docentes y Alumnos. Programando en C#

Unidad 10
Introduccin a la programacin orientada a
objetos.
Las clases.

Tiempo Estimado:

En las unidades desarrolladas, hemos utilizado al C# para la


programacin estructura, a partir de ahora haremos un cambio de paradigma de
programacin, la Programacin Orientada a Objetos (POO).
la POO posee mayor poder y por ende se obtendr mayor beneficios,
siendo una parte fundamental de esta las clases.
Hasta el momento os hemos majeado bastante bien con la programacin
estructura, pero tiene sus inconvenientes al desarrollar aplicaciones grandes,
pues son difcil de mantener y extender cuando nuestro cliente desea agregar
mdulos, tambin es fcil que se corrompa la informacin al utilizar las
variables en diferentes puntos del programa.
No obstante no desechemos la programacin estructura porque nos ha
servido para llegar a este punto aprendiendo las diferentes sentencias y el
indicad para el armado de funciones o pequeos programas.
En este punto dar el punto de partida sobre POO con C#, debiendo
luego comenzar un nivel avanzado de programacin y profundizar el anlisis de
sistemas utilizando UML (lenguaje modificado de lenguaje).

Conceptos bsicos de POO.


En la POO tomamos la idea de resolver el problema observando cuales
son los componentes u objetos que componen el problema y la forma que
interactan. es decir que nosotros programaremos estos objetos y haremos que
se comuniquen entre si. Cuando estos objetos se hayan creados, cumplan su
funcin y se comuniquen, el problema estar resuelto.
Las clases.
El componente principal de la POO es la clase. Una clase es una
definicin abstracta de un Objeto. Siendo un objeto una entidad que puede
representar absolutamente cualquier cosa, desde algo fsico y tangible como
una persona, una factura o un auto, hasta cosas intangibles como la
imaginacin, un proceso qumico o un algoritmo matemtico.

.NET para Docentes y Alumnos. Programando en C#

Para aclarar estos conceptos podemos pensar que una clase es como un
plano de arquitectura, que por el cual vamos a crear casas los objetos. Es decir
que el plano clase - nos muestra las caractersticas y el trabajo concreto que
se llevara a cabo en las casas objetos -.
Si deseamos hacer otra casa, no har falta hacer otro plano, utilizaremos
el mismo cuantas veces lo necesitemos. en caso de querer incluir alguna nueva
caracterstica, podemos tomar la clase creada, y agregar los nuevos elementos.
Es decir que creamos una nueva clase a partir de una clase existente. Esto se
denomina Herencia, definiendo es la posibilidad de crear una nueva clase que
hereda las caractersticas (datos y mtodos) de otra clase, de esta forma
podemos reutilizar los cdigo en forma adecuada.
El proceso de crear un objeto a partir de una clase lo vamos a denominar
instanciamiento.
Dentro de la clase colocaremos la informacin y los mtodos que
trabajarn con esa informacin.
De lo dicho en el prrafo anterior, se entiende que la informacin o dato y
los mtodos que los procesan estn contenidos en una misma unidad, a esto lo
llamaremos encapsulamiento. Al encapsular los datos y los mtodos evitamos
la corrupcin de la informacin.
Los objetos se comunican entre si por medio del uso de los mensajes. Un
mensaje es el medio por el cual un objeto puede solicitar un dato, pedirle que lo
lleve, llevar a cabo un proceso, etc.
Los datos.
Ya habrn deducido que los datos son la informacin con que trabaja las
clases. Deberemos tener en cuenta:
Los datos deben ser declarados e indicar el tipo de acceso.
Existen tres tipos de acceso publico, privado o protegido. Un dato de
acceso publico, cualquier elemento del exterior de la clase; como la funcin
Main() o algn otro objeto puede acceder al dado para leerlo y modificarlo. El
tipo de acceso privado, solo los mtodos dentro de la clase pueden acceder a
los datos. El acceso protegido supera los lmites de esta unidad, utilizando en
programacin avanzada.
Los datos definidos en la clase son conocidos por todos los mtodos de la
misma clase, es decir actan como variables globales.
Los mtodos de la clase, pueden acceder a los datos sin necesidad de
parmetros.
Si los datos son privados, para acceder desde el exterior no seria posible,
para eso deberemos usar una funcin de interfaz. Una funcin de interfaz es
aquella que puede ser invocada desde el exterior y regresa una copia del valor
de algn dato dentro del objeto o coloca un valor determinado en un dato.
Tambin permite administrar el acceso de la informacin colocando un cdigo
en C# que verifique o valide la informacin. Una vez nos permite asegurarnos
que no existe corrupcin.
Los mtodos.
Los mtodos son funciones que llevan a cabo un proceso. A tener en
cuenta:
Los procesos tienen una forma de acceso (publico, privado o protegido)
Trabajan sobre los datos definidos en la clase.
Todos los mtodos de la clase, conocen todos los datos definida en ella.
Pueden recibir parmetros u regresar valores.
Un dato definido en la clase, no hace falta pasarlo como parmetro al
mtodo, este ya lo conoce.

.NET para Docentes y Alumnos. Programando en C#

Es bueno programar los mtodos de acceso pblico solo aquellos que


necesitan ser accedidos desde el exterior.
Los mtodos es invocado desde el interior deber declarase como
privado. Esto es por un tema se seguridad y utilizar el encapsulamiento en
forma correcta.
Declaracin de las clases
La declaracin de las clases es un proceso sencillo. Tener en cuenta:
Deben declararse dentro de un namespace.
Posee la siguiente estructura.
class nombre
{
// definicion de datos
...
// definicion de metodos
...
}

El nombre de la clase puede ser cualquier nombre valido dentro de C#,


nico dentro del namespace, se llevar a cabo la definicin de los elementos
por medio de un bloque de cdigo.
Empezaremos a desarrollar un ejemplo, y en base a el, haremos
diferentes acotaciones y explicaciones para profundizar el tema de clases.
Creemos una aplicacin que nos permita calcular y mostrar el rea y el
volumen de cubos y prismas rectangulares.
Empecemos con el anlisis, los objetos van a ser el cubo y el prisma
rectangular. Ahora debemos deducir cuales sern los datos y los mtodos, es
decir, aquellos procesos que lo involucren.
A continuacin dispongo de mi anlisis y me he ayudado del UML para
hacerlo. He diagramado la clase cubo y la de prisma.
Es un rectngulo dividido en tres reas donde dispongo el nombre de la
clase, los datos y los mtodos. Adems he agregado un smbolo mas (+) si la
informacin va hacer publica y un signo menos (-) si esta va ser privada. He
separa con dos puntos (:), el tipo de dato de cada una de ellas.

Cubo
+ lado:int
+ area:int
+ volumen:int
+ CalculoArea():void
+CalculoVolumen():void

.NET para Docentes y Alumnos. Programando en C#

Prisma
+ alto: int
+ ancho:int
+ area:int
+ espesor: int
+ volumen:int
+ CalculoArea():void
+CalculoVolumen():void
- AreaRectangulo():void
Y llego la hora de codificar las clases:
Empecemos ingresando los datos, dispuse el cdigo completo para que
vean donde se comienza a programar las clases.
using System;
using System.Collections.Generic;
using System.Text;
namespace clasegeometria
{
class cubo
{
// definicion de datos
public int lado;
public int area;
public int volumen;
//definicion de metodos
}
class prisma
{
// definicion de datos
public int alto;
public int ancho;
public int area;
public int espesor;
public int volumen;
//definicion de metodos
}
class Program
{
static void Main(string[] args)
{
}
}
}

.NET para Docentes y Alumnos. Programando en C#

Notemos que tenemos datos con igual nombre en diferentes clases, esto
no ser ningn problema, pues cuando se invoque la clase, solo esos datos se
activaran.
Dispongamos de los mtodos del cubo (luego seguimos con los mtodos
del prisma si no lo han notado tengo un mtodo con smbolo menos -).
Muestro la clase Cubo terminada:
class cubo
{
// definicion de datos
public int lado;
public int area;
public int volumen;

//definicion de metodos
// metodo del calculo del area del cubo
public void CalculoArea()
{
area = (lado * lado) * 6;
}
// metodo del calculo del volumen del cubo
public void CalculoVolumen()
{
volumen = (lado * lado * lado);
}
}

Crear la instancia de mi Clase.


Luego de tener la clase hay que construir el objeto micubo para comenzar
a trabajar. Es decir, que el paso que debemos dar es el de, Instanciar el objeto
de la clase Cubo.
El cdigo es el siguiente:
Cubo micubo = new Cubo();

Asignar valores al Dato.


Luego de realizar la instancia, ya podemos trabajar con la clase. Vamos a
asignarle un valor al dato. El ejemplo es el siguiente:
micubo.lado = 4;

Invocar un mtodo.
Desde el exterior de la clase invocaremos a los mtodos que son
pblicos, para eso disponemos del objeto y el mtodo.
Ejemplo:
micubo.CalculoArea();

Mostrar los resultados.


Luego de calcular los datos ya los podemos mostrar, para eso podemos
pensar que son variables normales indicando el objeto con el dato (siempre el

operador punto ).

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("Area= {0}", micubo.area);

Hasta este momento el cdigo desarrollado es:


using System;
using System.Collections.Generic;
using System.Text;
namespace clasegeometria
{
class Cubo
{
// definicion de datos
public int lado;
public int area;
public int volumen;
//definicion de metodos
// metodo del calculo del area del cubo
public void CalculoArea()
{
area = (lado * lado) * 6;
}
// metodo del calculo del volumen del cubo
public void CalculoVolumen()
{
volumen = (lado * lado * lado);
}
}
class Prisma
{
// definicion de datos del cubo
public int alto;
public int ancho;
public int area;
public int espesor;
public int volumen;
//definicion de metodos
}
class Program
{
static void Main(string[] args)
{
Cubo micubo = new Cubo();
micubo.lado = 4;
micubo.CalculoArea();
micubo.CalculoVolumen();
Console.WriteLine("Informacin del Cubo. Valor del Lado=
{0} Area= {1} Volumen= {2}",micubo.lado ,micubo.area,micubo.volumen);
}
}
}

Visualizamos por consola:

.NET para Docentes y Alumnos. Programando en C#

La clase Cubo tiene todos sus datos pblicos, si quisiramos proteger los
datos para hacerlo privados deberamos utilizar una funcin de interfaz. Para
eso vamos a practicar sobre la clase Prisma.
Para proteger los datos los pasos a seguir son:
Cambiar el acceso de los datos a privado.
class Prisma
{
// definicion de datos del prisma
private int alto;
private int ancho;
private int area;
private int espesor;
private int volumen;
//definicion de metodos
}

Las propiedades a incluir son funciones de interfaz, estas nos permitir


acceder a los datos en forma privada de una manera segura y controlada. La
propiedad podr ser de varios tipos:
Lectura solo nos permite leer el dato y no agregarle informacin.
Escritura nos permito solamente agregar informacin pero no leerla.
Lectura-escritura permite llevarse a cabo ambas operaciones.
La propiedad tendr 2 mtodos, el relacionado con la lectura (Get) y el
relacionado con la escritura (Set). La forma de declararla es la siguiente:
public tipo nombre
{
get
{
....
return x;
}
set
{
....
x=value;
}
}

Las propiedades deben ser publicas `para poder ser llamadas del exterior
de la clase.

.NET para Docentes y Alumnos. Programando en C#

Tipo estar referenciado con el tipo de variable en uso.


Return nos permite sacar el valor
Value representa el valor que el usuario asigna.
Ahora si, empecemos a crear propiedades para la clase prisma. Para eso
analicemos que necesita acceder por el exterior, y que tipo de acceso requiere
y se hace falta validar el dato.
Dato
Ancho
alto
Espesor
Area
Volumen

Acceso
Lectura-escritura
Lectura-escritura
Lectura-escritura
Lectura
lectura

validacin
Dato >0, default 1
Dato >0, default 1
Dato >0, default 1

Nuestras propiedades para cada uno de nuestros datos queda del


siguiente modo:
//definicion de las propiedades -lectura y ecritura
public int palto
{
get
{
return alto;
}
set
{
if (value <= 0)
alto = 1;
else
alto = value;
}
}
public int pancho
{
get
{
return ancho;
}
set
{
if (value <= 0)
ancho = 1;
else
ancho=value;
}
}
public int pespesor
{
get
{
return espesor;
}
set
{

.NET para Docentes y Alumnos. Programando en C#

if (value <= 0)
espesor = 1;
else
espesor = value;
}
}
//definicion de las propiedades -lectura
public int parea
{
get
{
return area;
}
}
public int pvolumen
{
get
{
return volumen;
}
}

Para acceder a las propiedades, solo tenemos que colocar el objeto con el
queremos trabajar seguido del operador ( .) y el nombre de la propiedad. El
valor que le queremos asignar lo haremos, previo smbolo de asignacin ( =).
miprisma.pancho = 10;

Para mostrar el valor de la propiedad:

Console.WriteLine("el Area es : {0}",miprisma.parea);

Me he adelantado a mostrarles, como si ingresa y como se muestra los


datos, para ya nos ponemos a crear los mtodos de la clase Prisma.
Una vez ms analicemos que mtodo ser pblico (invocados desde el
exterior) y cual es privado (invocado del interior de la clase), del anlisis surge
los siguientes:
Mtodo
CalculaVolumen()
CalculaArea()
AreaRectangulo()

Acceso
Publico
Publico
Privado

Incorporamos los mtodos al cdigo y nos queda:


El cdigo es:
using System;
using System.Collections.Generic;
using System.Text;
namespace clasegeometria
{
class Cubo
{
// definicion de datos

.NET para Docentes y Alumnos. Programando en C#

public int lado;


public int area;
public int volumen;
//definicion de metodos
// metodo del calculo del area del cubo
public void CalculoArea()
{
area = (lado * lado) * 6;
}
// metodo del calculo del volumen del cubo
public void CalculoVolumen()
{
volumen = (lado * lado * lado);
}
}
class Prisma
{
// definicion de datos del prisma
private int alto;
private int ancho;
private int area;
private int espesor;
private int volumen;
//definicion de las propiedades -lectura y ecritura
public int palto
{
get
{
return alto;
}
set
{
if (value <= 0)
alto = 1;
else
alto = value;
}
}
public int pancho
{
get
{
return ancho;
}
set
{
if (value <= 0)
ancho = 1;
else
ancho=value;
}
}
public int pespesor
{
get
{
return espesor;
}

.NET para Docentes y Alumnos. Programando en C#

set
{
if (value <= 0)
espesor = 1;
else
espesor = value;
}
}
//definicion de las propiedades -lectura
public int parea
{
get
{
return area;
}
}
public int pvolumen
{
get
{
return volumen;
}
}
// los metodos de la clase Prisma
// metodo publico
public void CalculaVolumen()
{
volumen = ancho * espesor * alto;
}
public void CalculaArea()
{
int a1 = 0, a2 = 0, a3 = 0;
a1 = 2 * AreaRectangulo(ancho,alto);
a2 = 2 * AreaRectangulo(ancho,espesor);
a3 = 2 * AreaRectangulo(alto,espesor);
area = a1 + a2 + a3;
}
// metodo privado
private int AreaRectangulo(int a, int b)
{
return (a * b);
}
}
class Program
{
static void Main(string[] args)
{
// instanciamiento de la clase Cubo para crear un Objeto
micubo
Cubo micubo = new Cubo();
micubo.lado = 4;
micubo.CalculoArea();
micubo.CalculoVolumen();
Console.WriteLine("Informacin del Cubo. Valor del Lado=
{0} Area= {1} Volumen= {2}",micubo.lado ,micubo.area,micubo.volumen);

.NET para Docentes y Alumnos. Programando en C#

// instancimiento de la clase prisma para crear el objeto


miprisma
Prisma miprisma = new Prisma();
miprisma.pancho = 10;
miprisma.palto = 10;
miprisma.pespesor = 5;
miprisma.CalculaArea();
miprisma.CalculaVolumen();
Console.WriteLine("En el Prisma el Ancho es : {0} el alto
{1} el espesor
{2}",miprisma.pancho,miprisma.palto,miprisma.pespesor);
Console.WriteLine("el volumen del prisma es: {0}",
miprisma.pvolumen);
Console.WriteLine("el area del prisma es : {0}",
miprisma.parea);
}
}
}

Por consola debemos ver:

Para mostrar la informacin de un objeto por consola, nos convendra


crear un mtodo dentro del objeto utilizando el mtodo ToString(). Esto ya lo
hemos usado en la unidad anterior, recordamos que regresa una cadena y no
necesita ningn parmetro. Para ver su funcionamiento solo hace invocarlo, por
lo tato el mtodo debe tener acceso pblico. El cdigo del mismo es el
siguiente:
public override string ToString()
{
string mensaje = "";
mensaje += "informacin del Prisma - Ancho: " + ancho.ToString() +
" Alto: " + alto.ToString() + " Espesor: " +
espesor.ToString();
mensaje +=" su area: "+area.ToString()+" su volumen:
"+volumen.ToString();
return mensaje;
}

La impresin del resultado se har con la siguiente sentencia:


Console.WriteLine(miprisma.ToString());

Otro mtodo para mostrar la informacin seria crear un mtodo especfico


para eso. Tambin debe ser de acceso pblico para ser invocado del exterior.
Por ejemplo hagamos un mtodo que solo imprima los resultados.

.NET para Docentes y Alumnos. Programando en C#

// metodo para mostrar resultado


public void ImprimeResultado()
{
Console.WriteLine("**************************************************
******************");
Console.WriteLine("informacion del Resultado del Prisma es area: {0}
y del Volumen {1}",area,volumen);
Console.WriteLine("**************************************************
******************");
}

Y para invocar el mtodo, lo haremos de la siguiente forma:


miprisma.ImprimeResultado();

El constructor en las clases.


Los constructores tambin pueden utilizarse dentro de las clases.
Generalmente lo vamos a utilizar para inicializar las valore de los datos con los
que va atrabajar el objeto.
Muy importante:
los constructores deben poseer el mismo nombre que la clase
no posee tipo.
No regresa nada.
Se invoca en forma automtica cuando el objeto es instanciado.
Puede tener en su interior cualquier cdigo con sentencias en C#.
Puede tener parmetros.
Veamos un ejemplo de un constructor para la clase Prisma.
// constructores
public Prisma()
{
// iniciacion de variables
string valor = "";
// solictud de los datos del Prisma
Console.WriteLine("ingrese el ancho del prisma:");
valor = Console.ReadLine();
ancho = Convert.ToInt32(valor);
Console.WriteLine("ingrese el alto del prisma:");
valor = Console.ReadLine();
alto = Convert.ToInt32(valor);
Console.WriteLine("ingrese el espesor del prisma:");
valor = Console.ReadLine();
espesor = Convert.ToInt32(valor);
}

Una vez que lo hemos dispuesto dentro de la clase Prisma y luego de


ejecutarse, nos va a pedir que el usuario ingrese los datos del prisma para
luego mostrarnos el resultado.
Vemos el cdigo que nos ha quedado:
using System;
using System.Collections.Generic;
using System.Text;
namespace clasegeometria
{

.NET para Docentes y Alumnos. Programando en C#

class Prisma
{
// definicion de datos del prisma
private int alto;
private int ancho;
private int area;
private int espesor;
private int volumen;
//definicion de las propiedades -lectura y ecritura
public int palto
{
get
{
return alto;
}
set
{
if (value <= 0)
alto = 1;
else
alto = value;
}
}
public int pancho
{
get
{
return ancho;
}
set
{
if (value <= 0)
ancho = 1;
else
ancho = value;
}
}
public int pespesor
{
get
{
return espesor;
}
set
{
if (value <= 0)
espesor = 1;
else
espesor = value;
}
}
//definicion de las propiedades -lectura
public int parea
{
get
{
return area;

.NET para Docentes y Alumnos. Programando en C#

}
}
public int pvolumen
{
get
{
return volumen;
}
}
// constructores
public Prisma()
{
// iniciacion de variables
string valor = "";
// solictud de los datos del Prisma
Console.WriteLine("ingrese el ancho del prisma:");
valor = Console.ReadLine();
ancho = Convert.ToInt32(valor);
Console.WriteLine("ingrese el alto del prisma:");
valor = Console.ReadLine();
alto = Convert.ToInt32(valor);
Console.WriteLine("ingrese el espesor del prisma:");
valor = Console.ReadLine();
espesor = Convert.ToInt32(valor);
}
// los metodos de la clase Prisma
// metodo publico
public void CalculaVolumen()
{
volumen = ancho * espesor * alto;
}
public void CalculaArea()
{
int a1 = 0, a2 = 0, a3 = 0;
a1 = 2 * AreaRectangulo(ancho, alto);
a2 = 2 * AreaRectangulo(ancho, espesor);
a3 = 2 * AreaRectangulo(alto, espesor);
area = a1 + a2 + a3;
}
// metodo privado
private int AreaRectangulo(int a, int b)
{
return (a * b);
}
// metodo para la impresion de la informacion del prisma
rectangular
public override string ToString()
{
string mensaje = "";
mensaje += "informacin del Prisma - Ancho: " +
ancho.ToString() +
" Alto: " + alto.ToString() + " Espesor: " +
espesor.ToString();
mensaje += " su area: " + area.ToString() + " su volumen:
" + volumen.ToString();
return mensaje;

.NET para Docentes y Alumnos. Programando en C#

}
// metodo para mostrar resultado
public void ImprimeResultado()
{
Console.WriteLine("**************************************************
******************");
Console.WriteLine("informacion del Resultado del Prisma
es area: {0} y del Volumen {1}", area, volumen);
Console.WriteLine("**************************************************
******************");
}
}
class Program
{
static void Main(string[] args)
{
// instancimiento de la clase prisma para crear el objeto
miprisma
Prisma miprisma = new Prisma();
miprisma.CalculaArea();
miprisma.CalculaVolumen();
miprisma.ImprimeResultado();
}
}
}

La vista de la consola es la siguiente:

Sobrecarga del constructor en las clases


Aqu tambin dentro de la clase el constructor puede sobrecargarse, es de
ir tener ms de un aversin del constructor. Una vez ms esto es til para poder
seleccionar como se inicializan nuestros datos de la clase. Una vez el
compilador seleccionar el constructor a adecuado en funcin de los tipos y la
cantidad de parmetros.
Ya tenemos un constructor que nos pide los tres valores (alto, ancho y el
espesor), ahora hagamos un constructor que le podamos pasar los tres valores.
El cdigo para mostrar la sobrecarga es el siguiente:
using System;
using System.Collections.Generic;
using System.Text;
namespace clasegeometria
{

.NET para Docentes y Alumnos. Programando en C#

class Prisma
{
// definicion de datos del prisma
private int alto;
private int ancho;
private int area;
private int espesor;
private int volumen;
//definicion de las propiedades -lectura y ecritura
public int palto
{
get
{
return alto;
}
set
{
if (value <= 0)
alto = 1;
else
alto = value;
}
}
public int pancho
{
get
{
return ancho;
}
set
{
if (value <= 0)
ancho = 1;
else
ancho = value;
}
}
public int pespesor
{
get
{
return espesor;
}
set
{
if (value <= 0)
espesor = 1;
else
espesor = value;
}
}
//definicion de las propiedades -lectura
public int parea
{
get
{
return area;
}

.NET para Docentes y Alumnos. Programando en C#

}
public int pvolumen
{
get
{
return volumen;
}
}
// constructores
public Prisma()
{
// iniciacion de variables
string valor = "";
// solictud de los datos del Prisma
Console.WriteLine("ingrese el ancho del prisma:");
valor = Console.ReadLine();
ancho = Convert.ToInt32(valor);
Console.WriteLine("ingrese el alto del prisma:");
valor = Console.ReadLine();
alto = Convert.ToInt32(valor);
Console.WriteLine("ingrese el espesor del prisma:");
valor = Console.ReadLine();
espesor = Convert.ToInt32(valor);
}
// sobrecarga
public Prisma(int auxancho, int auxalto, int auxespesor)
{
// asignamos los valores
ancho=auxancho;
alto=auxalto;
espesor = auxespesor;
}

// los metodos de la clase Prisma


// metodo publico
public void CalculaVolumen()
{
volumen = ancho * espesor * alto;
}
public void CalculaArea()
{
int a1 = 0, a2 = 0, a3 = 0;
a1 = 2 * AreaRectangulo(ancho, alto);
a2 = 2 * AreaRectangulo(ancho, espesor);
a3 = 2 * AreaRectangulo(alto, espesor);
area = a1 + a2 + a3;
}
// metodo privado
private int AreaRectangulo(int a, int b)
{
return (a * b);
}
// metodo para la impresion de la informacion del prisma
rectangular
public override string ToString()
{

.NET para Docentes y Alumnos. Programando en C#

string mensaje = "";


mensaje += "informacin del Prisma - Ancho: " +
ancho.ToString() +
" Alto: " + alto.ToString() + " Espesor: " +
espesor.ToString();
mensaje += " su area: " + area.ToString() + " su volumen:
" + volumen.ToString();
return mensaje;
}
// metodo para mostrar resultado
public void ImprimeResultado()
{
Console.WriteLine("**************************************************
******************");
Console.WriteLine("informacion del Resultado del Prisma
es area: {0} y del Volumen {1}", area, volumen);
Console.WriteLine("**************************************************
******************");
}
}
class Program
{
static void Main(string[] args)
{
// instancimiento de la clase prisma para crear el objeto
miprisma
Prisma miprisma = new Prisma();
miprisma.CalculaArea();
miprisma.CalculaVolumen();
miprisma.ImprimeResultado();
Prisma otroprisma = new Prisma(10,5,9);
otroprisma.CalculaArea();
otroprisma.CalculaVolumen();
otroprisma.ImprimeResultado();
Console.WriteLine(otroprisma.ToString());
}
}
}

Por console debera verse lo siguiente:

.NET para Docentes y Alumnos. Programando en C#

Para finalizar esta unidad podemos decir que la programacin orientada a


objetos es un paradigma de programacin realmente efectiva, que perdurar por
unos cuantos aos ms.
Su elemento fundamental es la clase de ellas se instancias los objetos
que son los que realmente hacen nuestro trabajo en las aplicaciones que
vamos creando.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 10.

1. Crea el diseo de una clase para llevar el control de stock en una


tienda de venta de instrumentos de msica.
2. Crear la clase para optimizar la informacin de los alumnos de una
escuela.
3. Crear una clase para la informacin de pelculas. Debe contener
sobrecarga.

Soluciones de las tareas a desarrollar,


de la Unidad 10.

.NET para Docentes y Alumnos. Programando en C#

Unidad 11
Flujos y Archivos.

Tiempo Estimado:

Vamos a tren que hacer aplicaciones donde ser importante guardar


informacin y luego poder recuperarla. Para eso haremos uso del Streams.
El Streams es utilizado para mover informacin de la memoria a otra parte
de la memoria, pero generalmente es utilizado para mover informacin a un
dispositivo de almacenamiento como un disco rgido.
Deben saber que la informacin no es enviada en una sola operacin,
sino que se enva byte por byte en forma ordenada y secuencial gracias a un
apuntador o indicador.
En el flujo de informacin encontramos tres puntos de referencia:
Inicio del flujo.
Final del flujo.
Posicin actual.
Empecemos a trabajar con los streams con las operaciones bsicas que
podemos realizar con ellos en memoria y luego en disco rgido. Vamos a
trabajar con una clase denominada MemoryStream, deben verificar y si no
existe agregar en la parte superior el namespace al que pertenece:
using System.IO;

Luego debemos saber que la informacin es guardada en un sitio en


memoria. Para eso utilizaremos un arreglo con un tamao particular y en bytes.
Lo hacemos de la siguiente manera:
// creamos un stream en memoria con una capacidad de 50 bytes
MemoryStream cadenaflujo = new MemoryStream(50);

El objeto que hemos creado se denomina cadenaflujo y posee un tamao


de 50 bytes.
Informacin sobre el Streams.
Vamos a ver la informacin que podemos obtener de cada Stream.
Informacin
detalle
Propiedad
Capacidad
Indica la cantidad que puede
Capacity
almacenar. Es de tipo entero su
resultado.

.NET para Docentes y Alumnos. Programando en C#

Longitud

Tamao de la informacin dentro


del Scream actualmente. El
resultado e tipo long.
Indica donde se encuentra el
byte actual. E siguiente para ser
procesado. Tambin es de tipo
long.

posicin

Length

Position

Desarrollemos un ejemplo de cmo se puede obtener y mostrar la


informacin del stream.
using
using
using
using

System;
System.Collections.Generic;
System.Text;
System.IO;

namespace streammemoria
{
class Program
{
static void Main(string[] args)
{
// creamos un stream en memoria con una capacidad de 50 bytes
MemoryStream cadenaflujo = new MemoryStream(50);
int capacidad = 0;
long longitud = 0;
long posicion = 0;
capacidad = cadenaflujo.Capacity;
longitud = cadenaflujo.Length;
posicion = cadenaflujo.Position;
Console.WriteLine("la capacidad del Stream es
{0}",capacidad);
Console.WriteLine("la longitud del Stream es {0}",
longitud);
Console.WriteLine("la posicin del Stream es {0}",
posicion);
}
}
}

Muestra por consola, lo siguiente.

Mtodo Seek()
Una actividad importante es la de colocar el puntero en una posicin
determinada dentro del stream, para eso usaremos el mtodo Seek(). Necesita

.NET para Docentes y Alumnos. Programando en C#

dos parmetros, el primero es la distancia desde el punto de referencia, y el


segundo parmetro es el punto de referencia a utilizar.
El punto de referencia tiene que ser de tipo SeekOrigin y posee algunos
de los tres puntos de referencias que hemos definido con anterioridad.
SeekOrigin

Begin
Current
End

Referenciado con le origen del Stream.


Referencia la posicin actual.
El punto de referencia es le final del
Stream.

Se usa de la siguiente manera:


////// aplicacion de Seek()
cadenaflujo.Seek(0, SeekOrigin.Begin);// estamos a distancia 0 desde
el inicio.
cadenaflujo.Seek(8, SeekOrigin.Begin);// estamos 8 bytes de distancia
del inicio.
cadenaflujo.Seek(-5, SeekOrigin.End);// estamos 5 bytes antes del
final.
cadenaflujo.Seek(5, SeekOrigin.Current);// estamos 5 bytes a la
derecha de la posicion actaul.
cadenaflujo.Seek(-5, SeekOrigin.Current);// estamos 5 bytes a la
izquierda de la posicion actaul.

Si intento ejecutar estas sentencias, a pesar que ya hemos creado el


Stream, aun no lo hemos llenado, por lo tanto nos dara un error de excepcin.
Ya llegamos para llenar al Stream.
Mtodo Read().
Una vez que estamos posicionado en el Stream, queremos leer la
informacin que contiene (recordamos que se lee byte a byte), para eso
utilizaremos el mtodo Read(). Este mtodo necesita 3 parmetros, el primer
parmetro es un arreglo en bytes necesario para guardar la informacin leda
por el Stream, el segundo nos da la oportunidad de colocar un offset para el
arreglo en bytes (generalmente es 0, debido que queremos que la cadena de
bytes del stream tomada, se coloque al inicio del arreglo). El tercer parmetro
es la cantidad de bytes a leer.
Primero armemos el arreglo, lo he llamado arreglostream y posee una
capacidad de 50 bytes.
byte[] arreglostream=new byte[50];

Ahora podemos utilizar el mtodo read().


cadenaflujo.Read(arreglostream,0,5); // graba en el arreglo a
partir de la posicion 0 los primero 5 valores bytes del stream.

Mtodo Write()
Con este mtodo vamos a poder agregar informacin al Stream. El
mtodo Write() utiliza tres parmetros, en el primer parmetro va el nombre
del arreglo, en el segundo es la posicin del stream donde empezamos a
escribir (0 para el inicio del scream), y el tercer parmetro es para indicar la
cantidad mxima de bytes que se escribirn.
cadenaflujo.Write(arreglostream,0,10);

.NET para Docentes y Alumnos. Programando en C#

Mtodo Close()
Es muy importante, que al terminar de trabajar con los stream, deban
cerrarse, para eso utilizamos el mtodo Close(), de esta forma se liberan los
recurso que se estaban utilizando. No posee ningn parmetro. La estructura
es la siguiente:
cadenaflujo.Close();

Un ejemplo sobre Stream, va aclarar los mtodos que hemos visto.

Realizar un programa donde el usuario ingrese una cadena, se


disponga en un Stream y aplicar los mtodos recientemente desarrollados.
using
using
using
using

System;
System.Collections.Generic;
System.Text;
System.IO;

namespace streammemoria
{
class Program
{
static void Main(string[] args)
{
// creamos un stream en memoria con una capacidad de 50 bytes
MemoryStream cadenaflujo = new MemoryStream(50);
// definicion de variables a utilizar
string informacion = "";
int capacidad = 0;
long longitud = 0;
long posicion = 0;
// armado del arreglo
byte[] arreglostream = new byte[50];
// solicitud de informacion al usuario
Console.Write("Ingrese la cdena para el Stream: ");
informacion = Console.ReadLine();
// pasa la cadena al stream
cadenaflujo.Write(ASCIIEncoding.ASCII.GetBytes(informacion),0,informa
cion.Length);
// obtencion de informacion del Stream
capacidad = cadenaflujo.Capacity;
longitud = cadenaflujo.Length;
posicion = cadenaflujo.Position;
Console.WriteLine("****************************************");
Console.WriteLine("la capacidad del Stream es
{0}",capacidad);
Console.WriteLine("la longitud del Stream es {0}",
longitud);
Console.WriteLine("la posicin del Stream es {0}",
posicion);

.NET para Docentes y Alumnos. Programando en C#

Console.WriteLine("****************************************");
// aplicacion de Seek()
cadenaflujo.Seek(0, SeekOrigin.Begin);// estamos a
distancia 0 desde el inicio.
cadenaflujo.Read(arreglostream, 0, 5); // graba en el
arreglo a partir de la posicion 0 los primero 5 valores bytes del
stream.
// mostramos la cadena
Console.WriteLine(ASCIIEncoding.ASCII.GetString(arreglostream));
// otra aplicacion de Seek() y mostramos la cadena
cadenaflujo.Seek(12, SeekOrigin.Begin);// estamos 12
bytes de distancia del inicio.
cadenaflujo.Read(arreglostream, 0, 5); // graba en el
arreglo a partir de la posicion 0 los primero 5 valores bytes del
stream.
Console.WriteLine(ASCIIEncoding.ASCII.GetString(arreglostream));
// otra aplicacion de Seek() y mostramos la cadena
cadenaflujo.Seek(-10, SeekOrigin.End);// estamos 10 bytes
antes del final.
cadenaflujo.Read(arreglostream, 0, 5); // graba en el
arreglo a partir de la posicion 0 los primero 5 valores bytes del
stream.
Console.WriteLine(ASCIIEncoding.ASCII.GetString(arreglostream));
// obtencion de la posicion actual
posicion = cadenaflujo.Position;
Console.WriteLine("la posicin del Stream es {0}",
posicion);
// lestura desde la posicion actual
cadenaflujo.Read(arreglostream, 0, 5); // desde donde nos
encontramos los primero 5 bytes.
Console.WriteLine(ASCIIEncoding.ASCII.GetString(arreglostream));
// cerramos el Stream
cadenaflujo.Close();
}
}
}

Merece una explicacin la sentencia dispuesta a continuacin.


En nuestro ejemplo, la cadena ser armada en bytes pero debe ser
codificada en ASCII, para la cual utilizaremos la clase ASCIIEncoding. Para
poder obtener los bytes de la cadena debemos hacer uso del mtodo
GetBytes() por el que pasa como parmetros la cadena escrita.
cadenaflujo.Write(ASCIIEncoding.ASCII.GetBytes(informacion),0,informa
cion.Length);

Por consola vemos:

.NET para Docentes y Alumnos. Programando en C#

Los Archivos
Los streams no solo funciona para la memoria del computador, tambin
podemos almacenar la informacin en medios masivos, como un disco rgido. A
partir de ahora, podremos crear archivos, escribir y leer sustentados por lo visto
en Stream.
Para crear un archivo vamos a utilizar la clase FileStream. El constructor
de esta clase necesita de dos parmetros, el primero es una cadena que
contenga el nombre de archivo (es conveniente poner la extensin Ej:
mitexto.txt), y el segundo parmetro colocaremos el modo del archivo,
indicando como funcionara.
Los valores posibles son:
Append

Create
CreateNew
FileMode

Open
OpenOrCreate
Truncate

Abre un archivo existente y dispone la


posicin actual al final del archivo. Si el
archivo no existe lo crea.
Crea un archivo. Si ya existe lo sobrescribe.
Crea un archivo. Si ya existe produce una
excepcin.
Nos permite abrir un archivo. Si esta abierto
se produce una excepcin.
Nos permite abrir un archivo. Si este o existe
se crea.
Abre el archivo y elimina el contenido hasta 0
bytes.

Por ejemplo:
// creacion de un stream para disco
FileStream archivo = new FileStream("mitexto.txt",FileMode.Create);

El archivo creado se dispondr en el directorio o carpeta en el cual


estamos trabajando.

Mtodo Write().
Para escribir el archivo usaremos el mtodo Write(). Se deben utilizar tres
parmetros, el primero es el arreglo en bytes, el segundo es la posicin a partir
de donde empezaremos a escribir con respecto a nuestra posicin actual, y el
ltimo parmetro nos indica la cantidad de bytes que vamos a colocar.
// escribimos el archivo

.NET para Docentes y Alumnos. Programando en C#

archivo.Write(ASCIIEncoding.ASCII.GetBytes(informacion), 0,
informacion.length);

Nuevamente informacin ser un arreglo o una variable de tipo String, por


lo tanto abra que definirlo previamente, etc.
Mtodo Close().
Para cerrar el archivo utilizaremos el mtodo Close().
archivo.Close();

Vamos a desarrollar un ejemplo para archivos, utilizando los mtodos que


hemos visto en esta unidad.

Hacer un programa que le permita al usuario ingresar cadenas


hasta que ingrese una cadena vaca. Cada una de estas cadenas debern
grabarse en un archivo.
El cdigo es el siguiente:
using
using
using
using

System;
System.Collections.Generic;
System.Text;
System.IO;

namespace archivos
{
class Program
{
static void Main(string[] args)
{
// creacion de variables
string cadena = "";
// creacion de un stream para disco
FileStream archivo = new
FileStream("mitexto.txt",FileMode.Create);
do
{
Console.Write("Ingrese una nueva cadena de
informacion: ");
cadena = Console.ReadLine();
// escribimos en el archivo
archivo.Write(ASCIIEncoding.ASCII.GetBytes(cadena),
0, cadena.Length);
} while (cadena != "");
// cerramos el archivo
archivo.Close();
}
}
}

Por consola la visualizacin es la siguiente:

.NET para Docentes y Alumnos. Programando en C#

Para ver al menos por ahora la informacin en el archivo mitexto.txt


podemos hacer uso de algn editor como el notepad.

Mtodo Read()
Ya hemos creado el cdigo para escribir un archivo en el disco rgido,
ahora seria bueno que dicho cdigo posea la propiedad de poder leer el archivo
dispuesto en el medio de almacenamiento masivo.
Recordemos que estamos leyendo bytes por lo tato deberemos convertirlo
en un tipo adecuado para nuestro programa. Para eso utilizaremos un arreglo,
con una longitud de 100 bytes.
Para mostrara la informacin debemos colocar los bytes como cadena y
esta tendr formato ASCII, por lo tanto usaremos nuevamente ASCIIEncoding
y GetString(), de esta forma pasamos el arreglo de bytes como parmetro.
Antes de empezar deben copiar el archivo mitexto.txt al nuevo proyecto
para probar su lectura.
El cdigo es el siguiente:
using
using
using
using

System;
System.Collections.Generic;
System.Text;
System.IO;

namespace archivolectura
{
class Program
{
static void Main(string[] args)
{
// creacion de variables
byte[] arregloarchivo = new byte[100];
// creacion de la instancia del stream de lectura
FileStream archivo = new FileStream("mitexto.txt",
FileMode.Open);

.NET para Docentes y Alumnos. Programando en C#

// leemos el contenido del archivo


archivo.Read(arregloarchivo,0,
(int)arregloarchivo.Length);
// muestra el contenido leido
Console.WriteLine(ASCIIEncoding.ASCII.GetString(arregloarchivo));
// cerramos el archivo
archivo.Close();
}
}
}

Se va ver por consola del siguiente modo:

Los streams nos permite mover la informacin no solo de un lugar a otro


de la memoria sino que tambin nos permite guardar y leer desde un disco
rgido. Al crear un stream existe mtodos para poder manipular la informacin
siendo esto de gran ayuda para el programador a la hora de crear aplicaciones.

.NET para Docentes y Alumnos. Programando en C#

Tareas a desarrollar de la Unidad 11.

1. Realizar un programa que genere un Stream, donde el usuario pueda


ingresar una cadena y lo muestre en orden inverso (Ej: internet
muestra tenretni).
2. Programa una aplicacin donde se le pida al usuario la ruta y el
nombre de un archivo de texto y lo muestre.
3. Hacer un programa que permita hacer una copia de un archivo de tipo
texto.
4. Hacer un programa que permita borrar un archivo.
5. Programar una aplicacin que permita cambiar el nombre de un
archivo. (tener en cuenta que el nombre del archivo no puede tener
menos de cuatro letras).

.NET para Docentes y Alumnos. Programando en C#

Soluciones de las tareas a desarrollar,


de la Unidad 11.

.NET para Docentes y Alumnos. Programando en C#

Unidad 12
La Depuracin.

Tiempo Estimado:

Todos los programas necesitan ser depurados, por lo tanto aqu veremos
las tcnicas bsicas de depuracin.
La depuracin es utiliza para corregir no solo problemas de sintaxis, sino
que tambin problemas lgicos. La depurarlo observamos su comportamiento y
detectamos partes del programa que tienen problemas.
Para comenzar el estudio de depuracin ser importante conocer los tipos
de posibles errores, ellos son los errores de Compilacin y los de Ejecucin.
Los errores de compilacin son aquellos que provocan que el programa
no pueda compilarse, generalmente son por mal tipeo de sintaxis.
Los errores en tiempo de ejecucin, son los que suceden cuando el
programa se ejecuta, esto se debe al mal diseo lgico o un mal control de la
informacin (ej.: leer un arreglo ms all de los lmites fijados).
Errores de compilacin.
Crearemos una aplicacin, con varios errores para poder identificarlos y
corregirlos.
using System;
using System.Collections.Generic;
using System.Text;
namespace errorescompilacion
{
class Program
{
static void Main(string[] args)
{
// declaracion de variables
int a = 2
int b=10;
int c=0;
int resultado=0;
// realizamos la division de b y c
resultado = b / c;
// lo mostramos
Console.WriteLine("la division es: {0}",resultado);
Console.WriteLine("***************************");
// mostramos el resultado 4 veces
for (int n = 0; n <= 4; n++)

.NET para Docentes y Alumnos. Programando en C#

{
Console.WriteLine("la division es: {0}", resultado);
}
// invocamos una funcion
Muestraresultado();
}
static void Muestraresultado(int n)
{
Console.WriteLine("***************************");
Console.WriteLine("la division es: {0}", n);
}
}

Al haber un error de compilacin, inmediatamente aparecer una ventana


en la parte inferior indicndolos en forma de lista.

Es importante la informacin que provee esta lista de errores. La misma


me indica si es un error (rojo) o una advertencia (amarillo), la descripcin de
error y la lnea y columna donde se ha provocado. Tambin en el editor del
programa suele aparecer en rojo, los errores provocados por el programado en
tiempo de edicin.
Ya podemos empezar a corregirlos, recuerden que deben empezar de
arriba hacia abajo puede existir que un error en la parte superior del programa
acarreo otros
En nuestro ejemplo:
Falta un punto y coma.
Falta una llave para el cierre de la funcin.
Tambin falta enviar el parmetro al invocar la funcin.
El cdigo sin errores de compilacin es el siguiente:
using System;
using System.Collections.Generic;
using System.Text;
namespace errorescompilacion
{
class Program
{
static void Main(string[] args)
{
// declaracion de variables
int a = 2;
int b=10;
int c=0;

.NET para Docentes y Alumnos. Programando en C#

int resultado=0;
// realizamos la division de b y c
resultado = b / c;
// lo mostramos
Console.WriteLine("la division es: {0}",resultado);
Console.WriteLine("***************************");
// mostramos el resultado 4 veces
for (int n = 0; n <= 4; n++)
{
Console.WriteLine("la division es: {0}", resultado);
}
// invocamos una funcion
Muestraresultado(resultado);
}
static void Muestraresultado(int n)
{
Console.WriteLine("***************************");
Console.WriteLine("la division es: {0}", n);
}
}
}

Ahora ya podemos ejecutar el programa.


Sorpresa!
Al ejecutar el programa nos da un error de ejecucin.

En nuestro caso el algoritmo es correcto, pero no se puede dividir por 0 en


el campo de los nmeros reales, por lo tanto buscaremos la forma para salvar
este error. Este tipo de error se denomina excepcin y cuando ocurre se dice
que se ha levantado.
Active el depurador y nos proveer un mensaje adems de indicar el lugar
donde se produce la excepcin.

Sin duda que podemos evitar por medio de otra lgica este error, por
ejemplo colocando una decisin para el divisor sea distinto de 0 (cero). Pero

.NET para Docentes y Alumnos. Programando en C#

nuestro objetivo es aprender a manejar y prever las excepciones que pueden


llegar a ocurrir.
Para llevar a cabo la administracin correctamente las excepciones,
podemos utilizar tres bloques de cdigo denominados try, catch y finally.
El bloque try se dispone en el bloque donde se ha detectado el problema,
que da del siguiente modo.
// administracin de la excepcion
try
{
resultado = b / c;
}

Una vez que hemos dispuesto este cdigo, tenemos las posibilidades, si
queremos levantar la excepcin colocaremos un bloque de cdigo catch, donde
dispondremos el cdigo que se encargue de levantar la excepcin. Se dispone
luego del try, y puede quedar as:
catch (Exception e)
{
// codigo que salva la excepcion.
Console.WriteLine("no es posible la division por 0.");
Resultado = 0;
}

Vemos que el bloque cuenta con un parmetro e, este nos provee


informacin relacionada con la excepcin, podemos disponer de ella
mostrndola con la siguiente instruccin.
Console.WriteLine("Descripcion de la excepcion: {0}.",e);

Solo se ejecutar catch si existe una excepcin.


Por ultimo el bloque de cdigo finally es opcional, se ejecutara siempre
exista o no una excepcin. Se dispone luego de catch y generalmente se utiliza
para limpiar o liberar los recursos utilizados en try y catch.
Nosotros podemos utilizarlo para entregar el resultado.
finally
{
// mostramos el resultado
Console.WriteLine("la division es: {0}", resultado);
Console.WriteLine("***************************");
}

El cdigo completo es:


using System;
using System.Collections.Generic;
using System.Text;
namespace depuracionejecucion
{
class Program
{
static void Main(string[] args)

.NET para Docentes y Alumnos. Programando en C#

{
int b = 10;
int c = 0;
int resultado = 0;
// desarrollo de excepcion
try
{
resultado = b / c;
}
catch (Exception e)
{
// codigo que salva la excepcion.
Console.WriteLine("no es posible la division por
0.");
resultado = 0;
}
finally
{
// mostramos el resultado
Console.WriteLine("la division es: {0}", resultado);
Console.WriteLine("***************************");
}
}
}
}

Por consola vemos:

Con la depuracin podemos corregir algunos problemas que podra tener


nuestro programa. Si tenemos cdigo peligroso, es hasta obligatorio que
pongan un cdigo de depuracin en nuestras aplicaciones, tranquiliza a
nuestros clientes y para nosotros mismos para optimizar el sistema.

Tareas a desarrollar de la Unidad 12.

1. Utilizar la depuracin ante el clculo de un factorial (los valores deben


ser mayores o igual a 1).

.NET para Docentes y Alumnos. Programando en C#

2. Investigar las excepciones que tiene WriteLine().

Soluciones de las tareas a desarrollar,


de la Unidad 12.

.NET para Docentes y Alumnos. Programando en C#

Programacin en el
Entorno Grafico con
C#.

.NET para Docentes y Alumnos. Programando en C#

Unidad 1- entorno grafico


El Visual Studio posee un Entorno de desarrollo integral comnmente
llamado IDE, utilizado para crear, ejecutar y depurar las aplicaciones.
Una vez ms ejecutemos el Visual Studio, yendo al botn de inicio, todos
los programas, Microsoft Visual Studio y por ultimo Microsoft Visual Studio. Se
vera la siguiente ventana.

Esta primera pgina presenta vnculos a recurso en internet, se destaca el


explorador de soluciones, un men en la parte superior, poder acceder a los
proyectos recientes, crear un nuevo proyecto, conectarse con la comunidad de
desarrolladores, etc. No se pierda de echar un vistazo antes de continuar.
Para comenzar a trabajar deben abrir un nuevo proyecto, para eso vayan
al men, archivo, nuevo, nuevo proyecto y aparecera una ventana con las
diferentes plantillas para los diversos proyecto, elijamos Aplicaciones para
Windows.

.NET para Docentes y Alumnos. Programando en C#

Una Aplicacin para Windows, es un programa que se ejecuta dentro del


sistema operativo Windows y tiene una interfaz grafica de usuario (denominada
GUI parte grafica que interacta con el usuario -).
Retomando el formulario donde seleccionamos la plantilla Aplicaciones
para Windows, debemos indicarle un nombre a la aplicacion y una ubicacin
(de suma utilidad para poder ubicarlo rpidamente por nosotros). Pulse aceptar
y aparcera el IDE con la vista de diseos para ya poder empezar a trabajar.

Vemos un rectngulo gris denominado formulario que va ser nuestra


ventana principal de la aplicacin Windows.
A partir de ahora iremos agregando controles (componentes reutilizables)
al mismo, y cambiando las propiedades de estos. Para dispongamos de las
herramientas a utilizar, vayamos al men, ver y cuadro de herramientas
(podemos ocultar automticamente para tener mas espacio al hacer clic sobre
la chinche (icono del marcador pasa de horizontal vertical) que se encuentra en
la parte superior de esta plantilla).

.NET para Docentes y Alumnos. Programando en C#

Notemos que a la derecha en el explorar de soluciones, se van agregando


archivos pudiendo de esta manera acceder en forma directa y sencillo por parte
del programador.
Vamos con el primer ejemplo:
La idea es poder ingresar algunos objetos, dentro del formulario, para eso
empezamos de la siguiente manera:
1 vamos a cambiar las propiedades del formulario, para eso botn
derecho del mouse sobre el formulario, y un clic con el izquierdo en
propiedades.

Vamos a cambiar las siguientes propiedades


propiedades
Text

Mi primer programa

.NET para Docentes y Alumnos. Programando en C#

BackColor

255; 224; 192

2 tomamos de la barra de herramientas el objeto label, para eso vamos


al icono ubicado en la barra de herramientas hacemos un clic con el botn
izquierdo del mouse, vamos al formulario y hacemos clic en el formulario y se
dispone all el objeto label1.
Vamos a cambiar las siguientes propiedades
propiedades
Text
Font
ForeColor
AutoSize

Programando en Visual C#
Microsoft Sans Serif
Red
True

3 agregar el Objeto PictureBox. Aparece un rectngulo con nombre


PictureBox1. A este le agregaremos las siguientes propiedades.
propiedades
Image
SizeMode

ejemplo1.Properties.Resources.imagennet
StretchImage

Acepta imgenes con formato png, gif, bmp, etc.


4 Guarde el Proyecto y luego ya lo puedo ejecutar el mismo, debera
verse de la siguiente manera:

Termine la ejecucin, presionando el botn de cerrar, y volvemos a modo


de edicin.

.NET para Docentes y Alumnos. Programando en C#

Cambie colores e imgenes para probar las diferentes alternativas que


tienen estos pocos elementos que hemos vistos.

Tareas a desarrollar de la Unidad 1.

Soluciones de las tareas a desarrollar,


de la Unidad 1.

Вам также может понравиться