Curso “Procesamiento digital de imágenes” Enfocado a: 6to. Semestre. Tema 1: Introducción a C#. Objetivos: Dar a conocer al alumno el lenguaje de programación C# enfocado a modo visual. Conceptos clave: C#: Lenguaje de programación diseñado por Microsoft en 2001 como parte de su plataforma .NET. Combina el lenguaje de bajo nivel de C y la velocidad de la programación de alto nivel de Visual Basic. Interfaz: El medio de comunicación entre el usuario y el sistema o dispositivo. Modo texto: Es una interfaz que carece de objetos (botones, cajas de dialogo, barras, etc.) la comunicación con el usuario se realiza mediante caracteres en pantalla. Modo gráfico: Es una interfaz que utiliza ventanas y objetos para la comunicación con el usuario, estas interfaces son llamadas comúnmente formularios. Librería: Es un archivo el cual contiene funciones definidas para ser utilizadas por el lenguaje, una función o estructura no puede ser utilizada si su librería no está definida. Variables: Son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Desarrollo: Definición de librerías. Definición y tipo de variables. Utilización de formas: Botones. Cajas de texto. PictureBox. Labels, etc. Etc. Función: una función es un tipo subalgoritmo, es el término para describir una secuencia de órdenes que hacen una tarea específica de una aplicación más grande. Práctica 1: Utilización de botones, labels y textboxes. Desarrollar una aplicación en C# la cual se muestre como el ejemplo a continuación. Ejercicios: a) El botón apellido al momento de ser presionado debe de poner el texto que se encuentre en el textbox en el label respectivo para el apellido. b) El botón Nombre al momento de ser presionado debe de poner el texto que se encuentre en el textbox en el label respectivo al nombre. Tema 2: Tipos de datos. Los tipos de datos se componen en c# en 3 tipos diferentes cada uno con subtipos según la dimensión o espacio en memoria reservado para cada uno de ellos, estos 3 tipos son: Variables para números enteros Son variables que comprenden números sin punto flotante, conocidos como decimales, la siguiente tabla muestra la definición y longitud de cada uno según el tipo, el alias o la librería utilizada para su implementación y los valores permitidos para cada tipo. En la explicación de la tabla anterior la definición de una variable de tipo sbyte solo permite que esta variable contenga un valor contenido entre -128 y 127, a su vez como una variable de tipo byte solo puede tomar valores entre 0 y 255. La definición de estas variables es: byte pixel, rojo, verde, azul; int edad, num; int resultado; long edo_cuenta; short[] monedero; etc. Variables para números decimales o flotantes Son variables que comprenden números con coma flotante o (como es lo mismo) números decimales, los tipos de datos especificados para coma flotante se muestran a continuación. La tabla anterior muestra el tipo de dato, el alias o librería utilizada, el mínimo y máximo de bytes utilizados para memoria, el exponente máximo y mínimo y por último el valor mínimo y máximo utilizado para cada una de las variables. Variables de tipo carácter Son variables que almacenan caracteres y no datos utilizados como valores numéricos, es decir, letras (a,b,c,…), símbolos(-,!,*,…) o caracteres (@,#,$,…) a su vez estas variables pueden almacenar números, pero estos no serán tomados para realizar operaciones algebraicas, aritméticas o trigonométricas. Dicho de otra forma, no se puede realizar operaciones como suma, resta, multiplicación, división, exponenciación, etc. Con este tipo de variables. La siguiente tabla muestra los tipos de datos de tipo caracter y sus dimensiones. Variables de tipo char Son variables que almacenan caracteres de una dimensión especificada, la dimensión es especificada por el usuario a la hora de su definición, por ejemplo: char nombre; Almacena en la variable nombre solo un carácter, esto es que si le es ingresado el texto “Juan” a la variable solo será asignada la letra J. char[] nombre = new char[20]; Almacena en la variable nombre hasta 20 caracteres de una cadena de texto, en dado caso de ingresar una cadena con una longitud inferior los demás valores serán asignados a nulo. Varibales de tipo bool Las variables de tipo bool son variables de tipo booleano, esto es, que solo pueden contener un valor verdadero en este caso “true” o un valor falso… “false”, estas variables en general son utilizadas como banderas o valores que nos indican el resultado de una prueba lógica. Variables de tipo string Las variables de tipo string almacenan (al igual que las variables de tipo char) una secuencia de caracteres, pero estas no requieren la especificación de una longitud, por ejemplo: String nombre; Esta variable puede contener un nombre como “J” o “Juan Martin Romo”, la longitud de caracteres para esta variable es indefinida. Práctica 2: Utilización de variables. Elaborar un programa que permita ingresar Nombre, edad, sexo, teléfono, código postal y muestre en un textbox la información ingresada por el usuario en forma de resumen. Es importante crear cada variable según la dimensión, en el caso de edad, lo más conveniente sería definir la variable como sbyte. sbyte edad; Tema 3: Operadores matemáticos. En programación, existen 5 tipos de operadores matemáticos simples, pero, dos de ellos pueden ser usados para incrementación o decrementación de una misma variable, la siguiente tabla muestra dichos operadores matemáticos simples: La categoría binaria muestra que la operación debe ser realizada entre dos variables, en el caso de la multiplicación esto indica que en la variable 1 se asigna el resultado de la multiplicación entre la variable 2 y la variable 3. Dos casos muy particulares de estos operadores matemáticos simples son la suma y la resta ya que pertenecen a dos categorías, la primera como ya se mencionó, es binaria lo cual indica que se realiza entre dos variables; La segunda categoría es unitaria, esto indica que la operación puede ser realizada con una sola variable, para especificar esto daremos un ejemplo: Para el caso var1=+var2, dicha operación indica que la variable var1 toma el valor positivo de la variable var2, en el caso var1 = -var2, la variable var1 toma el valor de la variable var2 multiplicada por -1, esto es que si var2 originalmente tenía el valor de 5, la variable var1 tomará el valor de -5. Otro tipo de operadores existentes son los operadores compuestos, estos operadores se muestran en la siguiente tabla: Estos operadores incrementan o decrementan en valor de una variable, todos ellos son unitarios, esto es que se efectúan únicamente en el trabajo con una variable. El primer ejemplo var1= ++var2; suponiendo que var1=5 y var2=10, var1 toma como nuevo valor 11; esto es que el operador ++ incrementa en uno el valor de var2 el cual vale 10, en ese momento se realiza la asignación dándole como nuevo valor el 11 a la variable var2. Este mismo resultado sería obtenido con el operador --, pero, en este caso decrementando en uno el valor de la segunda variable. En el segundo caso var1 = var2++; la variable var1 tomaría el valor de 10, pero la variable var2 se incrementaría a 11 tal como en el ejemplo anterior. Esto se debe a que cuando se realiza la asignación la variable dos no ha sido incrementada, esto es porque el operador se encuentra a la derecha de la variable y no a la izquierda como en el caso anterior. Operadores de asignación Los operadores de asignación son utilizados para asignarle un dato a una variable e incluso para agregar un valor especificado a una variable, estos tipos de operadores son unitarios, esto es, que pueden ser utilizados con una sola variable. La siguiente tabla muestra los tipos de operadores de asignación: En el primer caso, el valor de la variable var2 es tomado por la variable var1; Para el segundo caso la instrucción es diferente. Supongamos que tenemos una variable a con un valor de 7 y una variable b con un valor de 10, al realizar la siguiente asignación: a+=b; La variable a que originalmente tenía un valor de 7 ahora toma el valor de 17, esto es porque la variable a agrega a su valor lo que tiene la variable b, dicha operación obtiene el mismo resultado que: a = a+b; lo cual sería a=7+10. Esta operación se aplica para los casos siguientes cada uno efectuando su operación pertinente. Tema 4: Control de flujo Todos los códigos en C# tienten algo muy particular en común. En cada caso el programa de ejecución comienza a ejecutar las instrucciones desde el inicio del programa hasta el fondo línea por línea sin perder ninguna. Si todas las aplicaciones trabajaran así, entonces se estaría muy limitado en que se puede realizar con un programa. En este tema se habla acerca de dos métodos para controlar un control de flujo de un programa, esto es, el orden de ejecución de las líneas de código en C#: Branching1.- Ejecuta código condicional, dependiendo del resultado de una evaluación, como es “solo se ejecuta este código si la variable var1 es menor que 10”. Looping2.- Repetidamente ejecuta las mismas instrucciones hasta que una condición se cumpla. Ambas instrucciones incluyen la lógica booleana, como lo vimos anteriormente una variable booleana es aquella que toma valores “true” o “false”, a su vez, una condición devuelve un valor booleano. Las comparaciones booleanas requieren el uso de operadores booleanos de comparación, esto, aunque se escuche complejo, es simplemente la evaluación de similitud, diferenciación, valor superior, valor inferior, etc. Cada uno de estos operadores se muestran en la siguiente tabla. En todos los casos, la variable var1 es una variable de tipo booleano, y las variables var2 y var3 pueden ser cualquier tipo de variable, ya sea int, string, char, float, etc. Pero estas deben ser ambas del mismo tipo. Simplificando lo anterior, la variable var1 guardará verdadero o falso según lo que de cómo resultado la evaluación. 1 Separar cierto grupo de instrucciones del código del programa para ser ejecutadas solo si es requerido. 2 Agrupar un conjunto de instrucciones que se ejecutan hasta que una condición es o no es cumplida. El operador == sirve para verificar si una variable es igual a otra o si una variable es igual a un valor, en el caso: Nombre == “Juanito” Se pregunta si el valor que tiene en ese momento la variable Nombre es en este caso Juanito. Si vemos en ejemplo de la tabla si la variable var2 es igual a lo que tiene la variable var3 entonces la variable var1 (que es de tipo booleana) guarda como valor “true” si no es así guarda como valor “false”. El operador != es llamado “diferente” el cual verifica si una variable es diferente a otra o a un valor especificado. En el caso de los operadores > (mayor que) o < (menor que) como ya es conocido, evalúan si una variable es mayor o menor a otra o a un valor especificado. Los operadores >= (mayor igual) y <= (menor igual) efectúan el mismo proceso que el mayor y menos que, solo que estos agregan a su rango que el valor sea igual a la variable que se está utilizando. Tema 5: Matrices. En programación, un vector, matriz, array, arreglo o alineación es un conjunto o agrupación de variables del mismo tipo cuyo acceso se realiza por índices, esto es, que una variable puede contener múltiples valores. Una variable al ser definida como int var1; contiene un único valor, pero esto puede cambiar si dicha variable es definida como matriz, esto es, que dicha variable como ya se mencionó tiene la facultad de guardar múltiples valores. Podemos definir una variable como: int [ ] var1 = new int [10]; Esto haría que la variable var1 pudiera contener múltiples valores, en este caso 10 ya que fue el número dado. Para ayudar a la comprensión de esto, veamos la variable var uno como un conjunto de espacios creados para guardar datos. Como vemos en la figura anterior, nuestra variable var1 contiene 10 espacios disponibles para almacenar sus datos, comenzando desde la posición 0 hasta la posición 9, lo que nos da los 10 valores disponibles. Como habíamos visto ya anteriormente para asignarle un valor a una variable se utilizaban los operadores de asignación, por ejemplo, si queremos asignarle un valor a la variable a definida como entero hacemos lo siguiente: a = 5; pero para agregar un valor a una matriz es necesario especificarle la posición de donde queremos almacenar un valor dado, por ejemplo: var1[0] = 3; var1[1]=10; con esto traduciendo la instrucción a nuestro lenguaje sería “el valor de la variable var1 en la posición 0 es 3”, “el valor de la variable var1 en la posición 1 es 10”; De esta forma asignamos valor a una matriz en determinada posición. Pero el trabajo con matrices no termina aquí, una matriz puede tener varias dimensiones, una dimensión es la cantidad de ejes disponibles para ingresar datos, en el caso de la matriz que hemos definido esta matriz es unidimensional ya que solo cuenta con 1 línea definida para datos. Para clarificar esto, crearemos una matriz bidimensional o de dos dimensiones y asignaremos valores los cuales representaremos con colores. String [,] matriz = new matriz[10,10]; con esta definición hemos creado a la variable matriz con 2 dimensiones, de 10 valores cada una. Gráficamente esto sería lo siguiente: Ahora, agregaremos a la matriz algunos valores, los cuales serán nombres de colores, para que con ello, sea fácil identificar en qué posición está siendo guardado cada uno de los valores. matriz[0,0] = “negro”; matriz[0,1] = “azul”; matriz[0,2] = “rojo”; como vemos, el valor derecho de la matriz hace que los campos vayan llenándose a la derecha, por lo cual diremos que “barre” la matriz hacia la derecha. Como puede suponerse el primer valor de la dimensión de la matriz hará que esta matriz se barra hacia la izquierda, ahora, cambiaremos los valores de la matriz modificando únicamente los valores de la izquierda para asignar los colores. matriz[1,0] = “amarillo”; matriz[2,0] = “verde”; matriz[3,0] = “morado”; Esto de asignación de valores a una matriz bidimensional nos puede recordar al juego de batalla naval o conocido de otra forma como submarinos, en donde se da una coordenada en el mapa para intentar mediante cañonazos hundir los barcos de nuestro enemigo. Existen también matrices de 3 o más dimensiones las cuales siguen dicha dinámica, pero estas no son contenido de esta asignatura. Tema 6: Estructura if. La estructura if es una forma versátil y bastamente aplicable para tomar decisiones dentro de un programa. Esta estructura recibe un parámetro, la cual se define como la condición, de esta condición depende la ejecución de un fragmento de código. El uso más simple de una estructura if es el siguiente, donde <la prueba> es evaluada, está compara valores de cualquier tipo pero regresa un valor booleano, como se vio anteriormente, “true” o “false”. Para comprender lo anterior, realizaremos el siguiente ejemplo: Si en español nosotros decimos “Si hay nubes negras entonces llueve”… en este enunciado nuestra condición es que haya nubes negras, y si hay nubes negras entonces lloverá; Esta condición sería expresada en nuestro programa como: If( hay nubes negras) { Llueve } En el fragmento de código anterior, nuestra condición está claramente expresada en el if , donde al ser leído lo traducimos como “si hay nubes negras”; Al ser una estrucutra, If utiliza llaves, las cuales contienen el fragmento de código a realizar dependiendo si la condición se cumple o no, en este ejemplo la condición que se cumple “si hay nubes negras” es que llueva, por lo cual dicha acción se encuentra contenida dentro de las llaves del if. A su vez If contiene una contraparte para la condición, esto es, que sucede si una condición no se cumple y es necesario especificar la acción a realizar cuando esto suceda, para esto es necesario la utilización de else, así como el If, else también utiliza llaves, pero este no recibe ningún argumento ya que depende de la condición especificada con el if. Tomando el caso anterior agregaremos un caso contrario para su comprensión: If (hay nubes negras) { Llueve } Else { Voy al parque a jugar } Según el ejemplo anterior nuestra condición es “si hay nubes negras”, si esta condición se cumple entonces lloverá, pero si esta condición no se cumple, esto es, que no haya nubes negras, entonces iré al parque a jugar debido a que no lloverá. Como es claro, en ningún momento nosotros utilizaremos en nuestro programa una sintaxis como en los ejemplos anteriores, para utilizar correctamente la estructura If, es necesario la implementación de variables. Para dar un ejemplo de ello, supongamos que existe una variable de tipo String la cual guarda algún mes del año, esta variable por obvias razones la llamaremos “mes”, entonces: If (mes == “Enero”) { Textbox1.Text = “Feliz Navidad!!”; } Else { Textbox1.Text = “No hay avisos el día de hoy”; } En el ejemplo anterior, nuestra condición se expresa como “Si el mes es enero”, si esto se cumple, el textbox1 de nuestro programa mostrará el mensaje “Feliz Navidad!!”, si esta condición no se cumple, esto es que el mes sea cualquiera diferente de enero, el textbox1 mostrará el mensaje “No hay avisos el día de hoy”. Tema 7: Estructura For. La estructura for, es una estructura que contiene un fragmento de código, el cuál va a ser realizado un cierto número de veces, esta estructura puede ser entendida como un ciclo. For debido a que es una estructura, utiliza llaves, las cuales contienen el fragmento de código a realizar y este recibe 3 argumentos separados por punto y coma: For(argumento1; argumento2; argumento3) { Código a realizar } El primer argumento recibido especifica un “contador”, en específico, el valor en el cual inicia este, dicho contador es quien llevará el número de veces que se ha llevado a cabo el ciclo. El segundo argumento especifica una “condición de paro”, esto es, aquella condición que va a llevar a la ruptura del ciclo o a hacer que el ciclo termine. El tercer argumento especifica la acción a realizar cada vez que el ciclo se realice, en la mayoría de las veces, este argumento incrementa al contador. Para comprender lo anterior, veamos el siguiente ejemplo: For (int veces=1;veces<=10;veces++) { Textbox1.text += “ “ + Convert.ToString(veces); } El ejemplo anterior, realiza la acción 10 veces, ya que comienza en 1 y se realizará el ciclo siempre y cuando, nuestro contador llamado veces, no sea mayor a 10. Este código va agregando al Textbox1 la cuenta del contador, lo que nos daría como resultado final: