Apuntesprog
Apuntesprog
Apuntesprog
PROGRAMA
Es una lista de instrucciones que la computadora debe seguir para procesar datos y
convertirlos en información. Las instrucciones se componen de enunciados usados en
lenguajes de programación como Basic, Pascal o C.
DATOS:
Son las características propias de cualquier entidad. Por ejemplo: los datos de una
persona como su edad, fecha de nacimiento, domicilio,número de teléfono, etc.
INFORMACIÓN:
PROCESAMIENTO DE DATOS:
Consiste en la recolección de datos de entrada que son evaluados y ordenados para ser
colocados de manera que produzcan información útil.
En este paso se genera una solución con técnicas de programación como diseño
descendente de programas, pseudocódigos, flujogramas y estructuras lógicas.
3. Codificación del programa
Es la generación real del programa con un lenguaje de programación. En esta etapa se
hace uso de la lógica que desarrolló en el paso del diseño del programa para
efectivamente generar un programa. Se debe seleccionar el lenguaje apropiado para
resolver el problema.
b) Errores de Ejecución
Se deben generalmente a operaciones no permitidas como dividir por cero, leer un dato
no numérico en una variable numérica, exceder un rango de valores permitidos, etc. Se
detectan porque se produce una parada anormal del programa durante su ejecución.
c) Errores de Lógica
Corresponden a la obtención de resultados que no son correctos y la única manera de
detectarlos es realizando suficientes pruebas del programa. Son los más difíciles de
corregir, no sólo por la dificultad de detectarlos, sino porque se deben a la propia
concepción y diseño del programa.
d) Errores de Especificación
Es el peor tipo de error y el más difícil de corregir. Se deben a mal diseño del programa
posiblemente por mala comunicación usuario programador y se detectan cuando ya se
ha concluido el diseño e instalación del programa, lo cual puede implicar repetir gran
parte del trabajo realizado.
Prueba : :
Consiste en verificar la funcionalidad del programa a través de varios métodos para
detectar errores posibles.
Métodos de Prueba:
Chequeo de escritorio
Prueba manual de datos de muestra
Intento de traducción
Prueba de datos de muestra en la computadora
Prueba por un grupo selecto de usuarios potenciales.
a. Chequeo de Escritorio:
El programador se sienta frente a un escritorio y corrige una impresión del programa.
Revisa el listado línea por línea en busca de errores de sintaxis y lógica.
c. Intento de Traducción:
El programa corre en una computadora usando un programa traductor para convertirlo a
lenguaje de máquina. Para ello debe estar ya libre de errores de sintaxis, de lo contrario
serán identificados por el programa de traducción.
A los operadores por si se presentan mensajes de error, sepan cómo responder a ellos.
Además que se encargan de darle soporte técnico al programa.
A los programadores a través del manual del analista para que recuerden aspectos de la
elaboración del programa o en caso que otras personas puedan actualizarlo o
modificarlo (darle mantenimiento) y no son necesariamente las personas que lo
diseñaron. Es por ello, que la documentación debe contener algoritmos y flujogramas de
los diferentes módulos que lo constituyen y las relaciones que se establecen entre ellos;
listados del programa, corridas, descripción de variables que se emplean en cada
módulo, cuáles son comunes a diferentes módulos y cuáles locales; descripción de los
ficheros de cada módulo y todo lo que sea de importancia para un programador.
A los analistas de sistemas que son las personas que deberán proporcionar toda la
información al programador. Estos se encargan de hacer una investigación previa de
cómo realizar el programa y documentar con las herramientas necesarias para que el
programador pueda desarrollar el sistema en algún lenguaje de programación adecuado.
Definiciones de Lógica:
- Es el estudio crítico del razonamiento y tiene un valor teórico y práctico.
- Es el estudio de los métodos y principios usados al distinguir entre los argumentos
correctos (buenos) y los argumentos incorrectos (malos).
- En un sentido amplio, es el estudio del correcto razonamiento.
¿Qué es Lógica?
Lógica Deductiva
Es la que se encarga de determinar la validez o invalidez de los argumentos. Permite
proporcionar la simbología que nos servirá para facilitar el desarrollo de la capacidad de
análisis de problemas, para obtener una solución posible.
Argumentos.
Cuando el razonamiento se expresa con palabras, recibe el nombre de "argumento". Un
argumento es un grupo cualquiera de proposiciones o enunciados que forman premisas
y conclusiones. Este puede constar de varias premisas pero de una sola conclusión.
Premisas y Conclusión
Las premisas de un argumento son proposiciones afirmadas como fundamento o razones
para aceptar una conclusión. La conclusión es la proposición afirmada que se basa en
las otras proposiciones o premisas. Una proposición puede ser premisa en un argumento
y conclusión en otro. Por ejemplo: "Todos los hombres son mortales" Aparece como
premisa en el siguiente argumento:
"Todos los hombres son mortales"
"Sócrates es un hombre"
"Por lo tanto, Sócrates es mortal ".
Expresiones como "por tanto", "por lo cual", "de ello se deduce", sirven para introducir
la conclusión de un argumento, en tanto que "pues" y "porque" se emplean para
introducir las premisas.
Otro Ejemplo:
"Todos se aburren en la conferencia".
"Ninguno de los que se aburren presta atención".
"Por consiguiente, ninguno de los asistentes está prestando atención".
Hay dos condiciones que debe satisfacer un argumento para establecer la verdad de su
conclusión: Debe ser válido y todas sus premisas deben ser verdaderas.
Enunciado Simple:
Es el que no contiene otro enunciado como parte componente. Ej. "Las rosas son
rojas"
Enunciado compuesto:
Es el que se compone de varios enunciados. Ej. "Las rosas son rojas y las violetas son
azules".Cuando los enunciados se unen por la conjunción Y, se denominan
Enunciados conyuntos.
Es el tipo de lenguaje que cualquier computadora es capaz de entender. Se dice que los
programas escritos en forma de ceros y unos están en lenguaje de máquina, porque esa
es la versión del programa que la computadora realmente lee y sigue.
Generaciones de Lenguajes :
1. lenguajes de máquina
2. lenguajes ensambladores
3. lenguajes de procedimientos
4. lenguajes orientados a problemas
5. lenguajes naturales
5. Lenguajes naturales
Lenguajes orientados a aplicaciones en inteligencia artificial, como lisp y prolog.
Dentro de este campo destacan las aplicaciones en sistemas expertos, juegos, visión
artificial (Jurasic Park) y robótica. Lisp es un lenguaje para procesamiento de listas y
manipulación de símbolos. Prolog es un lenguaje basado en la lógica, para aplicaciones
de bases de datos e Inteligencia Artificial.
Podemos decir entonces, que los lenguajes de alto nivel, tienen las ventajas de mayor
legibilidad de los programas, portabilidad, facilidad de aprendizaje y facilidad de
modificación.
PARA ANALIZAR:
1. ¿Cuál es la diferencia fundamental entre los lenguajes de alto nivel y bajo nivel?
2. Investigar analogías y diferencias entre el código máquina y el lenguaje ensamblador.
3. Buscar información que permita decidir cuáles serían los lenguajes de programación
más apropiados para realizar: aplicaciones para gestión de oficinas, complejos cálculos
científicos, un sistema experto en medicina, un simulador de vuelo, manipulación de
bases de datos, control de un robot industrial.
Sugerencias de ampliación:
Clasificación de los lenguajes de alto nivel
Lenguajes de propósito general:
5. Algoritmos y diagramas de flujo- Intérpretes y
complicadores.
Complicador
Es un programa que traduce un programa escrito en un lenguaje de alto nivel, por
ejemplo C++, en un programa en lenguaje de máquina que la computadora es capaz de
entender y ejecutar directamente. Un compilador es un tipo especial de programa, en
cuanto a que sus entradas o datos son algún programa y su salida es otro programa. Para
evitar confusiones, solemos llamar programa fuente o código fuente al programa de
entrada, y programa objeto o código objeto a la versión traducida que el compilador
produce. Código se usa frecuentemente para referirse a un programa o a una parte de él,
sobre todo cuando se habla de programas objeto.
Ejemplo:
Pascal
Cobol
Fortran
Ada
Código Fuente
Código Objeto
Código Ensamblador
Modula 2
C , C++
El compilador, informa al usuario de la presencia de errores en el programa fuente,
pasándose a crear el programa objeto cuando está libre de errores. El código objeto
puede ser ejecutado posteriormente. Una vez traducido un programa, su ejecución es
independiente de su compilación. involucra dos pasos en su operación:
1. Convertir código fuente a objeto
2. Ejecutar el código objeto
Ventaja:
Fases de compilación
Ventaja:
Las ventajas de los intérpretes son:
· Resulta más fácil localizar y corregir errores (depuración de programas)
- son más pedagógicos para aprender a programar.
· El programa es más fácil de desarrollar.
Traducen programas de alto nivel. No se genera en la mayoría de los ficheros.
Programa
Fuente
Código
Intermedio
Programa
Objeto
Con el intérprete, cada vez que necesitamos ejecutar el programa tenemos que volver a
analizarlo porque no hay código objeto.
Con el compilador, aunque más lenta la traducción, sólo se realiza una vez.
Ejemplo 4
Supongamos que se han almacenado tres valores 5 = 01012, 25 = 110012 y 58 =
1110102 en las posiciones de memoria con direcciones 4,5 y 6.
Queremos multiplicar los dos primeros valores, sumar el tercero y almacenar el
resultado en la palabra de memoria 7.
Para llevar a cabo este cálculo, se deben ejecutar las siguientes instrucciones:
Recuperar el contenido de la palabra de memoria 4 y cargarlo en el registro acumulador
de la unidad aritmético lógica.
Recuperar el contenido de la palabra de memoria 5 y calcular el producto de este valor y
el valor situado en el acumulador.
Recuperar el contenido de la palabra de memoria 6 y sumar su valor con el valor situado
en el registro acumulador.
Almacenar el contenido del registro acumulador en la palabra de memoria 7. Para
almacenar estas instrucciones en la memoria de la computadora, deben estar
representadas en forma binaria. Las direcciones de los datos no presentan problemas,
puesto que pueden ser convertidos fácilmente a direcciones binarias:
4 = 100
5 = 101
6 = 110
7 = 111
LOAD = 16 = 10000
STORE = 17 = 10001
ADD = 35 = 100011
MULTIPLY = 36 = 100100
SUB = 37 = 100101
DIV = 38 = 100110
Usando parte de una palabra para almacenar el código de operación y otra para la
dirección del operando, podemos representar nuestra secuencia de instrucciones en
lenguaje máquina como sigue:
1. 0001000000000100
2. 0010010000000101
3. 0010001100000110
4. 0001000100000111
Estas pueden ser almacenadas en cuatro palabras consecutivas de memoria. Cuando se
ejecuta el programa, la unidad de control recuperará cada una de las instrucciones, la
decodificará para determinar la operación y la dirección del operando, recuperará el
operando, y entonces ejecutará la operación requerida, usando la unidad aritmético
lógica cuando sea necesario. Los programas para las primeras computadoras tuvieron
que ser escritos en lenguaje de máquina. Posteriormente fue posible escribirlos en
lenguaje ensamblador usando códigos nemotécnicos en lugar de códigos de operación
numéricos y nombres de variables en lugar de direcciones numéricas.
Por ejemplo la secuencia de instrucciones anteriores se escribiría así:
1. LOAD A
2. MULT B
3. ADD C
4. STORE X
Luego que se crearon los lenguajes de alto nivel, las instrucciones se escribían en forma
más entendible para el programador. El ejemplo anterior podría ser como lo siguiente
usando C++:
X=A*B+C
Ejercicios Propuestos:
Usando mnemónicos de instrucción y códigos de operación, escriba una secuencia de
instrucciones en a) Lenguaje ensamblador b) Lenguaje de máquina, equivalente a las
instrucciones de C++:
1. X = (A - B) * C
X = (A+B) / (C+D)
X = (A + B) - C
Las variables son zonas de memoria cuyo contenido cambia durante la fase de
procesamiento de información. Son objetos cuyo valor puede ser modificado a lo largo
de la ejecución de un programa. Las variables llevan un nombre llamado identificador.
Este puede ser una cadena de letras y dígitos, empezando siempre con una letra. Por
ejemplo: Pi, curso99, nom_alum,etc.
Los Identificadores son palabras creadas por los programadores para dar nombre a los
objetos y demás elementos que necesitamos declarar en un programa: variables,
constantes, tipos, estructuras de datos, archivos, subprogramas, etc. En C++ las letras
mayúsculas se tratan como diferentes y distintas unas de otras. Por ejemplo, contador,
Contador y CONTADOR son tres nombres de identificadores distintos. Un identificador
no puede ser igual a una palabra reservada, y no debe tener el mismo nombre que una
función, ya sea definida por el usuario o de la biblioteca de C. Constantes : Son objetos
cuyo valor permanece invariable a lo largo de la ejecución de un programa. Una
constante es la denominación de un valor concreto, de tal forma que se utiliza su
nombre cada vez que se necesita referenciarlo. Por ejemplo, si se desea obtener un
reporte para cada uno de los empleados de una empresa, con sus datos generales, la
fecha y cantidad de dinero que recibieron la última semana, el dato fecha puede ser una
constante ya que es el mismo para todos.
Operación de Asignación:
Tipos de datos Numéricos son aquellos cuyo contenido es una serie de dígitos (0-9) que
en conjunto nos proporcionan un valor numérico ya sea entero o real y pueden ser
precedidos de un signo + ó -. Tipos de datos Alfanuméricos son aquellos cuyo contenido
son letras del abecedario, números o caracteres especiales o bien una combinación de
ellos.
Tipos de Instrucciones:
Tipos de Operadores:
Jerarquía de Operaciones:
()
signo
Potencia
Producto y división
Div
Mod
Suma y resta
Concatenación
Relacionales
Negación
And
Or
Datos de tipo entero tienen los operadores +, -, *, /, div, mod, abs, sqr, sqrt, ln, exp, sin,
cos, tan, pow, etc. Los datos de tipo real tienen los mismos operadores enteros y además
trunc, round, int, y otros. La suma y multiplicación de datos de tipo real cumplen la
propiedad conmutativa, pero no siempre la asociativa y la distributiva.
Para resolver una expresión aritmética se deben seguir las siguientes reglas:
· Primero se resuelven las expresiones que se encuentran entre paréntesis.
· Se procede aplicando la jerarquía de operadores.
· Al evaluar una expresión, si hay dos operadores con la misma jerarquía, se procede a
evaluar de izquierda a derecha.
· Si hay expresiones relacionales, se resuelven primero paréntesis, luego se encuentran
los valores de verdad de las expresiones relacionales y por último se aplica jerarquía de
operadores lógicos. En caso de haber iguales, proceder de izquierda a derecha.
EJERCICIOS.
Aplicando la jerarquía de los operadores, encontrar el valor de cada una de las
siguientes expresiones:
1) 4 + 1 * 5 ^ 2 - 1
2) 9 / 3 + 4 ^ 2 - 5 * 1 + 9 / -2 + 3
3) 5 / 2 + 3 - 4 * 5 / 2
4) (4 + 1) * 5 ^ 2 - 1
5) 17 / 2 + 3 ^ 2 ^ 2 - 2 * 2 / 2
1. Not ((M > N and R > S) or (NOT(T < V and S > M))) para M=8, N=9, R=5, S=5 ,
T=4 y V= 2
2. (3 * 2 ^ 2 - 4 / 2 * 1) > (3 * 2 ^ -4 / 2 * 1) and (5 > 9 / 3)
7. Herramientas de programación.
Algoritmo : es una serie de operaciones detalladas a ejecutar paso a paso, que conducen
a la resolución de problemas. Es un conjunto de reglas para resolver determinado
problema describiendo de forma lógica su solución. Cada una de las acciones de que
consta un algoritmo es denominada sentencia y éstas deben ser escritas en términos de
cierto lenguaje comprensible para el computador, que es el lenguaje de programación.
Para diseñar un algoritmo se debe comenzar por identificar las tareas más importantes
para resolver el problema y disponerlas en el orden en que han de ser ejecutadas.
Partes de un Algoritmo
8. Representación gráfica de algoritmos.
a) Descripción Narrada
b) Pseudocódigo
c) Diagramas de Flujo
d) Diagramas N- S (Nassi-Schneiderman o de Chapin)
1 Descripción Narrada
Este algoritmo es caracterizado porque sigue un proceso de ejecución común y lógico,
describiendo textualmente paso a paso cada una de las actividades a realizar dentro de
una actividad determinada.
Ejemplo 1 Algoritmo para asistir a clases:
1. Levantarse
2. Bañarse
3. Vestirse
4. Desayunar
5. Cepillarse los dientes
6. Salir de casa
7. Tomar el autobús
8. Llegar al ITCA
9. Buscar el aula
10. Ubicarse en un asiento
2.Descripción en Pseudocódigo
Pseudo = falso. El pseudo código no es realmente un código sino una imitación y una
versión abreviada de instrucciones reales para las computadoras. Es una técnica para
diseño de programas que permite definir las estructuras de datos, las operaciones que se
aplicarán a los datos y la lógica que tendrá el programa de computadora para solucionar
un determinado problema. Utiliza un pseudolenguaje muy parecido a nuestro idioma,
pero que respeta las directrices y los elementos de los lenguajes de programación. Se
concibió para superar las dos principales desventajas de los flujogramas: lento de crear
y difícil de modificar sin un nuevo redibujo.
Ejemplo 1
Diseñar un algoritmo que lea cuatro variables y calcule e imprima su producto, suma y
media aritmética.
inicio
leer (a, b, c, d)
producto <-- (a * b * c * d)
suma <-- (a + b + c + d)
media <-- (a + b + c + d) / 4
escribir (producto, suma, media)
fin
3. Diagramas N-S
Son una herramienta que favorece la programación estructurada y reúne características
gráficas propias de diagramas de flujo y lingüísticas propias de pseudocódigos. Constan
de una serie de cajas contiguas que se leerán siempre de arriba-abajo y sus estructuras
lógicas son las siguientes:
Estructura Secuencial
4. Diagramas de Flujo.
Son la representación gráfica de la solución algorítmica de un problema. Para diseñarlos
se utilizan determinados símbolos o figuras que representan una acción dentro del
procedimiento. Utilizan unos símbolos normalizados, con los pasos del algoritmo
escritos en el símbolo adecuado y los símbolos unidos con flechas, denominadas líneas
de flujo, que indican el orden en que los pasos deben ser ejecutados.
Estructura Secuencial.
Se caracteriza porque una acción se ejecuta detrás de otra. El flujo del programa
coincide con el orden físico en el que se han ido poniendo las instrucciones. Dentro de
este tipo podemos encontrar operaciones de inicio/fin, inicialización de variables,
operaciones de asignación, cálculo, sumarización, etc. Este tipo de estructura se basa en
las 5 fases de que consta todo algoritmo o programa:
Definición de variables (Declaración)
Inicialización de variables.
Lectura de datos
Cálculo
Salida
Ejemplo 1.
Se desea encontrar la longitud y el área de un círculo de radio 5.
Solución.
El objetivo del ejercicio es encontrar la longitud y el área de un círculo con un radio
conocido y de valor 5. Las salidas serán entonces la longitud y el área. (Fase 5 del
algoritmo) Sabemos que la longitud de un círculo viene dada por la fórmula 2 * pi *
radio y que el área viene dada por pi * radio al cuadrado. (Fase 4 del algoritmo) Si
definimos las variables como: (fase 1 del algoritmo)
L = Longitud A = área R = radio pi = 3.1416 hagamos el algoritmo:
Inicio
Pi ¬ 3.1416 (definición de un valor constante)
R ¬ 5 (radio constante ya que es conocido su valor)
A ¬ pi * R ^ ² (asignación del valor del área)
L ¬ 2 * pi * R (asignación del valor de la longitud)
Escribir (A, L) (salida del algoritmo)
Fin
En este ejercicio no existen datos de entrada ya que para calcular el área y la longitud
necesitamos únicamente el radio y el valor de Pi los cuales ya son dados en el problema
Modificar el problema anterior para que sea capaz de calcular el área y la longitud de un
círculo de cualquier radio requerido.
Solución.
Algoritmo:
Inicio
Pi ¬ 3.1416 (fase de inicialización)
Leer (R) (fase de lectura)
Area ¬ pi * R ^ ² (fase de cálculos)
L ¬ 2 * pi * R
Escribir ( A, L ) (fase de salida)
Fin
Ejemplo 3.
Leer el sueldo de tres empleados y aplicarles un aumento del 10, 12 y 15%
respectivamente. Desplegar el resultado.
Salidas: Sueldos finales
Entradas: Salarios de los empleados
Datos adicionales: aumentos del 10, 12 y 15%
Cálculos:
Sueldo final = sueldo inicial + aumento
Aumento = sueldo inicial * porcentaje/100
Definición de variables:
Sf1, Sf2, Sf3 = los sueldos finales
S1, S2, S3 = salarios de los empleados
Aum1, aum2, aum3 = aumentos
ALGORITMO
Inicio
Leer (S1,S2,S3)
Aum1 ¬ S1 * 0.10
Aum2 ¬ S2 * 0.12
Aum3 ¬ S3 * 0.15
Sf1 ¬ S1 + Aum1
Sf2 ¬ S2 + Aum2
Sf3 ¬ S3 + Aum3
Escribir (SF1,SF2,SF3)
Fin
FLUJOGRAMA
10. Tipos de estructuras selectivas. Estructura simple.
Estas estructuras se identifican porque en la fase de solución del problema existe algún
punto en el cual es necesario establecer una pregunta, para decidir si ciertas acciones d
eben realizarse o no.
a) Simples
b) Dobles
c) Compuestas
d) Múltiples
Español Inglés
Si <condición> If <condición>
Entonces then
<acción Si> <acción Si>
fin_si endif
Ejemplo 1.
Construir un algoritmo tal, que dado como dato la calificación de un alumno en un
examen, escriba "Aprobado" en caso que esa calificación fuese mayor que 8.
Salidas: mensaje de aprobado si se cumple la condición.
Entradas: calificación
Representación pseudocodificada.
Español Inglés
Si <condición> entonces If <condición> then
<acción S1> <acción S1>
sino else
<acción S2> <acción S2>
Fin_Si End_if
Entonces, si una condición C es verdadera, se ejecuta la acción S1 y si es falsa, se
ejecuta la acción S2.
Ejemplo 1
Ejemplo 2.
Dado como dato el sueldo de un trabajador, aplicar un aumento del 15% si su sueldo es
inferior a $1000 y 12% en caso contrario, luego imprimir el nuevo sueldo del trabajador.
EXPRESIONES LÓGICAS
Ejemplos:
Un ejemplo en el cual usamos el operador lógico AND sería:
Una escuela aplica dos exámenes a sus aspirantes, por lo que cada uno de ellos obtiene
dos calificaciones denotadas como C1 y C2. El aspirante que obtenga calificaciones
mayores que 80 en ambos exámenes es aceptado; en caso contrario es rechazado.
En este ejemplo se dan las condiciones siguientes:
Si (C1 >= 80) y (C2 >= 80) entonces
Escribir ("aceptado")
Sino
Escribir ("rechazado")
Fin_si
Note que también usa operadores relacionales. Por lo general cuando hay operadores
lógicos, éstos van acompañados de operadores relacionales. Un ejemplo usando el
operador lógico OR sería:
Una escuela aplica dos exámenes a sus aspirantes, por lo que cada uno de ellos obtiene
dos calificaciones denotadas como C1 y C2. El aspirante que obtenga una calificación
mayor que 90 en cualquiera de los exámenes es aceptado; en caso contrario es
rechazado.
En este caso se dan las condiciones siguientes:
Si (C1 >=90) or (C2 >=90) entonces
Escribir ("aceptado")
Sino
Escribir ("rechazado")
Fin_si
La instrucción equivale a OR ya que nos dice que puede ser en cualquiera de los
exámenes no necesariamente en los dos. En el ejemplo 1 la palabra ambos equivalía a
seleccionar la instrucción AND. Si la instrucción nos dijera que obtenga una nota en
cualquiera de los exámenes pero no en ambos, nos estaría indicando una instrucción
XOR que es un tipo de OR pero exclusivo. Es decir, no puede considerarse el caso en
que tenga la misma nota en los dos exámenes, solo en uno de los dos.
Ejemplo 1.
Determinar la cantidad de dinero que recibirá un trabajador por concepto de las horas
extras trabajadas en una empresa, sabiendo que cuando las horas de trabajo exceden de
40, el resto se consideran horas extras y que éstas se pagan al doble de una hora normal
cuando no exceden de 8; si las horas extras exceden de 8 se pagan las primeras 8 al
doble de lo que se paga por una hora normal y el resto al triple.
Solución.
Lo primero que hay que determinar es si el trabajador trabajó horas extras o no.
Encontrar las horas extras de la siguiente forma:
Horas extras = horas trabajadas - 40
En caso que sí trabajó horas extras:
Si horas extras > 8 entonces a horas extras excedentes de 8 = horas extras -8 y pago por
horas extras = pago por hora normal * 2 * 8 + pago por hora normal * 3 * horas extras
excedentes de 8
De otra forma (solo horas al doble) pago por horas extras = pago por hora normal * 2 *
horas extras.
Finalmente, pago total que recibirá el trabajador será:
Pago = pago * hora normal * 40 + pago por horas extras.
Si no trabajó horas extras tendremos:
Pago = pago por hora normal * horas trabajadas.
Datos de salida: Pago.
Datos de entrada: número de horas trabajadas y pago por hora normal.
Definición de variables:
ht = horas trabajadas het = horas extras que exceden de 8
ph = pago por hora normal phe = pago por horas extras
he = horas extras pt = pago que recibe el trabajador
Algoritmo:
Inicio
Leer (ht, ph)
Si ht >40 entonces
He ¬ ht - 40
Si he > 8 entonces
Het ¬he - 8
Phe ¬ph * 2 * 8 + ph * 3 * het
Sino
Phe ¬ ph * 2 * he
Fin_si
Pt ¬ph * 40 + phe
Sino
Pt ¬ ph * ht
Fin_si
Escribir (pt)
Fin
Ejemplo 2.
Con frecuencia es necesario que existan más de dos elecciones posibles. Este problema
se podría resolver por estructuras selectivas simples o dobles, anidadas o en cascada,
pero si el número de alternativas es grande puede plantear serios problemas de escritura
y de legibilidad.
Usando la estructura de decisión múltiple se evaluará una expresión que podrá tomar n
valores distintos, 1, 2 , 3, ....,n y según que elija uno de estos valores en la condición, se
realizará una de las n acciones o lo que es igual, el flujo del algoritmo seguirá sólo un
determinado camino entre los n posibles.
Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción
1, si toma el valor 2 ejecutará la acción 2, si toma el valor N realizará la acción N.
Ejemplo 1:
Diseñar un algoritmo tal que dados como datos dos variables de tipo entero, obtenga el
resultado de la siguiente función:
Ejemplo 2.
Dados como datos la categoría y el sueldo de un trabajador, calcule el aumento
correspondiente teniendo en cuenta la siguiente tabla. Imprimir la categoría del
trabajador y el nuevo sueldo.
Definición de variables:
Cate = categoría
Sue = sueldo
Nsue = nuevo sueldo
ALGORITMO
Inicio
Leer (cate, sue)
En caso que cate sea
1: hacer nsue <-- sue * 1.15
2: hacer nsue <-- sue * 1.10
3: hacer nsue <-- sue * 1.08
4: hacer nsue <-- sue * 1.07
Fin_caso_que
Escribir (cate, nsue)
Fin
14. Estructuras repetitivas e iterativas.
En el flujograma anterior, observa que la flecha que se regresa hacia arriba nos está
indicando que hay que volver a evaluar la expresión. En ese caso como el bucle es
infinito, no se tiene una condición para terminar y se estará haciendo siempre. En el
siguiente ejemplo, ya se agregó una condición, la cual nos permitirá finalizar la
ejecución del bucle en el caso en que la condición se cumpla.
En los bucles cruzados, los cuales no son convenientes de utilizar, se tiene que
iniciamos un bucle y no se ha terminado cuando empezamos otro, luego utilizamos
estructuras goto (saltos) para pasar al bucle externo y se quedan entrelazados.
Esto puede ocasionar que el programa pierda el control de cuál proceso se está
ejecutando y podamos obtener resultados erróneos. Veamos gráficamente el diseño de
estas tres formas cíclicas:
15. Estructuras básicas.
Durante las siguientes lecciones estaremos estudiando tres estructuras básicas que son:
Estructura Desde/Para
Estructura Mientras
Estructura Repetir
Estructura Desde/Para:
Se usa frecuentemente cuando se conoce de antemano el número de veces que se
ejecutarán las acciones de un bucle. Esta es una de sus características.
Representación pseudocodificada:
Español Inglés
Desde var = valor inicial hasta valor final hacer For var=valor inicial to valor
final do
Acciones acciones
Fin_desde end_for
CONTADOR:
Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad
constante cada vez que se produce un determinado suceso o acción. Los contadores se
utilizan con la finalidad de contar sucesos o acciones internas de un bucle; deben
realizar una operación de inicialización y posteriormente las sucesivas de incremento o
decremento del mismo. La inicialización consiste en asignarle al contador un valor. Se
situará antes y fuera del bucle.
Representación:
<nombre del contador> ¬ nombre del contador> + <valor constante>
Si en vez de incremento es decremento se coloca un menos en lugar del más.
Ejemplo: i = i + 1
ACUMULADOR O TOTALIZADOR :
Es una variable que suma sobre sí misma un conjunto de valores para de esta manera
tener la suma de todos ellos en una sola variable. La diferencia entre un contador y un
acumulador es que mientras el primero va aumentando de uno en uno, el acumulador va
aumentando en una cantidad variable.
Representación: <Nombre del acumulador> ¬ <nombre del acumulador> + <valor
variable>
Ejemplo:
Calcular la suma de los cuadrados de los primeros 100 enteros y escribir el resultado. Se
desea resolver el problema usando estructura Desde, Mientras y luego Repetir.
Ejemplo 2.
Elaborar un flujograma para encontrar la suma de los K primeros números enteros.
En este ejemplo hemos utilizado un bucle repetir, el cual estudiaremos en otra lección.
Lo que queremos hacer notar por el momento, es cómo funcionan el contador y el
acumulador. Nota que N es el contador, el cual se inicializa en este caso, con cero, antes
de entrar al bucle. Dentro del bucle podrás notar que N se incrementa en 1.
También observa la variable suma, la cual es un acumulador que lleva la suma de los
números generados. También debe inicializarse con cero, ya que para sumar valores
debemos partir de cero, es decir, que al inicio no tenemos nada. Dentro del bucle, suma
se incrementa en un número N, pero la diferencia con el contador N, es que a suma le
sumamos N más ella misma.
EJERCICIO:
RESUMEN
Desde:
Los valores inicial y final de la variable de control se determinan antes de que empiece
la repetición y no pueden cambiarse durante la ejecución de la instrucción Desde.
Dentro del cuerpo del bucle Desde, los valores de las variables que especifican los
valores inicial y final pueden cambiar, pero esto no va a afectar al número de
repeticiones. La instrucción del cuerpo del bucle de una instrucción Desde puede
utilizar el valor de la variable de control, pero no debe modificar este valor. Esta
estructura se puede usar únicamente en aquellos casos en que conocemos el número de
veces que se va a realizar el ciclo.
Cuando se hace falsa, finaliza la repetición. En la lección anterior iniciamos con las
estructuras repetitivas. La estructura While y la estructura Repeat, se conocen como
Iterativas. Se usan cuando no se conoce con anticipación el número de veces que se
ejecutará la acción.
Existe otro caso de estructura conocida como Salto (Goto), la cual no es muy
recomendable de usar ya que su uso dificulta la legibilidad de un programa y tiende a
confundir por el hecho de recurrir a numerosas etiquetas o números de línea.
Observa en el flujograma, que se necesita una variable contadora (un índice), para llevar
la cuenta de las veces que entramos al cuerpo del ciclo. También es importante notar
que esta variable se inicializa antes de entrar al cuerpo del ciclo y dentro del cuerpo se
incrementa en una cantidad constante, por lo general en uno.
Esta variable a la vez, nos sirve para compararla con el valor dado en la condición,
cuando se cumple la condición, se sale del ciclo.
Representación pseudocodificada:
Español Inglés
Mientras <condición> While <condición> do
Acciones Acciones
Fin_mientras end_while
EJEMPLO:
Calcular la suma de los cuadrados de los primeros 100 números enteros y escribir el
resultado.
Solución.
Como recordarás, resolvimos este ejercicio en la lección anterior pero utilizando la
estructura Desde. Hoy lo haremos con la estructura Mientras.Que tendremos de
diferente?
CENTINELAS Y BANDERAS.
Cuando no se conoce a priori el número de iteraciones que se van a realizar, el ciclo
puede ser controlado por centinelas.
CENTINELAS.
En un ciclo While controlado por tarea, la condición de While especifica que el cuerpo
del ciclo debe continuar ejecutándose mientras la tarea no haya sido completada.
Cuando una decisión toma los valores de -1 o algún posible valor que no esté dentro del
rango válido en un momento determinado, se le denomina centinela y su función
primordial es detener el proceso de entrada de datos en una corrida de programa.
Si la lista de datos son números positivos, un valor centinela puede ser un número
negativo. Los centinelas solamente pueden usarse con las estructuras Mientras y
Repetir, no con estructuras Desde/Para. ¿PODRÍAS DECIR POR QUÉ?
Ejemplo:
Suponga que debemos obtener la suma de los gastos que hicimos en nuestro último
viaje, pero no sabemos exactamente cuántos fueron.
Si definimos gasto1, gasto2, gasto3, ...., -1 donde gastoi: real es el gasto número i y
sumgas: real es el acumulador de gastos efectuados. -1 es el centinela de fin de datos.
Algoritmo:
Inicio
Sumgas . 0
Leer (gasto)
Mientras gasto <> -1 hacer
Sumgas . sumgas + gasto
Leer (gasto)
Fin_mientras
Escribir (sumgas)
Fin
BANDERAS.
Conocidas también como interruptores, switch, flags o conmutadores, son variables que
pueden tomar solamente dos valores durante la ejecución del programa, los cuales
pueden ser 0 ó 1, o bien los valores booleanos True o False. Se les suele llamar
interruptores porque cuando toman los valores 0 ó 1 están simulando un interruptor
abierto/cerrado o encendido/apagado.
Ejemplo 1:
Leer un número entero N y calcular el resultado de la siguiente serie: 1 - 1/2+ 1/3 - 1/4
+.... +/- 1/N.
Algoritmo:
Inicio
Serie . 0
I.1
Leer (N)
Band . "T"
Mientras I <= N hacer
Si band = "T" entonces
Serie . serie + (1/I)
Band . "F"
Sino
Serie . serie - (1/I)
Band . "T"
Fin_si
I¬I+1
Fin_mientras
Escribir (serie)
Fin
Ejemplo 2.
Obtener suma de los términos de la serie: 2, 5, 7, 10, 12, 15, 17, .... 1800.
Sumser de tipo entero, es el acumulador de términos de la serie
Band de tipo carácter, es variable auxiliar que indica si al siguiente término de la serie
hay que sumarle 3 ó 2.
Algoritmo:
Inicio
I ¬2
Sumser ¬0
Band ¬T"
Mientras (I <= 1800) hacer
Sumser ¬sumser + I
Escribir (I)
Si band = "T" entonces
I ¬I + 3
Band ¬F"
Sino
I ¬I + 2
Band ¬T"
Fin_si
Fin_mientras
Escribir (sumser)
Fin
RESUMEN
Hemos estudiado en esta lección que la estructura Mientras tiene una pequeña variante a
la estructura Desde en cuanto a la representación algorítmica. Recuerda que la
estructura Desde, se inicializa automáticamente en su sintaxis y el incremento también
es automático. En cambio, la estructura Mientras usa un contador que es inicializado
antes de entrar al ciclo y dentro del ciclo es incrementado. También estudiamos que los
centinelas son valores que le damos a la condición para forzar a que un ciclo pueda
terminar. También decíamos que los centinelas solamente los podemos usar en
estructuras Mientras y Repetir, ya que sirven para finalizar el ciclo cuando no sabemos
las veces que lo vamos a realizar, y la estructura Desde es usada cuando ya conocemos a
priori el número de veces que se va a realizar el ciclo.
Representación pseudocodificada :
Español Inglés
Repetir Repeat
Acciones Acciones
Hasta que <condición> until <condición>
EJEMPLO:
Calcular la suma de los cuadrados de los primeros 100 números enteros y escribir el
resultado.
Solución.
Introducción
Todas las variables que se han considerado hasta ahora son de tipo simple. Una variable
de tipo simple consiste de una sola caja de memoria y sólo puede contener un valor cada
vez. Una variable de tipo estructurado consiste en toda una colección de casillas de
memoria. Los tipos de datos estudiados: entero, real, alfabético son considerados como
datos de tipo simple, puesto que una variable que se define con alguno de estos tipos
sólo puede almacenar un valor a la vez, es decir, existe una relación de uno a uno entre
la variable y el número de elementos (valores) que es capaz de almacenar. En cambio un
dato de tipo estructurado, como el arreglo, puede almacenar más de un elemento (valor)
a la vez, con la condición de que todos los elementos deben ser del mismo tipo, es decir,
que se puede tener un conjunto de datos enteros, reales, etc.
Datos estructurados:
Estructura de Datos es una colección de datos que se caracterizan por su organización y
las operaciones que se definen en ella. Los datos de tipo estándar pueden ser
organizados en diferentes estructuras de datos: estáticas y dinámicas.
Arrays:
Un arreglo (array) es una colección de datos del mismo tipo, que se almacenan en
posiciones consecutivas de memoria y reciben un nombre común. Para referirse a un
determinado elemento de un array se deberá utilizar un índice, que especifique su
posición relativa en el array. Un arreglo es una colección finita, homogénea y ordenada
de elementos. Finita:Todo arreglo tiene un límite; es decir,debe determinarse cuál será
el número máximo de elementos que podrán formar parte del arreglo. Homogénea:
Todos los elementos del arreglo deben ser del mismo tipo. Ordenada: Se puede
determinar cuál es el primer elemento, el segundo, el tercero,.... y el n-ésimo elmento.
Los arreglos se clasifican de acuerdo con el número de dimensiones que tienen. Así se
tienen los:
- Unidimensionales (vectores)
- Bidimensionales (tablas o matrices)
- Multidimensionales (tres o más dimensiones)
PROBLEMA.
Suponga que se desea desarrollar un programa para:
Supongamos también que hay 100 calificaciones. Debemos utilizar 100 variables
diferentes nota1, nota2, ...., nota100, de ese modo son 100 direcciones diferentes de
memoria para almacenar las calificaciones del examen. Se imagina declarar las 100
variables, ¿cuántas instrucciones involucra?
También preferiremos que esta estructura se almacene en memoria principal para que su
almacenaje y recuperación sea más rápida. Es por ello que existen los arreglos, que
están organizados en una secuencia de elementos, todos del mismo tipo y se puede
acceder a cada elemento directamente especificando su posición en esta secuencia.
Arreglos Unidimensionales:
Están formados por un conjunto de elementos de un mismo tipo de datos que se
almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada
elemento dentro del arreglo de datos. Al declarar un arreglo, se debe inicializar sus
elementos antes de utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un
nombre único y la cantidad de elementos que va a contener. Por ejemplo, las siguientes
instrucciones declaran tres arreglos distintos:
Float costo_partes[50];
Para acceder a valores específicos del arreglo, use un valor de índice que apunte al
elemento deseado. Por ejemplo, para acceder al primer elemento del arreglo
calificaciones debe utilizar el valor de índice 0 (calificaciones[0]). Los programas en
C++ siempre indizan el primer elemento de un arreglo con 0 y el último con un valor
menor en una unidad al tamaño del arreglo.
Para inicializar todos los elementos de una vez, se colocan dentro de una estructura for
que va del primer elemento al último que contiene el arreglo. Para asignar un valor a un
elemento del arreglo se hace por ejemplo:
Calificaciones[0] ¬100;
Cuando se usan arreglos, una operación común es usar una variable índice para acceder
a los elementos de un arreglo. Suponiendo que la variable índice I contiene el valor 3, la
siguiente instrucción asigna el valor 400 a valores[3]:
valores[I] ¬ 400;
Partes de un arreglo:
Los componentes. Hacen referencia a los elementos que forman el arreglo, es decir, a
los valores que se almacenan en cada una de las casillas del mismo. Los índices.
Permiten hacer referencia a los componentes del arreglo en forma individual,
especifican cuántos elementos tendrá el arreglo y además, de qué modo podrán
accesarse esos componentes.
Definición de Arreglos:
ident_arreglo = arreglo[liminf .. Limsup] de tipo Operaciones con Vectores:
Las operaciones que se pueden realizar con vectores durante el proceso de resolución de
un problema son:
· Lectura/ escritura
· Asignación
· Actualización(inserción, eliminación, modificación)
· Recorrido (acceso secuencial)
· Ordenación
· Búsqueda
Ejemplos:
Sea arre un arreglo de 70 elementos enteros con índices enteros. Su representación nos
queda:
Ejemplos:
Sea bool un arreglo de 26 elementos booleanos con índices de tipo caracter. Su
representación nos queda:
Escritura:
Es similar al caso de lectura, sólo que en vez de leer el componente del arreglo, lo
escribimos.
leer (N)
desde i = 1 hasta N hacer
escribir (arre[i])
fin_desde
Asignación:
No es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar
el valor deseado en cada componente. Con una estructura repetitiva se puede asignar un
valor a todos los elementos del vector.
Por ejemplo:
arre[1] ¬120 (asignación de un valor constante único a una casilla del vector)
arre[3] ¬arre[1] / 4 (asignar una operación)
Se puede asignar un valor constante a todos los elementos del vector:desde i = 1 hasta 5
hacer
arre[i] ¬3
fin_desde
O bien
arre ¬3 (con arre del tipo arreglo)
Inicialización
Para inicializar con cero todos los elementos del arreglo:
desde i = 1 hasta 70 hacer
arre[i] ¬ 0
fin_desde
Arreglo Bidimensional:
Es un conjunto de datos homogéneo, finito y ordenado, donde se hace referencia a cada
elemento por medio de dos índices. El primero se utiliza para los renglones (filas) y el
segundo para las columnas. También puede definirse como un arreglo de arreglos.
Internamente en memoria se reservan MxN posiciones consecutivas para almacenar
todos los elementos del arreglo.
Const
M=valor1
N= valor2
Tipo
Array[1..M,1..N] de real:matriz
Var
Matriz:A
Desde i = 1 hasta M hacer
Desde j = 1 hasta N hacer
Escribir (A[i,j])
Fin_desde
Fin_desde
Algoritmo
Inicio
Desde i = 1 hasta 4 hacer
Desde j = 1 hasta 4 hacer
Si i=j entonces
Matriz[i,j] =1
Sino
Matriz[i,j] =0
Fin_si
Fin_desde
Fin_desde
Fin
Cadenas de Caracteres.
Una cadena es un conjunto de caracteres incluido el espacio en blanco, que se almacena
en un área contigua de la memoria central. La longitud de una cadena es el número de
caracteres que contiene. Una cadena vacía es la que no tiene ningún carácter. Una
constante de tipo cadena es un conjunto de caracteres válidos encerrados entre comillas.
Una variable de cadena es aquella cuyo contenido es una cadena de caracteres. El
último carácter de la cadena marca el fin de la cadena.
Las variables de cadena se dividen en:
· Estáticas. Su longitud se define antes de ejecutar el programa y no puede
cambiarse a lo largo de este.
· Semiestáticas. Su longitud puede variar durante la ejecución del programa, pero
sin sobrepasar un límite máximo declarado al principio.
· Dinámicas. Su longitud puede variar sin limitación dentro del programa.
Operaciones básicas con cadenas:
· Asignación.
Nombre ¬ "Luis Humberto"
· Entrada/ Salida
Leer(nombre, estado_civil)
Escribir(nombre, apellido)
Escribir(nombre, apellido)
Extracción de subcadenas. Subcadena es una porción de una cadena. Para extraer una
subcadena se deben tener:
La cadena fuente de la cual se va a extraer la subcadena.
Pos que es un número que indica la posición inicial de la subcadena Long que indica el
tamaño que tendrá la subcadena.
Búsqueda de información. Consiste en buscar una subcadena o cadena dentro de otra
mayor. Nos devuelve el número de la posición donde inicia la cadena buscada, cero si
no la encuentra. Dicho número se puede asignar a una variable entera (numérica).
Encontrar el punto medio
Truncar cadenas
Convertir cadenas a números o viceversa
Insertar una cadena dentro de otra
Borrar cadenas
Sustituir una cadena por otra.
Invertir el orden de una cadena.
Ejemplo.
El siguiente algoritmo sustituye las e por *.
Inicio
Escribir ("escriba una palabra")
Leer (str)
Desde i=1 hasta len(str) hacer
Si str[i] = `e´ entonces
Str[i] = `*´
Fin_si
Fin_desde
Escribir (str)
Fin
Módulo
Uno de los elementos principales de programación utilizados en la representación de
cada módulo es la subrutina. Una subrutina es un conjunto de instrucciones de cómputo
que realizan una tarea. Un programa principal llama a estos módulos a medida que se
necesitan. Un módulo es un segmento, rutina, subrutina, subalgoritmo o procedimiento,
que puede definirse dentro de un algoritmo con el fin de ejecutar una tarea específica y
puede ser lamado o invocado desde el algoritmo principal cuando sea necesario. os
módulos son independientes en el sentido de que ningún módulo puede tener acceso
irecto a cualquier otro módulo, con excepción del módulo al que llama y sus propios
submódulos. Sin embargo, los resultados producidos por un módulo pueden ser
utilizados por cualquier otro módulo cuando se transfiera a ellos el control. Los
módulos tienen una entrada y una salida. Se pueden tomar decisiones dentro de un
módulo que tenga repercusión en todo el flujo, pero el salto debe ser únicamente hacia
el programa principal. Al descomponer un programa en módulos independientes más
simples se conoce también como el método de "Divide y vencerás".
¿Cuándo es útil la modularización?
Este enfoque de segmentación o modularización es útil en dos casos:
1. Cuando existe un grupo de instrucciones o una tarea específica que deba ejecutarse en
más de una ocasión.
2. Cuando un problema es complejo o extenso, la solución se divide o segmenta en
módulos que ejecutan partes o tareas específicas.
Ventajas de la Programación Modular:
Como los módulos son independientes, el desarrollo de un programa se puede efectuar
con mayor facilidad, ya que cada módulo se puede crear aisladamente y varios
programadores podrán trabajar simultáneamente en la confección de un algoritmo,
repartiéndose las distintas partes del mismo. Se podrá modificar un módulo sin afectar a
los demás Las tareas, subalgoritmos, sólo se escribirán una vez, aunque se necesiten en
distintas ocasiones a lo largo del algoritmo. El uso de módulos facilita la proyección y la
comprensión de la lógica subyacente para el programador y el usuario. Aumenta la
facilidad de depuración y búsqueda de errores en un programa ya que éstos se pueden
aislar fácilmente. El mantenimiento y la modificación de la programación se facilitan.
Los módulos reciben diferentes nombres:
- Funciones en C, C++
- Subrutinas en Basic
- Procedimientos y funciones en Pascal
- Subrutinas en Fortran y
- Secciones en Cobol.
Módulo cambiar
var x:entero
inicio
x ¬1
fin
var x: entero
Inicio
x=0
cambiar(x)
escribir(X)
Fin
Módulo cambiar (y:entero)
inicio
y ¬1
fin
Salida 0
PROCEDIMIENTOS
Son subprogramas, es decir, módulos que forman parte de un programa y realizan una
tarea específica. Un procedimiento puede tener sus propias variables que se declaran en
la sección var del propio procedimiento. Estas se llaman variables locales. La casilla de
memoria para estas variables se crea cada vez que el procedimiento es llamado y se
borran al salir del mismo. Asi, las variables locales para un procedimiento sólo se
pueden usar en el cuerpo del procedimiento y no en el cuerpo principal del programa.
FUNCIONES
La función es una estructura autónoma similar a los módulos. La diferencia radica en
que la función se usa para devolver un solo valor de un tipo de dato simple a su punto
de referencia. La función se relaciona especificando su nombre en una expresión, como
si fuera una variable ordinaria de tipo simple. Las funciones se dividen en estándares y
definidas por el usuario.
- Estándar: Son funciones proporcionadas por cualquier lenguaje de programación de
alto nivel, y se dividen en aritméticas y alfabéticas.
- Definidas por el usuario: son funciones que puede definirlas el programador con el
propósito de ejecutar alguna función específica, y que por lo general se usan cuando se
trata de hacer algún cálculo que será requerido en varias ocasiones en la parte principal
del algoritmo.
Ejemplos:
Función factorial (n:entero):entero
var i,factorial:entero
inicio
si n <=1 entonces
factorial <-- 1
sino
factorial <-- 1
desde i = 1 hasta n hacer
factorial <-- factorial * 1
fin_desde
fin_si
fin
ORDENAMIENTO.
Uno de los procedimientos más comunes y útiles en el procesamiento de datos, es la
clasificación u ordenación de los mismos. Se considera ordenar al proceso de
reorganizar un conjunto dado de objetos en una secuencia determinada. Cuando se
analiza un método de ordenación, hay que determinar cuántas comparaciones e
intercambios se realizan para el caso más favorable, para el caso medio y para el caso
más desfavorable.
Tal operación se puede hacer de manera más eficiente después de que la lista ha sido
ordenada.
Existen varios métodos para ordenamiento, clasificados en tres formas:
Intercambio
Selección
Inserción.
En cada familia se distinguen dos versiones: un método simple y directo, fácil de
comprender pero de escasa eficiencia respecto al tiempo de ejecución, y un método
rápido, más sofisticado en su ejecución por la complejidad de las operaciones a realizar,
pero mucho más eficiente en cuanto a tiempo de ejecución. En general, para arreglos
con pocos elementos, los métodos directos son más eficientes (menor tiempo de
ejecución) mientras que para grandes cantidades de datos se deben emplear los llamados
métodos rápidos.
Intercambio
El método de intercambio se basa en comparar los elementos del arreglo e
intercambiarlos si su posición actual o inicial es contraria inversa a la deseada.
Pertenece a este método el de la burbuja clasificado como intercambio directo. Aunque
no es muy eficiente para ordenar listas grandes, es fácil de entender y muy adecuado
para ordenar una pequeña lista de unos 100 elementos o menos.
Una pasada por la ordenación de burbujeo consiste en un recorrido completo a través
del arreglo, en el que se comparan los contenidos de las casillas adyacentes, y se
cambian si no están en orden. La ordenación por burbujeo completa consiste en una
serie de pasadas ("burbujeo") que termina con una en la que ya no se hacen cambios
porque todo está en orden.
Ejemplo:
Supóngase que están almacenados cuatro números en un arreglo con casillas de
memoria de x[1] a x[4]. Se desea disponer esos números en orden creciente. La primera
pasada de la ordenación por burbujeo haría lo siguiente:
Comparar el contenido de x[1] con el de x[2]; si x[1] contiene el mayor de los números,
se intercambian sus contenidos.
Comparar el contenido de x[2] con el de x[3]; e intercambiarlos si fuera necesario.
Comparar el contenido de x[3] con el de x[4]; e intercambiarlos si fuera necesario.
Selección.
Los métodos de ordenación por selección se basan en dos principios básicos:
Seleccionar el elemento más pequeño (o más grande) del arreglo.
Colocarlo en la posición más baja (o más alta) del arreglo.
A diferencia del método de la burbuja, en este método el elemento más pequeño (o más
grande) es el que se coloca en la posición final que le corresponde.
Inserción.
El fundamento de este método consiste en insertar los elementos no ordenados del
arreglo en subarreglos del mismo que ya estén ordenados. Dependiendo del método
elegido para encontrar la posición de inserción tendremos distintas versiones del método
de inserción.
BÚSQUEDA.
La búsqueda es una operación que tiene por objeto la localización de un elemento
dentro de la estructura de datos. A menudo un programador estará trabajando con
grandes cantidades de datos almacenados en arreglos y pudiera resultar necesario
determinar si un arreglo contiene un valor que coincide con algún valor clave o
buscado.
Siendo el array de una dimensión o lista una estructura de acceso directo y a su vez de
acceso secuencial, encontramos dos técnicas que utilizan estos dos métodos de acceso,
para encontrar elementos dentro de un array: búsqueda lineal y búsqueda binaria.
Búsqueda Secuencial:
La búsqueda secuencial es la técnica más simple para buscar un elemento en un arreglo.
Consiste en recorrer el arreglo elemento a elemento e ir comparando con el valor
buscado (clave). Se empieza con la primera casilla del arreglo y se observa una casilla
tras otra hasta que se encuentra el elemento buscado o se han visto todas las casillas. El
resultado de la búsqueda es un solo valor, y será la posición del elemento buscado o
cero. Dado que el arreglo no está en ningún orden en particular, existe la misma
probabilidad de que el valor se encuentra ya sea en el primer elemento, como en el
último. Por lo tanto, en promedio, el programa tendrá que comparar el valor buscado
con la mitad de los elementos del arreglo.
El método de búsqueda lineal funciona bien con arreglos pequeños o para arreglos no
ordenados. Si el arreglo está ordenado, se puede utilizar la técnica de alta velocidad de
búsqueda binaria, donde se reduce sucesivamente la operación eliminando repetidas
veces la mitad de la lista restante.
Búsqueda Binaria.
La búsqueda binaria es el método más eficiente para encontrar elementos en un arreglo
ordenado. El proceso comienza comparando el elemento central del arreglo con el valor
buscado. Si ambos coinciden finaliza la búsqueda. Si no ocurre así, el elemento buscado
será mayor o menor en sentido estricto que el central del arreglo. Si el elemento
buscado es mayor se procede a hacer búsqueda binaria en el subarray superior, si el
elemento buscado es menor que el contenido de la casilla central, se debe cambiar el
segmento a considerar al segmento que está a la izquierda de tal sitio central.
22. Bibliografía.
DIRECCIONES DE INTERNET:
http://www.geocities.com/joseluisdl
http://www.gorkasweb.com/
http://mundovb.net/mundoc/
http://lawebdelprogramador.com/cursos/