Академический Документы
Профессиональный Документы
Культура Документы
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
Conceptos
fundamentales de C#.
ndice
Unidades
Unidad 1
Pagina
6
Introduccin al .NET
Unidad 2
15
36
Toma de Decisiones
Unidad 4
52
Los Ciclos
Unidad 5
68
90
Los Arreglos
Unidad 7
Las Colecciones
108
Unidad 1
Introduccin al .NET y C#.
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.
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:
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.
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.
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:
Lista de errores.
3. el cdigo es el siguiente:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion3
{
class Program
{
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:
Unidad 2
Los elementos bsicos de un
Programa en C#.
Veamos un ejemplo.
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 */;
}
}
}
*/.
Tipo
Bool
Byte
Char
Float
Int
String
Programemos un ejemplo.
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.
*
/
%
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.
//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);
}
}
}
Metodologa
computadora.
para
la
resolucin
de
problemas
por
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.
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
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
Pedir alto
area = ancho*alto
perimetro = 2*(ancho*alto)
mostrar area
mostrar permetro
Fin
En la consola vemos:
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);
}
}
}
Console.WriteLine("*******************************");
}
}
}
Por consola:
Unidad 3
Toma de Decisiones.
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
>=
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:
Sentencia
}
1;
2;
3;
n;
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.
Para el primer caso con solo una sentencia para ejecutar - , el problema
a resolver es el siguiente:
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.
}
}
}
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
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
2. El cdigo es:
using System;
using System.Collections.Generic;
using System.Text;
namespace solucion2
{
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);
}
}
}
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;
}
}
}
}
Unidad 4
Los Ciclos.
Tiempo estimado: 120 minutos
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,
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.
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);
}
}
}
Sufijo
prefijo
n=n+1
n=n-1
n++
n--
++n
--n
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);
}
}
}
Operador
+=
-=
*=
/=
Ejemplo
numero+=5
numero-=5
numero*=5
numero/=5
{
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);
}
}
}
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
}
}
}
3. El cdigo es:
using System;
using System.Collections.Generic;
using System.Text;
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");
}
}
}
* 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);
}
}
}
Unidad 5
Las Funciones y los Mtodos.
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.
Tipos de funciones.
A la hora de programar, nos podemos encontrar con 4 tipos de funciones,
ellas son las que:
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)
// declaracion de variables
float resultadopromedio = 0.0f;
resultadopromedio = (a + b) / 2;
Console.WriteLine("El promedio es :
{0}",resultadopromedio);
}
}
}
En la funcin
Static float promedio(float a, float b)
Float resultadopromedio;
return resultadopromedio;
}
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);
}
}
}
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;
}
}
Vemos en consola:
Unidad 6
Los Arreglos.
Tiempo estimado: 120 minutos
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);
}
}
}
Precio
Zapallitos rellenos
18 $
20 $
15 $
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.
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;
}
}
}
}
}
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 $
}
}
Curso1
5
8
Curso2
4
8
9
6
Curso3
10
4
3
5
7
integrantes
integrantes
integrantes
integrantes
Y para mostrar por consola los elementos del arreglo Jagged, podemos
editar los siguiente:
Console.WriteLine("la edad es : {0}",edades[2][3]);
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]);
}
}
}
}
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.
Su visualizacin es:
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)
{
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);
}
}
}
Unidad 7
Las Colecciones.
Tiempo estimado: 120 minutos
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:
el
dato
en
la
posicion
Resultado=nombredelarraylist[5]*0.15f;
Asignar un valor.
nombredelarraylist[2]= amarillo;
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.");
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
****");
}
}
}
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();
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.
}
}
}
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.
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.
// 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();
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);
}
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.
t
tt
yyyy
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);
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);
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");
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
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");
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().
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).
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()
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.
Unidad 9
Estructuras y Enumeraciones.
String
String
String
Edad
Acceso
}
struct nombre
tipo campo1;
tipo campo1;
tipo campo n;
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;
}
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
{
{
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:");
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());
}
}
}
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,
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.
Unidad 10
Introduccin a la programacin orientada a
objetos.
Las clases.
Tiempo Estimado:
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.
Cubo
+ lado:int
+ area:int
+ volumen:int
+ CalculoArea():void
+CalculoVolumen():void
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)
{
}
}
}
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);
}
}
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();
operador punto ).
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 deben ser publicas `para poder ser llamadas del exterior
de la clase.
Acceso
Lectura-escritura
Lectura-escritura
Lectura-escritura
Lectura
lectura
validacin
Dato >0, default 1
Dato >0, default 1
Dato >0, default 1
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;
Acceso
Publico
Publico
Privado
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);
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;
}
}
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;
}
// 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();
}
}
}
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;
}
}
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;
}
Unidad 11
Flujos y Archivos.
Tiempo Estimado:
Longitud
posicin
Length
Position
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);
}
}
}
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
Begin
Current
End
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);
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();
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);
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();
}
}
}
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
Por ejemplo:
// creacion de un stream para disco
FileStream archivo = new FileStream("mitexto.txt",FileMode.Create);
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
archivo.Write(ASCIIEncoding.ASCII.GetBytes(informacion), 0,
informacion.length);
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();
}
}
}
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);
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++)
{
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);
}
}
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);
}
}
}
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
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;
}
{
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("***************************");
}
}
}
}
Programacin en el
Entorno Grafico con
C#.
Mi primer programa
BackColor
Programando en Visual C#
Microsoft Sans Serif
Red
True
ejemplo1.Properties.Resources.imagennet
StretchImage