Manual Tecnicas de Programacion - C
Manual Tecnicas de Programacion - C
C# Primera Aplicación
Iniciando en C#
Crear la Aplicación
1. Iniciar Visual studio 2008.
2. En algunos casos cuando iniciamos C# por primera vez nos aparece la siguiente ventana
1 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
2 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
NOMBRE: Dale el nombre y ubicación que quieras para tu aplicación. Es aconsejable que
marques la casilla de verificación "Crear directorio para la solución", como en la imagen. Así
tendrás bien organizados todos los archivos de la misma.
Project Type: El de la izquierda sirve, como puedes ver, para indicar el lenguaje que vas a
utilizar.
Template o Plantilla:El de la derecha para indicar el tipo de aplicación que vas a diseñar. Más
adelante los iremos viendo, pero aún no es el momento más adecuado. De momento vamos a
crear aplicaciones de consola (es decir, programas que se ejecutan en una ventana de DOS).
Porque DOS
¿Que quieres empezar ya a hacer aplicaciones para Windows? Así me gusta, hombre, que seas
valiente. Sin embargo, no vamos a empezar con eso aún. Por ahora lo que quiero es enseñaros
el lenguaje C# propiamente dicho, ya que comenzar desde cero (o prácticamente cero)
diseñando aplicaciones para Windows sin conocer el lenguaje no haría sino entorpecer el
aprendizaje del mismo. Cuando conozcas el lenguaje podrás comprobar que no te cuesta
ningún trabajo adaptarte al diseño para Windows.
3 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
10. Guarde el proyecto seleccionando Save All (Guardar todo) en el menú File).
11. Inserte la siguiente línea en el método Main después de los comentarios
12. Una vez terminado, el método Main debe contener lo siguiente:
Tiene barra de menús y barras de botones como casi todos los programas de hoy en
día. Debajo, y de izquierda a derecha, tienes: El cuadro de herramientas, que se
desplegará cuando pases el ratón por encima. Si quieres que esté siempre desplegado
(al estilo del cuadro de herramientas de VB 6.0, por ejemplo) tendrás que hacer clic
sobre un pequeño icono con forma de chincheta que hay al lado del botón cerrar de
dicho cuadro. A continuación tienes el espacio de trabajo: en él te aparecerán las
ventanas de código de cada archivo, así como el examinador de objetos, la ayuda...
Cada ventana mostrará una pequeña pestaña en la parte superior (justo debajo de las
barras de botones), para que puedas pasar de unas a otras con un solo clic (en esta
imagen tienes las pestañas StarPage y Program.cs). A la derecha tienes el explorador
de soluciones. Bueno... realmente son cuatro ventanas en una: fíjate en las pestañas
que tiene justo debajo: el explorador de soluciones, que se ocupa de mostrarte los
archivos que componen la solución que estás creando con una jerarquía en árbol; la
vista de clases, que muestra las clases que componen la solución, organizadas también
en árbol; el contenido de la ayuda, que muestra eso precisamente; y la búsqueda de
ayuda, que, obviamente, sirve para buscar algo en la ayuda. Justo debajo está la
ventana de propiedades, que se ocupa de mostrar las propiedades de algún archivo
del proyecto, o alguna clase, o algún objeto, o algún método... Aquí tenéis también
otra pestaña, la de ayuda dinámica, que va mostrando temas de ayuda que tienen que
4 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
ver con lo que estás haciendo (si escribes class te salen temas sobre class, si escribes
string te salen temas sobre eso, etc). Debajo tienes más ventanas (la lista de tareas,
ventana de comandos, resultados, resultados de búsqueda de símbolos). Puede que a
ti no te coincidan, ya que todo esto es perfectamente configurable, y como yo me lo
he configurado a mi gusto y no recuerdo cuáles eran las opciones por defecto, pues
eso, que puede ser que a ti no te aparezcan las mismas ventanas que a mi (sobre todo
aquí abajo). En el menú Ver puedes mostrar y ocultar todas las ventanas que quieras, y
también puedes cambiarlas de sitio simplemente arrastrándolas con el ratón. Venga,
poned todo esto como más cómodo os resulte y seguimos...
Bueno, ahora que ya me he asegurado de que nos vamos a entender cuando yo hable
de una ventana o de otra, podemos continuar. Visual Studio .NET guarda los distintos
archivos que componen un programa con distintas extensiones, dependiendo de para
qué sirva. Los distintos archivos que contienen el código fuente en lenguaje C# los
guarda con la extensión "cs" (fijate en el explorador de soluciones, en el cual tienes
Program.cs). Al archivo de proyecto que está escrito en C# le pone la extensión
"csproj".
El último archivo que nos interesa por ahora es el archivo de solución, al cual le pone la
extensión "sln". Este contiene información sobre los proyectos que componen la
solución.
using System;
namespace ConsoleApplication1
5 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
{
classSaludo
{
staticvoid Main(string[] args)
{
//Codigo
}
}
}
Siempre que crees una aplicación de Consola en C#, Visual Studio .NET añadirá este
código.
using Systemnos permitirá usar miembros de este espacio de nombres sin poner la
palabra System delante.
namespaceun espacio de nombres para la aplicación, que se llama igual que la misma
(ConsoleApplication1).
class Una clase llamada Saludo con un método Main que es static, que es el método
por el que empezará la ejecución del programa.
//Codigo Añade aquí el código para que empiece la aplicación". O sea, que ya sabes
dónde hay que escribir el código de nuestra aplicación "Hola Mundo": en el método
Main. Escribe esto:
6 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ejecutar la aplicación
3. En el menú Debug, seleccione Start Without Debugging (o pulse CTRL+F5).
5. Después de ver el saludo, pulse una tecla cuando aparezca el mensaje “Pulse cualquier
tecla para continuar”.
Console.Read(); o
Console.ReadLine();
7 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Imprimir Datos
Para IMPRIMIRlos datos tenemos los métodos Console.Write y
Console.WriteLine. Este último, como puedes apreciar, es el que hemos usado para
nuestra aplicación. La diferencia entre ambos es que Write escribe lo que sea sin añadir el
carácter de fin de línea a la cadena, de modo que lo siguiente que se escriba se pondrá a
continuación de lo escrito con Write. WriteLine sí añade el carácter de fin de línea a la
cadena, de modo que lo siguiente que se escriba se colocará en la siguiente línea. Es decir, el
siguiente fragmento de código:
Console.Write("Hola");
Console.WriteLine("Pepe");
Console.Write("¿Cómo andas, ");
Sobrecarga de metodos
Aun no quería tocar este tema pero En fin... veremos muy detallada la sobrecarga de
métodos cuando lleguemos al tema de los métodos. Mientras tanto, sepas que, más o
menos, quiero decir que podemos usar estos métodos de diversas maneras.
Leer Datos
Para LERRdatos de la consola tenemos los métodos Console.ReadLine y
Console.Read. El método Read obtiene el primer carácter que aún no se haya extraído
del buffer de entrada. En caso de que el buffer esté vacío o bien contenga un caracter no
válido, retornará -1.
ReadLineobtiene una línea completa del buffer de entrada, es decir, toda la cadena de
caracteres hasta encontrar el carácter de fin de línea (bueno, realmente el fin de línea está
definido por dos caracteres, pero tampoco vamos a darle más importancia.
Usando sobrecargas
8 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
No voy a tocar una a una todas las sobrecargas de los métodos Write y .Voy a explicar de qué
formas los vamos a usar más comúnmente, y si en algún momento del curso los usamos de
otro modo, ya te lo explicaré. El método Write lo usaremos de las siguientes formas:
Console.Write(cadena);
Console.Write(objeto);
Console.Write(objeto.miembro);
Console.Write("literal {0} literal {1} literal {2}...", dato0,
dato1, dato2);
"cadena" puede ser una cadena literal (por lo tanto, entre comillas)
cadena Puede ser una variable de tipo string (por lo tanto, sin comillas).
objeto será cualquier variable de cualquier tipo, o bien una expresión.
Objeto.miembro será de nuevo cualquier variable de cualquier tipo, y lo usaremos así
cuando queramos escribir lo que devuelva un miembro de ese objeto (una propiedad o un
método).
La última forma del método Write la usaremos cuando queramos intercalar datos dentro
de un literal. Write escribiría esa cadena intercalando dato0 donde está {0}, dato1 donde
está {1}, y dato2 donde está {2}, y así tantos datos como queramos intercalar. Por cierto,
estos datos pueden ser objetos de cualquier tipo, o bien expresiones o bien lo que
devuelva algún miembro de algún objeto.
Los métodos Read y ReadLine no tienen sobrecargas, así que solamente los podremos usar así:
variable = Console.Read();
cadena = Console.ReadLine();
En la primera línea he puesto "variable" porque Read devolverá un valor de tipo int,
equivalente al código del carácter unicode recibido del buffer. Por este motivo, la variable
solamente puede ser de tipo int.
9 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
colocar el método Main en una clase que se llame como la aplicación más las letras App..
No te olvides de guardarlo antes de salir de Visual Studio .NET, con Archivo, Guardar Todo, o
bien el botón con varios diskettes dibujados, o bien la combinación de teclas
Control+Mayúsculas+F5. De todos modos, si se te olvida y ha habido modificaciones, Visual
Studio te preguntará si quieres guardarlas antes de salir. Nuestro primer programa en C# ha
quedado así:
Palabras clave de C#
Las palabras clave son identificadores predefinidos reservados que tienen un significado
especial para el compilador. No se pueden utilizar como identificadores en un programa a
menos que incluyan el carácter @ como prefijo. Por ejemplo, @if es un identificador válido
pero if no, por ser una palabra clave.
do is sizeof while
10 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Se recomienda elegir nombres que sean representativos del elemento (atributo o método) que
se defina o del valor que la variable guarde. Por ejemplo, una variable que guardará la edad de
un empleado podría llamarse edad_empleado o edad, y no simplemente xyz, aunque éste es
un identificador válido y el programa funcionará correctamente este nombre.
Ejemplos de identificadores
puntero
nombre_empleado
area
TAMANO_STRING
EdadEmpleado
potencia10
i
For
iF
While
Nombre
nombre
Como se verá más adelante, toda variable debe ser declarada previamente a su uso dentro del
programa, y esto debe hacerse respetando una sintaxis establecida.
Donde
<tipo> puede ser: int, float, char, entre otras posibilidades. []significa opcional.
<valor_inicial> puede corresponder a una constante del tipo entero, real, caracter, arreglo,
etc.
11 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
<modificador> puede ser una de las siguientes posibilidades: public, protected, private, static,
const, readonly; que corresponden a descripciones del comportamiento de esta variable en
relación al resto de los elementos del programa.
Los modificadores private, public, protected definen la visibilidad que tendrán otros objetos de
tener acceso a dichos campos. Por otro lado, const, readonly, se refieren a la factibilidad de
poder modificar el valor del campo una vez inicializado o definido. Finalmente, static define el
comportamiento de todas las instancias de la misma clase, y el tratamiento que puedan tener
sobre el campo en cuestión.
Tipos de Datos
Para la plataforma .NET, los tipos de datos básicos son los siguientes, varios de los cuales
sirven para representar cantidades numéricas, y otros para representar texto y otros.
.NET
VB.NET C# .NET Almacenamiento Intervalo
Framework
Boolean bool Boolean - true/false
Byte byte Byte 1 byte [0;255]
Short short Int16 2 bytes [-32768;32767]
[-
Integer int Int32 4 bytes
2147483648;2147483647]
Long long Int64 8 bytes [-10E19;10E19]*
Single float Single 4 bytes [-10E38;10E38]*
Double double Double 8 bytes [-10E308;10E308]*
Decimal decimal Decimal 12 bytes (parte entera) [-10E28;10E28]*
Date System.DateTime DateTime 8 bytes [1/1/0001;31/12/9999]
String string String - -
Char char Char 2 bytes -
Object object Object 4bytes (32 bits) / 8 bytes -
12 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
(64 bits)
SByte sbyte Sbyte 1 byte [-128/127]
UShort ushort UInt16 2 bytes [0:65535]
UInteger uint UInt32 4 bytes [0;4.294.967.295]
ULong ulong UInt64 8 bytes [0;1,8E19]
Para completar, no siempre se tienen presente y una tabla comparativa entre los dos lenguajes
y el framework:
Short es más lento que integer, aunque pueda ocupar menos memoria.
Interger es el tipo numérico más eficiente en términos de rendimiento.
Los enteros sin signo (UInt16/32/64) son igualmente rápidos que los signados y con mayor
capacidad, siempre que se sepa que solo se almacenaran enteros positivos, pero no son cls
compliant.
Decimal es el tipo con mayor rango pero las operaciones con este tipo son mucho más lentas
que con el resto
Double es el tipo real más rápido (en plataformas de 32 bits)
A partir del framework 3.5, existe una nueva estructura para albergar fechas y horas:
DataTimeOffset, que maneja zonas UTC. Si bien sigue existiendo DateTime, DateTimeOffset
será la recomendación de Microsoft.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CApplication2
{
classProgram
{
staticvoid Main(string[] args)
{
string cadena = "hola";
int entero = 7;
double real = 0.2;
bool booleana = true;
}
}
}
13 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Métodos o Funciones
Una “función”, genéricamente se describe como un conjunto de instrucciones (posiblemente
acompañadas de algunos datos temporales), que llevan a cabo una subtarea dentro de un
programa más complejo. Un método es una función que pertenece a una clase en particular.
Por ejemplo, dentro de un programa que convierte una lista de temperaturas expresadas en
grados Fahrenheit, a grados Celsius, podríamos definir una función que haga una de las
conversiones, y la emplearíamos varias veces para lograr completar nuestra tarea.
Tenemos entonces que las funciones dentro de un programa cumplen con subtareas, para las
cuales es necesario suministrarles algunos datos de entrada, y luego de completadas,
recibiremos como resultado algunos datos de salida. Para el caso de una función que calcula el
área de un círculo, la entrada que requiere la función sería el radio del círculo, y la salida que
arrojaría luego del cómputo sería el valor para el área. Este hecho se ilustra en el diagrama que
se muestra abajo, en el que podemos ver la tarea de transformación de datos que cumple una
función: La alimentamos con una entrada y recibimos una salida en respuesta.
Por otra parte, para especificar el proceso de transformación que debe llevar a cabo la función,
es necesario emplear las instrucciones del lenguaje de programación. Es necesario respetar
algunas pautas, tanto para la especificación de los parámetros de entrada, como del valor de
retorno, pero la estructura general es la misma.
<accesibilidad><tipo_retorno><nombre_función> ( <lista_parámetros> ) {
<declaración_de_variables_locales>;
<cuerpo_de_la_función> ;
return (<valor_retorno>) ;
}
<accesibilidad> se refiere a la visibilidad que tienen otras partes de un programa para ejecutar el
método.
Las posibilidades son public, private, protected, lo cual define la accesibilidad que se tiene a este
método desde otras clases.
<tipo_retorno> es el tipo del valor que devolverá la función. Es posible definir funciones que
no devuelven ningún valor (para por ejemplo definir funciones que solo imprimen valores o
ciertos mensajes en pantalla, para los que no es necesario que devuelva valor alguno). Para
definirlos o declararlos, se utiliza como tipo de retorno la palabra reservada void. A estas
funciones se las conoce también como procedimientos, porque no devuelven ningún valor.
<nombre_función> debe ser sustituido por un identificador que corresponde al nombre con
que se invocará la función posteriormente (o llamada de la función). Debe ser un identificador
válido. El valor de retorno de la función es asociado al nombre de la función.
14 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
<valor_retorno>, debe ser una expresión (constante, aritmética, lógica del tipo que se
especificó como <tipo_retorno>, y establece la expresión que retornará la función una vez que
haya terminado.
<variable>corresponde a una variable denotada por un identificador del mismo tipo del valor
que devolverá la función.
15 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int grados_celsius ;
grados_celsius = celsius(int fahrenheit) ;
//-------------------------------
int grados_farenheit ;
grados_farenheit = fahrenheit(31) ;
//-------------------------------
float calculo_area ;
float radio = 5.56 ;
calculo_area = area(5.56);
calculo_area = area(radio);
namespace CApplication2
{
classProgram
{
staticvoid Main(string[] args)
{
string var = "Ejeplo que suma dos numeros";
System.Console.WriteLine("Hola {0}!", var);
int num1 = 120;
int num2 = 3;
Console.ReadLine();
}
}
}
16 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
{
int num1, num2;
string var = "Ejeplo que suma dos numeros";
System.Console.WriteLine("Hola {0}!", var);
Console.WriteLine("ingrese n1");
num1 = int.Parse(Console.ReadLine());
Console.WriteLine("ingrese n2");
num2 = int.Parse(Console.ReadLine());
Console.ReadLine();
EXPRESIONES
Expresiones Aritméticas
Las expresiones aritméticas son valores numéricos, de tipos enteros o reales. Pueden ser
constantes, resultados de operaciones aritméticas como sumas o multiplicaciones, contenido
de variables numéricas, o combinaciones de las anteriores unidas mediante operadores
aritméticos.
Operadores binarios:
+ Suma
- Resta
* Multiplicación
/ División
% Módulo (sólo sobre tipos de números enteros)
Operadores unitarios:
- Signo negativo
++ Incremento
-- Decremento
Precedencia:
++ -- -(unitario)
*/%
+-
Asociatividad:
Por la izquierda
17 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Están puestos en orden de precedencia, es decir, en el caso de haber una expresión con varios
de ellos, se ejecutan por ese orden. Ya te explicaré esto con más detalles.
En el caso de “(expresión)”, los operadores son realmente los paréntesis. Sirven para modificar
la precedencia. ¿Qué es eso? Tranquilo, más adelante.
En “método(argumento, argumento, ...)”, los operadores vuelven a ser los paréntesis. En este
caso, sirven para especificar la lista de argumentos de un método.
En array[índice], los operadores son los corchetes. Sirven para indicar el elemento de un array
o un indizador.
Los operadores de incremento (++) y decremento (--) sirven para incrementar o disminuir el
valor de una variable en una unidad. Por ejemplo:
18 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
num++;
hará que num incremente su valor en una unidad, es decir, si valía 10 ahora vale 11. Los
operadores de incremento y decremento se pueden poner delante (preincremento ó
predecremento) o bien detrás (postincremento ó postdecremento), teniendo
comportamientos distintos. Me explico: si hay un postincremento o postdecremento, primero
se toma el valor de la variable y después se incrementa o decrementa. En caso contrario, si lo
que hay es un preincremento o un predecremento, primero se incrementa o decrementa la
variable y después se toma el valor de la misma. En una línea como la anterior esto no se ve
claro, porque, además, el resultado sería el mismo que poniendo ++num. Sin embargo, veamos
este otro ejemplo (num vale 10):
a = ++num;
b = a--;
“sizeof” devuelve el tamaño en bytes que ocupa un tipo determinado. Ahora bien, solamente
se puede utilizar sizeof con tipos valor y en contextos de código inseguro.
byte i=253;
checked {i+=10;}
Console.WriteLine(i);
byte i=253;
unchecked {i+=10;}
Console.WriteLine(i);
las variables numéricas tienen un rango de datos limitado, es decir, una variable de tipo byte,
por ejemplo, no puede almacenar valores menores que 0 ni mayores que 255. Cuando se
trunca el valor, lo que se hace es, colocar seguidos en una lista todos los valores que la variable
acepta, empezando de nuevo por el primero cuando el rango acaba, y después se va
recorriendo esta lista hasta terminar la operación de suma. Como dicho así resulta bastante
ininteligible, fíjate en la siguiente tabla y lo verás enseguida:
19 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
sbyte i=126;
unchecked {i+=10;}
Console.WriteLine(i);
int i=10;
int b=-i;
Console.WriteLine("Valor de i: {0} Valor de b: {1}", i, b);
bool i=true;
bool b=!i;
int i=10;
Console.WriteLine("Valor de i: {0:X8} Valor de ~i: {1:X8}", i,
~i);
Como sabes, el número hexadecimal A equivale al 10 en base decimal, por eso escribe A como
valor de i. El número FFFFFFF5 es el complementario en hexadecimal de 10, y en base decimal
equivale a 4294967285. Veamos estos números en código binario (que es como se almacenan
en la memoria):
20 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Los opeardores * y / son, respectivamente, para multiplicar y dividir. Es muy sencillo. Si, por
ejemplo, tenemos la siguiente expresión: 4*6/2, el resultado sería el que se supone: 12.
Los operadores << y >> efectúan un desplazamiento de bits hacia la izquierda o hacia la
derecha. Ya sé que esto de los bits puede que resulte algo confuso para alguno, así que me
extenderé un poquito. Veamos el siguiente ejemplo, también usando números hexadecimales:
int i = 15;
int b;
int c;
Console.WriteLine("Valor de i: {0:X}", i);
b = i >> 1;
Console.WriteLine("Ejecutado b = i >> 1;");
Console.WriteLine("Valor de b: {0:X}", b);
c = i << 1;
Console.WriteLine("Ejecutado c = i << 1;");
Console.WriteLine("Valor de c: {0:X}", c);
Valor de i: F
Ejecutado b = i >> 1;
Valor de b: 7
Ejecutado b = i << 1;
Vaor de b: 1E
Como puedes apreciar, a la variable b le asignamos lo que vale i desplazando sus bits hacia la
derecha en una unidad. El 1 que había más a la derecha se pierde. En la variable c hemos
asignado lo que valía i desplazando sus bits hacia la izquierda también en una unidad. Como
ves, el la parte derecha se rellena el hueco con un cero.
Los operadores relacionales < (menor que), > (mayor que), <= (menor o igual que), >= (mayor o
igual que), is, == (igual que), != (distinto de) establecen una comparación entre dos valores y
devuelven como resultado un valor de tipo boolean (true o false). Veamos un ejemplo:
int i;
int b;
Console.Write("Escribe el valor de i: ");
i = Int32.Parse(Console.ReadLine());
21 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Probar la salida. de estas líneas de programa sería la siguiente (en rojo está lo que se ha escrito
durante la ejecución de las mismas):
Escribe el valor de i: 2
Escribe el valor de b: 3
i<b devuelve: True
i<=b devuelve: True
i>b devuelve: False
i>=b devuelve: False
i==b devuelve: False
i!=b devuelve: True
Los operadores & (and a nivel de bits), | (or a nivel de bits) y ^ (xor -o exclusivo- a nivel de bits)
hacen una comparación binaria (bit a bit) de dos números devolviendo el resultado de dicha
comparación como otro número. Vamos con un ejemplo.
int i = 10;
int b = 7;
int res;
res = i & b;
Console.WriteLine("{0} & {1} Dec: {2} Hexad: {3:X}", i, b, res, res);
res = (i | b);
Console.WriteLine("{0} | {1} Dec: {2} Hexad: {3:X}", i, b, res, res);
res = (i ^ b);
Console.WriteLine("{0} ^ {1} Dec: {2} Hexad: {3:X}", i, b, res, res);
Fíjate primero en que en ninguno de los casos se ha hecho una suma normal de los dos
números. Veamos estas tres operaciones de un modo algo más claro. Marcaremos en negrilla
los valores que provocan que el bit resultante en esa posición valga 1:
Operación: i & b
Variable Valor dec. Valor hex. Valor binario
i 10 A 0000 0000 0000 0000 0000 0000 0000 1010
b 7 7 0000 0000 0000 0000 0000 0000 0000 0111
Resultado 2 2 0000 0000 0000 0000 0000 0000 0000 0010
Operación: i | b
Variable Valor dec. Valor hex. Valor binario
22 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Operación: i ^ b
Variable Valor dec. Valor hex. Valor binario
i 10 A 0000 0000 0000 0000 0000 0000 0000 1010
b 7 7 0000 0000 0000 0000 0000 0000 0000 0111
Resultado 13 D 0000 0000 0000 0000 0000 0000 0000 1101
Vamos operación por operación. En la primera de ellas, i & b, el resultado es 0010 porque el
operador & hace una comparación bit a bit, devolviendo uno cuando ambos bits comparados
también valen uno (se ve claramente que tanto para i como para b, el segundo bit por la
derecha vale 1), y 0 cuando alguno de ellos (o los dos) es 0.
En el tercer caso, i ^ b, el resultado es 1101 porque el operador ^ devuelve 1 cuando uno y sólo
uno de los bits comparados vale 1, y cero cuando ambos bits valen 1 o cuando ambos bits
valen 0.
Los operadores && (AND lógico) y || (OR lógico) se ocupan de comparar dos valores de tipo
boolean y retornan como resultado otro valor de tipo boolean.
El operador && devuelve true cuando ambos operandos son true, y false cuando uno de ellos
o los dos son false.
El operador || devuelve true cuando al menos uno de los operandos es true (pudiendo ser
también true los dos), y false cuando los dos operandos son false.
Por ejemplo, la siguiente expresión devolvería true si un número es mayor que 10 y menor que
20:
Para que veas otro ejemplo, la siguiente expresión devolvería true si el número es igual a 10 o
igual a 20:
El operador ? : (question) evalúa una expresión como true o false y devuelve un valor que se le
especifique en cada caso (Si programabas en Visual Basic, equivale más o menos a la función
iif). Vamos a verlo con un ejemplo:
int a=5;
int b=a;
23 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
b++;
Ejercicio
int a, b, r;
Console.WriteLine("ingrese n1");
a = int.Parse(Console.ReadLine());
Console.WriteLine("ingrese n2");
b = int.Parse(Console.ReadLine());
r = a + b;
Console.WriteLine("el resultado{0} ",r);
Console.ReadLine();
Ejercicio
decimal a, b, r;
r = a * 2 + (b *1/2)*1/3 ;
Console.ReadLine();
24 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
CONSTANTE
Una constante es una variable cuyo valor puede determinar el compilador durante la compilación y
puede aplicar optimizaciones derivadas de ello. Para que esto sea posible se ha de cumplir que el valor
de una constante no pueda cambiar durante la ejecución, por lo que el compilador informará con un
error de todo intento de modificar el valor inicial de una constante. Las constantes se definen como
variables normales pero precediendo el nombre de su tipo del modificador const y dándoles siempre un
valor inicial al declararlas. O sea, con esta sintaxis:
const<tipoConstante><nombreConstante>=<valor>;
ESTRUCTURAS DE CONTROL
Estructuras Condicionales
Simples – Dobles
if(<condicion>){ <instrucciones;>}
else{<instrucciones;> }
25 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
1. Realizar un programa que permita ingresar 2 números y luego reporte dichos números indicando su
condición.
usingSystem;
namespaceEjemplo1
classProgram
int n1,n2;
//Leer Numeros
n1 = int.Parse(Console.ReadLine());
n2 = int.Parse(Console.ReadLine());
//Evaluar N1
if(n1<0)
else if(n1==0)
else
//Evaluar N2
if(n2<0)
else if(n2==0)
else
26 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
2. Implementar un programa que permita ingresar 2 nombres y luego reporte quien de ellos tiene la
mayor cantidad de caracteres.
namespace Ejemplo1
class Program
String nom1,nom2;
//Leer Numeros
nom1 = Console.ReadLine();
nom2 = Console.ReadLine();
//Evaluar N1
if(nom1.Length >nom2.Length)
else
27 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Múltiples
Swith(<expresion>)
case <valor>:
<instrucciones>;
Break;
case <valor>:
<instrucciones>;
Break;
Case else:
<instrucciones>;
Break;
1. Realizar un programa que permita ingresar un número (1 - 12) y luego reporte el mes
correspondiente a dicho número.
using System;
namespace ejemplo2
class Program
int numero;
28 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.Write("Ingrese Numero:");
numero = int.Parse(Console.ReadLine());
switch(numero){
Console.ReadKey(true);
Estructuras Repetitivas
While
Sintaxis
while(<condicion>){
<instrucciones>
29 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
using System;
namespace ejemplo3
class Program {
int c=0,i=1,n=1,j=0;
while(j<10){
while(i<=n){
if(n%i==0)c++;
i++;
if(c==2){
Console.WriteLine("Primo[{0}] ->{1}",j+1,n);
j++;
c=0;
n++;
i=1;
Console.ReadKey(true);
30 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Do .. While
1. Elaborar un programa que permita ingresar 2 notas y luego reportar el promedio. Las notas deben
estar obligatoriamente en el rango de 0 a 20.
using System;
namespace ejemplo4{
class Program {
double promedio=0;
//validar ingreso
do{
Console.Write("Nota 1 -->");
nota1 = int.Parse(Console.ReadLine());
}while(nota1<0 || nota1>20);
do{
Console.Write("Nota 2 -->");
nota2 = int.Parse(Console.ReadLine());
}while(nota2<0 || nota2>20);
Console.Write("Promedio -->{0}",promedio);
Console.ReadKey(true);
For
1. Elaborar un programa que permita ingresar un nombre y luego reportarlo con letra por letra.
31 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
using System;
namespace ejemplo5
class Program
String nombre="";
nombre = Console.ReadLine();
//Reportar caracteres
for(int i=0;i<nombre.Length;i++)
Console.WriteLine("Letra -->{0}",nombre.Substring(i,1));
Console.ReadKey(true);
Foreach
1. Elaborar un programa que permita reportar los datos de un arreglo de enteros.
using System;
namespace ejemplo6
class Program{
foreach(int n in num)
32 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.WriteLine("Elemento -->{0}",n);
Console.ReadKey(true);
Instrucción Continue
using System;
namespace ejemplo7{
class Program{
for(int i=0;i<num.Length;i++){
Console.WriteLine("Elemento[{1}] -->{0}",num[i],i+1);
Console.ReadKey(true);
Instrucción goto
using System;
namespace ejemplo7
class Program
33 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
for(int i=0;i<6;i++){
Console.WriteLine("Linea {0}",i);
Console.ReadKey(true);
Ejercicios Propuestos
Elaborar un programa que permita ingresar 3 edades, y luego determinar el promedio de las edades
que son mayores a 18. Las edades que se ingresan están en el rango de 1 a 100.
Elaborar un programa que permita realizar las siguientes operaciones:
Ingresar la cantidad de alumnos mujeres y hombres de un aula. Considerar que las
cantidades pueden ir desde 0 hasta 40.
Reportar la cantidad total de alumnos.
Mostrar que porcentaje representa cada cantidad ingresada con respecto al total de
alumnos.
Elaborar un programa que permita reportar los 5 números menores y mayores de un número
ingresado. Ejemplo: n=10, debe reportar: 5,6,7,8,9,11,12,13,14,15
Elaborar un programa que permita ingresar un numero natural y luego indicar si se trata de un
numero compuesto.
Matrices (Arreglos)
Los arreglos son estructuras de datos complejas (en el sentido de que no son atómicas) que
agrupan datos de un mismo tipo en particular, llamado el tipo base del arreglo. El tipo base de
un arreglo puede ser cualquiera de los tipos básicos de C#, o incluso algunos tipos complejos
como las clases.
Un arreglo es también ejemplo de un modelo. Un arreglo puede considerarse como ejemplo
de una variable compuesta capaz de almacenar uno o más datos al mismo tiempo.
34 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Una matriz de cinco elementos enteros se puede declarar como se muestra en el ejemplo
siguiente:
La sintaxis del lenguaje permite referirse a cada uno de los elementos que constituyen el
arreglo empleando índices. Esto es posible pues los elementos del arreglo están numerados
en forma jerárquica y consecutiva, empezando en 0 en cada dimensión.
El siguiente gráfico ilustra un ejemplo de un arreglo llamado números, cuya posición 0
almacena el valor 10, la posición 1 el valor de 21, etc. Este arreglo en total almacena n+1
elementos. El valor de n, depende de la memoria que pueda tener el computador y el tipo de
elementos que se almacenen en el arreglo.
Sintaxis:
35 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Arreglos unidimensionales
Los arreglos, al igual que las demás variables deben declararse antes de poder utilizarlas, y
cumplen con las mismas reglas de alcance y vida.
Los arreglos de una sola dimensión reciben también el nombre de vectores. La sintaxis de la
declaración de un arreglo unidimensional es la siguiente:
<tipo-base>[] <identificador>;
Ejemplo:
Ejemplo a
int[] numeros = { 1, 2, 3, 4, 5, 6 };
Console.Write("imprime {0}", numeros[1]);
Console.ReadLine();
<arreglo>[indice] = <expresion>;
Importante: Puesto que los arreglos son estructuras complejas (es decir, no básicas), no
es posible asignar un arreglo a otro mediante una simple asignación (=). Para hacer esto es
necesario escribir un ciclo y asignar elemento a elemento.
Por ejemplo, la siguiente porción de código compila sin problemas (es decir, sin errores
sintácticos), pero probablemente produzca un error en tiempo de ejecución al referenciarse
posiciones inexistentes del arreglo.
36 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
También es común cometer estos errores olvidando que las posiciones de los arreglos están
numeradas a partir del índice cero. Es decir, en un arreglo de tamaño N las posiciones están
numeradas de 0 a N-1.
En C#, los arreglos se representan con un tipo específico, y por ello cuentan con sus propios
atributos y métodos específicos. Por ejemplo, para obtener el largo (la cantidad de elementos
dimensionados) de un arreglo, o para ordenarlo.
El Largo de un Arreglo
En el caso de los arreglos unidimensionales, el tamaño o cantidad de elementos se obtiene con
la propiedad Length.
Ordenamiento de un Arreglo
En el caso de los arreglos que sean de uno de los tipos predefinidos (int, float, char, etc.), es
factible ordenarlos en forma creciente, aprovechando el método básico Sort() de la clase
Array:
int[] numeros = { 4, 5, 2, 3, 1, 6 };
Array.Sort(numeros); // 1,2,3,4,5,6
int[] numeros = { 1, 2, 3, 4, 5, 6 };
Array.Reverse(numeros); // 6,5,4,3,2,1
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int total = 0;
for (int i = 0; i < a.Length; i++)
total += a[i];
Console.WriteLine("Suma de todos los elementos del array: " + total);
Console.ReadLine();
37 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.ReadLine();
Esta matriz contiene elementos desde array[0] hasta array[4]. El operador new se utiliza para
crear la matriz e inicializar sus elementos con valores predeterminados. En este ejemplo, todos
los elementos de la matriz se inicializan con cero.
Una matriz que almacena elementos de cadena se puede declarar del mismo modo. Por
ejemplo:
Sintaxis
string[] stringArray = newstring[6];
Inicialización de matrices
Es posible inicializar una matriz en el momento de su declaración, en cuyo caso, no es
necesario el especificador de rango ya que éste viene dado por el número de elementos de la
lista de inicialización. Por ejemplo:
Sintaxis
int[] array1 = newint[5] { 1, 3, 5, 7, 9 };
Una matriz de cadena se puede inicializar del mismo modo. A continuación, se muestra una
declaración de una matriz de cadena en la que cada elemento de la matriz se inicializa con el
nombre de un día de la semana:
Sintaxis
Sintaxis
38 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int[] array2 = { 1, 3, 5, 7, 9 };
string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
Es posible declarar una variable de matriz sin inicializarla, pero se debe utilizar el operador
new al asignar una matriz a esta variable. Por ejemplo:
Sintaxis
int[] array3;
array3 = newint[] { 1, 3, 5, 7, 9 }; // OK
//array3 = {1, 3, 5, 7, 9}; // Error
Sintaxis
Ejemplo Matriz
string[,] abecedario = { { "A", "B", "C", "D", "E" }, { "F", "G", "O",
"I", "J" }, { "T", "L", "U", "M", "N" } };
Console.Write("imprime {0}", abecedario[1, 4]);
int []nota=newint[5];
do
{
Console.Write("nota[{0}]",i);
nota[i]=int.Parse(Console.ReadLine());
} while(nota[i]<0||nota[i]>20);
Console.WriteLine("nota:{0}",nota[i]);
39 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.ReadLine();
Ejercicico
Elaborar un programa que permita inicializar un arreglo con los nombres de países y luego
reportarlos.
Arreglos
Solución:
using System;
namespace Ejemplo1{
class Program{
40 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
string aux="";
//ingreso de datos
for(int i=0;i<curso.Length;i++){
Console.Write("Curso[{0}]:",i);
curso[i]=Console.ReadLine();
for(int i=0;i<curso.Length;i++){
if(curso[j].CompareTo(curso[j+1])>0){
aux= curso[j];
curso[j] = curso[j+1];
curso[j+1] = aux;
Console.WriteLine("Cursos Ordenados");
Console.WriteLine("================");
for(int i=0;i<curso.Length;i++)
Console.WriteLine("{0}",curso[i]);
Console.ReadKey(true);
Ejercicios Propuestos
41 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
1. Asignación
Nombres [5] = “Ana”;
2. Lectura/Escritura
La Lectura/Escritura de datos en un arreglo u operaciones de entrada/salida
normalmente se realizan con estructuras repetitivas, aunque puede también hacerse
con estructuras selectivas. Las instrucciones simples de lectura/escritura se
representarán como:
Ejemplo:
namespace arreglos
classEjemplo3
publicstaticvoidMain(string[] args)
//Declaracion de Arreglos
43 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.Write("Edad[{0}]:", i);
nombre[i] = Console.ReadLine();
index = 4;
//Reporte de Datos
Console.WriteLine("-----------------------------");
Console.WriteLine("Nombre:{0}", nombre[i]);
Console.WriteLine("-----------------------------");
//Insertar Elemento
do
Console.Write("Posicion a Insertar:");
pos = int.Parse(Console.ReadLine());
Console.Write("Nombre:");
nombre[pos] = aux;
44 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
//Reporte de Datos
index++;
Console.WriteLine("-----------------------------");
Console.WriteLine("Nombre:{0}", nombre[i]);
Console.ReadKey(true);
TEMA: MÉTODOS
Los métodos, también llamados funciones, son trozos de código que reciben unos datos, hacen
algo con esos datos, y a veces devuelven algún valor. En C#, todos los métodos se encuentran
contenidos dentro de una clase.
o Static (opcional, si se indica se podrá llamar al método sin tener creada una instancia, o lo
que es lo mismo, un objeto de la clase que contiene el método)
o Visibilidad del método (public, protected, private)
45 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
o Tipo devuelto (opcional, puede no devolver nada, en cuyo caso se indica con la palabra
clave void)
o Nombre del método
o Parámetros (puede ser vacío)
o Cuerpo del método
return a / b;
Devuelve un tipo double, tiene por nombre Divide, los parámetros son a y b, ambos del tipo
double, y el cuerpo del método es simplemente "return a/b;". Para llamar a un método,
debemos simplemente poner el nombre del método y sus argumentos dentro de un paréntesis
separado por comas. Para llamar al método Divide declarado antes, simplemente debemos
escribir Divide(8, 2);
Según lo que hemos visto, el ejemplo del método Divide() completo necesita tener una clase
donde definirse y un método Main() donde ejecutarse.
classEjemplo1
return a / b;
publicstaticvoidMain()
Ejemplo1 m = newEjemplo1();//Instancia
Console.ReadKey(true);
46 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
classEjemplo2
return a / b;
publicstaticvoidMain()
Console.ReadKey(true);
PARÁMETROS
La declaración formal de parámetros también define variables. Hay cuatro tipos de parámetros:
parámetros por valor, por referencia, parámetros de salida, y arreglos de parámetros.
1. Paso por valor, El paso de parámetros por valor es usado por defecto para pasar
parámetros a métodos. Cuando se pasa un parámetro por valor a una función realmente se
está pasando una copia de dicho parámetro, por lo que las modificaciones que le hagamos
al parámetro dentro del método no afectarán al parámetro original.
Ejemplo:
47 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
classEjemplo3
staticvoid F(int p)
p++;
staticvoidMain()
int a = 1;
F(a);
// a no cambia:
Console.ReadKey(true);
Aunque el valor del parámetro p haya sido modificado dentro del método, éste parámetro
solamente tenía una copia del valor del parámetro a que pasamos al método; por lo que
cuando imprimimos el parámetro a vemos que éste parámetro ha mantenido su valor
original.
2. Paso por referencia, El paso de parámetros por referencia es la contraposición lógica al paso
por valor. En el paso por referencia no se realiza ninguna copia del objeto, sino que lo que
se le pasa a la función es una referencia del objeto, de forma que el parámetro pasa
directamente a la función y cualquier modificación sobre el parámetro dentro de la función
afectará al parámetro original.
Ejemplo:
classEjemplo4
48 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int t = a;
a = b;
b = t;
staticvoid Main()
int x = 1;
int y = 2;
//x e y cambian:
Console.ReadKey(true);
La palabra clave ref debe de ser usada tanto en la declaración formal de la función como en
los usos que se hace de ésta.
Ejemplo:
classEjemplo5
49 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
result = N1 / N2;
resid = N1 % N2;
staticvoidMain()
int N1 = 10;
int N2 = 3;
int D, R;
Console.WriteLine("\n");
Console.ReadKey(true);
En el ejemplo anterior se muestra un método Divide que incluye dos parámetros de salida.
Uno para el resultado (variable: result) de la división y otro para el resto (variable:resid).
Vemos que estos resultados son asignados a las variables: respuesta y residuo,
respectivamente.
50 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ejemplo:
classEjemplo6
staticint sumaDatos(paramsint[] d)
int s = 0;
foreach (int n in d)
s = s + n;
return s;
publicstaticvoidMain(string[] args)
Console.ReadKey(true);
Modificadores:
51 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
PUBLIC Y STATIC
Ejemplo:
classPrincipal
return a / b;
publicstaticvoidMain()
Principal m = newPrincipal();
Console.WriteLine(m.Divide(8, 2));//=4
Console.ReadKey();
Si por ejemplo intentamos declarar el método Divide sin el modificador public, obtendremos
un error en tiempo de compilación. El modificador complementario de public es private, que
provoca que el método o dato solo sea accesible desde la clase en la que está declarado. Si no se
especifica nada, se toma por defecto el modificador private.
Además, tampoco es necesario crear una instancia de la clase sólo para acceder a un método
declarado en ella. Para eso debemos anteponer a la declaración del método el modificador
static. Los métodos estáticos se caracterizan por no necesitar una instancia de la clase para
cumplir su función, pero como contrapartida, no pueden acceder a datos propios de la clase.
52 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ejemplo:
classPrincipal
return a / b;
publicstaticvoidMain()
Console.WriteLine(Divide(8, 2));//=4
NEW
Como hemos visto, las instancias de una clase se crean con la sintaxis:
Donde nombre clase es el nombre que le hemos dado a la definición de la clase, argumentos es
una lista de argumentos posiblemente vacía y objeto es el nombre que queremos darle a
53 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
lainstancia de la clase. Una vez creada una clase, sus miembros se inicializan a sus valores
predeterminados (cero para valores numéricos, cadena vacía para el tipo string, etc.).
Ejemplo: La siguiente clase representa un punto sobre el plano, de forma que tiene dos valores
públicos X e Y, y un método que calcula la distancia al origen del punto (módulo):
classPunto
publicdouble X;
publicdouble Y;
publicdouble Modulo()//MODULO
double d;
return d;
classPrincipal
publicstaticvoidMain()
Punto A = newPunto();
A.X = 3;
A.Y = 4;
Console.ReadKey();
54 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ahora bien, la forma en la que se crea la instancia, es decir, inicializando los datos a cero
(ejercicio: comprobar esto), se puede personalizar, de forma que podemos construir nuestro
propio constructor que le diga a la clase los valores por defecto que debe tomar. Esto se realiza
simplemente escribiendo dentro de la clase un método que tenga el mismo nombre que la clase
y en el que no se especifica el valor devuelto. La clase Punto con un constructor sería así:
Ejemplo:
classPunto
publicdouble X;
publicdouble Y;
public Punto()
X = 1;
Y = 1;
publicdouble Modulo()
double d;
return d;
publicstaticvoidMain()
Punto A = newPunto();
55 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.ReadKey();
classPunto
publicdouble X;
publicdouble Y;
public Punto()
//constructor
X = 1;
Y = 1;
publicdouble Modulo()
double d;
56 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
return d;
publicstaticvoidMain()
Punto A = newPunto();
A.X = 3;
A.Y = 4;
Console.ReadKey();
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2
57 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
* Calcular el promedio.
*/
//...................(METODOS)..............................
publicclassALUMNADO
do
N1 = int.Parse(Console.ReadLine());
do
N2 = int.Parse(Console.ReadLine());
do
N3 = int.Parse(Console.ReadLine());
58 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int Suma;
Suma = N1 + N2 + N3;
return Suma;
double PROM;
return PROM;
int MAYOR;
MAYOR = N1;
else
//N3<N1
MAYOR = N3;
else
//N2<N1
59 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
MAYOR = N3;
else
MAYOR = N2;
return MAYOR;
int MENOR;
MENOR = N1;
else
//N3 < N1
MENOR = N3;
else
//N2<N1
60 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
MENOR = N3;
else
//N2 < N3
MENOR = N2;
return MENOR;
classProgram
Console.ReadKey(true);
61 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ejercicios propuestos
Solución 1:
namespace Lab_metodos
class Program
public static void ingresar(out int n1, out int n2, out int n3){
do{
Console.Write("Nota 1:");
n1 = int.Parse(Console.ReadLine());
}while(n1<0||n1>20);
do{
Console.Write("Nota 2:");
n2 = int.Parse(Console.ReadLine());
}while(n2<0||n2>20);
do{
Console.Write("Nota 3:");
n3 = int.Parse(Console.ReadLine());
}while(n3<0||n3>20);
62 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int s=0;
foreach(int item in n)
s=s+item;
return s;
//Promedio
return s/n;
//Mayor
int m=0;
foreach(int item in n)
m = Math.Max(m,item);
return m;
//Menor
int m=21;
foreach(int item in n)
m = Math.Min(m,item);
return m;
//-------------------------------------------
63 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int a,b,c;
//Reporte de datos
Console.WriteLine("Suma es:{0}",sumar(a,b,c));
Console.WriteLine("Promedio es:{0}",promedio(sumar(a,b,c),3));
Console.ReadKey(true);
Solución 2:
using System;
namespace lab_metodos_01_b
class Program{
//ingreso
for(int i=0;i<v.Length;i++){
do{
Console.Write("Nota[{0}] -->",i+1);
v[i]= int.Parse(Console.ReadLine());
}while(v[i]<0 || v[i]>20);
return v;
//suma
64 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
int s=0;
foreach(int nota in n)
s = s+nota;
return s;
//promedio
return n/c;
//mayor
int m=0;
foreach(int nota in n)
m = Math.Max(m,nota);
return m;
//menor
int m=21;
foreach(int nota in n)
m = Math.Min(m,nota);
return m;
//-----
notas = ingreso(notas.Length);
Console.WriteLine("Suma -->{0}",suma(notas));
Console.WriteLine("Promedio --
>{0}",promedio(suma(notas),notas.Length));
Console.WriteLine("Mayor -->{0}",mayor(notas));
65 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.WriteLine("Menor -->{0}",menor(notas));
Console.ReadKey(true);
namespace ConsoleApplication1{
classProgram{
Console.Write("Valor 1 -->");
a = Console.ReadLine();
Console.Write("Valor 2 -->");
b = Console.ReadLine();
Console.Write("Valor 3 -->");
c = Console.ReadLine();
int m1 = 0, m2 = 0, m3 = 0;
switch (t)
case'D':
m1 = a;
66 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
if (b > c) { m2 = b; m3 = c; }
else { m2 = c; m3 = b; }
m1 = b;
if (a > c) { m2 = a; m3 = c; }
else { m2 = c; m3 = a; }
m1 = c;
if (a > b) { m2 = a; m3 = b; }
else { m2 = b; m3 = a; }
break;
case'A':
m1 = a;
if (b < c) { m2 = b; m3 = c; }
else { m2 = c; m3 = b; }
m1 = b;
if (a < c) { m2 = a; m3 = c; }
else { m2 = c; m3 = a; }
m1 = c;
67 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
if (a < b) { m2 = a; m3 = b; }
else { m2 = b; m3 = a; }
break;
Console.ReadKey(true);
switch (t)
case'D':
m1 = a;
if (b.CompareTo(c) > 0) { m2 = b; m3 = c; }
else { m2 = c; m3 = b; }
m1 = b;
if (a.CompareTo(c) > 0) { m2 = a; m3 = c; }
else { m2 = c; m3 = a; }
m1 = c;
if (a.CompareTo(b) > 0) { m2 = a; m3 = b; }
else { m2 = b; m3 = a; }
68 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
break;
case'A':
m1 = a;
if (b.CompareTo(c) < 0) { m2 = b; m3 = c; }
else { m2 = c; m3 = b; }
m1 = b;
if (a.CompareTo(c) < 0) { m2 = a; m3 = c; }
else { m2 = c; m3 = a; }
m1 = c;
if (a.CompareTo(b) < 0) { m2 = a; m3 = b; }
else { m2 = b; m3 = a; }
break;
Console.ReadKey(true);
publicstaticint menu() {
int r=0;
do{
Console.Clear();
Console.WriteLine("Menu Opciones");
Console.WriteLine("-------------");
69 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Console.WriteLine("[1] Ingreso");
Console.WriteLine("[4] Salir");
Console.Write("Opcion -->");
r = int.Parse(Console.ReadLine());
} while(r<1 || r>4);
return r;
publicstaticvoidMain(string[] args)
int r = 0;
do
r = menu();
switch (r) {
case 1:
case 2:
//Ordenar Nros
op = char.Parse(Console.ReadLine());
ordenar(int.Parse(v1), int.Parse(v2),
case 3:
//Ordenar Cadenas
op = char.Parse(Console.ReadLine());
70 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
}while(r!=4);
Console.ReadKey(true);
3. Desarrolle un programa que encuentre todos los números primos menores que un
número ingresado. Implementar un método de clase.
4. Elaborar una aplicación para procesar información de un artículo. Considere los
siguientes datos como: descripción, Stock y precio. Elabore los métodos para aumentar
o disminuir el precio y el stock.
La programación orientada a objetos, intenta simular el mundo real a través del significado
de objetos que contiene características y funciones. Los lenguajes orientados a objetos se
clasifican como lenguajes de quinta generación. Como su mismo nombre indica, la
programación orientada a objetos se basa en la idea de un objeto, que es una combinación
de atributos y métodos que juntos conforman una entidad de programación.
Objeto
Clase
Una clase no es otra cosa que el conjunto de especificaciones o normas que definen cómo va
a ser creado un objeto de un tipo determinado; algo parecido a un manual de instrucciones
conteniendo las indicaciones para crear el objeto.
71 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
El proceso por el cual se obtiene un objeto a partir de las especificaciones de una clase se
conoce como instanciación de objetos.
Para que un lenguaje o sistema sea considerado orientado a objeto, debe cumplir las
características de los siguientes apartados.
o Abstracción
La abstracción es aquella característica que nos permite identificar un objeto a través de
sus aspectos conceptuales. Las propiedades de los objetos de una misma clase, pueden
hacerlos tan distintos que sea difícil reconocer que pertenecen a una clase idéntica. No
obstante, nosotros reconocemos a qué clase pertenecen, identificando además, si se
trata de la misma clase para ambos. Ello es posible gracias a la abstracción.
Tomemos como ejemplo dos objetos coche, uno deportivo y otro familiar; su aspecto
exterior es muy diferente, sin embargo, cuando pensamos en cualquiera de ellos,
sabemos que ambos pertenecen a la clase Coche, porque realizamos una abstracción o
identificación mental de los elementos comunes que ambos tienen (ruedas, volante,
motor, puertas, etc.).
72 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
o Encapsulación
La encapsulación establece la separación entre el interfaz del objeto y su
implementación, aportándonos dos ventajas fundamentales. Por una parte proporciona
seguridad al código de la clase, evitando accesos y modificaciones no deseadas; una
clase bien encapsulada no debe permitir la modificación directa de una variable, ni
ejecutar métodos que sean de uso interno para la clase.
o Polimorfismo
El polimorfismo determina que el mismo nombre de método, realizará diferentes
acciones según el objeto sobre el que sea aplicado. Al igual que sucedía en la
73 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
encapsulación, el programador que haga uso del objeto, no necesita conocer los detalles
de implementación de los métodos, se limita a utilizarlos.
o Herencia
Se trata de la característica más importante de la POO, y establece que partiendo de una
clase a la que denominamos clase base, padre o superclase, creamos una nueva clase
denominada clase derivada, hija, o subclase. En esta clase derivada dispondremos de
todo el código de la clase base, más el nuevo código propio de la clase hija, que
escribamos para extender sus funcionalidades.
A su vez podemos tomar una clase derivada, creando una nueva subclase a partir de
ella, y así sucesivamente, componiendo lo que se denomina una jerarquía de clases, que
explicaremos seguidamente.
La herencia simple es aquella en la que creamos una clase derivada a partir de una
sola clase base, mientras que la herencia múltiple nos permite crear una clase
derivada a partir de varias clases base. El entorno de .NET Framework sólo permite
utilizar herencia simple, por lo que este es el tipo de herencia que podremos usar con el
lenguaje VB.NET.
Como ejemplo real de herencia, podemos usar la clase Coche como clase base; en ella
reconocemos una serie de propiedades como Motor, Ruedas, Volante, etc., y unos
métodos como Arrancar, Acelerar, Frenar, etc. Como clase derivada creamos
CocheDeportivo, en la cuál, además de todas las características mencionadas para la
clase Coche, encontramos propiedades y comportamiento específicos como ABS, Turbo,
etc.
74 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Los objetos existentes en una aplicación se comunican entre sí mediante una serie de
relaciones que describimos a continuación:
2. Pertenencia, Los objetos pueden estar formados a su vez por otros objetos. Un
objeto Factura puede estar compuesto por objetos CabeceraFactura, LineaFactura,
etc. Se dice en este caso que hay una relación de pertenencia, puesto que existe un
conjunto de objetos que pertenecen a otro objeto o se unen para formar otro objeto.
A este tipo de relación se le denomina también Contenedora.
Para reconocer si existe esta relación entre dos objetos, debemos realizar un análisis
sintáctico sobre la
misma usando la partícula “tiene un”. Así, por ejemplo, la frase “Un objeto Factura
tiene un objeto
3. Utilización, Hay situaciones en que un objeto utiliza a otro para realizar una
determinada tarea, sin que ello suponga la existencia de una relación de pertenencia
entre dichos objetos.
Por ejemplo, un objeto Ventana puede utilizar un objeto Empleado para mostrar al
usuario las propiedades del empleado, sin necesidad de que el objeto Empleado sea
propiedad del objeto Ventana.
75 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Para reconocer si existe esta relación entre dos objetos, debemos realizar un análisis
sintáctico sobre la misma empleando la partícula “usa un”. Así, por ejemplo, la frase
“Un objeto Ventana usa un objeto
Ejemplo 1
Elaborar un programa que permita registrar los siguientes datos de un producto: código,
nombre, cantidad y precio. Debe definir una clase llamada producto y otra clase llamada
AppProducto la cual permitirá agregar los datos a los productos
using System;
namespace ejemplos_poo
//metodos constructores
public Producto(){
codigo=0;
76 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
nombre="";
cantidad=0;
precio=0;
codigo=c;
nombre=n;
cantidad=ca;
precio=p;
set {this.codigo=value; }
set {this.nombre=value; }
set {this.cantidad=value; }
set {this.precio=value; }
77 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
using System;
namespace metodos
try{
Console.WriteLine("Ingreso de Datos");
Console.Write("Codigo:");
objP.Codigo = int.Parse(Console.ReadLine());
Console.Write("Nombre:");
objP.Nombre = Console.ReadLine();
Console.Write("Cantidad:");
objP.Cantidad = int.Parse(Console.ReadLine());
Console.Write("Precio:");
objP.Precio = double.Parse(Console.ReadLine());
Console.WriteLine("\nReporte de Datos");
Console.WriteLine("-----------------");
Console.WriteLine("Codigo:{0}",objP.Codigo);
Console.WriteLine("Nombre:{0}",objP.Nombre);
Console.WriteLine("Cantidad:{0}",objP.Cantidad);
Console.WriteLine("Precio:{0}",objP.Precio);
78 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
catch(Exception xe)
Console.WriteLine(xe.Message);
Console.ReadKey(true);
Ejercicio practico
Para cada uno de ellos, determine la clase a la que pertenecen. Enumere varios atributos
y métodos para cada una de las clases.
Represente gráficamente las clases utilizando la notación UML.
A partir de los diagramas UML, escriba el código necesario para definir las clases
utilizando el lenguaje de programación C Sharp.
Laboratorio
Objetivo:
Un centro dedicado a impartir cursos de formación ocupacional desea diseñar una base de
datos que contemple la información que se relaciona a continuación. Para los cursos que
imparte se desea conocer el código de curso (único), nombre, fecha de inicio, número
máximo de alumnos, duración en horas, precio/hora a pagar al profesor y aula o aulas en las
que se imparte. De las aulas interesa conocer el código de aula, capacidad en número de
alumnos y si tiene ordenadores o no. En cada aula se imparten varios cursos y un curso
debe impartirse al menos en un aula, pudiéndose impartir en más de una. Cada curso tendrá
un director del curso, un secretario y varios profesores que imparten el curso, siendo de
interés reflejar esta información en el diseño de la base de datos. De estas personas se debe
conocer el código (único), nombre y apellidos, teléfono, titulación académica y datos
bancarios (banco, sucursal y cuenta bancaria). Una persona puede ser director secretario o
profesor de varios cursos, para un mismo curso no puede ser director y secretario a la vez,
pero si puede impartir clase al mismo tiempo que ejerce de director o secretario del curso.
Es de interés conocer el dinero que cobra el director y el secretario en un curso, y además el
número de horas que imparte cada profesor, sabiendo que el sueldo del director y secretario,
79 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
y el número de horas por profesor puede variar de un curso a otro. Por otra parte, la
documentación que se utiliza para impartir los cursos la preparan los profesores. Interesa
conocer qué profesor prepara cada documentación, sabiendo que una documentación
determinada la prepara un solo profesor y que un profesor puede preparar varias
documentaciones. De cada documentación se desea conocer el código, descripción, extensión
(N° de paginas), profesor que la prepara y los cursos en los que se utiliza, sabiendo que en
cada curso los profesores utilizan varias documentaciones (al menos una) y que una
documentación determinada puede ser utilizada en varios cursos.
Laboratorio
Objetivo
Ejemplo 1: Elaborar un programa que permita registrar los datos de dos cliente. Debe
considerar los siguientes atributos para los clientes: ruc, nombre y Sueldo básico.
80 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Nota: La forma de generar métodos get y set. Debe seleccionar el atributo. Luego proceda a
pulsar clic derecho Refactor >> encapsulate Field
81 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
82 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Paso 1: Realizar cambios en la clase App. Donde se debe declarar un arreglo de 5 elementos
tipo de dato Cliente.
Ejercicios Propuestos
Elaborar una clase en C sharp que represente un círculo; el círculo queda perfectamente
definido si se conoce su radio. Defina además, para esta clase, dos métodos (públicos)
que permitan calcular el área del círculo y el perímetro de la circunferencia que delimita
el círculo.
a) El área circulo = PI * r2
b) Perímetro = 2 * PI * r
Elaborar una aplicación en C sharp que denote la clase Punto, que represente a un punto
geométrico en el plano cartesiano. Elaborar un menú de opciones con las siguientes
funciones:
a) Ingreso de datos de dos puntos.
b) Listado de datos de los puntos.
c) Pendiente entre dos puntos.
d) Punto medio entre dos puntos.
e) Salir
83 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
84 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
HERENCIA
Cuando se hereda, las clases derivadas reciben las características (datos y funciones) de
la clase original, a las que se pueden añadir nuevas características o modificar las
características heredadas.
La derivación de las clases consigue la reutilización efectiva del código de la clase base
para sus necesidades.
La herencia organiza las clases en una estructura jerárquica:
PUBLICACION
LIBRO
REVISTA
INVESTIGACION MAGAZINE
Características:
Una clase derivada puede, a su vez, ser una clase base, dando lugar a una jerarquía de
clases.
Una clase derivada puede acceder a los miembros PUBLIC y PROTECTED de la clase
base, como si fueran miembros de ella. No pueden tener acceso a los miembros Private.
Una clase derivada puede añadir sus propios datos y funciones.
Tipos de Herencia:
Herencia Simple: Es aquella en la que cada clase derivada hereda de una única clase. En
herencia simple, cada clase tiene un solo ascendiente. Cada clase base puede sin embargo
tener muchos descendientes.
85 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Herencia Múltiple: Es aquella en la cual una clase derivada tiene más de una clase base.
Aunque el concepto de herencia múltiple es muy útil, el diseño de clases suele ser más
complejo, y en ocasiones es preferible realizar la aplicación con herencia múltiple mediante
emulación de herencia simple.
CLASE BASE
Herencia Simple
Herencia Múltiple
Sintaxis:
Declaraciones de Miembros
Ejemplo:
Class alfa
86 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Clase Base
Técnica de Programación
//Funciones públicas
{
Clase
Private int n; Derivada
//Funciones públicas
Ejemplo
Desarrollar un programa en que permita implementar una clase base llamada Empleado,
posteriormente implementar la clase derivada: Administrativo
class Empleado
nombre = nom;
apellidos = ape;
dni = d;
edad = e;
87 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
public Administrativo (string xnom, string xape, double xdni, int xedad, string xcat, string
xofi)
categoria = xcat;
oficina = xofi;
class AppEjercicio
CAdministrativo adm;
double xd;
int xe;
Console.Write(“Nombre”); xn = Console.ReadLine();
Console.Write(“Apellido”); xa = Console.ReadLine();
Console.Write(“DNI:”); xd = Double.Parse(Console.ReadLine());
Console.Write(“Edad:”); xe = int.Pase(Console.ReadLine());
Console.Write(“Categoria:”); xc = Console.ReadLine();
Console.Write(“Oficina:”); xo = Console.ReadLine();
88 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
POLIMORFISMO
Es una funcionalidad que permite al código antiguo invocar nuevo código. Es uno de los
mayores beneficios de la programación orientado a objetos, porque le permiten extender o
mejorar su sistema sin romper o modificar el código existente.
Por ejemplo digamos que definimos un método que necesita iterar a través de una colección
de objetos Empleado, invocando el método CalcularPago de cada objeto. Eso funciona
bien cuando su compañía tiene solo un tipo de empleado, porque puede entonces insertar el
tipo de objeto exacto en la colección. Sin embargo qué pasa cuando empieza a contratar
otros tipos de empleados, para ello una solución orientada a objetos maneja las diferencias
como esta a través del polimorfismo.
Cada clase que se derive de la clase Empleado debería así tener su propia implementación
del método CalcularPago, con el polimorfismo, cuando tenga un puntero a un objeto
convertido al tipo de la clase base e invoque a ese método del objeto, el entorno de
ejecución del lenguaje asegurara que se llame a la versión correcta del método.
Ejemplo:
using System;
namespace polyApp{
class Empleado{
int edad;
double pago;
this.apellido=a;
this.nombre=n;
this.edad=e;
this.pago=p;
89 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
class EmpleadoSalario:Empleado
class EmpleadoContrato:Empleado
90 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
class PolyApp
Empleado [] emp;
protectedvoid cargarDatos()
protectedvoid calcularPagos()
foreach(Empleado e in emp)
e.CalcularPago(40);
91 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
publicstaticvoidMain()
app.cargarDatos();
app.calcularPagos();
Console.ReadLine();
Revisando podamos darnos cuenta la capacidad de agrupar objetos que tienen una clase
base común y tratarlos consistentemente. En el ejemplo anterior, aunque técnicamente
tenemos dos tipos de objetos diferentes (EmpleadoSalario y EmpleadoContrato), podemos
tratarlo como objetos Empleado. Esto permite agruparlos en un arreglo que se define como
un arreglo de objetos Empleado.
Ejmplo 1r
namespace c1
{
publicclassAgenda
{
float version = 1.0f; // variable privada
// no puede salir de la clase
// solo puede ser usada
// dentro de la clase
publicstring Nombre; // poniendo "public" delante
// de cualquier funcion
// o variable, habilitamos
// su uso al invocar la clase
privateint Sexo;
publicvoid DameTuNombre()
{
if (Version() == 1.0f)
92 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
{
Console.WriteLine("Cual es tu nombre?");
Nombre = Console.ReadLine();
}
}
// podemos sobrecargar una función
// en otras palabras, crear la misma
// función con diferentes argumentos
publicvoid DameTuNombre(string nombre)
{
Nombre = nombre;
}
publicstring DameTu(string algo)
{
Console.WriteLine("Escribe tu {0,0:s}", algo);
Nombre = Console.ReadLine();
return Nombre;
}
privatefloat Version()
{
return version;
}
// como ves, no es nada del otro mundo
// luego hay más historias, cómo el tema
// de los punteros en C#, el "delegate"
// la herencia, y esas cosillas..ZZzzz
}
classProgram
{
staticvoid Main(string[] args)
{
int numero = 3;
string cadena = "mi cadena";
Agenda A = newAgenda();
A.Nombre = "Pedro";
93 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
A.DameTuNombre();
A.DameTuNombre("Pepito");
cadena = A.DameTu("el nombre de tu
abuela");
Console.ReadLine();
}
}
}
Ejemplo 2
namespace c2
{
classClase1
{
publicint a = 1;
privatedouble b = 3;
publicString c = "akkkkk";
}
classProgram
{
staticvoid Main(string[] args)
{
Clase1 MiClase = newClase1(); // asi creamos una
instancia de Clase1
Console.WriteLine("{0} esto abc",MiClase.c);
Console.WriteLine(MiClase.c);
Console.ReadKey();
}
}
94 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
Ejemplo3
namespace c3
{
classClase1{
publicint a = 1;
publicdouble b = 3;
publicchar c = 'a';
publicvoid Descripcion()
{
Console.WriteLine("Hola, soy una clase");
}
classProgram
{
staticvoid Main(string[] args)
{
Console.ReadKey();
}
}
}
Ejemplo 4
95 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
namespace c4
{
classMetodo
{
publicdouble Divide(double a, double b)
{
return a / b;
}
}
classProgram
{
}
}
}
Ejemplo 5
namespace c5
{
classClase1
{
publicvoid nombre()
{
String a;
Console.WriteLine("ingrese nombre");
a = Console.ReadLine();
Console.WriteLine("el resultado es {0}",a);
96 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
classProgram
{
staticvoid Main(string[] args)
{
Clase1 MiClase = newClase1(); // asi creamos una
instancia de Clase1
MiClase.nombre();
Console.ReadKey();
}
}
}
Ejemplo6
namespace c6
{
classClase1
{
publicvoid modulo()
{
double d;
double x, y;
Console.WriteLine("ingrese el valor de un punto
inicial");
x = int.Parse(Console.ReadLine());
Console.WriteLine("ingrese el valor de un punto
final");
y = int.Parse(Console.ReadLine());
97 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
classProgram
{
staticvoid Main(string[] args)
{
Clase1 A = newClase1();
//A.X = 1;
//A.Y = -1;
A.modulo();
//Console.WriteLine("El modulo del punto (1,1) es:
{0}", A.Modulo());
Console.ReadKey();
}
}
}
Ejmplo 7
namespace c7
{
classPunto
{
publicdouble X;
publicdouble Y;
publicdouble Modulo()
{
double d;
d = Math.Sqrt(X * X + Y * Y); //Sqrt =
raiz cuadrada
98 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
return d;
}
}
classProgram
{
staticvoid Main(string[] args)
{
Punto A = newPunto();
A.X = 1;
A.Y = -1;
Ejemplo 8
namespace C8
{
classoperaciones
{
publicvoid promedio()
{
int nota1 , nota2;
double promedio;
do{
Console.Write("Nota 1 -->");
nota1 =
int.Parse(Console.ReadLine());
}while(nota1<0 || nota1>20);
99 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
do{
Console.Write("Nota 2 -->");
nota2 =
int.Parse(Console.ReadLine());
}while(nota2<0 || nota2>20);
classProgram
{
staticvoid Main(string[] args)
{
operaciones MiClase = newoperaciones(); // asi
creamos una instancia de Clase1
MiClase.promedio();
Console.ReadKey();
}
}
}
namespace C11
{
classPunto
{
publicdouble X;
publicdouble Y;
100 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez
Técnica de Programación
publicdouble Modulo()
{
double d;
Console.WriteLine("ingresar numero1");
X=double.Parse(Console.ReadLine());
Console.WriteLine("ingresar numero2");
Y=double.Parse(Console.ReadLine());
d= Math.Sqrt(X * X + Y * Y);
//Sqrt = raiz cuadrada
Console.WriteLine("resultado es {0}", d);
return d;
}
}
classProgram
{
staticvoid Main(string[] args)
{
Punto A = newPunto();
A.Modulo();
//A.X = 1;
//A.Y = -1;
//Console.WriteLine("El modulo del punto (1,1) es:
{0}", A.Modulo());
Console.ReadKey();
}
}
}
101 Ing. Humberto Coveñas – Ing. Heber Gomez – Ing. Miguel Valle Pelaez