Texto Guía de la scuela Informátic
Fundamentos de rogramación
Texto Guía de la scuela Informátic
Fundamentos de rogramación
Autores: Orlando Erazo Moreta Andrea Zúñiga Washington Chiriboga �
PREFACIO El presente texto guía pretende introducir de una manera clara, sencilla y simplificada, los conceptos de la lógica para desarrollar programas para computadoras, a todas las personas que se encuentren interesadas en esta disciplina, pero muy en particular a los estudiantes que cursan la unidad de aprendizaje de Fundamentos de Programación en la carrera de Ingeniería en Sistemas. Se ha desarrollado esta obra pensando en que los lectores son estudiantes nuevos en la disciplina de programación, así como también en aquellos que ya han tenido o tienen alguna experiencia en este campo. Para un óptimo aprovechamiento se recomienda, en cada capítulo hacer una lectura o revisión rápida a fin de obtener una visión global de la temática. En una segunda lectura, hacerlo con mayor detenimiento, comprendiendo y asimilando cada tema expuesto, llegando al nivel de los detalles expuestos. Se espera con la ayuda de este texto, el estudiante logre introducirse en el manejo de un lenguaje de alto nivel, como lo es Visual C#, implemente algoritmos sencillos y adquiera las bases necesarias para iniciarse en el desarrollosoftware orientado a satisfacer las necesidades de procesamiento de información y soporte a las decisiones estratégicas de las organizaciones.
�
CONTENIDO Tema
Págs.
PORTADA
1
PORTADILLA
2
PREFACIO
3
CONTENIDO
4
INTRODUCCIÓN
7
CAPÍTULO 1. CONCEPTOS BÁSICOS DE ALMACENAMIENTO DE INFORMACIÓN
9
1.1. Unidades básicas de información en un computador
11
1.2. Terminología básica.
13
1.3.
Tipos básicos de información que maneja el computador
21
1.4.
Forma interna de almacenamiento
22
1.5.
Tipos de campos
24
Ejercicios propuestos
26
CAPÍTULO 2. ALGORITMOS
28
2.1.
Problemas y modelos
28
2.2.
Pasos para la solución de un problema a través del computador
29
2.3.
Algoritmos
30
2.4.
Valor de los símbolos en un modelo algorítmico
35
Ejercicios resueltos
41
Ejercicios propuestos
42
CAPÍTULO 3. ESTRUCTURAS E INSTRUCCIONES EN LA PROGRAMACIÓN ESTRUCTURADA
45
3.1.
Algoritmos básicos
46
3.2.
Ejemplos de algoritmos básicos sin toma de decisiones
48
3.3.
Estructuras de decisión lógica (representación y funcionamiento)
49 �
3.4.
Ciclos MIENTRAS (while)
52
3.5.
Estructuras adicionales
55
Ejercicios resueltos
58
Ejercicios propuestos
62
CAPÍTULO 4. INTRODUCCIÓN AL FRAMEWORK DE .NET
64
4.1.
64
La plataforma .NET
4.1.1. Componentes del Framework de .NET
65
4.1.2. Compilación y el MSIL
67
4.1.3. Entorno de desarrollo para aplicaciones de consola
69
4.2.
70
Fundamentos del Lenguaje
4.2.1. Tipos
71
4.2.2. Constantes
72
4.2.3. Variables
73
4.2.4. Expresiones
74
4.2.5. Operadores
75
4.3.
76
Sentencias
Ejercicios resueltos
78
Ejercicios propuestos
81
CAPÍTULO 5. MODULARIDAD Y REDUCCIÓN DE COMPLEJIDAD
82
5.1.
Procedimientos
85
5.2.
Funciones
86
5.3.
Paso de parámetros: por valor y por referencia
88
Ejercicios resueltos
89
Ejercicios propuestos
90
CAPÍTULO 6. FUENTES ELEMENTALES DE DATOS
91
6.1 Arreglos de una dimensión o vectores
92
6.2.
Cadenas de caracteres
95
6.3.
Operaciones básicas con arreglos
97 �
6.4 Arreglos de dos dimensiones o matrices
100
Ejercicios resueltos
102
Ejercicios propuestos
105
BIBLIOGRAFÍA
106
ANEXOS Anexo 1: Ejercicios Propuestos
107
�
INTRODUCCIÓN Cuando un músico escucha una melodía que acaba de componer o cuando un escultor retoca el último detalle de su obra maestra, está ante un logro personal, pero que fue hecho pensando en los demás. Está ante el fruto de su trabajo, que tuvo que realizar para pasar de una idea o modelo que estaba sólo en su imaginación, a algo perceptible por los otros. Y ese logro causa una gran satisfacción. El desarrollo de software – al igual que la música, la escultura o la pintura – es una actividad creativa y, hasta si se quiere, artística. Es una actividad en la que una persona (el programador) debe plasmar una idea en un programa que alguien usará luego. Y es muy probable que esa idea sea algo totalmente novedoso, algo que nadie antes ha visto. Y ver esa idea traducida en software produce una sensación que sólo un programador puede entender.
Ser programador no es fácil, pero es divertido. Desarrollar software es, definitivamente, una tarea compleja. Deberemos ser capaces de interpretar al usuario (inicialmente el docente), de entender qué es lo que necesita (aunque muchas veces él mismo no sabe qué es lo que necesita). Pasaremos largas horas pensado un algoritmo que resuelva el problema de nuestro cliente de la mejor manera. Muchas veces nos iremos a casa y seguiremos pensando en ese dichoso algoritmo. Nos iremos a dormir (probablemente muy tarde, porque habremos dedicado parte de nuestro tiempo libre a aprender nuevas tecnologías) y despertaremos pensando en el algoritmo o, incluso, con la solución en la mente. Pero cunado escribamos la última línea del código que implementa ese algoritmo y lo veamos funcionando, obtendremos una gran satisfacción. Una satisfacción que sólo puede entender otro programador. Pero como es de esperar, para iniciarse en este “arte” de escribir programas para computadoras, necesitará comprender correctamente una serie de conceptos, desarrollar la lógica de programación, aprender un lenguaje de programación y, sobre todo, mucha �
práctica. Para ayudarle a alcanzar su objetivo, se ha organizado el texto de la siguiente manera: En el capítulo 1 se exponen varios de los términos básicos relacionados con el almacenamiento de información en un computador y se dan a conocer cuáles son las herramientas necesarias para la creación de nuestros propios programas, para operar sobre dicha información. En el capítulo 2 se introduce a los algoritmos, conociendo su significado, necesidad y formas de representación, todo esto con miras a utilizarlos como herramientas de apoyo en el desarrollo de software. Con el capítulo 3 se empezará ya de lleno el desarrollo de la lógica de programación, apoyándose en la elaboración de algoritmos, principalmente en forma de diagramas de flujo. Aquí se estudian las diferentes estructuras e instrucciones que pueden aplicarse en un estilo de programación estructurada, ya que más adelante, en el capítulo 4, se aprenderá la forma de codificar dichos algoritmos o diagramas de flujo en el lenguaje de programación Visual C# y así poder visualizar las diferentes soluciones. Ya con conocimientos de un lenguaje de programación, en el capítulo 5 estudiará los procedimientos y las funciones, como mecanismos que permiten la reutilización de código. Para finalizar el texto, en el capítulo 6 se dan a conocer algunas de las estructuras de datos elementales, haciendo énfasis en los arreglos de una y dos dimensiones, y su implementación en el lenguaje C#.
�
CAPÍTULO 1 CONCEPTOS BÁSICOS DE ALMACENAMIENTO DE INFORMACIÓN Mucho se habla de que la computadora está influyendo dentro de nuestra privacidad y sustituyendo mano de obra, creando desempleo, etc. Estos aspectos no pueden discutirse, sin conocer a fondo lo que es una computadora, pero a medida que se avanza en su conocimiento, es posible emitir un concepto inteligente. Hay que tener en cuenta que una computadora no puede hacer algo a menos que el ser humano le diga qué hacer. Debemos controlar la computadora y no ella a nosotros. Desde un punto de vista simple, una computadora procesa datos y los convierte en información significativa. Aunque a primera vista puedan parecer sinónimos datos e información, existe diferencia entre ellos. Los datos constan de hechos en bruto y figuras. La información, por otra parte, son datos procesados.
La información tiene datos
significativos; los datos en su forma original (en bruto) no. La figura 1 muestra el modelo fundamental de datos: los datos entran a la computadora (por una parte llamada entrada), la computadora procesa esos datos y la información significativa es el resultado (se presentan en una parte denominada salida).
Datos
Computadora
Información
Entrada
Proceso
Salida
Figura 1. Datos e información. Los datos, por sí mismos, no sirven para nada y no son útiles para las personas que los manipulan y necesitan tomar decisiones con ellos. Por ejemplo, el presidente de una �
empresa no necesita un informe detallado de las nóminas de los 2000 empleados de su empresa si lo que desea es estudiar las tendencias o proyecciones en el tiempo de las citadas nóminas o sueldos. En su lugar, el presidente necesitará más información significativa, tal como nóminas totales por departamento, incrementos de la nómina durante el año pasado, nómina media del empleado comparada con otras empresas de la misma línea de negocios, etc. Una computadora que tenga almacenado un programa adecuado puede producir rápidamente la información que el presidente necesita a partir de los datos en bruto de la nómina. El programa es la fuerza conductora de cualquier tarea que hace una computadora. Un programa es una lista de instrucciones detalladas que indican a la computadora lo que ha de hacer.
La computadora no puede hacer nada sin un programa.
Es el trabajo del
programador de escribir programas lo que influye en la computadora y tomar datos en bruto y transformarlos en información significativa para el usuario final, como puede ser el caso del presidente de la empresa, el objetivo final. Los programas modernos producen información en muchos formatos. Estos programas reproducen música, “charlan” con otras computadoras a través de líneas telefónicas o teléfonos celulares y otros dispositivos externos. La salida se envía a la pantalla y a la impresora que constituyen los dispositivos más usuales para el acceso a la computadora; es decir, los datos de entrada y los datos de salida pueden ser, realmente, cualquier cosa, texto, dibujos, sonidos, etc. Una computadora consta de dos partes bien diferenciadas, hardware y software.
El
hardware consta de las partes físicas, tangibles de la computadora. El software consta de programas, también llamados aplicaciones, que contienen instrucciones que la computadora “ejecuta” o “corre”. Una computadora necesita tanto del hardware como del software para poder ser usada real y prácticamente. El hardware de la computadora sin el software que le acompaña es como si tuviéramos un libro con páginas en blanco. La portada, contraportada y las páginas ��
interiores constituyen el hardware del libro, pero el libro no es útil sin ningún texto, el software. Otro término que suele utilizar al hablar de software es sistema, aunque la palabra sistema por sí sola no tiene nada que ver son el software. Un sistema es un conjunto de elementos que interactúan de alguna manera, como puede ser el sistema digestivo o el sistema solar. Otro ejemplo de sistema, son los sistemas de información, sin que esto tampoco implique un software. Por ejemplo, un sistema contable es un conjunto de métodos y herramientas que permiten mantener la información sobre los movimientos económicos y los bienes de una empresa, pero se pueden utilizar libros en papel para alcanzar el objetivo. Finalmente, un sistema de información basado en computadora es la implementación con herramientas computacionales (programas y datos) de un sistema de información. Por lo tanto, como sinónimo de software podemos utilizar sistema de información basado en computadora. Por otro lado, los términos programa y sistema suelen utilizarse indistintamente, pero no está bien, generalmente, podemos decir que un sistema es un grupo de programas que interactúan para realizar ciertas tareas. Un programa es una unidad mucho más pequeña, independiente y sencilla que un sistema. Esta unidad de aprendizaje está dedicada exclusivamente al software, por lo que no se revisará la parte correspondiente al hardware, cuyo estudio se lleva a cabo en Fundamentos de Computación.
En las secciones siguientes de este capítulo se explican algunos
conceptos fundamentales para la creación de su propio software.
1.1. Unidades básicas de información en un computador Bit.- Es la abreviatura de binary digit. Es una unidad de información que equivale a una decisión binaria, o la designación de uno de dos valores o estados posibles igualmente probables. Se suele expresar como ‘l’ o ‘0’. Representa una unidad minúscula de memoria ��
que puede tener dos estados encendido, o apagado, donde el estado encendido se representa mediante uno y el apagado mediante cero.
Byte.- Es un conjunto de ocho BITS consecutivos que se tratan como una sola entidad. También se le conoce como el número de BITS necesarios para representar un carácter en la memoria de la computadora.
Campo.- Un campo es un espacio de almacenamiento para un dato en particular; es un grupo de caracteres que se pueden tratar como una unidad de información simple. En las bases de datos, un campo es la mínima unidad de información a la que se puede acceder; un campo o un conjunto de ellos forman un registro, donde pueden existir campos en blanco, siendo éste un error del sistema. En las hojas de cálculo los campos son llamados celdas. La mayoría de los campos tienen atributos asociados a ellos. Por ejemplo, algunos campos son numéricos mientras otros almacenan texto, también varía el tamaño de estos. Adicionalmente, cada campo tiene un nombre.
Registro.-Es un conjunto de campos que se refieren a una misma actividad que se desea procesar; por ejemplo, toda la información sobre un artículo de inventario, la información que contiene una lista de clase sobre un estudiante (código, nombres, dirección, etc.).
Archivo.- Es una unidad de software utilizada para almacenar información en forma masiva, relacionada con una determinada entidad, persona o cosas. Ejemplo: suponga que la compañía A tiene 100 clientes y que se mantiene la siguiente información acerca de cada uno de ellos: nombre, dirección, balance de crédito, descuento permitido. La información individual de cada cliente se denomina registro y un conjunto de registros formará un archivo, es decir, un archivo de datos de los registros de los clientes. Los archivos pueden tenerse en varias formas y en diferentes medios de almacenamiento.
Base de datos.- Una base de datos o banco de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su posterior uso. En este sentido, una biblioteca puede considerarse una base de datos compuesta en su mayoría por ��
documentos y textos impresos en papel e indexados para su consulta. En la actualidad, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital (electrónico), que ofrece un amplio rango de soluciones al problema de almacenar datos. Existen programas denominados sistemas de gestión de bases de datos, abreviado SGBD (DBMS), que permiten almacenar y posteriormente acceder a los datos de forma rápida y estructurada
1.2. Terminología básica. Como ya se mencionaba antes, una computadora realizará las tareas que nosotros le indiquemos, pero para ello necesita de programas, por lo que surgen las preguntas: ¿Quién hace esos programas? ¿De qué están compuestos los programas? ¿Cómo los hacen? Estas dudas y otras se intentan responder en los párrafos siguientes.
El programador. Un programador es, básicamente, una persona que ejerce la programación; es decir, que se dedica a escribir programas para computadoras. Los programadores también reciben el nombre de desarrolladores de software; técnicamente podemos usar uno u otro término. El programador se encarga de implementar algoritmos mediante un lenguaje de programación que pueda entender la computadora. Inicialmente, su función era resolver en forma particular los problemas de sistemas que surgían en las empresas, así como un mecánico cambia o repara partes defectuosas. Con el tiempo se fueron incorporando a su misión nuevas necesidades y tareas, hasta llegar al día de hoy, en que un programador o grupo de ellos se ocupa de realizar aplicaciones completas y generar soluciones empresariales y de otros tipos.
��
Programación y lenguaje de programación. La programación, es la creación de programas de computadora (código máquina compilado o interpretado); esto es, generar un conjunto concreto de instrucciones que una computadora pueda ejecutar. El programa se escribe en un lenguaje de programación, aunque también se puede escribir directamente en lenguaje máquina, con cierta dificultad. El lenguaje de programación es un lenguaje que puede utilizarse para controlar el comportamiento de una máquina, particularmente, una computadora.
Consiste de un
conjunto de reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos, respectivamente. Un lenguaje de programación permite a un programador especificar de manera precisa sobre qué datos una computadora debe operar, cómo estos deben ser almacenados y transmitidos, y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto se realiza a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Los principales tipos de lenguajes utilizados son tres:
Lenguajes máquina.
Lenguaje de bajo nivel (ensamblador).
Lenguajes de alto nivel.
Antes de continuar con estos tipos de lenguajes es necesario hablar de las instrucciones. Los diferentes pasos (acciones) de un algoritmo se expresan en los programas como instrucciones, sentencias o proposiciones (normalmente el término instrucción se suele referir a los lenguajes máquina y de bajo nivel, reservando la sentencia o proposición para los lenguajes de alto nivel). Por consiguiente, un programa consta de una secuencia de ��
instrucciones, cada una de las cuales especifica ciertas operaciones que debe ejecutar la computadora. La elaboración de un programa requerirá conocer el juego o repertorio de instrucciones del lenguaje.
Aunque más adelante se analizarán con más detalle las instrucciones,
adelantaremos los tipos fundamentales de instrucciones que una computadora es capaz de manipular y ejecutar. Las instrucciones básicas y comunes a casi todos los lenguajes de programación se pueden condensar en cuatro grupos:
Instrucciones de entrada/salida. Instrucciones de transferencia de datos e información entre dispositivos periféricos (teclado, impresora, unidad de disco, etc.) y la memoria central.
Instrucciones aritmético-lógicas. Instrucciones que ejecutan operaciones aritméticas (suma, resta, multiplicación, división, potenciación), lógicas (operaciones and, or ,not, etc.).
Instrucciones selectivas. Instrucciones que permiten la selección de tareas alternativas en función de los resultados de diferentes expresiones condicionales.
Instrucciones repetitivas. Instrucciones que permiten la repetición de secuencias de instrucciones un número determinado de veces.
Lenguajes máquina.- Los lenguajes máquina son aquellos que están escritos en lenguajes directamente inteligibles por la máquina (computadora), ya que sus instrucciones son cadenas binarias (cadenas o series de caracteres-dígitos- O y 1) que especifican una operación, y las posiciones (dirección) de memoria implicadas en la operación se denominan instrucciones de máquina o código máquina. El código máquina es el conocido código binario.
��
Las instrucciones en lenguaje máquina dependen del hardware de la computadora y, por tanto, diferirán de una computadora a otra. El lenguaje máquina de un PC (computadora personal) será diferente de un sistema HP (Hewlett Packard), Compaq o un sistema de IBM. Las ventajas de programar en lenguaje máquina son la posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de programación. Los inconvenientes -en la actualidad- superan a las ventajas, lo que hace prácticamente no recomendables los lenguajes máquina. Estos inconvenientes son:
Dificultad y lentitud en la codificación.
Poca fiabilidad.
Dificultad grande de verificar y poner a punto los programas.
Los programas sólo son ejecutables en el mismo procesador (CPU, Unidad Central de Proceso).
Para evitar los lenguajes máquina, desde el punto de vista del usuario, se han creado otros lenguajes que permiten escribir programas con instrucciones similares al lenguaje humano (por desgracia casi siempre inglés, aunque existen raras excepciones). Estos lenguajes se denominan de alto y bajo nivel.
Lenguajes de bajo nivel.- Los lenguajes de bajo nivel son más fáciles de utilizar que los lenguajes máquina, pero, al igual, que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador (assembly languaje). Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nernotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son: en inglés, ADD, SUB, DIV, etc.; en español, SUM, RES, DIV, etc. Una instrucción típica de suma sería:ADD M, N, P ��
Esta instrucción podía significar: sumar el número contenido en la posición de memoria M al número almacenado en la posición de memoria N y situar el resultado en la posición de memoria P. Evidentemente,es mucho más sencillo recordar la instrucción anterior con un nemotécnico que su equivalente en código máquina: 0110 1001 1010 1011 Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora-en esto se diferencia esencialmente del lenguaje máquina-, sino que requiere una fase de traducción al lenguaje máquina. El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje máquina se conoce como programa objeto, ya directamente inteligible por la computadora. El traductor de programas fuente a objeto es un programa llamado ensamblador (assembler),existente en casi todas las computadoras (figura 2).
Programa fuente en Lenguaje ensamblador (assembly)
Programa ENSAMBLADOR (assembler)
Programa objeto en código máquina
Figura 2.Programa ensamblador No se debe confundir -aunque en español adoptan el mismo nombre- el programa ensamblador(assembler), encargado de efectuar la traducción del programa fuente escrito a lenguaje máquina, con el lenguaje ensamblador (assemblylanguaje), lenguaje de programación con una estructura y gramática definidas. Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su mayor facilidad de codificación y, en general, su velocidad de cálculo. ��
Los inconvenientes más notables de los lenguajes ensambladores son:
Dependencia total de la máquina, lo que impide la transportabilidad de los programas (posibilidad de ejecutar un programa en diferentes máquinas). El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Macintosh.
La formación de los programas es más compleja que la correspondiente a los programadores de alto nivel, ya que exige no sólo las técnicas de programación, sino también el conocimiento del interior de la máquina.
Hoy día los lenguajes ensambladores tiene sus aplicaciones muy reducidas en la programación de aplicaciones y se centran en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos,etc.
Lenguajes de alto nivel.- Los lenguajes de alto nivel son los más utilizados por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y ensambladores. Otra razón es que un programa escrito en lenguaje de alto nivel es independiente de la máquina; esto es, las instrucciones del programa de la computadora no dependen del diseño del hardware o de una computadora en particular. En consecuencia, los programas escritos en lenguaje de alto nivel son portables o transportables, lo que significa la posibilidad de poder ser ejecutados con poca o ninguna modificación en diferentes tipos de computadoras; al contrario que los programas en lenguaje máquina o ensamblador, que sólo se pueden ejecutar en un determinado tipo de computadora. Los lenguajes de alto nivel presentan las siguientes ventajas:
El tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes. ��
La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos. Nombres de las instrucciones, tales como READ, WRITE, CLEAR, etc.
Las modificaciones y puestas a punto de los programas son más fáciles.
Reducción del coste de los programas.
Transportabilidad.
Los inconvenientes se concretan en:
Incremento del tiempo de puesta a punto, al necesitarse diferentes traducciones del programa fuente para conseguir el programa definitivo.
No se aprovechan los recursos internos de la máquina, que se explotan mucho mejor en lenguajes máquina y ensambladores.
Aumento de la ocupación de memoria.
El tiempo de ejecución de los programas es mucho mayor.
Al igual que sucede con los lenguajes ensambladores, los programas fuente tienen que ser traducidos por los programas traductores, llamados en este caso compiladores e intérpretes. Los lenguajes de programación de alto nivel existentes hoy son muy numerosos. Algunos ejemplos son: C/C++, Java, Visual BASIC, C#, PHP, JavaScript.
Traductores de lenguaje Los traductores de lenguaje son programas que traducen a su vez los programas fuente escritos en lenguajes de alto nivel a código máquina. ��
Los traductores se dividen en:
Compiladores.
Intérpretes.
Compilador.- Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación. Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a cómo piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.
Intérprete o interpretador.- Intérprete o interpretador es un programa informático capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripción en un lenguaje de programación al código de máquina del sistema, los primeros (los intérpretes) sólo realizan la traducción a medida que sea necesaria, típicamente, instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción. Usando un intérprete, un solo archivo fuente puede producir resultados iguales incluso en sistemas sumamente diferentes (ej. una PC y un PlayStation 3). Usando un compilador, un solo archivo fuente puede producir resultados iguales solo si es compilado a distintos ejecutables específicos a cada sistema.
��
Los programas interpretados suelen ser más lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son más flexibles como entornos de programación y depuración (lo que se traduce, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o añadir módulos completamente nuevos), y permiten ofrecer al programa interpretado un entorno no dependiente de la máquina donde se ejecuta el intérprete, sino del propio intérprete (lo que se conoce comúnmente como máquina virtual). Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito. A manera de resumen, y en términos generales, podemos decir que el programa escrito en un lenguaje de alto nivel se introduce en la máquina con un editor y se llama código fuente; el compilador lo traduce en lenguaje máquina y almacena el resultado en otro archivo llamado código objeto.
El código objeto se carga en la memoria principal de la
computadora y lo ejecuta el CPU.
1.3. Tipos básicos de información que maneja el computador Los principales tipos de información, entre otros, que se manejan en una computadora son:
Numérica:es toda aquella información con o sin decimales (entera o real) con la cual se pueden hacer cálculos aritméticos o matemáticos.
Caracteres (alfanumérica):muchos procesos o programas no sólo requieren de la manipulación de valores numéricos, sino también de letras y símbolos especiales con los cuales, lógicamente, no se pueden efectuar operaciones de cálculo matemático. Por ejemplo: los nombres de personas. ��
Lógica (booleana):Este tipo de información sólo tiene dos posibles valores: falso o verdadero. Al igual que el tipo de información anterior, éste tampoco puede ser utilizado para efectuar cálculos matemáticos.
1.4. Forma interna de almacenamiento Con el propósito de almacenar datos, una computadora consta de pequeños circuitos electrónicos capaces de almacenar un bit. Estos circuitos son como pequeños interruptores de luz que pueden estar en dos estados; uno para encendido y otro para apagado. La memoria central o simplemente memoria (interna o principal) se utiliza para almacenar información. Se divide a su vez en memoria RAM y memoria ROM. La memoria RAM (Random Access Memory) es normalmente volátil, lo que significa que todo cuanto se almacena o guarda en ella se “pierde” cuando se apaga la computadora. En general, la información almacenada en memoria puede ser de dos tipos: las instrucciones de un programa y los datos con los que operan las instrucciones. Por ejemplo, para que un programa se pueda ejecutar, debe ser situado en la memoria central, en una operación denominada carga del programa. Después, cuando se ejecuta el programa, cualquier dato a procesar por el programa se debe llevar a la memoria mediante las instrucciones del programa. En la memoria central hay también datos diversos y espacio de almacenamiento temporal que necesita el programa cuando se ejecuta con el fin de poder funcionar. Los programas y datos se almacenan en RAM mientras se está utilizando la computadora. Con el objetivo de que el procesador pueda obtener los datos de la memoria central más rápidamente, la mayoría de los procesadores actuales utilizan con frecuencia una memoria denominada caché, que sirve para almacenamiento intermedio de datos entre el procesador y la memoria principal. La memoria caché se incorpora casi siempre al procesador. La memoria central de una computadora es una zona de almacenamiento organizada en centenares de millones de unidades de almacenamiento individual o celdas. La memoria central consta de un conjunto de celdas de memoria (estas celdas o posiciones de memoria ��
se denominan también palabras, aunque no guardan analogía con las palabras del lenguaje). El número de celdas de memoria de la memoria central, dependiendo del tipo y modelo de computadora, hoy en día, suele ser millones o miles de millones. Cada celda de memoria consta de un cierto número de bits (normalmente 8, un byte). La unidad elemental de memoria se llama byte (octeto), y como se ya se explicaba en un apartado anterior, tiene la capacidad de almacenar un carácter de información, y está formado por un conjunto de unidades más pequeñas de almacenamiento denominadas bits, que son dígitos binarios (0 o 1).
Direcciones de memoria. Existen dos conceptos importantes asociados a cada celda o posición de memoria: su dirección y su contenido. Cada celda o byte tiene asociada una única dirección que indica su posición relativa en memoria y mediante la cual se puede acceder a la posición para almacenar o recuperar información. La información almacenada en una posición de memoria es su contenido. La figura 3 muestra una memoria de computadora que consta de 1000 posiciones con direcciones de 0 a 999. El contenido de estas direcciones o posiciones de memoria se llaman palabras, de modo que existen palabras de 8, 16, 32 y 64 bits. Por consiguiente, si trabaja con una máquina de 32 bits, significa que en cada posición de memoria de su computadora puede alojar 32 bits, es decir 32 dígitos, bien ceros o unos. Siempre que una nueva información se almacena en una posición, se destruye (desaparece) cualquier información que en ella hubiera y no se puede recuperar. La dirección es permanente y única, el contenido puede cambiar mientras se ejecuta un programa. La memoria central de una computadora puede tener desde unos centenares de millares de butes hasta millones de bytes. Como el byte es una unidad elemental de almacenamiento, se utilizan múltiplos para definir el tamaño de la memoria central (Kilobyte, Megabyte, Gigabyte, Terabyte) ��
Direcciones
Contenido 999 998 997
01000001
A
. . . 3 2
00000101
5
1
00000011
3
0
00000010
2
Figura 3.Memoria central de una computadora
1.5. Tipos de campos Para que una computadora pueda hacer cálculos debe tener almacenados en la memoria principal los valores con los cuales ha de trabajar; por lo tanto, se necesita un espacio interno para guardar esos valores en forma temporal. Esos espacios internos de la memoria son grupos de bits denominados campos; a éstos se les asigna una única dirección de memoria y su capacidad o valor máximo que se puede almacenar en ellos dependerá del tamaño del grupo. Los campos pueden ser de dos clases: variables y constantes.
Campos variables. Son todos aquellos campos que permiten que el contenido almacenado en el espacio de memoria asignado, pueda ser alterado en el transcurso de la ejecución del programa; o sea, en un momento tiene un valor y más adelante puede tener otro distinto, pero nunca más de ��
un valor al mismo tiempo. Esta clase de campos, que en lo sucesivo se denominarán simplemente variables, se identifican por un nombre con el cual actúan durante todo el transcurso del proceso, por lo tanto, deben ser únicos. El nombre dado a la variable constituye un IDENTIFICADOR, y debe iniciar con una letra seguida, si se quiere, de letras o dígitos. Es el programador quien da nombre a sus variables teniendo en cuenta la regla anterior. Ejemplos de nombres de variables: A
B1
C1AZ
NOMBRE
SALARIOHORA
Es buena práctica de programación utilizar nombres de variables significativas (nemotécnicas), es decir, que sugieran lo que ellas representan, ya que esto hace que el algoritmo, y por ende el programa, sea más legible y fácil de comprender. Si se quiere dar nombre a una variable que va a almacenar un pago, por ejemplo, perfectamente lo podemos llamar K, pero sería más evidente si la denominamos PAG o más directamente PAGO. Tampoco estos nombres deben ser tan excesivamente largos debido a que dificultan la escritura del algoritmo. Al momento de dar el nombre a las variables tampoco se pueden emplear las palabras reservadas (propias de cada lenguaje de programación) pues tienen un sentido definido, como por ejemplo if, while, else, switch, etc. Para que una variable esté perfectamente definida, habrá que especificar: su nombre, el tipo de dato (numéricos, alfanumérico, booleano) y el valor que va tomar en un principio (inicialización).
��
Campos constantes. Es otra forma de manejar el grupo de elementos asignados en memoria, pero que a diferencia de las variables su contenido no puede cambiar durante el proceso. Esta clase de campos se identifica directamente por la información que tiene almacenada y es asignada desde el momento en que se hace la compilación. Pueden existir campos constantes, o simplemente constantes, de tipo numérico, carácter o lógico. Por ejemplo: 40,6
‘ANAISABEL’
-10
.V.
Ejercicios propuestos 1. Con sus propias palabras, explique cada uno de los siguientes términos.
Si es
necesario consulte otras fuentes.
Informática
Computación
Ingeniería de Sistemas
Dato
Información
Sistema
Sistema de información
Programa
Lenguaje de programación
Instrucción
Código fuente
Código (programa) objeto
Lenguaje máquina
Lenguaje ensamblador
Traductor
Compilador ��
Intérprete
Ensamblador
Editor
Campo
Registro
Archivo
Base de datos
Variable
Constante
Dirección de memoria
Bit
Byte
2. ¿Qué tipos de datos se conoce? Escribir una breve descripción y cinco ejemplos de cada uno de ellos.
3. ¿Cuál es la diferencia existente entre variables y constantes? 4. Hablar sobre los componentes de una variable 5. Indicar cuáles de los siguientes identificadores son válidos o no, explicando el porque de su afirmación: a) YROJO b) X-ROJO c) 2blanco d) N/4 e) Promedio f) Suma *10 g) Total suma h) Número_alumnos i) X$ j)
∑ _alumnos
k) x1 _y3 ��
l) Promedio_Notas
6.
Determinar cuáles de las siguientes constantes son válidas o no, indicando el porqué de su afirmación; a) 123 b) 12.4 c) 0.1234 d) Verdadero e) ´Falso´ f) ´a´ g) ´Ab´ h) ´Buenos días!&%$.´ i) * j) ´@´ k) 3.141592 l) 0.00001
��
CAPÍTULO 2 ALGORITMOS 2.1. Problemas y modelos Una gran parte del trabajo del programador es precisamente saber qué problema se va a resolver. Al abordar los problemas, por lo general, éstos no tienen una especificación simple y precisa de ellos. De hecho, problemas como crear una receta digna de un gastrónomo o preservar la paz mundial pueden ser imposibles de formular de manera que admitan una solución por computador; aunque se crea que el problema puede resolverse en un computador, es usual que la distancia entre varios de sus parámetros sea considerable. A menudos sólo mediante experimentación es posible encontrar valores razonables para estos parámetros. Si es posible expresar ciertos aspectos de un problema con un modelo formal, por lo general resulta beneficioso hacerlo, pues una vez que el problema se formaliza, pueden buscarse soluciones en función de un modelo preciso y determinar si ya existe un programa que resuelve tal problema; aun cuando no sea tal el caso, será posible averiguar lo que se sabe acerca del modelo y usar sus propiedades como ayuda para elaborar una buena solución. Se puede recurrir a casi cualquier rama de las matemáticas y de las ciencias para obtener un modelo de cierto tipo de problemas. En el caso de problemas de naturaleza esencialmente numérica, esto puede lograrse a través de conceptos matemáticos tan familiares como las ecuaciones lineales. Tratándose de problemas de procesamiento de símbolos y textos, se pueden construir modelos con cadenas de caracteres.
��
Cuando ya se cuenta con un modelo matemático adecuado del problema, puede buscarse una solución en función de ese modelo. El objetivo inicial consiste en hallar una solución en forma de algoritmo. Posteriormente, este algoritmo puede ser implementado en algún lenguaje de programación obteniéndose un programa que resuelve nuestro problema planteado.
2.2. Pasos para la solución de un problema a través del computador Resumiendo lo señalado en el apartado anterior, el proceso de resolución de un problema con una computadora conduce a la escritura de un programa y a su ejecución en la misma. Aunque el proceso de diseñar programas es –esencialmente- un proceso creativo, se puede considerar una seria de fases o pasos comunes, que generalmente deben seguir los programadores. Las fases de resolución de un problema con computadora son:
Análisis: el problema se analiza teniendo presente la especificación de los requisitos dados por el cliente o por la persona que encarga el problema. Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada.
Diseño: una vez analizado el problema, se diseña una solución que conducirá a un algoritmo que resuelva el problema (diseño del algoritmo); es decir, cómo el programa resolverá la tarea solicitada.
Tenga presente que el diseño del algoritmo es
independiente del lenguaje de programación.
Codificación (implementación): la solución se escribe en la sintaxis del lenguaje de alto nivel y se obtiene un programa.
Es altamente recomendable acompañar la
codificación de una documentación interna; es decir, incluir dentro del código comentarios que ayuden a la comprensión del mismo. El programa no los necesita y ��
serán ignorados, pero sirven para hacer los programas más fáciles de comprender. Recuerde que como programador debe escribir códigos sencillos.
Compilación, ejecución, verificación y depuración: el programa se ejecuta, se comprueba rigurosamente y se eliminan todos los errores (bugs) que puedan aparecer. Cuando ejecuta el programa se pueden producir tres tipos de errores: de compilación (uso incorrecto de las reglas del lenguaje), de ejecución (instrucciones que la computadora puede comprender pero no ejecutar) y lógicos (se producen en la lógica del programa y la fuente del error suele ser el algoritmo).
Mantenimiento: el programa se actualiza y modifica cada vez que sea necesario, de modo que se cumplan todas las necesidades de cambio de sus usuarios.
Documentación: escritura de las diferentes fases del ciclo de vida del software, esencialmente el análisis, diseño y codificación, unidos a manuales de usuario y de referencia, así como normas para el mantenimiento.
2.3. Algoritmos Si se analizan los pasos para la solución de un problema a través de la computadora se nota que el algoritmo es bastante importante, y a él se debe llegar cuando se ha entendido el problema y se ha hecho un análisis correcto de las características de éste. Es común ver estudiantes que por ligereza omiten uno o varios pasos y luego se dan cuenta de que han invertido su tiempo en lo equivocado, porque no han verificado si lo que están haciendo es correcto o no. Si no se está seguro de la implementación de uno o algunos de los pasos, es preferible pedir ayuda especializada para aclarar las dudas que surjan.
��
La palabra algoritmo es muy antigua; toma su nombre del famoso matemático y astrónomo árabe Alkhôwarîzmi (siglo IX), quien escribió un tratado sobre manipulación de números y ecuaciones Según el diccionario, un algoritmo es un conjunto ordenado de operaciones matemáticas que permiten hallar la solución de un problema. Un algoritmo es un conjunto concreto de pasos o acciones que se deben realizar ordenadamente para llegar a un fin determinado (solución de un problema, obtención de una respuesta intermedia o realización de una tarea) de cualquier problema. Ahora que se conoce la definición de algoritmo, se puede redefinir el término programa como la implementación de un algoritmo determinado en un lenguaje de programación. El conocimiento del concepto de algoritmo es fundamental para todo programador ya que, en la tarea diaria de escribir programas para resolver problemas, antes debemos discutir y entender cuál es el algoritmo que los resuelve. Muchas veces, como programadores, nos encontraremos siguiendo los pasos de un algoritmo con lápiz y papel para entender su funcionamiento o probar su eficacia.
Características de los algoritmos. Las características fundamentales que de un algoritmo son:
Entrada. La entrada hace referencia a la información proporcionada al algoritmo, la cual debe sufrir un proceso para obtener los resultados. Un algoritmo tiene cero o más datos de entrada. Estos valores le son dados por medio de una instrucción o mandato que se debe cumplir al ejecutarse el algoritmo. Si no existen datos de entrada es porque una o más instrucciones generan los valores de partida, de los que hará uso el algoritmo para producir los datos o valores de salida.
��
Salida. Todo algoritmo debe proporcionar uno o más valores como resultado, una vez se ha ejecutado la secuencia de pasos que lo conforman.La salida es la respuesta dada por el algoritmo o el conjunto de valores que el programador espera se le proporcionen.Estos resultados pueden ser de cualquier tipo: uno o más valores numéricos, valores lógicos o caracteres, etc. La facilidad o complejidad de un algoritmo no la determinan la cantidad de datos que se desean obtener. Un algoritmo puede tener un alto grado de complejidad y, sin embargo, producir un solo valor como resultado.
Limitado o finito.Todo algoritmo debe tener un número de instrucciones que limitan el proceso en algún momento; es decir, la ejecución debe detenerse. No puede existir un algoritmo, por muy grande que sea o por muchos resultados que produzca, que se quede en forma indefinida ejecutando sus instrucciones o repitiendo la ejecución de un subconjunto de ellas.
Claridad (preciso).Todo el conjunto de pasos debe ser entendible y factible de realizar, de tal manera, que al hacer un seguimiento del algoritmo éste produzca siempre los resultados requeridos. No puede entonces existir incertidumbre en las acciones a tomar cuando se sigue la lógica (flujo del programa) del algoritmo.
Eficacia. Los pasos del algoritmo deben ser suficientes para lograr el cometido del algoritmo, es decir, el algoritmo debe ser eficaz.
Formas de representación. Como los algoritmos no están relacionados únicamente con la programación de computadoras, es necesario contar con métodos independientes para expresarlos y, por lo tanto, transmitirlos a otras personas. En la actualidad existen varias formas de expresar un algoritmo, como son, el lenguaje natural, el pseudocódigo, los diagramas de flujo, algunos diagramas del lenguaje de modelado UML, etc.
��
Descripción narrada. Es la descripción normal de un algoritmo, utilizando el lenguaje natural de las personas, sin utilizar ninguna técnica previamente definida.
Ejemplo:Enumerar los pasos para calcular suma de dos números. 1. Inicio. 2. Obtener (leer) el primer y el segundo número. 3. Sumar los dos números. 4. Almacenar (asignar) el resultado anterior en la variable suma. 5. Presentar (mostrar) el valor de la suma. 6. Fin
Diagrama de flujo. Es la representación de un algoritmo utilizando un conjunto de figuras geométricas (rombos, cuadrados, rectángulos, círculos, etc.) unidas y relacionadas por medio de segmentos de recta, con flechas que determinan el orden lógico de un algoritmo, en donde la forma de una figura geométrica indica la acción a seguir. Inicio / fin Entrada de datos Proceso Pantalla Impresora Decisión Conector Figura 4. Símbolos de un diagrama de flujo. ��
Los símbolos o bloques para diagramar existen en gran cantidad y de diversas formas. En la figura 4, se exponen algunos de ellos.
Ejemplo: Elaborar un diagrama de flujo para calcular la suma de dos números. Inicio
N1, N2
SUMA = N1 + N2
SUMA
Fin
Pseudocódigo. Consiste en una serie de normas sintácticas y gramaticales, parecidas a las de un lenguaje de programación, pero sin tanta rigidez, y con cierta libertad en el uso y en la combinación de las palabras.
Ejemplo: Diseñar un algoritmo utilizando pseudocódigos para calcular suma de dos números. Inicio Entero N1, N2, SUMA; Leer N1; Leer N2; SUMA = N1 + N2; Escribir SUMA; Fin ��
2.4. Valor de los símbolos en un modelo algorítmico Hasta debe estar clara la importancia de los algoritmos en la resolución de problemas a través de una computadora, pero como habrá podido observar en los ejemplos anteriores, en un algoritmo aparecen diferentes símbolos (las variables, por ejemplo), por lo que en esta sección nos ocuparemos de ellos, de su significado y cómo utilizarlos.
Datos y tipos de datos. El primer objetivo de toda computadora es el manejo de datos e información. Estos datos pueden ser las cifras de ventas de un supermercado o sus calificaciones de clase. La mayoría de las computadoras pueden trabajar con varios tipos (modos) de datos. Los algoritmos y programas correspondientes operan sobre estos tipos de datos. La acción de las instrucciones ejecutables de las computadoras se reflejan en cambios en los valores de las partidas de datos. Los datos de entrada se transforman por el programa, después de las etapas intermedias, en datos de salida. En el proceso de resolución de problemas el diseño de la estructura de datos es tan importante como el diseño del algoritmo y del programa que se basa en el mismo. Existen dos tipos de datos. Simples (sin estructura) y compuestos (estructurados). Los datos estructurados se estudian en el capítulo 6 y son conjuntos de partidas de datos simples con relaciones definidas entre ellos. Los distintos tipos de datos se representan en diferentes formas en la computadora. A nivel de máquina, un dato es un conjunto o secuencia de bits. Los lenguajes de alto nivel permiten basarse en abstracciones e ignorar los detalles de la representación interna. Aparece el concepto de tipo de datos, así como su representación. Los tipos de datos simples son los siguientes: ��
Datos numéricos. Es el conjunto de valores numéricos. Estos pueden representarse en dos formas distintas:
•
Numérico entero (int, integer). Es un subconjunto finito de los números enteros (negativos, cero, positivos). Ejemplos: 5, 0, -10, 1234, -9876. El entero máximo y mínimo que se puede representar depende de la cantidad de bits (o de bytes) que se utilicen (tamaño), así (tabla 1):
Rango de valores
Tamaño (bits)
Sin signo
Con signo
8
0 a 255
-128 a +127
16
0 a 65535
-32768 a +32767
32
0 a 4294967295
-2147483648 a +2147483647
Tabla 1. Tipo de datos enteros. Por ejemplo, si necesita una variable para guardar la edad de una persona bastará con utilizar un tipo de dato entero de 8 bits, pero si necesita ingresar su sueldo debería cambiar a una de 16 bits.
•
Numérico real (punto flotante). El tipo real consiste en un subconjunto de los números reales. Los números reales siempre tienen un punto decimal y pueden ser positivos o negativos. Un número real consta de un entero y una parte decimal. Los siguientes ejemplos son números reales: 0.05; 3.1416; -12.0; 3456.0; -2.71828. Otra forma de representar los números reales es la notación exponencial o científica y se utiliza para números muy grandes o muy pequeños. Ejemplos: 0.00045 = 0.45 x 10 -3 = 0.45E-3 ��
-2345678 = -0.2345678 x 107 = - 0.2345678E+7 Los tipos de datos reales a su vez pueden clasificarse en dos, como se puede apreciar en la tabla 2:
Tipo
Tamaño (bits)
Simple
32
Doble
64
Intervalo aproximado -3.4 × 10
a +3.4 × 10
±5,0 × 10 − a ±1,7 × 10
Tabla 2. Tipos de datos reales.
Datos tipo carácter y texto (cadena). Los datos de tipo carácter contienen un solo carácter, que puede ser:
•
Las letras del alfabeto de la A-a a la Z-z.
•
Los dígitos del 0 al 9.
•
Caracteres especiales como: +, -, *, /, %, etc.
Los datos de tipo carácter se representan en muchos lenguajes de programación comenzando y terminando con el apóstrofe ( ‘ ) de la siguiente manera: ‘A’, ‘7’, ‘$’, etc. Una cadena de caracteres es una sucesión de caracteres que se encuentran delimitados por un apóstrofe o por comillas dobles, según el tipo de lenguaje de programación. La longitud de una cadena de caracteres es el número de ellos comprendidos entre los separadores o limitadores. Ejemplos: “DIOS”; “SER COMO EL AGUIL.”; “ ”; “”.
Lógicos. El tipo lógico –también denominado booleano- es aquel que sólo puede tomar uno de dos valores: verdadero (true) o falso (false). Este tipo de datos se utiliza para representar alternativas (si/no) a determinadas condiciones. ��
Operadores y expresiones. Todos los símbolos que representan enlaces entre cada uno de los argumentos (operandos) que intervienen en una operación se llaman operadores, y se utilizan para construir expresiones. Las expresiones son combinaciones de constantes, variables, operadores, paréntesis y nombres de funciones especiales. Las mismas ideas son utilizadas en notación matemática tradicional; por ejemplo: π * r 2. Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas. Los operadores pueden ser:
Aritméticos. Para tratar los números se utilizan operadores aritméticos, que, junto con las variables numéricas forman expresiones aritméticas.
La tabla 3 resume los
operadores aritméticos:
Símbolo
Significado
+
Suma
-
Resta
*
Multiplicación
/
División (real)
^
Potenciación
DIV ( \ ) MOD ( % )
División (entera) Resto de la división
Tabla 3. Operadores aritméticos. ��
Ejemplos:
Expresión
Resultado
423 + 5
428
423 - 5
418
12 * 11
132
23 / 5
4.6
2^4
16
23 \ 5
4
23 % 5
3
Relacionales.Se utilizan para formar expresiones booleanas; es decir, expresiones que al ser evaluadas producen un valor booleano. En la tabla 4 se reúnen los distintos operadores relacionales.
Símbolo
Significado
<
Menor que
>
Mayor que
==
Igual que
<=
Menor o igual que
>=
Mayor o igual que
! = (<>)
Diferente
Tabla 4. Operadores relacionales. Ejemplos:
Expresión
Resultado
4<5
True
4>5
False
2 * 3 = = 5 +1
True
-2 <= 0
True ��
-1 >= 0
False
2 ! = -2
True
Lógicos. Combinan sus operandos de acuerdo con las reglas del cálculo proposicional (revisar U. A. Lógica Matemática) con el fin de producir un nuevo valor que se convierta en el valor de la expresión. La tabla 5 define los operadores lógicos.
Símbolo
Significado
AND
Conjunción
OR
Disyunción
NOT
Negación
Tabla 5. Operadores lógicos. Ejemplos:
Expresión
Resultado
True AND True
True
False OR False
False
NOT False
True
Prioridad de operadores. Antes de evaluar una expresión se debe tener presente que estas se deben sujetar a una jerarquía de operadores, esto evita que se produzcan ambigüedades en la ejecución de los cálculos. Con cada operador se asocia una prioridad; los operadores que tienen mayor prioridad se procesan primero y si existen varios operadores con la misma prioridad se continúa procesando de izquierda a derecha. La prioridad de los operadores a la hora de evaluar cualquier expresión es: ��
•
Paréntesis.
•
Potencias.
•
Productos y divisiones.
•
Sumas y restas.
•
Relacionales.
•
Lógicos.
Funciones internas, incorporadas o estándar Conforme aumenta la complejidad de los problemas que se trata de resolver por medio de algoritmos y posteriormente a través de programas, es necesario contar con operadores que permitan realizar una serie de operaciones que van más allá de las operaciones básicas de potenciación, multiplicación, división, suma y resta. Los operadores que se utilizan para efectuar operaciones de tipo complejo tales como: raíz cuadrada, valor absoluto, redondeo, etc., se denominan funciones internas, estándar o incorporadas y pueden recibir como argumentos1 expresiones, variables o constantes de tipo real o entero. A continuación se presenta un resumen de las principales funciones internas:
FUNCION abs (x) arctan (x) cos (x) exp (x) ln (x) log (x) round (x) 1
DESCRIPCIÓN Valor absoluto de x Arco tangente de x Coseno de x Exponencial de x Logaritmo natural de x Logaritmo en base 10 de x Redondeo de x
TIPO DE DATO DEL ARGUMENTO (X) Entero o real Entero o real Entero o real Entero o real Entero o real Entero o real Real
TIPO DE DATO DEL RESULTADO Entero o real Real Real Real Real Real Entero
Se denomina argumento al valor que se le pasa a una función con el fin de que dicha función pueda cumplir con su objetivo. ��
sen (x) sqr (x) sqrt (x) tan (x)
Seno de x Cuadrado de x Raíz cuadrada de x Tangente de x
Entero o real Entero o real Entero o real Entero o real
Real Real Real Real
Algunos ejemplos de utilización de funciones internas son:
EJEMPLO abs (-3) arctan (12.34) cos (0.7854) exp (3.1) in (20) log (15) round (3.75) sen (0.5236) sqr (6.2) sqrt (15.4) tan (15)
RESULTADO 3 1.899357 0.7061055 22.197913 2.9957323 1.176091259 4 0.5000011 38.44 3.9242834 -0.8559934
Evaluación de expresiones. Una vez que se conocen las reglas de prioridad asociadas con los operadores, la evaluación de las expresiones es muy fácil, simplemente se evalúa la expresión de izquierda a derecha para cada clase de operadores que estén presentes. Además se debe considerar la necesidad del uso de paréntesis para agrupar términos de una expresión, ejecutando primero los paréntesis más internos y luego los paréntesis más externos.
��
Ejercicios resueltos
Escribir un algoritmo que muestre los pasos necesarios para cambiar una llanta pinchada de un carro. Una posible solución sería: 1. Iniciar. 2. Sacar la llanta y herramientas de la maleta del carro. 3. Sacar la llanta pinchada. 4. Colocar la llanta buena. 5. Guardar la llanta pinchada y la herramienta. 6. Subirse al carro. 7. Reanudar el viaje. 8. Terminar.
Si se tiene la expresión: A * * 2 / 5 * B - 5 y los valores almacenados en A y B son 5 y 20, respectivamente, evaluar dicha expresión. 5 * * 2 = 25 25 / 5*20 = 100 100 - 5 = 95
Escriba la siguiente expresión algebraica como expresión algorítmica:
��
Solución: (A + B)/(C - A) + 20
Si las variables X, Z y L tienen almacenados los valores 23, 47 y V (true), respectivamente, escriba el resultado de cada una las expresiones:
��
Expresión
Resultado
(X > Z) OR (Z> 20)
V
(X < Z) AND ( ! (Z > 20))
F
( Z > 50 ) AND L
F
!L
F
(Z > 100) AND (X< 3) AND ( ! L )
F
Ejercicios propuestos 1) Haga un procedimiento que describa los pasos para cruzar una calle por un puente peatonal. 2) Describa los pasos necesarios para llevar una amiga(o) al cine. 3) Describa los pasos para cambiar una bombilla quemada. 4) Escribir un algoritmo para la búsqueda de una palabra en un diccionario. 5) Escribir un algoritmo para realizar un depósito bancario Considere dos casos: •
Sobre una Cuenta de Ahorro
•
Sobre una Cuenta Corriente
6) Escribir un algoritmo para encender un computador 7) Elabore un procedimiento que muestre los pasos necesarios para hacer una llamada telefónica, donde no se sabe el número del teléfono, pero sí el nombre de la persona. 8) Haga un procedimiento que muestre los pasos para cambiar la llanta pinchada de una bicicleta. 9) Muestre los pasos necesarios para hacer un desayuno de huevos duros, hasta servirlos. 10) Obtener el resultado de las siguientes expresiones: a) 4.5/2 – (2+4) b) 8 / 3 div 4 – 2 c) 6 * -(2 – 9)/3 d) round (5 + 4 * mod –5 + abs (2 *3 + (6 div – 2))) e) 6/3*2/ -A/sqr(3)/3n B/2*4+(7div C)+(7 Mod C) Si A=4,B=7 y C = 2 f) (1.5<2) o (2>6) ��
g) (4 es impar) y (`A´ >`B´) o (5>2) y no ((2>3) y (4<2)) h) z – ((j mod 3) + y )) < (4n (8 mod 3)) Si z= -3 E –2, j= -2, y=-2.87 i) trunc (- (3 *z + x)) / (5 mod i) <=(z –x /10) n (1 / 2) Si z =-0.8 E –2, i =8 y x = -11.5 j) no (1.87>x)y(x>=z+(sqrt(49)mod4)) Si x vale 7 y z= round (ln(20)) 11) Escriba las siguientes expresiones algebraicas como expresiones algorítmicas: a. X 2
+
b
+
d.
−
b. X
4YZ (b2 2a
g. (A 3 ) 2
−
−
4ac)
+
Z
Y
+
3X 5
+
4Y
e. 4 π 3
2 c. 4 X
2X c−d
f. A
BC
÷
−
÷
+
8
( D )3
BC DE
12) Escriba las siguientes expresiones algorítmicas como expresiones algebraicas: a. B * *2 c. (A
+
−
X *Y
B) / ( C
−
b. 5 * X * *2 A)
d. X * Y
+
−
X * *3 * 5
Y * *(1 / 2)
13) Si el valor interno de la variable A = 4, el de B = 5, de C = 1. Muestre cuáles son los valores impresos en el siguiente algoritmo. INICIO X = B * A - B **2/4 * C; Y = A * B/3 ** 2; Z = (((B + C) /2 * A + 10) * 3 * B) – 6; Escribir X, Y, Z; FIN_INICIO 14) Haga un seguimiento del siguiente algoritmo y diga qué valores se muestran en las variables P, R y S. (Use los valores definidos en 9) INICIO P = A ** (1/2) ** B; R = A * B + A ** (1/2); S = B * A - B ** 2 / 4 * C; Escribir P, R, S; FIN_INICIO ��
CAPÍTULO 3 ESTRUCTURAS E INSTRUCCIONES EN LA PROGRAMACIÓN ESTRUCTURADA En la actualidad, dado el tamaño considerable de las memorias centrales y las altas velocidades de los procesadores, el estilo de escritura de los programas se vuelve una de las características más sobresalientes en las técnicas de programación. La legibilidad de los algoritmos y posteriormente de los programas exige que su diseño sea fácil de comprender y su flujo lógico fácil de seguir. La programación modular enseña la descomposición de un programa en módulos más simples de programar, y la programación estructurada permite la escritura de programas fáciles de leer y modificar. En un programa estructurado el flujo lógico se gobierna por las estructuras de control básicas: 1. Secuenciales. 2. Selección (condición). 3. Repetitivas (iterativas). En este capítulo se introducen los tres tipos estructuras, representando losa algoritmos mediantepseudocódigo y diagramas de flujo, aunque se presta más atención a los segundos. El término flujo de control se refiere al orden en que se ejecutan las sentencias del programa. Otros términos utilizados son secuenciación y control de flujo. A menos que se especifique expresamente, el flujo normal de control de todos los programas es el secuencial. Este término significa que las sentencias se ejecutan en secuencia, una después de otra, en el orden en que se sitúan dentro del programa. Las estructuras de selección, repetición e invocación permiten que el flujo secuencial del programa sea modificado en un modo preciso y definido con anterioridad.
Como se puede deducir fácilmente, las
estructuras de selección se utilizan para seleccionar cuáles sentencias se han de ejecutar a
��
continuación y las estructuras de repetición (repetitivas o iterativas) se utilizan para repetir un conjunto de sentencias.
3.1. Algoritmos básicos Como ya se indicaba antes, la forma más elemental de escribir un programa es secuencialmente. Una estructura secuencial es aquella en la que la acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el final del proceso. Su representación se muestra en la figura 5.
Acción1
Acción2
AcciónN
Figura 5. Estructura secuencial. Como parte del algoritmo encontraremos algunos bloques constructivos. A continuación se presentan algunos de ellos para el caso de diseñar un diagrama de flujo:
Asignación. Se utiliza para indicar una acción o proceso, generalmente la asignación de un valor o un resultado de una operación a una variable. Ejemplo (figura 6): Tenga presente que puede asignar a una variable un valor, una constante, otra variable o una expresión. El lado izquierdo de un enunciado de asignación siempre será una variable y el lado derecho corresponde al nuevo valor que tendrá dicha variable. ��
Pseudocódigo: Variable valor
Variable = valor
Variable = valor;
Figura 6. Asignación. Por otro lado, en una asignación solamente la parte izquierda cambia de valor, las variables de la parte derecha conservan sus valores, después de ejecutarse el enunciado y se pueden utilizar más tarde. Cuando la variable de la izquierda se encuentra también en la derecha formando parte de una expresión, esta variable cambia de valor tanto en la izquierda como en la derecha después de ejecutarse la asignación.
Por ejemplo, en la asignación SUELDO =
SUELDO + BONIFICACION; el nuevo valor de la variable SUELDO será el resultado de sumar el valor actual de SUELDO más el valor de la BONIFICACION.
Entrada de datos (Leer). Para introducir datos al computador se utiliza el siguiente bloque, que representa el teclado (figura 7). La variable que se va a leer se coloca dentro del símbolo y en caso de ser más de una variables, se separan con comas.
Pseudocódigo: Variable
Tipo_dato variable; //Primero declarar la variable Leer Variable;
Figura 7. Entrada de datos.
Salida de datos (Escribir). Para la salida de información procesada del computador, se puede utilizar el bloque de impresión o el de pantalla (figura 8). Si desea imprimir o mostrar en la pantalla un mensaje, debe escribir éste dentro del bloque y entre comillas, mientras que si la salida corresponde al contenido de una variable, debe escribirla normalmente, y en caso de ser varias, separarlas con comas. ��
Pseudocódigo: “Mensaje”
“Mensaje”
Escribir “Mensaje”; Escribir Var1, Var2;
Var1, Var2
Var1, Var2
Figura 8. Salida de datos.
3.2. Ejemplos de algoritmos básicos sin toma de decisiones
Elabore un algoritmo para calcular el área de un triángulo (figura 9). Inicio “Área de un triángulo”
INICIO Entero B, H, A; Escribir “Área de un triángulo”; Escribir “Ingrese base y altura”; A = ( B * H ) / 2;
“Ingrese base y altura”
Escribir “Área del triángulo: ”, A; FIN_INICIO
B, H A=(B*H)/2
����� ��� ���������� �� �
Fin
Figura 9. Ejemplo: Área de un triángulo.
Elabore un algoritmo que permita al usuario introducir a través del teclado dos números en las variables A y B, e imprimirlas. Luego, intercambiar los valores de las variables e imprimir el contenido final de las variables (figura 10). ��
Inicio
INICIO Entero B, A, aux;
“Intercambio de variables”
Escribir “Intercambio de variables”; Escribir “Ingrese A y B”;
“Ingrese A y B”
Leer A, B; Escribir “Contenido original: ”, A, B;
A, B
Aux = A; A = B; B = Aux;
���������� ��������� �� �� �
Escribir “Luego de intercambio: ”, A, B; FIN_INICIO
Aux = A A=B B = Aux
������ �� ������������ �� �� �
Fin
Figura 10. Ejemplo: Intercambio de variables.
3.3. Estructuras de decisión lógica (representación y funcionamiento) La especificación de algoritmos tiene realmente utilidad cuando el algoritmo requiere una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existen un número de posibles alternativas resultantes de la evaluación de una determinada condición. Las estructuras selectivas se utilizan para tomar decisiones lógicas; de ahí que se suelan denominar también estructuras de decisión o alternativas. En las estructuras selectivas se evalúa una condición y en función del resultado de la misma se realiza una opción u otra. Las condiciones se especifican usando expresiones lógicas. La representación de una estructura selectiva se hace con una figura geométrica en forma de rombo (su significado es si, entonces, sino). Las estructuras selectivas o alternativas pueden presentarse de varias formas: ��
La estructura alternativa simple (si-entonces, if-then) ejecuta una determinada acción o acciones cuando se cumple una determinada condición (true). Su representación gráfica se muestra en la figura 11.
Pseudocódigo: No
Condición
SI ( Condición ) ENTONCES Acciones; FIN_SI
Si Acciones
Figura 11. Condicional simple
La estructura anterior es muy limitada y normalmente necesitará una estructura que permita elegir entre dos opciones o alternativas posibles, en función del cumplimiento o no de una determinada condición (si entonces, caso contrario; ifthen, else). Si la condición es verdadera se ejecutarán ciertas acciones y, si es falsa, se ejecutarán otras acciones (figura 12).
Si
Condición
No
Acciones 1
Acciones 2
Pseudocódigo: SI ( Condición ) ENTONCES Acciones 1; SINO Acciones 2; FIN_SI
Figura 12. Condicional doble. ��
Si dentro de una de las alternativas del bloque de decisión, existen otros bloques de decisión, se tiene un bloque de decisión anidado (figura 13). La introducción dentro de una alternativa de otros bloques de decisión nos permite probar múltiples condiciones para escoger una determinada alternativa.
Condi1
No
Si Si
Condi2
Acciones 1
No Acciones 2
Acciones 3
Acciones 4
Figura 13. Bloque de decisión anidada.
También podemos utilizar bloques de decisión cuyas condiciones están constituidas por condiciones simples, relacionadas mediante los operadores lógicos And, Or y Not. Estos bloques se denominan condiciones compuestas (figura 14).
Si
Condición1 AND/OR Condición2
No Acciones 2
Acciones 1
Figura 14. Condiciones compuestas. ��
3.4. Ciclos MIENTRAS (while) Las computadoras están especialmente diseñadas para todas aquellas aplicaciones en las cuales una operación o conjunto de ellas deben repetirse muchas veces. Un tipo muy importante de estructura es el algoritmo necesario para repetir una o varias acciones un número determinado de veces. Un programa que lee una lista de números puede repetir la misma secuencia de mensajes al usuario e instrucciones de lectura hasta que todos los números se hayan leído. Las estructuras que repiten una secuencia de instrucciones un número determinado de veces se denominan bucles, lazos o ciclos de repetición, y se denomina iteración al hecho de repetir la ejecución de una secuencia de acciones. La estructura repetitiva mientras (while) es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la instrucción mientras, la primera cosa que sucede es que se evalúa la condición (una expresión booleana). Si se evalúa false, no se toma ninguna acción y el programa prosigue en la siguiente instrucción del bucle. Si la expresión booleana es verdadera, entonces se ejecuta el cuerpo del bucle, después de lo cual se evalúa de nuevo la expresión booleana. Este proceso se repite una y otra vez mientras la expresión booleana (condición) sea verdadera. La figura 15 ilustra un ciclo mientras como diagrama de flujo y pseudocódigo.
Pseudocódigo: No
Condición
Mientras ( Condición ) Acciones FIN_MIENTRAS
Si Acciones (repetir)
Figura 15. Ciclo mientras. ��
Además de entender el funcionamiento de los ciclos, son necesarios algunos conceptos:
Variables tipo contador. Muchas veces en los procesos repetitivos es necesario hacer el conteo de sucesos o acciones internas del ciclo; este proceso de conteo se hace con una variable que se va incrementando cada vez que el ciclo se repite. El contador es una variable que se incrementa o disminuye en un valor constante cada que ocurre una acción o suceso. La forma general de los contadores es la siguiente: CONTADOR = CONTADOR + Como el contador aparece al lado derecho en la expresión, antes de usarse se le debe dar un valor que borre lo que había en la dirección de memoria asignada a la variable utilizada. Esa orden de borrado debe indicarse una vez; por lo tanto, debe estar antes de activar el ciclo donde se necesite el contador, de lo contrario se repetirá la orden de borrado cada vez que se repite el ciclo. Una orden de borrado puede ser: CONTADOR = 0.
Variables tipo acumulador. Un acumulador o totalizador es una variable cuya misión es almacenar cantidades variables resultantes de procesos sucesivos. La diferencia con el contador radica en que el incremento o disminución de cada suma es variable en lugar de constante, como en el caso del contador. La forma general del acumulador es: ACUMULADOR = ACUMULADOR + Como también aparece al lado derecho, antes de utilizarlo se hace necesario asignarle un valor inicial, por ejemplo: ACUMULADOR = 0. ��
Variables tipo bandera. La bandera es una variable que generalmente usa dos valores excluyentes o diferentes, su contenido es uno cualquiera de dos valores definidos por el programador, el cual ordena cuando cambia su contenido. La bandera es utilizada dentro de la programación como un seleccionador de una de dos alternativas a seguir dentro del algoritmo. Antes de llegar a la expresión que se utilice para bifurcar la ejecución, la bandera debe tener asignado uno de los dos valores. Los valores escogidos para la bandera pueden ser de cualquier tipo de dato, por ejemplo:numérico (0 y 1, 1 y 2, etc.), lógico True y False, carácter o texto (‘S’ y ‘N’, “SI” y “NO”, ‘0’ y ‘1’, “ENCONTRADO” y “NO ENCONTRADO”).
Esquema cuantitativo. Es utilizado cuando se conoce el número de veces que debe repetirse un ciclo determinado, antes de activarse la estructura repetitiva. El número de iteraciones puede ser un valor constante o, generalmente, una variable de entrada cuyo valor es proporcionado al algoritmo antes de activarse el ciclo.
Esquema cualitativo. Este esquema es utilizado cuando no se conoce el número de veces que debe repetirse la secuencia de un determinado ciclo. En esta clase de ciclo el usuario decide cuándo terminar con el proceso repetitivo sin importar cuantas iteraciones se hayan efectuado; a diferencia de los ciclos anteriores, en donde el número de iteraciones está determinado desde el principio.
Ruptura de ciclos. Dentro de la programación, algunas veces, es necesario hacer que un ciclo se detenga abruptamente (aborte), porque ya se cumplió algo que se necesitaba o se estaba buscando, por lo que, posiblemente, no se alcance a satisfacer completamente en una forma normal la culminación de la cantidad de veces que debe ejecutarse o repetirse un ciclo. La ruptura se hace cambiando el sentido de la expresión lógica que controla el ciclo, para que ésta sea falsa y no se continúe ejecutando la secuencia de instrucciones. ��
3.5. Estructuras adicionales Aunque cualquier programa apropiado se puede elaborar utilizando solamente las tres estructuras básicas de control descritas antes, el uso de éstas se convierte en soluciones particulares de la implementación de la estructura decisión lógica o mientras. Es necesario analizar en cuáles de estos casos particulares se puede utilizar la estructura adicional, teniendo en cuenta que lo que ellas hagan también se puede solucionar con una de las estructuras básicas.
Estructura caso o selección múltiple (case, switch). Esta estructura permite seleccionar una, dentro de un conjunto de alternativas, con base en el valor almacenado en un campo variable denominado selector o campo controlador de la estructura. Es una estructura selectiva múltiple donde, de acuerdo con el valor que tenga el controlador, se realiza una determinada tarea una sola vez, es decir, no repite la ejecución de la tarea o secuencia. De acuerdo al valor que tenga el controlador el control de ejecución del programa pasa a uno de varios puntos de éste, evitando así una serie de preguntas (estructura decisión lógica o un anidamiento de las mismas). Al llegar a la estructura se evalúa el valor almacenado en la variable utilizada como controlador, para determinar cuál de las secuencias se efectúa. Una secuencia se ejecutará sí, y sólo sí, uno de los rótulos (casos) correspondientes coincide con el valor actual del controlador. Por tanto, el valor actual del controlador determina cuál de las secuencias se va a ejecutar. Si el valor del controlador no coincide con ninguno de los rótulos descritos y la secuencia por defecto está presente, entonces ésta será ejecutada. Si esta secuencia no está presente (es opcional usarla) y el valor del controlador no coincide con ninguno de los rótulos, no será ejecutada ninguna de las secuencias; por lo tanto, continuará con la estructura siguiente.
��
En forma general se puede decir, que si el valor del controlador es i, se ejecutará una sola vez la secuencia correspondiente al caso i y que la secuencia por defecto se ejecutará si está presente, para cualquier valor del controlador que no coincida con ningún caso. La figura 16 muestra la forma de representar una estructura de selección múltiple a través de un diagrama de flujo.
Variable
Val_1 Acciones1
Val_2 Acciones2
ValN AccionesN
[Default] AccionesD
Figura 16. Estructura caso o selección múltiple. Ciclo PARA (for). La estructura PARA permite que una o más instrucciones (secuencia) se repitan cero o más veces, mientras los valores de una progresión aritmética de razón creciente o decreciente se vayan asignando a una variable denominada variable de control del ciclo PARA. El control del ciclo se hace en forma automática con base en parámetros que establece el programador. La diferencia como se implementa esta clase de ciclos con la estructura mientras, es que el PARA maneja la inicialización del contador y su incremento en forma automática, es decir, lo hace la estructura. En la figura 17 se puede observar la representación de la estructura PARA. ��
Var = VI ;condi ; inc
Acciones (repetir)
Figura 17.Ciclo PARA (for). Ciclo Hacer mientras que (do-while). Esta es otra estructura repetitiva de control que es implementada para efectuar un ciclo. Es parecida a la estructura mientras y en algunos aspectos se complementan. Se utiliza en situaciones en las que se desea que una secuencia se repita, al menos una vez, antes de comprobar la condición de repetición y está formada por dos partes: una expresión de tipo lógico y la secuencia de instrucciones, donde una de ellas debe estar modificando la expresión. La diferencia especial entre la estructura hacer mientras que y la estructura mientras es que en la primera la secuencia de instrucciones se ejecuta por lo menos una vez, antes de evaluar la condición de repetición y, en la estructura mientras la condición de terminación es evaluada primero y, por lo tanto, el grupo de instrucciones o campo de la sentencia puede ser o no ejecutado. Al entrar a la estructura se ejecuta la secuencia de instrucciones una vez y se evalúa la condición; si ésta es falsa, se sale de la estructura y continúa con la instrucción siguiente; y si es verdadera, se repite la ejecución de la secuencia y vuelve a evaluar la condición; el proceso se repite mientras que la condición sea verdadera. ��
La secuencia, entonces, se ejecutará repetidamente mientras que la expresión lógica sea cierta, asegurándose que la secuencia se ejecuta por lo menos una vez. Las instrucciones no se repiten cuando la condición es falsa. En la siguiente figura (18) se muestra la representación del ciclo hacer-mientras.
Acciones (repetir)
Si
Condición
No Figura 18.Ciclo hacer-mientras que (do-while).
Ejercicios resueltos
Elaborar un algoritmo que, dados los dos lados diferentes de un rectángulo, encuentre el perímetro y el área del mismo. INICIO Entero L1, L2, P, A; Leer L1, L2; P = 2 * L1 + 2 * L2; A = L1 * L2; Escribir“EL PERIMETRO ES:”, P; Escribir“EL AREA ES:”, A; FIN_INICIO ��
A la mamá de Juan le preguntan su edad, y contesta: tengo 3 hijos, pregúntele a Juan su edad. Alberto tiene 2/3 de la edad de Juan, Ana tiene 4/3 de la edad de Juan y mi edad es la suma de las tres. Hacer un algoritmo que muestre la edad de los cuatro. INICIO LeerEDJUAN; EDALBER = 2 * EDJUAN / 3; EDANA = 4 * EDJUAN / 3; EDMAMA = EDJUAN + EDALBER + EDANA; Escribir“LAS EDADES SON: ALBERTO =”, EDALBER, “JUAN =”, EDJUAN, “ANA =”, EDANA, “MAMA =”, EDMAMA; FIN_INICIO
Hacer un algoritmo que, dados dos valores numéricos A y B, escriba un mensaje diciendo si A es mayor, menor o igual a B. INICIO LeerA, B; SI ( A> B ) ENTONCES Escribir “A ES MAYOR QUE B”; SINO SI ( A = = B ) ENTONCES Escribir “A ES IGUAL A B”; SINO Escribir “A ES MENOR QUE B”; FIN_SI FIN_SI FIN_INICIO
��
Escribir las estructuras que calculen y muestren el valor de X, de acuerdo con lo siguiente: X=0
si
Y < A y (A< B < C)
X=1
si
A <= Y < B
X=2
si
B <= Y < C
X=3
si
C <= Y
X = 4 si no se cumple ninguna de las condiciones anteriores. SI ( (Y< A) AND ((A < B) AND (B < C)) ) ENTONCES X = 0; SINO SI ( (A < = Y) AND (Y < B) ) ENTONCES X = 1; SINO SI ( (B < = Y) AND (Y < C) ) ENTONCES X = 2; SINO SI (C < = Y) ENTONCES X = 3; SINO X = 4; FIN_SI FIN_SI FIN_SI FIN_SI Escribir X;
��
Diseñar un algoritmo que encuentre la suma de los primeros cinco números naturales. INICIO NUM=0;
(1) Inicializa el contador
SUMA=0;
(2) Inicializa el acumulador
Mientras ( NUM< 5 ) NUM=NUM+1;
(3) Modifica la expresión
SUMA=SUMA+NUM;
(4) Actualiza el acumulador
FIN_MIENTRAS Escribir "LA SUMA ES:", SUMA; (5) Termina el ciclo cuando NUM = 5 FIN_INICIO
Elaborar un algoritmo que genere los primeros N términos de la sucesión: 17 15 18 16 19 17 20 18 21... INICIO Leer NT; TER = 17; CONT =1; BAN = 1; Mientras ( CONT<= NT ) EscribirTER; SI ( BAN == 1 ) ENTONCES TER = TER – 2; BAN = 2; SINO TER = TER + 3; BAN = 1; FIN_SI CONT=CONT + 1; FIN_MIENTRAS FIN_INICIO ��
Ejercicios propuestos 1) Hacer un seguimiento (prueba de escritorio) del siguiente grupo de instrucciones. INICIO SUMA = 0; X = 20; SUMA = SUMA + X; Y = 40; X = X + Y ** 2; SUMA = SUMA + X / Y; Escribir“EL VALOR DE LA SUMA ES:”, SUMA; FIN_INICIO 2) Escriba un algoritmo que, dados dos valores A y B, encuentre: A – B, A + B, A * B y A / B 3) Elabore un algoritmo que lea un número y obtenga su cuadrado y su cubo. 4) Elabore un algoritmo que lea un número negativo e imprima el número y el positivo del mismo. 5) Diseñe un algoritmo que entre la ordenada (Y) y la abscisa (X) de un punto de un plano cartesiano y, determine si pertenece o no a la recta Y = 3X + 5. 6) Una frutería ofrece las manzanas con descuento según la siguiente tabla: No. de manzanas compradas
% descuento
0–2
0%
3–5
10%
6 – 10
15%
11 en adelante
20%
Determinar cuánto pagará una persona que compre manzanas en esa frutería.
��
7) Un proveedor de computadores ofrece descuento del 10%, si cuesta $1 000 o más. Además, independientemente, ofrece el 5% de descuento si la marca es ABACO. Determinar cuánto pagará, con IVA incluido, un cliente cualquiera por la compra de una computadora. 8) Elaborar un algoritmo que encuentre el mayor valor entre un grupo de datos positivos. 9) Hacer un algoritmo que encuentre la suma de los valores mayor y menor entre un grupo de datos positivos. 10) Elaborar un algoritmo que encuentre el factorial de los números comprendidos entre 1 y N. 11) Escribir un programa pseudocódigo que calcule e imprima en pantalla el cuadrado de 243 y la raíz cuadrada de 256. 12) Escribir un programa en pseudocódigo que lea desde teclado dos números e imprima su suma y resta. 13) Escribir un programa en pseudocódigo para determinar el área y el volumen de un cilindro, cuyas dimensiones radio y altura se leen desde teclado. Considere las fórmulas: V = π* R² * H y A = 2 * π* R² 14) Escribir un programa en pseudocódigo para calcular el valor de la hipotenusa de un triángulo rectángulo aplicando el teorema de Pitágoras. Los valores de los catetos deben ingresarse desde el teclado. 15) Escribir un programa en pseudocódigo que permita obtener la edad de una persona en meses, dada su edad años y meses. 16) Escribir un programa en pseudocódigo que permita calcular el área de unos rectángulos dados su largo y su ancho. 17) Escribir un programa en pseudocódigo que permite convertir una longitud dada en metros a pies (1 metro = 3.28 pies) 18) Escribir un programa en pseudocódigo que permita expresar en horas, minutos y segundos una cantidad de segundos ingresados por teclado 19) Escribir un programa en pseudocódigo que permita obtener el valor en, pesos colombianos, libras esterlinas y marco alemanes, de una cantidad de dólares ingresadas por teclado. Alimente al programa las cotizaciones actuales. ��
20) Escribir un programa en pseudocódigo que calcula la masa del aire de un neumático de automóvil utilizando la fórmula: M = (P * V) / (T + 460) * 0.37, donde: P es la presión es psi, V es el volumen en pies cúbicos, T la temperatura en grados Fahrenheit y M es la masa del aire en libras. 21) Escribir un programa en pseudocódigo que permita calcular el espacio que recorre una persona en un tiempo dado T a una velocidad constante V, aplicando la fórmula: E = V * T, donde: Y es el espacio recorrido por la persona en metros por segundo y T es el tiempo empleado en segundos. 22) Escribir un programa en pseudocódigo que lea el peso actual, las calorías quemadas por día, las calorías ingeridas por día y el peso deseado por una persona. Todo esto para calcular e imprimir el número de días que tardará la persona en alcanzar el peso deseado mediante la relación: 3000 calorías corresponden a 1 libraperdida. 23) ¿Qué visualizará y cuántas veces se ejecuta el siguiente bucle? i← 1; Mientras
(i<6) do
Inicio Escribir
(i);
i←i + 1; Fin;
24) Escribir un programa en pseudocódigo que lea un caracter desde el teclado y deduzca si está situado antes o después de la letra `m´ en orden alfabético. 25) Escribir un programa en pseudocódigo que lea dos caracteres y deduzcan si están en orden alfabético. 26) Escribir un programa en pseudocódigo que permita contar el número de letras `i´ que se encuentran en una frase que se ingresa caracter por caracter a través del teclado terminado con un punto. 27) Escribir un programa en pseudocódigo para calcular independientemente la suma de los números pares impares comprendidos entre 1 y 100. 28) Escribir un programa en pseudocódigo para generar los n primeros términos de la serie de Fibonacci (1, 1, 2, 3, 5, 8, 13, etc). 29) Considerar que la serie de Fibonacci se define de la siguiente manera: ��
30) El primer elemento de la serie es una unidad (1) 31) Los demás elementos se forman de la siguiente manera: 1 = 1 + 0 2 = 1 + 1 3 = 2 + 1 5 = 3 + 2 8 = 5 + 3 13 = 8 + 5 ............................. an = an-1 + an-2 32) Escribir un programa en pseudocódigo que permita calcular los múltiplos de 4 comprendidos entre 4 y n. donde n es un valor límite ingresado por teclado. 33) Escribir un programa en pseudocódigo que acepte 10 números enteros por teclado, visualice la suma de los números pares ingresados, cuántos números pares existen en la lista y cuál es la medida aritmética de los números impares. 34) Escribir un programa en pseudocódigo para imprimir las 30 primeras potencias de 4 (41, 42, 43, etc.) 35) Escribir un programa en pseudocódigo que permita leer sólo los números que representen a un mes. 36) Escribir un programa en pseudocódigo que permita leer tres números desde el teclado y reduzca si han sido ingresados en forma ascendente (de menor a mayor). 37) Escribir un programa en pseudocódigo para que lea dos números enteros y obtenga su coeficiente y resto aplicando el método de restas sucesivas. No utilice las funciones div ni mod. 38) Escribir un programa en pseudocódigo que permita obtener las tablas de multiplicar de los números dígitos mediante bucles anidados. 39) Escribir un programa en pseudocódigo para convertir las calificaciones alfabéticas A, B, C, D o E a las calificaciones numéricas 4, 5, 6, 7, 8 respectivamente. 40) Escribir un programa en pseudocódigo que permita leer por teclado un número comprendido entre 1 y 10 (inclusive) y que deduzca si es par o impar. ��
41) Escribir un programa en pseudocódigo que permita calcular la hora que será dentro de un segundo, a partir de una hora introducida por teclado en el siguiente formato: H: horas, M: horas, M: minutos y S: segundos. 42) Escribir un programa en pseudocódigo que efectúe la suma de dos números leídos desde el teclado en función de la respuesta S/N al mensaje ´Desea sumar (S) o restar (R) ´. 43) Escribir un programa en pseudocódigo para leer un dato numérico comprendido solo entre 1 y 5 (incluidos). Este algoritmo es útil para seleccionar opciones de menú. 44) Escribir un programa en pseudocódigo que permita repetir continuamente la frase `Desea continuar < S/N >´ hasta que la entrada por teclado sea S o N. 45) Escribir un programa en pseudocódigo para calcular los cuadrados de una serie de números ingresados por teclado y deducir cuántos números se han leído. 46) Escribir un programa en pseudocódigo para leer las edades de los alumnos de una clase y calcular su media. Para terminar el usuario deberá ingresar la edad 0 (cero). 47) Escribir un programa en pseudocódigo para calcular la raíz cuadrada de los números ingresados por teclado. Si es positivo visualizar el resultado, caso contrario visualizar el mensaje `raíz imaginaria ´ y visualizar su valor. Para terminar el usuario debe ingresar 0 (cero).
��
CAPÍTULO 4 INTRODUCCIÓN AL FRAMEWORK DE .NET En este capítulo veremos cuáles son los principales conceptos que demos conocer para iniciar como programadores .NET. Para dar los primeros pasos, comenzaremos por analizar las principales características que nos ofrece la plataforma de desarrollo .NET. Nos introduciremos en el conocimiento de las herramientas y conceptos con los cuales tendremos que familiarizarnos para empezar a desarrollar. También conoceremos las herramientas, características y funciones del entorno de desarrollo con que trabajaremos, así como también las instrucciones básicas para realizar nuestras primeras aplicaciones en modo consola.
4.1. La plataforma .NET Para llegar a convertirse en un desarrollador de software, no puede omitir ningún concepto; por ese motivo comenzaremos por conocer cuáles son los componentes que ofrece la tecnología con la cual vamos a trabajar. Microsoft .NET es una plataforma de desarrollo y ejecución de aplicaciones de software; es decir, proporciona los elementos necesarios para el desarrollo de aplicaciones de software, y todos los mecanismos de seguridad y eficiencia para asegurar su óptima ejecución. Veamos a continuación cuáles son algunas de sus principales características:
��
Las aplicaciones .NET se ejecutan en un entorno aislado del sistema operativo denominado “runtime”, lo que lo hace flexible, seguro y portable.
Es 100% orientado a objetos.
Permite desarrollar aplicaciones en más de un lenguaje de programación.
Está diseñado para permitir el desarrollo de aplicaciones corporativas complejas, robustas y flexibles.
Proporciona un único modelo de programación consistente para el desarrollo de diferentes modelos de aplicaciones (Windows, Web, de consola, móviles) y para diferentes dispositivos de hardware.
Puede integrarse fácilmente con las aplicaciones desarrolladas en modelos anteriores.
Integra aplicaciones de otras plataformas y sistemas operativos.
4.1.1. Componentes del Framework de .NET Los principales elementos que constituyen la plataforma .NET se pueden observar en la figura 19.
Figura 19. Componentes del framework de .NET. ��
El entorno de ejecución de aplicaciones o runtime es el denominado CommonLanguageRutime (CLR). Entre sus principales funciones, se ocupa de:
•
Administrar la memoria de forma inteligente: Esto significa liberar y controlar la memoria de manera automática.
•
Realizar el aislamiento de aplicaciones: Si una aplicación deja de funcionar, no afecta a otra en ejecución ni al sistema.
•
Brindar seguridad en la ejecución de los componentes: Basa su ejecución en la información proporcionada por ellos (metadatos), que indica cómo debe ejecutarse, qué versión utilizar y bajo qué contexto de seguridad, entre otras cosas.
•
Generar código nativo: La ejecución de los componentes se realiza con un compilador Just In Time (JIT), que traduce los componentes al código nativo según la CPU en que se encuentre, y los ejecuta en su entorno.
Base Class Library (BCL) o biblioteca base. Proporciona todos los componentes y clases necesarios para el desarrollo de aplicaciones en la plataforma. Éstos incluyen la mayoría de las funcionalidades que los programadores aplican de manera cotidiana y, además, un conjunto de clases específicas de acuerdo con la tecnología que se va a utilizar en la creación de aplicaciones. Todos estos componentes están divididos en tres grupos principales:
•
Windows Forms.
•
ASP.NET y Servicios Web XML.
•
ADO.NET.
Lenguaje de programación y compiladores.
Los lenguajes de programación
permiten el desarrollo de aplicaciones sobre la plataforma .NET. Hacen uso de las ��
especificaciones del CLR y de las BCL para el desarrollo de las aplicaciones, y siguen un estándar denominado CommonLanguageSpecification (CLS), lo que hace que sean completamente compatibles entre sí. Existen muchos lenguajes para programar en .NET, como Visual Basic .NET, C# (CSharp), NET.COBOL, y otros.
Dado que el CLS es una especificación abierta,
cualquier lenguaje que cumpla con ella puede ser utilizado para desarrollar en .NET.
Herramientas y documentación. .NET proporciona un conjunto de utilitarios y herramientas de desarrollo que simplifican el proceso de creación de aplicaciones, así como también, documentación y guías de arquitectura, que describen mejores prácticas de diseño, prueba e instalación de aplicaciones .NET.
4.1.2. Compilación y el MSIL Luego de escribir el código fuente de nuestro programa, falta un paso más para poder ejecutarlo y ver nuestro trabajo funcionando: la compilación. Este es el proceso por el cual el código fuente (C#, Visual Basic .NET, etc.) se transforma en código que pueda ser entendido por la máquina. En .NET el resultado de la compilación es un poco diferente (figura 20). Cuando compilamos un programa escrito en este lenguaje, el resultado no es código de máquina sino código en un lenguaje intermedio creado para la plataforma .NET. Este lenguaje se denomina MSIL (Microsoft IntermediateLanguage o lenguaje intermedio de Microsoft), que se asemeja mucho a un código en ensamblador. El código MSIL generado se almacena en un archivo denominado ensamblado (assembly). En Windows los ensamblados ejecutables tienen extensión exe, y los que son bibliotecas de claseso de controles tienen extensión dll.
��
Figura 20. Compilación estándar y .NET. Como MSIL es independiente de la plataforma, se logra una ventaja fundamental: no dejar atado el programa compilado a una plataforma dada. Luego, al momento de ejecutar el programa, el CLR se ocupa de leer el código MSIL y de convertirlo en código propio de la máquina en la que se va a ejecutar. Para compilar, el CLR se vale del JIT-Compiler. El JIT se encarga de hacer la compilación final; es decir, los assemblies generados son tomados por el JIT del CLR, traducidos a código nativo de la CPU en la que se encuentra y ejecutados en un ambiente aislado dentro del CLR (figura 21).
Figura 21. Esquema de ejecución del CLR. ��
4.1.3. Entorno de desarrollo para aplicaciones de consola Para que la creación de aplicaciones en .NET sea lo más productiva posible, Microsoft ofrece su propio entorno de desarrollo: Visual Studio. Se trata de un IDE preparado para aprovechar todas las características del framework .NET y darle al programador un entorno único desde donde realizar todas sus tareas. Un IDE (IntegratedDevelopmentEnvironment) es un espacio de trabajo que proporciona un conjunto de menús, toolbars y ventanas para realizar las diferentes tareas de programación. Dentro de Visual Studio, podemos realizar aplicaciones Windows y Web, servicios Web y bibliotecas de componentes, además acceder a bases de datos y muchas opciones más, con cualquier lenguaje de la plataforma provisto por Microsoft (VB.NET, C#, C++, etc.). la idea de este IDE es que el programador no tenga que cambiar de aplicación para realizar todas las tares involucradas en el desarrollo de un sistema. Como parte entorno de desarrollo de Visual Studio, podemos destacar las siguientes secciones (figura 22):
a. Barra de herramientas. Aquí se encuentran las barras de herramientas que dan acceso a los comandos más comunes. De acuerdo con la tarea que estemos realizando, esta sección cambiará según sean necesarios.
b. Lista de errores. Aquí están las ventanas de errores, la de tareas y la de salida. c. Cuadro de herramientas.Presenta la caja de herramientas, que contiene todos los controles y componentes que podemos utilizar cuando realizamos aplicaciones. Según el tipo de programa, se llenará con los controles y componentes apropiados para cada uno.
��
d. Explorador de soluciones y ventana de propiedades. El primero presenta todos los proyectos y archivos con que estamos trabajando; y el segundo, las propiedades de todos los elementos del entorno.
e. Área de trabajo. En este espacio aparecen todos los documentos que estemos manejando, tanto en vista de código como en vista de diseño.
a
d
c
b
e
Figura 22. Secciones del entorno de desarrollo.
4.2. Fundamentos del Lenguaje Hasta ahora conocimos la plataforma .NET y Visual Studio, sus principales características, componentes y modo de funcionamiento. Ahora llega el turno del lenguaje C#. C# fue creado por Microsoft con el propósito de ser el mejor lenguaje de programación que exista para escribir aplicaciones destinadas a la plataforma .NET. Combina la facilidad de desarrollo propia de Visual Basic con el poderío del lenguaje C++, un lenguaje con el cual se ha escrito la mayor parte de la historia del software y de los sistemas operativos de todos
��
los tiempos. En líneas generales, podemos decir que es un lenguaje de programación orientado a objetos simple y poderoso. Lo primero que debemos saber es que podremos crear una gran diversidad de programas utilizando este lenguaje: desde aplicaciones de consola, aplicaciones para Windows o aplicaciones Web, hasta software para dispositivos móviles, drivers, y librerías para Windows. La sintaxis de C# es muy parecida a la de C, C++ y Java. Para el diseño de este lenguaje, Microsoft decidió modificar o añadir únicamente aquellas cosas que en no tienen una relativa equivalencia. Por ejemplo, un dato para tener en cuenta es que en C# todas las instrucciones y declaraciones deben terminar con “;” (punto y coma), salvo cuando se abra un bloque de código. A diferencia de lo que sucede en Visual Basic, una instrucción que sea muy larga puede ponerse en varias líneas, sin ingresar ningún tipo de signo especial al final de cada una. El compilador comprende que todo forma parte de la misma instrucción, hasta que encuentra el punto y coma.
4.2.1. Tipos Los tipos de datos que podemos usar en Visual C# son los mismos tipos de datos definidos en .NET Framework y por tanto están soportados por todos los lenguajes que usan esta tecnología. Estos tipos comunes se conocen como el CommonTypeSystem, (CTS), que traducido viene a significar el sistema de tipos comunes de .NET. El hecho de que los tipos de datos usados en todos los lenguajes .NET estén definidos por el propio Framework nos asegura que independientemente del lenguaje que estemos usando, siempre utilizaremos el mismo tipo interno de .NET, si bien cada lenguaje puede usar un nombre (o alias) para referirse a ellos, aunque lo importante es que siempre serán los mismos datos, independientemente de cómo se llame en cada lenguaje. Esto es una gran ventaja, ya que nos permite usarlos sin ningún tipo de problemas para acceder a ensamblados creados con ��
otros lenguajes, siempre que esos lenguajes sean compatibles con los tipos de datos de .NET. Los tipos de datos de .NET los podemos definir en dos grupos:Tipos por valor y tipos por referencia. Veamos en la tabla 6 los tipos de datos definidos en .NET Framework y los alias utilizados en Visual C#.
.NET Framework
C#
System.Boolean
bool
System.Byte
byte
System.Int16
short
System.Int32
int
System.Int64
long
System.Single
float
System.Double
double
System.Decimal
decimal
System.Char
char
System.String
string
System.Object
object
System.DateTime
N.A. (DateTime)
System.SByte
sbyte
System.UInt16
ushort
System.UInt32
uint
System.UInt64
ulong
Tabla 6.Tipos de datos de .NET y su equivalencia en C#. 4.2.2. Constantes Para usar las constantes con nombre debemos declararlas previamente, para ello utilizaremos la instrucción “const”, tal como vemos en este ejemplo: ��
constintmaximo = 12345678; Como podemos comprobar, tenemos que utilizar una instrucción para indicar que es una constante, (const), seguida del tipo de datos y el valor que le asignaremos a esa constante. Siempre que tengamos que indicar un valor constante, ya sea para indicar el máximo o mínimo permitido en un rango de valores o para comprobar el término de un bucle, deberíamos usar una constante en lugar de un valor literal, de esta forma si ese valor lo usamos en varias partes de nuestro código, si en un futuro decidimos que dicho valor debe ser diferente, nos resultará más fácil realizar un solo cambio que cambiarlo en todos los sitios en los que lo hemos usado, además de que de esta forma nos aseguramos de que el cambio se realiza adecuadamente y no tendremos que preocuparnos de las consecuencias derivadas de no haber hecho el cambio en todos los sitios que deberíamos.
4.2.3. Variables En la declaración de las variables en Visual C#, siempre hay que indicar el tipo de datos que tendrá la variable, por la sencilla razón de que las variables definidas en C# siempre se harán usando el tipo de datos sin necesidad de utilizar ninguna instrucción especial que indique que es una declaración. En el siguiente ejemplo, estamos declarando una variable de tipo int y otra de tipo double: int i; double m; También podemos declarar más de una variable en la misma sentencia. Lo único que tendremos que hacer es separar las variables con comas. Por ejemplo, el siguiente código definimos tres variables del tipo int: int a, b, c; ��
Cuando declaramos variables en C#, estas estarán en un estado "no iniciado", es decir, no tendrán ningún valor inicial asignado de forma automática.Por tanto, si queremos que en C# tengan un valor inicial, tendremos que asignarlos de forma expresa.Por ejemplo: int a = 10; En esa misma línea podemos declarar y asignar más variables, simplemente separándolas con comas: int b = 12, c = 15; Si queremos declarar más de una variable pero con tipos diferentes tendremos que separarlas con un punto y coma, que es la forma de decirle al compilador que es una nueva instrucción. Como es natural, a una variable podemos asignarle el contenido de una constante "con nombre" que previamente hayamos declarado, esa asignación también podemos hacerla al declarar la variable: constintmaximo = 12345678; int i = maximo;
4.2.4. Expresiones Para escribir expresiones en C# debe escribir el nombre de la variable que tomará el valor, seguido del operador “=” (no confundirlo con el operador lógico de igualdad) y a su derecha el valor o cálculo correspondiente. Por ejemplo: miVariable = 57; ��
4.2.5. Operadores C# proporciona un amplio conjunto de operadores, algunos de los cuales se presentan en la tabla 7.
Símbolo
Significado Aritméticos
+
Suma
-
Resta
*
Multiplicación
/
División (real)
%
Resto de la división
++
Incremento
--
Decremento
Relacionales <
Menor que
>
Mayor que
==
Igual que
<=
Menor o igual que
>=
Mayor o igual que
!=
Diferente
Lógicos &&
Conjunción
||
Disyunción
!
Negación
Tabla 7. Operadores en C#
��
4.3. Sentencias En los siguientes párrafos se revisa la forma de implementar en C# las estructuras de decisión y de repetición estudiadas en el capítulo 3, analizando únicamente su sintaxis pues se asume que el alumno ya comprende su funcionamiento.
Sentencia if.
•
if if( condición ) { //bloque de código que se ejecuta si la condición es verdadera }
if…else if(condición) { //bloque de código que se ejecuta si la condición es verdadera } else //caso contrario { //bloque de código que se ejecuta si la condición es falsa }
if…elseif…else if(condición) { //bloque de código que se ejecuta si la condición es verdadera } elseif(condición) //caso contrario { ��
//bloque de código que se ejecuta si la condición anterior es falsa y la actual es verdadera } else //caso contrario { //bloque de código que se ejecuta si las condiciones son falsas }
Sentencia switch switch( variable ) { case valor1: //bloque de código a ejecutar para el primer caso break; case valor2: //bloque de código a ejecutar para el segundo caso break; … default: //bloque de código a ejecutar para el caso por defecto break; }
Sentencia while while( condición ) { //bloque de código a ejecutar } ��
Sentencia do…while do { //bloque de código a ejecutar } while( condición );
Sentencia for for(variable=valorInicial; condición; incremento o decremento) { //bloque de código a ejecutar }
Ejercicios resueltos
Elaborar un algoritmo que, dados los dos lados diferentes de un rectángulo, encuentre el perímetro y el área del mismo. int L1, L2, P, A; Console.WriteLine("Ingrese los dos lados:"); L1 = Convert.ToInt32(Console.ReadLine()); L2 = Convert.ToInt32(Console.ReadLine()); P = 2 * L1 + 2 * L2; A = L1 * L2; Console.WriteLine("EL PERIMETRO ES: {0}", P); Console.WriteLine("EL AREA ES: {0}", A);
��
A la mamá de Juan le preguntan su edad, y contesta: tengo 3 hijos, pregúntele a Juan su edad. Alberto tiene 2/3 de la edad de Juan, Ana tiene 4/3 de la edad de Juan y mi edad es la suma de las tres. Hacer un algoritmo que muestre la edad de los cuatro. int EDJUAN, EDALBER, EDANA, EDMAMA; Console.WriteLine("Ingrese edad de Juan:"); EDJUAN = Convert.ToInt32(Console.ReadLine()); EDALBER = 2 * EDJUAN / 3; EDANA = 4 * EDJUAN / 3; EDMAMA = EDJUAN + EDALBER + EDANA; Console.WriteLine("Las
edades
son.
Alberto={0},
Juan={1},
Ana={2},
Mamá={3}",EDALBER,EDJUAN,EDANA,EDMAMA);
Hacer un algoritmo que, dados dos valores numéricos A y B, escriba un mensaje diciendo si A es mayor, menor o igual a B. int A,B; Console.WriteLine("Ingrese dos números:"); A = Convert.ToInt32(Console.ReadLine()); B = Convert.ToInt32(Console.ReadLine()); if (A > B) { Console.WriteLine("A ES MAYOR QUE B"); } else { ��
if (A == B) Console.WriteLine("A ES IGUAL A B"); else Console.WriteLine("A ES MENOR QUE B"); }
Diseñar un algoritmo que encuentre la suma de los primeros cinco números naturales. int NUM = 0, SUMA = 0; while (NUM < 5) { NUM = NUM + 1; SUMA = SUMA + NUM; } Console.WriteLine("LA SUMA ES: {0}", SUMA);
Elaborar un algoritmo que genere los primeros N términos de la sucesión: 17 15 18 16 19 17 20 18 21... int NT, TER, CONT, BAN; Console.WriteLine("Ingrese la cantidad de términos:"); NT = Convert.ToInt32(Console.ReadLine()); TER = 17; CONT = 1; BAN = 1; while (CONT <= NT) { Console.WriteLine(TER); if (BAN == 1) { TER = TER - 2; BAN = 2; ��
} else { TER = TER + 3; BAN = 1; } CONT = CONT + 1; }
Ejercicios propuestos Implemente los programas correspondientes para cada uno de los algoritmos propuestos en el capítulo 3.
��
CAPÍTULO 5 MODULARIDAD Y REDUCCIÓN DE COMPLEJIDAD A lo largo del texto se han tratado los problemas como un todo, como si fuesen un solo módulo. Una de las grandes ventajas que tiene la programación estructurada es la división de problemas grandes en subproblemas y, a su vez, éstos también pueden dividirse en problemas más pequeños. Esta técnica le permite dar más entendibilidad y facilidad en la construcción y corrección de los errores que se presentan en la solución de un problema determinado. Cada una de las divisiones que se hacen para obtener la solución de un problema se denomina módulo y éstos son implementados por medio de los subprogramas. Un subprograma es un algoritmo diseñado para efectuar una tarea particular, bajo la dependencia de un algoritmo u otro subprograma que lo utiliza. De esta manera, el subprograma es diseñado para ser utilizado por otros procesos más amplios, dentro de los cuales existe un flujo de recibo y entrega de información. La utilización de subprogramas en la solución de problemas grandes tiene muchas ventajas. Por ejemplo, para tareas que deban efectuarse más de una vez, la modularidad evita la necesidad de programación redundante, esencialmente el mismo conjunto de instrucciones; en vez de ello, un módulo puede construirse e invocarse cada vez que se necesite hacer la misma labor, por lo tanto, el uso de módulos permite o hace que los programas sean más cortos. De igual manera, la fragmentación en módulos individuales proporciona claridad, facilidad de distribución de trabajo en equipo y, por ser algoritmos cortos, son más fáciles de escribir, corregir y su estructura lógica es más clara que la de los programas que no están divididos en módulos. El subprograma, por ser un algoritmo, debe cumplir con las mismas características de éste y hacer tareas similares como aceptar datos, escribir datos y hacer cálculos; sin embargo, es utilizado para un propósito específico. El subprograma recibe datos del algoritmo o ��
subalgoritmo que lo invoca y éste le devuelve resultados. Su labor puede compararse con la de un jefe que le da instrucciones a un empleado (Subprograma), para que realice una determinada labor y así poder continuar con su trabajo; se detiene mientras su subalterno realiza la tarea y cuando éste le devuelve los resultados reanuda su labor. Así mismo, cuando un algoritmo invoca un subprograma le cede el control de ejecución a éste, por lo tanto, detiene la ejecución de la próxima instrucción hasta que el subprograma se ejecute, le entregue resultados y le devuelva el control de ejecución. La comunicación que se establece entre el algoritmo llamante y el subprograma se hace a través de variables denominadas parámetros, que hacen las veces de recipiente, unas de recibo y otras de envío de información. Un subprograma puede ser invocado tantas veces como se necesite y, a su vez, los subprogramas pueden invocar a otros subprogramas, como puede verse en la figura siguiente. En la figura 21 las flechas indican el flujo de ejecución del algoritmo; observe que cuando se ejecuta una instrucción de llamada a un subprograma, el algoritmo llamante se detiene, ya que no solamente le transfiere información al subprograma sino también el control de ejecución; esto hace que se active el subprograma, se les dé valor a las variables que lo conforman y se ejecuten una a una las instrucciones. Una vez que finaliza su ejecución, tiene la información requerida por el algoritmo llamante; por lo tanto, se la entrega y devuelve el control de ejecución a la instrucción siguiente o a la misma instrucción desde donde fue llamado, dependiendo de la clase de subprograma. En la figura 23 también se muestra que un algoritmo puede invocar las veces que sea necesario al mismo subprograma y que un subprograma puede, a su vez, invocar a otros subalgoritmos.
��
Pasa
información cede control
Retorna
información
Subprograma A
control e
Pasa información cede control
Retorna
Subprograma B
control e
Cede control
información
Llamada a C Pasa información cede control
Retorna
Retorna
Subprograma C
control
Subprograma A
control e información
Figura 23. Subprogramas. Cuando un algoritmo invoca a un subprograma es como si las instrucciones de éste se copiaran dentro del algoritmo y las ejecutara; en el caso del subprograma A, no tiene sentido tener el mismo grupo de instrucciones repetidas dentro del algoritmo; como los subprogramas pueden compilarse y ponerse a punto independientemente del programa que los invoque, éstos se diseñan para que sean usados en diferentes programas. Por ejemplo, si en un sistema de cómputo con frecuencia se necesitan ordenamientos de los elementos de un vector, una buena solución es diseñar un subprograma que haga el ordenamiento y cada vez que sea necesario implementarlo, simplemente se le encomienda la tarea al subprograma (No hay que hacerlo). La división de los subprogramas se hace con base en el número o cantidad de valores que el subprograma le envía al programa o subprograma llamante. Así distinguiremos entre procedimientos y funciones.
��
5.1. Procedimientos Son subprogramas que no devuelven valores al programa o subprograma que lo invoca (utiliza) y retornan el control de ejecución a la instrucción siguiente desde donde se llaman. La sintaxis para un implementar un procedimiento en C# es: staticvoid nombre ( parámetros ) { //bloque de código necesario } El nombre dado al subprograma debe cumplir con las normas para conformar nombres de variables. Los parámetros son una lista de campos variables separados por comas y son utilizados para establecer la comunicación entre el módulo que lo activa y el subprograma. Unos parámetros serán de recibo (almacenan la información que les envía el módulo que los invoca) y otros de envío de información (la transfieren a quien invoca el subprograma). Los parámetros de reciboson las variables que van a recibir información del módulo módulo que los invoca, similares a los datos de entrada que se han detectado en los algoritmos anteriores, con la diferencia de que a los datos de entrada se les transfiere información a través de una instrucción de lectura lectura y a los parámetros de recibo se les da información a través del módulo que invoca el subprograma; o sea, que es un asignamiento de información automática desde las variables que envían información, desde el módulo llamante, hacia los parámetros de recibo del subprograma. Los parámetros de envío son los parámetros que envían información al módulo que invoca al subprograma, semejante a los datos de salida de los algoritmos, con la diferencia de que ��
los parámetros de envío le entregan la información a las variables que la reciben dentro del módulo llamante. El subprograma no inicia ni termina por sí mismo; por lo tanto, necesita ser activado (hacerlo funcionar, invocarlo, llamarlo) desde un módulo externo. Esto se hace cuando el módulo llamante necesita la ayuda para una labor específica que hace el módulo subordinado. La activación se hace a través de la siguiente instrucción. Nombre (Argumentos) Los argumentos son nombres de campos(constantes o variables), que usa el módulo y que tienen una correspondencia biunívoca con los parámetros con los cuales se construyó el subprograma; por lo tanto, estos deben ser iguales en número y en tipo de dato que los parámetros, ya que a cada argumento le corresponde un parámetro y viceversa. Los argumentos también son de dos clases: unos que envían información al subprograma y otros que reciben información. Cuando el subprograma es activado, los argumentos de envío son copiados en los parámetros de recibo, (parámetros de recibo - argumentos de envío). Y cuando el subalgoritmo deja de ejecutarse los parámetros de envío le asignan información a los argumentos de recibo (argumentos de recibo - parámetros de envío).
5.2. Funciones Son subprogramas que le devuelven al programa o subprograma que los invoca un único valor. El valor que éstas devuelven lo hacen a través de una variable involucrada en una instrucción de retorno, dentro del conjunto de instrucciones, o en el nombre de ésta; por lo tanto, este tipo de subprogramas en su encabezamiento sólo tienen parámetros de recibo. Las funciones devuelven el control de ejecución a la misma instrucción desde donde se llaman. ��
La sintaxis para un implementar una función en C# es: statictipo_dato_retorno nombre ( parámetros ) { //bloque de código necesario returnvalor_devuelto; }
Figura 24. Componentes de una función.
��
El valor que devuelve la función (sentencia return) debe ser asignado a una variable, la cual debe ser del mismo tipo de dato del valor que devuelve la función (no puede existir incompatibilidad de tipos de datos): variable = nombre_función (Argumentos); En la figura 24 puede observar un pequeño programa que contiene una función, y su composición.
5.3. Paso de parámetros: por valor y por referencia En C#, los argumentos se pueden pasar a parámetros por valor o por referencia. Una variable de tipo de valor contiene directamente los datos, a diferencia de una variable de tipo de referencia, que contiene una referencia a los datos. Por lo tanto, pasar una variable de tipo de valor a un método significa pasar una copia de la variable al método.Cualquier cambio en el parámetro que se produzca dentro del método no afectará a los datos originales almacenados en la variable. El paso de parámetros por referencia permite a los miembros de funciones cambiar el valor de los parámetros y hacer que ese cambio persista en el entorno que procede de la llamada.Para pasar un parámetro por referencia, utilice una de las palabras clave refoout. En este tema, para simplificar, sólo se utiliza la palabra clave ref. La forma de utilizar en C# el paso de parámetro por valor y por referencia, respectivamente, es la siguiente: Tipo_datonombre_Parámetro refTipo_datonombre_Parámetro ��
Ejercicios resueltos
Elabore un subprograma que encuentre la suma y el promedio de un conjunto de N números. PROCEDIMIENTO SUMPROM (N, SUMA, PROM) SUMA = 0; PARA ( I = 1; I<=N; I++ ) HAGA LEER NUM; SUMA = SUMA + NUM; FIN_PARA PROM = SUMA / N; FIN_SUMPROM
Elaborar una función que encuentre el valor mayor en un conjunto de 3 números reales diferentes. FUNCIÓN MAYOR (N1, N2, N3) SI ( (N1 > N2) AND (N1 > N3) ) ENTONCES VALMAY = N1; SINO SI (N2 > N3) ENTONCES VALMAY = N2; SINO VALMAY = N3; FIN_SI FIN_SI RETORNE VALMAY; FIN_MAYOR
��
Elaborar un subprograma que encuentre el factorial de un número entero mayor o igual a cero. FUNCIÓN FAC (N) FACTO=1; PARA ( I= 1;I<=N; I++ ) HAGA FACTO= FACTO*I; FIN_PARA RETORNE FACTO; FIN_FAC
Ejercicios propuestos Implemente los programas correspondientes para cada uno de los algoritmos propuestos en el capítulo 3, utilizando procedimientos y/o funciones.
��
CAPÍTULO 6 FUENTES ELEMENTALES DE DATOS En los capítulos anteriores se ha manejado el concepto de campo variable como uno o más caracteres, a los que se le asigna un espacio en memoria donde se puede guardar en forma temporal un único valor, bien sea numérico, carácter o lógico. En este capítulo el concepto de variable se extenderá a un grupo o colección de ellas, agrupadas bajo un mismo nombre. Los datos siempre que estén relacionados se pueden organizar en estructuras, de tal manera que podemos tener un conjunto de datos numéricos, lógicos, o caracteres manejados a través de un mismo nombre de variable. Una estructura de datos es la organización que reciben los datos para que sean tratados como una unidad. Existen varias formas de organizar los datos o valores que maneja un algoritmo, los más comunes son los arreglos y los archivos de datos. Un arreglo es un conjunto finito de componentes del mismo tipo, los cuales se diferencian o relacionan a través de un subíndice. Todas las componentes pertenecientes, llamadas también elementos del arreglo, están una a continuación de otra, tienen el mismo tamaño o espacio en memoria, son todas de un mismo tipo de dato y, por lo tanto, tienen igual forma de almacenamiento. Para manejar en forma independiente cada componente del arreglo se usa un índice, que es una expresión de tipo entero (sin decimales) que indica cuál de los elementos del arreglo queremos relacionar. Siempre que se quiere trabajar o mencionar una componente es ��
necesario adicionar el índice al nombre genérico del arreglo; es éste el que hace independiente una de otra. Ejemplos de índices: 4
i
IDX
k+i
i * jota – 1
6.1. Arreglos de una dimensión o vectores Un vector es un arreglo donde los elementos que lo conforman están dispuestos bajo un mismo concepto de clasificación (fila o columna), es decir, los datos están organizados de una manera lineal, por lo que para referenciar un elemento del arreglo es necesario un índice, que indique la posición relativa del elemento en el arreglo. Cuando al nombre del arreglo se le adiciona el índice, bien sea entre paréntesis o corchetes, la componente al cual hace referencia el índice es tomada como una variable simple, igual a las que en capítulos anteriores se han venido tratando; por lo tanto, puede estar involucrada en una expresión, en una entrada o salida de datos, o en una asignación. Gráficamente un vector puede ser representado en cualquiera de las siguientes formas (figura 25): nombre xx
Figura 25. Representación gráfica de un vector. ��
Donde el nombre es el que se ha escogido para todos los elementos del arreglo, y cada rectángulo representa las componentes o elementos que lo conforman. Si los valores 30, 15, 20, 60 y 80 representan las edades de cinco personas y queremos tener almacenada esta información en memoria para ser utilizada en un proceso por computadora, perfectamente podemos guardarla en cinco nombres de variables distintas como EDAD1, EDAD2, EDAD3, EDAD4 y EDAD5; pero ¿qué pasa si no son cinco sino mil edades, o más de mil?, sin duda que se convierte en un proceso engorroso y difícil de manejar, pero que se puede solucionar almacenando esa información en un arreglo, que en este caso sería de una dimensión. Si se escoge el nombre EDAD como nombre del arreglo para identificar el conjunto de las 5 edades, internamente en memoria se separan cinco espacios (direcciones de memoria) adyacentes para almacenar en el momento oportuno la información requerida. Si un programa utiliza la variable tipo arreglo EDAD, después de la compilación sucederá lo siguiente: MEMORIA EDAD[0]
Dirección X
EDAD[1]
Dirección X + 1
EDAD[2]
Dirección X + 2
EDAD[3]
Dirección X + 3
EDAD[4]
Dirección X + 4
Donde cada elemento del vector EDAD se puede procesar como si fuese una variable simple, al ocupar cada uno una posición de memoria diferente; esto implica que en los arreglos el acceso a un elemento se hace en forma directa, es decir, que cualquier elemento se puede referenciar sin necesidad de accesar los anteriores a él. Las siguientes dos instrucciones muestran la independencia que tiene cada una de las variables que pertenecen al arreglo, al adicionar el índice. LEA: EDAD[0], EDAD[2], EDAD[4] ��
ESCRIBA: EDAD[4], EDAD[2] Si los valores de las tres variables descritas en la instrucción de la lectura son en su orden 30, 20 y 80, al ejecutarse las instrucciones anteriores sucederá lo siguiente: MEMORIA EDAD[0]
30
Dirección X
EDAD[1]
Dirección X + 1
EDAD[2]
20
Dirección X + 2
EDAD[3]
Dirección X + 3
EDAD[4]
80
Dirección X + 4
En general se puede decir que EDAD[ i] hace referencia al contenido que tiene la componente o elemento ubicado en la posición i del arreglo EDAD, donde 0 ≤ i ≤4. Los arreglos pueden ser utilizados como acumuladores o contadores, inicializando cada uno de sus elementos. Por ejemplo, llevar cero a cada uno de los elementos del arreglo EDAD. INDICE = 0; while (INDICE <= 4) { EDAD [INDICE] = 0; INDICE = INDICE + 1; } No olvide que, al igual que cualquier otra variable, primero debe declarar un arreglo antes de utilizarlo. Su declaración se realiza de la siguiente manera: Tipo_dato [ ] nombre_Vector;
��
La declaración especifica que todos los elementos del vector son del mismo tipo de dato. Mediante los corchetes se indica al compilador de C# que quiere crear una variable de tipo arreglo unidimensional y finalmente el nombre que tendrá. El elemento que falta en esta declaración es el tamaño de la matriz. ¿Cuántos elementos puede contener este arreglo? El tamaño de él se especifica mediante el operador de C# new. Este operador indica al compilador de C# que quiere reservar suficiente memoria para una nueva variable; es este caso, un vector de 5 elementos de tipo byte: byte [ ] EDAD ; EDAD = new byte[5]; Debe recordar especificar el tipo del arreglo cuando use la palabra clave new, aunque ya se haya especificado el tipo cuando la declaró. Si olvida hacerlo, obtendrá un mensaje de error del compilador.
6.2. Cadenas de caracteres Una cadena es un objeto de tipo String cuyo valor es texto. Internamente, el texto se almacena como una colección de sólo lectura de objetos Char. En C#, la palabra clave string es un alias de String. Por lo tanto, String y string son equivalentes y puede utilizar la convención de nomenclatura que prefiera. La clase String proporciona numerosos métodos para crear, manipular y comparar cadenas de forma segura. Además, el lenguaje C# sobrecarga algunos operadores para simplificar operaciones comunes de las cadenas Puede declarar e inicializar cadenas de varias maneras, como se muestra en los ejemplos siguientes: string mensaje1; ���
string saludo = "Hola mundo!"; conststring mensaje2 = "Odio programar!"; A continuación de mencionan algunos aspectos importantes sobre las cadenas:
La longitud de una cadena representa su número de caracteres: stringcad = "Programar es divertido."; Console.WriteLine(cad.Length); // Muestra 23 (caracteres de la cadena)
El operador + concatena cadenas: string a = "good " + "morning";
El operador [] se puede utilizar para tener acceso de sólo lectura a caracteres individuales de un objeto string: stringstr = "test"; char x = str[2]; // x = 's';
Utilice literales de cadena regulares cuando tenga que incrustar caracteres de escape proporcionados por C#, como se muestra en el ejemplo siguiente: string columnas = "Columna 1\tColumna 2\tColumna 3"; //Salida: Columna 1
Columna 2
Columna 3
string filas = "Fila 1\nFila 2"; /* Salida: Fila 1 Fila 2 */ ���
Utilice cadenas textuales para mayor comodidad y una mejor legibilidad cuando el texto de la cadena contiene caracteres de barra diagonal inversa, por ejemplo en rutas de acceso de archivo. stringfilePath = @"C:\Users\scoleridge\Documents\";
Una subcadena es una secuencia de caracteres cualquiera incluida en una cadena.Utilice el método Substring para crear una nueva cadena a partir de un segmento de la cadena original. Puede buscar una o más apariciones de una subcadena con el método IndexOf. Utilice el método Replace para reemplazar todas las apariciones de una subcadena especificada por una cadena nueva. Al igual que el método Substring, Replace devuelve en realidad una cadena nueva y no modifica la cadena original.
6.3. Operaciones básicas con arreglos Búsqueda. La búsqueda consiste en encontrar un determinado valor dentro de un conjunto de datos, para recuperar alguna información asociada con el valor buscado. Existen diferentes formas de hacer esta operación. Es una técnica sencilla para buscar un elemento dentro de un arreglo, y consiste en recorrer todo el vector elemento a elemento desde el primero hasta el último. Si se encuentra el valor buscado, el proceso devolverá la posición donde se encuentra dicho elemento, de lo contrario se enviará un mensaje que informe que el valor buscado no se encuentra dentro del arreglo.
Ordenación. Otra operación muy común con arreglos es la ordenación. La ordenación se refiere a la operación de organizar los elementos de un vector en algún orden dado: ascendente o ���
descendente. Si el ordenamiento es creciente o ascendente, significa que hay que organizar sus elementos de tal manera que: A[0] < A[1] < A[2] < A[3] ..........< A[N]. Si el ordenamiento es ascendente significar que: A[0] > A[1] > A[2] > A[3] ..........> A[N]. Existen diferentes modelos para organizar los elementos de un arreglo, siendo el más común el método de burbuja. El método de burbuja es un método poco eficiente. Se basa en comparar elementos adyacentes del vector e intercambiar sus valores, si están desordenados. Los valores más pequeños burbujean hacia el inicio del vector (ordenación ascendente), mientras que los valores más grandes comienzan a subir hacia la parte final del vector. Por ejemplo, se compara A[0] con A[1]; si están desordenados se intercambian A[0] con A[1] y así sucesivamente a lo largo del vector. Al terminar la primera pasada, el elemento mayor se encuentra al final y el menor ha ido descendiendo hacia el principio del vector. Se vuelve a hacer una nueva exploración, comparando elementos consecutivos e intercambiando. Pero esta vez el elemento mayor no se compara (está en su posición correcta). El vector quedará ordenado cuando se hayan hecho N-1 pasadas. Si los valores del vector son: 80
55
35
21
15
55
80
35
21
15
55
35
80
21
15
55
35
21
80
15
55
35
21
15
80
VECTOR ORIGINAL DE TAMAÑO 5 (N)
Se necesitaron 4 comparaciones (N-1) para colocar el valor mayor de último. ���
En la segunda pasada ocurrirá lo siguiente: 35
55
21
15
80
35
21
55
15
80
35
21
15
55
80
Tercera pasada: 21
35
15
55
80
21
15
35
55
80
55
80
Cuarta pasada: 15
21
35
En total se necesitaron cuatro pasadas para ordenar un vector de 5 elementos.
Inserción. Esta operación consiste en adicionar un nuevo elemento al arreglo. Se debe tener en cuenta que no se sobrepase el tamaño dado en la definición del arreglo. La operación puede darse con un arreglo desordenado u ordenado. Si el arreglo está desordenado la operación es simple, se incrementa en uno el número de elementos y en esa posición (N+1), se inserta el nuevo elemento.
Borrado. Consiste en eliminar un elemento del arreglo; puede darse cuando el arreglo está desordenado u ordenado. Para hacer el proceso hay que:
•
Verificar que el arreglo no esté vacío. ���
•
Buscar la posición donde se encuentra el elemento a borrar.
•
Correr los elementos una posición hacia la izquierda, a partir de la posición siguiente donde se encuentra el valor a borrar.
•
Disminuir el número de elementos del vector en uno.
•
Enviar un mensaje en caso de que el elemento a borrar no esté dentro del arreglo.
6.4. Arreglos de dos dimensiones o matrices Las matrices son estructuras de datos que organizan su información en forma de tablas; es decir, los elementos que la conforman están dispuestos bajo dos conceptos de clasificación (fila y columna). Para poder indicar el lugar donde se encuentra un determinado elemento, es necesario utilizar dos índices: uno para indicar el renglón o fila y otro para indicar la columna. Puede mirarse una matriz como un vector de vectores; por lo tanto, es un conjunto de componentes en el que se necesitan dos subíndices para identificar un elemento que pertenezca al arreglo. Un arreglo bidimensional M * N tiene M filas y N columnas; por lo tanto, tiene M * N elementos dispuestos interiormente en memoria en forma sucesiva. Gráficamente se puede representar como una tabla de valores. Si A es una matriz de 5 * 7 se representará así (figura 26): Columnas 0
1
2
3
4
5
6
0 s a l i F
1 2
X
3 4
Figura 26. Representación gráfica de una matriz (A). ���
El arreglo anterior tiene 35 elementos, todos ellos con el nombre A y se diferencian entre sí por dos índices; el primero indica la fila donde está ubicado el elemento y el segundo la columna. El elemento A[2, 4] hace referencia al contenido del elemento ubicado en la fila 2 columna 4. En general, se puede decir que el elemento i, j de un arreglo bidimensional hace referencia al contenido del elemento ubicado en la fila i, columna j, donde: 0≤ i ≤ número de filas y 0≤ j ≤ número de columnas. Cualquier elemento del arreglo puede referenciarse en forma directa, siempre que al nombre del arreglo se le adicionen los dos índices. La instrucción LEA: A[0, 0], A[4, 6], A[2, 4], A[4, 2], A[2, 2] tiene como efecto entrar 5 valores al arreglo A; si estos valores son: 10, 15, 40, 99 y -1, y el almacenamiento interno será (figura 27): Columnas 0 0 s a l i F
1
2
3
4
5
6
10
1 2
-1
40
3 4
99
15
Figura 27. Elementos de una matriz (A). Los demás elementos no tendrán información. Para llevar información a todo el arreglo se puede hacer de dos formas: una será llenando primero la fila uno, luego la fila 2, hasta la fila N; y la otra sería llenando primero la columna uno, luego la dos y así sucesivamente hasta llenar la columna M, todo dependerá ���
de la forma como se encuentren dispuestos los datos en el archivo de entrada. Por ejemplo: llevar información a la matriz A del ejemplo anterior. Para resolver el problema se necesitan dos ciclos, uno externo que controle las filas y otro interno que por cada valor que tome la variable de control del ciclo externo recorra todas las columnas.El algoritmosería: for ( i = 0; i < 5; i++ ) { for ( j= 0; j < 7; j++) { A[i , j ] = asignar_valor; } } Tenga presente que, al igual que los vectores, primero debe declarar una matriz antes de utilizarla. Su declaración se realiza de la siguiente manera: Tipo_dato[ , ] Nombre_Matriz; Nombre_Matriz = new Tipo_dato[filas, columnas];
Ejercicios resueltos
Elabore un programa que permita ingresar la nómina de alumnos de un curso y tres calificaciones para cada uno, mostrar los datos ingresados y calcular el promedio de notas del curso.
Utilice un arreglo unidimensional para los nombres y uno
bidimensional para las notas. Además deberá crear los procedimientos y/o funciones que considere necesarios, pasando como parámetros los arreglos antes mencionados, según corresponda. ���
static void Main(string[] args) { string[] nomina; float[,] notas; intnumAl; Console.Write("Ingrese la cantidad de alumnos: "); numAl = Convert.ToInt32(Console.ReadLine()); nomina = new string[numAl]; notas = new float[numAl, 3]; ingresar(nomina,notas); Console.WriteLine("\nLISTADO DE ALUMNOS"); Console.WriteLine("Nombres\tN1\tN2\tN3"); mostrar(nomina,notas); Console.WriteLine("\n\nPromedio: {0}", calcularPromedio(notas)); } static void ingresar(string[] nomina, float[,] notas) { int i, j; for (i = 0; i
notas[i, j] = Convert.ToSingle(Console.ReadLine()); } } } static void mostrar(string[] nomina, float[,] notas) { int i, j; for (i = 0; i
���
Ejercicios propuestos 1) Elaborar un programa que entre 5 valores y los almacene en un vector e imprimir el vector. 2) Elaborar un programa que genere un arreglo de N elementos y encuentre el valor y la posición del mayor elemento. 3) Usando el arreglo anterior, escribir los elementos cuyos valores sean múltiplos de 3. 4) Elabore un programa que entre una serie de valores, los almacene en un vector y sume los elementos de las posiciones pares e impares por separado. 5) Hacer un programa que calcule el promedio de los elementos de un vector y forme dos nuevos arreglos, uno con los elementos menores o iguales al promedio y otro con los superiores. Imprima los dos nuevos arreglos. 6) Elaborar un programa que lea una matriz por filas y la imprima por columnas 7) Elaborar un programa que lea el orden de una matriz y sus elementos y encuentre los elementos mayor y menor y sus posiciones. 8) Hacer un programa que lea el orden de un arreglo bidimensional y sus elementos; convierta la matriz en un arreglo unidimensional. La conversión debe hacerse por columnas, es decir, mover la primera columna al vector, a continuación la segunda columna y así sucesivamente. Imprima el arreglo formado. 9) Elaborar un algoritmo que entre una matriz de M * N y ordene en forma creciente los elementos de las columnas del arreglo. 10) Elaborar un algoritmo que llene una matriz de orden N con ceros, excepto las dos diagonales que deben contener unos. ���