Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplos de C Mono
Ejemplos de C Mono
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.
xomalli@gmail.com
Vaya a la pgina del software mono http://www.go-mono.com y descargue el instalador para Microsoft Windows.
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.
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
12
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
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.
16
17
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].
20
21
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); } }
Ejecutelo:
$ mono Recursividad.exe
26
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
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
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
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); } } }
33
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; } }
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
Complelo:
$ mcs CFrecuencia.cs
Ejectelo:
$ mono CFrecuencia.exe [archivo de texto]
38
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
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]
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
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
Programa 3.5
Un programa nslookup grfico usando GTK# 47
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