Você está na página 1de 13

Curso de Programacin en Lenguajes Estructurados. Tema 3.

Fundamentos de C#

Tema 3

Fundamentos de C#
3.1 Introduccin.
Como describe el ttulo del tema, se expondr a continuacin una introduccin a C#. Operaciones de definicin de variables, asignar y mostrar valores, presentar resultados, manejo de operadores, definicin de mtodos sern los conceptos a tratar. Tambin se mostrar la estructura fundamental de un programa en C#. Todos estos elementos se irn a su vez ampliando en el resto de captulos del curso.

3.2 Variables.
Los programas, para trabajar con datos, necesitan almacenarlos en la memoria y tener la oportunidad de acceder a sus valores para leerlos o modificarlos. Una variable representa un espacio de memoria para almacenar un valor de un determinado tipo. Normalmente, a medida que se ejecuta un programa, esos valores sern modificados desde unos valores iniciales a otros finales, por lo que ser necesario el poder acceder al espacio de memoria que representa una variable para leer o recuperar el valor que almacena y/o modificarlo. A nivel de lenguaje, la declaracin de una variable consiste en dar un nombre o identificador al espacio de memoria que representa y asociarle un tipo. El tipo representa un conjunto o rango de valores posibles. Bsicamente la declaracin de una variable se realiza dentro de un bloque. Un bloque queda definido por el cdigo que queda encerrado entre llaves {}. Las variables son accesibles, es decir podemos usarlas, slo dentro del bloque en que han sido declaradas. Ejemplo:
class Ejemplo31 { public static void Main(string[] args) { int a; // podr almacenar nmeros enteros double d, e; // podrn almacenar nmeros reales // . . . } // . . . }

Las variables a, d, e han sido declaradas dentro del bloque que define el mtodo Main. Esto implica que slo sern accesibles dentro del bloque Main de la clase Ejemplo31. En este caso se dice que las variables son locales al bloque donde han sido declaradas. Esto es lo que se conoce como mbito (espacio de programa al que queda limitado) local. Las variables locales se crean y tienen valor desde el punto de su declaracin hasta que termina el bloque en que han sido declaradas. Es importante que cada variable local tenga un identificador o nombre distinto, de esta forma podemos diferenciar unas de otras. Las variables locales no son iniciadas a ningn valor. Es obligacin del programador asignarle valores para poder operar con ellas; en caso contrario el compilador nos avisar del error en todas las sentencias que las utilicen. Las variables que se declaran fuera de los mtodos, se denominan variables miembro o atributos de la clase. Estas variables que se declaran dentro del bloque de una clase pero fuera de cualquier mtodo tienen mbito de clase; es decir son accesibles por todo el cdigo de la clase. Importante: no se pueden definir variables fuera de una clase.

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

Las variables miembro s son iniciadas por el compilador. Los valores iniciales depende del tipo, y tomarn el valor cero si son de tipo numrico, false (falso) si son tipo bool o null si son referencias. Los tipo en C# se clasifican en tipos valor y tipos referencia. Una variable de tipo valor almacena directamente un valor (datos en general), mientras que una variable tipo referencia lo que permite almacenar es una referencia a un objeto (posicin de memoria de un objeto). Por ejemplo, los nmeros son tipos valor; las cadenas de caracteres son tipos referencia Veamos un ejemplo de cdigo que nos aclare:
class Ejemplo32 { public static void Main(string[] args) { int a = 2, b = 3, r; string s = Vamos a sumar; // referencia al lugar donde se almacena // la cadena System.Console.WriteLine(s); r = a + b; System.Console.WriteLine({0} + {1} = {2}, a, b, r); Escribir(); } public static void Escribir() { string s; // variable de tipo string. Es tipo referencia s = Esto es todo...; // cambia la referencia a otro lugar System.Console.WriteLine(s); // escribe la cadena referenciada } }

La clase Ejemplo32 define dos mtodos. El mtodo Main() es el mtodo de entrada, es decir el mtodo que empieza a ejecutarse. El mtodo Escribir() se ejecutar cuando sea invocado. Las variables a, b, r y s son locales al bloque del mtodo Main() . Las dos primeras han sido declaradas e iniciadas. La variable r no tiene ningn valor inicial, aunque posteriormente se le asigna el resultado de evaluar la expresin de la suma de los contenidos de las variables a y b. Estas tres variable numricas son de tipo valor, por lo que ellas mismas almacenarn los valores. La variable s es de tipo string. Los tipos string son objetos de una clase definida en la BCL que permiten almacenar y manipular cadenas de caracteres Todos los objetos son tipos referencia; en nuestro caso el objeto s de tipo string almacenar la posicin de memoria donde el compilador almacene la cadena de caracteres Vamos a sumar. Posteriormente se invoca al mtodo WriteLine() pasndole como argumento la referencia de la cadena que debe presentar por pantalla. Despus de evaluar la expresin aritmtica, la variable r almacenar el valor 5. A continuacin vemos otra llamada al mtodo WriteLine() pero con un argumento de diferente aspecto. El mtodo WriteLine() necesita como argumento una cadena, cuyo contenido es lo que aparecer por pantalla. En este caso el mtodo construye por as decirlo la cadena. La expresin que est entrecomillada {0} + {1} = {2}, sera en principio la cadena a mostrar, pero no est completamente construida. Este formato de nmeros encerrado entre llaves hace que se vayan sustituyendo las llaves por los valores de las variables que aparecen a continuacin en el orden que indiquen los nmeros que estn entre las llaves. En este caso {0} sustituye al valor de la primera variable de la lista, la a, que es 2; {1} se sustituye por 3, y {2} por 5. Al final el mtodo WriteLine() usa como argumento la cadena 2 + 3 = 5, que es lo que se presentar por pantalla. Finalmente se invoca al mtodo Escribir(). En este mtodo se declara una nueva variable de nombre s. Esta variable no tiene nada que ver con la declarada en Main(), cada una pertenece a su mbito particular y son dos variables distintas. Posteriormente le asignamos la referencia donde el compilador tenga almacenada la cadena Eso es todo.... La llamada al mtodo WriteLine() produce la presentacin en pantalla de esta nueva cadena. Terminado de ejecutar el mtodo, la secuencia de ejecucin vuelve al lugar de donde se invoc. Como no queda nada que ejecutar del mtodo Main(), se acaba la ejecucin del programa y se retorna al control al sistema operativo.
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

3.3 Tipos.
El tipo de una variable depender de lo que vaya a almacenar. Como hemos comentado, el trmino tipo por valor indica que las variables de esos tipos contienen directamente sus valores. Los tipos por valor tambin se conocen como tipos primitivos. Cuando se declaran variables, normalmente usamos un alias para referirnos a su tipo. C# dispone de estos alias para que se asemejen a los tipos que se utilizan en otros lenguajes. La tabla siguiente muestra los tipos disponibles Tabla 2-1. Tipos por valor Alias byte sbyte short ushort int uint long ulong float double decimal char bool Tipo C# System.Byte System.SByte System.Int16 System.Uint16 System.Int32 System.Uint32 System.Int64 System.Uint64 System.Single System.Double System.Decimal System.Char System.Boolean Signo? Bytes No Si Si No Si No Si No Si Si Si 1 1 2 2 4 4 8 8 4 8 12 2 1 Rango 0 hasta 255 -128 hasta 127 -32.768 hasta 32.767 0 hasta 65535 -2.147.483.648 hasta2.147.483.647 0 hasta 4.394.967.395 -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807 0 hasta 18446744073709551615 Aproximadamente 1.5E-45 hasta 3.4E38 con 7 cifras significativas Aproximadamente 5.0E-324 hasta 1.7E308 con 15 cifras significativas Aproximadamente 1.0E-28 hasta 7.9E28 con 28 cifras significativas Cualquier carcter Unicode (16 bits) verdadero o falso

No

3.3.1. Enteros
Los tipos que sirven para almacenar nmeros enteros son: byte, sbyte. short, ushort, int, uint, long y ulong. Como se aprecia en la tabla, C# define versiones con y sin signo para tipos con los mismo bytes utilizados. La diferencia entre enteros con signo y sin signo radica en el modo de interpretar el bit de nivel superior del entero. Si se especifica un entero con signo, el compilador entender que el primer bit indica el signo: 0 si es positivo, 1 si es negativo. Sin embargo, los enteros sin signo, ese bit se puede utilizar para almacen el nmero y as se consigue que los enteros sin signo puedan almacenar nmeros el doble de grandes que los enteros con signo. El siguiente ejemplo muestra la declaracin y uso de algunos tipos enteros calculando el nmero de segundos en una hora, en un da y en un ao.
class Enteros { public static void Main() { int minuto = 60; //segundos por minuto int hora = minuto*60; int dia = hora*24; long Ao = dia*365; System.Console.WriteLine("Segundos en un dia: {0}", dia); System.Console.WriteLine("Segundos en un ao: {0}", ao); } }

3.3.2. Tipos de coma flotante.

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

Los tipos de coma flotante sirven para representar a nmeros con parte fraccionaria. La representacin por supuesto puede no ser exacta, bien por errores de la mquina, bien porque el nmero de decimales que se puede alojar es finito. Existen dos clases de tipos de punto flotante, float y double. De los dos, el ms usado es double, pues es el valor que devuelven la mayora de las funciones matemticas de la biblioteca base. Cuando a una variable se le quiere asignar una constante de tipo float deberemos aadirle al final la letra f o F, de lo contrario se considera de tipo double. Tambin se puede usar la notacin cientfica (mantisa, exponente) par asignar valores a las variables de tipo flotante. El siguiente ejemplo calcula la raz cuadrada y el logaritmo de dos:
class Flotante { public static void Main() { int a = 2; double b = 2; double r = 2.34E+05; double log2 = System.Math.Log(a); double raiz2 = System.Math.Sqrt(b); System.Console.WriteLine("El logaritmo de dos es {0}", log2 ); System.Console.WriteLine("La raz de dos es {0}", raiz2 ); } }

y la salida ser la siguiente:


El logaritmo de dos es 0.693147180559945 La raz de dos es 1.4142135623731

Si intentamos cambiar el tipo de log2 a otro de menos precisin, como float o int, el compilador protestar. Esto se debe, como hemos dicho a que el valor devuelto por los mtodos matemticos es de tipo double y si se quiere convertir a float, pues se perdern datos.

3.3.3. El tipo decimal


El tipo decimal es un tipo "nuevo" en el sentido de que no tiene equivalente en otros lenguajes. Es muy parecido a los tipo de coma flotante float y double. En la aritmtica de los tipos de coma flotante ordinarios, se pueden producir leves errores de redondeo. El tipo decimal elimina estos errores y puede representar correctamente hasta 28 lugares decimales. Esta capacidad para representar valores decimales sin errores de redondeo lo hace especialmente eficaz para clculos monetarios. Para especificar que una constante es de tipo decimal, hay que aadirle al final de su valor la letra m o M, de lo contrario se considera de tipo double.

3.3.4. El tipo bool.


El tipo bool se utiliza para indicar si el resultado de la evaluacin de una expresin bolean o lgica es verdadero o falso. Estos dos valores se expresan con las palabras reservadas true y false.

3.3.5. El tipo char.


El tipo char permite almacenar un carcter en formato UNICODE de 16 bits. Este formato es un cdigo de representacin de caracteres que hace corresponder a cada uno de ellos una secuencia de 16 bits; por lo tanto lo que se almacena es un nmero entero positivo cuyo rango es de 0 a 65535.. Los valores del 0 al 127 se corresponden con los caracteres ASCII del mismo cdigo. As con el juego de caracteres UNICODE se permiten representar no slo los caracteres ASCII de nuestro alfabeto, sino los correspondientes a otros alfabetos, como son el griego, cirlico, chino, etc. Las constantes de tipo char se expresan encerrando entre comillas simples el carcter deseado. As por ejemplo:

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

char letra = A;

No confundir la constante carcter A con la cadena de caracteres A. El primer tipo es un tipo primitivo y se almacena por valor; el segundo es un tipo referencia.

3.4 Asignacin de valores.


Unas de las operaciones ms usuales que se realizan en un programa es la asignacin de valores en variables. Para ello se usa la sentencia de asignacin de la forma:
variable operador_de_asignacin expresin;

Esta sentencia evala la expresin que aparece a la derecha del operador de asignacin, y el valor obtenido se asigna a la variable de la izquierda. De todos los operadores de asignacin, el operador = es el ms usual. Por ejemplo:
suma = valor1 + valor2;

Cuando a una variable de tipo valor se le asigna un valor, el contenido previo que almacenara desaparece y se sustituye por el nuevo. Recordar que las cadenas de caracteres son objetos de la clase string y se almacenan por referencia. Esto implica que si a un objeto string estuviera referenciando a una cadena de caracteres y posteriormente se le asigna otra cadena, la referencia de la primera cadena se pierde, ya que ahora el objeto string referencia a la nueva cadena.. Ejemplo:
class Ejemplo33 { static void Main(string[] args) { int a, b, suma; a = 12; b = 8; string s1 = "Hola"; suma = a + b; System.Console.WriteLine(s1); System.Console.WriteLine("La suma es " + suma); suma = suma + 15; System.Console.WriteLine("Ahora la suma es " + suma); s1 = "Adis"; System.Console.WriteLine(s1); } }

La ejecucin de este cdigo produce la siguiente salida:


Hola La suma es 20 Ahora la suma es 35 Adis

El ejemplo muestra como es posible acumular el contenido de una variable con un nuevo valor. As al valor inicial de 20 para suma se le acumula el valor 15, el resultado final de la expresin es 35, valor que se asigna a la variable. Tambin podemos observar en las sentencias que presentan los valores de suma, una nueva manera de usar el mtodo WriteLine(). Se coment que este mtodo necesita como argumento la cadena que se quiere presentar por pantalla. En nuestro caso en el cdigo aparece una expresin como la siguiente:
"La suma es " + suma

En este caso el compilador intentara sumar una cadena de caracteres con un valor. Como esto no es posible por que no son tipos compatibles, lo que hace de forma automtica es convertir el valor de la variable
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

suma en objeto string que referencie a una cadena cuyo contenido sea igual a los dgitos que almacena la variable suma; es decir construye una cadena de contenido 20. Ahora lo que se tiene son dos cadenas de caracteres unidos por el operador +. En la clase string se definen muchos mtodos y operadores, en particular el operador +. Este operador se ha definido de forma que la suma de dos cadenas produzca la concatenacin de ambas, es decir, se construye una nueva cadena cuyo contenido est formado por los caracteres de ambas. El resultado final es la cadena La suma es 20. sta es la cadena que usa el mtodo WriteLine() como argumento, y por lo tanto es lo que presenta en pantalla.

3.5 Sentencias y mtodos.


Una sentencia C# puede formarse a partir de: una palabra clave, expresiones, declaraciones o llamadas a mtodos. Al escribir sentencias se debe tener en cuenta que toda sentencia simple acaba con punto y coma (;). Dos o ms sentencias pueden aparecer sobre una misma lnea, separadas por punto y coma. Una sentencia nula consta solamente de punto y coma. Una sentencia C# puede escribirse en varias lneas fsicas. Una sentencia compuesta o bloque es una coleccin de sentencias simples incluidas entre llaves. Un bloque puede contener a otros bloques. Un mtodo es una coleccin de sentencias que ejecutan una tarea especificada. En C# un mtodo siempre pertenece a una clase, y su definicin nunca puede contener a la definicin de otro mtodo; esto es, no se permite mtodos anidados. Todo programa C# tiene un mtodo denominado Main(), y slo uno. Este mtodo es el punto de entrada al programa y tambin el punto de salida. Su definicin es:
public static void Main(string[] args) { // cuerpo del mtodo }

El mtodo Main() es pblico, esttico, no devuelve nada y tiene un argumento de tipo string[] que almacenar los argumentos pasados desde la lnea de rdenes cuando se invoca al programa para su ejecucin.

3.6 Expresiones aritmticas.


Una expresin es un conjunto de operandos unidos mediante operadores que devuelve un valor. Los operadores aritmticos son: +, -, *, /, %. Con ellos se establece la suma, resta, multiplicacin, divisin y mdulo o resto de una divisin. En todos ellos los operandos pueden ser tipos enteros o reales. En los operadores divisin y mdulo, si ambos operandos son enteros, el resultado es de tipo entero; en otro caso el resultado es real. Cuando en una expresin los operandos son de diferente tipo, se realiza una conversin del operando de menor precisin al de mayor precisin. Los operandos de tipo entero son menos precisos que los reales. Dentro de cada tipo, la precisin aumenta a medida que se utiliza ms memoria para su representacin. As el tipo int es menos preciso que el tipo long, ste es menos preciso que el tipo float, y a su vez ste los es menos que un double. En la asignacin, si el resultado de la expresin no coincide con el tipo de la variable que almacena el resultado, ste se convierte al tipo de la variable que almacena el resultado. Cuando la precisin de la variable que recibe el resultado es mayor que la de la expresin, no hay problemas; en el caso contrario, el compilador protesta porque se puede perder informacin. En este caso se debe realizar una conversin explcita. La expresiones aritmticas se evalan de izquierda a derecha teniendo en cuenta la prioridad de los operadores. Los operadores *, /, % tienen entre ellos la misma prioridad pero mayor que la de los operadores + y -. Se pueden usar parntesis para forzar a que la expresin que contenga se evale primero. Si hay varios niveles de parntesis se evalan desde los ms internos a los ms externos. Ejemplo:
class Ejemplo34 { static void Main(string[] args)

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

{ double a = 10; float b = 20; int c = 2; double r1; int r2; r1 = 7.5 * System.Math.Sqrt(a) - b / r2 = (int)(7.5 * System.Math.Sqrt(a) System.Console.WriteLine(r1); // System.Console.WriteLine(r2); // } }

c; - b / c); 13,7170824512628 13

En el ejemplo, primero se calcula la raz cuadrada de a, el resultado, de tipo double, se multiplica por 7.5 que tambin es de tipo double. Despus se evala b/c . Para ello previamente se convierte el tipo de c que es int al tipo de b que es de tipo float. El resultado es de tipo float. Finalmente se hace la resta de los dos resultados anteriores convirtiendo previamente el resultado de tipo float a tipo double. El resultado, de tipo double se asigna r1 que es del mismo tipo. La instruccin siguiente calcula la misma expresin, pero es convertida de forma explcita a tipo int para que se pueda asignar a r2. Si no forzramos la conversin, el compilador nos dara el mensaje de error: C:\Datos\DT\Ciclo\Ple-2006\Temas\Ejemplo34\Ejemplo34.cs(13): No se puede convertir implcitamente el tipo 'double' a 'int' En este caso la conversin explcita hace que se pierda la informacin correspondiente a la parte fraccionaria del resultado.

3.7 Expresiones condicionales.


Hasta ahora, en todos los programas que hemos realizado, todas y cada una de la sentencias que contenan se ejecutaban secuencialmente, una detrs de otra. Esta situacin no es lo ms usual. Normalmente en un programa se necesita que se ejecute o no, una o ms sentencias dependiendo de que se cumpla o no cierta condicin. De esta forma, el camino o flujo de ejecucin puede alterarse segn ciertas condiciones. Para ello se necesitan sentencias de tipo condicional. Una de ellas es la sentencia if. Esta sentencia, en su formato ms sencillo tiene la siguiente sintaxis:
if (expresin condicional) sentencia;

Cuando se ejecuta una sentencia if, se evala la expresin condicional. Si el resultado es verdadero (true), se ejecuta sentencia, en caso contrario (false), no se ejecuta. La llamada sentencia puede ser una sentencia simple, o una sentencia compuesta (grupo de sentencias encerradas entre llaves constituyendo un bloque). El siguiente cdigo nos dira si el resultado de una expresin aritmtica es par presentando un mensaje, y termina presentando el valor de la expresin.
class Ejemplo35 { static void Main(string[] args) { int a = 18; double r; r = a / 4; if (r % 2 == 0) System.Console.WriteLine(El resultado es par); System.Console.WriteLine(r); } }

La sentencia if del ejemplo comprueba si el resto de la divisin entera del valor de r entre 2 es igual a cero. Si es cierto, se invoca al mtodo WriteLine() y se presenta la cadena El resultado es par; si es falso, no

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

hace lo anterior. En cualquiera de los dos casos se contina con la siguiente sentencia que presenta por pantalla el contenido de la variable r. El resultado de evaluar una expresin condicional es siempre un valor de tipo bool. Los operadores relacionales son < (menor), <= (menor o igual), > (mayor), >= (mayor o igual), != (distinto), == (igual). Todos ellos tienen la misma prioridad. Hay una versin ms completa de la sentencia if , la llamada condicional compuesta. Su formato es:
if (expresin condicional) sentencia1; else sentencia2;

En este caso, si la expresin condicional se evala como true, se ejecuta sentencia1, en caso contrario se ejecuta sentencia2. Las sentencias que aparecen en el formato anterior pueden ser sentencias simples (una nica sentencia) o compuestas. Modifiquemos el ejemplo anterior:
class Ejemplo36 { static void Main(string[] args) { int a = 18; double r; r = a / 4; if (r % 2 == 0) { System.Console.WriteLine(El resultado es par); System.Console.WriteLine(r); } else { System.Console.WriteLine(El resultado es impar); System.Console.WriteLine(r); } } }

Vemos como las sentencias del bloque if y del bloque else son compuestas. El ejemplo se puede simplificar escribiendo menos cdigo. Vemos que la sentencia que presenta por pantalla el resultado almacenado en r se ejecuta siempre, ya que aparece tanto en el bloque if como en el else. Por lo tanto podemos trasladarla a continuacin de la sentencia if como la instruccin siguiente a ejecutar.
. . . if (r % 2 == 0) System.Console.WriteLine(El resultado es par); else System.Console.WriteLine(El resultado es impar); System.Console.WriteLine(r);

3.8 Entrada y salida.


La comunicacin entre un origen de datos y su destino se realiza a travs de flujos. Un flujo es un objeto que hace de intermediario entre el programa y un origen o destino de datos, que permite leer o escribir datos independientemente de las caractersticas de los dispositivos de entrada y/o salida, y de los tipos de datos involucrados. Dentro de las clases que permiten trabajar con flujos, est la clase Console del espacio System. Esta clase representa los flujos de entrada, salida y error estndar slo para las aplicaciones de consola, permitiendo leer y escribir caracteres de o hacia la consola. Los datos de la consola se leen a partir de los flujos de entrada estndar, los datos normales de la consola se escriben en el flujo de salida estndar y los datos de error de la consola se escriben en el flujo de salida de

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

error estndar. Estos flujos se asocian a la consola (son abiertos) de forma automtica cuando se inicia una aplicacin de consola, y se presentan al usuario como las propiedades In, Out y Error de la clase Console. Estos tres flujos no tiene que asociarlos el programador. Cuando una aplicacin de consola se ejecuta, se abren de forma automtica Por defecto, el flujo de entrada estndar (In) est asociado al teclado. Dos mtodos de la clase Console estn definidos para leer datos de la entrada estndar:
public static int Read() public static string ReadLine() // lee slo un carcter del teclado // lee una lnea del teclado

El mtodo Read() lee del teclado el siguiente carcter disponible. Devuelve un entero int correspondiente al cdigo del carcter ledo, o un nmero negativo si no hay ms datos en el flujo. Ejemplo:
char respuesta = (char) System.Console.Read();

El carcter ledo del teclado debe convertirse de forma explcita a tipo char si queremos almacenarlo en una variable de tipo char. El mtodo ReadLine() lee del teclado la siguiente lnea disponible. Una lnea es una secuencia de caracteres que termina con el carcter \r, con el carcter \n o con ambos. Devuelve una referencia a un objeto string que envuelve la lnea leda, o el valor null si no hay datos disponibles. Para leer datos numricos debemos convertir la cadena que devuelve ReadLine() en alguno de los tipos primitivos. Para ello podemos usar los mtodos estticos de la clase Convert, del espacio de nombres System, o el mtodo Parse() de las estructuras que encapsulan los tipos primitivos. Ejemplo:
string s; int num1; double num2; s = Console.ReadLine(); num1 = Convert.ToInt32(s); num2 = Double.Parse(s);

En este ejemplo el mtodo ToInt32() permite convertir el argumento que encierre entre parntesis en un nmero entero de 32 bits, es decir a tipo int. Otros mtodos de la clase Convert son ToByte, ToInt16, ToInt32, ToInt64, ToSingle, ToDouble, ToString, los cuales permiten realizar conversiones a cada uno de los tipos primitivos. Aunque se estudiar ms adelante, podemos adelantar que en el espacio de nombres System estn disponibles las estructuras Byte, Sbyte, Char, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal y Boolean que encapsulan cada uno de los tipos primitivos. Una estructura es como una clase, pero de tipo valor en lugar de tipo referencia. Por ejemplo, un objeto de la estructura Int32, encapsula un nmero entero (dato tipo int). Todas estas estructuras disponen de una serie de campos y mtodos que podemos usar. Entre stos estn los mtodos:
public static tipo Parse(string); public override string ToString();

El mtodo Parse() intenta convertir un string en una representacin de otro tipo. Usa como argumento un string y retorna un valor de tipo igual al de la estructura que invoca el mtodo. As, el mtodo Double.Parse() retorna un tipo double, y el mtodo Int64.Parse() un tipo long. Ejemplo:
int k1 = Int32.Parse(126); // k1 almacena el numero entero 126 string pi = 3.1415926; double num_pi = Double.Parse(pi); // num_pi almacena el real 3.1315926

El mtodo ToString() est redefinido en estas estructuras de forma que aplicado a tipos numricos retorne una representacin en formato cadena de dicho nmero: Por ejemplo:
string s1 = 43.ToString(); double d = 12.56;

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

10 Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

string s2 = d.ToString();

Los string s1 y s2 contendrn respectivamente las cadenas 43 y 12.56. Por otro lado, en toda aplicacin de consola tenemos disponible el flujo de salida estndar (Out) asociado al monitor. Dos mtodos de la clase Console estn definidos para escribir datos de la salida estndar:
public static void Write([argumento]); public static void WriteLine([argumento]);

Ambos mtodos escriben su argumento en el flujo de salida. La diferencia es que WriteLine() aade un carcter \n (avance de lnea) al final de su salida, y Write() no. Los argumentos pueden ser de cualquier tipo primitivo o referenciado. Si se usa sin argumento, el efecto es escribir un carcter \n. Los mtodos Write() y WriteLine() permiten mostrar los datos segn un formato. Para ello se utilizan las siguientes definiciones para los mtodos:
public static void Write(formato [, argumento]); public static void WriteLine(formato[, argumento]);

La cadena de formato permite especificar como va ser la salida. Es una cadena de caracteres formada por caracteres ordinarios, secuencias de escape y especificaciones de formato. Las secuencias de escape se forman por una letra precedida por el carcter \ que permiten representar caracteres no visibles. El formato se lee de izquierda a derecha. Ejemplo:
int edad = 21; double peso = 71,3; Write(\tTiene {0,2:d} aos y pesa {1,6:f2} Kg \n, edad, peso);

La salida en pantalla ser:


Tiene 21 aos y pesa 71.30 Kg

El argumento representa el valor o valores a escribir. Cada argumento debe tener su correspondiente especificacin de formato. Esta correspondencia se establece en parejas y en el mismo orden en que aparecen en la expresin. Si hay ms argumentos que especificaciones de formato, los argumentos en exceso se ignoran y no aparecen en la salida. En el ejemplo anterior, los caracteres ordinarios se escribirn tal cual, las especificaciones de formato sern sustituidas por los valores correspondientes en la lista de argumentos y las secuencias de escape darn lugar a las acciones que representan. Una especificacin de formato est compuesta por:
{posicin [,ancho] [:tipo[decimales]]}

posicin: indica la posicin (0,1,2, etc) del argumento correspondiente de la lnea de argumentos. ancho: opcional. Mnimo nmero de posiciones para la salida. Si el ancho se omite o el valor a escribir ocupa ms posiciones de las especificadas, el ancho es incrementado en lo necesario. Si este valor es negativo, el resultado se ajusta a la izquierda, dentro del ancho especificado. tipo: opcional. Es uno de los caracteres de la tabla posterior y permite establecer el tipo del argumento.

decimales: opcional. Mnimo nmero de dgitos a mostrar en caso de valores enteros, o de decimales en caso de valores reales. Veamos los formatos con algunos ejemplos:

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

11

Carcter C D E F

Descripcin Moneda Decimal Cientfico Real

G N P X

General Numrico % Hexadecimal

Ejemplo Write({0,9:C2},-4.5) Write({0:D5},45) Write({0:E},450000) Write({0:F2},45) Write({0:F0},45) Write({0,8:F2},45) Write({0,8:F2},145.3) Write({0:G},4.5) Write({0:N},4500000) Write({0:P},0.12345) Write({0:X},0xFF7A) Write({0:X},450)

Salida -4,50 00045 4,500000E+005 45,00 45 45,00 145,3 4,5 4.500.000,00 12,35% FF7A 1C2

3.9 Definicin de mtodos.


La BCL (biblioteca de clases base) dispone de muchas clases y cientos de mtodos listos para sus uso. De hecho ya hemos utilizado el mtodo WriteLine() del la clase Console o el mtodo Sqrt() de la clase Math. Los programadores podemos definir nuestros propios mtodos para las tareas que necesitemos programar. De una manera resumida, la definicin de un mtodo consiste primeramente en indicar al compilador un nombre o identificador del mtodo, el nmero y tipo de parmetros, si es que los necesita, y el tipo del valor devuelto, si es que devuelve algo. A continuacin se escribe el cuerpo del mtodo con las sentencias que deben ejecutarse cuando se invoque al mtodo. La sintaxis sera:
[modificadores] tipo_retorno nombre_metodo([lista parmetros]) { declaracin de variables locales sentencias; [return [expresin]]; }

Los modificadores los estudiaremos en otros temas, por ahora usaremos public static en nuestra definicin. El tipo de retorno sirve para indicar el tipo del resultado que va a devolver el mtodo. Si no va a devolver nada, se usa la palabra reservada void. El nombre del mtodo es el identificador que usaremos para invocarlo. La lista de parmetros es una lista de variables con sus tipos separadas por comas. Los parmetros se usan para pasar datos al mtodo con los que trabajar. Si no hay que enviar valores, no habr lista de parmetros, aunque los parntesis deben mantenerse. Los parmetros son variables locales al mtodo, por lo que slo sern accesibles dentro del mtodo. Cada vez que se realice una llamada al mtodo los parmetros se crean; y se destruirn cuando acabe la ejecucin del mtodo. La sentencia return es opcional. Si existe, provoca que se termine la ejecucin del mtodo y el control es devuelto al mtodo que hizo la llamada, aunque queden sentencias por ejecutar en el mtodo invocado. La expresin que le puede acompaar tambin es opcional. Si existe, se evala la expresin y el valor obtenido se usa como valor de retorno. Si no existe la sentencia return, el control vuelve al mtodo que hizo la llamada cuando se acaben de ejecutar todas las sentencias del mtodo invocado. Pueden existir varias sentencias return, aunque lgicamente solamente una de ellas se ejecutar provocando el retorno. Para invocar a un mtodo se usa el formato siguiente:
espacio_de_nombres.clase.nombre_mtodo(parmetros);

Si en nuestro programa no se define un espacio de nombres, que es lo que hemos hecho hasta ahora, no es necesario escribir ninguno en la llamada del mtodo. Como veremos en otro tema, si el programador no define un espacio de nombres, el compilador define uno por defecto, y todas las clases que definamos en el programa pertenecern a este espacio de nombres por defecto. Si el mtodo que hemos definido y el mtodo de donde se invoca pertenecen a la misma clase, tampoco es necesario anteponer el nombre de la clase en la llamada, ya que comparten la misma clase. En la llamada, deben aparecer entre los parntesis tantos valores como nmero de parmetros se hayan

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

12 Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

especificado en la definicin del mtodo. Adems deben coincidir en el tipo, o por lo menos que se puedan convertir de forma implcita. Estos valores pueden expresarse directamente mediante constantes o mediante los contenidos de variables. Cuando se invoca al mtodo, los valores que aparecen en la llamada se copian uno a uno, y en el mismo orden, en los parmetros definidos en el mtodo. Esta es la forma de pasar datos a un mtodo. Veamos un ejemplo. Supongamos que queremos definir un mtodo que sea capaz de calcular la suma o la resta de dos nmeros reales, y retornar el resultado. Para ello definimos un mtodo de nombre Calcular() que recibir tres parmetros. El primero, de tipo char, recibir el tipo de operacin a realizar. Los valores permitidos sern el carcter + o el carcter -. Los dos parmetros restantes, de tipo double, recibirn los valores que hay que sumar o restar. El resultado de la operacin, de tipo double, es el valor a retornar. En el cuerpo del mtodo se declara una variable de nombre res que se usar para almacenar el valor de la expresin de suma o resta y cuyo valor se devolver. A continuacin se determina cul es valor del parmetro que recibe el tipo de operacin. Dependiendo del resultado obtenido al evaluar las expresiones condicionales, se realizarn las operaciones correspondientes. Vemos que si el tipo de operacin no se corresponde con la suma o la resta, la variable res toma el valor System.Double.MaxValue. Este valor es una constante definida cuyo valor es el ms grande que se puede representar de tipo double. Este valor es tan descomunalmente grande, que ninguna expresin aritmtica normal llegar a tomar. Finalmente la sentencia return devuelve el valor que almacene res. En el mtodo Main(), se declaran la variables de tipo double v1 y r. La primera, iniciada al valor 4 la usaremos como primer operando; la segunda como variable que almacenar el valor de retorno que devuelva el mtodo Calcular(). La variable tipo_op est iniciada al valor + con la intencin inicial de hacer una operacin de suma. En la llamada al mtodo los valores (+, 4, 3) se copiarn en las variables definidas como parmetros (c, op1, op2), y ser con estos valores con los que el mtodo trabajar. Vemos como en la llamada podemos usar tanto variables, como constantes. En realidad se pueden usar expresiones en la llamada, las cuales se evaluaran y sus resultados seran los que se copiaran en los parmetros. Recordar que el mtodo recibe copias de los valores, por lo que la modificacin de stos que se pudieran realizar dentro del mtodo, no afectar a los valores originales. Como el mtodo tiene un valor de retorno, ste se aprovecha y se asigna a la variable r de Main(). Finalmente, si el valor devuelto por el mtodo es distinto de System.Double.MaxValue, se presenta en pantalla el resultado de la operacin; en caso contrario se presenta el mensaje de error. La salida que provoca la ejecucin del cdigo sera:
4 + 3 = 7 // Versin 1.0 class Ejemplo37 { public static void Main(string[] args) { double v1 = 4, r; char tipo_op = '+'; r = Calcular(tipo_op,v1,3); if (r != System.Double.MaxValue) System.Console.WriteLine("{0} {1} {2} = {3}",v1,tipo_op,3,r); else System.Console.WriteLine("La operacin no es vlida..."); System.Console.ReadLine(); }

public static double Calcular(char c, double op1, double op2)

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Curso de Programacin en Lenguajes Estructurados. Tema 3. Fundamentos de C#

13

{ double res; if (c == '+') res = op1 + op2; else if (c == '-') res = op1 - op2; else res = System.Double.MaxValue; return res; } }

A continuacin se presenta otra versin ms compacta, aunque quizs menos clara.


// Versin 1.1 class Ejemplo37Bis { public static void Main(string[] args) { double v1 = 4; char tipo_op = '+'; if (Calcular(tipo_op,v1,3) != System.Double.MaxValue) System.Console.WriteLine("{0} {1} {2} = {3}", v1,tipo_op,3,Calcular(tipo_op,v1,3)); else System.Console.WriteLine("La operacin no es vlida..."); System.Console.ReadLine(); } public static double Calcular(char c, double op1, double op2) { if (c == '+') return op1 + op2; if (c == '-') return op1 - op2; else return System.Double.MaxValue; } }

Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.

Você também pode gostar