ALTE DOCUMENTE
|
||||||||||
1. Algoritmos y Programas
1.1 Concepto de Algoritmo ..............................4
1.2 Características de los Algoritmos ............................4
1.3 Datos, Tipos de Datos, Operaciones primitivas ....................5
1.3.1 Datos Numéricos ..............................5
1.3.2 Datos Lógicos (Booleanos) ......................5
1.3.3 Datos de Tipo Carácter y del Tipo Cadena ....................5
1.4 Constantes y Variables .............................6
1.5 Expresiones .......... ..... ...... ......6
1.5.1 Expresiones Aritméticas ...........................7
1.5.1.1 Reglas de Precedencia de Operadores .........................8
1.5.2 Expresiones Lógicas o Booleanas ...........................8
1.5.2.1 Operadores de Relación .......... ..... ...... .8
1.5.2.2 Operadores Lógicos .......... ..... ...... .8
1.6 Operación de Asignación .......... ..... ...... ......9
1.6.1 Asignación Aritmética .......... ..... ...... .9
1.6.2 Asignación Lógica .......... ..... ...... .9
1.6.3 Asignación de Strings .......... ..... ...... .9
1.7 Entrada y Salida de Datos/Información ..........................10
2. Resolución de Problemas
2.1 Diseño del Algoritmo .......... ..... ...... .....11
2.1.1 Escritura inicial del Algoritmo .............................11
2.1.2 Seudocódigo .......... ..... ...... ...13
3. Estructura General de un Programa y Programación Estructurada
3.1 Instrucciones .......... ..... ...... .....14
3.2 Tipos de Instrucciones .......... ..... ...... ...14
3.3 Escritura de Algoritmos / Programas ..........................14
3.3.1 Encabezado del Algoritmo o del Programa ........................14
3.3.2 Declaración de Variables .......... ..... ...... 14
3.3.3 Declaración de Constantes Numéricas ........................15
3.3.4 Declaración de Variables y Constantes del Tipo Carácter .................15
3.3.5 Comentarios .......... ..... ...... ...16
3.3.6 Estilo de Escritura de los Algoritmos / Programas ...................16
3.4 Técnicas de Programación ..............................17
3.4.1 Estructuras Básicas de Control .........................17
3.4.1.1 Estructuras Secuenciales ...........................17
3.4.1.2 Estructuras de Decisión o Selección ....................18
3.4.1.2.1 Decisión Simple: Si - entonces .........................18
3.4.1.2.2 Decisión Doble : Si - entonces - si_no .........................18
3.4.1.2.3 Decisión Múltiple: Según_sea - hacer - si_no ......................19
3.4.1.2.4 Estructuras de Decisión Anidadas ........................19
3.4.1.3 Estructuras de Repetición ...........................21
3.4.1.3.1 Estructura de Repetición Mientras - hacer ......................24
3.4.1.3.2 Estructura de Repetición Repetir - hasta_que ......................26
3.4.1.3.3 Estructura de Repetición Desde / Para ........................27
3.4.1.3.4 Estructuras de Repetición Anidadas ........................29
Ejercicios Capítulo 1: Algoritmos y Programas - generalidades - .................30
Ejercicios Capítulo 2: Estructura general de un Programa, Programación Estructurada: Estructuras de Control:
Ejercicios Resueltos .......... ..... ...... 33
Ejercicios Propuestos .......... ..... ...... 41
Ejercicios Resueltos .......... ..... ...... 42
Ejercicios Propuestos .......... ..... ...... 56
Estructuras de Control .......... ..... ...... ......62
1. Estructuras Secuenciales .............................62
2. Estructura de Selección .............................63
2.1 Selección Simple: if .......... ..... ...... .63
2.2 Selección Doble: if - else.............................63
2.3 Selección Múltiple: switch / case ........................64
3. Estructuras de Repetición ........................65
3.1 Estructura de repetición while .............................65
3.2 Estructura de repetición do while ...................65
3.3 Estructura de repetición for .............................66
Ejercicios resueltos .......... ..... ...... ....67
Ejercicios propuestos .......... ..... ...... ....80
Unidad III: Arreglos Unidimensionales
1. Introducción .......... ..... ...... ..86
2. Arreglos lineales o unidimensionales .....................86
Ejercicios resueltos .......... ..... ...... 89
Ejercicios propuestos .............................106
Bibliografía .......... ..... ...... ..109
1. ALGORITMOS Y PROGRAMAS.
CONCEPTO DE ALGORITMO
· La palabra algoritmo proviene de Mohammed al-Khowârizmî, matemático persa (s. IX dC).
· Euclides, matemático griego (s. IV aC) inventó un algoritmo para encontrar Máximo Común Divisor entre dos números
Resolución de problemas:
· Se necesita el diseño de un algoritmo que resuelva el problema
Problema
Diseño del algoritmo
Programa (computadora)
Pasos para resolver un Problema:
1. Definir (analizar) el problema
2. Diseñar el algoritmo
3. "Traducir" el algoritmo a un programa
4. Ejecutar y validar el programa.
· Los algoritmos son independientes tanto del lenguaje de programación en que se implementen como de la computadora que ejecute el programa.
· Un lenguaje de programación es un medio para expresar un algoritmo.
· La solución de un problema se puede representar por medio de un algoritmo
CARACTERÍSTICAS DE LOS ALGORITMOS.
Definición:
· Procedimiento detallado,
· se ejecuta secuencialmente (en orden),
· para resolver un problema.
· Es un método para resolver un problema.
Características: todo algoritmo debe ser
· Preciso: debe indicar el orden en que se realiza cada paso,
· Definido: "fidelidad de respuesta" la ejecución del algoritmo debe conducir siempre al mismo resultado,
· Finito: al seguir (rutear) un algoritmo, debe terminarse en algún momento.
Composición general: todo algoritmo tiene
· Entrada: información que alimenta al algoritmo,
· Proceso: operaciones o cálculos necesarios para encontrar la solución,
· Salida: respuesta (solución) al problema.
DATOS, TIPOS DE DATOS, OPERACIONES PRIMITIVAS.
· Los algoritmos y los programas correspondientes operan sobre datos.
· Los datos de entrada son procesados (transformados) en datos de salida (solución).
1.3.1. DATOS NUMÉRICOS
· Valores numéricos, o simplemente números.
· Pueden representarse de dos formas: enteros o reales.
Enteros: (Integer)
· También se denominan números de punto o coma fija.
· Son un subconjunto (finito) de los números enteros (Z),
· No tienen componentes fraccionarios ni decimales,
· Pueden ser negativos o positivos.
· Ejemplo: 4, 6, 12, 23, 0, -2, -35, -1200, .........
· El rango de números enteros que maneja una computadora de 16 bits es desde -32768 a +32767.
· En general, el rango dependerá del lenguaje de programación en que se codifique el algoritmo.
Reales: (Real)
· También se denominan números de punto o coma flotante.
· Son un subconjunto de los números reales (R),
· Tienen un componente decimal (punto decimal),
· Pueden ser negativos o positivos.
· Todo número real consta de una parte entera y una parte decimal.
· Ejemplo: 0.03, 3.0, 7.3456, -0
1.3.2. DATOS LÓGICOS (BOOLEANOS)
· Sólo puede tomar uno de dos valores: verdadero (true), falso (false).
· Se usan para representar las alternativas sí / no frente a determinadas condiciones.
1.3.3. DATOS DEL TIPO CARÁCTER Y DEL TIPO CADENA
· El tipo carácter es el conjunto (finito) de caracteres que reconoce y opera la computadora,
· Un dato tipo carácter consiste en un solo carácter.
· Las computadoras por lo general reconocen los siguientes caracteres:
· Caracteres alfabéticos: (A, B, C,....., Z), (a, b, c,......, z).
· Caracteres numéricos: (1, 2, 3, ........., 0).
· Caracteres especiales: (¿, ?, ¡, !, ", $, (, +, -, /, *, <,.............).
· Una cadena o string de caracteres es una sucesión de caracteres delimitados por una comilla simple, o por comillas dobles (depende del lenguaje de programación).
· La longitud del string es el número de caracteres entre comillas.
· Ejemplo 'Buenos días', "Buenos días", '31 de diciembre', "20 de marzo", etc.
1.4. CONSTANTES Y VARIABLES.
Constante:
· Son un conjunto de datos (valores) que permanecen sin cambios durante todo el desarrollo del algoritmo o durante la ejecución de un programa.
· En general las constantes pueden ser del tipo: enteras, reales, booleanas, caracteres, string.
Variables:
· Dato o conjunto de datos cuyo valor puede variar durante el desarrollo del algoritmo o durante el programa.
· En general las variables pueden ser del tipo: enteras, reales, booleanas, caracteres, string.
· Una variable definida de un tipo, sólo puede tomar valores de ese tipo de datos.
· Si se trata de asignar a una variable un tipo de dato que no corresponde, hay error de tipo.
· Una variable se define (declara) de la siguiente manera:
Tipo Nombre_de_variable
· Los nombres deben ser significativos.
1.5. EXPRESIONES.
· La misma idea matemática.
· Combinaciones de constantes, variables, símbolos de operación, paréntesis, funciones especiales.
·
· Consta de operandos y operadores.
1.5.1. EXPRESIONES ARITMÉTICAS.
· Análogas a las fórmulas matemáticas.
· Los operandos son numéricos, los operadores son aritméticos, el resultado es numérico.
·
Operandos: 2, 3, 5, a, b, c
Operadores ,
el valor de la expresión es el resultado
· Operadores aritméticos
Operador |
Significado |
Tipo Operando |
Tipo Resultado |
Exponenciación |
Entero o Real |
Entero o Real |
|
Suma |
Entero o Real |
Entero o Real |
|
Resta |
Entero o Real |
Entero o Real |
|
Multiplicación |
Entero o Real |
Entero o Real |
|
División |
Real |
Real |
|
Div |
División entera |
Entero |
Entero |
Mod |
Módulo (resto) |
Entero |
entero |
Ejemplos:
· 8 x 12 se representa 8 * 12
·
· se representa 5 ^ 3
· Operador /:
· División entera o real
· El resultado de A / B, depende del tipo de los operandos: si A y B son reales, el resultado es real; si A y B son enteros, el resultado es entero.
· 43 / 22 = 1; 1 / 10 = 0; 19.0 / 3.0 = 6. 3; 43..0 / 22.0 = 1. 954; 1.0 / 10.0 = 0.1
· Operador %:
· Módulo o resto,
· A % B, se usa sólo si A y B son enteros; se obtiene el resto de A / B,
· 43 % 22 = 21; 1 % 10 = 1
· Ejemplo:
1
resto 21 % 5 = 1
REGLAS DE PRECEDENCIA DE OPERADORES.
· Determinan el orden en que se ejecutan las operaciones:
Primero se evalúan las expresiones encerradas entre paréntesis. Si hay paréntesis anidados, se evalúan desde dentro hacia fuera.
Las operaciones aritméticas siguen el siguiente orden de precedencia:
· Operador exponencial.
· Operadores *, /.
· Operadores div, mod,
· Operadores +, -.
Si en una expresión hay varios operadores de igual nivel de precedencia, se evalúan de izquierda a derecha.
· Ejemplo: 8 * 2 - 4 * (2 ^ 3) + 5 * 4 / 2
1.
2.
3.
4.
5.
1.5.2. EXPRESIONES LÓGICAS O BOOLEANAS.
· Su valor siempre será verdadero o falso. (Ley del tercero excluido).
· Se forman por la combinación de constantes lógicas, variables lógicas, utilizando operadores lógicos (not, and, or), y operadores relacionales (=, <>. <, >, <=, >=).
OPERADORES DE RELACIÓN.
· Permiten realizar comparaciones de valores de tipo numérico o carácter.
· Expresan condiciones.
· Operadores de Relación
Operador |
Significado |
< |
Menor que |
> |
Mayor que |
Igual que |
|
< = |
Menor o igual que |
>= |
Mayor o igual que |
< > |
Distinto de |
· Formato para las comparaciones
Expresión 1 OPERADOR DE RELACIÓN Expresión 2 |
El resultado de la operación será verdadero o falso
· Ejemplos: Si A = 2, y B = 6, entonces
· A < B es verdadero
· A * 3) > (B - 3) es verdadero
· Los operadores de relación se pueden emplear a los tipos de datos enteros, real, lógico, carácter.
· Los valores de los caracteres numéricos están en su orden natural: '0' '1' '2' '3'.. '9'.
· Los valores de los caracteres alfabéticos siguen el orden alfabético: ('A' < 'B' < 'C', etc.) ('a' < 'b' < 'c', etcétera1.)
1.5.2.2. OPERADORES LÓGICOS.
· Los básicos son not (no), and (y), or (o).
· Tablas de verdad.
P |
no p |
p |
q |
p y q |
p o q |
||
V |
F |
V |
V |
V |
V |
||
F |
V |
V |
F |
F |
V |
||
F |
V |
F |
V |
||||
F |
F |
F |
F |
||||
· Ejemplo:
· < 3) y (6 < tiene valor de verdad verdadero
· > 7) o ('C' < 'D') tiene valor de verdad verdadero
1.6. OPERACION DE ASIGNACION.
· Es el modo de darle (asignarle) valores a una variable.
· Símbolo (operador):
· Formato general de la operación de asignación:
Nombre_de_variable expresión
· La asignación se hace de derecha a izquierda.
· Ejemplo: S 23 significa que a la variable S se le asignó el valor 23.
· El símbolo = se usa para el operador de igualdad.
· Al asignar un valor a una variable, se destruye el valor que tenía antes dicha variable.
1.6.1. ASIGNACIÓN ARITMÉTICA
· En la asignación, las expresiones que se evalúan son aritméticas.
· Ejemplos:
· S // La expresión 5 + 6 + 2 se evalúa y su resultado se asigna a S (13).
· A // Se asigna 22,5 a A
B // Se asigna 2.55 a B
TOTAL A / B // se asigna 22.5 / 2.55 a TOTAL.
// TOTAL
1.6.2. ASIGNACIÓN LÓGICA
· En la asignación, las expresiones que se evalúan son lógicas.
· Ejemplos:
· X < // Valor de verdad falso
· Y X o (3 < // Valor de verdad verdadero
· Z > // Valor de verdad verdadero
1.6.3. ASIGNACIÓN DE STRINGS.
· En la asignación, las expresiones que se evalúan son del tipo string (cadena).
· X '12 de noviembre de 1985'. // a X se le asigna el string '12 de noviembre de 1985'.
1.7. ENTRADA Y SALIDA DE DATOS / INFORMACIÓN.
· Todo algoritmo requiere una entrada de datos sobre los que opera, y muestra una salida de resultados.
· Las operaciones de entrada leen los datos y los asignan a las variables: lectura (read).
· Las operaciones de salida muestran los resultados: escritura (write).
· Formato general de las operaciones de lectura y escritura:
Leer (variables de entrada) Escribir (expresiones de salida)
· Ejemplo:
· Leer (A, B, C) representa la lectura de 3 valores de entrada asignados a las variables A, B, C.
· Escribir ('Buenos días mundo') muestra por pantalla, o escribe 'Buenos días mundo'.
· Si los dispositivos desde los cuales se leen o escriben datos no son especificados, por defecto se asume que los dispositivos de E/S son el teclado y la pantalla.
2. RESOLUCIÒN DE PROBLEMAS.
· La resolución de problemas por medio de computador se divide en 3 fases::
· Análisis del problema,
· Diseño del algoritmo,
· Implementación del algoritmo en el computador.
2.1. DISEÑO DEL ALGORITMO.
· Por norma general, los problemas se descomponen en "piezas pequeñas" que sean más fáciles de solucionar.
· "Dividir para vencer"
· Así se obtiene un algoritmo claro, preciso, completo.
· Fases del diseño del algoritmo:
1. Diseño descendente: el problema se descompone en sub-problemas más simples, y estos a su vez en otros más simples que puedan implementarse.
Ventajas:
El problema es descompuesto en piezas o módulos, más fáciles de comprender.
Es más fácil modificar y corregir cada módulo.
El problema global se verifica más fácilmente.
2. Refinamiento por pasos: El diseño final del algoritmo se logra a través de sucesivos pasos, en los que aumentan los detalles.
3. Representación del algoritmo: seudocódigo, diagrama de flujo.
· Ejemplo: Leer el lado de un cuadrado, calcular e imprimir su área y su perímetro.
Subproblema |
Refinamiento |
Leer lado |
Leer radio |
Calcular área |
Área = lado ^ 2 |
Calcular perímetro |
Perímetro = lado * 4 |
Imprimir resultados |
Escribir lado, área, perímetro. |
2.1.1. ESCRITURA INICIAL DEL ALGORITMO.
· "Reglas básicas" de todo algoritmo:
· secuencialidad (orden) de los pasos
· Un proceso (operación) a la vez
· Ejemplo: Almuerzo en el casino
·
Diseño descendente: problema dividido en pasos |
· Comprar el almuerzo
· Almorzar
· Volver a clases.
Se debe hacer un refinamiento del algoritmo:
Inicio
Verificar si hay dinero suficiente para el almuerzo
Si no alcanza el dinero entonces
3.1.Pensar en comprar un chicle en el kiosco de la estación
3.2.Ir a 7
si_no
3.3 Ir al casino
Si hay fila entonces
4.1. Ponerse en la fila
4.2. Mientras haya personas delante hacer
4.2.1. Avanzar en le fila
4.3. Fin mientras
Si hay algo que quiere comer entonces
5.1. Hacerle el pedido a la cajera
5.2. Pagar el pedido
5.3. Recibir la boleta
5.4. Esperar a que los cocineros le pasen el almuerzo
5.5. Ubicar una mesa desocupada
5.6. Mientras come su almuerzo hacer
5.6.1.1. disfrute el almuerzo
5.7. Salir del casino
Si_no
5.8. Salir enojado y hambriento del casino
Fin_si
Ir al patio
Fin
Refinamiento del punto 5.5. Ubicar una mesa desocupada.
1. Inicio
2. Repetir
Caminar con la bandeja en las manos hasta una mesa desocupada
Hasta_que ubique la mesa desocupada
3. Sentarse a la mesa
4. Fin
Notas:
· En negritas se han resaltado las palabras "reservadas".
· Estas palabras reservadas se usan para describir las estructuras de control del algoritmo.
· Estructuras de control básicas:
· Estructuras de selección: si - entonces - si_no (if - then - else)
Permiten elegir una alternativa de acción a seguir.
· Estructuras de repetición: mientras - hacer; repetir - hasta; iterar - fin_iterar. (while - do; repeat - until)
Permiten repetir una acción.
· Se ha empleado la indentación, para facilitar la lectura y seguimiento del algoritmo. Como norma, se empleará siempre el indentado cuando se escriba un algoritmo, y cuando se escriba el código fuente de él.
2.1.2. SEUDOCÓDIGO.
· Lenguaje de especificación o descripción de algoritmos.
· Facilita la "traducción" del algoritmo a un lenguaje de programación específico.
· El seudocódigo debe ser traducido a un lenguaje programación.
· Si hay errores, es fácil modificar el seudocódigo.
· El seudocódigo presenta dos ventajas evidentes sobre el diagrama de flujo: es más rápido de crear, y es más fácil de modificar.
· Originalmente el seudocódigo representa las acciones por medio de una serie de palabras reservadas, en inglés: start, end, stop, if-then-else, while-end, repeat-until, etc.
· Se pueden usar palabras reservadas en castellano: inicio, fin, leer, escribir, parar, si-entonces-en_caso_contrario, mientras-hacer, fin-mientras, repetir-hasta_que, etc.
· Al escribir un algoritmo en seudocódigo, se debe usar la indentación (sangría en el margen izquierdo) de diferentes líneas.
Inicio |
Comienzo del seudocódigo |
Fin |
Término del seudocódigo |
|
Comentarios de una sola línea. No realizan acción, y sólo sirven para documentar el código. |
|
Si los comentarios abarcan más de una línea |
Leer (lista_de_variables) |
Para introducir valores y asignarlos a una o varias variables |
Escribir (lista_de_expresiones) |
Para imprimir en un dispositivo estándar |
Nombre_variable expresión |
Asignación de una expresión |
Si condición entoncesAcciones 1 Fin_si |
Estructura de decisión simple |
Si condición entoncesAcciones 1 Si_noAcciones 2 Fin_si |
Estructura de decisión doble |
Según_sea expresión ordinal hacerLista_de valores_ordinales: acciones 1 .............. [si_no acciones N] fin_según |
Estructura de decisión múltiple // el corchete indica opcionalidad. |
Mientras condición hacerAcciones Fin_mientras |
Estructuras repetitivas, o ciclos |
RepetirAcciones Hasta_que condición |
|
Desde variable v_inicial hasta v_final[incremento | decremento incremento] hacer acciones Fin_desde |
3. ESTRUCTURA GENERAL DE UN PROGRAMA. Y PROGRAMACIÓN ESTRUCTURADA.
3.1 INSTRUCCIONES
Acciones o instrucciones
· Primero se deben escribir,
· Luego se almacenan en memoria
· Se ejecutan en el mismo orden (secuencia) en que fueron escritas
· Si las instrucciones se ejecutan secuencialmente, sin bifurcaciones, decisiones ni comparaciones, se dice que el programa es lineal.
3.2 TIPOS DE INSTRUCCIONES
· Las instrucciones básicas, independientes del lenguaje son:
1) Instrucciones de inicio / fin,
2) Instrucciones de asignación,
3) Instrucciones de lectura,
4) Instrucciones de escritura,
5) Instrucciones de bifurcación.
3.3 ESCRITURA DE ALGORITMOS / PROGRAMAS
· La escritura de un algoritmo debe ser lo más clara posible, y estructurada.
· Esto facilita su entendimiento y traspaso a un lenguaje de programación.
· Todo algoritmo consta de:
a) Encabezado: comienza con la palabra algoritmo, seguida por el nombre del programa,
b) Bloque algoritmo: resto del programa. Consta de 2 componentes (secciones):
· Declaraciones: definen o declaran variables y constantes que tengan nombres.
· Acciones ejecutables: son las que realizará el programa ya implementado.
3.3.1 ENCABEZADO DEL ALGORITMO O DEL PROGRAMA
· Todos los algoritmos y programas deben tener un identificador,
· Se usa la palabra reservada algoritmo
· Ejemplo: algoritmo SUMATORIA
3.3.2 DECLARACIÓN DE VARIABLES
· Se definen o declaran TODAS las variables usadas en el algoritmo.
· Se deben listar sus nombres, y especificar sus tipos
· Palabra reservada var
·
Var Tipo_1: lista_de_variables_1 Tipo_2: lista_de_variables_2 Tipo_n: lista_de_variables_n
Formato:
Tipo: tipo de dato básico (entero, real, carácter, lógico)
Lista de variables: variable simple, o lista de variables separadas por coma
·
var Entero: número_trabajador Real: horas, sueldo, imposiciones |
Real: horas
Real: sueldo
Real: imposiciones
· Buena práctica:
· Utilizar nombres significativos para las variables.
· Incluir comentarios que indiquen cómo se usa la variable.
· Ejemplo: var
Entero: número_trabajador // identificación del empleado
Real: horas // nº de horas trabajadas
Real: sueldo // líquido a recibir
Real: imposiciones // % del sueldo no imponible
3.3.3 DECLARACIÓN DE CONSTANTES NUMÉRICAS
· Se definen o declaran TODAS las constantes que tengan nombre.
· Formato:
Pi = 3.141592 Altura = 23 Tiempo = 8.38
Const
Los valores de estas constantes no varían en el transcurso del algoritmo.
3.3.4 DECLARACIÓN DE VARIABLES Y CONSTANTES DEL TIPO CARÁCTER
· Las variables de caracteres se declaran de 2 maneras:
1) Almacenar un solo valor:
Var carácter : nombre, inicial, nota, letra |
· nombre, inicial, nota, letra, almacenarán sólo un carácter.
2) Almacenar múltiples caracteres (string):
Var cadena [20] : nombre |
· Las constantes de un solo carácter, y las de string, se pueden declarar de igual forma que las constantes numéricas
Asterisco = ' * ' Fecha = '12 de noviembre'
Const
3.3.5 COMENTARIOS
· Los comentarios que se hacen respecto al código fuente del programa constituyen la documentación interna.
esto es un comentario
3.3.6 ESTILO DE ESCRITURA DE LOS ALGORITMOS / PROGRAMAS
· Formato:
Algoritmo Nombre del programa // encabezado
// Declaraciones
var tipo de datos : lista de variables
const lista de constantes = valor
inicio // cuerpo del algoritmo
< sentencia 1 >
<Sentencia 2>
<sentencia n>
fin
· Los string se encierran entre comillas simples,
· Usar sangría para indentar, facilita la legibilidad del algoritmo.
3.4 TÉCNICAS DE PROGRAMACIÓN
· Los problemas medianos y grandes son eficientemente resueltos, empleando técnicas de programación modular y programación estructurada.
· Programación Modular: El problema de descompone en módulos independientes, cada modulo ejecuta una sola tarea
· Programación Estructurada: Cada módulo se programa mediante métodos estructurados, utilizando estructuras de control que minimizan la complejidad de los problemas
· Posteriormente se ensamblan los módulos.
3.4.1 ESTRUCTURAS BÁSICAS DE CONTROL:
· Todo algoritmo / programa se puede escribir usando sólo 3 tipos de estructuras de control:
· Secuenciales,
· De selección,
· Repetitivas.
3.4.1.1 ESTRUCTURAS SECUENCIALES
· Una acción (instrucción) sigue en secuencia a otra.
· La salida de una acción es la entrada para otra acción, y así sucesivamente.
acción 1 |
acción 2 |
acción n |
|
|||
· Ejemplo: calcular la suma y el producto de dos números.
Inicio
Leer ( x )
Leer ( y )
Suma x + y
Producto x * y
Escribir (suma, producto)
Fin
3.4.1.2 ESTRUCTURAS DE DECISIÓN O DE SELECCIÓN
· Se usan para tomar decisiones lógicas (estructuras de decisión o alternativas),
· Se evalúa una condición, y según sea el resultado, se ejecuta una opción u otra,
· Las condiciones se especifican usando expresiones lógicas,
· Palabras reservadas: si, entonces, si_no, (if, then, else). Gráficamente se usa el rombo.
· Las estructuras de selección pueden ser:
· Simples,
· Dobles,
· Múltiples.
3.4.1.2.1 DECISIÓN SIMPLE
· Si - entonces
· Ejecuta una determinada acción cuando se cumple una determinada condición.
· Si la condición es V, entonces se ejecuta la acción A (o acciones),
· Si la condición es F, entonces no hacer algo.
· Formato:
condición |
acciones |
|
|||
falsa
verdadera
3.4.1.2.2 DECISIÓN DOBLE
· Si - entonces - si_no
· La selección simple es muy limitada.
· Habitualmente se necesita una estructura que permita elegir entre dos alternativas posibles, en función del cumplimiento o no de una determinada condición.
· Si la condición es V, se ejecuta la acción A1, si es F, se ejecuta la acción A2.
· Formato:
¿condición? |
acción 1 |
acción 2 |
|
|||
Si No
3.4.1.2.3 DECISIÓN MÚLTIPLE
· Según_sea - hacer - si_no
· A veces es necesario que existan más de 2 elecciones posibles,
· Se podría resolver mediante estructuras de selección simples o dobles, anidadas o en cascada, PERO si el número de alternativas es grande, se dificulta su manejo.
· La estructura de decisión múltiple evaluará una expresión que podrá tomar n valores distintos. Según elija uno de estos valores en la condición, se ejecutará una de las n posibles acciones, es decir, el algoritmo seguirá un determinado camino entre n posibles.
· Formato:
condición |
Acción 1 |
Acción 2 |
Acción 3 |
Acción n |
|
|
|
n |
· Formato:
e1: acción 11
acción 12
acción 1n
e2: acción 21
acción 22
acción 2n
en: acción n1
acción n2
acción nn
si_no: acción X
Según E hacer Fin_según |
Caso_de E hacer Fin_hacer |
· En el caso de sentencias compuestas, también se puede usar
Según_sea expresión (E) hacer e1: inicio acción 11 acción 12 acción 1n fin e2: inicio acción 21 acción 22 acción 2n fin en: inicio acción n1 acción n2 acción nn fin si_no: acción X
Fin_según
3.4.1.2.4 ESTRUCTURAS DE DECISIÓN ANIDADAS
· Las estructuras de selección si - entonces y si - entonces - si_no, involucran la selección de una o dos alternativas.
· Una estructura si - entonces puede contener otra estructura si - entonces, y ésta a su vez otra, y así sucesivamente. Es decir, la estructura si puede llegar a contener más de dos alternativas.
· Las estructuras si internas están anidadas.
· Es importante mantener la indentación para que el algoritmo sea claro.
·
Condición 1 |
Acción 1 |
Condición 2 |
Acción 2 |
Condición n |
Acción ni |
Acción nj |
Si <condición 1> entonces
<acciones>
Si_no
Si <condición 2> entonces
<acciones>
Si <condición 3> entonces
<acciones>
Si_no
Fin_si
Fin_si
Fin_si
3.4.1.3 ESTRUCTURAS DE REPETICIÓN
· Generalmente los programas se diseñan para que una operación (o un conjunto de ellas) se repitan muchas veces.
· Es común que un algoritmo repita acciones un número determinado de veces.
· Estas estructuras se denominan bucles o ciclos, y la repetición de sentencias se llama iteración.
· Ejemplo: se requiere sumar una lista de números ingresados por teclado:
· Se declara una variable suma, y se inicializa en cero (suma
· Los números se leen desde teclado y sus valores se añaden a la variable suma,
· La variable suma, almacena las sumas parciales.
· Posible algoritmo:
Algoritmo suma_números
Var Entero: núm, suma.
Inicio
suma
Leer (num)
suma suma + num
Leer (num)
suma suma + num
Leer (num)
Fin
Y se repite para cada número de la lista
· Es decir, este algoritmo repite n veces las acciones:
Bucle, ciclo, lazo
Leer (num)
suma suma + num
· Para diseñar un ciclo, hay que considerar:
· ¿Qué contiene el ciclo?, es decir, cómo está estructurado,
· ¿Cuántas veces se debe repetir el ciclo?
· Al usar un ciclo para sumar una lista de números, se debe saber cuántos números se han de sumar. Esto es necesario para detener el ciclo.
· Si el usuario ingresa la cantidad de números a sumar, por ejemplo N, existen 2 formas para contar las iteraciones:
1. Usar una variable total que se inicializa con valor N, y se va decrementando su valor en 1 cada vez que el ciclo se repite (total total - 1), hasta llegar a 0,
Algoritmo suma_números
Var Entero: N, total
Entero: num, suma.
Inicio
Leer (N)
total N
Mientras total > 0 hacer Leer (num) suma suma + num total total - 1 Fin_mientras
suma
Leer (num)
suma suma + num
total total - 1
Hasta_que total = 0
Escribir ('La suma de los', N, 'números es', suma)
Fin
2. Usar una variable total que se inicializa en 0 ó 1, y se va incrementando en 1 cada vez que el ciclo se repite
(total total + 1), hasta llegar a N.
Algoritmo suma_números
Var Entero: N, total
Entero: num, suma.
Inicio
Leer (N)
total
Mientras total < N hacer Leer (num) suma suma + num total total + 1 Fin_mientras
suma
Leer (num)
suma suma + num
total total + 1
Hasta_que total = N
Escribir ('La suma de los', N, 'números es', suma)
Fin
· La condición de salida del ciclo se indica al comienzo o al final del bucle.
· Condición de salida al comienzo del ciclo, estructura Mientras - hacer - Fin_mientras
Algoritmo suma
Inicio
K
S
Leer (n)
Mientras K < n hacer
K K + 1
S S + K
Fin_mientras
Escribir (S)
Fin
El ciclo se repite mientras se cumple la condición (K < n)
· Condición de salida al final del ciclo, estructura Repetir - hasta_que
Repetir
K K + 1
S S + K
Hasta_que K > n
El ciclo se repite hasta que se cumple la condición (K > n)
· Condición de salida se realiza con un contador que cuenta el número de iteraciones
Desde i = Vi hasta Vf hacer
S S + i
Fin_desde
i es un contador que cuenta desde el valor inicial (Vi) hasta el valor final (Vf)
3.4.1.3.1 ESTRUCTURA DE REPETICIÓN Mientras (while)
· El ciclo se repite mientras se cumple una determinada condición.
· Lo primero que se hace es evaluar la condición,
· Si es F, no se ejecuta el ciclo, y el programa sigue en la siguiente instrucción,
· Si es V, se ejecuta el ciclo ("se entra al ciclo"), evaluándose la condición en cada iteración. El proceso se repite mientras la condición sea V.
· Formato:
no si
acciones |
condición hacer
<Acción 1>
<Acción 2>
<Acción n>
condición |
· Ejemplo: contar los números enteros positivos, ingresados por teclado.
Análisis: se usan 2 variables: número, contador. El ciclo se detiene cuando se lee un número negativo o cero.
Algoritmo cuenta_enteros
Var Entero: número, contador
Inicio
Contador
Leer (número)
Mientras número > 0 hacer
Contador contador +1
Leer (número)
Fin_mientras
Escribir (contador)
Fin
· Regla: las pruebas en las condiciones (expresiones booleanas) deben ser del tipo >, <, > =, < =. No se recomiendan las pruebas de igual a (=) o diferente a (< >).
· Terminación de los bucles con los datos de entrada: si el algoritmo lee una lista de valores, es necesario incluir algún mecanismo que permita terminar el ciclo. En general se consideran 4 métodos para terminar un bucle:
1. Preguntar antes de la iteración: se solicita mediante un mensaje al usuario si existen más entradas:
suma
Escribir ('Hay más valores en la lista S/N')
Leer (resp) // Var Char: resp
Mientras ((resp = 's') o (resp = 'S')) hacer
Escribir ('Valor')
Leer (n)
suma suma + n
Escribir ('Hay más valores en la lista S/N')
Leer (resp)
Fin_mientras
Este método es bueno siempre y cuando la lista de valores no sea grande
2. Encabezar la lista de datos con su tamaño (Variable N que representa el total, cuyo valor se decrementa)
3. Finalizar la lista con cierto valor de entrada: uso del centinela
· Es el método más correcto.
· Centinela: valor especial que se usa para indicar el final de una lista.
· Ejemplo: una lista de notas (escala 1 - 7) tiene como centinela un valor fuera de este rango.
· Ejemplo: suma de todos los números positivos, introducidos por teclado:
Suma
Leer (num)
Mientras num >= 0 hacer
Suma suma + num
Leer (num)
Fin_mientras
El centinela leído no se añade a la suma, pues se sale del bucle,
Debe existir una instrucción Leer ( ) dentro del bucle, pues debe leerse (y detectarse) el centinela.
4. Agotar los datos de entrada:
· Se comprueba si no hay más datos para ingresar,
· Ejemplo: analice los algoritmos. ¿Qué se muestra?, ¿Cuántas veces se repite el ciclo?
a) i
Mientras i < 6 hacer
Escribir (i)
i i +1
Fin_mientras
Se muestran los valores de la variable de control i : 0, 1, 2, 3, 4, 5; el ciclo se repite 6 veces
b) i
Mientras i < 6 hacer
i i +1
Escribir (i)
Fin_mientras
La salida es: 1, 2, 3, 4, 5, 6; el ciclo se repite 6 veces
3.4.1.3.2 ESTRUCTURA DE REPETICIÓN Repetir (repeat)
· Muchas veces es conveniente que un ciclo se ejecute al menos una vez. Con la estructura repetir-hasta_que, el cuerpo del bucle se ejecuta siempre al menos una vez ya que la condición se evalúa al final del proceso.
· Esto no se puede hacer con el ciclo mientras si la condición es F.
· Formato:
acciones |
<Acciones>
Hasta_que <condición>
falsa
condición |
verdadera
· La estructura repetir se ejecuta hasta que se cumpla una determinada condición, que se comprueba al final del bucle.
· Lo primero que hace la estructura es ejecutar acciones, luego se evalúa la condición,
· Si es F, se ejecuta el ciclo ("se vuelve a entrar al ciclo"),
· Si es V, no se ejecuta el ciclo, y el programa sigue en la siguiente instrucción.
· Es decir, es lo opuesto de lo que sucede con la estructura mientras.
· Ejemplo 3.21:
Algoritmo total_números_ingresados
Var Entero: num, contador
Inicio
Mientras contador < 4 hacer Leer
(num) cont
cont + 1
Contador
Fin_mientras
Repetir
Leer (num)
contador contador + 1
Hasta_que contador > = 4
Escribir ('Total de números', contador)
Fin
El ciclo se repite en tanto la condición sea F El ciclo se repite en tanto la condición sea V
· Diferencias entre las estructuras mientras - hacer - fin_mientras y repetir - hasta_que :
· La estructura repetir termina cuando la condición es V,
· La estructura mientras termina cuando la condición es F,
· En la estructura repetir el cuerpo del bucle se ejecuta siempre al menos una vez,
· La estructura mientras es más general y tiene la posibilidad de que el bucle no se ejecute.
3.4.1.3.3 ESTRUCTURA DE REPETICIÓN Desde / Para (for)
· Se usa cuando se conoce anticipadamente el número de veces que se repetirá el ciclo.
· Cuando el número de iteraciones es fijo, se usa la estructura desde / para.
· La estructura desde ejecuta las acciones del cuerpo del bucle un número especificado de veces, y controla automáticamente el número de iteraciones (pasos por el bucle).
· Formato:
calcular valor inicial y valor final |
|
|||||
|
|||||
variable índice
al valor inicial
variable índice > valor final |
Acciones |
V V + 1 |
verdadero
V > Vf |
acciones |
incrementar variable índice |
falso
a)
Desde v vi hasta vf [ incremento | decremento <valor> ] hacer
<acciones>
Fin_desde
b)
Para v vi hasta vf [ incremento | decremento <valor> ] hacer
<acciones>
Fin_para
// v : variable índice
// vi : valor inicial de la variable
// vf : valor final de la variable
· Ejemplo:
Algoritmo suma
Var entero: i, n, s
Inicio
s
leer (n)
Desde i 1 hasta n con incremento 2 hacer
s s + i
Fin_desde
Escribir ('Suma = ', s)
Fin
· Si Vi (v Vi) < Vf : Se debe incrementar
· Si Vi (v Vi) > Vf : Se debe decrementar
Ejemplo: desde i 20 hasta 10 hacer
<acciones>
fin_desde
no se ejecuta, pues el vi es 20y el vf es 10, y se supone un incremento positivo de 1
Ejemplo: desde i 20 hasta 10 decremento 1 hacer
<acciones>
fin_desde
· Hacer una estructura desde con una estructura mientras:
a) Estructura desde con incrementos positivos de la variable índice:
V vi
Mientras v < = vf hacer
<acciones>
v v + incremento
Fin_mientras
b) Estructura desde con incrementos negativos de la variable índice:
V vi
Mientras v > vf hacer
<acciones>
v v - decremento
Fin_mientras
· La estructura desde se puede realizar con algoritmos basados en la estructuras mientras y repetir. Esto significa que se pueden intercambiar.
Las estructuras equivalentes a desde son:
b) inicio i n mientras i > 0 hacer <acciones> i i - 1 fin_mientras fin |
i
mientras i < = n hacer
<acciones>
i i + 1
fin_mientras
fin
d) inicio i repetir <acciones> i i + 1 hasta_que i > n fin |
i
repetir
<acciones>
i i + 1
hasta_que i = n
fin
f) inicio i n repetir <acciones> i i - 1 hasta_que i < 1 fin |
i n + 1
repetir
<acciones>
i i - 1
hasta_que i = 1
fin
3.4.1.3.4 ESTRUCTURAS DE REPETICIÓN ANIDADAS
· Se hace de igual manera que la anidación de estructuras de selección,
· Se usa la misma regla que para las estructuras de selección anidadas: la estructura interna debe estar totalmente incluida dentro de la estructura externa.
Ejercicio 1.1: Diseñar un algoritmo que determine si un número cualquiera es primo.
(Un número primo sólo es divisible por sí mismo y por uno)
1. Inicio
2. Se definen las variables N (nº estudiado), X (divisores de N)
3. Poner X = 2 // X
4. N / X // Dividir N por X
5. Si N / X es entero N no es primo
Ir al paso 8
Caso contrario seguir (paso 6)
6. Sumar 1 a X // X X + 1
7. Si X = N N es primo
Caso contrario ir al paso 3
8. Fin
Ejercicio 1.2: Diseñar un algoritmo que determine la suma de todos los números pares entre 2 y 1000.
1. Inicio
2. Se definen las variables N (número), S (suma);
3. S // a S se le asigna el valor 0 (se deja S = 0)
4. N // a N se le asigna el valor 2
5. S S + N // sumar S a N, asignar el resultado a S
6. N N + 2 // Incrementar N en 2 unidades
7. Si N <= 1000 ir al paso 5
8. Fin.
Ejercicio 1.3: Usos de División entera y Módulo (resto)
Operador / (división):
· División entera, o real
· El resultado de A / B, depende del tipo de los operandos: si A y B son reales, el resultado es real; si A y B son enteros, el resultado es entero.
· 43 / 22 = 1; 1 / 10 = 0; 19.0 / 3.0 = 6. 3; 43..0 / 22.0 = 1. 954; 1.0 / 10.0 = 0.1
Operador % (módulo o resto):
· A % B, se usa sólo si A y B son enteros; se obtiene el resto de A / B,
·
Ejemplo:
resto 21 % 5 = 1
Ejercicio 1.4:
S // La expresión 5 + 6 + 2 se evalúa y su resultado se asigna a S (13).
A // Se asigna 22,5 a A
B // Se asigna 2.55 a B
TOTAL A / B // se asigna 22.5 / 2.55 a TOTAL.
// TOTAL
Ejercicio 1.5:
X 8 < 5 // Valor de verdad falso
Y X o (3 < = 7) // Valor de verdad verdadero
Z 15 > 9 // Valor de verdad verdadero
Ejercicio 1.6: ¿Qué valores toman A, B, C, después de la ejecución de las siguientes operaciones?
A Resp. // A toma valor 3
B // B toma valor 4
C A + 2 * B // C toma valor 3 + 2 * 4 = 11
C C + B // C toma valor 11 + 4 = 15
B C - A // B toma valor 15 - 3 = 12
A B * C // A toma valor 12 * 15 = 180
Ejercicio 1.7: ¿Valor que toma X después de las operaciones?
X Resp. // X toma valor 2
X cuadrado (X + X) // X toma valor cuadrado (4) = 16
X raíz2 (X + raíz2(X) + 5) // X toma valor raíz2 (16 + raíz2 (16) + 5) = raíz2 (25) = 5
Ejercicio 1.8: ¿Valor que toma la variable X después de las operaciones?
Y 3 * cuadrado (3) Resp. // Y
A 2 * Y // A
B A +3 // B
X A - (2(B - Y)) // X
X X + 1 // X
Ejercicio 1.9: ¿Cómo intercambiar los valores de las variables A y B?
Se deben definir las variables A, B, y una variable Temporal (AUX):
|
A |
B |
A B B A
AUX A
A B
B AUX
|
AUX |
|
A |
Ejemplo:
A
B
AUX A // AUX
A B // A
B AUX // B
Ejercicio 1.10: Algoritmo que determine el mayor de tres números
1. Inicio
2. Definir las variables NUM1, NUM2, NUM3, MAYOR
3. NUM1 primer número ingresado
4. NUM2 segundo número ingresado
5. SI (NUM1 > NUM2 o NUM1 = NUM2)
MAYOR NUM1
Caso contrario MAYOR NUM2
6. NUM3 tercer número ingresado
7. SI (NUM3 > MAYOR o NUM3 = MAYOR)
MAYOR NUM3
Imprimir MAYOR
Caso contrario imprimir MAYOR
Ejercicio 1.11: Obtener el valor de cada una de las siguientes expresiones aritméticas
a)
b)
c)
d)
e)
f)
g)
h)
Ejercicio 2.1: algoritmo para calcular sueldo líquido de un trabajador en función del número de horas trabajadas, valor de la hora de trabajo y, considerando unos descuentos fijos, calcular el sueldo bruto en concepto de impuestos (21 %)
Inicio
Leer ( nombre, horas, valor_hora)
Sueldo_bruto horas * valor_hora
Impuesto 0.21 * Sueldo_bruto
Sueldo_neto Sueldo_bruto - impuesto
Escribir (nombre, sueldo_bruto, sueldo_neto)
Fin
Ejercicio 2.2: determinar el precio del pasaje ida-vuelta en bus, conociendo la distancia a recorrer, y sabiendo que si el número de días de viaje es superior a 7 y la distancia superior a 800 km el pasaje tiene un descuento del 30 %. El precio por km. es de $ 900
Algoritmo pasaje
Var entero: día_viaje
real: distancia, precio
Inicio
Leer (día_viaje, distancia)
precio 900 * distancia
Si (distancia > 800) y (día_viaje > 7) entonces
precio precio - (precio * 30 / 100)
Fin_si
Escribir ('Precio del pasaje', precio)
Fin
· Ejemplo 2.3: algoritmo que calcule el área de un triángulo, conociendo sus lados.
Clave: primero se debe verificar si los lados pueden formar un triángulo
Algoritmo área_triángulo
Real: a, b, c, p, área
Escribir ('Ingrese los lados')
Leer (a, b, c)
p (a + b + c) / 2
Si (p > a) y (p > b) y (p > c) entonces // es o no triángulo
Área raíz2 (p * (p - a) * (p - b) (p - c))
Escribir (área)
Si_no
Escribir ('No es un triángulo')
Fin_si
Ejercicio 2.4: Calcular el promedio de un conjunto de números positivos. Los datos se leen desde pantalla. Una entrada de valor 0 indica el fin de la serie de números positivos.
Solución: metodología: descomponer el problema (diseño descendente). Para calcular el promedio, se requiere: sumar y contar los valores de entrada.
Var real : número, contador, suma, promedio
Inicio
Contador
Suma
Leer (número)
Si número = 0 entonces
promedio suma / contador
escribir (promedio)
Fin_si
Si número < > 0 entonces
suma suma + número
contador contador + 1
ir a 1
Fin_si
Fin
· Ejemplo 2.5: emplear la estructura de selección para saber si un año es o no bisiesto
Algoritmo bisiesto
Entero: año
Leer (año)
Si (año % 4 = 0) y (año % 100 < > ) o (año % 400 = 0) entonces
Escribir ('El año', año, 'es bisiesto')
Si_no
Escribir ('El año', año, 'no es bisiesto')
Fin_si
Ejercicio 2.6: algoritmo que escriba los nombres de los días de la semana en función del valor de la variable día, introducida por teclado, que representa su posición dentro de la semana.
Análisis: los días de la semana son 7 (1,..., 7), y si día toma un valor fuera de rango, se debe emitir un mensaje de error
Algoritmo nombre_día
Var Entero: día
Inicio
Leer (día)
Según_sea día hacer
1: escribir ('LUNES')
2: escribir ('MARTES')
3: escribir ('MIÉRCOLES')
4: escribir ('JUEVES')
5: escribir ('VIERNES')
6: escribir ('SÁBADO')
7: escribir ('DOMINGO')
si_no
escribir ('ERROR')
Fin_según
Fin
Ejercicio 2.7: leída una fecha (por ejemplo 27), decir el día de la semana, suponiendo que el día 1 de dicho mes es lunes.
Algoritmo día_semana
Var
Entero: día
Inicio
Escribir ('Cuál es el día ?')
Leer (día)
Según_sea (día % 7) hacer
1: escribir ('Lunes')
2: escribir ('Martes')
3: escribir ('Miércoles')
4: escribir ('Jueves')
5: escribir ('Viernes')
6: escribir ('Sábado')
0: escribir ('Domingo')
Fin_según
Fin
Ejercicio 2.8: se lee por teclado un número entre 1 y 10 (inclusive), y se desea saber si ese número es par o impar.
Algoritmo Par_impar
Var entero: número
Inicio
Leer (número)
Si ((número >=1) y (número <=10)) entonces
Según_sea número hacer
1, 3, 5, 7, 9 : escribir ('Par')
2, 4, 6, 8, 10 : escribir ('Impar')
Fin_según
Fin_si
Fin
Ejercicio 2.9: Algoritmo que permita leer 2 números; si son iguales que los multiplique, si el primero es mayor que el segundo que los reste y si no que los sume.
Var real :x, y, z
Inicio
Leer (x, y)
Si x = y entonces
z x * y
Si_no
Si x > y entonces
z x - y
Si_no z x + y
Fin_si
Escribir (z)
Fin
Ejercicio 2.10: algoritmo para calcular las soluciones de una ecuación general de segundo grado:
Algoritmo raíces // solución a ecuación de 2º grado
Var real: a, b, c, d
Inicio
Leer (a, b, c)
d b ^2 - 4 * a * c
Si d < 0 entonces
escribir ('raíces complejas')
Si_no
Si d = 0 entonces
Escribir (- b / 2 * a)
Si_no
Escribir ((- b - raíz2 (d)) / (2 * a)) //raíz2 = raíz cuadrada
Escribir ((- b + raíz2 (d)) / (2 * a))
Fin_si
Fin_si
Fin
Ejercicio 2.11: Obtener el listado semanal con el sueldo líquido, de los empleados de una fábrica, cuyo trabajo se paga por horas, de la siguiente manera:
· la cantidad de horas iguales o inferiores a 35 (normales) se paga a un valor determinado que se introduce por teclado. Por teclado también se ingresa el número de horas y el nombre del trabajador.
· Si la cantidad de horas es mayor a 35, se pagan como extras, al valor de 1,5 horas normales.
· Los impuestos que se le descuentan a los trabajadores varían en función de su sueldo semanal:
- sueldo < = $ 100.000, libre de impuestos,
- los siguientes $ 75.000, tienen un descuento del 10 %,
- el resto, descuento de 30 %.
Algoritmo listado semanal
String (cadena): nombre
Real: horas, impuestos, sbruto, sliquido.
Inicio
Leer (nombre, horas, valor_hora)
Si horas < = 35 entonces
Sbruto horas * valor_hora
Si_no
Sbruto 35 * valor_hora + (horas - 35) * 1.5 * valor_hora
Fin_si
Si sbruto < = 100.000 entonces
Impuestos
Si_no
Si (sbruto >100.000) y (sbruto < = 175.000) entonces
Impuestos (sbruto - 100.000) * 0.10
Si_no
Impuestos (75.000 * 0.10) + (sbruto - 175.000) * 0.30
Fin_si
Fin_si
Sliquido sbruto - impuestos
Escribir (nombre, sbruto, impuestos, sliquido)
Fin
Ejercicio 2.12: algoritmo que lea tres números, y muestre por pantalla el mayor. Suponer que los tres números son distintos.
Algoritmo mayor
Var real: i, j, k, mayor
Inicio
Leer (i, j, k)
Si (i > j) entonces
Si (i > k) entonces
Mayor i // i < j, i > k
Si_no
Mayor k // k >= i > j
Fin_si
Si (j > k) entonces
Mayor j // j >= i, j > k
Si_no
Mayor k // k >= j >= i
Fin_si
Fin_si
Ejercicio 2.13: algoritmo que lea tres números diferentes, y muestre por pantalla los números ordenados de mayor a menor.
Algoritmo mayor_menor
Var real: i, j, k
Inicio
Leer (i, j, k)
Si (i > j) entonces // se ordenan los dos primeros
Si (j > k) entonces
Escribir (a, b, c)
Si_no
Si (k > i) entonces
Escribir (k, i, j)
Si_no
Escribir (i, k, j)
Fin_si
Fin_si
Si (i > k) entonces
Escribir (j, i, k)
Si_no
Si (k > j) entonces
Escribir (k, j, i)
Si_no
Escribir (j, k, i)
Fin_si
Fin_si
Fin_si
Ejercicio 2.14: algoritmo que permita calcular las soluciones de una ecuación de segundo grado, incluyendo los valores imaginarios.
Algoritmo Solución_ecuación_grado2
Var Real: a, b, c, d, X1, X2, r, i
Inicio
Escribir ('Ingrese los coeficientes')
Leer (a, b, c)
Si (a = 0) entonces
Escribir ('No corresponde a una ecuación de grado 2')
Si_no
d b ^ 2 - 4 * a * c
Si (d = 0) entonces
X1 b / (2 * a)
X2 X1
Escribir (X1, X2)
Si_no
Si (d > 0) entonces
X1 b + raíz2 (d)) / (2 * a)
X2 b - raíz2 (d)) / (2 * a)
Escribir (X1, X2)
Si_no
r b) / (2 * a)
i raíz2 (abs(d)) / (2 * a)
Escribir (r, '+', i, 'i')
Escribir (r, '-', i, 'i')
Fin_si
Fin_si
Fin_si
Ejercicio 2.15: algoritmo al que ingresándole la hora (hh, mm, ss), calcule la hora dentro de 5 segundos. Las horas, minutos y segundos se leerán como enteros.
Algoritmo reloj_5_seg_después
Var Entero: hh, mm, ss
Inicio
Escribir ('Ingrese hh, mm, ss')
Leer (hh, mm, ss)
Si ((hh < 24) y (mm < 60) y (ss < 60)) entonces
ss ss + 5
Si (ss > = 60) entonces
ss ss - 60
mm mm + 1
Si (mm = 60) entonces
mm
hh hh + 1
Si (hh = 24) entonces
hh
Fin_si
Fin_si
Fin_si
Escribir (hh, ':', mm, ':', ss)
Fin_si
Fin
Ejercicio 2.16: los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el salario diario de acuerdo a los siguientes puntos:
1. la tarifa de las horas diurnas es de $ 4500
2. la tarifa de las horas nocturnas es de $ 6300
3. si es domingo, la tarifa se incrementa en $ 1200 el turno diurno y $ 2300 el turno nocturno
Algoritmo salario
Var
Real: HT, salario //HT = horas trabajadas
String: día, turno
Inicio
Leer (HT, día, turno)
Si día < > domingo entonces
Si turno = 'diurno' entonces
salario 4500 * HT
Si_no
salario 6300 * HT
Fin_si
Si_no
Si turno = 'diurno' entonces
salario 5700 * HT
Si_no
salario 8600 * HT
Fin_si
Fin_si
Escribir (salario)
Fin
Ejercicio 2.17: Un palíndrome es un número o una frase que se lee lo mismo hacia adelante que hacia atrás. Por ejemplo, los siguientes números de cinco dígitos son palíndromes: 12321, 61916, etc. Escriba un programa que lea un entero de 5 dígitos y permita determinar si tal número es o no un palíndrome.
Algoritmo palíndrome
Var int (entero): num, p, u, cabeza, cola;
Inicio
Escribir ('Ingrese un Numero de 5 dígitos: ');
Leer (num);
p num / 10000; // p= primer dígito
u num % 10 // u= último dígito
Si (p = u) entonces // Si el primero es igual al quinto
Inicio
cabeza num / 1000; // Dos primeros dígitos
cola num % 100; // Dos últimos dígitos
cabeza cabeza % 10; // Segundo dígito
cola cola / 10; // Cuarto dígito
Si (cabeza = cola) entonces
Escribir ('Palindrome')
Si_no
Escribir ('No Palindrome');
Fin_si
Fin
Si_no
Escribir ('No palíndrome');
Fin.
Ejercicios Propuestos
Ejercicio 2.18: Algoritmo que calcule la superficie de un triángulo en función de la base y la altura.
Ejercicio 2.19: algoritmo que permita calcular el perímetro y el área de un cuadrado dada la longitud de su lado
Ejercicio 2.20: algoritmo que permita calcular el perímetro y el área de un rectángulo. Se deben ingresar las dimensiones de sus lados mayor y menor.
Ejercicio 2.21: las equivalencias entre las unidades inglesas de longitud son las siguientes
1 yarda (yard) = 3 pies (foot)
1 pie = 12 pulgadas (inch)
1 milla (mile) = 5280 pies
Desarrollar un algoritmo que realice las siguientes conversiones:
a) leer una cantidad en yardas e imprimir el equivalente en pulgadas
b) leer una cantidad en pies e imprimir el equivalente en yardas
c) una cantidad en millas e imprimir el equivalente en pulgadas
Ejercicio 2.22: Contar los números enteros positivos, ingresados por teclado.
Análisis: se usan 2 variables: número, contador. El ciclo se detiene cuando se lee un número negativo o cero.
Algoritmo cuenta_enteros
Var Entero: número, contador
Inicio
Contador
Leer (número)
Mientras número > 0 hacer
Contador contador +1
Leer (número)
Fin_mientras
Escribir (contador)
Fin
Observaciones:
Terminación de los bucles con los datos de entrada: si el algoritmo lee una lista de valores, es necesario incluir algún mecanismo que permita terminar el ciclo. En general se consideran 4 métodos para terminar un bucle:
5. Preguntar antes de la iteración: se solicita mediante un mensaje al usuario si existen más entradas:
suma
Escribir ('Hay más valores en la lista S/N')
Leer (resp) // Var Char: resp
Mientras ((resp = 's') o (resp = 'S')) hacer
Escribir ('Valor')
Leer (n)
suma suma + n
Escribir ('Hay más valores en la lista S/N')
Leer (resp)
Fin_mientras
Este método es bueno siempre y cuando la lista de valores no sea grande
6. Encabezar la lista de datos con su tamaño (ver ejercicio 3.29): se conoce a priori el tamaño de la lista
7. Finalizar la lista con cierto valor de entrada: uso del centinela
· Es el método más correcto.
· Centinela: valor especial que se usa para indicar el final de una lista.
· Ejemplo: una lista de notas (escala 1 - 7) tiene como centinela un valor fuera de este rango.
Ejercicio 2.23: suma de todos los números positivos, introducidos por teclado:
Suma
Leer (num)
Mientras num >= 0 hacer
Suma suma + num
Leer (num)
Fin_mientras
· El centinela leído no se añade a la suma, pues se sale del bucle,
· Debe existir una instrucción Leer ( ) dentro del bucle, pues debe leerse (y detectarse) el centinela.
Ejercicio 2.24: analice los algoritmos. ¿Qué se muestra?, ¿Cuántas veces se repite el ciclo? Rutéelos.
c) i
Mientras i < 6 hacer
Escribir (i)
i i +1
Fin_mientras
Se muestran los valores de la variable de control i : 0, 1, 2, 3, 4, 5; el ciclo se repite 6 veces
d) i
Mientras i < 6 hacer
i i +1
Escribir (i)
Fin_mientras
La salida es: 1, 2, 3, 4, 5, 6; el ciclo se repite 6 veces
Ejercicio 2.25: Algoritmo: dado un número entero n, se debe mostrar la suma de los dígitos que lo componen. Por ejemplo, si el número es 123, se debe mostrar 6.
Var: Entero: n, x, suma
Inicio
Leer (n)
Mientras n >= 1 hacer
x n % 10
Suma suma + x
n n / 10
Fin_mientras
Escribir (suma)
Fin
Ejercicio 2.26: calcular la media de un conjunto de notas de alumnos. Valor centinela: - 99
Inicio
total
n // nº de alumnos
Leer (nota) // primera nota debe ser < > - 99
Mientras nota < > - 99 hacer
total total + nota
n n + 1
Leer (nota)
Fin_mientras
media total / n
Escribir ('La media es', media)
Fin
Ejercicio 2.27 (ciclo controlado por centinela)
Calcular el sueldo de una serie de trabajadores, cuyos datos serán leídos desde teclado. Sabiendo que las horas normales se pagan a $2000, y las extraordinarias a $2500, mientras no pasen de 10. Si las horas extraordinarias sobrepasan las 10, el exceso se pagará a $2350. La introducción de datos termina cuando se teclea '*' como nombre para un trabajador.
Algoritmo calcular_sueldo
Var
String (Cadena): nombre
Real : hnormal, hextra, sueldo
Inicio
Escribir ('Nombre (* para ningún ingreso más)')
Leer (nombre)
Mientras (nombre < > '*') hacer
Escribir ('Nº horas normales')
Leer (hnormal)
Escribir (Nº horas extras)
Leer (hextra)
Sueldo hnormal * 2000
Si (hextra < = 10) entonces
Sueldo sueldo + hextra * 2500
Si_no
Sueldo sueldo + (10 * 2500) + ((hextra - 10) * 2350)
Fin_si
Escribir (nombre, sueldo)
Escribir ('Nombre (* para ningún ingreso más)')
Leer (nombre)
Fin_mientras
Fin
Ejercicio 2.28: (ciclo controlado por flag)
Determinar si un número leído por teclado es primo o no. Un número es compuesto cuando tiene algún divisor distinto de sí mismo o de la unidad.
Algoritmo primo_o_no
Var
Entero: n, divisor
Booleano: primo
Inicio
Escribir ('Ingrese número')
Leer (n)
Primo Verdadero
Divisor
Mientras (divisor < = n / 2) y primo hacer // la variable primo controla
Si (n % divisor = 0) entonces
Primo falso
Si_no
Divisor divisor + 1
Fin_si
Fin_mientras
Si primo entonces
Escribir (n, 'es primo')
Si_no
Escribir (n, 'es divisible por', divisor)
Fin_si
Fin
Ejemplo 2.29: (ciclo controlado por contador)
Introducir las notas de un curso de 20 alumnos por teclado, calcular el porcentaje de reprobados.
Algoritmo porcentaje_reprobados
Var
Entero: cont_alumnos, cont_reprobados
Real : porcent, n
Inicio
Cont_alumnos
Cont_reprobados
Mientras cont_alumnos < = 20 hacer
Escribir ('Nota alumno: ')
Leer (n)
Si (n < 4) entonces
Cont_reprobados Cont_reprobados + 1
Fin_si
Cont_alumnos cont_alumnos + 1
Fin_mientras
Porcent (cont_reprobados * 100) / 20
Escribir ('El % de alumnos reprobados es', porcent)
Fin
Ejercicio 2.30: algoritmo para calcular el factorial de un número N, según la fórmula:
N ! = N (N - 1) (N - 2)
Por ejemplo: 4 ! = 4
Restricción: N debe ser mayor o igual a 0
a)
Algoritmo factorial
Var Entero: N, fact
Inicio
Leer (N) // N >= 0
fact
Repetir
Fact fact * N
N N - 1
Hasta_que N = 1
Escribir ('El factorial de', N, '=', fact)
Fin
b)
Algoritmo factorial
Var Entero: N, i, fact
Inicio
Leer (N) // N >= 0
fact
i
Repetir
Fact fact * i
i i + 1
Hasta_que i = N + 1
Escribir ('El factorial de', N, '=', fact)
Fin
Ejercicio 2.31: Escribir los números 1 a 100
Algoritmo uno_cien
Var Entero: num
Inicio
num
Repetir
Escribir (num)
num num + 1
Hasta_que num > 100
Fin
Ejercicio 2.32: Validar entrada de datos: Algoritmo que detecte cualquier entrada comprendida entre 1 y 12, rechazando las otras. Se trata de leer los números correspondientes a los meses.
Algoritmo validar_mes
Var Entero: mes
Inicio
Escribir ('Número del mes'')
Repetir
Leer (mes)
Si ((mes < 1) o (mes > 12)) entonces
Escribir ('Valores entre 1 y 12')
Fin_si
Hasta_que ((mes >= 1) y (mes <= 12))
Fin
Ejercicio 2.33: Algoritmo que determine el mayor de 3 números positivos ingresados.
Solución: mostrar las diferentes formas de implementar el algoritmo en seudocógigo, desde la más ineficiente a la más eficiente. Recalcar las diferentes formas de solución empleando diferentes estructuras de repetición. Los alumnos deben deducir cuál es la mejor estructura que resuelve el problema.
a) Var Entero: número1, número2, número3, mayor
Mayor
Leer (número1, número2)
Si número 1 >= número 2 entonces
mayor número1
Si_no mayor número2
Fin_si
Leer (número3)
Si número3 >= mayor entonces
mayor número3
Escribir (mayor)
b) Var Entero: número, mayor, contador
Mayor
Contador
Repetir
Leer (número)
Si número >= mayor entonces
mayor número
Si_no mayor mayor
contador contador + 1
Hasta_que contador > 3
Escribir (mayor)
Mayor
Contador
Repetir
Leer (número)
Si número >= mayor entonces
mayor número
contador contador + 1
Hasta_que contador > 3
Escribir (mayor)
c) Var Entero: número, mayor, contador
mayor contador Mientras contador < 3 hacer Leer (número) Si número >= mayor entonces Mayor número Si_no mayor mayor Fin_mientras Escribir (mayor)
Inicio
Fin_si
contador contador + 1
Fin
mayor
contador
Mientras contador < 3 hacer
Leer (número)
Si número >= mayor entonces
Mayor número
Fin_mientras
Escribir (mayor)
Ejercicio 2.34 Algoritmo que determine el mayor de una serie de números positivos ingresados. El ingreso de números se detiene cuando se lee el número 0.
Var Entero: número, mayor
Iniciomayor Mientras número <>0 hacer Leer (número) Si número >= mayor entonces Mayor número Fin_siFin_mientrasEscribir (mayor) Fin |
mayor
Repetir
Leer (número)
Si número >= mayor entonces
mayor número
Hasta_que número = 0
Escribir (mayor)
Nota: Deben fijarse en la ubicación de la condición en las estructuras de repetición:
·
Mientras condición hacer Acciones
Fin_mientras
ü El proceso no se realiza (ninguna vez) si la condición NO se cumple.
ü El proceso se repite mientras la condición se cumpla
·
Hasta_que condición
Repetir
Acciones
ü Permite realizar el proceso al menos una vez, ya que la condición se evalúa al final del proceso.
ü El proceso se repite hasta que la condición no se cumpla o cambie.
Ejercicio 2.35: Algoritmo que determine el mayor y el menor de una serie de 12 números ingresados.
InicioMayor Menor Contador Mientras contador < 12 hacerLeer (número) Si número > mayor entonces Mayor número Fin_si Si número < menor entonces Menor número Fin_si Contador contador + 1 Fin_mientrasEscribir (mayor, menor) Fin |
Mayor
Menor
Contador
Leer (número)
Si número > mayor entonces
Mayor número
Fin_si
Si número < menor entonces
Menor número
Fin_si
Contador contador + 1
Hasta_que contador > 12
Escribir (mayor, menor)
Ejercicio 2.36: Algoritmo que determine cuántas cifras tiene un entero n
Var Entero: n, contador
InicioContador Leer (n) Repetir n n / 10 contador contador + 1 Hasta_que n = 0 Escribir (contador) Fin |
Inicio
Contador
Leer (n)
Mientras n >= 1 hacer
n n / 10
contador contador + 1
Fin_mientras
Escribir (contador)
Fin
Ejercicio 2.37: Algoritmo que determine cuántas cifras tiene un entero n. Si la cantidad de cifras es par, calcular el producto de ellas, si no, es decir, si es impar, imprimir 'La suma es impar.'
Var Entero: n, aux, X, prod, contador
InicioContador Prod Leer (n) Aux n Repetir n n / 10 contador contador + 1 Hasta_que n = 0 Si contador % 2 = 0 entonces Repetir X aux % 10 prod prod * X aux aux / 10 Hasta_que aux = 0 Escribir (prod) Si_no Escribir ('La suma es impar') Fin_si Fin |
Inicio
Contador
Prod
Leer (n)
Aux n
Mientras n >= 1 hacer
n n / 10
contador contador + 1
Fin_mientras
Si contador % 2 = 0 entonces
Mientras aux >= 1 hacer
X aux % 10
prod prod * X
aux aux / 10
Escribir (prod)
Si_no
Escribir ('La suma es impar')
Fin_si
Fin
Ejercicio 2.38: Algoritmo que lea un entero positivo, y lo escriba invertido.
Var: Entero: n, resto
Leer (n)
Repetir
resto n % 10
Escribir (resto)
n n / 10
Hasta_que n = 0
Fin
Inicio
Leer (n)
Mientras n > 0 hacer
resto n % 10
Escribir (resto)
n n / 10
Fin_mientras
Fin
· Si el usuario ingresa la cantidad de números a sumar, por ejemplo N, existen 2 formas para contar las iteraciones:
a) Usar una variable total que se inicializa con valor N, y se va decrementando (disminuyendo) su valor en 1 cada vez que el ciclo se repite (total total - 1), hasta llegar a 0,
Algoritmo suma_números
Var Entero: N, total
Real: num, suma.
Leer (N)
total N
Mientras total > 0 hacer Leer (num) suma suma + num total total - 1 Fin_mientras
suma
Leer (num)
suma suma + num
total total - 1
Hasta_que total = 0
Escribir ('La suma de los', N, 'números es', suma)
b) Usar una variable total que se inicializa en 0 ó 1, y se va incrementando (aumentando) en 1 cada vez que el ciclo se repite (total total + 1), hasta llegar a N.
Algoritmo suma_números
Var Entero: N, total
Real: num, suma.
Inicio
Leer (N)
total
Mientras total < N hacer Leer (num) suma suma + num total total + 1 Fin_mientras
suma
Leer (num)
suma suma + num
total total + 1
Hasta_que total = N
Escribir ('La suma de los', N, 'números es', suma)
Fin
Observaciones:
· Condición de salida al comienzo del ciclo, estructura Mientras (Condición) - hacer - Fin_mientras
Algoritmo suma
Inicio
K
S
Leer (n)
Mientras K < n hacer
K K + 1
S S + K
Fin_mientras
Escribir (S)
Fin
El ciclo se repite mientras se cumple la condición (K < n)
· Condición de salida al final del ciclo, estructura Repetir - hasta_que (Condición)
Repetir
K K + 1
S S + K
Hasta_que K > n
El ciclo se repite hasta que se cumple la condición (K > n)
· Ejercicio 2.40: imprimir todos los números primos entre 2 y 100 inclusive
Algoritmo primos
Var
entero: i, divisor
booleano: primo
Inicio
Desde i 2 hasta 200 hacer
Primo V
Divisor
Mientras ((divisor < = i / 2) y ( primo) hacer
Si (i % divisor = 0) entonces
Primo F
Si_no
Divisor divisor + 1
Fin_si
Fin_mientras
Si primo entonces
Escribir (i, ' ')
Fin_si
Fin_desde
Fin
Ejercicio 2.41: Se conoce el número de habitantes que hay en cada una de las 7 ciudades más grandes de las 13 regiones de Chile (se incluye la Región Metropolitana). Identificar y visualizar la ciudad con mayor cantidad de habitantes de cada región.
Algoritmo ciudad_más_grande
Var
entero: i // contador de regiones
entero: j // contador de ciudades
entero: mayor // mayor población
entero: ciudad // población de una ciudad
Inicio
i
Mientras i < = 13
mayor
j
Mientras j < = 7
Leer (ciudad)
Si ciudad > mayor entonces
mayor ciudad
j j + 1
Fin_si
Fin_mientras
Escribir (`La mayor población tiene', mayor, 'habitantes.')
i i + 1
Fin_mientras
Fin
Ejercicio 2.42: (Certamen 1, semestre 1, 2001) Para estudiar el efecto de inversión térmica, una estación meteorológica proporciona todos los días un par de temperaturas (mínima, máxima). El laboratorio que procesa dichos datos desecha el par de temperaturas correspondientes, si una o ambas son de 9 grados. Es decir, el par (mínima, máxima) de ese día no se considera para el estudio.
Se le pide al departamento de Informática del laboratorio PC 1 que diseñe un algoritmo que sea capaz de entregar mensualmente la siguiente información:
· Número de días cuyas temperaturas han sido estudiadas,
· Las temperaturas media mínima y media máxima,
· Número de días cuyas máxima o mínima fueron 0 (cero) grados,
· Porcentaje que representan los días con una máxima o mínima de 0 (cero) grados, sobre el total de días estudiados
Algoritmo Temperatura
Entero: día, cero
Real: min, max, suma_min, suma_max, media_min, media_max, porcent_cero
Carácter: resp
Inicio
día
cero
suma_min
suma_max
Escribir ('Ingresar temperaturas [S/N]')
Leer (resp)
Mientras ((resp = 'S') o (resp = 's')) hacer
Escribir ('Ingresar temperaturas Mínima y Máxima')
Leer (min, max)
Si ((min < > 9) y (max < > 9)) entonces
día día + 1
suma_min suma_min + min
suma_max suma_max + max
Si ((min = 0) o (max = 0)) entonces
cero cero + 1
Fin_si
Escribir ('Ingresar temperaturas [S/N]')
Leer (resp)
Fin_mientras
media_min suma_min / día
media_max suma_max / día
porcent_cero cero / día * 100
Escribir ('Número de días estudiados: ', día)
Escribir ('Media Mínima: ', media_min)
Escribir ('Media Máxima: ', media_max)
Escribir ('Número de días con Mínima o Máxima de cero grados: ', cero)
Escribir ('Porcentaje de días cuyas Mínimas o Máximas fueron cero grados: ', porcent_cero)
Fin
Variación del mismo:
Día
cero
suma_min
suma_max
Escribir ('Ingresar temperaturas [s/n]')
Leer (resp)
Si ((resp = 'S') o (resp = 's')) entonces
Escribir ('Ingresar temperaturas min y max')
Leer (min,max)
Si ((min < >9)) y ((max < > 9)) entonces
suma_min suma_min + min
suma_max suma_max + max
Si ((min=0) o (max=0)) entonces
cero cero + 1
Dia dia + 1
Fin_si
Escribir ('Ingresar temperaturas [s/n]')
Leer (resp)
Ejercicios Propuestos
Ejercicio 2.43: (Certamen 1, semestre 2, 2001) Una empresa conservera envasa sus conservas de frutas mediante una máquina totalmente automática, que es guiada por medio de señales digitales, enviadas una vez al día desde un computador central.
La máquina permite envasar según las siguientes categorías:
· Cajas de 30 unidades (30 tarros).
· Cajas de 60 unidades (60 tarros).
· Cajas de 80 unidades (80 tarros).
Además, los tarros pueden pesar 400 [gr], ó 1.000 [gr].
Es decir, puede haber cajas de 30 unidades, conteniendo tarros de 400 [gr], y/o cajas de 30 unidades, conteniendo tarros de 1.000 [gr], etc.
Los códigos que envía el computador son los siguientes:
· 0000 : no funciona
· 1111 : envasa cajas de 30 u conteniendo tarros de 400 [gr]
· 1110 : envasa cajas de 30 u conteniendo tarros de 1.000 [gr]
· 1101 : envasa cajas de 60 u conteniendo tarros de 400 [gr]
· 1100 : envasa cajas de 60 u conteniendo tarros de 1.000 [gr]
· 1011 : envasa cajas de 80 u conteniendo tarros de 400 [gr]
· 1010 : envasa cajas de 80 u conteniendo tarros de 1.000 [gr]
Diseñe un algoritmo que permita contabilizar el total de cajas procesadas, según su categoría y según el peso de los tarros que contienen. Se requiere que se contabilicen estas cajas en períodos de 15 días efectivamente trabajados (si un día la máquina recibió la señal 0000, no trabajó).
Ejercicio 2.44: (Certamen 2, semestre 2, 2001) En una maestranza hay una máquina que fabrica aleatoriamente tanto tornillos como tuercas. Dependiendo de la cantidad de acero fundido que pasa al molde, la pieza que sale puede ser o un tornillo o una tuerca. Si la cantidad de acero es de 22 gramos, se fabrica un tornillo, y si es de 17 gramos se fabrica una tuerca.
Si la cantidad de acero fundido que sale es menor a 17 gramos, se fabrica una pieza defectuosa del tipo A, y si es mayor a 22 gramos es una pieza defectuosa del tipo B.
La máquina funciona a base de un "centinela" electrónico conectado a un computador. Mientras el valor del centinela es 1 se fabrican piezas, en cambio cuando el centinela toma el valor 0 (cero), se detiene la producción.
Se pide diseñar un algoritmo que permita:
· Contabilizar el número de tornillos,
· Contabilizar el número de tuercas,
· Contabilizar el número de piezas tipo A,
· Contabilizar el número de piezas tipo B,
· Calcular el porcentaje de piezas tipo A, sobre el total de piezas (buenas y malas) fabricadas,
· Calcular el número total de piezas defectuosas,
· Calcular el porcentaje total de piezas defectuosas, sobre el total de piezas fabricadas.
Ejercicio 2.45: algoritmo que indique si un número, leído de teclado, tiene 1, 2, 3, o más de 3 dígitos. Se deben considerar los negativos.
Ejercicio 2.46: leer las notas de un curso de Programación, y mostrar aquellas que sean iguales o superiores a 6
Ejercicio 2.47: Leer 100 números. Determinar el promedio de los números positivos, y el promedio de los números negativos.
Ejercicio 2.48: (Certamen 1, semestre 2, 2001) Realizar un algoritmo que calcule e imprima el valor de la siguiente serie:
S= 1 - 4 + 9 - 16 + 25 - ................ n * n.
Se debe ingresar n
Ejercicio 2.49: Rutear el siguiente código. ¿Qué se muestra (Escribe) en pantalla?
Var Entero: X1, X2, X3, cont
Inicio
Leer (X2)
X1 X2
X3 X2
cont
Mientras cont < = 10 hacer
Leer (X2)
Si X2 < X1 entonces
X1 X2
Si X2 > X3 entonces
X3 X1
cont cont + 1
Fin_mientras
X2 X1
Repetir
Si X2 % 3 = 0 entonces
Escribir (X2)
X2 X2 + 1
Hasta_que X2 < = X3
Escribir (X1, X3)
Fin
Ejercicio 2.50: (Certamen 1, semestre 2, 2001) Para el siguiente programa:
Var Real: X, Y, F, R
Inicio
Escribir ('Ingrese el Primer número')
Leer ( X )
Escribir ('Ingrese el Segundo número')
Leer ( Y )
R
F Y
Mientras (X < > 0) hacer
Si (X % 2 = 0) entonces
X X / 2
F raíz2 (F) // raíz cuadrada
R R + F
Fin_mientras
Escribir ('El resultado es', R)
Fin
a) Hacer el ruteo para X = 6, Y = 25
b) Explicar qué hace el programa.
Ejercicio 2.51: Se desea llevar una estadística de los pesos de los alumnos de un curso, según los siguientes criterios:
· Alumnos de menos de 40 kg
· Alumnos entre 40 kg y 50 kg
· Alumnos de más de 50 kg y menos de 60 kg
· Alumnos de 60 kg o más
La entrada de datos terminará cuando se introduzca el valor centinela - 99.
Determinar cuántos alumnos hay en cada categoría.
Ejercicio 2
Var
Real: real
Entero: km, prod, fact, tot_prod, x, y, pot
Inicio
Escribir ( Ingrese el peso: ' );
Leer ( peso );
Escribir ( 'Ingrese los kilómetros: ' );
Leer ( km );
Si (peso % 2 = 0) entonces
inicio
suma
Desde x 1 hasta km hacer
inicio
pot
Desde y 1 hasta x hacer
pot pot * (1 + x)
fin_desde
suma suma + ( pot / x );
fin
fin_desde
Escribir ( 'Suma vale: ', suma );
fin
si_no
inicio
tot_prod
Desde x 1 hasta kms hacer
inicio
prod
Desde y 1 hasta ( x - 1) hacer
prod prod * y;
fin_desde
tot_prod tot_prod * prod;
fin
fin_desde
Escribir ( 'Cantidad es: ', tot_prod );
fin
End.
Realice el ruteo del programa, para los casos a) y b), especificando los valores que van tomando las variables, y lo que se muestra en pantalla. Suponer los siguientes valores:
a) peso = 1562 kms = 3
b) peso = 451 kms = 2.
Ejercicio 2.53: (Quiz 2, año 2001) Una empresa de diversiones que fabrica máquinas que "adivinan el futuro" tiene una nueva idea para uno de sus dispositivos: por sólo $100 Ud. puede saber cómo le irá el resto del día. La empresa encarga que se fabrique el software que usarán tales máquinas.
Las características que debe cumplir el SW, son las siguientes:
· Se debe ingresar la fecha de nacimiento en el formato DDMMAA, por ejemplo, 201285 equivale al día 20, del mes 12, del año 1985.
· Se deben sumar cada uno de los dígitos de la fecha de nacimiento; en el ejemplo, la suma es 18.
· Si de esta suma, el resultado es mayor a 10, se debe volver a sumar cada uno de los dígitos resultantes, en el ejemplo, la primera suma dio 18, entonces la suma de ellos da 9.
· Dependiendo del resultado de la o las sumas, se debe hacer lo siguiente:
· Si el resultado es 1, 2, ó 3: sumar los dígitos correspondientes al año de nacimiento.
Si el resultado de esta suma es impar debe mostrar el mensaje: "Día incierto", en caso contrario, "Suerte".
· Si el resultado es 4, 5, ó 6: sumar los dígitos correspondientes al mes.
Si el resultado de esta suma es menor que 7, debe mostrar el mensaje "No se desespere", en caso contrario, "Hoy será un gran día para Ud."
· Si el resultado es 7, 8, ó 9: sumar los dígitos correspondientes al día.
Si el resultado de esta suma es menor que 16, debe mostrar el mensaje "Juegue, tendrá suerte", de lo contrario, "Mañana será mejor".
· Si el resultado es mayor que 9, mostrar el mensaje "Hoy logrará todo lo que se proponga".
Ejercicio 2.54: Calcular el valor de n facturas de una empresa de electricidad. El tráfico se define de la siguiente manera :
· Los primeros 90 KWH tienen un costo de $20 por KWH
· Los segundos 90 KWH tienen un costo de $30 por KWH
· A partir del 181 KWH tienen un costo de $ 36 por KWH
Por cada factura, se debe ingresar el consumo en KWH y se debe imprimir el total a pagar. Finalmente se debe imprimir el total a pagar por las n facturas
Ejercicio 2.55: Realizar un algoritmo que ingrese n números y con ellos genere e imprima las siguientes estadísticas:
· Suma total
· Cantidad de números mayores a num.
· Suma de números pares.
Se debe ingresar n y num.
Ejercicio 2.56: Realizar un algoritmo que permita calcular e imprimir el resultado de la siguiente suma:
S = x / (x + 1) + (x + 1) / (x + 2) + (x + 2)/(x + 3) + ...........+ (x + n) / (x + n + 1).
Se debe ingresar x, n.
Ejercicio 2.57: La comisión sobre las ventas totales de un vendedor se calcula de la siguiente manera:
· Si las ventas son menores que $40.000, entonces la comisión corresponde al 4% de las ventas.
· Si las ventas están comprendidas entre $40.000 y $200.000 (ambos inclusive), hay una comisión del 8% sobre las ventas.
· Si las ventas son superiores a $200.000, entonces la comisión corresponde a $30.000 más el 9% de las ventas.
Calcular la comisión a pagar a n vendedores. Se deben ingresar las ventas totales por cada vendedor.
Ejercicio 2.58 Se desea conocer una serie de datos de una empresa que tiene 50 empleados:
a) ¿Cuántos empleados ganan más de $ 500.000 al mes (sueldos altos)?
b) ¿Cuántos empleados ganan entre $ 250.000 y $ 500.000 al mes (sueldos medios)?
c) ¿Cuántos empleados ganan menos de $ 250.000 al mes (sueldos bajos)
Ejercicio 2.59 escribir un algoritmo que permita convertir una determinada cantidad de segundos ingresada desde teclado, en su equivalente en minutos y segundos. Por ejemplo, si se ingresa 75 segundos, debe mostrar 1 minuto y 15 segundos.
Todo programa se puede escribir usando 3 tipos de estructuras de control:
· Secuenciales,
· de Selección,
· Repetitivas.
Estr. Secuenciales
If
Estructuras de Control Estr. Selección If / else
switch
while
Estr. Repetición do / while
for
Estr. Control Apiladas (Lineales)
Combinación de estructuras de Control
Estr. Control Anidadas
· Cada instrucción sigue en secuencia a otra.
· Cada sentencia se ejecuta una sola vez y en el mismo orden en que figura en el texto del programa.
instrucción 1 instrucción 2 instrucción 3
· Se usan para tomar decisiones. Se evalúa una condición, y según sea el resultado, se ejecuta una acción.
· Las estructuras de selección pueden ser:
· Simples
· Dobles
· Múltiples
· Ejecuta una acción cuando se cumple una determinada condición.
· Si la condición es V, se ejecuta la acción 1.
· Si la condición es F, se continúa con la siguiente instrucción.
V |
F |
condición |
acción 1 |
|
|||
· Permite elegir entre dos alternativas posibles o cursos de acción a seguir, en función del cumplimiento o no de una determinada condición.
· Si la condición es V, se ejecuta la acción 1, si es F, se ejecuta la acción 2.
condición |
acción 1 |
acción 2 |
|
|||
V F
Selección Múltiple: switch / case
· La instrucción switch permite seleccionar una entre varias alternativas.
· La estructura de decisión múltiple evaluará una expresión que podrá tomar n valores distintos. Al coincidir uno de estos valores con la condición, se ejecutará una de las n posibles acciones.
· Al cumplirse una condición, no se ejecutan las demás, gracias a la instrucción break asociada a cada una de ellas.
· Default permite especificar una acción a seguir en caso de que no exista correspondencia con ningún valor previamente especificado.
case a |
break
V
F
case b |
break
V
F
case z |
break
V
F
default |
switch expresión
Estructura de repetición while
· El ciclo se repite mientras se cumple una determinada condición (mientras la condición sea verdadera).
· La estructura while, se ejecuta cero o más veces, debido a que se evalúa en primer termino la condición y luego se ejecuta la acción.
F V
acción |
<condición>
<acción>
condición |
Estructura de repetición do while
· El ciclo se repite mientras se cumple una determinada condición (mientras la condición sea verdadera).
· La estructura do while ejecuta el ciclo siempre al menos una vez, debido a que se ejecuta en primer termino la acción y luego se evalúa la condición.
acción |
<condición>
condición |
|
F
Estructura de repetición for
· Se usa cuando se conoce anticipadamente el número de veces que se repetirá el ciclo.
· La estructura for controla automáticamente el número de iteraciones.
Asignación inicial |
|
incremento acción
V
F
Su estructura general es:
for (expresión1; expresión2; expresión3)
<acción>
donde:
expresión1: inicializa la variable de control (Asignación inicial)
expresión2: condición que regula la repetición.
expresión3 : incrementa la variable de control.
1. Muestra en pantalla los números entre el 1 y el 10.
#include <iostream.h>
main()
while (i < = 10);
return 0;
2. Suma los pares entre 2 y 10.
#include <iostream.h>
main()
3. Muestra en pantalla los números entre el 1 y el 10, utilizando distintos tipos de for.
#include <iostream.h>
int main()
4. Programa que suma 2 números
#include <iostream.h>
main()
5. Programa que intercambia 2 números
# include <iostream.h>
main()
6. Calcula el promedio de 3 notas
#include <iostream.h>
main()
promedio = total / 3;
cout << promedio << endl;
return 0;
7. Ingresa 100 enteros. Calcula suma de los números pares y la suma de los números impares
# include <iostream.h>
main()
cout << "Suma de los números pares: " << suma_par << endl;
cout << "Suma de los números impares: " << suma_impar << endl;
return 0;
8. Programa que cuenta los vendedores que se encuentran en cada una de las 3 categorías existentes, en base a las ventas realizadas. Para calcular el sueldo, $200.000 base mas un 5% de las ventas. Asuma que existen 100 vendedores.
#include <iostream.h>
main()
cout << "Categoria 1: " << cat1;
cout << "Categoria 2: " << cat2;
cout << "Categoria 3: " << cat3;
return 0;
9. Haga un programa que determine la cantidad de divisores primos que tiene un numero N ingresado por el usuario.
//divisores primos
#include <iostream.h>
main()
if (cont == 0) // es primo
divprimos++;
cout << "los divisores primos son : " << divprimos << endl;
return 0;
10. A base del siguiente lazo repetitivo se pide:
for (x=1; x<=10; x+=2)
a) señalar que escribe en pantalla.
Escribe: 1 3 7 9
b) Reescribirlo utilizando la sentencia while.
x=1;
while (x <= 10)
cout <<x<<" ";
x+=2;
11. Para el siguiente programa:
a) Indique si hay errores sintácticos. Corrija los que encuentre.
#include <iostream.h>
main()
cout << "Su resultado es : " r << endl;
debe ser: cout << "Su resultado es : " << r << endl;
return 0;
b) Rutearlo para x = 5, e y = 3.
x
= 5 2 1 0
y = 3
r
= 1 3 243
f
= 3 9 81 6561
su resultado es 6561
c) Señale una manera alternativa de escribir la instrucción: x = x / 2;
x /= 2
d) Es posible lograr el mismo resultado usando menos variables? En caso que sí, indique cuántas variables necesita y que modificaciones haría.
Si es posible. No es necesario declarar la variable f. La variable y puede usarse directamente.
e) Explicar que hace el programa.
yx
12. Programa que indica que día de la semana es, basándose en que el primer día del mes es un lunes.
# include <iostream.h>
main ()
return 0;
13. Determinar cuantas cifras componen a un entero n.
# include <iostream.h>
main ()
cout << "La suma de las cifras es: " << cont;
return 0;
14. Determina el mayor y el menor entre 10 números ingresados.
#include<iostream.h>
main()
cout << "El menor es: " << menor << endl;
cout << "El mayor es: " << mayor << endl;
return
15. Lee un entero positivo y lo escribe invertido.
#include <iostream.h>
main()
while (n <= 0);
while (n > 0)
return 0;
Un palíndrome es un número o una frase que se lee lo mismo hacia adelante que hacia atrás. Por ejemplo, los siguientes números de 5 dígitos son palíndromes: 12321, 61916, etc. Escriba un programa que lea un entero de 5 dígitos y permita determinar si tal número es o no un palíndrome
# include <iostream.h>
main ()
else
cout << "No es un Palíndrome" << endl;
return 0;
17. Imprime los numero primos entre 1 y 100 inclusive.
#include<iostream.h>
main()
if (primo)
cout << i << endl;
i++;
}
return 0;
18. Programa que ingresa n números y con ellos genera las siguientes estadísticas:
· suma total
· cantidad de números mayores a num
· suma de números pares
se debe ingresar n y num.
#include<iostream.h>
int main()
cout << "Suma total: " << sumtot << endl;
cout << "mayores a " << num << ":" << mayores << endl;
cout << "suma de pares: " << sumpares << endl;
return
19. Programa que pide una cierta cantidad de números positivos, mientras el usuario lo desee, y entrega como resultado la cantidad de números ingresados y el mayor valor ingresado.
#include<iostream.h>
main()
cout << "Cantidad de numeros ingresados: " << cont << endl;
cout << "El numero mayor es: " << mayor << endl;
return
20. Hacer un programa que calcule la siguiente suma:
Se debe ingresar x , n.
#include<iostream.h>
int main()
cout << "la suma es: " << s << endl;
return
21. Escriba un programa que permita calcular el valor de en la siguiente serie:
# include <iostream.h>
int main ()
cout << suma << endl;
return 0;
22. El satélite Uranos que orbita la tierra envía 24 lecturas al día a base del tipo de terreno que está mostrando en un determinado momento. Los códigos posibles a ser enviados al computador son:
· 0: zona desértica
· 1: río
· 2: océano
· 3: terreno urbano
· 4: zona no identificada
Hacer un programa que lea las lecturas enviadas por el satélite y a base de a ellas realice los siguientes cálculos:
a) porcentaje de zonas no identificadas con respecto al total de lecturas.
b) Cantidad de lecturas de terreno urbano
c) Cantidad de lecturas que identifican agua
#include<iostream.h>
int main()
cout << "No identificado = " << noidentif*100/24 << endl;
cout << "Terreno urbano = " << terrenourbano << endl;
cout << "Agua = " << agua;
return 0;
23. Programa que lee 3 números enteros y determina si estos se encuentran o no ordenados ascendentemente.
#include<iostream.h>
int main()
24. ¿Qué imprime el siguiente fragmento de código?
# include <iostream.h>
int main ()
cout << endl;
return 0;
Imprime por pantalla lo siguiente:
Ejercicios Propuestos
1. Hacer un programa que permita calcular la siguiente expresión:
x = 1! + 2! + 3! + 4! + ... + n!
2. Para cada uno de los 35 alumnos que están tomando el ramo de "Introducción a la Informática" se desea obtener el promedio final obtenido. Asuma que cada alumno tiene 4 notas. El programa debe:
· mostrar el promedio final individual.
· contar los alumnos aprobados
· calcular el promedio general del curso.
3. Calcular el valor de la factura de electricidad si el trafico se define de la siguiente manera:
· los primeros 90 KWH tiene un costo de $100/KWH.
· sobre 90 KWH se tiene un costo de $150/KWH adicional.
Ej. Si una persona consumió 100 KWH debería cobrársele $10.500.
El programa debe permitir ingresar tantos datos de clientes como lo desee el usuario, además de validar que el consumo ingresado sea mayor que cero
4. La comisión para las ventas totales mensuales de un vendedor es como sigue:
a) Si las ventas son menores que $100.000, su comisión es de un 5%.
b) Si las ventas son entre $100.001 y 300.000, su comisión es de un 8%.
c) Si las ventas son superiores a $300.000, su comisión es de un 10%.
Asuma que el sueldo base es de 100.000.
Se pide determinar cuanto debe pagar la compañía en sueldo, si se sabe que son 5 los vendedores. (El programa debe solicitar el ingreso de las ventas realizadas por cada uno de los vendedores.) Tuvo ganancias la empresa?
5. Haga un programa que imprima todos los números primos menores que N. Un número primo es aquel que solo es divisible por uno y por si mismo.
6. Calcular la siguiente serie: x = 1/3 + 2/4 + 3/5 + 4/6 + .... + n / n+2
7. Se ha realizado una encuesta callejera para determinar el grado de cesantía en la región. A cada persona se le consulto: edad (entre15 y 100), sexo (F, M) y si trabaja(S, N). Hacer un programa que determine lo siguiente:
· cantidad de personas que pertenecen a la tercera edad (sobre 60 anos).
· Promedio de edad de los encuestados.
· Cantidad de personas de sexo masculino que están cesantes.
· % de damas menores de 30 años que no trabajan con respecto al total de damas encuestadas.
Se debe validar que los datos de entrada estén dentro de los rangos señalados. Asuma que se encuestaran 200 personas.
8. Escriba un programa que para un valor real calcule el valor de la función dada por:
6
+ 2x2 si x>=1
f(x)= 3 + 6x3 si 0<x<1
2 +3x3+5x2 si x<=0
9. Calcule la siguiente sumatoria:
donde N es un valor entre 5 y 10.
10. Determine que escribe en pantalla el siguiente programa para x = 17 e y = 8
#include <iostream.h>
int main()
cout << "cont = " << cont << endl;
return 0;
11. Considerando los datos de cada uno de los 40 empleados que tiene una empresa se desean obtener las siguientes estadísticas:
· mostrar el promedio de sueldos.
· contar los empleados con sueldo mayor a $300.000
· determinar cuanto se gastaría en bonificación si a los empleados con sueldo menor a $300.000 se les bonifica con un 10% de su sueldo y a los de sueldo mayor o igual a $300.000 una bonificación de un 5%.
12.
Calcular:
13. Para un curso de 40 alumnos se desea saber el código del alumno que tuvo la mejor y la peor nota en la primera prueba. Para ello se ingresara para cada alumno su código y su correspondiente nota obtenida.
14. Hacer un programa que muestre en pantalla todos los divisores que tiene un número N. Debe validarse que N sea mayor que 300.
15. Se ha realizado una encuesta callejera con el fin de determinar el grado de escolaridad de la población. A cada persona se le consulto: edad (entre 10 y 100), sexo (F,M), escolaridad (b = básica, m = media, t = técnica, u = universitaria).
Hacer un programa que determine lo siguiente, después de encuestar a 200 personas tomadas en forma aleatoria:
a) Cantidad de personas de sexo femenino con edad mayor que 20.
b) Promedio de edad de los encuestados.
c) Existen más mujeres u hombres con escolaridad técnica?
d) Porcentaje de universitarios con respecto al total de encuestados.
16. Hacer un programa que permita procesar los resultados del censo que se realizó el pasado 24 de abril en la ciudad de Valparaíso. Para cada una de las 500 casas encuestadas se registró:
· cantidad de habitantes de la casa
· cantidad de personas mayores de 65 años
· ¿tiene televisor? (s/n)
· ingreso familiar (sueldo)
· número de estudiantes
Basándose en los antecedentes recopilados, se pide generar los siguientes resultados:
· Cantidad de personas residentes en Valparaíso.
· Ingreso familiar promedio en la ciudad.
· Porcentaje de hogares que no tienen personas mayores de 65 años en sus casas.
· Cantidad de hogares que no tienen televisor.
· Porcentaje de estudiantes en la ciudad con respecto al total de habitantes.
17. Hacer un programa que lea una serie de letras del alfabeto y que determine:
· Cantidad total de elementos ingresados.
· Porcentaje de letras 'a' con respecto al total de vocales ingresadas.
· Cantidad de consonantes ingresadas.
18. Determinar la mejor nota promedio en un curso de 40 alumnos, considerando que cada alumno tiene 10 notas.
19. Se está haciendo un estudio de costos en una empresa, para determinar cuánto más se debería cancelar por concepto de sueldos mensualmente, si se decidiera subir el sueldo a sus empleados. El sueldo se subirá en un:
· 20% si el empleado es casado y lleva mas de 10 años en la empresa.
· 10% si el empleado no es casado y lleva mas de 10 años en la empresa.
· 5% en cualquier otra situación.
El programa deberá solicitar a cada uno se sus 20 empleados: el sueldo actual, cantidad de años trabajando en la empresa y si es casado o no, y deberá entregar como resultado el monto que le implicaría pagar a la empresa mensualmente en forma adicional en caso de que decidiera aprobar el aumento de sueldo.
20. Cambie todas las estructuras de control while por do-while, y viceversa, de modo que se haga exactamente lo mismo.
int main()
while (condicion_3 || condicion_4);
accion_3;
while (condicion_5 || condicion_6)
while (condicion_7 && condicion_8);
accion_6;
accion_7;
return 0;
21. Dado el siguiente programa en C:
int main ()
while ( c < 0 );
d = c;
e = c;
while ( c > = )
cout << "a = " << a;
cout << "El resultado es: " << b / a << endl;
cout << "d = " << d << "e = " << e;
return 0;
a) Rutee el programa para los siguientes valores de c: -4, 3, 0, -8, 25
b) Explique brevemente cuál es el objetivo del programa.
c) Cambie el nombre de las variables a, b, c, d, e, f, de modo que reflejen lo que hacen realmente (dar nombres significativos a las variables).
22. Rutear el siguiente algoritmo que determina el cuociente y el resto de una división entera entre p y q
a) Usar: p = q, y q = 3
b) Usar: p = 7, y q = 2
# include < iostream.h >
int main ()
cout << "Cuociente = " << cuociente << endl;
cout << "Resto = " << resto << endl;
return 0;
Unidad III: Arreglos
1. Introducción:
· Los arreglos son estructuras de datos que consisten en elementos del mismo tipo que están relacionados.
· Los arreglos son entidades "estáticas": conservan el mismo tamaño durante todo el programa.
2. Arreglos lineales o unidimensionales:
· Definición: conjunto de variables del mismo tipo (homogéneas), que tienen un nombre común, y ocupan posiciones contiguas de memoria.
· En memoria, los elementos de un arreglo están uno al lado del otro.
· Ejemplo: arreglo de enteros, de nombre mi_arreglo, que contiene 7 elementos.
mi_arreglo [ 0 ]
mi_arreglo [ 1 ]
mi_arreglo [ 2 ]
mi_arreglo [ 3 ]
mi_arreglo [ 4 ]
mi_arreglo [ 5 ]
mi_arreglo [ 6 ]
memoria
Número de posición del elemento
en el arreglo mi_arreglo (subíndice)
· Declaración de arreglos:
Tipo Nombre_arreglo [Tamaño];
Tipo: de qué tipo son los elementos del arreglo
Nombre_arreglo: cualquier identificador que sea válido.
Tamaño: número de elementos que componen el arreglo.
· Ejemplo
int mi_arreglo [7];
· declara un arreglo de enteros de 7 elementos
· desde mi_arreglo[0] hasta mi_arreglo[6]
· Los arreglos se deben declarar de manera explícita, para que el compilador asigne los espacios de memoria.
· El número de bytes de memoria que requiere un arreglo se calcula:
total bytes = sizeof (tipo base) * número de elementos
Ej: cout << sizeof (int) * 4;
· El número de posición de un elemento del arreglo va encerrado entre corchetes, es el subíndice.
· El primer elemento de cualquier arreglo tiene subíndice cero.
· Si un arreglo tiene n elementos, las posiciones (subíndices) van desde 0 hasta (n - 1)
· Es importante notar la diferencia entre el "tercer elemento de un arreglo", y el "elemento tres del arreglo". Puesto que los subíndices comienzan en 0, el "tercer elemento de un arreglo" tiene un subíndice 2, mientras que el "elemento tres del arreglo" tiene un subíndice 3, y es el cuarto elemento.
· Para acceder a un elemento del arreglo:
· nombre del arreglo
· número de posición del elemento, encerrándolo entre corchetes ([ ]), es decir, el subíndice.
· Ej.: cout << mi_arreglo[4];
muestra el quinto elemento del arreglo
· Por lo tanto se debe especificar: Nombre_arreglo [nº_elemento - 1]
· Para acceder al i-ésimo elemento del arreglo, se especifica: mi_arreglo [i - 1];
·
subíndice |
1 2 3 4 5 6
Orden
del elemento Elemento o contenido |
2º 3º 4º 5º 6º 7º
· Si algún problema usa como subíndice una expresión, ésta se evalúa para determinar el subíndice.
Ejemplo:
Si a = 3 y b = 2:
mi_arreglo [a + b] = mi_arreglo [a + b] + 3
suma 3 al elemento mi_arreglo [5]
EJERCICIOS: Arreglos lineales en C
1. Inicializar o "cargar" con ceros los elementos de un arreglo
#include <iostream.h>
#include <conio.h>
int main()
2. Inicializar los elementos de un arreglo, con números de 0 a 6
// Primero se carga el arreglo, y luego se muestran sus elementos
#include <iostream.h>
#include <conio.h>
int main()
3. Ídem al ejercicio 2, pero optimizando código
// Los elementos se muestran a medida que van siendo cargados.
#include <iostream.h>
#include <conio.h>
int main()
return 0;
4. Variación usando un manipulador de flujos de datos
// Uso de setw(): manipulador de flujos
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
int main()
// Setw() es un manipulador de flujos (sirve para "direccionar").
5. Inicializar un arreglo mediante una declaración: usar listas de inicialización
// int arreglo[6] = es igual a int arreglo[ ] =
#include <iostream.h>
#include <conio.h>
int main()
clrscr();
int arreglo[6] = ; // Lista de inicialización
int i;
for (i = 0; i < 6; i++)
cout << arreglo[i] << " ";
return 0;
6. Definir el tamaño del arreglo mediante el uso de variables constantes:
Obsérvese el uso de las llamadas variables constantes (¿?), variables de sólo lectura, o constantes nombradas.
# include <iostream.h>
int main()
// (1), (2), (3) cambian automáticamente al cambiar fila.
// Si no se usa la variable constante fila, se deberían hacer 3 cambios en distintos lugares del programa.
// Facilidad para mantener el código
7. Inicializar un arreglo con los pares del 2 al 20
Obsérvese el uso de las llamadas variables constantes (¿?), variables de sólo lectura, o constantes nombradas.
# include <iostream.h>
int main ()
8. Cargar un arreglo de tamaño 10, con números aleatorios entre 1 y 50
// Cargar un arreglo con números aleatorios entre 1 - 50
#include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
9. Calcular el promedio de los elementos de un arreglo de tamaño 10. Llenar el arreglo desde teclado.
# include <iostream.h>
# include <conio.h>
int main()
promedio = suma / fila;
cout << "\nPromedio: " << promedio;
return 0;
10. Dado un arreglo cualquiera, mostrar un elemento según subíndice elegido. Validar Subíndices
# include <iostream.h>
# include <conio.h>
int main()
cout << "\nMostrar elemento de subíndice ";
cin >> subind;
if (subind > fila)
cout << "arreglo[" << subind << "]: " << arreglo[subind];
return 0;
11. Encontrar los elementos mayor y menor de un arreglo, mostrarlos junto con sus subíndices respectivos.
Arreglo de tamaño 15, llenado con números aleatorios entre 1 y 100
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
if (arreglo[i] < menor)
cout << "\nElemento mayor: " << mayor
<< " ==> arreglo[" << subindmax << "]";
cout << "\nElemento menor: " << menor
<< " ==> arreglo[" << subindmin << "]";
return 0;
12. Llenar un arreglo de tamaño 10 con números aleatorios. Buscar un elemento del arreglo, indicar si está o no. En caso de estar, mostrar el elemento y su subíndice.
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
cout << "NO ESTÁ";
return 0;
13. Leer los elementos de un arreglo, y mostrar la información en forma de gráfico de barras o Histograma. Cada número se imprime seguido de una barra que consiste en la misma cantidad de asteriscos.
// Histograma
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
return 0;
14. Entregar el bit de paridad de un arreglo de tamaño 8 (8 bits), que contiene sólo 1 y 0. El bit de paridad es 1 si la cantidad de unos (1) en el arreglo es par, y es 0 en caso contrario.
A)
# include <iostream.h>
# include <conio.h>
int main()
if (suma % 2 = = 0 && suma != 0)
cout << "PARIDAD PAR, bit de paridad 1";
else
cout << "PARIDAD IMPAR, bit de paridad 0";
return 0;
B)
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
if (cont % 2 == 0 && cont !=
cout << "\nPARIDAD PAR (1)";
else
cout << "\nPARIDAD IMPAR (0)";
return 0;
15. Se desea manipular dos arreglos de 20 enteros cada uno. Escribir un programa que permita realizar las siguientes operaciones
a) Llenar los dos arreglos, arreglo_1 y arreglo_2, con números aleatorios entre 1 y 50
b) Mostrar por pantalla todos los elementos del arreglo_1, que son mayores que el máximo valor del arreglo_2.
c) Mostrar por pantalla todos los elementos del arreglo_1, que son menores que el promedio de los valores del arreglo_2.
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
cout << "a)\n";
for (i = 0; i < fila; i++) // Mostrar arreglo_1
cout << arreglo1[i] << " ";
cout << endl;
for (i = 0; i < fila; i++) // Mostrar arreglo_2
cout << arreglo2[i] << " ";
max2 = arreglo2[0]; // Mayor elemento de arreglo_2
for (i = 1; i < fila; i++)
if (max2 < arreglo2[i])
max2 = arreglo2[i];
cout << "\n\nb) Mayor elemento arreglo_2: "
<< max2 << "\n";
cout << "Elementos de arreglo_1 mayores que " << max2 << ":\n";
for (i = 0; i < fila; i++)
if(arreglo1[i] > max2)
cout << arreglo1[i] << " ";
promedio2 = suma2 / fila;
cout << "\n\nc) Promedio de elementos de arreglo_2: " << promedio2;
cout << "Elementos de arreglo_1 menores que " << promedio2 << ":\n";
for (i = 0; i < fila; i++)
if (arreglo1[i] < promedio2)
cout << arreglo1[i] << " ";
return 0;
16. Dado un arreglo de N números enteros, calcular (y mostrar):
· la suma de los subíndices de aquellos elementos pares.
· promedio de los elementos impares.
Por ejemplo, considere el siguiente arreglo:
Debería mostrar lo siguiente:
·
·
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
for (i = 0; i < fila; i++)
cout << arreglo[i] << " ";
promedio = suma_elem / fila;
cout << "\nSuma ¡ndices de elementos pares: " << suma_ind;
cout << "\nPromedio elementos impares: " << promedio;
return 0;
17. Llenar un arreglo de enteros de tamaño 10 (desde teclado, o con números generados aleatoriamente), y mostrar sus elementos ordenados de menor a mayor.
Algoritmo de Ordenamiento (Bubble Sort)
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
cout << "\nOrden de SALIDA : ";
for (i = 0; i < fila; i++)
cout << arreglo[i] << " ";
return 0;
18. Programa que trabaja con arreglos unidimensionales.
# include <iostream.h>
int main()
while ((a[i] < 1) || (a[i]>100));
// Números bajo el promedio
int cont=0, prom, sum=0;
for (i = 0; i < 5; i++)
sum = sum + a[i];
prom = sum / 5;
cout << "Promedio= " << prom << endl;
for (i = 0; i < 5; i++)
if (a[i] < prom)
cont++;
cout << "cantidad numeros bajo el promedio: ";
cout << cont << endl;
// Posición del elemento mayor
int pos=0, mayor=a[0];
for (i = 0; i < 5; i++)
cout << "Posición: " << pos;
// Mostrar el arreglo en forma inversa
cout << "Arreglo en forma inversa: ";
for (i = 4; i >= 0; i- -)
cout << a[i];
cout << endl;
// Mostrar elementos posiciones pares y cuyo valor es impar
cout << "posiciones pares, valor impar: ";
for (i = 0; i < 5; i++)
// Generar arreglo b con los elementos que sean mayores que 10.
pos=0;
for (i = 0; i < 5; i++)
return 0;
19. Programa en C que permita realizar lo que indica el dibujo:
Arreglo1 Arreglo2
Arreglo3
Desde arreglo_3[5] hasta arreglo3_[9], se llena con la suma de arreglo_1[i] + arreglo_2[i]
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>
int main()
for (i = 0; i < fila; i++)
cout << arreglo_1[i] << " ";
cout << endl;
for (i = 0; i < fila; i++)
cout << arreglo_2[i] << " ";
cout << endl;
for (i = 0; i < fila * 3; i++)
cout << arreglo_3[i] << " ";
return 0;
20. Se almacenan las edades de un grupo de personas en un arreglo de largo 35: (Ud.debe llenar el arreglo)
a) Mostrar la edad de una persona determinada (la persona con subíndice 0 tiene su edad en la casilla 0, etc)
b) Mostrar el subíndice de la persona de menor edad
c) Mostrar la mayor edad, y su posición (subíndice)
d) Determinar cuántas personas son mayores a 19 años
# include <iostream.h>
# include <conio.h>
int main()
cout << "Mostrar edad de persona [?]: "; // a)
cin >> i;
cout << mi_arr[i];
mayor = menor = mi_arr[0]; //b) y c)
for (i = 0; i < fila; i++)
if (mayor < mi_arr[i])
cout << "\nSubíndice de persona menor edad: " << subind_edad_menor;
cout << "\nMayor edad: " << mayor;
cout << "\nSubíndice de mayor edad: " << subind_edad_mayor;
for (i = 0; i < fila; i++) // d)
if (mi_arr[i] > 19)
cont_19 = cont_19 + 1;
cout << "\nMayores a 19 años: " << cont_19;
// e) se hace un CAST
calculo = float((mayor + subind_edad_menor)) / (menor + subind_edad_mayor);
cout << "\nC lculo: " << calculo;
for (i = 0; i < fila; i++) // f)
if (mi_arr[i] % 2 == 0)
suma_par = suma_par + mi_arr[i];
cout << "\nSuma de edades pares: " << suma_par;
return 0;
Ejercicios propuestos
1. Invertir los elementos de un arreglo.
2. Determinar la suma de los elementos positivos de un arreglo.
3. Encontrar la posición de un elemento e en un arreglo V.
4. Contar en un arreglo los números iguales a x.
5. Determinar la cantidad de valores mayores que X, en un arreglo A, de N elementos decimales.
6. Llenar 2 arreglos de largo 10 cada uno con números enteros y a partir de estos datos generar:
a) Un arreglo de largo 20 con todos los elementos del primer arreglo y luego los del segundo.
b) Un arreglo de largo 20 llamado D con los elementos de A y B pero intercalados.
c) Un arreglo llamado E de largo 10 con la suma de los elementos de A y B (E[i]=A[i]+B[i])
d) Un arreglo F con los números que se encuentren dentro de cierto rango ingresado por el usuario, en el arreglo A.
e) Un arreglo G con el factorial de cada elemento almacenado en A (G[i]=A[i]!).
f) Un arreglo H con la multiplicación del elemento por su índice del arreglo B (H[i]=B[i]*i)
g) Un arreglo I con los elementos de A en orden inverso (I[i]=A[n-i]).
7. Dado un arreglo A de largo 20 de números enteros:
a) Llenar el arreglo con valores que estén dentro del rango de 1 a 1000.
b) Mostrar en pantalla los elementos ingresados en forma inversa.
c) Calcular el porcentaje de elementos que son mayores que 50.
d) Mostrar en pantalla todos elementos que se encuentran en las posiciones pares y luego aquellos que estén en las posiciones impares.
e) Aumentar al doble todos los elementos menores que 15.
f) Intercalar los elementos de manera de que los que estaban en una posición par se almacenen ahora en una posición impar (aux=A[i]; A[i]=A[i+1]; A[i+1]=aux).
8. Dado un arreglo M de 8 elementos enteros. Cree un arreglo A que contenga los elementos de M y agregue antes y después de cada numero '10' una casilla con un numero 1 y otra con un numero 0. El programa debe mostrar finalmente en pantalla ambos arreglos creados y la cantidad de elementos almacenados en el arreglo M.
Ejemplo:
M= 4 6 10 3 10 5 7 12
A= 4 6 1 10 0 3 1 10 0 5 7 12
Total de elementos de A: 12
9. Diseñe un programa que permita almacenar los diez primeros números primos en un arreglo.
10. Para un arreglo de largo 50, de números enteros:
a) Llenar el arreglo sólo con números entre -100 y 100
b) Contar los números mayores que 50 existentes en el arreglo
c) Determinar el porcentaje de números ceros con respecto al total de números ingresados
d) Multiplicar cada elemento positivo del arreglo por 2
e) Intercambiar el primer elemento con el segundo, el tercero con el cuarto, y así sucesivamente.
11. Para un arreglo de tamaño 30, de números enteros, mostrar el promedio de los elementos almacenados en el arreglo. Generar además, otro arreglo pero sólo con los elementos que se encuentran bajo el promedio calculado.
12. Se tiene un arreglo A, de largo 200, lleno con números enteros.
a) Generar el arreglo B que sea una copia exacta de A
b) Generar el arreglo C que sea una copia invertida de A
c) Generar el arreglo D que contenga sólo a aquellos elementos mayores que 50
d) Generar el arreglo E que contenga el factorial de cada uno de los elementos almacenados en A
13. Diseñar un programa que traspase desde un arreglo A de largo 30, lleno con números enteros, a un arreglo B, de largo 10, sólo los 10 primeros valores pares que encuentre en el primer arreglo.
14. Hacer un programa que copie desde un arreglo de largo 30, lleno con enteros, a un arreglo B, los factoriales de los valores almacenados originalmente en A.
15. Las notas de un curso de 40 alumnos están almacenadas en un arreglo de largo 40.
a) Mostrar la nota individual para un alumno determinado (el alumno con código 0 tendrá su nota en el casillero 0, y así sucesivamente).
b) Determinar cuál es la mejor nota
c) Determinar el código del alumno con la peor nota
d) Indicar cuántos alumnos tuvieron nota inferior a 4.0
16. Suponga que un supermercado almacena los precios de sus productos en un arreglo de largo 50, en donde los productos perecibles están almacenados en las localizaciones pares, y los no perecibles en las impares. Hacer un programa que:
a) Llene el arreglo.
b) Calcule la suma de los precios de los alimentos no perecibles.
c) Aumente en un 10% el precio de todos los productos que valen menos de $1.000 y que son perecibles.
d) Muestre por pantalla todos los códigos de los productos cuyo precio es mayor que el precio promedio de todos los productos del supermercado.
17. Un club deportivo - social cuenta con 80 socios, casualmente 40 de ellos practican taca-taca, y los otros 40 yo-yo. Los pesos de estos 80 "deportistas" se almacenan en un arreglo, donde los del taca-taca ocupan las posiciones pares, y los del yo-yo las posiciones impares.
Cree un programa en C que:
a) Llene el arreglo
b) Encuentre el mayor peso y muestre a qué tipo de deportista corresponde (yoyocero o tacataquero)
c) Determine el promedio del peso de los tacataqueros
d) Muestre cuántos practicantes de yo-yo están bajo el promedio de peso de los practicantes de taca-taca.
18. Se tiene el arreglo A, de tamaño 100, lleno con números enteros. Calcular y mostrar lo siguiente:
e) (elemento mayor + subíndice elemento menor) / (elemento menor + subíndice del elemento mayor).
f) Factorial de los elementos de subíndice impar
g) Suma de los elementos pares
h) Producto de los elementos de subíndice impar.
19. Se tienen 3 arreglos:
· Arreglo1, de enteros, de largo 20,
· Arreglo2, de enteros, de largo 10,
· Arreglo3, de enteros, de largo 10
Se pide llenar el Arreglo1. Una vez lleno se debe hacer lo siguiente:
a) Llenar el Arreglo2 con los elementos 11 - 20 (últimos 10 elementos) ordenados, del Arreglo1.
b) Llenar el Arreglo3 con los elementos 1 - 10 (primeros 10 elementos) del Arreglo1, pero en orden inverso.
20. Una sala de juegos del casino de Tilcoco, tiene un total de 60 mazos de naipes; cada uno de ellos se identifica con un número positivo (número de inventario). Los mazos que se emplean en una sesión de juego son aquellos cuyo número de inventario es divisible por un entero K (K > 1), que debe ser ingresado y validado. Desarrollar un programa que:
a) Llene el arreglo "mazos" con el número correspondiente del inventario de los mazos.
b) Verifique la divisibilidad de cada número de inventario, asignando un 0 (cero) si la condición se cumple, o un 1 (uno) en caso contrario, guardando esta información en el arreglo "divisible".
c) Imprimir el número de mazos a usar en una sesión para un K dado.
Además el programa debe imprimir el número de veces que se repite la secuencia 1 0 1 en el arreglo "divisible" (la secuencia 1 0 1 0 1 son dos secuencias 1 0 1)
BIBLIOGRAFÍA
· Schildt, H., Turbo C/C++: Manual de Referencia, McGRAW-HILL, 1992.
· Schildt, H., Borland C++: Manual de Referencia, McGRAW-HILL, 1997
· Joyanes A., L., Borland C++ 4/4.5 Iniciación y Referencia, McGRAW-HILL,1996.
· Davis, S.R., C++ for Dummies, IDG Books, 1994.
· Deitel, H.M., Deitel, P.J., C++ Cómo Programar, PRENTICE HALL, 1998. Segunda edición.
· Sedgewick, Robert, Algoritmos en C++, ADDISON - WESLEY / DÍAZ DE SANTOS, 1995
· Manuales de C/C++ de diversas direcciones electrónicas:
· www.elrincondelc.com
· www.programación.com
· www.manualesgratis.com
· www.programmersheaven.com
· https://c.conclase.net/curso/indice.html
|