Está en la página 1de 50

Ejemplos de C# con Mono

2007 Martin Marquez: xomalli@gmail.com http://www.humansharp.com; version 0.2

Copyright 2005 Martin Marquez Se otorga el permiso de copiar, distribuir o modificar este documento en los trminos de la licencia GNU Free Documentation License , Versin 1.2 o cualquier versin posterior publicada por la Free Software Foundation. Una copia de esta licencia esta incluida en este material en la seccin titulada GNU Free Documentation License Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (http://www.gnu.org/licenses/fdl.txt) , Version 1.2 or any later version published by the Free Software Foundation. A copy of this license is included in this material in the section titled GNU Free Documentation License.

Contenido

Introduccin Seccin I Instalacin del software Instalacin bajo Microsoft Windows Configuracin del entorno en Microsoft Windows Instalacin bajo Linux Configuracin del entorno bajo Linux Seccin II Algoritmos Enumeraciones Recursividad Tablas de verdad con operadores lgicos Arreglos y Matrices Pilas rboles Binarios Trabajo con caracteres Seccin III Temas prcticos Threads (hilos) Lectura y escritura de archivos Utilizando el conector .NET de MySQL Usando XML Usando GTK# Referencias

5 13 17 22

24 26 27 28 31 33 36

39 40 42 46 47 50

Introduccin
Mono es la versin open source de la plataforma .NET de Microsoft, teniendo como herramienta principal el compilador de C# , el soporte para pginas ASP.NET bajo Linux y una serie de herramientas para desarrollar distintos tipos de programas de cmputo tal como aplicaciones grficas de escritorio, aplicaciones de consola y Formularios Web.

Este manual esta escrito para las personas que requieran aprender a programar, o aquellas personas que ya dominando un lenguaje de programacin y deseen utilizar sus conocimientos con las herramientas de Mono y el lenguaje de programacin C#. Esperando que este material sea una gua rpida de introduccin y aprendizaje al lenguaje y a las herramientas de .NET y mono, a partir de definiciones y ejemplos.

Si tiene algn comentario respecto a este material, por favor escriba a:

xomalli@gmail.com

1.0 Instalacin del software


1.1 Instalacin bajo Microsoft Windows

Vaya a la pgina del software mono http://www.go-mono.com y descargue el instalador para Microsoft Windows.

Pgina de descargas del software de instalacin

Cree una carpeta en su sistema de archivos llamado por ejemplo [instalador_mono] y descargue ah el ejecutable de instalacin.

Teniendo el ejecutable de instalacin en el disco duro, haga doble clic o bien seleccione y pulse el botn [ enter ] para ejecutar el programa. Al ejecutarse se vera la pantalla de bienvenida de Mono.

Al pulsar el botn [ Next ] (siguiente) se ira a la pantalla acerca del la licencia del software, es recomendable darle una lectura a la licencia para estar enterados de cual son los derechos y limitantes del software. Una vez que estemos de acuerdo con la licencia del programa, seleccionamos la opcin [ I accept the agreement ] (yo acepto el contrato), pulsamos el botn [ Next ] (siguiente) para continuar con la siguiente pantalla.

Al pulsar el botn [ Next ] (siguiente) se vera la pantalla, sobre las notas de Mono

La siguiente pantalla nos muestra la ruta de instalacin predeterminada, si se necesita instalarse en otro lugar podemos cambiar la ruta en el cuadro de texto o bien pulsar el botn [browse] para poder seleccionar la ruta de instalacin, seleccionada la ruta pulsamos el botn [ Next ] (siguiente) para pasar a la siguiente pantalla.

Las siguientes pantallas muestran los tipos de instalacin, como opcin predeterminada [Full installation] (opcin completa) nos instalar todo el software,

[compact installation] nos instalar el soporte mnimo para el lenguaje, opciones como las bibliotecas grficas, la documentacin y los ejemplos no sern instalados.

[Custom installation] nos permite agregar o quitar componentes, excepto los archivos de la instalacin mnima.

La siguiente pantalla pregunta si necesitamos un acceso directo en el men de programas.

10

La siguiente pantalla pregunta el puerto del servidor XSP, XSP es un servidor web ligero que nos permite probar las pginas ASP.NET, antes de subirlas a un web de produccin como Apache o IIS. (Recomiendo usar el puerto predeterminado)

Listo para instalar, para cambiar una opcin pulsamos el botn [ Back ] (regresar).

11

Copia de los archivos en el disco duro.

Pantalla final de la instalacin.

12

1.2 Configuracin del entorno en Microsoft Windows


Mono tiene un submen hacia una ventana de MS-DOS con el entorno configurado para poder usar el compilador, el intrprete y las herramientas.

Si necesitamos que las herramientas y el entorno de programacin queden configurados de manera permanente en nuestro sistema, debemos seguir los pasos siguientes. 1-. Ir al icono de mi PC, hacer clic con el botn secundario del ratn y el submen elegir la opcin de [propiedades].

13

2-. Vaya a la pestaa [ avanzado ] y presione el botn [ variables de entorno ]

3-. En la ventana [variables de entorno], en la parte superior seleccione la variable [path] y presione el botn [editar].

14

4-. Se abrir la ventana donde podremos modificar la variable [path] en nuestro entorno.

5-. Buscamos la carpeta de instalacin del software, y abrimos la carpeta [bin] donde se encuentran las herramientas de programacin del software.

6-. Una vez teniendo la ruta completa de la carpeta de instalacin del software mas la carpeta [bin], editamos el valor de la variable [path] colocando ; (punto y coma) al final del valor y agregamos la ruta de la carpeta [bin] de nuestro software.

15

7-. Cerramos todas las ventanas abiertas presionando el botn [Aceptar], abrimos una ventana de MS-DOS y tecleamos el comando mono help. Si el comando fue ejecutado correctamente se vera la siguiente pantalla.

Ya tenemos nuestro entorno configurado y listo para trabajar con Mono.

16

1.3 Instalacin bajo Linux


Vaya al sitio de mono http://www.go-mono.com y descargue el instalador en su directorio $home. Abra la carpeta $home, ejecute el archivo seleccionndolo y haga doble clic.

O bien, abra una Terminal y ejecute el instalador con el siguiente comando.

17

Al ejecutar el instalador vera la pantalla de bienvenida del software.

Pulse el botn [Adelante] para ir a la pantalla, que pregunta acerca de la licencia.

18

Pulse el botn [Adelante] para avanzar en la instalacin, la siguiente pantalla preguntar acerca de la ruta de ubicacin del software, se recomienda aceptar la ruta predeterminada en el directorio $home para que el programa de instalacin pueda instalar un acceso directo en el escritorio.

En la siguiente pantalla se pregunta si el programa agrega modifica el archivo de configuracin del entorno, esto depende del nivel de conocimiento del usuario, recomiendo seleccionar [no] y hacer las modificaciones manualmente.

19

Ahora el software esta listo para instalarse, si desea algn cambio pulse el botn [Atrs].

Copia de los archivos de instalacin al disco duro.

20

Si el software se ha instalado correctamente, vera la siguiente pantalla.

Se vera el acceso directo a las herramientas de Mono en el escritorio.

21

1.4 Configuracin del entorno bajo Linux


Ejecute el acceso director de Mono en el escritorio.

Edite el archivo de configuracin, en SuSe Linux es el archivo .profile que se encuentra en el directorio $home (el archivo de configuracin puede variar segn su distribucin) agregue al final del archivo la lnea siguiente:
PATH=$PATH:[ruta completa de la carpeta [bin] de la carpeta de instalacin de Mono]

22

Guardamos el archivo de configuracin, salimos de nuestra sesin actual y si los cambios fueron hechos correctamente nos mostrara la siguiente pantalla, tecleando: mono --help

23

2.0 Algoritmos
2.1 Enumeraciones con C#
Un tipo de datos de enumeracin enum es usado para definir un conjunto de elementos constantes, este tipo de datos se usan para agrupar constantes y en programas de opcin mltiple. Las enumeraciones pueden ser de cualquier tipo de datos (integer, short, long) excepto el tipo de datos char.

Programa 2.1
Programa que demuestra el tipo de datos enum (Enumeracin) para el conjunto de das de la semana.
using System; class Enumeracion { enum DiasSemana { Lunes = 1, Martes = 2, Miercoles = 3, Jueves = 4, Viernes = 5, Sabado = 6, Domingo = 7 } static int Main(string[] args) { Console.WriteLine(ImprimeDia(DiasSemana.Martes)); Console.WriteLine(ImprimeDia(DiasSemana.Sabado)); return 0; } static string ImprimeDia(DiasSemana ds) { string s = " "; switch(ds) { case DiasSemana.Lunes: s = "Tengo que levantarme temprano"; break; case DiasSemana.Martes: s = "Aun no me recupero"; break; case DiasSemana.Miercoles: s = "Faltan 2 dias"; break; case DiasSemana.Jueves: s = "Falta un dia solamente"; break; case DiasSemana.Viernes: s = "Por fin es viernes";

24

break; case DiasSemana.Sabado: s = "Es el mejor dia de la semana"; break; case DiasSemana.Domingo: s = "Ya maana es Lunes de nuevo"; break; } return s; } }

Teclee el archivo en un editor de texto ASCII, y gurdelo con el nombre enumeracion.cs Abra una ventana de MS-DOS o de Terminal y complelo con el comando:
$ mcs enumeracion.cs

Si la compilacin tuvo errores corrjalos y ejecute de nuevo la compilacin, si tuvo xito entonces se genero el archivo: enumeracin.exe. Ejecute ahora programa ejecutable con el intrprete:
$ mono enumeracin.exe

2.2 Recursividad
La recursin es una tcnica de programacin implementada mediante un mtodo que ya sea por iteracin o por decisin resuelve un problema hasta llegar a un caso base, un mtodo recursivo es un mtodo que se llama as mismo ya sea directamente o indirectamente a travs de otro mtodo. Los enfoques recursivos para resolver problemas tienen varios elementos en comn. El mtodo en si sabe como resolver el o los casos ms sencillos los llamados casos base.

Programa 2.2
Los nmeros de fibonacci y factorial para mostrar las funciones recursivas.
using System; using System.IO; public class Recursividad { static int Main() { int num = 0; string snum; do {

25

Console.Write("Teclee un numero [ MAX 33 ]: "); snum = Console.ReadLine(); } while(!esNumero(snum) || Int32.Parse(snum) > 33); num = Int32.Parse(snum); Console.WriteLine("El factorial de {0} es {1}",num,factorial(num)); Console.WriteLine("El fibonacci de {0} es {1}",num,fibonacci(num)); return 0; } static bool esNumero(string s) { if(s.IndexOf("1") != -1 || s.IndexOf("2") != -1 || s.IndexOf("3") != -1 || s.IndexOf("4") != -1 || s.IndexOf("5") != -1 || s.IndexOf("6") != -1 || s.IndexOf("7") != -1 || s.IndexOf("8") != -1 || s.IndexOf("9") != -1 || s.IndexOf("0") != -1) return true; else return false; } static long factorial(int n) { if(n <= 1) return 1; else return n * factorial(n - 1); } static long fibonacci(int n) { if(n == 0 || n == 1) return n; else return fibonacci(n - 1) + fibonacci(n - 2); } }

Complelo usando el comando:


$ mcs Recursividad.cs

Ejecutelo:
$ mono Recursividad.exe

26

2.3 Tablas de verdad con operadores lgicos


Una tabla de verdad sirve para mostrar los resultados posibles de una operacin lgica.

Programa 2.3
Tablas de verdad con los operadores lgicos de C#
using System; public class TablaT { static int Main(string[] args) { Console.WriteLine("logico (&&)"); Console.WriteLine("F && F: " + (false && false)); Console.WriteLine("F && T: " + (false && true)); Console.WriteLine("T && F: " + (true && false)); Console.WriteLine("T && T: " + (true && true)); Console.WriteLine(""); Console.WriteLine("OR logico (||)"); Console.WriteLine("F && F: " + (false || false)); Console.WriteLine("F && T: " + (false || true)); Console.WriteLine("T && F: " + (true || false)); Console.WriteLine("T && T: " + (true || true)); Console.WriteLine(""); Console.WriteLine("AND logico booleano (&)"); Console.WriteLine("F & F: " + (0 & 0)); Console.WriteLine("F & T: " + (0 & 1)); Console.WriteLine("T & F: " + (1 & 0)); Console.WriteLine("T & T: " + (1 & 1)); Console.WriteLine(""); Console.WriteLine("OR inclusivo logico booleano (|)"); Console.WriteLine("F | F: " + (0 | 0)); Console.WriteLine("F | T: " + (0 | 1)); Console.WriteLine("T | F: " + (1 | 0)); Console.WriteLine("T | T: " + (1 | 1)); Console.WriteLine(""); Console.WriteLine("OR exclusivo logico booleano (^)"); Console.WriteLine("F ^ F: " + (0 ^ 0)); Console.WriteLine("F ^ T: " + (0 ^ 1)); Console.WriteLine("T ^ F: " + (1 ^ 0)); Console.WriteLine("T ^ T: " + (1 ^ 1)); Console.WriteLine(""); Console.WriteLine("NOT logico booleano (!)"); Console.WriteLine("!F: " + (!false)); Console.WriteLine("!T: " + (!true)); Console.WriteLine(""); return 0; } }

27

Compilelo:
$ mcs TablaT.cs

Ejectelo:
$ mono TablaT.exe

2.4 Arreglos y Matrices


Un arreglo es un grupo de posiciones de memoria contiguas, todas las cuales tienen el mismo nombre y el mismo tipo. Para referirnos a una posicin o elemento en particular del arreglo, especificamos el nombre del arreglo y el nmero de posicin de ese elemento en el arreglo. Un arreglo multidimensional es un arreglo de 2 o ms dimensiones, .la primera dimensin son las filas y la segunda dimensin son las columnas.

Programa 2.4
Un programa que suma 2 matrices.
using System; public class Matrices { static int Main() { string sfilas = " ",scolumnas = " ",valor = " "; int filas = 0,columnas = 0,numero = 0,temp = 0,i = 0,j = 0; Console.WriteLine(""); Console.WriteLine("|--------------------------------------------------------------------------|"); Console.WriteLine("| La suma dos matrices se establece solo si las matrices a sumar son de la |"); Console.WriteLine("| misma dimension, teclee las dimensiones de la matriz 1 y el valor de los |"); Console.WriteLine("| elementos, para la matrix 2 solo se le pedira el valor de los elementos. |"); Console.WriteLine("| |"); Console.WriteLine("| Suma = matrix1[i][j] + matrix2[i][j] |"); Console.WriteLine("| |"); Console.WriteLine("| Donde matrix1[i] = matrix2[i] y matrix1[j] = matrix2[j] |"); Console.WriteLine("| |");

28

Console.WriteLine("|--------------------------------------------------------------------------|"); Console.WriteLine("Creacion de la matrix 1"); do { Console.Write("Teclee numero de filas: [MAX 16]: "); sfilas = Console.ReadLine(); } while(!esNumero(sfilas) || Int32.Parse(sfilas) > 16); //aqui obtengo las filas de la primera matrix filas = Int32.Parse(sfilas); Console.WriteLine("Filas [" + filas + "]"); do { Console.Write("Teclee numero de columnas: [MAX 16]: "); scolumnas = Console.ReadLine(); } while(!esNumero(scolumnas) || Int32.Parse(scolumnas) > 16); //aqui obtengo las columnas de la primera matriz columnas = Int32.Parse(scolumnas); Console.WriteLine("Columnas [" + columnas + "]"); Console.WriteLine("Matrix1 = [" + filas + "][" + columnas + "]"); //aqui creo un arreglo bidemensional para la primera matriz int[,] matrix = new int[filas,columnas]; //en el siguiente ciclo recorro la matrix bidemensional //primero recorro las filas for (i = 0; i < filas; i++) { //aqui recorro las columnas for (j = 0; j < columnas;j++) { do { Console.Write("Teclee el valor del elemento: [" + i +"]" + "["+ j + "] = "); valor = Console.ReadLine(); } while(!esNumero(valor)); //aqui obtengo el valor //el metodo console.Readline regresa un string por eso hago un casting //usando el metodo Int32.parse(string) numero = Int32.Parse(valor); temp = numero; //aqui asigno el valor al arreglo bidimensional matrix[i,j] = temp; } // fin del ciclo j } // fin del ciclo i Console.WriteLine("*********Matrix 1 generada.**********"); Console.WriteLine("de la matrix 2"); Console.WriteLine("Matrix2 = [" + filas + "][" + columnas + "]"); //aqui creo la segunda matrix bidemensional int[,] matrix2 = new int[filas,columnas]; //en el siguiente ciclo recorro la matrix bidemensional //primero recorro las filas for (i = 0; i < filas; i++) { //aqui recorro las columnas

29

for (j = 0; j < columnas;j++) { do { Console.Write("Teclee el valor del elemento: [" + i +"]" + "["+ j + "] = "); valor = Console.ReadLine(); } while(!esNumero(valor)); //aqui obtengo el valor //el metodo console.Readline regresa un string por eso hago un casting //usando el metodo Int32.parse(string) numero = Int32.Parse(valor); temp = numero; matrix2[i,j] = temp; } // fin del ciclo j } // fin del ciclo i Console.WriteLine("*********Matrix 2 generada.**********"); Console.WriteLine("matrix resultado es: "); //aqui recorro la matrix bideimensional resultado int[,] matrixresultado = new int[filas,columnas]; for (i = 0; i < filas; i++) { for (j = 0; j < columnas;j++) { matrixresultado[i,j] = matrix[i,j] + matrix2[i,j]; } } //@ aqui se imprime el resultado for (i = 0; i < filas; i++) { for (j = 0; j < columnas;j++) { Console.Write("Matrix Resultado = [" + i + "," + j + "]" + " , valor = " + matrixresultado[i,j] + ""); } } return 0; } //usando este metodo compruebo que solo sea //una cadena con nmeros, sin letras ni smbolos static bool esNumero(string s) { if(s.IndexOf("1") != -1 || s.IndexOf("2") != -1 || s.IndexOf("3") != -1 || s.IndexOf("4") != -1 || s.IndexOf("5") != -1 || s.IndexOf("6") != -1 || s.IndexOf("7") != -1 || s.IndexOf("8") != -1 || s.IndexOf("9") != -1 || s.IndexOf("0") != -1)

30

return true; else return false; } } //fin de la clase

Compilelo:
$ mcs Matrices.cs

Ejecutelo:
$mono Matrices.exe

2.5 Pilas
Una pila es una versin restringida de una lista enlazada: los nodos nuevos solo pueden agregarse a la pila y retirarse de la pila en el tope, por eso la pila es LIFO (last-in,first-out) es decir el ltimo en entrar es el primero en salir. Las pilas apoyan las llamadas de mtodos recursivas igual que lo hacen con las llamadas de mtodos convencionales no recursivas. Las pilas contiene el espacio creado para variables automticas en cada invocacin de un mtodo. Cuando el mtodo regresa a su invocador, el espacio para las variables automticas de ese mtodo se saca de la pila, y el programa deja de conocer dichas variables.

Programa 2.5
Programa de estructura de datos pila
using System; using System.Collections; public class Pila { static int Main(string[] args) { Stack pila = new Stack(); Boolean b = Boolean.Parse("true"); Char c = Char.Parse("c"); String s = "martin"; Int32 i = Int32.Parse("7890"); int a = 0; /*aqui ponemos los valores en la pila*/ pila.Push(b); pila.Push(c); pila.Push(s);

31

pila.Push(i); /*aqui vemos las propiedades de la pila*/ Console.WriteLine("La pila es LIFO(first in,last out)"); Console.WriteLine("Num elementos: {0}",pila.Count); /*imprimimos los elementos*/ IEnumerator enums = pila.GetEnumerator(); a = 0; while(enums.MoveNext()) { Console.Write("|{0}|>{1}",a++,enums.Current.ToString()); } Console.WriteLine("Sacar elemento: pop()"); pila.Pop(); /*imprimimos los elementos*/ enums = pila.GetEnumerator(); a = 0; while(enums.MoveNext()) { Console.Write("|{0}|>{1}",a++,enums.Current.ToString()); } Console.WriteLine("Sacar elemento: pop()"); pila.Pop(); /*imprimimos los elementos*/ enums = pila.GetEnumerator(); a = 0; while(enums.MoveNext()) { Console.Write("|{0}|>{1}",a++,enums.Current.ToString()); } Console.WriteLine("Num elementos: {0}",pila.Count); return 0; } }

Complelo:
$ mcs Pila.cs

Ejectelo:
$ mono Pila.exe

32

2.6 rboles Binarios


Un rbol es una estructura de datos no lineal, bidimensional, con propiedades especiales. Los nodos de un rbol contienen 2 ms enlaces. En los rboles binarios todos los nodos contienen 2 enlaces (de los cuales ninguno, uno o ambos pueden ser null). El nodo raz es el primer nodo de un rbol. Cada enlace del nodo raz hace referencia a un hijo. El hijo izquierdo es el primer nodo del subrbol izquierdo, y el hijo derecho es el primer nodo del subrbol derecho. Los hijos de un nodo se denominan hermanos. Un nodo sin hijos es un nodo hoja. La representacin grfica de los rboles es de la raz hacia abajo al revs de los rboles de la naturaleza.

Programa 2.6
Este programa se compone de 3 clases la primera clase es el nodo del rbol.
using System; public class NodoArbol{ public NodoArbol izquierda,derecha; public int data; public NodoArbol(int d){ data = d; izquierda = derecha = null; //este nodo no tiene hijos } public void insertar(int d){ if(d < data){ if(izquierda == null) izquierda = new NodoArbol(d); else izquierda.insertar(d); } else if(d > data){ if(derecha == null) derecha = new NodoArbol(d); else derecha.insertar(d); } } }

Lo compilamos como biblioteca


$ mcs /t:library NodoArbol.cs

33

La segunda es la clase Arbol que implementa la clase NodoArbol


using System; public class Arbol{ private NodoArbol raiz; public Arbol(){ raiz = null; } public void insertarNodo(int d){ if(raiz == null) raiz = new NodoArbol(d); else raiz.insertar(d); } public void preOrdenTrasversal(){ preOrden(raiz); } private void preOrden(NodoArbol nodo){ if(nodo == null) return ; Console.Write(nodo.data + " "); preOrden(nodo.izquierda); preOrden(nodo.derecha); } public void enOrdenTransversal(){ enOrden(raiz); } private void enOrden(NodoArbol nodo){ if(nodo == null) return ; enOrden(nodo.izquierda); Console.Write(nodo.data + " "); enOrden(nodo.derecha); } public void postOrdenTransversal(){ postOrden(raiz); } private void postOrden(NodoArbol nodo){ if(nodo == null) return ; postOrden(nodo.izquierda); postOrden(nodo.derecha); Console.Write(nodo.data + " "); } }

Igualmente lo compilamos como una biblioteca:


$ mcs r:NodoArbol.dll /t:library Arbol.cs

34

Finalmente el programa de un rbol binario que realiza recorridos en: pre-orden, orden y en post-orden.
using System;

public class BuscarEnArbol { public static int Main(string[] args) { Arbol arbol = new Arbol(); string valor; int longitud; string slongitud; int numero; Console.WriteLine("Tecle el nmero de valores que desea introducir en el arbol: "); do { Console.Write("Teclee numero de filas: [MAX 33]: "); slongitud = Console.ReadLine(); } while(!esNumero(slongitud) || Int32.Parse(slongitud) > 33); longitud = Int32.Parse(slongitud); Console.WriteLine("Total de valores [" + longitud + "]"); int[] matrix = new int[longitud]; //aqui ponemos los valores en el arbol Console.WriteLine("Teclee los valores: "); for(int i = 0;i < matrix.Length;i++) { do { Console.Write("Teclee el valor del elemento: [" + i +"]: "); valor = Console.ReadLine(); } while(!esNumero(valor)); numero = Int32.Parse(valor); matrix[i] = numero; } //aqui se insertan los valores de la matrix en el arbol for(int i = 0;i < matrix.Length;i++) { arbol.insertarNodo(matrix[i]); } Console.WriteLine("Elija su tipo de recorrido"); Console.WriteLine(" a) preorden"); Console.WriteLine(" b) enorden"); Console.WriteLine(" c) postorden"); Console.Write("Su opcion:"); char opcion = (char)Console.Read(); switch(opcion) { case 'a': Console.WriteLine(""); arbol.preOrdenTrasversal(); break; case 'b': Console.WriteLine(""); arbol.enOrdenTransversal(); break; case 'c':

35

Console.WriteLine(""); arbol.postOrdenTransversal(); break; default: Console.WriteLine(""); Console.WriteLine("No existe esa opcin"); break; } return 0; } //usando este metodo compruebo que solo sea //una cadena con nmeros, sin letras ni simbolos static bool esNumero(string s) { if(s.IndexOf("1") != -1 || s.IndexOf("2") != -1 || s.IndexOf("3") != -1 || s.IndexOf("4") != -1 || s.IndexOf("5") != -1 || s.IndexOf("6") != -1 || s.IndexOf("7") != -1 || s.IndexOf("8") != -1 || s.IndexOf("9") != -1 || s.IndexOf("0") != -1) return true; else return false; } }

Lo compilamos junto con las 2 clases anteriores:


$ mcs r:NodoArbol.dll ,Arbol.dll BuscarEnArbol.cs

2.7 Trabajo con caracteres


Una de las caractersticas fundamentales de cualquier lenguaje de programacin es el trabajo con caracteres, todo programa fuente o archivo de texto se compone de una secuencia de caracteres que son interpretados por la computadora para poder trabajar con ellos en cadenas o arreglos de caracteres.

Programa 2.7
El programa que muestra los mtodos ms usuales para convertir cadenas en arreglos de caracteres y viceversa. 36

using System; using System.IO; using System.Text; public class CFrecuencia { public static int Main(string[] args) { //esta clase me proporciona un vectos de caracteres o de cadenas StringBuilder buf = new StringBuilder(); //aqui defino mi universo de solo caracteres char[] alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); try { if(args.Length == 1) { try { string s = ""; //aqui uso la clase StreamReader para leer un archivo StreamReader sr = new StreamReader(args[0]); while((s = sr.ReadLine()) != null) { buf.Append(s.ToUpper()); } //aqui uso el metodo ToCharArray() para convertir una cadena a un // arreglo de caracteres char[] miarreglo = buf.ToString().ToCharArray(); for(int j = 0;j < alfabeto.Length;j++) { int contador = 0; for(int i = 0;i < miarreglo.Length;i++) { if(alfabeto[j] == miarreglo[i]) contador++; } if(contador > 0) Console.WriteLine(alfabeto[j] + " : " + contador); } } //aqui obtengo el error si no existe el archivo catch(FileNotFoundException e) { Console.WriteLine(args[0] + ": archivo no encontrado " + e.Message); } } else { Console.WriteLine("Usar: mono CFrecuencia.exe [archivo de texto]"); } } //aqui obtengo el error si no hay un argumento para el programa catch(IndexOutOfRangeException e) { Console.WriteLine("Usar: mono CFrecuencia.exe [archivo de texto]" + e.Message);

37

} return 0; } } //fin de la clase

Complelo:
$ mcs CFrecuencia.cs

Ejectelo:
$ mono CFrecuencia.exe [archivo de texto]

38

3.0 Temas prcticos


3.1 Threads (hilos)
Todos los sistemas operativos modernos permiten hacen uso de la concurrencia para hacer varias operaciones de manera simultnea o en paralelo, una manera actual de realizar la concurrencia es con el concepto de: Threads (hilos) Un thread es un proceso ligero o un subproceso que tiene un simple flujo de control secuencial, el programa principal siempre tiene un simple flujo de control. Los mtodos comnmente utilizados por los hilos son: Start(): Inicia la ejecucin de un hilo. Interrupt(): Interrumpe la ejecucin de un hilo Sleep(): se invoca con un argumento que invoca cuanto tiempo el hilo que se esta ejecutando debe de dormir (en segundos). Resume(): reanuda la ejecucin de un hilo suspendido

Programa 3.1
using System; using System.Threading; public class HiloSimple { static int Main() { Console.WriteLine("Preciose Ctrl+C para detener"); Thread h1 = new Thread(new ThreadStart(kde)); Thread h2 = new Thread(new ThreadStart(gnome)); h1.Start(); h2.Start(); return 0; } static void kde() { for(int i = 0;i<= 100;i++) { Console.WriteLine("KDE esta muy bien programado -> [{0}]",Math.Log10(i)); Thread.Sleep(700); } }

39

static void gnome() { for(int i = 0;i<= 200;i++) { Console.WriteLine("Gnome es esteticamente funcional>[{0}]",Math.Pow(i,2)); Thread.Sleep(700); } } }

Complelo
$ mcs HiloSimple.cs

Ejectelo:
$ mono HiloSimple.exe

3.2 Lectura y escritura de archivos


La lectura y escritura de archivos se realiza por medio de streams (flujos), un stream es una abstraccin en la cual se encapsula las operaciones de entrada y salida, siendo una manera en la cual .NET es transportable a otros sistemas operativos e independientes del medio fsico donde se almacenen los datos. Cuando se la entrada de datos es una conexin de red eso se convierte en un flujo de datos, la lectura de un archivo en el disco duro es tambin un flujo de datos, la entrada del teclado tambin se encapsula en un flujo de datos y as cada operacin de entrada y salida. Los streams tienen las siguientes operaciones: Stream (read) leen datos y los convierten en una estructura de bytes. Streams (write) escriben convirtiendo una estructura de bytes en datos. Streams (Seek) pueden hacer bsquedas y modificaciones en la estructura de datos.

40

Programa 3.2
Convertir un archivo de texto a un archivo HTML
using using using using System; System.IO; System.Text; System.Diagnostics;

public class Txt2html { static int Main(string[] args) { StringBuilder buf = new StringBuilder(); StringBuilder buf2 = new StringBuilder(); try { if(args.Length > 0 && args.Length < 3) { if(args[0] != null && args[1] != null) { try { StreamReader reader = new StreamReader(args[0]); string s = ""; while ((s = reader.ReadLine()) != null) { buf.Append(s); } reader.Close(); buf2.Append("<html>"); buf2.Append("<head>"); buf2.Append("<title>" + args[0] + "</title>"); buf2.Append("<body>"); buf2.Append("<table width=100%><tr><td>"); buf2.Append("<p align=justify>"); buf2.Append("<font face=arial,helvetica size=2>"); char[] c = buf.ToString().ToCharArray(); for(int i = 0;i < buf.ToString().Length;i++) { if(c[i] == ' ') buf2.Append("<br>"); else buf2.Append(c[i]); } buf2.Append("</font></p>"); buf2.Append("</td></tr></table>"); buf2.Append("</body>"); buf2.Append("</html>"); StreamWriter sw = new StreamWriter(args[1] + sw.WriteLine(buf2.ToString()); sw.Close(); Console.WriteLine(args[1] + " Archivo creado");

".html");

41

} catch(FileNotFoundException e) { Console.WriteLine("El archivo " + args[0] + " no existe " + e.Message); } } else ayuda(); } else { ayuda(); } } catch(IndexOutOfRangeException e) { ayuda(); Debug.WriteLine(e.Message); } return 0; } static void ayuda() { Console.WriteLine("Usar: mono txt2html.exe [ archivo de texto ][ archivo html ]"); } }

Complelo:
$mcs txt2html.cs

Ejectelo:
$ mono txt2html [archivo de texto] [archivo de salida]

3.3 Utilizando el conector .NET de MySQL

Una base de datos es un conjunto de programas que dan mantenimiento de manera ordenada y consistente a la informacin, estos sistemas esconden los detalles de cmo se almacenan y se administran los datos, aun as lo datos deben de poder extraerse eficientemente, esto ha llevado a crear unas estructuras complejas para la representacin de los datos y a unos niveles de abstraccin para simplificar al usuario la interaccin con el 42

sistema. Nivel fsico: El nivel ms bajo de la abstraccin describe como se almacenan realmente los datos. Nivel conceptual: describe que datos son realmente almacenados en la base de datos y la relacin que existen entre los datos. Nivel de visin: El nivel ms alto de la abstraccin describe la parte ms compleja, aqu se usan las estructuras ms sencillas en el nivel conceptual. Descargar e instalar el software MySQL del sitio: http://www.mysql.com

Descargue el conector .NET de MySQL para poder conectarse con la base de datos de la siguiente direccin: http://dev.mysql.com/downloads/connector/net/1.0.html. La pgina de de descarga ofrece los archivos binarios para Windows, esto no es problema para usuarios de Linux, ya que los binarios de .NET de Windows son soportados por Mono.

43

La archivo que contiene las clases necesarias de conexin para trabajar con MySQL es el archivo MySql.Data.dll el cual usaremos para compilar el programa siguiente:

Programa 3.3
using System; using MySql.Data.MySqlClient;

public class ClienteMySQL { public static int Main(string[] args) { string ConStr = "Falta cadena de conexion"; string sql = "Falta Enunciado SQL"; if(args.Length > 0) { ConStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false", args[0], args[1], args[2],args[3]); sql = args[4]; SQLAnali(ConStr,sql); } else Console.WriteLine("insuficientes, usar: ClienteMySQL.exe [server] [user id] [password] [database] [consulta SQL]" ); return 0; }

44

static void SQLAnali(string chainConn,string consultSQL) { Console.WriteLine(chainConn); MySqlConnection conn = new MySqlConnection( chainConn ); int columnas = 0; //if(consultSQL.StartsWith("SELECT") || consultSQL.StartsWith("select") || consultSQL.StartsWith("Select")) //{ try { conn.Open(); MySqlCommand cmd = new MySqlCommand(consultSQL, conn); MySqlDataReader dr = cmd.ExecuteReader(); columnas = dr.FieldCount; while (dr.Read()) { for(int i = 0;i < columnas;i++) { Console.Write(dr[i].ToString() + ""); if((i + 1) == columnas) Console.Write(""); } } conn.Close(); } catch(MySqlException e) { conn.Close(); Console.WriteLine("No pude conectarme el error fue " + e.ToString()); } //} //else // Console.WriteLine("Solo puede utilizar la instruccion SELECT"); } }

* Antes de compilar, asegrese que [ MySql.Data.dll ] este en el directorio donde se encuentra el programa o en el Global cache con el comando: gacutil -i MySql.Data.dl] Complelo:
$ mcs r:MySql.Data ClienteMySQL.cs

Ejectelo:
$ mono ClienteMySQL,exe

45

3.4 Lectura de un XML


XML son las siglas de lenguaje de marcado extensible (Extensible Markup language) es un archivo de formato de texto simple derivado del SGML (ISO 8879). Originalmente diseado para las publicaciones electrnicas a gran escala, XML se ha vuelto indispensable para un intercambio de informacin a travs de Internet. XML es un lenguaje de descripcin de documentos, XML a diferencia de HTML permite definir sus propias etiquetas (tags), adems de que XML es un lenguaje estructural, XML es desde un principio un lenguaje orientado a la estructura de los datos y no al diseo y presentacin de estos.
<?xml version="1.0" encoding="ISO-8859-1"?> <Directorio> <contacto> <apepaterno>Perez</apepaterno> <apematerno>Suarez</apematerno> nombres>Edith</nombres> <telefonos>77-686-87</telefonos> email>edith@gmail.com</email> </contacto> <contacto> <apepaterno>Perez</apepaterno> <apematerno>Suarez</apematerno> <nombres>Edith</nombres> <telefonos>77-686-87</telefonos> <email>edith@gmail.com</email> </contacto> </Directorio>

Programa 3.4
Lectura de un archivo XML
using System; using System.Data; public class LeerXML { public static int Main(string[] args) { try { DataSet archivoXML = new DataSet(); archivoXML.ReadXml(args[0]); try

46

{ foreach(DataRow t in archivoXML.Tables[0].Rows) { Console.WriteLine(""); Console.WriteLine(t["apepaterno"]); Console.WriteLine(t["apematerno"]); Console.WriteLine(t["nombres"]); Console.WriteLine(t["telefonos"]); Console.WriteLine(t["email"]); Console.WriteLine(""); } } catch(Exception e) { Console.WriteLine(e.ToString()); } } catch(IndexOutOfRangeException e) { Console.WriteLine("Usar: mono LeerXML.exe [Archivo .xml] " + e.Message); } return 0; } }

Complelo:
$ mcs r System.Data

Ejectelo:
$ mono LeerXML

3.5 Usando GTK#


GTK# es la implementacin completa de la plataforma GTK usando el lenguaje C#, es uno de los ms completos toolkit de diseo grfico de aplicaciones, aunque en la plataforma .NET de Microsoft la implementacin natural es usar System.windows.forms , con mono es natural usar GTK#, adems de ser el ms completo de los toolkits grficos () que existen es de los ms transportables entre plataformas.

Programa 3.5
Un programa nslookup grfico usando GTK# 47

using using using using

Gtk; System; System.Net; System.Text;

public class NSLookupGTK { /* Aqui pongo los componentes para la interfaz grafica*/ private static Window win = null; private static VBox vb = null; private static Entry txtentrada = null; private static Button baceptar = null; private static Entry txtresultados = null; static int Main(string[] args) { Application.Init();//aqui inicio la aplicacin win = new Window("Mono NSLookup"); vb = new VBox(false,0); txtentrada = new Entry(); baceptar = new Button("Aceptar"); txtresultados = new Entry(); //Aqui agrego los componentes vb.PackStart(txtentrada,false,false,0); txtentrada.Show(); vb.PackStart(baceptar,false,false,0); baceptar.Show(); vb.PackStart(txtresultados,false,false,0); txtresultados.Show(); win.Add(vb); vb.Show(); win.Resize(300,200); win.Show(); //---------------------//aqui registro los eventos win.DeleteEvent += delete_event; baceptar.Clicked += new EventHandler(aceptar); Application.Run(); return 0; } static void aceptar(object o,EventArgs args) { if(txtentrada.Text.Length > 0) { txtresultados.Text = rIP(txtentrada.Text); } } static void delete_event(object sender,DeleteEventArgs e) { Application.Quit(); Console.WriteLine("Aplicacion Cerrada"); } static string rIP(string host) { StringBuilder buf = new StringBuilder();

48

try { IPHostEntry ip = Dns.GetHostByName(host); IPAddress[] direccion = ip.AddressList; for(int i = 0;i < direccion.Length;i++) { buf.Append(direccion[i].ToString()); } return buf.ToString(); } catch(System.Net.Sockets.SocketException se) { return "No se halla la direcion " + se.Message; } } }

Complelo:
$ mcs /t:winexe pkg:gtk-sharp NSLookupGTK.cs

Como es una aplicacin grfica debe de compilarse con la opcin /t:winexe esto para evitar que aparezca la ventana de Terminal al momento de ejecutarse en un sistema grfico. Ejectelo:
$ mono NSLookupGTK.exe

49

Referencias

Pgina del proyecto mono: http://www.go-mono.com Titulo: Como programar en Java Autores: Deitel & Deitel Editorial: Prentice Hall Titulo: C# in a Nutshell, Second Edition Autores: Peter Drayton, Ben Albahari, Ted Neward Editorial: O'Reilly Titulo: Mono: A Developer's Notebook Autores: Edd Dumbill, Niel M. Bornstein Editorial: O'Reilly

50

También podría gustarte