Fundamentos de Programación 4ta Edición - Joyanes - Cap 3 - PDF
Document Details
Joyanes
Tags
Summary
Este documento describe los fundamentos de la programación, incluyendo conceptos, algoritmos, instrucciones, y el proceso de solución de problemas. Explica las fases implicadas en el desarrollo de un programa, desde la definición del problema hasta el mantenimiento del mismo. Se incluyen diagramas y ejemplos que ilustran estos temas.
Full Transcript
84 Fundamentos de programación 3.1. CONCEPTO DE PROGRAMA Un programa de computadora es un conjunto de instrucciones —órdenes dadas a la máquina— que producirán la ejecución de una determinada tarea. En esencia, un programa es un medio para conseguir un fin. El fin será proba- blemente defi...
84 Fundamentos de programación 3.1. CONCEPTO DE PROGRAMA Un programa de computadora es un conjunto de instrucciones —órdenes dadas a la máquina— que producirán la ejecución de una determinada tarea. En esencia, un programa es un medio para conseguir un fin. El fin será proba- blemente definido como la información necesaria para solucionar un problema. El proceso de programación es, por consiguiente, un proceso de solución de problemas —como ya se vio en el Capítulo 2— y el desarrollo de un programa requiere las siguientes fases: 1. definición y análisis del problema; 2. diseño de algoritmos: diagrama de flujo, diagrama N-S, pseudocódigo; 3. codificación del programa; 4. depuración y verificación del programa; 5. documentación; 6. mantenimiento. Definición D M del problema O A C N U T Diseño M E del algoritmo E N N I T M Codificación A I del programa C E I N Ó T Depuración N O y verificación Figura 3.1. El proceso de la programación. Las fases 1 y 2 ya han sido analizadas en los capítulos anteriores y son el objetivo fundamental de este libro; sin embargo, dedicaremos atención, a lo largo del libro (véase Capítulo 13) y en los apéndices, a las fases 3, 4, 5 y 6, aunque éstas son propias de libros específicos sobre lenguajes de programación. 3.2. PARTES CONSTITUTIVAS DE UN PROGRAMA Tras la decisión de desarrollar un programa, el programador debe establecer el conjunto de especificaciones que debe contener el programa: entrada, salida y algoritmos de resolución, que incluirán las técnicas para obtener las salidas a partir de las entradas. Conceptualmente un programa puede ser considerado como una caja negra, como se muestra en la Figura 3.2. La caja negra o el algoritmo de resolución, en realidad, es el conjunto de códigos que transforman las entradas del pro- grama (datos) en salidas (resultados). El programador debe establecer de dónde provienen las entradas al programa. Las entradas, en cualquier caso, procederán de un dispositivo de entrada —teclado, disco...—. El proceso de introducir la información de entrada —datos— en la memoria de la computadora se denomina entrada de datos, operación de lectura o acción de leer. Las salidas de datos se deben presentar en dispositivos periféricos de salida: pantalla, impresoras, discos, etc. La operación de salida de datos se conoce también como escritura o acción de escribir. Estructura general de un programa 85 Programa Entrada (algoritmo de Salida resolución) Figura 3.2. Bloques de un programa. 3.3. INSTRUCCIONES Y TIPOS DE INSTRUCCIONES El proceso de diseño del algoritmo o posteriormente de codificación del programa consiste en definir las acciones o instrucciones que resolverán el problema. Las acciones o instrucciones se deben escribir y posteriormente almacenar en memoria en el mismo orden en que han de ejecutarse, es decir, en secuencia. Un programa puede ser lineal o no lineal. Un programa es lineal si las instrucciones se ejecutan secuencialmen- te, sin bifurcaciones, decisión ni comparaciones. instrucción 1 instrucción 2... instrucción n En el caso del algoritmo las instrucciones se suelen conocer como acciones, y se tendría: acción 1 acción 2... acción n Un programa es no lineal cuando se interrumpe la secuencia mediante instrucciones de bifurcación. acción 1 acción 2... acción x acción n. acción n + i 3.3.1. Tipos de instrucciones Las instrucciones disponibles en un lenguaje de programación dependen del tipo de lenguaje. Por ello, en este apar- tado estudiaremos las instrucciones —acciones— básicas que se pueden implementar de modo general en un algo- ritmo y que esencialmente soportan todos los lenguajes. Dicho de otro modo, las instrucciones básicas son indepen- dientes del lenguaje. La clasificación más usual, desde el punto de vista anterior, es: 86 Fundamentos de programación 1. instrucciones de inicio/fin, 2. instrucciones de asignación, 3. instrucciones de lectura, 4. instrucciones de escritura, 5. instrucciones de bifurcación. Algunas de estas instrucciones se recogen en la Tabla 3.1. Tabla 3.1. Instrucciones/acciones básicas Tipo de instrucción Pseudocódigo inglés Pseudocódigo español comienzo de proceso begin inicio fin de proceso end fin entrada (lectura) read leer salida (escritura) write escribir asignación A ← 5 B ← 7 3.3.2. Instrucciones de asignación Como ya son conocidas del lector, repasaremos su funcionamiento con ejemplos: a) A ← 80 la variable A toma el valor de 80. b) ¿Cuál será el valor que tomará la variable C tras la ejecución de las siguientes instrucciones? A ← 12 B ← A C ← B A contiene 12, B contiene 12 y C contiene 12. Nota Antes de la ejecución de las tres instrucciones, el valor de A, B y C es indeterminado. Si se desea darles un valor inicial, habrá que hacerlo explícitamente, incluso cuando este valor sea 0. Es decir, habrá que definir e inicializar las instrucciones. A ← 0 B ← 0 C ← 0 c) ¿Cuál es el valor de la variable AUX al ejecutarse la instrucción 5? 1. A ← 10 2. B ← 20 3. AUX ← A 4. A ← B 5. B ← AUX en la instrucción 1, A toma el valor 10 en la instrucción 2, B toma el valor 20 en la instrucción 3, AUX toma el valor anterior de A, o sea 10 en la instrucción 4, A toma el valor anterior de B, o sea 20 en la instrucción 5, B toma el valor anterior de AUX, o sea 10 tras la instrucción 5, AUX sigue valiendo 10. Estructura general de un programa 87 d) ¿Cuál es el significado de N ← N + 5 si N tiene el valor actual de 2? N ← N + 5 Se realiza el cálculo de la expresión N + 5 y su resultado 2 + 5 = 7 se asigna a la variable situada a la iz- quierda, es decir, N tomará un nuevo valor 7. Se debe pensar en la variable como en una posición de memoria, cuyo contenido puede variar mediante instruc- ciones de asignación (un símil suele ser un buzón de correos, donde el número de cartas depositadas en él variará según el movimiento diario del cartero de introducción de cartas o del dueño del buzón de extracción de dichas cartas). 3.3.3. Instrucciones de lectura de datos (entrada) Esta instrucción lee datos de un dispositivo de entrada. ¿Cuál será el significado de las instrucciones siguientes? a) leer (NÚMERO, HORAS, TASA) Leer del terminal los valores NÚMERO, HORAS y TASAS, archivándolos en la memoria; si los tres números se teclean en respuesta a la instrucción son 12325, 32, 1200, significaría que se han asignado a las variables esos valores y equivaldría a la ejecución de las instrucciones. NÚMERO ← 12325 HORAS ← 32 TASA ← 1200 b) leer (A, B, C) Si se leen del terminal 100, 200, 300, se asignarían a las variables los siguientes valores: A = 100 B = 200 C = 300 3.3.4. Instrucciones de escritura de resultados (salida) Estas instrucciones se escriben en un dispositivo de salida. Explicar el resultado de la ejecución de las siguientes instrucciones: A ← 100 B ← 200 C ← 300 escribir (A, B, C) Se visualizarían en la pantalla o imprimirían en la impresora los valores 100, 200 y 300 que contienen las varia- bles A, B y C. 3.3.5. Instrucciones de bifurcación El desarrollo lineal de un programa se interrumpe cuando se ejecuta una bifurcación. Las bifurcaciones pueden ser, según el punto del programa a donde se bifurca, hacia adelante o hacia atrás. 88 Fundamentos de programación Bifurcación adelante Bifurcación atrás (positivo) (negativo) instrucción 1 instrucción 1 instrucción 2 instrucción 2 instrucción 3 instrucción 3...... instrucción 8 instrucción 12.... última instrucción última instrucción Las bifurcaciones en el flujo de un programa se realizarán de modo condicional en función del resultado de la evaluación de la condición. Bifurcación incondicional: la bifurcación se realiza siempre que el flujo del programa pase por la instrucción sin necesidad del cumplimiento de ninguna condición (véase Figura 3.3). Programa Datos programa Computadora ejecutable Resultados Modificación programa Programa fuente fuente Compilador Existen sí errores en la compilación no Programa Programa Montador ejecutable Ejecución Figura 3.3. Fases de la ejecución de un programa. Estructura general de un programa 89 Bifurcación condicional: la bifurcación depende del cumplimiento de una determinada condición. Si se cumple la condición, el flujo sigue ejecutando la acción F2. Si no se cumple, se ejecuta la acción F1 (véase Figura 3.4). no sí ¿condición? acción F1 acción F2 Figura 3.4. Bifurcación condicional. 3.4. ELEMENTOS BÁSICOS DE UN PROGRAMA En programación se debe separar la diferencia entre el diseño del algoritmo y su implementación en un lenguaje específico. Por ello, se debe distinguir claramente entre los conceptos de programación y el medio en que ellos se implementan en un lenguaje específico. Sin embargo, una vez que se comprendan cómo utilizar los conceptos de programación y, la enseñanza de un nuevo lenguaje es relativamente fácil. Los lenguajes de programación —como los restantes lenguajes— tienen elementos básicos que se utilizan como bloques constructivos, así como reglas para las que esos elementos se combinan. Estas reglas se denominan sintaxis del lenguaje. Solamente las instrucciones sintácticamente correctas pueden ser interpretadas por la computadora y los programas que contengan errores de sintaxis son rechazados por la máquina. Los elementos básicos constitutivos de un programa o algoritmo son: palabras reservadas (inicio, fin, si-entonces..., etc.), identificadores (nombres de variables esencialmente, procedimientos, funciones, nombre del programa, etc.), caracteres especiales (coma, apóstrofo, etc.), constantes, variables, expresiones, instrucciones. Además de estos elementos básicos, existen otros elementos que forman parte de los programas, cuya compren- sión y funcionamiento será vital para el correcto diseño de un algoritmo y naturalmente la codificación del programa. Estos elementos son: bucles, contadores, acumuladores, interruptores, estructuras: 1. secuenciales, 2. selectivas, 3. repetitivas. El amplio conocimiento de todos los elementos de programación y el modo de su integración en los programas constituyen las técnicas de programación que todo buen programador debe conocer. 3.5. DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS El primer objetivo de toda computadora es el manejo de la información o datos. Estos datos pueden ser las cifras de ventas de un supermercado o las calificaciones de una clase. Un dato es la expresión general que describe los objetos 90 Fundamentos de programación con los cuales opera una computadora. La mayoría de las computadoras pueden trabajar con varios tipos (modos) de datos. Los algoritmos y los programas correspondientes operan sobre esos tipos de datos. La acción de las instrucciones ejecutables de las computadoras se refleja en cambios en los valores de las partidas de datos. Los datos de entrada se transforman por el programa, después de las etapas intermedias, en datos de sali- da. En el proceso de resolución de problemas el diseño de la estructura de datos es tan importante como el diseño del algoritmo y del programa que se basa en el mismo. Un programa de computadora opera sobre datos (almacenados internamente en la memoria almacenados en me- dios externos como discos, memorias USB, memorias de teléfonos celulares, etc., o bien introducidos desde un dis- positivo como un teclado, un escáner o un sensor eléctrico). En los lenguajes de programación los datos deben de ser de un tipo de dato específico. El tipo de datos determina cómo se representan los datos en la computadora y los di- ferentes procesos que dicha computadora realiza con ellos. Tipo de datos Conjunto específico de valores de los datos y un conjunto de operaciones que actúan sobre esos datos. Existen dos tipos de datos: básicos, incorporados o integrados (estándar) que se incluyen en los lenguajes de programación; definidos por el programador o por el usuario. Además de los datos básicos o simples, se pueden construir otros datos a partir de éstos, y se obtienen los datos compuestos o datos agregados, tales como estructuras, uniones, enumeraciones (subrango, como caso particular de las enumeraciones, al igual de lo que sucede en Pascal), vectores o matrices/tablas y cadenas “arrays o arre- glos”; también existen otros datos especiales en lenguajes como C y C++, denominados punteros (apuntadores) y referencias. Existen dos tipos de datos: simples (sin estructura) y compuestos (estructurados). Los datos estructurados se es- tudian a partir del Capítulo 6 y son conjuntos de partidas de datos simples con relaciones definidas entre ellos. Los distintos tipos de datos se representan en diferentes formas en la computadora. A nivel de máquina, un dato es un conjunto o secuencia de bits (dígitos 0 o 1). Los lenguajes de alto nivel permiten basarse en abstracciones e ignorar los detalles de la representación interna. Aparece el concepto de tipo de datos, así como su representación. Los tipos de datos básicos son los siguientes: numéricos (entero, real) lógicos (boolean) carácter (caracter, cadena) Existen algunos lenguajes de programación —FORTRAN esencialmente— que admiten otros tipos de datos: complejos, que permiten tratar los números complejos, y otros lenguajes —Pascal— que también permiten declarar y definir sus propios tipos de datos: enumerados (enumerated) y subrango (subrange). 3.5.1. Datos numéricos El tipo numérico es el conjunto de los valores numéricos. Estos pueden representarse en dos formas distintas: tipo numérico entero (integer). tipo numérico real (real). Enteros: el tipo entero es un subconjunto finito de los números enteros. Los enteros son números completos, no tienen componentes fraccionarios o decimales y pueden ser negativos o positivos. Ejemplos de números enteros son: 5 6 –15 4 20 17 1340 26 Estructura general de un programa 91 Los números enteros se pueden representar en 8, 16 o 32 bits, e incluso 64 bits, y eso da origen a una escala de enteros cuyos rangos dependen de cada máquina Enteros –32.768 a 32.767 Enteros cortos –128 a 127 Enteros largos –2147483648 a 2147483647 Además de los modificadores corto y largo, se pueden considerar sin signo (unsigned) y con signo (signed). sin signo: 0.. 65.5350 0.. 4294967296 Los enteros se denominan en ocasiones números de punto o coma fija. Los números enteros máximos y mínimos de una computadora1 suelen ser –32.768 a +32.767. Los números enteros fuera de este rango no se suelen representar como enteros, sino como reales, aunque existen excepciones en los lenguajes de programación modernos como C, C++ y Java. Reales: el tipo real consiste en un subconjunto de los números reales. Los números reales siempre tienen un pun- to decimal y pueden ser positivos o negativos. Un número real consta de un entero y una parte decimal. Los siguien- tes ejemplos son números reales: 0.08 3739.41 3.7452 –52.321 –8.12 3.0 En aplicaciones científicas se requiere una representación especial para manejar números muy grandes, como la masa de la Tierra, o muy pequeños, como la masa de un electrón. Una computadora sólo puede representar un nú- mero fijo de dígitos. Este número puede variar de una máquina a otra, siendo ocho dígitos un número típico. Este límite provocará problemas para representar y almacenar números muy grandes o muy pequeños como son los ya citados o los siguientes: 4867213432 0.00000000387 Existe un tipo de representación denominado notación exponencial o científica y que se utiliza para números muy grandes o muy pequeños. Así, 367520100000000000000 se representa en notación científica descomponiéndolo en grupos de tres dígitos 367 520 100 000 000 000 000 y posteriormente en forma de potencias de 10 3.675201 x 1020 y de modo similar.0000000000302579 se representa como 3.02579 x 10–11 1 En computadoras de 16 bits como IBM PC o compatibles. 92 Fundamentos de programación La representación en coma flotante es una generalización de notación científica. Obsérvese que las siguientes expresiones son equivalentes: 3.675201 x 1019 =.3675207 x 1020 =.03675201 x 1021 =... = 36.75201 x 1018 = 367.5201 x 1017 =... En estas expresiones se considera la mantisa (parte decimal) al número real y el exponente (parte potencial) el de la potencia de diez. 36.75201 mantisa 18 exponente Los tipos de datos reales se representan en coma o punto flotante y suelen ser de simple precisión, doble precisión o cuádruple precisión y suelen requerir 4 bytes, 8 bytes o 10-12 bytes, respectivamente. La Tabla 3.2 muestra los datos reales típicos en compiladores C/C++. Tabla 3.2. Tipos de datos reales (coma flotante) en el lenguaje C/C++ Tipo Rango de valores real (float) -3.4 x 1038.. 3.4 x 1038 doble (double) -1.7 x 10-308.. 1.7 x 10308 3.5.2. Datos lógicos (booleanos) El tipo lógico —también denominado booleano— es aquel dato que sólo puede tomar uno de dos valores: cierto o verdadero (true) y falso (false). Este tipo de datos se utiliza para representar las alternativas (sí/no) a determinadas condiciones. Por ejemplo, cuando se pide si un valor entero es par, la respuesta será verdadera o falsa, según sea par o impar. C++ y Java soportan el tipo de dato bool. 3.5.3. Datos tipo carácter y tipo cadena El tipo carácter es el conjunto finito y ordenado de caracteres que la computadora reconoce. Un dato tipo carácter contiene un solo carácter. Los caracteres que reconocen las diferentes computadoras no son estándar; sin embargo, la mayoría reconoce los siguientes caracteres alfabéticos y numéricos: caracteres alfabéticos (A, B, C,..., Z) (a, b, c,..., z), caracteres numéricos (1, 2,..., 9, 0), caracteres especiales (+, -, *, /, ^,., ;, , $,...). Una cadena (string) de caracteres es una sucesión de caracteres que se encuentran delimitados por una comilla (apóstrofo) o dobles comillas, según el tipo de lenguaje de programación. La longitud de una cadena de caracteres es el número de ellos comprendidos entre los separadores o limitadores. Algunos lenguajes tienen datos tipo cadena. 'Hola Mortimer' '12 de octubre de 1492' 'Sr. McKoy' 3.6. CONSTANTES Y VARIABLES Los programas de computadora contienen ciertos valores que no deben cambiar durante la ejecución del programa. Tales valores se llaman constantes. De igual forma, existen otros valores que cambiarán durante la ejecución del Estructura general de un programa 93 programa; a estos valores se les llama variables. Una constante es un dato que permanece sin cambios durante todo el desarrollo del algoritmo o durante la ejecución del programa. Constantes reales válidas Constantes reales no válidas 1.234 1,752.63 (comas no permitidas) –0.1436 82 (normalmente contienen un punto decimal, aunque exis- ten lenguajes que lo admiten sin punto) + 54437324 Constantes reales en notación científica 3.374562E equivale a 3.374562 × 102 Una constante tipo carácter o constante de caracteres consiste en un carácter válido encerrado dentro de após- trofos; por ejemplo, 'B' '+' '4' ';' Si se desea incluir el apóstrofo en la cadena, entonces debe aparecer como un par de apóstrofos, encerrados den- tro de simples comillas. "" Una secuencia de caracteres se denomina normalmente una cadena y una constante tipo cadena es una cadena encerrada entre apóstrofos. Por consiguiente, 'Juan Minguez' y 'Pepe Luis Garcia' son constantes de cadena válidas. Nuevamente, si un apóstrofo es uno de los caracteres en una constante de cadena, debe aparecer como un par de apóstrofos 'John"s' Constantes lógicas (boolean) Sólo existen dos constantes lógicas o boolean: verdadero falso La mayoría de los lenguajes de programación permiten diferentes tipos de constantes: enteras, reales, caracteres y boolean o lógicas, y representan datos de esos tipos. Una variable es un objeto o tipo de datos cuyo valor puede cambiar durante el desarrollo del algoritmo o ejecu- ción del programa. Dependiendo del lenguaje, hay diferentes tipos de variables, tales como enteras, reales, carácter, lógicas y de cadena. Una variable que es de un cierto tipo puede tomar únicamente valores de ese tipo. Una variable de carácter, por ejemplo, puede tomar como valor sólo caracteres, mientras que una variable entera puede tomar sólo valores enteros. Si se intenta asignar un valor de un tipo a una variable de otro tipo se producirá un error de tipo. Una variable se identifica por los siguientes atributos: nombre que lo asigna y tipo que describe el uso de la va- riable. Los nombres de las variables, a veces conocidos como identificadores, suelen constar de varios caracteres al- fanuméricos, de los cuales el primero normalmente es una letra. No se deben utilizar —aunque lo permita el lengua- 94 Fundamentos de programación je, caso de FORTRAN— como nombres de identificadores palabras reservadas del lenguaje de programación. Nom- bres válidos de variables son: A510 NOMBRES Letra SalarioMes NOTAS Horas SegundoApellido NOMBRE_APELLIDOS2 Salario Ciudad Los nombres de las variables elegidas para el algoritmo o el programa deben ser significativos y tener relación con el objeto que representan, como pueden ser los casos siguientes: NOMBRE para representar nombres de personas PRECIOS para representar los precios de diferentes artículos NOTAS para representar las notas de una clase Existen lenguajes —Pascal— en los que es posible darles nombre a determinadas constantes típicas utilizadas en cálculos matemáticos, financieros, etc. Por ejemplo, las constantes π = 3.141592... y e = 2.718228 (base de los loga- ritmos naturales) se les pueden dar los nombres PI y E. PI = 3.141592 E = 2.718228 3.6.1. Declaración de constants y variables Normalmente los identificadores de las variables y de las constantes con nombre deben ser declaradas en los progra- mas antes de ser utilizadas. La sintaxis de la declaración de una variable suele ser: [=] EJEMPLO car letra, abreviatura ent numAlumnos = 25 real salario = 23.000 Si se desea dar un nombre (identificador) y un valor a una constante de modo que su valor no se pueda modificar posteriormente, su sintaxis puede ser así: const = EJEMPLO const doble PI = 3.141592 const cad nombre = 'Mackoy' const car letra = 'c' 3.7. EXPRESIONES Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funcio- nes especiales. Las mismas ideas son utilizadas en notación matemática tradicional; por ejemplo, a + (b + 3) + √ c 2 Algunos lenguajes de programación admiten como válido el carácter subrayado en los identificadores. Estructura general de un programa 95 Aquí los paréntesis indican el orden de cálculo y √ representa la función raíz cuadrada. Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas. Una expresión consta de operandos y operadores. Según sea el tipo de objetos que manipulan, las expresiones se clasifican en: aritméticas, relacionales, lógicas, carácter. El resultado de la expresión aritmética es de tipo numérico; el resultado de la expresión relacional y de una ex- presión lógica es de tipo lógico; el resultado de una expresión carácter es de tipo carácter. 3.7.1. Expresiones aritméticas Las expresiones aritméticas son análogas a las fórmulas matemáticas. Las variables y constantes son numéricas (real o entera) y las operaciones son las aritméticas. + suma - resta * multiplicación / división ↑, **, ^ exponenciación div, / división entera mod, % módulo (resto) Los símbolos +, –, *, ^ (↑ o **) y las palabras clave div y mod se conocen como operadores aritméticos. En la expresión 5 + 3 los valores 5 y 3 se denominan operandos. El valor de la expresión 5 + 3 se conoce como resultado de la expre- sión. Los operadores se utilizan de igual forma que en matemáticas. Por consiguiente, A ∙ B se escribe en un algo- ritmo como A * B y 1/4 ∙ C como C/4. Al igual que en matemáticas el signo menos juega un doble papel, como resta en A – B y como negación en –A. Todos los operadores aritméticos no existen en todos los lenguajes de programación; por ejemplo, en FORTRAN no existe div y mod. El operador exponenciación es diferente según sea el tipo de lenguaje de programación elegido (^, ↑ en BASIC, ** en FORTRAN). Los cálculos que implican tipos de datos reales y enteros suelen dar normalmente resultados del mismo tipo si los operandos lo son también. Por ejemplo, el producto de operandos reales produce un real (véase Tabla 3.3). EJEMPLO 5 x 7 se representa por 5 * 7 6 se representa por 6/4 4 37 se representa por 3^7 96 Fundamentos de programación Tabla 3.3. Operadores aritméticos Operador Significado Tipos de operandos Tipo de resultado + Signo positivo Entero o real Entero o real – Signo negativo 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 ++ Incremento Entero Entero –– Decremento Entero Entero Operadores DIV (/) y MOD (%) El símbolo / se utiliza para la división real y la división entera (el operador div —en algunos lenguajes, por ejemplo BASIC, se suele utilizar el símbolo \— representa la división entera). El operador mod representa el resto de la divi- sión entera, y la mayoría de lenguajes utilizan el símbolo %. A div B Sólo se puede utilizar si A y B son expresiones enteras y obtiene la parte entera de A/B. Por consiguiente, 19 div 6 19/6 toma el valor 3. Otro ejemplo puede ser la división 15/6 15 |6 3 2 cociente | resto En forma de operadores resultará la operación anterior 15 div 6 = 2 15 mod 6 = 3 Otros ejemplos son: 19 div 3 equivale a 6 19 mod 6 equivale a 1 EJEMPLO 3.1 Los siguientes ejemplos muestran resultados de expresiones aritméticas: expresión resultado expresión resultado 10.5/3.0 3.5 10/3 3 1/4 0.25 18/2 9 2.0/4.0 0.5 30/30 1 6/1 6.0 6/8 0 30/30 1.0 10%3 1 6/8 0.75 10%2 0 Estructura general de un programa 97 Operadores de incremento y decremento Los lenguajes de programación C/C++, Java y C# soportan los operadores unitarios (unarios) de incremento, ++, y decremento, --. El operador de incremento (++) aumenta el valor de su operando en una unidad, y el operador de decremento (--) disminuye también en una unidad. El valor resultante dependerá de que el operador se emplee como prefijo o como sufijo (antes o después de la variable). Si actúa como prefijo, el operador cambia el valor de la varia- ble y devuelve este nuevo valor; en caso contrario, si actúa como sufijo, el resultado de la expresión es el valor de la variable, y después se modifica esta variable. ++i Incrementa i en 1 y después utiliza el valor de i en la correspondiente expresión. i++ Utiliza el valor de i en la expresión en que se encuentra y después se incrementa en 1. --i Decrementa i en 1 y después utiliza el nuevo valor de i en la correspondiente expresión. i-i-- Utiliza el valor de i en la expresión en que se encuentra y después se incrementa en 1. EJEMPLO: n = 5 escribir n escribir n++ escribir n n = 5 escribir n escribir ++n escribir n Al ejecutarse el algoritmo se obtendría: 5 5 6 5 6 6 3.7.2. Reglas de prioridad Las expresiones que tienen dos o más operandos requieren unas reglas matemáticas que permitan determinar el orden de las operaciones, se denominan reglas de prioridad o precedencia y son: 1. Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis anidados (interiores unos a otros), las expresiones más internas se evalúan primero. 2. Las operaciones aritméticas dentro de una expresión suelen seguir el siguiente orden de prioridad: operador ( ) operadores ++, – – + y – unitarios, operadores *, /, % (producto, división, módulo) operadores +, – (suma y resta). En los lenguajes que soportan la operación de exponenciación, este operador tiene la mayor prioridad. En caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre parén- tesis, el orden de prioridad en este caso es de izquierda a derecha, y a esta propiedad se denomina asociatividad. 98 Fundamentos de programación EJEMPLO 3.2 ¿Cuál es el resultado de las siguientes expresiones? a) 3 + 6 * 14 b) 8 + 7 * 3 + 4 * 6 Solución a) 3 + 6 * 14 b) 8 + 7 * 3 + 4 * 6 {{ {{ { 3 + 84 8 + 21 24 87 29 + 24 { 53 EJEMPLO 3.3 Obtener los resultados de las expresiones: –4 * 7 + 2 ^ 3 / 4 – 5 Solución –4 * 7 + 2 ^ 3 / 4 – 5 resulta –4 * 7 + 8 / 4 – 5 –28 + 8 / 4 – 5 –28 + 2 - 5 –26 - 5 –31 EJEMPLO 3.4 Convertir en expresiones aritméticas algorítmicas las siguientes expresiones algebraicas: 5 ∙ (x + y) a2 + b2 x+y x · (z + w) w y u+ a Los resultados serán: 5 ∗ (x + y) a ^2 + b ^2 (x + y) / (u + w/a) x / y ∗ (z + w) EJEMPLO 3.5 Los paréntesis tienen prioridad sobre el resto de las operaciones: A * (B + 3) la constante 3 se suma primero al valor de B, después este resultado se multipli- ca por el valor de A. Estructura general de un programa 99 (A * B) + 3 A y B se multiplican primero y a continuación se suma 3. A + (B + C) + D esta expresión equivale a A + B + C + D (A + B/C) + D equivale a A + B/C + D A * B/C * D equivale a ((A * B)/C) * D y no a (A * B)/(C * D). EJEMPLO 3.6 Evaluar la expresión 12 + 3 * 7 + 5 * 4. En este ejemplo existen dos operadores de igual prioridad, * (multiplicación); por ello los pasos sucesivos son: 12 + 3 * 7 + 5 * 4 { 21 12 + 21 + 5 * 4 { 20 12 + 21 + 20 = 53 3.7.3. Expresiones lógicas (booleanas) Un segundo tipo de expresiones es la expresión lógica o booleana, cuyo valor es siempre verdadero o falso. Recuer- de que existen dos constantes lógicas, verdadera (true) y falsa (false) y que las variables lógicas pueden tomar sólo estos dos valores. En esencia, una expresión lógica es una expresión que sólo puede tomar estos dos valores, verda- dero y falso. Se denominan también expresiones booleanas en honor del matemático británico George Boole, que desarrolló el Álgebra lógica de Boole. Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones lógicas, utilizando los operadores lógicos not, and y or y los operadores relacionales (de relación o comparación) =, , =,. Operadores de relación Los operadores relacionales o de relación permiten realizar comparaciones de valores de tipo numérico o carácter. Los operadores de relación sirven para expresar las condiciones en los algoritmos. Los operadores de relación se recogen en la Tabla 3.4. El formato general para las comparaciones es expresión1 operador de relación expresión2 y el resultado de la operación será verdadero o falso. Así, por ejemplo, si A = 4 y B = 3, entonces A > B es verdadero Tabla 3.4. Operadores de relación Operador Significado < menor que > mayor que =, == igual que = mayor o igual que , != distinto de 100 Fundamentos de programación mientras que (A – 2) < (B – 4) es falso. Los operadores de relación se pueden aplicar a cualquiera de los cuatro tipos de datos estándar: enteros, real, lógico, carácter. La aplicación a valores numéricos es evidente. Los ejemplos siguientes son significativos: N1 N2 Expresión lógica Resultado 3 6 3 < 6 verdadero 0 1 0 > 1 falso 4 2 4 = 2 falso 8 5 8 = 9 verdadero 5 5 5 5 falso Para realizar comparaciones de datos tipo carácter, se requiere una secuencia de ordenación de los caracteres similar al orden creciente o decreciente. Esta ordenación suele ser alfabética, tanto mayúsculas como minúsculas, y numérica, considerándolas de modo independiente. Pero si se consideran caracteres mixtos, se debe recurrir a un código normalizado como es el ASCII (véase Apéndice A). Aunque no todas las computadoras siguen el código nor- malizado en su juego completo de caracteres, sí son prácticamente estándar los códigos de los caracteres alfanumé- ricos más usuales. Estos códigos normalizados son: Los caracteres especiales #, %, $, (, ), +, –, /,..., exigen la consulta del código de ordenación. Los valores de los caracteres que representan a los dígitos están en su orden natural. Esto es, '0' 14) produce un valor verdadero (1.0 < x) y (x < z + 7.0) si x vale 7 y z vale 4, se obtiene un valor verdadero 3.8. FUNCIONES INTERNAS Las operaciones que se requieren en los programas exigen en numerosas ocasiones, además de las operaciones de las operaciones aritméticas básicas, ya tratadas, un número determinado de operadores especiales que se denominan funciones internas, incorporadas o estándar. Por ejemplo, la función ln se puede utilizar para determinar el logaritmo neperiano de un número y la función raiz2 (sqrt) calcula la raíz cuadrada de un número positivo. Existen otras funciones que se utilizan para determinar las funciones trigonométricas. La Tabla 3.9 recoge las funciones internas más usuales, siendo x el argumento de la función. Tabla 3.9. Funciones internas Función Descripción Tipo de argumento Resultado abs(x) valor absoluto de x entero o real igual que argumento arctan(x) arco tangente de x entero o real real cos(x) coseno de x entero o real real Estructura general de un programa 103 Tabla 3.9. Funciones internas (continuación) Función Descripción Tipo de argumento Resultado exp(x) exponencial de x entero o real real ln(x) logaritmo neperiano de x entero o real real log10(x) logaritmo decimal de x entero o real real redondeo(x) redondeo de x real entero (round(x))* seno(x) seno de x entero o real real (sin(x))* cuadrado(x) cuadrado de x entero o real igual que argumento (sqr(x))* raiz2(x) raíz cuadrada de x entero o real real (sqrt(x))* trunc(x) truncamiento de x real entero * Terminología en inglés. EJEMPLO 3.9 Las funciones aceptan argumentos reales o enteros y sus resultados dependen de la tarea que realice la función: Expresión Resultado raiz2 (25) 5 redondeo (6.5) 7 redondeo (3.1) 3 redondeo (–3.2) –3 trunc (5.6) 5 trunc (3.1) 3 trunc (–3.8) –3 cuadrado (4) 16 abs (9) 9 abs (-12) 12 EJEMPLO 3.10 Utilizar las funciones internas para obtener la solución de la ecuación cuadrática ax2 + bx + c = 0. Las raíces de la ecuación son: − b ± b 2 − 4 ac x= 2a o lo que es igual: − b + b 2 − 4 ac − b − b 2 − 4 ac x1 = x2 = 2a 2a Las expresiones se escriben como x1 = (-b + raiz2 (cuadrado(b) - 4 * a * c)) / (2 * a) x2 = (-b - raiz2 (cuadrado(b) - 4 * a * c)) / (2 * a) 104 Fundamentos de programación Si el valor de la expresión raiz2 (cuadrado(b) - 4 * a * c) es negativo se producirá un error, ya que la raíz cuadrada de un número negativo no está definida. 3.9. LA OPERACIÓN DE ASIGNACIÓN La operación de asignación es el modo de almacenar valores a una variable. La operación de asignación se represen- ta con el símbolo u operador ← (en la mayoría de los lenguajes de programación, como C, C++, Java, el signo de la operación asignación es =). La operación de asignación se conoce como instrucción o sentencia de asignación cuan- do se refiere a un lenguaje de programación. El formato general de una operación de asignación es ← expresión es igual a expresión, variable o constante La flecha (operador de asignación) se sustituye en otros lenguajes por = (Visual Basic, FORTRAN), := (Pascal) o = (Java, C++, C#). Sin embargo, es preferible el uso de la flecha en la redacción del algoritmo para evitar ambi- güedades, dejando el uso del símbolo = exclusivamente para el operador de igualdad. La operación de asignación: A ← 5 significa que a la variable A se le ha asignado el valor 5. La acción de asignar es destructiva, ya que el valor que tuviera la variable antes de la asignación se pierde y se reemplaza por el nuevo valor. Así, en la secuencia de operaciones A ← 25 A ← 134 A ← 5 cuando éstas se ejecutan, el valor último que toma A será 5 (los valores 25 y 134 han desaparecido). La computadora ejecuta la sentencia de asignación en dos pasos. En el primero de ellos, el valor de la expresión al lado derecho del operador se calcula, obteniéndose un valor de un tipo específico. En el segundo caso, este valor se almacena en la variable cuyo nombre aparece a la izquierda del operador de asignación, sustituyendo al valor que tenía anteriormente. X ← Y + 2 el valor de la expresión Y + 2 se asigna a la variable X. Es posible utilizar el mismo nombre de variable en ambos lados del operador de asignación. Por ello, acciones como N ← N + 1 tienen sentido; se determina el valor actual de la variable N, se incrementa en 1 y a continuación el resultado se asigna a la misma variable N. Sin embargo, desde el punto de vista matemático no tiene sentido N ← N + 1. Las acciones de asignación se clasifican según sea el tipo de expresiones en: aritméticas, lógicas y de ca- racteres.