Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
LÓGICA DE PROGRAMACIÓN CON C++ INGENIERÍA TRONCO COMÚN ING. JOSE RODRIGUEZ RUIZ DEPTO. DE INGENIERIA EN SISTEMAS COMPUTACIONALES E INFORMATICA INSTITUTO TECNOLOGICO DE CELAYA CONTENIDO PAG. INTRODUCCIÓN EDUCACIÓN EN COMPETENCIAS 5 UNIDAD I CONCEPTOS BÁSICOS Y METODOLOGÍA PARA LA 7 SOLUCIÓN DE PROBLEMAS POR MEDIO DE COMPUTADORAS Introducción 7 1.1 De los problemas a los algritmos y a los programas 8 1.2 Desarrollo de software para solucionar problemas 10 1.2.1 Definición de algoritmo 11 1.2.2 Técnicas de representación de algoritmos 11 1.2.2.1 Diagrámas de flujo 13 1.2.2.2 Pseudocódigo 14 1.3 Algoritmos cotidianos 15 1.4 Breves Prácticas de escritura de algoritmos 17 1.5 Programas 20 1.5.1 Definición de lenguaje 20 1.5.2 Lenguajes de bajo nivel 20 1.5.3 Lenguajes de alto nivel 21 1.5.4 El lenguaje C++ 22 1.6 Programas en C++ 23 1.6.1 Tipos de datos 23 1.6.1.1 Datos numéricos 24 1.6.1.2 Datos carácter 24 1.6.1.3 Datos cadena de caracteres 24 1.6.1.4 Datos lógicos o booleanos 25 1.6.1.5 Datos apuntador 27 1.7 Variables, nombres de variables y expresiones 27 17.1 Declaración de variables 28 1.7.2 Expresiones matemáticas 29 1.7.2.1 Conversión de expresiones matemáticas 29 1.7.2.2 Precedencia de operadores 30 1.7.2.3 Evaluación de expresiones 31 1.7.3 Constantes simbólicas 33 1.8 Entrada/salida 35 1.8.1 Operación de salida 35 1.8.2 Operación de entrada 39 1.8.2.1 Entrada numérica con cin 39 1.8.2.2 Entrada de caracteres con cin,get() 39 1.8.2.3 Entrada de cadena de caracteres con getline() 39 1.9 Manipuladores de ancho de campo 41 1.10 Funciones internas 43 1.11 Resolución de problemas 46 1.12 Desarrollo de software 46 1.12.1 Ciclo de desarrollo de software 46 1.12.1.1 Entender problema 47 1.12.1.2 Diseñar algoritmo 47 1.12.1.3 Escribir el algoritmo o el programa y probarlo 47 1.12.1.4 Documentar el algoritmo o programa 48 1.12.2 Ejemplo de la utilización del ciclo de desarrollo de software 48 1.12.3 Traducción del pseudocódigo C++ a código C++ (programa) 53 1.13 Textos en inglés para su traducción 55 UNIDAD II ESTRUCTURAS BÁSICAS DE CONTROL 60 2.1 Estructuras de repetición (lazos) 60 2.1.1 Instrucciòn while (mientras) 2.1.2 Métodos para controlar las repeticiones (lazos) 64 2.1.2.1 Control del lazo por contador 65 2.1.2.1.1 Utilización del encabezado #include<iomanip> 68 2.1.2.1.2 Cómo concatenar en una variable todas las líneas de salida 72 del programa 2.1.2.1.3 Validación de datos de entrada 76 Validación de datos nunéricos 76 Validación de datos cadena de caracteres 77 2.1.2.2 Control del lazo por dato centinela 80 2.1.2.3 Control del lazo por pregunta directa 83 2.1.3 Instrucción for (lazo contado) 86 2.1.4 Instrucción do..while92 2.2 Generación de números aleatorios 95 2.2.1 Escalamiento a un rango real entre 0.0 y <1.0 97 2.2.2 Escalamiento a un rango entero entre 0 y N-1 98 2.2.3 Escalamiento a un rango entero entre 1 y N 98 2.2.4 Escalamiento a un rango entero entre A y B 99 2.3 Contadopres y acumuladores 100 2.4 Repeticiones anidadas 102 2.5 Estructuras de decisión 105 2.5.1 Instrucción if 105 2.5.2 Instrucción if..else 110 2.5.3 Instrucción switch 119 2.5.4 Instrucción de decisión anidadas 127 PENDIENTES UNIDAD III ARREGLOS UNIDAD IV MANEJO DE MÓDULOS 4.1 Concepto y características de un módulo 4.2 Clasificación de los módulos 4.2.1 funciones 4.3 Operaciones de módulos y sus parámetros LÓGICA DE PROGRAMACIÓN CON C++ INTRODUCCIÓN EDUCACIÓN EN COMPETENCIAS La educación actual debe ser una educación centrada en la naturaleza humana, lo que trae una consecuencia muy importante: la educación debe preparar para la vida. Esto obliga a considerar en la planeación de cualquier curso escolar las dos grandes ramas del conocimiento: las ciencias y las humanidades. Con respecto a la forma de facilitar está educación, la escuela debe fomentar el desarrollo de competencias en el ser humano (lectura, escritura, análisis, solución de problemas, etc.), ya que estas son apoyos invaluables para toda persona que desee apropiarse de un conocimiento. Aquí, la palabra competencia no se refiere a desafiar a alguien más para tratar de ganar y demostrar que se es “mejor”, como sería el caso de una competencia deportiva; sino que se refiere a la capacidad de una persona para desempeñar una actividad cualquiera con un alto desempeño y obtener a satisfacción el resultado deseado. La educación en competencias se perfila en tres saberes: saber aprender (aprender a aprender), saber hacer y saber Ser. Saber aprender significa ejercitar en grado máximo nuestras habilidades mentales, tales como escuchar, percibir, tener curiosidad, tener creatividad, analizar, sintetizar, comunicar y muchas otras, que nos permitan ser responsables del propio aprendizaje. Implícito está el tener una motivación propia y ser capaz de saber dónde buscar el conocimiento con el propósito de auto actualizarse constantemente. Saber hacer se refiere a ser capaces de aplicar nuestro conocimiento para transformar nuestro entorno de manera inteligente y responsable para beneficio de la sociedad. Está relacionado con el aprendizaje de una profesión y el trabajo productivo, con la solución de problemas y con la toma de decisiones racionales en la producción de bienes y servicios de calidad. Saber Ser implica descubrir la verdadera naturaleza humana, es decir, la naturaleza tanto de usted como mía; encontrar la esencia de uno mismo. Nos permite descubrir nuestra dimensión universal, lugar de donde proceden los valores genuinos que no son individuales, sino propios de nuestra humanidad. Este saber define un orden interno en la persona que le permite desarrollar su potencial ilimitado. Así pues, este curso a simple vista parece pertenecer ciento por ciento a la rama de las ciencias; sin embargo, es un curso por competencias, no sólo porque administrativamente así se haya clasificado, sino porque la realidad actual lo exige: un programador debe saber aprender, saber hacer y saber Ser si es que quiere desarrollar plenamente sus habilidades y encontrar una satisfacción plena en esta actividad. El texto que tiene en sus manos incluye no solamente información, teoría y prácticas sobre la programación, sino que también incluye algunas actividades denominadas “Ejercicio de competencias”, donde se le pide al alumno que realice algunas actividades que le permitan desarrollar algunas competencias tanto genéricas como propias de su especialidad, tales como la capacidad de análisis y de síntesis, lectura y redacción, comunicación oral y escrita en el idioma propio, el conocimiento de una segunda lengua (idioma inglés), comprensión de conceptos, y muchos otras. A modo de ejemplo se presenta el primer ejercicio de competencias, el cual se refiere a “saber Ser”. Este ejercicio pretende que el alumno se considere primero que todo como un ser humano antes que como un estudiante, como un profesionista, o como cualquier otro título que pretenda obtener. Tiene el propósito también de que entre en su mente la idea de considerarse como un Ser perfecto. Wayne W. Dyer dice en su libro El límite es el cielo. “Es perfectamente válido considerarse a sí mismo perfecto. No equivale, ni mucho menos, a ser presuntuoso, a creerse superior al resto de la humanidad ni a carecer de motivaciones para seguir desarrollando la propia personalidad.” Desarrollar la propia personalidad implica cambio en un sentido positivo. Se reconoce entonces que este cambio es una evolución y un aprendizaje permanente porque, continúa Dyer, “… todas las cosas existentes son todo lo perfectas que pueden ser aunque estén continuamente cambiando…Usted puede evolucionar, cambiar y ser distinto de mil modos, y, sin embargo, no es menos perfecto por ello. Usted puede evolucionar, cambiar y ser distinto de mil modos, y, sin embargo, ser una criatura perfecta. La esencia de su perfección es su propia capacidad para verse para verse a sí mismo, pero aceptar lo que ve como perfecto en el momento presente, y ser luego capaz de convertirse en algo completamente distinto, pero perfecto aún.” Dyer resume su idea de Ser perfecto de la siguiente manera: “Ser perfecto significa verse a sí mismo con ojos nuevos. Significa permitirse llegar plenamente a la vida, en vez de andar siempre dando vueltas, pensando que aún no es usted lo bastante bueno para incorporarse a la Gran Competición. Significa respetar su propia humanidad y su ilimitada capacidad como ser humano. Significa concederse permiso para desarrollarse y alcanzar los niveles más altos imaginables. En este sentido, tiene usted capacidad para ser perfecto. Puede considerarse usted una obra concluida (sin tener que presumir ante los demás ni demostrar nada a nadie) si cultiva el equilibrio, la confianza y la sensación de orgullo interior” que lo posibilitará a experimentar “una plenitud humana total”. Si usted inicia este curso, y cualquiera otra tarea que desee, con esta mentalidad de Ser perfecto, si considera que todo ser humano (usted mismo) está dotado con todas las capacidades (aunque todavía deba desarrollarlas, muchas veces con gran esfuerzo) necesarias para triunfar en cualquier actividad que usted emprenda, entonces estará en el camino que, en su momento, le permitirá lograr sus metas. Ejercicio de competencias 1.1: Saber Ser: Ser perfecto Lea la introducción Educación en competencias y después haga lo siguiente: a) Redacte brevemente, en sus propias palabras, que es Educación en competencias. b) Cuando usted se ve ante un espejo, ¿aceptalo que ve como perfecto en el momento presente? Porqué sí o porqué no. c) Tomando en consideración lo que acaba de leer, ¿Cuál cree usted que va a ser su logro personal al final (no me refiero solamente a su calificación numérica) de este curso? Redacte claramente su respuesta. UNIDAD I CONCEPTOS BÁSICOS Y METODOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS POR MEDIO DE COMPUTADORAS INTRODUCCIÓN El uso de computadoras para el procesamiento de información y la solución de problemas se ha incrementado aceleradamente desde su introducción a mediados de los 1940’s. A cada momento del día, millones de computadoras utilizan software diverso que manipula datos que tocan nuestras vidas en una gran variedad de formas. A cualquier lado que volteamos, encontramos productos relacionados con las computadoras. Todas nuestras facturas por servicios de gas, electricidad, médicos, y muchos otros han sido calculados e impresos por computadoras. Nuestros cheques de pago, cuentas bancarias, reservaciones de hoteles o de aviones son preparados eficientemente por computadoras. Podemos llamar a nuestro banco con respecto a nuestros saldos y recibimos respuesta inmediata cuando la persona que nos atiende teclea nuestro número de cuenta en una computadora. Los gerentes de empresas consultan las bases de datos almacenadas en computadoras y reciben información actualizada sobre la cual basar sus decisiones. La computadora es capaz de dar respuesta a muchos y diferentes tipos de problemas. Cálculos complejos que nos tomarían horas, días y aún semanas si los realizáramos a mano, pueden ser hechos en segundos por una computadora. Una computadora puede realizar operaciones matemáticas simples o complejas, dibujar figuras, trazar gráficas o simular juegos. Puede ordenar datos, buscar en tablas de información y actualizar los datos de archivos. Puede comparar valores y realizar operaciones diferentes dependiendo de los resultados de la comparación. Pero hay algo importante que deberemos tener en cuenta: la computadora no puede resolver problemas por ella misma. La idea de que la computadora es un “cerebro” está muy lejos de la verdad. Sólo es una máquina; una herramienta para extender las capacidades mentales del ser humano. No puede tomar ninguna decisión por su propia cuenta sino que debe recibir explícitamente y a detalle las operaciones que debe ejecutar. La computadora está limitada a aplicaciones que tienen propósitos predeterminados y que pueden ser definidos mediante una serie de instrucciones lógicas. Si una persona no puede definir todos los pasos involucrados en la solución de un problema, entonces tampoco lo puede hacer la computadora. La velocidad y precisión de las operaciones en la computadora son tremendas. La computadora funcionará erróneamente sólo si alguno de sus componentes falla (lo cual es poco probable), y puede ejecutar operaciones una y otra vez sin sentirse “cansada”. Esto sin mencionar que el producto de sus computaciones son siempre perfectas; Sin embargo, frecuentemente se encuentran errores en los listados de salida, en los reportes, en las cantidades de las facturas o en el resultado de cálculos numéricos. Pero los errores se originan en el software que dirige a la computadora, o en los datos que se le suministran. El acrónimo GIGO (Garbage in, Garbage out; basura adentro, basura afuera), implica que el usuario obtendrá resultados válidos sólo si la computadora recibe datos adecuados y es instruida correctamente (por medio de un programa). El número de aplicaciones para las computadoras se han incrementado enormemente desde su introducción. Estas aplicaciones caen dentro de tres categorías generales: ciencia, negocios y humanidades. (Cole, J.W. Perry. ANSI FORTRAN IV, A Structured Programming Approach. 2o. ed. WCB) Ejercicio de competencias 1.2: Conocimiento de una segunda lengua Traduzca al español el siguiente texto en inglés. Business applications are involved mainly with record processing and operational and managerial reports. These applications include: payroll, accounting, inventory control, economic forecasting, publishing and printing, farming, and many, many more. Scientific applications are primarily involved with numeric processing and include: airplane stress analysis, statistics, matrix manipulation, complex equations, space, engineering, oceanography, meteorology, physics, aeronautics, and many others. Humanities applications are involved mainly with non-numeric processing and include: computer art, music, composition, archaeology, psychology, languages, map reproduction, poetry, concordance construction, artifact classification, historical research, culture analysis, architecture, and others. We are indeed affected by computers in almost every part of our lives-- by computers in almost every part of our lives—educational, business, social, governmental, religious, and recreational. Computers are here to stay. Our society cannot go back to older manual methods of processing information. It is up to you to learn to deal with them effectively. 1.1 DE LOS PROBLEMAS A LOS ALGORITMOS Y A LOS PROGRAMAS PROBLEMAS “¿Quién no tiene problemas? ¿Quién no los ha tenido? ¿Quién no se ha preocupado ante ellos? Y ¿quién no ha tenido fracasos en la tarea de resolverlos? Problemas de salud, económicos, laborales, de relaciones familiares, problemas de diseño, problemas mecánicos, eléctricos, organizativos, de aprendizaje… Ya el niño pequeño se ve obligado a hacer esfuerzos repetidos por gatear, hablar, caminar, vestirse, mantenerse aseado, por imponer sus deseos. De manera particular, los cambios son fuente de problemas. Y la vida está toda salpicada de cambios: entrar a la escuela, tener un nuevo hermanito, pasar de la primaria a la secundaria, aprender a andar en bicicleta, casarse, tener hijos, enviudar, cambiar de trabajo, cambiar de domicilio, cumplir 50 años, cumplir 60 años… El punto de vista general es que “los problemas son el clavo en el zapato”; por ello, suelen suscitar reacciones negativas y defensivas. Pero también son la “sal de la vida. Las actividades de la mayoría de las profesiones y oficios se encaminan a resolver problemas y, si se eliminan todos éstos, cientos de millones se quedarían sin trabajo; además, podemos verlos como retos y como obstáculos superables en nuestro camino hacía los objetivos.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio. Creatividad para resolver problemas. Principios y técnicas. Ed. Pax. México. 2000) Efectivamente, desde el inicio de la humanidad, el hombre ha tenido que lidiar con múltiples problemas no sólo para sobrevivir, sino también para progresar porque “al agilizar nuestra mente y expander nuestra imaginación, los problemas nos educan.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio) “Originalmente, problema significaba algún objeto físico, por ejemplo, una pared o una barda que una persona encontraba en su camino. Pero fácilmente se vio la analogía entre el camino físico y el camino psicológico. Y se hizo la metáfora: problema vino a ser algo que se interpone en el “camino” entre la realidad actual de una persona y lo que necesita o desea. Y ahora se piensa en problemas en este segundo sentido.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio) Entonces desde este punto de vista “un problema no es una realidad física, sino una realidad de orden psicológico: es una vivencia, una toma de conciencia. Tan es así que una misma situación es para Juan un problema terrible, para Pedro uno sencillo, y para Pablo no es problema… Por ser una realidad humana y no matemática o físico-química, el campo de los problemas presenta una gran flexibilidad.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio) Esto último es de una gran importancia, porque implica que no hay una única manera de resolver un problema. “Por definición, un problemaimplica la búsqueda de algo que no se tiene: una luz oculta; un resorte aún no existente. Este “algo” es nuevo; de lo contrario, el problema dejaría de existir. Ahora bien, la búsqueda de lo nuevo nos obliga a utilizar el pensamiento creativo. Un problema puede contemplarse como un “sistema”. Tiene sus entradas (que no necesariamente son datos), sus procesos, sus salidas (que no necesariamente son las incógnitas), pero también tiene sus controles y mecanismos. Las incógnitas se presentan en variadas formas y pueden ser: 1. las salidas (que es la situación más común), 2. las entradas y 3. el proceso. La solución de problemas es una actividad eminentemente creativa. Al tratar de resolver un problema, consideramos sucesivamente sus diversos aspectos, les damos vueltas en la mente. Si persistimos podremos encontrar alternativas, simplificarlo, descomponer y recomponer sus elementos; pero siempre en un afán de búsqueda, en un intento por llegar a lo que pretendemos: su solución.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio) Ahora, ¿todas las personas utilizan los mismos métodos para encontrar la solución a un problema? Desde luego que no. Esto se debe a que “Es indudable que algunas personas tienen más capacidad para resolver problemas. No pretendemos discutir aquí la influencia de la herencia y del medio ambiente; lo que sí conviene establecer es que cualquier persona tiene la suficiente inteligencia para desarrollar su capacidad de solución de problemas. Las energías exógenas –bloqueos que se adquieren en las etapas formativas del individuo—y endógenas –falta de decisión, tenacidad y perseverancia para adquirir dicha capacidad—provocan diferencias determinantes entre una persona y otra.” (Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio) Debe quedar muy claro que toda persona, tú lector, tienen el potencial de resolver problemas. Pero este potencial no se liberará si no se tiene voluntad y si no se pone un esfuerzo consciente. Además, es también de gran ayuda seguir los consejos de gente más experimentada. Las siguientes son las nueve sugerencias planteadas en su texto por los autores Rodríguez y Fernández para enfrentar con grandes probabilidades de éxito el proceso de solución de problemas: 1) Atrévete a enfrentar el problema. 2) Defínelo y entiéndelo bien. 3) Investígalo. 4) No te impongas restricciones inexistentes. 5) Trata de verlo desde otro punto de vista. 6) Intenta primero lo sencillo. 7) Pon en práctica tu intuición. 8) Aprende de los intentos fallidos. 9) Lleva en tu mente la convicción de que ninguna idea es realmente mala. Si el lector analiza estas sugerencias podrá captar la validez de las mismas desde diferentes ámbitos. Por ejemplo, la sugerencia 1) significa que solamente con la actitud adecuada podremos iniciar el proceso de solución. Si la actitud es de temor o desconfianza en uno mismo, entonces no podremos encontrar una solución que ni siquiera intentamos buscar. Para mayor información sobre cada una de estas sugerencias, consultar el capítulo 10 del texto mencionado. Ejercicio de competencias 1.3: Capacidad de redacción Lea el capítulo 1, páginas 1-3 del texto Rodríguez Estrada, Mauro y Fernández Ortega, Juan Antonio. Creatividad para resolver problemas. Principios y técnicas. Ed. Pax. México. 2000 y después haga lo siguiente: Escriba de manera breve (redacte) un reporte de lo que comprendió del capítulo que leyó. 1.2 DESARROLLO DE SOFTWARE PARA SOLUCIONAR PROBLEMAS Sin importar cual campo de trabajo se elija, siempre habrá problemas que resolver. Muchos de estos, como calcular la cuenta por los alimentos consumidos en un restaurant, pueden resolverse sin mayor esfuerzo. Otros, como aprender a tocar un instrumento musical, requieren algo de práctica, pero pronto se vuelven automáticos. Otros más requieren de un análisis del problema y de una planeación cuidadosa para que la solución sea apropiada y eficiente. Por ejemplo, construir un gran edificio o crear un nuevo sistema operativo para una computadora son problemas en donde la improvisación y las soluciones por prueba y error pueden conducir a resultados erróneos y bastante costosos en tiempo, dinero y esfuerzo. Crear un programa de computadora no es diferente porque un programa es una solución desarrollada en software para resolver un problema particular. Sin embargo, escribir un programa casi es el último paso en un proceso de desarrollo de software. Antes de pensar en escribir la primera instrucción del programa, se debe resolver el problema, y esto solo lo puede hacer un ser humano. Esto es necesario porque, La computadora no resuelve problemas. La computadora solamente puede ejecutar (correr) la solución del problema siempre y cuando se le haya proporcionado (cargado en su memoria) el programa adecuado. Así, antes de escribir un programa, el programador debe pasar a través de un proceso que incluye comprender completamente el problema, identificar claramente los datos que van a usarse, las operaciones a realizarse y el resultado (salida) correcto. Dentro de este proceso, una parte muy importante es la creación de un algoritmo. Solo después de entender con claridad los datos y de escribir correctamente el algoritmo (pasos específicos para producir el resultado deseado) podemos pensar en codificar, es decir, en escribir el programa en un lenguaje de programación (como Pascal, Java o C++, entre otros). Desde este punto de vista, La programación es la traducción de un algoritmo a un lenguaje que pueda utilizar la computadora. 1.2.1 DEFINICIÓN DE ALGORITMO La ciencia de la computación es el estudio de los algoritmos. En ésta definición el concepto de algoritmo es fundamental. Por lo tanto, se debe definir qué es lo que se entiende por algoritmo en ciencia de la computación: Un algoritmo es un conjunto finito de instrucciones, libres de ambigüedades, que cuando se ejecutan efectúan una tarea particular. Además, todo algoritmo debe satisfacer los siguientes requisitos: ENTRADA. Cero o más conjuntos de datos se proporcionan desde el exterior. SALIDA. Al menos se debe producir una salida que muestre un resultado. DEFINITIVIDAD. Cada instrucción debe ser clara, comprensible y sin ambigüedades. FINITIVIDAD. En todos los casos, el algoritmo debe terminar en un número finito de pasos. EFECTIVIDAD. Cada instrucción debe ser lo suficientemente básica para que pueda ser efectuada por una persona utilizando solamente papel y lápiz. Resumiendo, en un algoritmo se tiene que: 1. Un algoritmo es la representación de la solución a un problema. 2. Después de la ejecución de cada instrucción siempre se deberá conocer la siguiente instrucción a ser ejecutada. 3. Debe haber un punto de inicio único y claramente definido, y uno o más puntos de terminación perfectamente especificados. 4. El algoritmo se compone de instrucciones cuyo significado debe ser claro y sin ambigüedades para la persona o máquina que lo ejecute. 1.2.2 TÉCNICAS DE REPRESENTACIÓN DE ALGORITMOS Hay varias técnicas para representar algoritmos. Algunas de ellas son: Utilizar un idioma humano, en nuestro caso, el español. Por ejemplo, para encontrar la suma de los primero n números enteros positivos, el algoritmo en español es el siguiente: 1. Obtener el valor de n. 2. La variable suma se inicializa con el valor cero. 3. La variable número se inicializa con el valor 1. 4. Repetir los pasos 5 y 6 mientras número sea menor o igual a n: 5. suma= suma + número 6. número= número + 1 7. Mostrar el valor de la variable suma. 8. Fin de algoritmo. Aunque el lenguaje humano es muy apropiada para representar las ideas iniciales de la solución de un problema, sobre todo si el propósito es comunicar estas ideas a otra persona, esta alternativa tiene desventajas obvias. Tiene muchas palabras y las oraciones no tienenninguna restricción en el vocabulario. Además, generalmente carecen completamente de relación con el lenguaje de programación que se va a utilizar posteriormente, lo cual dificulta la codificación del algoritmo para convertirlo en programa. Escribir el algoritmo directamente en un lenguaje de programación. Se podría pensar en tomar la posición opuesta al lenguaje humano, que sería escribir el algoritmo en algún lenguaje de programación, por ejemplo en C++. El algoritmo anterior que encuentra la suma de los primeros n números enteros positivos escrito en C++ es: /* PROGRAMA sumaNumeros Este programa suma los primeros n enteros positivos: 1+2+3+4+5+ … + n. */ #include<iostream> using namespace std; int n; int suma, numero; int main() { cout << “Hasta que numero (entero positivo) quieres sumar ? ”; cin >> n; suma= 0; numero= 1; while(numero <= n) { suma= suma + numero; numero++; } cout << "La suma de los primeros " << n << " enteros positivos es " << suma << endl; system(“pause”); return 0; } // fin de la función main Nuevamente se tienen desventajas muy claras. Al escribir en C++ se tienen consideraciones sintácticas (sobre cómo escribir correctamente las instrucciones) que no forman parte del proceso algorítmico. Consideraciones tales como el uso de palabras reservadas como int o cout, la colocación de los puntos y coma (;), la utilización de cabeceras include, etc. pertenecen a la fase de codificación en donde es obligatorio utilizar correctamente las reglas del lenguaje, pero no a la fase de solución del problema, cuya responsabilidad recae única y exclusivamente en la persona. 1.2.2.1 Diagramas de flujo Los diagramas de flujo son otra opción para representar algoritmos. Un diagrama de flujo es un conjunto de símbolos que en forma gráfica representan la solución a un problema. La forma de cada símbolo indica la clase de operación que representa. Generalmente se escribe dentro del símbolo una breve descripción de la operación que se va a realizar. La flecha que sale de un símbolo indica cual es la siguiente operación a ser realizada. El algoritmo en diagrama de flujo se ejecuta empezando por el óvalo de inicio, siguiendo las flechas y haciendo todas las operaciones indicadas. Se continúa así hasta llegar al óvalo de fin. Los seis símbolos básicos (no son los únicos) de un diagrama de flujo son: 1) PROCESAMIENTO. Este símbolo representa una o más instrucciones que tienen una función de procesamiento o manipulación de datos. Ejemplos son las operaciones aritméticas, las transferencias de valores entre variables o las comparaciones entre números. 2) DECISIÓN. Representa un punto en el programa donde exista una comparación y se deba tomar un proceso alternativo dependiendo del resultado de la comparación. Un ejemplo de comparación es averiguar si un valor es mayor que otro ( A > B ). 3) ENTRADA/SALIDA. Este símbolo indica cualquier función de un dispositivo de entrada o de salida que permitan obtener datos o mostrar resultados. Ejemplo de entrada es teclear datos; ejemplo de salida es mostrar información sobre la pantalla. 4) REPETICIÓN. Indica que un grupo de instrucciones de un algoritmo se van a ejecutar varias veces. 5) CONECTOR. Es un pequeño círculo que conecta dos partes de un diagrama de flujo que están físicamente separadas (por ejemplo, en hojas diferentes), pero que lógicamente una es la continuación de la otra. También la terminación de la estructura de decisión if..else. 6) TERMINAL. Indica inicio o terminación de un diagrama de flujo. El algoritmo para sumar los primeros n enteros positivos como diagrama de flujo es el siguiente: Observe que el algoritmo se construyó utilizando algunos de los símbolos básicos de un diagrama de flujo. 1.2.2.2 PSEUDOCÓDIGO Hay otra alternativa para representar algoritmos: los lenguajes algorítmicos, los cuales no son lenguajes humanos, aunque utiliza algunas palabras de ellos. Un lenguaje algorítmico es muy parecido a los lenguajes formales, es decir, a aquellos lenguajes inventados para comunicarse con las computadoras, tales como el FORTRAN, COBOL, BASIC, Pascal, C, C++, Java y muchos otros. Un tipo de lenguaje algorítmico, conocido como pseudocódigo, es muy utilizado para escribir algoritmos. Los pseudocódigos utilizan instrucciones de un lenguaje de programación, pero simplificadas. Sus reglas de sintaxis (forma de escribir correctamente una instrucción) son más flexibles que las del lenguaje de programación. El algoritmo para sumar los primeros n enteros positivos como pseudocódigo C++ es el siguiente: suma = 0 numero= 1 inicio fin While (numero <= n) numero = numero + 1 suma= suma + numero Obtener valor de n Imprimir suma /* ALGORITMO sumaNumeros Suma los primeros n enteros positivos: 1+2+3+4+5+ … + n. */ int n int suma, numero main() { cout << “Hasta que numero (entero positivo) quieres sumar ? ” cin >> n suma= 0 numero= 1 while(numero <= n) { suma= suma + numero numero++ } cout << “La suma de los primeros “ << n << “enteros positivos es ” << suma<< endl } // fin de la función main Comparando este pseudocódigo con el código C++ se puede observar que ambos son muy parecidos, pero el pseudocódigo no requiere de detalles. Por ejemplo, no se requiere escribir cabeceras #include o punto y coma (;) al final de cada instrucción. Ejercicio de competencias 1.4: Capacidad de análisis y redacción Observe y analice los algoritmos para sumar los n primeros números mostrados anteriormente como código C++ y como pseudocódigo y escriba una lista de las diferencias entre ellos que usted encuentre. 1.3 ALGORITMOS COTIDIANOS Los algoritmos se encuentran en todas las actividades humanas, ya que representan la solución a un problema. Este tipo de enfoque para resolver problemas tiene cientos de años de existencia. La palabra algoritmos se deriva del nombre del matemático persa del siglo IX, al-Khowarizmi. En la actualidad, algoritmo suele referirse a una solución ejecutable por una computadora. Encontramos algoritmos tanto en aplicaciones de negocios como científicas. En matemáticas es frecuente encontrar algoritmos para diversas operaciones, por ejemplo, para calcular números aleatorios, encontrar raíces cuadradas de un número o determinar si un valor es más grande que otro. Algunos algoritmos se utilizan con tanta frecuencia en varias actividades humanas que prácticamente son cotidianos, es decir se utilizan día con día. Algunos de ellos son: ALGORITMOS DE BÚSQUEDA Una gran cantidad de tiempo de computadora se destina a buscar. Es decir, a tratar de localizar un dato o una información en particular. Cuando un empleado bancario teclea el número de cuenta de un cliente para localizar su cuenta, un programa de computadora realiza la búsqueda. De igual manera, cuando una computadora juega ajedrez, se deben realizar una multitud de búsquedas para encontrar el movimiento óptimo. Hay varios algoritmos para realizar búsquedas, y cada uno de ellos recibe un nombre que lo identifica. Dos de ellos muy populares son la búsqueda secuencial y la búsqueda binaria. ALGORITMO DE ORDENAMIENTO Ordenar una sucesión de datos significa ponerla en algún orden específico: orden ascendente (de menor a mayor) o en orden descendente (de mayor a menor). Por ejemplo, un directorio telefónico tiene ordenados los nombres alfabética y ascendentemente (de la A a la Z). Una ventaja de usar un conjunto de datos ordenados es que es más fácil encontrar un dato específico. Tan sólo considere la dificultad de tratar de encontrar el número telefónico de un amigo en un directoriono ordenado. Al igual que con los algoritmos de búsqueda, se han diseñado cientos de algoritmos de ordenamiento. Decidir que algoritmo se debe usar depende de muchos factores, entre otros, el tamaño de los datos y su representación. Entre los algoritmos de ordenamiento más conocidos están el ordenamiento burbuja y la inserción por orden. ALGORITMOS RECURSIVOS Una función recursiva es una función que se invoca a sí misma. Un algoritmo recursivo es un algoritmo que contiene una función recursiva. La recursión es una forma poderosa y elegante de resolver una clase amplia de problemas. Un problema de esta clase se resuelve mediante una técnica de divide y vencerás en la que el problema se descompone en subproblemas del mismo tipo que el problema original. Cada subproblema a su vez, se descompone aún más hasta que el proceso produce subproblemas que se pueden resolver de manera directa (solución trivial). Un ejemplo es el algoritmo recursivo (también hay uno iterativo) del factorial de un número. En este caso la función recursiva es n!= n ∙ (n-1)! En este caso el problema original (calcular n!) se descompone en subproblemas cada vez más sencillos: calcular (n-1)!, calcular (n-2)! Y así sucesivamente hasta llegar a calcular 0!, la cual es una solución trivial porque 0!= 1. Por ejemplo el factorial de 3 se desarrolla así: 3!= 3∙ (3-1)! = 3∙ 2! 2!= 2∙ (2-1)! = 2∙ 1! 1!= 1∙ (1-1)! = 1∙ 0! 0!= 1 Ahora se sustituye en orden inverso: 0!= 1 1!= 1∙ 1 = 1 2!= 2∙ 1 = 2 3!= 3∙ 2 = 6 El resultado es que el factorial de 3 es 6. 1.4 BREVES PRÁCTICAS DE ESCRITURA DE ALGORITMOS La computadora puede ejecutar cualquier tipo de problema, siempre y cuando se le proporcione un conjunto completo de instrucciones que pueda entender. Como ya se mencionó, a tal conjunto de instrucciones, en su etapa inicial, se le conoce como algoritmo. El algoritmo se convertirá en programa cuando sus instrucciones sean traducidas a sus instrucciones equivalentes en un lenguaje de programación. Para reafirmar algunos conceptos, entre ellos el de que todo problema debe ser resuelto por una persona, a continuación se harán unas breves prácticas de programación en su etapa de algoritmo. Por simplicidad, los algoritmos se escribirán en nuestro lenguaje humano: el español. De esta manera, nuestra atención se enfocará en la solución del problema y no en cómo se escribe en un determinado lenguaje de programación. Práctica 1. Escribir un algoritmo que calcule el promedio final de cuatro calificaciones parciales. La computadora tiene la capacidad (tiene los circuitos electrónicos necesarios) de realizar el cálculo pedido. Pero no tiene idea de los significados que nosotros otorgamos a las palabras. No “entiende” que es una calificación o qué es un promedio. Por tanto, es labor de una persona encontrar las operaciones, y su secuencia correcta, necesarias para cumplir con la tarea que se quiere realizar (en este caso, calcular un promedio). Es decir, tiene que encontrar la solución que se requiere y expresarla en una forma apropiada: como un algoritmo. Inicialmente, el algoritmo puede escribirse en un idioma humano, en nuestro caso en español. Entonces, el algoritmo pedido puede ser el siguiente: 1. Obtener las cuatro calificaciones. 2. Sumar las cuatro calificaciones. 3. Dividir la suma entre el número de calificaciones (cuatro). 4. Mostrar el resultado de la división (que es el promedio final). 5. Fin de algoritmo. Esta lista de instrucciones es el algoritmo que calcula el promedio final. Es importante hacer notar que en esta etapa no fue necesaria la intervención de la computadora. Lo que se requirió fue una persona deseosa de resolver el problema. Una persona que hiciera uso de sus capacidades mentales para analizar el problema e imaginarse la manera de resolverlo. Desde luego que en etapas posteriores sí se tendrá que considerar a la computadora y al lenguaje de programación que puede entender, por lo que el algoritmo sufrirá los cambios necesarios hasta convertirse en un programa. Una vez que se ha obtenido el algoritmo lo puede ejecutar cualquier persona (posteriormente, cualquier computadora). Considerado lo anterior, la práctica 1 consiste en que usted siga las instrucciones del algoritmo anterior y calcule el promedio final de las calificaciones 87, 76, 93, 84 (usted puede cambiar estos valores para calcular diferentes promedios). Práctica 2. Escribir un algoritmo que calcule el promedio final de cuatro calificaciones parciales para n estudiantes. Cada estudiante se identifica por su número de control. La salida del algoritmo debe mostrar para cada estudiante su número de control y su promedio. Tenemos en esencia el mismo problema de la práctica 1, pero ahora se pide que el cálculo del promedio se repita n veces, una vez por cada estudiante. Esta pequeña modificación en el enunciado del problema nos obliga a modificar la lógica que utilizamos anteriormente para incorporar el concepto de repetición o lazo. Después de analizar esta nueva versión del problema se obtuvo el siguiente algoritmo: 1. Obtener el número n de estudiantes. 2. Repetir n veces los pasos 3 al 7: 3. Obtener el número de control del estudiante. 4. Obtener las cuatro calificaciones 5. Sumar las cuatro calificaciones. 6. Dividir la suma entre el número de calificaciones (cuatro). 7. Mostrar el número de control y el resultado de la división (promedio final). 8. Fin de algoritmo. La práctica 2 consiste en que usted siga las instrucciones del algoritmo y calcule el promedio final de los n estudiantes y muestre la salida pedida en el paso 7. Práctica 3. Escribir un algoritmo que calcule el promedio final de cuatro calificaciones parciales para n estudiantes. Cada estudiante se identifica por su número de control. La salida del algoritmo debe mostrar para cada estudiante su número de control y su promedio. El enunciado es exactamente igual que el de la práctica 2, pero alguien proporcionó el siguiente algoritmo: 1. Obtener el número n de estudiantes. 2. Obtener el número de control del estudiante. 3. Repetir n veces los pasos 4 al 7: 4. Obtener las cuatro calificaciones 5. Sumar las cuatro calificaciones. 6. Dividir la suma entre el número de calificaciones (cuatro). 7. Mostrar el número de control y el resultado de la división (promedio final). 8. Fin de algoritmo. La práctica 3 consiste en que usted siga las instrucciones del algoritmo y escriba exactamente lo que hace, que compare los resultados de las prácticas 2 y 3 y que determine cuál de las dos versiones es la correcta (en caso de que alguna lo sea). Observe que en estos algoritmos no nos hemos preocupado por saber cómo se escriben las instrucciones en un lenguaje de programación. Por ejemplo, cuando escribimos Repetir n veces los pasos 4 a 7, no nos preocupa si esta idea de Repetir se escribe como while o como for en un cierto lenguaje de programación. En esta primera etapa de solución del problema (etapa de creatividad) estamos preocupados solamente con generar las ideas correctas y en expresarlas en el idioma que dominamos: el español. Práctica 4. Escribir un algoritmo que multiplique los primero 5 números enteros positivos. Una versión de este algoritmo es la siguiente: 1. La variable producto se inicializa con el valor cero. 2. La variable número se inicializa con el valor 1. 3. Repetir los pasos 4 y 5 mientras número sea menor o igual a 5: 4. producto= producto x número 5. número= número + 1 6. Mostrar el valor de la variable producto. 7. Fin de algoritmo. La práctica 4 consiste en que usted verifique si este algoritmo es correcto o no y escriba a detalle qué es lo que hizo para hacer la verificación. Las práctica 5, 6 y 7 consisten en que usted escriba algoritmossimilares a los que se presentan en las prácticas anteriores. Práctica 5. Escribir un algoritmo que sume los primero n números enteros positivos. Práctica 6. Se tiene el nombre de n agentes de ventas, el kilometraje inicial y el final de su automóvil (después de un viaje), como en el ejemplo siguiente: Nombre kilometraje inicial kilometraje final Pedro Ríos 13505 13930 Escriba un algoritmo que imprima el nombre del vendedor, el kilometraje total recorrido y sus viáticos ($1.50 por kilometro). Práctica 7. Ejecute manualmente el algoritmo de la práctica 6 (viáticos de agentes de ventas) para los tres agentes siguientes: Nombre kilometraje inicial kilometraje final Pedro Ríos 13505 13930 Luis Ramírez 25678 25897 Salvador Santana 18123 18792 Ejercicio de competencias 1.5: Capacidad de resolver problemas Escriba un diagrama de flujo para cada uno de los algoritmos de las prácticas anteriores. 1.5 PROGRAMAS Por lo leído hasta este punto, debe haber quedado establecido que todo problema debe ser resuelto por un ser humano, y la solución (algoritmo), una vez encontrada, puede ser ejecutada por cualquier otra persona, e incluso por una máquina. La máquina a la que nos referimos es la maravilla moderna de la electrónica: la computadora digital. Actualmente ya es posible delegar a esta máquina muchas de las actividades intelectuales que en su momento eran exclusivas del ser humano. Ahora las computadoras pueden ejecutar la solución a prácticamente cualquier problema planteado por la imaginación de cualquier persona. En computación, a la solución del problema también se le llama algoritmo. Pero antes de que una computadora pueda empezar a ejecutar la solución a un problema, esta debe ser traducida a un lenguaje que pueda ser entendido por la máquina. A la solución de un problema traducido a un lenguaje de computadora le llamamos código o programa. Los algoritmo y programas de ejemplo de este texto incluirán todas las etapas del ciclo del desarrollo de software para que el alumno se dé cuenta que para escribir un algoritmo o programas correctos y eficientes no es suficiente con tomar papel y lápiz y empezar a escribir instrucciones. Es necesario un trabajo previo lógico, cuidadoso y sistemático. 1.5.1 DEFINICIÓN DE LENGUAJE Un lenguaje es un medio de comunicación. Incluye un conjunto de reglas que permiten utilizarlo correctamente. Sus reglas de sintaxis indican cómo escribir correctamente las palabras del lenguaje; las reglas de semántica se refieren al significado de esas palabras. Los lenguajes se pueden dividir en dos grandes grupos: los lenguajes naturales y los lenguajes formales. Los lenguajes naturales son los lenguajes que utilizamos los humanos, como el español, el inglés, el italiano, o el alemán. Los lenguajes formales son aquellos inventados para comunicarse con las computadoras, tales como el FORTRAN, COBOL, BASIC, Pascal, C, C++, Java, y muchos otros. Los lenguajes formales son los que utilizamos para escribir programas de computadora. Se dividen en lenguajes de bajo nivel y lenguajes de alto nivel. Los lenguajes de bajo nivel son el lenguaje máquina y el lenguaje ensamblador. 1.5.2 LENGUAJES DE BAJO NIVEL El lenguaje máquina es el único que entiende la computadora. Está formado con instrucciones que contienen exclusivamente ceros y unos. Por ejemplo: “he aquí un fragmento de un programa en lenguaje máquina para una computadora hipotética: 0000010010000000 0000000010000001 0000010110000000 0000111100000000 Incluso si dijéramos que este programa se diseñó para sumar el contenido de las localidades de memoria 128 y 129, luego colocar la suma en la dirección de memoria 128 y sobreescribir lo que esté en ella, después de lo cual se detiene, probablemente pensaría que estas instrucciones son tan comprensibles como un texto jeroglífico.” (Rick Decker-Stuart Hirshfield. Máquina analítica. Introducción a las ciencias de la computación. Ed. Thomson. México, 2001.) Como se puede ver en el ejemplo anterior, un programa en lenguaje máquina es difícil de leer y de comprender porque requiere que el programador conozca perfectamente las características del hardware de la computadora. Por esta razón los programadores buscaron una nueva forma más fácil de escribir programas. Inventaron un nuevo lenguaje llamado ensamblador. El lenguaje ensamblador ocupa un escalón arriba del lenguaje máquina, pero sigue siendo un lenguaje de bajo nivel porque todavía requiere un conocimiento detallado del hardware. Pero un lenguaje ensamblador usa nemónicos en lugar de ceros y unos para representar las instrucciones. Un nemónico es una abreviación alfabética que se usa para ayudar a recordar. Por ejemplo, en lugar de usar una combinación de ceros y unos para representar la operación de guardar un valor en una localidad de memoria, el programador puede usar el nemónico STO, que es una abreviación de la palabra inglesa storage. Siguiendo con el ejemplo máquina anterior que suma dos localidades de memoria, el programa equivalente en ensamblador sería el siguiente: LOD 128 ADD 129 STO 128 HALT Aunque los lenguajes ensambladores proporcionan una manera más fácil y eficiente de programar que los lenguajes máquina, todavía mantiene control sobre el funcionamiento interno de la computadora al nivel más básico. Además, antes de que una computadora pueda correr un programa en lenguaje ensamblador debe ser traducido a lenguaje máquina, que como se dijo anteriormente, es el único que entiende la computadora. Comparado con los lenguajes de alto nivel, los lenguajes de bajo nivel (máquina y ensamblador) son tediosos, difíciles y muy propensos a errores. 1.5.3 LENGUAJES DE ALTO NIVEL Un lenguaje de alto nivel contiene instrucciones formadas por palabras de un lenguaje humano (Inglés, Español, etc.) y notación matemática. Los lenguajes de alto nivel no requieren que el programador tenga un conocimiento detallado acerca de las operaciones internas de una computadora (hardware.) Debido a que se parecen mucho al lenguaje humano, los lenguajes de alto nivel son mucho más fáciles de aprender y usar que los de bajo nivel. En general, la programación de alto nivel requiere de menos tiempo y esfuerzo porque los errores son más fáciles de evitar y de corregir. Los lenguajes de alto nivel se diseñan para que sean independientes de la computadora. Así, pueden ser transportados de computadora a computadora y corridos sin ningún cambio o con cambios mínimos. Como resultado, actualmente la abrumadora mayoría de los lenguajes que se usan para programación son de alto nivel, dejándose los de bajo nivel para aplicaciones muy especializadas. A veces, algunas porciones de un programa requieren más velocidad o eficiencia de la que puede ser lograda con un lenguaje de alto nivel. Para estos casos, la mayoría de los lenguajes de alto nivel permiten incluir programas en lenguaje ensamblador para acelerar su ejecución y mejorar sus capacidades. Un lenguaje de alto nivel debe ser traducido a lenguaje máquina antes de que la computadora lo pueda ejecutar. Hay dos tipos de programas traductores de lenguaje que se utilizan frecuentemente para traducir lenguajes de alto nivel: compiladores e interpretes. Un compilador traduce un programa completo, llamado el código fuente, a lenguaje máquina de una sola vez. Una vez que ya está traducido, se almacena en un formato legible para la máquina, llamado el códigoobjeto. El código objeto puede ser ejecutado inmediatamente por la computadora en cualquier momento. El código fuente permanece intacto después de la traducción y puede ser modificado y actualizado si se requiere y después recompilado a código objeto antes de ser corrido. Un interprete traduce un programa a lenguaje máquina una línea a la vez, ejecutando cada línea del programado después de que fue traducida. En la mayoría de los interpretes, el formato legible para la máquina no se almacena en la memoria principal o en almacenamiento secundario. Por tanto, el programa debe ser interpretado cada vez que se vaya a ejecutar. Siguiendo con el ejemplo del programa que suma dos números, su código en lenguaje de alto nivel se ve así: int acumulador; int x, y; x= 6; y= 9; acumulador= x; acumulador = acumulador + y; x= acumulador; Actualmente, la gran mayoría de los programadores utilizan lenguajes de alto nivel. 1.5.4 EL LENGUAJE C++ C++ fue desarrollado a principios de la década de los 1980’s, cuando Bjarne Stroustrup, científico de AT&T, usó sus conocimientos en lenguajes de simulación para crear un lenguaje de programación orientado a objetos. Una característica central de los lenguajes de simulación es que modelan situaciones de la vida real. Esta orientación a objetos, la cual era ideal para objetos gráficos presentados en pantalla como rectángulos y círculos, se combinó con características del lenguaje C para formar C++. Por tanto, C++ conservo el conjunto extenso de capacidades estructuradas y de procedimientos proporcionadas por C, pero agregó su propia orientación a objetos para convertirse en un verdadero lenguaje de programación de uso general. Como tal, C++ puede usarse desde programas interactivos simples, hasta programas de ingeniería y científicos sofisticados y complejos, dentro del contexto de una estructura en verdad orientada a objetos. (Gary J. Bronson. C++ para ingeniería y ciencias) 1.6 PROGRAMAS EN C++ En esta sección se empezarán a presentar los conceptos e instrucciones básicas para escribir programas completos en el lenguaje de programación C++. 1.6.1 TIPOS DE DATOS Una computadora es una herramienta muy poderosa para almacenar, procesar y propagar información. Aunque para la computadora la información se presenta como una secuencia de ceros y unos, para nosotros es una serie de símbolos o datos. En computación es necesario distinguir entre datos e información. Datos son simplemente cadenas de caracteres. Por ejemplo, 5-27-85 o JRR-3679 son datos. Sin embargo, los datos se convierten en información cuando se ligan a un contexto. Por ejemplo, 5-27-85 podría ser un número telefónico, y JRR-3679 podría ser una clave de acceso a un sistema de computación. Resumiendo, la computadora es una máquina que opera sobre datos; la gente usa la información. Así, la computadora toma datos a la entrada, los procesa (calcula, ordena, compara, …), y genera una salida en forma tal que tenga sentido para una persona; es decir, produce información a partir de datos. Igual que para una persona, los datos no son iguales para una computadora. Las personas distinguimos intuitivamente los datos, y los clasificamos por los menos en dos grandes grupos: numéricos y alfabéticos. Del mismo modo, la computadora clasifica los datos que puede manipular y los divide en diferentes tipos de datos. Un tipo de datos le proporciona a la computadora información esencial sobre cómo almacenar y manipular a ese dato. Entre la información importante que proporciona un tipo de dato está el rango de valores que pertenecen a ese tipo, y las operaciones que se pueden hacer sobre esos valores. Por ejemplo, cuando la computadora utiliza dos bytes para representar el tipo de dato entero su rango de valores va desde -32768 hasta +32767; y el tipo de operaciones que se pueden realizar sobre estos números incluyen a las operaciones aritméticas, y algunas otras de tipo matemático, como elevar a una potencia o extraerles raíz cuadrada. La siguiente figura representa los tipos de datos que se utilizarán en este curso. TIPO DE DATO NUMÉRICO CARÁCTER CADENA DE CARACTERES LÓGICO O APUNTADOR BOOLEANO entero (int) real float double A continuación se explican cada uno de estos tipos de datos. 1.6.1.1 DATOS NUMÉRICOS Hay dos tipos: enteros y reales. Los datos numéricos enteros se representarán con la abreviatura de entero (integer) en inglés, int. Los enteros son los números que utilizamos para contar. Son números completos sin parte decimal, y sus valores pueden ser negativos, cero o positivos. Todos los siguientes son números enteros: 28 1600 -89 +12345 0 -29768 3 -28 30876 +16 31234 Los datos reales se subdividen en flotantes y en dobles; respectivamente float y double. Son números que tienen una parte entera, un punto decimal y una parte fraccionaria. Pueden ser positivos o negativos, cero incluido. Ambos float y double pueden utilizarse en cualquier operación que requiera números reales. La diferencia entre ellos es que el rango de valores para el tipo float es la mitad de la del tipo double. Es decir, el tipo double utiliza el doble de memoria que el tipo float y, por tanto, puede almacenar valores más grandes. Todos los siguientes son números reales: 28.98 458908.987 0.0 31234.0 +32198767.988776 -0.00000564 456.09 1.6.1.2 DATOS CARÁCTER Un dato del tipo carácter (char) es un solo símbolo perteneciente al código de computación que utilice la computadora (ASCII, Unicode, etc.). El carácter debe encerrarse entre comillas simples (‘). Generalmente, los símbolos básicos que acepta una computadora son los 256 del código ASCII, que incluyen letras (mayúsculas y minúsculas), dígitos decimales (del 0 al 9) y un conjunto de símbolo de puntuación y control (por ejemplo ; % # @ ¿ : } = . / ¡ espacio, y muchos más). Ejemplos de datos del tipo carácter son: ‘g’ ‘#’ ‘(’ ‘{’ ‘H’ ‘;’ ‘7’ ‘s’ ‘9’ ‘?’ ‘$’ Como se observa, el tipo de dato char es un solo símbolo encerrado entre comillas simples. Por tanto, es en este tipo de dato es un error escribir dos o más símbolos entre comillas simples: ‘no’ ‘B ’ ERROR. No son valores legales para el tipo de dato char. En estos dos últimos ejemplos, ambos no son del tipo char porque incluyen más de un carácter entre las comillas simples: ‘no’ tiene dos letras; ‘B ’ tiene 6 caracteres: la letra B más cinco espacios, que también son caracteres. 1.6.1.3 DATOS CADENA DE CARACTERES Una cadena de caracteres (string) es una secuencia de símbolos (que puede incluir al espacio) que se usa para aplicaciones no numéricas. Una cadena puede contener cualquier símbolo. Llamado carácter que este definido en el código de caracteres que utiliza la computadora (generalmente ASCII o Unicode. Este último incluye los caracteres del primero.) No hay un solo código, por lo que el conjunto de caracteres de una computadora puede ser diferente al de otra. Sin embargo, se puede asegurar que cualquier computadora puede manipular los caracteres alfabéticos (A..Z, a..z), los dígitos decimales (0..9) y un conjunto variable de caracteres especiales (espacio, %, *, ], $, :, /, @, etc.). Una cadena de caracteres se escribe dentro de comillas dobles (“ ”) que son los delimitadores que indican el principio y el final de la cadena. En general, una cadena puede contener hasta 256 caracteres, aunque este máximo puede variar de computadora en computadora. Ejemplos de cadenas son los siguientes: “Este en un ejemplo de cadenade caracteres” “cadena corta” “ cadena con espacios iniciales y finales. Los espacios se respetan ” “ cadena con números 2390 y símbolos no alfabéticos *&$#@?” Cabe mencionar que C++ considera a string como una clase, por lo cual hay objetos string. 1.6.1.4 DATOS LÓGICOS O BOOLEANOS El tipo lógico está formado por dos valores constantes: falso y verdadero, ordenados de modo que falso < verdadero. Un uso típico de los datos lógicos es en las comparaciones entre dos valores, donde se desea determinar si la comparación es falsa o verdadera (¿es Luis mayor que Pedro?), es decir, se desea determinar el valor booleano de la comparación. Para comparar valores de deben utilizar los operadores relacionales: OPERADOR RELACIONAL SIGNIFICADO > mayor que < menor que == igual >= mayor o igual <= menor o igual != desigual o diferente Los operadores relacionales se pueden usar con todos los tipos de datos, pero en una comparación particular, ambos valores deben de ser del mismo tipo. Es decir, se deben comparar enteros con enteros, reales con reales, cadenas con cadenas, etc. Los siguientes son ejemplos de comparaciones booleanas: Comparación simple valor booleano 5 > 8 falso (F) 32.09 <= 32.89 verdadero (V) ‘N’ > ‘R’ falso “mario” != “mario” falso “navarro” > “nava” verdadero “me gusta el rojo” <= “me gusta el verde” falso Los tres últimos ejemplos contienen cadenas (string). La manera en que se evalúan este tipo de comparaciones es la siguiente: La evaluación compara carácter por carácter, en este ejemplo, letra por letra, empezando con el primero y continuando con los siguientes hasta que encuentra una diferencia entre ellos o hasta que ya no haya más caracteres. En este momento se decide el valor booleano de la comparación. Entonces, en la comparación “mario” != “mario” Se inicia comparando la primera letra de cada cadena: m de la primera cadena con m de la segunda. Son iguales, no hay decisión Continuando con las siguientes letras: a de la primera cadena con a de la segunda. Son iguales, no hay decisión r de la primera cadena con r de la segunda. Son iguales, no hay decisión i de la primera cadena con i de la segunda. Son iguales, no hay decisión o de la primera cadena con o de la segunda. Son iguales, pero como es la última letra, se llega a una decisión considerando que la comparación es: o != o lo cual es falso porque son iguales. Entonces la comparación completa “mario” != “mario” tiene el valor booleano falso En la comparación “navarro” > “nava” la evaluación es: Se inicia comparando la primera letra de cada cadena: n de la primera cadena con n de la segunda. Son iguales, no hay decisión Continuando con las siguientes letras: a de la primera cadena con a de la segunda. Son iguales, no hay decisión v de la primera cadena con v de la segunda. Son iguales, no hay decisión a de la primera cadena con a de la segunda. Son iguales, no hay decisión r de la primera cadena con espacio de la segunda. Son diferentes, se llega a una decisión considerando que la comparación es: r > espacio lo cual es verdadero porque cualquier letra es mayor al espacio, de acuerdo a su orden en el código que usa la computadora (ASCII o Unicode)es. Entonces la comparación completa “navarro” > “nava” tiene el valor booleano verdadero Observe que cuando una cadena es más corta que otra, en este caso nava tiene menos letras que navarro, se considera que el carácter que inmediatamente sigue al último de la cadena más corta es el carácter espacio (“”). Se deja como ejercicio que el alumno verifique el valor booleano de l comparación “me gusta el rojo” <= “me gusta el verde” OPERADORES LÓGICOS Además de los operadores relacionales, hay tres operadores lógicos que se pueden aplicar solamente a valores booleanos para dar un resultado booleano (falso o verdadero): OPERADOR LÓGICO SIGNIFICADO AND (&&) conjunción lógica y (operador binario) OR (||) disjunción lógica o (operador binario) NOT (!) negación lógica no (operador unitario) Los valores de los operadores lógicos se definen en las llamadas tablas de verdad, que se presentan a continuación: P Q P && Q P || Q P !P V V V V V F V F F V F V F V F V F F F F En estas tablas V es verdadero y F es falso. P y Q son condiciones booleanas simples, y cada una de ellas tiene su propio valor F o V. La regla para la tabla AND (&&) indica que si ambas condiciones simples que forman la condición compuesta son verdaderas, entonces toda la condición compuesta es verdadera. En caso contrario, es falsa. La regla para la tabla OR (||) indica que si por lo menos un condición simple de las que forman la condición compuesta es verdadera, entonces toda la condición compuesta es verdadera. En caso contrario, es falsa. La regla para la tabla NOT (!) indica que si una condición es verdadera, entonces su negación es falsa; si es falsa, entonces su negación es verdadera. Es decir, una negación cambia el valor booleano de su condición (de verdadero a falso y viceversa). PRECEDENCIA DE OPERADORES RELACIONALES Y LÓGICOS para poder interpretar correctamente las comparaciones simples o compuestas se requiere seguir un criterio de prioridad de operadores es decir, cuál operador se evalúa primero que otro. La siguiente tabla muestra la precedencia o jerarquía entre los operadores relacionales y lógicos. NIVEL OPERADOR SIGNIFICADO PRECEDENCIA 1 ! NOT (NO o negación) mayor 2 < <= > >= menor, menor o igual, mayor, mayor o igual 3 == != igual, diferente 4 && AND (Y lógico o conjunción) 5 || OR ( O lógico o disjunción) menor A excepción del operador negación (not), que se evalúa de derecha a izquierda en una expresión, todos los demás operadores en el mismonivel tienen la misma prioridad, por lo que se evalúan de izquierda a derecha. Con los operadores lógicos se pueden formar comparaciones (también se les puede llamar condiciones) compuestas (dos o más comparaciones simples unidas por operadores relacionales): Comparación compuesta valor booleano 1. (15 >= 8) && (6 > 4) V 2. (13.5 < 18.9) || (20 = 14) V 3. (10 > 12) && (9 > 6) && !(3> 5) F 4. ((‘f’ < ‘h’) || (25 <= 16)) && (“Tomas > Tovar”) F En la comparación compuesta 1, las dos comparaciones simples están unidas por un AND. Como ambas comparaciones son verdaderas, toda la comparación compuesta es verdadera. En la comparación 2, las comparaciones simples están ligadas por un OR. Como al menos una de ellas es verdadera (la primera), toda la comparación compuesta es verdadera. La comparación 3 usa dos AND para unir a sus tres condiciones simples. Como la primera es falsa, toda la condición compuesta es falsa, sin importar que las dos siguientes sean verdaderas. En la comparación 4 el operador lógico principal es AND, que une a una condición compuesta que tiene un OR y a una condición simple. La condición OR es verdadera, pero la condición simple es falsa; por tanto, toda la condición compuesta es falsa. Las condiciones compuestas tienen varias aplicaciones en programación. Una de ellas es para evaluar las condiciones booleanas que controlan a las instrucciones de decisión y de repetición (temas que se verán en la unidad II Estructuras de control). Algunos ejemplos son los siguientes: 1. Se quiere averiguar si la calificación que se proporciona a un programa esta en el rengo 0 a 100. La condición compuesta correspondiente que utiliza un operador lógico AND (&&) es: (calificación>= 0) && (calificacion <= 100) Si la calificación está en el rango mencionado (por ejemplo 96, 0, 34, 100, etc.) el valor booleano de la condición compuesta debe ser verdadero (true). Si no lo està, el valor es falso (false). a) Suponiendo que la calificación es 85 la ejecución de esta condición procede así: Primero se evalua la primera condición simple: (85 >= 0) Su valor booleano es verdadero. Después se avalua la segunda condición simple: (85 <= 100) Su valor booleano es verdadero. Ahora se evalúan los valores booleanos unidos por el operador lógico AND: (verdadero && verdadero) su valor booleano es verdadero La conclusión es que 85 sí está en el rango 0 a 100. b) Suponiendo que la calificación es -79 la ejecución de esta condición procede así: Primero se evalua la primera condición simple: (-79 >= 0) Su valor booleano es falso. Después se avalua la segunda condición simple: (-79 <= 100) Su valor booleano es verdadero. Ahora se evalúan los valores booleanos unidos por el operador lógico AND (&&): (falso && verdadero) su valor booleano es falso La conclusión es que -79 no está en el rango 0 a 100. 2. Se quiere saber si al lanzar tres dados a la vez se obtiene un 6 en cada uno de ellos. La condición compuesta correspondiente que utiliza operadores lógicos AND (&&) es: (dado1== 6 && dado2== 6 && dado3== 6) a) Suponiendo que la dado1= 6, dado2= 6 y dado3= 6 la ejecución de esta condición procede así: Primero se evalua la primera condición simple: (6 == 6) Su valor booleano es verdadero. Después se avalua la segunda condición simple: (6== 6) Su valor booleano es verdadero. Después se avalua la tercera condición simple: (6== 6) Su valor booleano es verdadero. Ahora se evalúan los valores booleanos unidos por el operador lógico AND: (verdadero && verdadero && verdadero) su valor booleano es verdadero La conclusión es que todos los dados muestran un 6. b) Suponiendo que la dado1= 6, dado2= 4 y dado3= 6 la ejecución de esta condición procede así: Primero se evalua la primera condición simple: (6 == 6) Su valor booleano es verdadero. Después se avalua la segunda condición simple: (6== 4) Su valor booleano es falso. Después se avalua la tercera condición simple: (6== 6) Su valor booleano es verdadero. Ahora se evalúan los valores booleanos unidos por el operador lógico AND: (verdadero && falso && verdadero) su valor booleano es falso La conclusión es que no todos los dados muestran un 6. 1.6.1.5 DATOS APUNTADOR Este tipo de dato se emplea principalmente con las estructuras de datos (listas ligadas, colas, árboles, etc.). Un apuntador almacena (apunta hacia) la dirección de una localidad de memoria de la computadora que a su vez almacena la información que se desea accesar. Por ejemplo, si un apuntador p almacena la dirección de una variable x, se dice que “p apunta a x”. Cuando se declara una variable, el compilador reserva un espacio de memoria para ella y asocia el nombre de esta a la dirección de memoria donde comienzan los datos de esa variable. Las direcciones de memoria se suelen describir como números en hexadecimal (números formados por los dígitos del 0 al 9 y por las letras de la A a la F). El tipo de dato apuntador se emplea principalmente con las estructuras de datos: listas ligadas, colas, árboles, etc., que se estudian en la materia del mismo nombre, por lo que no se utilizará en este curso. En apuntadores se usan dos operadores ( * y &): * (asterisco). Permite declarar a una variable como un apuntador. Ejemplos: int *ptr1; // Apuntador a un dato de tipo entero (int) char *cad1, *cad2; // Dos apuntadores a datos de tipo carácter (char) double *ptr2; // Apuntador a un dato de tipo real (double) & (ampersand. No confundirlo con el operador lógico AND). Permite referenciar una variable. Es decir, permite obtener la dirección donde está almacenada una variable. Referenciación. Es la obtención de la dirección de una variable. Ejemplo: el siguiente programa utiliza el operador (*) para declarar una variable de tipo apuntador, y el operador (&) que obtiene la dirección en memoria de la variable. /* PROGRAMA datoApuntador Muestra los operadores * y & de los apuntadores AUTOR: ing. Jose Rodriguez Ruiz */ #include<iostream> using namespace std; int y= 34; // declaración de una variable entera con valor inicial 34 int *p; // declara a p como un apuntador a una variable entera int main() { p= &y; // el apuntador p toma la direcciòn en memoria de la variable x cout<< "El valor de la variable y es: " << y << endl; cout<< "La dirección de x en hexadecimal es: " << &y << endl; cout<<"La variable x esta en la direccion entera: "<< (int)p<<endl<< endl; system("pause"); return 0; } // fin de main La salida de este programa es: Debe quedar claro que este valor puede variar durante cada ejecución del programa, ya que se pueden reservar distintos espacios de memoria durante cada ejecución. 1.7 VARIABLES, NOMBRES DE VARIABLES, EXPRESIONES Y CONSTANTES Una variable es un objeto que puede tomar diferentes valores, uno a la vez. Pero en computación se entiende por variable un lugar de la memoria de la computadora que se identifica por un nombre y que puede almacenar diversos valores, uno a la vez. Por ejemplo, la variable area (en computación no se utilizan acentos) se puede
Compartir