Conceptos Básicos de Algoritmia 1.1 Algoritmo Un algoritmo es un conjunto ordenado y finit o de instrucciones que conducen a la solución de un problema. En la vida cotidiana ejecutamos constant emente algoritmos. Por ejemplo, al instalar un equipo de sonido ejecutamos las instrucciones contenidas en el manual del equipo, este conjunto de instrucciones constituyen un algoritmo. Otro caso de algoritmo es el algoritmo matemático de Euclides para la obtención del máximo común divisor de dos números. Si un algoritmo puede ser ejec utado por un computador, se dice que es un algoritmo computacional; en caso contrario, se dice que es un algoritmo no computacional. Según esto, el algoritmo de Euclides es un algoritmo computacional; pero el algoritmo para instalar el e quipo de sonido es un algoritmo no computacional. Para que un algoritmo pueda ser ejecutado por un computador se necesita expresar el algoritmo en instrucciones comprensibles por el computador, para esto se requiere de un det erminado lenguaje de programación. Al algoritmo expresado en un determinado lenguaje de programación, se denomina programa. Puesto de otra manera, podemos decir que, un programa es la implementación o expresión de un algoritmo en un determinado lenguaje de programación siguiendo las reglas establecidas por el lenguaje elegido. En la Figura 2.1 que sigue se muestra la relación entre problema, algoritmo y programa. Figura 1.1 Problema, algoritmo y programa Todo algoritmo debe tener las siguientes características: Debe ser preciso, es decir, cada instrucción debe indic ar de forma inequívoc a que se tiene que hacer. Debe ser finito, es decir, debe tener un número limitado de pasos. Debe ser definido, es decir, debe producir los mismos resultados para las mismas condiciones de entrada. Todo algoritmo puede ser descompuesto en tres partes: Entrada de datos. Proceso. Salida de resultados. Ejemplo 1.1:- Algoritmo para preparar ceviche de bonito para 6 personas. Entradas : - 1 kilo de bonito - 3 camotes sancochados - 3 cebollas cortadas a lo largo - 1 rocoto en rodajas - 3 ramas de apio picado - 2 ramitas de culantro picado - 4 vasos de jugo de limón - 4 cucharadas de ajo molido - 2 cucharadas de ají amarillo molido - sal y pimienta Proceso : - Cortar la carne de pescado en pequeños trozos. - Mezclar la carne con el jugo de limón, el ajo, la pimienta, el culantro, el ají amarillo y el apio. - Dejar reposar 30 minutos. - Agregar sal al gusto y echar las cebollas cortadas. - Servir acompañando rocoto en rodajas el cebiche con el camote sancochado y Salida El ceviche el : E videntemente este es un algoritmo no computacional, no podrá ser ejecut ado por un c omputador, pero sí por una persona. Por si acaso el ceviche es peruano. Ejemplo 1.2:- Algoritmo para expresar en centímetros y pulgadas una cantidad dada en metros. Entrada: La cantidad M de metros Proceso: Cálculo de centímetros Cálculo de pulgadas : C = M*100 : P = C/2.54 Salida : La cantidad C de centímetros y la cantidad P de pulgadas Este es un algoritmo comput acional escrito en lenguaje natural, puede s er c onvertido en un programa de comput adora, pero también puede ser ejecutado manualment e por una persona. 1.2 El Pseudocódigo El pseudoc ódigo es un lenguaje de pseudoprogramación utilizado para escribir algoritmos computacionales. Como lenguaje de pseudoprogramación, el pseudocódigo es una imitación de uno o más lenguajes de programación. De esta manera podemos encontrar pseudocódigos orientados a lenguajes de programación como Pascal, Java, C, C++, etc . El objetivo del pseudocódigo es permitir que el programador se cent re en los aspectos l ógicos de la solución, evitando las reglas de sintáxis de los lenguajes de programación. No siendo el pseudocódigo un lenguaje formal, los pseudocódigos varían de un programador a otro, es decir, no hay un pseudocódigo estándar. 1.3 Variables Una variable es una localización o casillero en la memoria principal que almacena un valor que puede cambiar en el transcurso de la ejecución del programa. Cuando un programa necesita almacenar un dato, necesita una variable. Toda variable tiene un nombre, un tipo de dato y un valor. Antes de poder utilizar una variable es necesario declararla especificando su nombre y su tipo de dato. Para declarar declarar variables usaremos los siguientes formatos: Declaración de una variable: tipo nombre Declaración de varias variables con el mismo tipo de dato: tipo nombre1, nombre2, nombre3, ..., nombren Donde: tipo nombre1, nombren Es el tipo de dato de la variable que puede ser: E NTERO (si la variable almacenará un número entero) , REAL (si la variable almacenará un número decimal) , CARA CTE R (si la variable almacenará un carácter), CADE NA (si la variable almacenará un conjunto de carácteres) o LOGICO (si la variable almacenará el valor verdadero o el valor falso). nombre2, ..., Nombres de las variables . El nombre de una variable debe comenzar con una letra, un símbolo de subrayado o un s ímbolo de dólar. Los demás caractéres del nombre puede ser letras, símbolos de subrayado o símbolo de dólar. Debe considerarse también que una letra mayúscula se considera diferente de una letra minúscula. Ejemplo 1.3:- Declaración de variables. La siguient e instrucción declara la variable edad de tipo ENTERO y la variable descuento de tipo REAL.. ENTERO edad REAL descuento Esto crea los casilleros de memoria edad y descuento. Luego de la creación, las variables están indefinidas ( ? ). edad ? descuento ? La siguiente instrucción declara las variables nota1, nota2 y nota3, todas de tipo ENTERO. ENTERO nota1, nota2, nota3 Esto crea los casilleros de memoria nota1, nota2 y nota3. Luego de la creación, las variables están indefinidas ( ? ). nota1 ? nota2 ? nota3 ? 1.4 Literales Se denominan literales a todos aquellos valores que figuran en el pseudocódigo y pueden ser: Literales enteros 12, 20300, 15, etc. Literales reales 3.1416, 2345.456, etc. Literales de carácter 'a', 'B', ';', '<', '+', etc. Lieterales de cadena "Hola", "Algoritmos Computacionales", etc. Literales lógicos verdadero, falso 1.5 Instrucciones Algorítmicas Básicas Existen tres instrucciones algorítmicas básicas que son las siguientes 1.5.1 Entrada Consiste en obtener un dat o de un dispositivo de entrada, como el teclado, y almacenarlo en una variable. En general, la acción de ingresar un dato a una variable se expresa en el pseudocódigo mediante la palabra LEER, de la siguiente forma: LEER variable Por ejemplo, la instrucción: LEER estatura Solicita el ingreso de un valor, desde algún dispositivo de entrada (como el teclado), para la variable estatura. 1.5.2 Salida Consiste en mostrar el valor de una variable en u n dispositivo de s alida, como la pantalla. E n general, la acción de mostrar el valor de una variable se expresa en el pseudocódigo mediante la palabra IMPRIMIR de la siguiente forma: IMPRIMIR variable Por ejemplo, la instrucción: IMPRIMIR importeCompra Muestra, en algún dispositivo de salida (como la pantalla), el valor de la variable importeCompra. 1.5.3 Asignación Consiste en asignar a una variable el valor de una expresión. La expresión puede ser una simple variable, un simple literal o una c ombinación de variables, literales y operadores. La asignación se expresa en el pseudocódigo de la siguient e forma: variable = expresión Donde variable y el valor de expresión deben tener el mismo tipo de dato. Cuando se asigna un valor ENTERO a una variable REAL, entonces el valor ENTERO se convertirá en REAL ant es de almacenarse. Así, al asignar el valor E NTERO 25 a una variable REAL, se almacenará 25.0. Ejemplo 1.4:- Algoritmo para expresar en centímetros y pulgadas una cantidad dada en metros. Esta es una solución en pseudoc ódigo del ejemplo 1.2 utilizando conceptos computacionales de variable, entrada de datos y salida de res ultados. La solución c onsidera que 1 met ro = 100 centímet ros y que 1 pulgada = 2.54 centímetros. INICIO // Declara las variables M, C y P REAL M, C, P // Solicita el ingreso de la cantidad en metros LEER M // Calcula la cantidad en centímetros y lo asigna a la variable C C = M*100 // Calcula la cantidad en pulgadas y lo asigna a la variable P P = C/2.54 // Muestra los valores de las variables C y P IMPRIMIR C, P FIN 1.6 Expresiones Aritméticas Una expresión aritmética es una combinación de variables, literales y operadores aritméticos. 1.6.1 Operadores Aritméticos En la tabla que sigue se muestran los operadores aritméticos que vamos a utilizar. Tabla 1.1 Operadores aritméticos Operador + * Significado Suma Resta Multiplicación Ejemplo a+b a-b a*b / % División Residuo a/b a%b Los operadores aritméticos pueden utilizarse con tipos enteros y reales. Si en una operación con dos operandos, ambos operandos son enteros, el resultado es un entero; si alguno de ellos es real, el resultado es real. Así, 15/4 es 3 y no 3.75; en cambio, 15. 0/4 es 3.75. 1.6.2 Reglas de jerarquía de los operadores aritméticos Cuando una expresión aritmética tiene más de un operador aritmético, el orden de aplicación de los operadores sigue un orden preciso determinado por las reglas de jerarquía de los operadore s aritméticos, que se muestran en la siguiente tabla: Tabla 1.2 Reglas de jerarquía de los operadores aritméticos Operador () *, /, % +, - Orden de evaluación Se evalúan en primer lugar Se evalúan en segundo lugar Se evalúan en tercer lugar Si existen paréntesis anidados, se evalúa primero la expr esión en el par más int erno. Si varios operadores o parént esis tienen la misma jerarquía, la evaluación será de izquierda a derecha. Ejemplo 1.4:- ¿Cuál es el equivalente en pseudocódigo de la siguiente expresión algebraica? Solución e = a/b/c Como todos los operadores tienen la misma jerarquía, la evaluación será de izquierda a derecha: Primero, se dividirá a entre b. Segundo, el resultado ya obtenido de a/b se dividirá entre c. Note que el orden de ejecución esta de acuerdo con la expresión algebraic a, por lo que no se requiere ninguna pareja de paréntesis. Ejemplo 1.5:- ¿Cuál es el equivalente en pseudocódigo de la siguiente expresión algebraica? Solución e = a*b*c/d/e Como todos los operadores tienen la misma jerarquía, la evaluación será de izqui erda a derecha: Primero, se multiplicará a por b . Segundo, el resultado ya obtenido de a*b se multiplicará por c. Tercero, el result ado ya obtenido de a*b*c se dividirá ent re d. Cuarto, el result ado ya obtenido de a*b*c/d se divivirá entre e. Note que el orden de ejecución esta de acuerdo con la expresión algebraica, por lo que no se requiere ninguna pareja de paréntesis. Ejercicio 1.6:- ¿Cuál es el equivalente en pseudocódigo de la siguiente expresión algebraica? Solución e = 4/((a+b)/(c/d)) + v/w/p + 5*m*n*q Aplicando las reglas de jerarquía de los operadores aritméticos: Primero, se sumará a más b. Segundo, se dividirá c entre d. Tercero, el result ado ya obtenido de a+b se dividirá entre el res ultado ya obtenido de c/d. Cuarto, se dividirá 4 entre el result ado ya obtenido de ((a+b)/(c/d)) Quinto, se dividirá v entre w. Sexto, se dividirá el resultado ya obtenido de v/w entre p. Séptimo, se multiplicará 5 por m. Octavo, se multiplicará el resultado ya obtenido de 5*m por n. Noveno, se multiplicará el resultado ya obtenido de 5*m*n por q. Décimo, se sumará el resultado ya obtenido de 4/ ((a+ b)/(c/d)) más el res ultado y a obt enido de v/ w/p. Undécimo, se sumará el resultado ya obtenido de 4/((a+ b)/(c/d)) + v/w/p más el resultado ya obtenido de 5*m*n*q. Se ha utilizado la mínima cantidad posible de paréntesis. Pueden usarse paréntesis adicionales, lo que no es un error. Por ejemplo, otra solución posible que arroja el mismo resultado final es: e = (4/((a+b)/(c/d))) + ((v/w)/p) + (5*m*n*q) Note que usando correctament e las reglas de jerarquía, es posible usar menos parejas de paréntesis. 1.7 Expresiones Lógicas Una ex presión lógica combina variables, literales, operadores aritméticos, operadores relacionales y operadores lógicos. Los operadores relacionales y los operadores lógicos se muestran en las tablas 3.1 y 3.2. Tabla 1.3 Operadores relacionales Operador > Significado mayor que >= < <= == != mayor o igual que menor que menor o igual que igual a diferente de Ejemplo a > b a a a a a >= < <= == != b b b b b Tabla 1.4 Operadores lógicos Operador ! && || Significado no y ó Ejemplo !a a && b a || b 2. Estructuras básicas de programacion 2.1 Estructuras secuenciales. Conceptos Una estructura secuencial es aquella en la que las instrucciones estan una a continuación de la otra siguiendo una secuencia únic a, sin cambios de ruta. La estructura secuencial tiene una entrada y una salida. En la Figura 4.1 se muestra el diagrama de flujo y el pseudocódigo de una estructura secuencial. Diagrama de Flujo Pseudocódigo Inicio . . acción acción acción 1 2 3 . . Fin Figura 2.1 Estructura Secuencial: Diagrama de Flujo y Pseudocódigo 2.2 Ejercicios Ejercicio 1:- Diseñe un pseudocódigo que halle el área y el perímetro de un rectángulo. Considere que: area = base x altura y perimetro = 2 x (base+ altura). Algoritmo INICIO // Declaración de variables REAL base, altura, area, perimetro // Entrada de datos LEER base, altura // Proceso de cálculo area = base*altura perimetro = 2*(base+altura) // Salida de resultados IMPRIMIR area, perimetro FIN Ejemplo 2:- Diseñe un pseudocódigo para convertir una longitud dada en met ros a sus equivalentes en centímetros, pies, pulgadas y yardas. Considere que: 1 metro = 100 cent ímet ros, 1 pulgada = 2.54 centimetros, 1 pie = 12 pulgadas, 1 yarda = 3 pies. Algoritmo INICIO // Declaración de variables REAL cmetr,ccent, cpies, cpulg, cyard // Entrada de datos LEER cmetr // Proceso de cálculo ccent = cmetr*100 cpulg = ccent/2.54 cpies = cpulg/12 cyard = cpies/3 // Salida de resultados IMPRIMIR cpulg, cpies, cyard FIN Ejercicio 3:- Una institución benéfica europea ha recibido t res donaciones en soles, dolares y marcos. La donación será repartida en tres rubros: 60% para la implementación de un centro de salud, 40% para un comedor de niños y el resto para gastos administrativos. Diseñe un algori tmo que determine el mont o en euros que le corresponde a cada rubro. Considere que: 1 dólar = 3.52 soles, 1 dólar = 2.08 marcos, 1 dólar = 1.07 euros. Algoritmo INICIO // Declaración de variables REAL c soles, cdolares, c marcos, ceuros, rubro1, rubro2, rubro3 // Entrada de datos LEER csoles, cdolares, cmarcos // Proceso de cálculo ceuros = (csoles/3.52 + cdolares + cmarcos/2.08)*1.07 rubro1 = ceuros*0.60 rubro2 = ceuros*0.40 rubro3 = ceuros*0.20 // Salida de resultados IMPRIMIR rubro1, rubro2, rubro3 FIN Ejercicio 4:- En una competencia atlética de velocidad el tiempo se mide en minutos, segundos y centésimas de segundo y, el espacio rec orrido se mide en metros. Diseñe un algoritmo para determinar la velocidad promedio de un atleta en km/hr. Considere que: 1 hora = 60 minutos, 1 minuto = 60 segundos, 1 segundo = 100 centésimas de segundo, 1 kilómetro = 1000 metros. Algoritmo INICIO // Declaración de variables ENTERO tmin, tseg, tcen REAL thor, velkmhr, espmt, espkm // Entrada de datos LEER tmin, tseg, tcen, espmt // Cálculo del tiempo total empleado en horas thor = tmin/60 + tseg/3600 + tcen/360000 // Cálculo del espacio recorrido en kilómetros espkm = espmt/1000 // Cálculo de la velocidad en km/hr velkmhr = espkm/thor // Salida de resultados IMPRIMIR velkmhr FIN Ejercicio 5:- Diseñe un algoritmo que det ermine la cifra de las unidades de un número natural. Solución 1 Análisi s Puede comprobarse que la cifra de las unidades de un número es igual al resto de la división del número entre 10. Observe para ello las siguientes divisiones: 3245 5 10 324 768 8 10 76 9 9 10 0 Podemos concluir entonces que: unidades = numero % 10 Siendo % el operador residuo. Este operador permite obtener el residuo de una división, as í como / permite obtener el cociente. Algoritmo INICIO // Declaración de variables ENTERO numero, unidades // Entrada de datos LEER numero // Proceso de cálculo unidades = numero % 10 // Salida de resultados IMPRIMIR unidades FIN Solución 2 Análisi s El residuo de una división entera puede obtenerse t ambién sin recurrir al operador %, de la siguiente forma: unidades = numero - (numero / 10) * 10 observe para esto que en la división (numero/10) los operandos son enteros por lo que el cocient e será un entero. Así por ejemplo, si numero es igual a 3245, la división (numero/10) produce 324, aunque matemáticamente sea 324. 5; es decir, se descarta la parte decimal. Algoritmo INICIO // Declaración de variables ENTERO numero, unidades // Entrada de datos LEER numero // Proceso de cálculo unidades = numero - (numero/10)*10 // Salida de resultados IMPRIMIR unidades FIN Ejercicio 6:- Diseñe un algoritmo que determine la suma de las cifras de un número entero positivo de 4 cifras. Solución 1 Análisi s Las cifras pueden ser obtenidas mediante divisiones sucesivas entre 10. Para el efecto, considere el caso de un número N igual a 3245: 3245 5 10 324 unidades = N%10 cociente = N/10 324 4 10 32 decenas = cociente%10 cociente = cociente/10 32 2 10 3 centenas = cociente%10 millares = cociente/10 Algoritmo INICIO // Declaración de variables ENTERO N, suma, millares, centenas, decenas, unidades, resto // Entrada de datos LEER N // Proceso de cálculo unidades = N%10 cociente = N/10 decenas = cociente%10 cociente = cociente/10 centenas = cociente%10 millares = cociente/10 suma = unidades + decenas + centenas + millares // Salida de resultados IMPRIMIR suma FIN Solución 2 Análisi s 2 Considerando que el número tiene 4 cifras, las cifras también pueden ser obtenidas mediant e divisiones sucesivas entre 1000, 100 y 10. Para el efecto, considere el caso de un número N igual a 3245: 3245 245 1000 3 millares = N/1000 resto 245 45 = N%1000 100 2 centenas = resto/100 resto 45 3 = resto%100 10 4 decenas = resto/10 unidades = resto%10 Algoritmo INICIO // Declaración de variables ENTERO N, suma, millares, centenas, decenas, unidades, resto // Entrada de datos LEER N // Proceso de cálculo millares resto = N/1000 = N%1000 centenas = resto/100 resto decenas unidades suma = resto%100 = resto/10 = resto%10 = unidades + decenas + centenas + millares // Salida de resultados IMPRIMIR suma FIN Ejercicio 7:- Diseñe un algoritmo que lea la hora actual del día HH:MM:SS y determine cuantas horas, minutos y segundos restan para culminar el día. Algoritmo INICIO // Declaración de variables ENTERO hor1, min1, seg1, hor2, min2, seg2, segres, resto // Entrada de datos LEER hor1, min1, seg1 // Cálculo de la cantidad de segundos que restan para culminar el día segres = 86400 - (hor1*3600 + min1*60 + seg1) // Descomposición de segres en horas, minutos y segundos hor2 = segres/3600 resto = segres%3600 min2 = resto/60 seg2 = resto%60 // Salida de resultados IMPRIMIR hor2, min2, seg2 FIN Ejercicio 8:- Diseñe un algoritmo para sumar dos tiempos dados en horas, minutos y segundos. Algoritmo INICIO // Declaración de variables ENTERO hor1, min1, seg1, hor2, min2, seg2, hor3, min3, s eg3, totseg, resto // Entrada de datos LEER hor1, min1, seg1, hor2, min2, seg2 // Determina la cantidad total de segundos entre los dos tiempos totseg = (hor1+hor2)*3600 + (min1+min2)*60 + (seg1+seg2) // Descompone totseg en horas, minutos y segundos hor3 = totseg/3600 resto = totseg%3600 min3 = resto/60 seg3 = resto%60 // Salida de resultados IMPRIMIR hor3, min3, seg3 FIN Ejercicio 9:- El sueldo neto de un vendedor se calcula como la suma de un sueldo básico de S/.250 más el 12% del monto total vendido. Dis eñe un algoritmo que determine el sueldo neto de un vendedor sabiendo que hizo tres ventas en el mes. Algoritmo INICIO // Declaración de variables REAL venta1, venta2, venta3, ventatot, comision, sueldoneto // Entrada de datos LEER venta1, venta2, venta3 // Proceso de cálculo ventatot = venta1 + venta2 + venta3 comision = 0.12*ventatot sueldoneto = 250 + comision // Salida de resultados IMPRIMIR sueldoneto FIN Ejercicio 10:- Diseñe un algoritmo que determine el porcentaje de varones y de mujeres que hay en un salón de clases. Algoritmo INICIO // Declaración de variables REAL porcvar, porcmuj ENTERO varones, mujeres, total // Entrada de datos LEER varones, mujeres // Proceso de cálculo total = varones + mujeres porcvar = varones*100.0/total porcmuj = mujeres*100.0/total // Salida de resultados IMPRIMIR porcvar, porcmuj FIN Ejercicio 11:- En países de habl a inglesa es común dar la estatura de una persona como la suma de una cantidad entera de pies más una cantidad ent era de pulgadas. Así, la estatura de una persona podría ser 3' 2" ( 3 pies 2 pulgadas ). Diseñe un algoritmo que determine la estatura de una persona en metros, conociendo su estatura en el formato inglés. Considere que: 1 pie = 12 plg, 1 plg = 2.54 cm, 1 m = 100 cm. Algoritmo INICIO // Declaración de variables REAL estmt ENTERO cpies, cplgs // Entrada de datos LEER cpies, cplgs // Proceso de cálculo estmt = (cpies*12 + cplgs)*2.54/100 // Salida de resultados IMPRIMIR estmt FIN Ejercicio 12:- Diseñe un algoritmo que ex prese la capacidad de un disco duro en megabytes, kilobytes y bytes, conociendo la cap acidad del disco en gigabytes. Considere que: 1 kilobyte = 1024 bytes, 1 megabyte = 1024 kilobyte, 1 gigabyte = 1024 megabytes. Algoritmo INICIO // Declaración de variables REAL cgigabyte, cmegabyte, ckilobyte, cbyte // Entrada de datos LEER cgigabyte // Proceso de cálculo cmegabyte = cgigabyte*1024 ckilobyte = cmegabyte*1024 cbyte = ckilobyte*1024 // Salida de resultados IMPRIMIR cmegabyte, ckilobyte, cbyte FIN Ejercicio 13:- Diseñe un algoritmo que int ercambie las cifras de las unidades de dos números naturales. Algoritmo INICIO // Declaración de variables ENTERO numero1, numero2, unidades1, unidades2 // Entrada de datos LEER numero1, numero2 // Determina las cifras de las unidades unidades1 = n1%10 unidades2 = n2%10 // Intercambia las cifras de las unidades numero1 = numero1 - unidades1 + unidades2 numero2 = numero2 - unidades2 + unidades1 // Salida de resultados IMPRIMIR n1, n2 FIN