Вы находитесь на странице: 1из 111

Texto Guía de la

Escuela Informática

Fundamentos de
Programación
Texto Guía de la
Escuela Informática

Fundamentos de
Programación

Autores:
Orlando Erazo Moreta
Andrea Zúñiga
Washington Chiriboga
2
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 desarrollo de software orientado a satisfacer las
necesidades de procesamiento de información y soporte a las decisiones estratégicas de las
organizaciones.

3
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
4
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. La plataforma .NET 64
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. Fundamentos del Lenguaje 70
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. Sentencias 76
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
5
6.4 Arreglos de dos dimensiones o matrices 100
Ejercicios resueltos 102
Ejercicios propuestos 105

BIBLIOGRAFÍA 106
ANEXOS
Anexo 1: Ejercicios Propuestos 107

6
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
cuando 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

7
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#.

8
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

Proceso
Entrada 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

9
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
10
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 con 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

11
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
12
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.

13
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

14
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.

15
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 superiora 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 nemoté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


16
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 Programa Programa objeto en


Lenguaje ensamblador código máquina
(assembly) ENSAMBLADOR
(assembler)

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 (assembly languaje), 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.
17
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 dela 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.

18
 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.
19
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 “comprender”. 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.

20
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.

21
 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
22
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).

23
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
24
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).

25
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
26
 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 porqué
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

27
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

28
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 menudo 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.

29
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 serie 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

30
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.

31
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.

32
 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.

33
 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.
34
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
35
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 refleja 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:

36
 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):

Tamaño Rango de valores


(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


37
-2345678 = -0.2345678 x 10 7 = - 0.2345678E+7

Los tipos de datos reales a su vez pueden clasificarse en dos, como se puede
apreciar en la tabla 2:

Tamaño
Tipo Intervalo aproximado
(bits)
Simple 32 -3.4 × 10 38 a +3.4 × 10 38
Doble 64 ±5,0 × 10 −324 a ±1,7 × 10 308

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.
38
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: π * r2.

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 ( \ ) División (entera)
MOD ( % ) Resto de la división

Tabla 3. Operadores aritméticos.

39
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

40
-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:


41
 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 DESCRIPCIÓN TIPO DE DATO TIPO DE DATO


DEL DEL
ARGUMENTO (X) RESULTADO
abs (x) Valor absoluto de x Entero o real Entero o real
arctan (x) Arco tangente de x Entero o real Real
cos (x) Coseno de x Entero o real Real
exp (x) Exponencial de x Entero o real Real
ln (x) Logaritmo natural de x Entero o real Real
log (x) Logaritmo en base 10 de x Entero o real Real
round (x) Redondeo de x Real Entero

1
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.
42
sen (x) Seno de x Entero o real Real
sqr (x) Cuadrado de x Entero o real Real
sqrt (x) Raíz cuadrada de x Entero o real Real
tan (x) Tangente de x Entero o real Real

Algunos ejemplos de utilización de funciones internas son:

EJEMPLO RESULTADO
abs (-3) 3
arctan (12.34) 1.899357
cos (0.7854) 0.7061055
exp (3.1) 22.197913
ln (20) 2.9957323
log (15) 1.176091259
round (3.75) 4
sen (0.5236) 0.5000011
sqr (6.2) 38.44
sqrt (15.4) 3.9242834
tan (15) -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.

43
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:

𝐴+𝐵
+ 20
𝐶−𝐴

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:

44
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)
45
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:

b. X  Y  3X  4Y c. 4 X  2 X  8
2
a. X 2  4YZ
Z 5 cd

 b  ( b 2  4ac)
d. e. 4  f . A  BC  ( D ) 3
2a 3

g. (A 3 ) 2  BC
DE
12) Escriba las siguientes expresiones algorítmicas como expresiones algebraicas:
a. B * *2  X * Y b. 5 * X * *2  X * *3 * 5

c. (A  B) / (C  A ) d. X * Y  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

46
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

47
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.

48
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:
Tipo_dato variable; //Primero declarar la variable
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.
49
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
Inicio
Entero B, H, A;
Escribir “Área de un triángulo”;
“Á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

“Área del triángulo: ”, A

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).

50
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;
Aux = A;
A, B
A = B;
B = Aux;
“Contenido original: ”, A, B
Escribir “Luego de intercambio: ”, A, B;
FIN_INICIO
Aux = A
A=B
B = Aux

“Luego de intercambio: ”, A, B

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:
51
 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:
SI ( Condición ) ENTONCES
No
Condición 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 No
Condición

Acciones 1 Acciones 2

Pseudocódigo:
SI ( Condición ) ENTONCES
Acciones 1;
SINO
Acciones 2;
FIN_SI
Figura 12. Condicional doble.
52
 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.

No
Condi1

Si

Si No
Condi2

Acciones 1 Acciones 2

Acciones 4 Acciones 3

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 No
AND/OR
Condición2
Acciones 1 Acciones 2

Figura 14. Condiciones compuestas.


53
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:
Mientras ( Condición )
No
Condición Acciones
FIN_MIENTRAS
Si

Acciones (repetir)

Figura 15. Ciclo mientras.


54
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 + <valor constante>

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 + <expresión>

Como también aparece al lado derecho, antes de utilizarlo se hace necesario asignarle
un valor inicial, por ejemplo: ACUMULADOR = 0.

55
 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.

56
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.

57
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
Val_2 [Default]
ValN

Acciones1 Acciones2 AccionesN 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.

58
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.

59
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)

Condición
Si

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

60
 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

61
 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;

62
 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
63
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.

64
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 un rectángulo
dado 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.

65
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 libra perdida.
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).
Considerar que la serie de Fibonacci se define de la siguiente manera:

66
El primer elemento de la serie es una unidad (1)
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

29) 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.
30) 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.
31) Escribir un programa en pseudocódigo para imprimir las 30 primeras potencias de 4
(41, 42, 43, etc.)
32) Escribir un programa en pseudocódigo que permita leer sólo los números que
representen a un mes.
33) Escribir un programa en pseudocódigo que permita leer tres números desde el teclado y
deduzca si han sido ingresados en forma ascendente (de menor a mayor).
34) 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.
35) Escribir un programa en pseudocódigo que permita obtener las tablas de multiplicar de
los números dígitos mediante bucles anidados.
36) 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.
37) 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.
67
38) 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.
39) 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) ´.
40) 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ú.
41) 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.
42) 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.
43) 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).
44) 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).

68
CAPÍTULO 4
INTRODUCCIÓN AL FRAMEWORK DE .NET

En este capítulo veremos cuáles son los principales conceptos que debemos 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:

69
 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.


70
 El entorno de ejecución de aplicaciones o runtime es el denominado Common
Language Rutime (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
71
especificaciones del CLR y de las BCL para el desarrollo de las aplicaciones, y siguen
un estándar denominado Common Language Specification (CLS), lo que hace que sean
completamente compatibles entre sí.

Existen muchos lenguajes para programar en .NET, como Visual Basic .NET, C# (C-
Sharp), 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 clases o de
controles tienen extensión dll.

72
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.

73
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 (Integrated Development Environment) 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 del 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.

74
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.

d
c

e
b

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

75
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 Common Type System, (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
76
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 Doublé
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:
77
const int maximo = 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;
78
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:

const int maximo = 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;

79
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#

80
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
{
81
//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
}

82
 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);

83
 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
{
84
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;
85
}
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.

86
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
87
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.

88
Pasa
<Instrucciones 1> información
cede control Subprograma
<Llamada uno a A> Retorna A
control e
<Instrucción 3> información
<Instrucciones>
Pasa
información
cede control
Subprograma
<Llamada uno a B> Retorna B Cede control
control e Subprograma
<Instrucción i> información C
Llamada a C Retorna
Pasa control
<Instrucción i>
información <Instrucciones>
cede control Subprograma
<Llamada dos a A> Retorna A
control e
<Instrucción k> información
<Instrucciones>

<Instrucción 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.

89
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:

static void 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 recibo son las variables que van a recibir información del 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 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

90
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.
91
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.

92
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

93
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

94
 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.

95
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

96
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.


97
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] <BASURA> Dirección X
EDAD[1] <BASURA> Dirección X + 1
EDAD[2] <BASURA> Dirección X + 2
EDAD[3] <BASURA> Dirección X + 3
EDAD[4] <BASURA> 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]


98
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] <BASURA> Dirección X + 1
EDAD[2] 20 Dirección X + 2
EDAD[3] <BASURA> 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;

99
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;
100
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
*/

101
 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

102
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 VECTOR ORIGINAL DE TAMAÑO 5 (N)


55 80 35 21 15
55 35 80 21 15
55 35 21 80 15
55 35 21 15 80

Se necesitaron 4 comparaciones (N-1) para colocar el valor mayor de último.

103
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

Cuarta pasada:

15 21 35 55 80

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.


104
 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
Filas

1
2 X
3
4
Figura 26. Representación gráfica de una matriz (A).

105
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 1 2 3 4 5 6
0 10
Filas

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á

106
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.

107
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.GetLength(0); i++)
{
Console.WriteLine("\nDatos del alumno No. {0}", i+1);
Console.Write("Nombre:\t");
nomina[i] = Console.ReadLine();
for (j = 0; j <notas.GetLength(1); j++)
{
Console.Write("Nota {0}:\t",j+1);
108
notas[i, j] = Convert.ToSingle(Console.ReadLine());
}
}
}

static void mostrar(string[] nomina, float[,] notas)


{
int i, j;
for (i = 0; i <notas.GetLength(0); i++)
{
Console.Write(nomina[i]);
for (j = 0; j <notas.GetLength(1); j++)
Console.Write("\t{0}", notas[i, j]);

Console.WriteLine();
}
}

static float calcularPromedio(float[,] notas)


{
int i, j;
floatsuma=0;
for (i = 0; i <notas.GetLength(0); i++)
for (j = 0; j <notas.GetLength(1); j++)
suma+=notas[i,j];
return suma / notas.Length;
}

109
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.
110
BIBLIOGRAFÍA

 Aho, Alfed. Et. Al. (1998). Estructura de datos y algoritmos. Addison-Wesley.México.

 Charte, Francisco. (2002). Programación con Visual C# .NET. Anaya. España.

 Ferguson, Jeff. . Et. Al. (2003). La Biblia de C#. Anaya Multimedia. España.

 Joyanes Aguilar, Luis. (2003). Fundamentos de programación. Algoritmos, estructuras


de datos y objetos. Tercera edición. McGraw-Hill. España.

 Joyanes Aguilar, Luis. Programación en C: Metodología Algoritmos y Estructura de


Datos. McGraw-Hill. España.

 Liberty, Jesse. (2005). Programming C#. O'Reilly. United States of America.

 Montenegro, Carlos. (1999). Programación Algorítmica. Ecuador.

 Ñacato, José. (1998). Cómo diseñar algoritmos para computadoras. Editorial Parra.
Ecuador.

 Rodríguez Almeida, Angel. (1991). Metodología de la Programación a través de


pseudocódigo.McGraw-Hill. España.

111

Вам также может понравиться