Académique Documents
Professionnel Documents
Culture Documents
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.
3
CONTENIDO
Tema Págs.
PORTADA 1
PORTADILLA 2
PREFACIO 3
CONTENIDO 4
INTRODUCCIÓN 7
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
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.
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:
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
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).
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.
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.
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.
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.).
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.
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.
13
Programación y lenguaje de programación
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.
14
instrucciones, cada una de las cuales especifica ciertas operaciones que debe ejecutar la
computadora.
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.
Los inconvenientes -en la actualidad- superan a las ventajas, lo que hace prácticamente no
recomendables los lenguajes máquina. Estos inconvenientes son:
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.
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.
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.
Transportabilidad.
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.
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).
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.
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.
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.
Direcciones de memoria
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
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.
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.
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
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
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
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.
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.
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.
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.
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
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.
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
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.
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
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.
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
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.
Inicio
N1, N2
SUMA = N1 + N2
SUMA
Fin
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
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.
36
Datos numéricos. Es el conjunto de valores numéricos. Estos pueden representarse en
dos formas distintas:
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.
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
Datos tipo carácter y texto (cadena). Los datos de tipo carácter contienen un solo
carácter, que puede ser:
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.
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.
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
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
Símbolo Significado
< Menor que
> Mayor que
== Igual que
<= Menor o igual que
>= Mayor o igual que
! = (<>) Diferente
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
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.
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.
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
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
𝐴+𝐵
+ 20
𝐶−𝐴
Solución:
(A + B)/(C - A) + 20
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 cd
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
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.
Acción1
Acción2
AcciónN
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.
Pseudocódigo:
Tipo_dato variable; //Primero declarar la variable
Variable
Leer Variable;
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
Fin
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
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
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
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
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)
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.
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.
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”).
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.
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).
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.
Variable
Val_1
Val_2 [Default]
ValN
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.
58
Var = VI ;condi ; inc
Acciones (repetir)
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.
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.
Acciones (repetir)
Condición
Si
No
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
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:
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
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
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);
ii + 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
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.
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.
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.
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.
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.
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.
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.
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
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.
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:
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:
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
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
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
Ejercicios resueltos
Elaborar un algoritmo que, dados los dos lados diferentes de un rectángulo, encuentre el
perímetro y el área del mismo.
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 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.
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.
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.
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>
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
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.
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:
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):
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.
Tipo_datonombre_Parámetro
refTipo_datonombre_Parámetro
93
Ejercicios resueltos
Elaborar una función que encuentre el valor mayor en un conjunto de 3 números reales
diferentes.
94
Elaborar un subprograma que encuentre el factorial de un número entero mayor o igual
a cero.
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.
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:
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.
nombre [xx]
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.
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á.
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.
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!";
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:
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\";
Búsqueda.
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.
102
descendente. Si el ordenamiento es creciente o ascendente, significa que hay que organizar
sus elementos de tal manera que:
Existen diferentes modelos para organizar los elementos de un arreglo, siendo el más
común el método de burbuja.
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
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:
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.
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.
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
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:
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
107
static void Main(string[] args)
{
string[] nomina;
float[,] notas;
intnumAl;
ingresar(nomina,notas);
Console.WriteLine("\nLISTADO DE ALUMNOS");
Console.WriteLine("Nombres\tN1\tN2\tN3");
mostrar(nomina,notas);
Console.WriteLine();
}
}
109
Ejercicios propuestos
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.
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
Ferguson, Jeff. . Et. Al. (2003). La Biblia de C#. Anaya Multimedia. España.
Ñacato, José. (1998). Cómo diseñar algoritmos para computadoras. Editorial Parra.
Ecuador.
111