Upload
paul-sanchez
View
212
Download
0
Embed Size (px)
Citation preview
8/17/2019 20102TTT103IC02T106
1/170
8/17/2019 20102TTT103IC02T106
2/170
Algoritmo y Estructura de Datos I
1
UNIVERSIDAD TECNOLÓGICA DEL PERÚ Vicerrectorado de Investigación
Algoritmo y Estructura de Datos I
TINS Básicos Ingeniería de Telecomunicaciones
TEXTOS DE INSTRUCCIÓN BÁSICOS (TINS) / UTP
Lima ‐ Perú
8/17/2019 20102TTT103IC02T106
3/170
Algoritmo y Estructura de Datos I
2
© Algoritmo
y Estructura
de
Datos
I
Desarrollo y Edición: Vicerrectorado de Investigación Elaboración del TINS: Ing. Carlos Lon Kan Prado Diseño y Diagramación: Julia Saldaña Balandra Soporte académico: Instituto de Investigación Producción: Imprenta Grupo IDAT
Queda
prohibida
cualquier
forma
de
reproducción,
venta,
comunicación
pública
y
transformación
de
esta
obra.
8/17/2019 20102TTT103IC02T106
4/170
Algoritmo y Estructura de Datos I
3
“El presente material contiene una compilación de obras de Algoritmo I publicadas lícitamente, resúmenes de los temas a cargo del profesor; constituye un material auxiliar de enseñanza para ser empleado en el desarrollo de las clases en nuestra institución.
Éste material es de uso exclusivo de los alumnos y docentes de la Universidad Tecnológica del Perú, preparado para fines didácticos en aplicación del
Artículo 41
inc.
C
y el
Art.
43
inc.
A.,
del
Decreto
Legislativo
822,
Ley
sobre
Derechos de Autor”.
8/17/2019 20102TTT103IC02T106
5/170
Algoritmo y Estructura de Datos I
4
8/17/2019 20102TTT103IC02T106
6/170
Algoritmo y Estructura de Datos I
5
Presentación
El presente texto elaborado en el marco de desarrollo de la Ingeniería, es un material de ayuda instruccional, en la Carrera de Ingeniería de Telecomunicaciones, para la Asignatura de Algoritmos y Estructura de Datos I.
Plasma la iniciativa institucional de innovación de la enseñanza‐aprendizaje educativo universitario, que en acelerada continuidad promueve la producción de materiales educativos, actualizados en concordancia a las exigencias de estos tiempos.
Esta primera edición apropiadamente recopilada, de diversas fuentes bibliográficas, de uso frecuente en la enseñanza de algoritmos, está ordenada en función del sillabus de la Asignatura, arriba mencionada.
La conformación del texto ha sido posible gracias al esfuerzo y dedicación académica del Profesor Ing.Carlos Lo Kan Prado, como fruto de su destacada experiencia profesional y académica; contiene VII capítulos, cuyas descripciones genéricas son como sigue:
En el Capítulo I está referido a los conceptos fundamentales de los algoritmos.
En el Capítulo II se explica los diferentes tipos de datos que se utilizan en la programación.
En el Capítulo III se aborda la herramienta informática que se utilizara para el desarrollo de las aplicaciones en el computador.
En el Capítulo IV se explica las diversas estructuras de control que se presentan.
El Capítulo V se centra en la solución de temas de programación modular.
En el Capítulo VI se estudia los temas de recursividad.
Y en el Capítulo VII se presenta las diversas aplicaciones en lenguaje C.
Finalmente, al cierre de estas líneas, el agradecimiento institucional al profesor Ing.Carlos Lo Kan Prado por su contribución a la elaboración del presente texto.
Ing. Lucio H. Huamán Ureta Vicerrectorado de Investigación
8/17/2019 20102TTT103IC02T106
7/170
Algoritmo y Estructura de Datos I
6
8/17/2019 20102TTT103IC02T106
8/170
Algoritmo y Estructura de Datos I
7
Índice
Capítulo I Conceptos Fundamentales
1.1 Introducción ........................................................................................................... 11 1.2 Definición de lenguaje............................................................................................ 13
1.3
Definición de
algoritmo..........................................................................................
14
1.4 Tipos de algoritmos ................................................................................................ 14 1.5 Lenguajes algorítmicos ........................................................................................... 14 1.6
Metodología para la solución de problemas por medio de computadora ............ 31 1.7
Definición del problema ......................................................................................... 31 1.8 Análisis del problema ............................................................................................. 31 1.9
Diseño del algoritmo .............................................................................................. 32 1.10
Codificación ............................................................................................................ 32 1.11
Prueba y depuración............................................................................................... 32 1.12 Documentación ...................................................................................................... 32 1.13
Mantenimiento....................................................................................................... 33
Capítulo II Tipos de Datos
2.1
Tipos de datos......................................................................................................... 35 2.2 Expresiones............................................................................................................. 35 2.3 Operadores y operandos........................................................................................ 36 2.4 Identificadores........................................................................................................ 40
Capítulo III Lenguaje de Programación C
3.1
Introducción ........................................................................................................... 43 3.2 Características ........................................................................................................ 43 3.3 Proceso de edición y compilación .......................................................................... 43 3.4
Estructura de un programa .................................................................................... 44
8/17/2019 20102TTT103IC02T106
9/170
Algoritmo y Estructura de Datos I
8
Capítulo IV Estructuras de Control
4.1 Tipos de estructuras básica .................................................................................... 59 4.2 Estructura secuencial ............................................................................................. 59 4.3 Problemas secuenciales.......................................................................................... 60
Capítulo V Programación Modular
5.1 El diseño descendente: subprogramas .................................................................. 89 5.2
El diseño modular................................................................................................... 90
Capítulo VI Recursividad
6.1
Recursividad ........................................................................................................... 99 6.2 Prototipos de funciones ......................................................................................... 107 6.3
Arreglos unidimensionales y multidimensionales.................................................. 108
Capítulo VII Aplicaciones
Ejercicios............................................................................................................................
115
Bibliografía ........................................................................................................................ 169
8/17/2019 20102TTT103IC02T106
10/170
Algoritmo y Estructura de Datos I
9
Distribución Temática
Clase N°
Tema Semana Horas
1
Conceptos Fundamentales Concepto de algoritmo. Lenguajes de programación. Herramientas de programación.
1
2 Tipos de datos. Constantes, variables, identificadores, expresiones,
funciones.
2
3
Estructura General de un Programa Estructura de un Programa en C. Estructura de algoritmos. Contadores, acumuladores.
3
4
Estructuras de Control Programación Estructurada. Estructuras de Control ‐ Tipos Secuencial Selectiva simple (SI).
4
5
Selectiva doble (SI ‐ SINO). Selectiva
múltiple
(SI
‐SINO
‐SI).
5
6 Selectiva de control (SEGÚN ‐SEA). 6
7 Iterativa (REPETIR ‐ DESDE). 7
8 Estructura Iterativa (REPETIR ‐ MIENTRAS). 8
9 Ejercicios propuestos y nivelación 9
10 E X A M E N P A R C I A L 10
11 Sub
programación
Programación Modular. Subprogramas – Tipos
11
12 Variables globales y locales. Funciones, paso de parámetros. Procedimientos paso de parámetros
12
13 Recursividad Datos estructurados
13
8/17/2019 20102TTT103IC02T106
11/170
Algoritmo y Estructura de Datos I
10
14
Tipos. Arreglos unidimensionales, declaración y acceso. 14
Clase N°
Tema Semana Horas
15 Arreglos bidimensionales, declaración y acceso. 15
16 Registros Concepto. Declaración y acceso.
16
17 Arreglo de registros. Cadena de caracteres.
17
18
Índices
18
19 Ejercicios propuestos y nivelación. 19
20 E X A M E N F I N A L 20
8/17/2019 20102TTT103IC02T106
12/170
Algoritmo y Estructura de Datos I
11
CAPÍTULO I
Conceptos
Fundamentales
1.1 Introducción La computadora no solamente es una máquina que puede realizar procesos para darnos resultados, sin que tengamos la noción exacta de las operaciones que realiza para llegar a esos resultados. Con la computadora además de lo anterior también podemos diseñar soluciones a la medida, de problemas específicos que se nos presenten. Más aun, si estos
involucran operaciones
matemáticas
complejas
y/o
repetitivas,
o requieren
del
manejo
de
un volumen muy grande de datos.
El diseño de soluciones a la medida de nuestros problemas, requiere como en otras disciplinas una metodología que nos enseñe de manera gradual, la forma de llegar a estas soluciones.
A las soluciones creadas por computadora se les conoce como programas y no son más que una serie de operaciones que realiza la computadora para llegar a un resultado, con un grupo de datos específicos. Lo anterior nos lleva al razonamiento de que un programa nos sirve para solucionar un problema específico.
Para poder realizar programas, además de conocer la metodología mencionada, también debemos de conocer, de manera específica las funciones que pueden realizarse en la computadora y las formas en que se pueden manejar los elementos que hay en la misma.
Computadora: Es un dispositivo electrónico utilizado para procesar información y obtener resultados. Los datos y la información se pueden introducir en la computadora como entrada (input) y a continuación se procesan para producir una salida (output).
Proceso de información en la computadora (Fig. 1)
Datos de Proceso Datos deEntrada salida
Figura 1. Proceso
Programa: Es el conjunto de instrucciones escritas de algún lenguaje de programación y que ejecutadas secuencialmente resuelven un problema especifico.
8/17/2019 20102TTT103IC02T106
13/170
Algoritmo y Estructura de Datos I
12
Organización física de una computadora
CPU
Uni da de Uni dad
Dispositi vos de Contr ol Ari t.-Log. Di sposit ivos de
Entrada Salida
Memori a
Figura 2. Organización del Computador
Dispositivos de Entrada: Como su nombre lo indica, sirven para introducir datos
(información) en
la
computadora
para
su
proceso.
Los
datos
se
leen
de
los
dispositivos
de
entrada y se almacenan en la memoria central o interna. Ejemplos: teclado, scanners (digitalizadores de rastreo), mouse (ratón), trackball (bola de ratón estacionario), joystick (palancas de juego), lápiz óptico.
Dispositivos de Salida: Regresan los datos procesados que sirven de información al usuario. Ejemplo: monitor, impresora.
La Unidad Central de Procesamiento (C.P.U) se divide en dos: Unidad de control
Unidad Aritmético ‐ Lógica
Unidad de Control: Coordina las actividades de la computadora y determina que operaciones se deben realizar y en qué orden; así mismo controla todo el proceso de la computadora.
Unidad Aritmética ‐ Lógica: Realiza operaciones aritméticas y lógicas, tales como suma, resta, multiplicación, división y comparaciones.
La Memoria de la computadora se divide en dos: Memoria Central o Interna
Memoria Auxiliar o Externa
Memoria Central (interna): La CPU utiliza la memoria de la computadora para guardar información mientras trabaja con ella; mientras esta información permanezca en memoria, la computadora puede tener acceso a ella en forma directa. Esta memoria construida internamente se llama memoria de acceso aleatorio (RAM).
La memoria interna consta de dos áreas de memoria:
La memoria RAM (Randon Access Memory): Recibe el nombre de memoria principal o memoria del usuario, en ella se almacena información solo mientras la computadora esta
8/17/2019 20102TTT103IC02T106
14/170
Algoritmo y Estructura de Datos I
13
encendida. Cuando se apaga o arranca nuevamente la computadora, la información se pierde, por lo que se dice que la memoria RAM es una memoria volátil.
La memoria ROM (Read Only Memory): Es una memoria estática que no puede cambiar, la computadora puede leer los datos almacenados en la memoria ROM, pero no se pueden introducir datos en ella, o cambiar los datos que ahí se encuentran; por lo que se dice que esta memoria es de solo lectura. Los datos de la memoria ROM están grabados en forma permanente y son introducidos por el fabricante de la computadora.
Memoria Auxiliar (Externa): Es donde se almacenan todos los programas o datos que el usuario desee. Los dispositivos de almacenamiento o memorias auxiliares (externas o secundarias) más comúnmente utilizados son: cintas magnéticas y discos magnéticos.
1.2 Definición de Lenguaje Lenguaje: Es una serie de símbolos que sirven para transmitir uno o más mensajes (ideas) entre dos entidades diferentes. A la transmisión de mensajes se le conoce comúnmente como comunicación.
La comunicación es un proceso complejo que requiere una serie de reglas simples, pero indispensables para poderse llevar a cabo. Las dos principales son las siguientes:
Los mensajes deben correr en un sentido a la vez. Debe forzosamente existir 4 elementos: Emisor, Receptor, Medio de Comunicación y
Mensaje.
Lenguajes de Programación Es un conjunto de símbolos, caracteres y reglas (programas) que permiten a las personas comunicarse con la computadora.
Los lenguajes de programación tienen un conjunto de instrucciones que nos permiten realizar operaciones de entrada/salida, calculo, manipulación de textos, lógica/comparación y almacenamiento/recuperación.
Los lenguajes de programación se clasifican en:
Lenguaje Maquina:
Son
aquellos
cuyas
instrucciones
son
directamente
entendibles
por
la
computadora y no necesitan traducción posterior para que la CPU pueda comprender y ejecutar el programa. Las instrucciones en lenguaje maquina se expresan en términos de la unidad de memoria mas pequeña el bit (dígito binario 0 o 1).
Lenguaje de Bajo Nivel (Ensamblador): En este lenguaje las instrucciones se escriben en códigos alfabéticos conocidos como mnemotécnicos para las operaciones y direcciones simbólicas.
8/17/2019 20102TTT103IC02T106
15/170
Algoritmo y Estructura de Datos I
14
Lenguaje de Alto Nivel: Los lenguajes de programación de alto nivel (BASIC, pascal, cobol, frotran, etc.) son aquellos en los que las instrucciones o sentencias a la computadora son escritas con palabras similares a los lenguajes humanos (en general en ingles), lo que facilita la escritura y comprensión del programa.
1.3 Definición de Algoritmo Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para dar solución a un problema específico.
Un algoritmo es una secuencia finita de instrucciones cada una de las cuales tiene un significado claro y puede ser efectuada con una cantidad finita de esfuerzo en una longitud de tiempo también finito.
En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa al‐Jwarizmi) es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema. Dado un estado inicial y una entrada, a través de pasos sucesivos y bien definidos se llega a un estado final, obteniendo una solución. Los algoritmos son objeto de estudio de la algoritmia.
En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos problemas. Algunos ejemplos se encuentran en los instructivos (manuales de usuario), los cuales muestran algoritmos para usar el aparato en cuestión o inclusive en las
instrucciones que
recibe
un
trabajador
por
parte
de
su
patrón.
También
existen
ejemplos
de índole matemática, como el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para calcular el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un Sistema lineal de ecuaciones.
1.4 Tipos de Algoritmos
Cualitativos: Son aquellos en los que se describen los pasos utilizando palabras.
Cuantitativos: Son aquellos en los que se utilizan cálculos numéricos para definir los pasos del proceso.
1.5 Lenguajes
Algorítmicos
Es una serie de símbolos y reglas que se utilizan para describir de manera explícita un proceso.
Tipos de Lenguajes Algorítmicos Gráficos: Es la representación gráfica de las operaciones que realiza un algoritmo (diagrama de flujo).
8/17/2019 20102TTT103IC02T106
16/170
Algoritmo y Estructura de Datos I
15
No Gráficos: Representa en forma descriptiva las operaciones que debe realizar un algoritmo (pseudocodigo).
Medios de expresión de un algoritmo Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.
La descripción de un algoritmo usualmente se hace en tres niveles: Descripción
de
alto
nivel.
Se
establece
el
problema,
se
selecciona
un
modelo
matemático
y
se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.
Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un
análisis de
complejidad
o ambos.
Diagrama de flujo
Definición Es la representación gráfica de flujo de un algoritmo o de secuencia rutinaria. Se basan en la utilización de diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de
la operación.
Un diagrama de flujo es una forma de representar gráficamente los detalles algorítmicos de un proceso multifactorial. Se utiliza principalmente en programación, economía y procesos industriales, pasando también a partir de estas disciplinas a
formar parte fundamental de otras, como la psicología cognitiva. Estos diagramas utilizan una
Figura 3. Diagrama de flujo
8/17/2019 20102TTT103IC02T106
17/170
Algoritmo y Estructura de Datos I
16
serie de símbolos con significados especiales y son la representación gráfica de los pasos de un proceso. En computación, son modelos tecnológicos utilizados para comprender los rudimentos de la programación lineal.
Símbolos utilizados Los símbolos que se utilizan para diseño se someten a una normalización, es decir, se hicieron símbolos casi universales, ya que, en un principio cada usuario podría tener sus propios símbolos para representar sus procesos
en
forma
de
Diagrama
de
flujo.
Esto
trajo como consecuencia que sólo aquel que conocía sus símbolos, los podía interpretar. La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a las normas preestablecidas universalmente para dichos símbolos o datos.
Los diagramas de flujo sirven para representar algoritmos de manera gráfica.
Características que debe cumplir un diagrama de flujo En los diagramas de flujo se presuponen los siguientes aspectos:
Existe siempre un camino que permite llegar a una solución (finalización del algoritmo).
Existe un único inicio del proceso.
Existe un único punto de fin para el proceso de flujo (salvo del rombo que indica una comparación con dos caminos posibles).
Figura 4. Diagrama de flujo
8/17/2019 20102TTT103IC02T106
18/170
Algoritmo y Estructura de Datos I
17
Desarrollo del Diagrama de Flujo Las siguientes son acciones previas a la realización del diagrama de flujo:
Identificar las ideas principales a ser incluidas en el diagrama de flujo. Deben estar presentes el dueño o responsable del proceso, los dueños o responsables del proceso anterior y posterior y de otros procesos interrelacionados, otras partes interesadas.
Definir qué se espera obtener del diagrama de flujo.
Identificar quién lo empleará y cómo.
Establecer el nivel de detalle requerido. Determinar los límites del proceso a describir. Los pasos a seguir para construir el
diagrama de flujo son:
Establecer el alcance del proceso a describir. De esta manera quedará fijado el comienzo
y el
final
del
diagrama.
Frecuentemente
el
comienzo
es
la
salida
del
proceso previo y el final la entrada al proceso siguiente.
Identificar y listar las principales actividades/subprocesos que están incluidos en el proceso a describir y su orden cronológico.
Si el nivel de detalle definido incluye actividades menores, listarlas también. Identificar y listar los puntos de decisión.
Construir el diagrama respetando la secuencia cronológica y asignando los correspondientes símbolos.
Asignar un título al diagrama y verificar que esté completo y describa con exactitud el proceso elegido.
Recomendaciones
A su vez, es importante que al construir diagramas de flujo, se observen las siguientes recomendaciones:
Evitar sumideros infinitos, burbujas que tienen entradas pero no salidas. Evitar las burbujas de generación espontánea, que tienen salidas sin tener
entradas, porque son sumamente sospechosas y generalmente incorrectas.
Tener cuidado con los flujos y procesos no etiquetados. Esto suele ser un indicio de falta de esmero, pero puede esconder un error aún más grave: a veces el analista no etiqueta un flujo o un proceso porque simplemente no se le ocurre algún nombre razonable.
8/17/2019 20102TTT103IC02T106
19/170
Algoritmo y Estructura de Datos I
18
Ventajas de los diagrama de flujo Favorecen la comprensión del proceso a través de mostrarlo como un dibujo. El cerebro humano reconoce fácilmente los dibujos. Un buen diagrama de flujo reemplaza varias páginas de texto.
Permiten identificar los problemas y las oportunidades de mejora del proceso. Se identifican los pasos redundantes, los flujos de los re‐procesos, los conflictos de autoridad, las responsabilidades, los cuellos de botella, y los puntos
de
decisión.
Muestran las interfaces cliente‐proveedor y las transacciones que en ellas se realizan, facilitando a los empleados el análisis de las mismas.
Son una excelente herramienta para capacitar a los nuevos empleados y también a los que desarrollan la tarea, cuando se realizan mejoras en el proceso.
Tipos de
diagramas
de
flujos
Formato vertical: En él el flujo o la secuencia de las operaciones, va de arriba hacia abajo. Es una lista ordenada de las operaciones de un proceso con toda la información que se considere necesaria, según su propósito.
Formato horizontal: En él, el flujo o la secuencia de las operaciones, va de izquierda a derecha.
Formato panorámico: El proceso entero está representado en una sola carta y puede apreciarse de una sola mirada mucho más rápido que leyendo el texto, lo que facilita su comprensión, aun para personas no familiarizadas. Registra no solo en línea vertical, sino
también horizontal,
distintas
acciones
simultáneas
y la
participación
de
más
de
un
puesto
o
departamento que el formato vertical no registra.
Formato Arquitectónico: Describe el itinerario de ruta de una forma o persona sobre el plano arquitectónico del área de trabajo. El primero de los flujogramas es eminentemente descriptivo, mientras que los utilizados son fundamentalmente representativos.
Crear diagramas de flujos Un diagrama de flujo u organigrama es una representación diagramática que ilustra la secuencia de las operaciones que se realizarán para conseguir la solución de un problema.
Figura 5.
Diagrama
de
flujo
8/17/2019 20102TTT103IC02T106
20/170
Algoritmo y Estructura de Datos I
19
Los diagramas de flujo se dibujan generalmente antes de comenzar a programar el código frente a la computadora. Los diagramas de flujo facilitan la comunicación entre los programadores y la gente del negocio. Estos diagramas de flujo desempeñan un papel vital en la programación de un problema y facilitan la comprensión de problemas complicados y sobre todo muy largos. Una vez que se dibuja el diagrama de flujo, llega a ser fácil escribir el programa en cualquier idioma de alto nivel. Vemos a menudo cómo los diagramas de flujo nos dan ventaja al momento de explicar el programa a otros. Por lo tanto, está correcto decir que un diagrama de flujo es una necesidad para la documentación mejor de un programa complejo.
Reglas para dibujar un diagrama de flujo Los Diagramas de flujo se dibujan generalmente usando algunos símbolos estándares; sin embargo,
algunos
símbolos
especiales
pueden
también
ser
desarrollados
cuando
sean
requeridos. Algunos símbolos estándares, que se requieren con frecuencia para diagramar programas de computadora se muestran a continuación:
Inicio o fin del programa
Pasos, procesos o líneas de instrucción de programa de computo
Operaciones de entrada y salida
Toma de decisiones y Ramificación
Conector para unir el flujo a otra parte del diagrama
Cinta magnética
Disco magnético
Conector de pagina
Líneas de flujo
8/17/2019 20102TTT103IC02T106
21/170
Algoritmo y Estructura de Datos I
20
Anotación
Display, para mostrar datos
Envía datos a la impresora
Figura 6. Simbolos para el diseño de diagramas de flujo
Observación: Para
obtener
la
correcta
elaboración
de
los
símbolos,
existen
plantillas.
Las
puedes conseguir en Papelerías.
Símbolos gráficos Dentro de los símbolos fundamentales para la creación de diagramas de flujo, los símbolos gráficos son utilizados específicamente para operaciones aritméticas y relaciones condicionales. La siguiente es una lista de los símbolos más comúnmente utilizados:
+ Sumar ‐ Menos * Multiplicación
/
División
± Mas o menos = Equivalente a > Mayor que = Mayor o igual que
8/17/2019 20102TTT103IC02T106
22/170
Algoritmo y Estructura de Datos I
21
e.
Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas palabras.
f. Todos los símbolos pueden tener más de una línea de entrada, a excepción del símbolo final.
g. Solo los símbolos de decisión pueden y deben tener más de una línea de flujo de salida.
Ejemplos de diagramas de flujo Diagrama de flujo que encuentra la suma de los primeros 50 números naturales
Figura 8. Diagrama de flujo
Bueno, ahora la descripción detallada del diagrama anterior
Suma, es la variable a la que se le va agregando el valor de cada número natural. N, es el contador. Éste recorrerá los números hasta llegar al 50.
8/17/2019 20102TTT103IC02T106
23/170
Algoritmo y Estructura de Datos I
22
• El primer bloque indica el inicio del Diagrama de flujo
• El segundo bloque, es un Símbolo de procesos En este bloque se indica que las variables suma y N han sido declaradas previamente y se inicializan en 0 para comenzar el conteo y la suma de valores.
• El tercer bloque, es también un Símbolo de procesos En éste paso se incrementa en 1 la variable N (N = N + 1). Por lo que, en la primera lectura la variable N valdrá 1, ya que se inicializo en 0.
• El cuarto bloque es exactamente lo mismo que el
anterior Pero
aquí
la
variable
suma
es
igual
a la
variable
suma agregada en el valor de N (En el primer caso Suma contendrá 1, ya que N = 1).
• El quinto bloque es un Símbolo de Toma de decisiones y Ramificación Lo que hay dentro del bloque es una pregunta que se le hace a alguna variable para validar una condición. En este caso ¿Es N=50?, Obviamente la respuesta es no, ya que N todavía es 1. por lo que el flujo de nuestro programa se dirigirá hacía la parte en donde se observa la palabra no: Tercer Bloque, éste le sumará 1 (N=N+1) y vuelve a llegar a éste bloque, donde
preguntará ¿Es
N=50?...
¡No!,
todavía
es
2.
Entonces,
regresa al Tercer bloque y vuelve hacer lo mismo. Y así hasta llegar a 50, obteniendo así la suma de los primeros 50 primeros números naturales.
• Por último indicamos que el resultado será mostrado en la pantalla (Display).
• Fin del programa (o diagrama)
Pseudocódigo Pseudocódigo es la descripción de un algoritmo que asemeja a un lenguaje de programación pero con algunas convenciones del lenguaje natural. Tiene varias ventajas con respecto a los diagramas de flujo, entre las que se destaca el poco espacio que se requiere para representar instrucciones complejas. El pseudocódigo no está regido por ningún estándar. Pseudo viene de falso y por ende es un código al que aunque es entendible no se aplica al proceso que debe realizar la máquina o computador.
8/17/2019 20102TTT103IC02T106
24/170
Algoritmo y Estructura de Datos I
23
Un pseudocódigo (lenguaje natural), es una serie de palabras léxicas y gramaticales referidos a los lenguajes de programación, pero sin llegar a la rigidez de la sintaxis de estos ni a la fluidez del lenguaje coloquial. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación, con la misma validez semántica, normalmente se utiliza en las fases de análisis o diseño de Software, o en el estudio de un algoritmo. Forma parte de las distintas herramientas de la ingeniería de software. Es, netamente, lenguaje de tipo informático.
Para probar el algoritmo se utiliza un Pseudo intérprete el cual se encuentra disponible para las plataformas GNU/Linux y Windows, es de código libre y está escrito en C++. El mismo se ejecuta en un Terminal.
El pseudocódigo
describe
un
algoritmo
utilizando
una
mezcla
de
frases
en
lenguaje
común,
instrucciones de programación y palabras clave que definen las estructuras básicas. Su objetivo es permitir que el programador se centre en los aspectos lógicos de la solución a un problema.
No siendo el pseudocódigo un lenguaje formal, varían de un programador a otro, es decir, no hay una estructura semántica ni arquitectura estándar. Es una herramienta ágil para el estudio y diseño de aplicaciones, veamos un ejemplo, que podríamos definir como: lenguaje imperativo, de tercera generación, según el método de programación estructurada.
Pseudocódigo = Pseudo
(Supuesto)
+ Código
(Instrucción)
Comencemos aclarando que no es una forma de programación. Se trata de una herramienta que los analistas de sistemas utilizan para comunicar a los programadores la estructura del programa que van a realizar, de forma de tener una idea bien clara de lo que se necesita programar.
Digamos que el pseudo código es una forma de diagramar un algoritmo para resolver un determinado problema, sin atenerse a ningún lenguaje de programación en especial.
Un algoritmo es un conjunto de procedimientos que permiten resolver un problema.
En vez de escribir el programa directamente en un lenguaje de programación determinado (C, C++, Visual Basic, etc.), crearemos un borrador entendible para todos, para luego de tener bien en claro lo que se debe hacer, pasar a la programación propiamente dicha.
Figura 9. Pseudo codigo
8/17/2019 20102TTT103IC02T106
25/170
Algoritmo y Estructura de Datos I
24
No hay que confundirlo con un diagrama de flujo.
En el diagrama de flujo se representa el transcurso del programa, el momento donde se obtienen los datos, cuando se procesan y el momento de presentar los resultados. Si bien son dos herramientas que se utilizan en conjunto, cada una representa dos partes distintas en el diseño de un sistema. El pseudo código se refiere a crear un código para orientar a los programadores, pero sin la sintaxis ni la estructura propia de ningún lenguaje.
Utilización en la práctica En el trabajo de un ingeniero analista, una de las partes más trabajosas es la de determinar qué es lo que necesitan de un sistema los usuarios finales. Se dedican muchas horas a hacer
un
relevamiento
de
los
datos
que
serán
necesarios,
los
tipos
de
procesamientos,
las
salidas, etc. Y debe existir una realimentación entre el diseño y el usuario, para garantizar que el sistema cumpla con los requisitos del usuario.
Figura 10. Un sistema
Supongamos que tenemos un sistema para una empresa que utiliza una interfaz gráfica en Visual Basic, algunas aplicaciones específicas en C, y páginas PHP para trabajo vía Internet. Seguramente que crear un diagrama específico para cada lenguaje sería una tarea tediosa.
Gracias a esta herramienta, podemos reunir a todos los programadores, dar las pautas de trabajo, y mediante el pseudo código, cada programador sabrá lo que hace el sistema, y
podrá escribir
el
código
correspondiente.
Incluso dos programadores que dominen el mismo lenguaje pueden tener metodologías de trabajo distintas. Un problema puede ser resuelto de muchas maneras, cada una más o menos eficiente que la otra, pero todas cumplen con el objetivo.
8/17/2019 20102TTT103IC02T106
26/170
Algoritmo y Estructura de Datos I
25
Figura 11. Lenguajes y el pseudo codigo
El pseudo código elimina estas diferencias, dando libertad a los programadores para que puedan ajustarse a su metodología de trabajo.
Generalmente, este código se escribe con la participación de todos los programadores. Esto representa la ventaja de que muchas opiniones ayudan a elegir la mejor entre todas, logrando una solución efectiva y eficaz al problema planteado.
Definición de datos del Pseudocódigo La definición de datos se da por supuesta, sobre todo en las variables sencillas, si se emplea formaciones: pilas, colas, vectores o registros, se pueden definir en la cabecera del
algoritmo, y naturalmente
cuando
empleemos
el
pseudocódigo
para
definir
estructuras
de
datos, esta parte la desarrollaremos adecuadamente.
Funciones y operaciones Como se había mencionado antes, cada autor usa su propio pseudocódigo con sus respectivas convenciones. Por ejemplo, considere la instrucción "Reemplace el valor de la variable x por el valor de la variable y"; algunas de las posibles sintaxis para indicar lo anterior podrían ser:
Asigne a el valor de
Las operaciones aritméticas se representan de la forma usual en matemáticas.
8/17/2019 20102TTT103IC02T106
27/170
Algoritmo y Estructura de Datos I
26
y las operaciones complejas se representan del mismo modo:
Ejemplo 1: Hacer un pseudocodigo que imprima los números del 1 al 100.
PROGRAMA contador1
ENTORNO:
c 0 ALGORITMO:
Borrar_pantalla( ) MIENTRAS c =
0 HACER
ESCRIBIR c c c ‐ 1
FINMIENTRAS
FINPROGRAMA
8/17/2019 20102TTT103IC02T106
28/170
Algoritmo y Estructura de Datos I
27
Ejemplo 3: Hacer un pseudocodigo que imprima los números pares entre 0 y 100.
PROGRAMA pares
ENTORNO: c 2
ALGORITMO: Borrar_pantalla( ) MIENTRAS c
8/17/2019 20102TTT103IC02T106
29/170
Algoritmo y Estructura de Datos I
28
Ejemplo 5: Hacer un pseudocódigo que imprima los números impares hasta el 100 y que imprima cuantos impares hay.
PROGRAMA impares
ENTORNO: c 1 son 0
ALGORITMO: Borrar_pantalla( ) MIENTRAS c
8/17/2019 20102TTT103IC02T106
30/170
Algoritmo y Estructura de Datos I
29
Ejemplo 7: Introducir un numero por teclado. Que nos diga si es par o impar.
PROGRAMA paridad
ENTORNO: num 0
ALGORITMO: Borrar_pantalla( ) ESCRIBIR "Introduce un n£mero: " LEER num SI num = int( num / 2 ) * 2 ENTONCES
ESCRIBIR "es par" SINO
ESCRIBIR "es impar" FINSI
FINPROGRAMA
Ejemplo 8: Imprimir y contar los múltiplos de 3 desde la unidad hasta un numero que introducimos por teclado.
PROGRAMA multiplo
ENTORNO: i 3 n 0 c 0
ALGORITMO: Borrar_pantalla( ) ESCRIBIR "Numero: " LEER n MIENTRAS i
8/17/2019 20102TTT103IC02T106
31/170
Algoritmo y Estructura de Datos I
30
Ejercicios Propuestos Construir diagramas de Flujo y Pseudo Códigos para los siguientes enunciados:
1. Mostrar su Nombre y su Apellido 2. Mostrar el Nombre y Apellido de cualquier persona de quien se introduzcan los
datos. 3. Sumar 2 + 2 y mostrar el resultado (por pantalla, por impresora, por pantalla e
impresora) 4.
Sumar 2 números cualesquiera. 5. Dados 2 números, estar en capacidad de sumarlos, restarlos, multiplicarlos y
dividirlos. 6.
Dados los coeficientes de una Ecuación de 2do Grado, calcular y mostrar x1 y x2. 7.
Calcular la
Serie
de
Fibonacci
hasta
un
número
dado.
8. Calcular la edad
fácil: al introducir sólo el año de nacimiento
mediano: al introducir el mes y año de nacimiento
complejo: al introducir el día, mes y año de nacimiento 9. Calcular la nota definitiva para 5 alumnos, tomando en cuenta las ponderaciones
siguientes:
1er Practica: 30% 2do Practica: 25% 3er Practica: 20% 4ta Practica: 25%
10.
10.Calcular el
sueldo
quincenal,
tomando
en
cuenta
los
siguientes
parámetros:
Bs 450.000 por quincena Bono de 10% de profesionalización a los que tienen título universitario Bono quincenal de transporte de Bs 70.000
Bono de alimentación de Bs 5.000 por día laborado Deducciones:
2% Seguro Colectivo
1% Paro Forzoso
2% Seguro Social
2% Caja de Ahorro 11.
Calcular los números primos en un rango dado.
12.
Calcular la
suma
de
todos
los
números
enteros
impares,
en
un
rango
dado.
13.
Calcular el factorial de un número. 14. Problema: Buscar una carta
Se tiene un mazo de cartas inglesas, el cual no está completo, pero se sabe que tiene “n” cartas, y está desordenado. Se desea determinar si una carta determinada está o no en el mazo, y si está, en qué posición
15. Problema: serie de ulam Dado un valor inicial “x”, se pide generar los términos de la serie de Ulam.
8/17/2019 20102TTT103IC02T106
32/170
Algoritmo y Estructura de Datos I
31
Se dice que cualquier número menor que 1800 converge a 1 si se calcula cada término siguiendo las reglas de la serie de Ulam. La regla para calcular el término siguiente a “x” es: Si x par, el siguiente término se obtiene dividiendo x por 2 Si x es impar, el siguiente término se obtiene multiplicando x por 3 y sumando
1 al resultado. 16. Problema: caída libre
La ecuación que rige el movimiento uniformemente acelerado de una partícula está dado por la siguiente fórmula: x(t)= xo + vo * t + ½ * a * t2, donde xo es la posición inicial de la partícula, vo es la velocidad inicial y a, la aceleración. El movimiento de caída libre se rige por la misma ecuación anterior, salvo que la velocidad inicial es cero, (se deja caer el objeto del reposo), y la aceleración es la constante
g,
que
se
puede
aproximar
por
10
con
signo
negativo.
Construya un algoritmo que reciba como entrada una altura h, desde la cual se deja caer un objeto, y entregue como salida la posición de la partícula, y el tiempo transcurrido en cada segundo desde que es soltado hasta que llega al suelo. Indicación. Considere posición inicial h, y posición final 0 (suelo)
17. Problema: Máquina de Sencillar Se tiene una máquina que permite sencillar dinero. La máquina está diseñada para que, dado un monto cualquiera, indique cuantos billetes de 1000 y monedas de 100, 10 y 1 debe entregar, a cambio de ese monto. Una característica de esta máquina es que siempre intentará dar la menor cantidad de monedas. Construya el algoritmo que permita que la máquina funcione de la forma descrita.
Es
decir,
un
algoritmo
que
reciba
como
entrada
un
monto
de
dinero,
entero,
positivo y entregue como salida la cantidad de billetes y de monedas de las distintas denominaciones que equivalen a dicho monto.
1.6 Metodología para la solución de problemas por medio de computadora
1.7 Definición del Problema Esta fase está dada por el enunciado del problema, el cual requiere una definición clara y precisa. Es importante que se conozca lo que se desea que realice la computadora; mientras esto no se conozca del todo no tiene mucho caso continuar con la siguiente etapa.
1.8 Análisis del Problema Una vez que se ha comprendido lo que se desea de la computadora, es necesario definir:
Los datos de entrada. Cuál es la información que se desea producir (salida) Los métodos y fórmulas que se necesitan para procesar los datos.
8/17/2019 20102TTT103IC02T106
33/170
8/17/2019 20102TTT103IC02T106
34/170
Algoritmo y Estructura de Datos I
33
Documentación Interna: Son los comentarios o mensaje que se añaden al código fuente para hacer más claro el entendimiento de un proceso.
Documentación Externa: Se define en un documento escrito los siguientes puntos:
Descripción del Problema
Nombre del Autor
Algoritmo (diagrama de flujo o pseudocodigo) Diccionario de Datos Código Fuente (programa)
Manual del
Usuario:
Describe
paso
a paso
la
manera
cómo
funciona
el
programa,
con
el fin de que el usuario obtenga el resultado deseado.
1.13 Mantenimiento Se lleva a cabo después de terminado el programa, cuando se detecta que es necesario hacer algún cambio, ajuste o complementación al programa para que siga trabajando de manera correcta. Para poder realizar este trabajo se requiere que el programa este correctamente documentado.
8/17/2019 20102TTT103IC02T106
35/170
Algoritmo y Estructura de Datos I
34
8/17/2019 20102TTT103IC02T106
36/170
Algoritmo y Estructura de Datos I
35
CAPÍTULO II
Tipos
de
Datos
2.1 Tipos De Datos Todos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como ‘b’, un valor entero tal como 35. El tipo de dato determina la naturaleza del conjunto de valores que puede tomar una variable.
Numéricos
Simples LógicosAlfanuméricos (string)
Tipos dedatos Arreglos (Vectores, Matrices)
Estructurados Registros(Def. por el Archivosusuario) Apuntadores
Tipos de Datos Simples Datos Numéricos: Permiten representar valores escalares de forma numérica, esto incluye
a
los
números
enteros
y
los
reales.
Este
tipo
de
datos
permiten
realizar
operaciones aritméticas comunes.
Datos Lógicos: Son aquellos que solo pueden tener dos valores (cierto o falso) ya que representan el resultado de una comparación entre otros datos (numéricos o alfanuméricos).
Datos Alfanuméricos (String): Es una secuencia de caracteres alfanuméricos que permiten representar valores identificables de forma descriptiva, esto incluye nombres de personas, direcciones, etc. Es posible representar números como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posible hacer operaciones con ellos. Este tipo de
datos se
representan
encerrados
entre
comillas.
Ejemplo: “Instituto Tecnológico de los Olivos” “2009”
2.2 Expresiones Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales. Por ejemplo:
8/17/2019 20102TTT103IC02T106
37/170
Algoritmo y Estructura de Datos I
36
a+(b + 3)/c
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 operadores y operandos. Según sea el tipo de datos que manipulan, se clasifican las expresiones en:
Aritméticas Relaciónales Lógicas
2.3 Operadores
y Operandos
Operadores: Son elementos que relacionan de forma diferente, los valores de una o más variables y/o constantes. Es decir, los operadores nos permiten manipular valores.
Aritméticos
Tipos de Operadores Relaciónales
Lógicos
Operadores Aritméticos: Los operadores aritméticos permiten la realización de operaciones
matemáticas
con
los
valores
(variables
y constantes).
Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el resultado es entero; si alguno de ellos es real, el resultado es real.
Operando (Operador) Operando
Valor
(constante o variable)
Operadores Aritméticos
+ Suma ‐ Resta * Multiplicación / División Mod Modulo (residuo de la división entera)
8/17/2019 20102TTT103IC02T106
38/170
Algoritmo y Estructura de Datos I
37
Ejemplos:
Expresión Resultado
7 / 2 = 3.5 12 mod 7 = 5 4 + 2 * 5 = 14
Prioridad de los Operadores Aritméticos
Todas las expresiones entre paréntesis se evalúan primero. Las expresiones con paréntesis anidados se evalúan de dentro a fuera, el paréntesis más interno se evalúa primero.
Dentro de una misma expresión los operadores se evalúan en el siguiente orden.
1.‐ ^ Exponenciación 2.‐ *, /, mod Multiplicación, división, modulo. 3.‐ +, ‐ Suma y resta.
Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izquierda a derecha.
Ejemplos:
4 + 2 * 5 = 14 23 * 2 / 5 = 9.2 46 / 5 = 9.2
3 + 5 * (10 ‐ (2 + 4)) = 23 3 + 5 * (10 ‐ 6) = 3 + 5 * 4 = 3 + 20 = 23
3.5 + 5.09 ‐ 14.0 / 40 = 5.09 3.5 + 5.09 ‐ 3.5 = 8.59 ‐ 3.5 = 5.09
2.1 * (1.5
+ 3.0
* 4.1)
= 28.98
2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98
Operadores Relaciónales:
Se utilizan para establecer una relación entre dos valores. Compara estos valores entre si y esta comparación produce un resultado de
certeza o falsedad (verdadero o falso).
8/17/2019 20102TTT103IC02T106
39/170
Algoritmo y Estructura de Datos I
38
Los operadores relaciónales comparan valores del mismo tipo (numéricos o cadenas)
Tienen el mismo nivel de prioridad en su evaluación. Los operadores relaciónales tiene menor prioridad que los aritméticos.
Operadores Relaciónales
> Mayor que = Mayor o igual que c Falso a ‐ c Verdadero a ‐ b = c Falso a * b c Verdadero
Ejemplos no
lógicos:
a
8/17/2019 20102TTT103IC02T106
40/170
Algoritmo y Estructura de Datos I
39
Operando And
Operando1 Operador Operando2 ResultadoT AND T T T F F F T FF F F
Operando Or
Operando1 Operador Operando2 Resultado T OR T T
T F TF T TF F F
Operando Not
Operando Resultado
T F
F T
Ejemplos: (a < b) and (b < c)
(10, =, Or
8/17/2019 20102TTT103IC02T106
41/170
Algoritmo y Estructura de Datos I
40
Ejemplos:
a = 10 b = 12 c = 13 d =10
1) ((a > b) or (a < c)) and ((a = c) or (a > = b))F T F F
T FF
2) ((a > = b) or (a < d)) and (( a > = d) and (c > d))F F T T
F TF
3) not (a = c) and (c > b)F T
TT
2.4 Identificadores Los identificadores representan los datos de un programa (constantes, variables, tipos de datos). Un identificador es una secuencia de caracteres que sirve para identificar una posición en la memoria de la computadora, que nos permite tener acceso a su contenido.
Ejemplo:
Nombre Num_hrs Calif2
Reglas para formar un Identificador
Debe comenzar con una letra (A a Z, mayúsculas o minúsculas) y no deben contener espacios en blanco.
Letras, dígitos y caracteres como la subraya ( _ ) están permitidos después del
primer carácter.
La longitud de identificadores puede ser de hasta 8 caracteres.
Constantes y Variables Constante: Una constante es un dato numérico o alfanumérico que no cambia durante la ejecución del programa.
Ejemplo: pi = 3.1416
8/17/2019 20102TTT103IC02T106
42/170
Algoritmo y Estructura de Datos I
41
Variable: Es un espacio en la memoria de la computadora que permite almacenar temporalmente un dato durante la ejecución de un proceso, su contenido puede cambia durante la ejecución del programa. Para poder reconocer una variable en la memoria de la computadora, es necesario darle un nombre con el cual podamos identificarla dentro de un algoritmo.
Ejemplo: área = pi * radio ^ 2
Las variables son: el radio, el área y la constate es pi
Clasificación de las Variables
NuméricasPor su Contenido Lógicas
Alfanuméricas (String)
Variables
De TrabajoPor su Uso Contadores
Acumuladores
Por su Contenido Variable Numéricas: Son aquellas en las cuales se almacenan valores numéricos, positivos o negativos, es decir almacenan números del 0 al 9, signos (+ y ‐) y el punto decimal.
Ejemplo:
IGV=0.15 pi=3.1416 costo=2500
Variables Lógicas: Son aquellas que solo pueden tener dos valores (cierto o falso) estos representan el resultado de una comparación entre otros datos.
Variables Alfanuméricas: Esta formada por caracteres alfanuméricos (letras, números y caracteres especiales).
Ejemplo:
letra=’a’ apellido=’lopez’ direccion=’Av. Libertad #190’
8/17/2019 20102TTT103IC02T106
43/170
Algoritmo y Estructura de Datos I
42
Por su Uso Variables de Trabajo: Variables que reciben el resultado de una operación matemática completa y que se usan normalmente dentro de un programa. Ejemplo:
Suma=a+b/c
Contadores: Se utilizan para llevar el control del número de ocasiones en que se realiza una operación o se cumple una condición. Con los incrementos generalmente de uno en uno.
Acumuladores: Forma que toma una variable y que sirve para llevar la suma acumulativa de una serie de valores que se van leyendo o calculando progresivamente.
8/17/2019 20102TTT103IC02T106
44/170
Algoritmo y Estructura de Datos I
43
CAPÍTULO III
Lenguaje
de
Programación
C
3.1 Introducción Fue creado por Dennis Ritchie de los laboratorios BELL en 1972, cuando trabajaba junto a Ken Thompson, en el diseño del sistema operativo UNIX. Se deriva del lenguaje B de Thompson, que a su vez se deriva del BCPL de Martín Richards.
3.2 Características Es un lenguaje moderno de propósito general, que incorpora las características de control
apuntadas como
deseables
por
la
teoría
y práctica
de
la
informática.
Planificación escalonada.
Programación estructurada.
Diseño modular. Programas compactos.
Rapidez de ejecución.
Portátil.
De relativo bajo nivel. Precisa compilarse.
3.3 Proceso
de
edición
y compilación
Los pasos necesarios para desarrollar un programa C son los siguientes:
a.
Edición: Utilizar un editor para escribir el programa fuente texto. b.
Compilación: Compilar el programa fuente, es decir, traducir el programa a lenguaje máquina.
c. Ejecución: Una vez compilado se procede a la ejecución del programa tecleando el
nombre del fichero‐programa.
8/17/2019 20102TTT103IC02T106
45/170
Algoritmo y Estructura de Datos I
44
Figura 1.
Diagrama
de
flujo
3.4 Estructura de un programa Un programa en C consiste en una o más funciones, de las cuales una de ellas, debe llamarse main() y es la principal de todas.
El programa comienza con la función: main() Cada función o programa, consta de un cuerpo de función delimitado por llaves de
comienzo y fin { } En el cuerpo de la función irán incluidas: sentencias, variables, funciones, etc.
terminadas cada
una
de
ellas
por
un
punto
y coma;
8/17/2019 20102TTT103IC02T106
46/170
Algoritmo y Estructura de Datos I
45
Programa ejemplo:
/* Este programa imprime un mensaje */ #include main() { printf(“LENGUAJE C\n”); }
En el programa anterior, existen dos funciones: main() que es la principal del programa en sí y la función printf() que es una función de la librería estándar del lenguaje C.
Al ejecutar el programa, en pantalla aparece el texto LENGUAJE C. Programa ejemplo:
/* El programa solicita el radio y muestra el */ /* valor del área del círculo y la longitud de */ /* la circunferencia */ #include #define PI 3.14159 main() {
int r;
float l, a; printf(“Introduce radio (entero): “); scanf(“%d”, &r); l=2*PI*r; a=PI*r*r; printf(“La longitud de la circunferencia vale %f\n”, l); printf(“El área del círculo vale %f\n”, a); }
8/17/2019 20102TTT103IC02T106
47/170
Algoritmo y Estructura de Datos I
46
Los datos en C: Variables y Constantes
Tipos de Datos Los datos manejados en C pueden ser de cinco tipos básicos.
INT: enteros sin decimales entre (‐32768 y +32767). Ocupan en la memoria 2 bytes.
CHAR: caracteres alfabéticos, signos especiales, etc. El rango es (0 y 255). Ocupan en la memoria 1 byte.
FLOAT: números decimales entre (3.4E‐38 a 3.4E+38) con ocho dígitos de precisión. Ocupan en la memoria 4 bytes.
DOUBLE: números decimales entre (1.7E‐308 a 1.7E+308) con 16 dígitos de precisión.
Ocupan
en
la
memoria
8 bytes.
VOID: sin valor. No almacenar nada y por tanto no necesitan espacio físico de la memoria.
Identificadores de Tipo Todos los tipos básicos excepto void pueden tener modificadores. Se usan para alterar el significado de un tipo base de acuerdo con nuestras necesidades.
Los modificadores son:
signed
unsigned
long short
Se pueden aplicar todos los modificadores para los tipos base carácter y entero.
También se puede aplicar el modificador long a double. A continuación mostramos todas las posibles combinaciones de los tipos básicos y los modificadores.
8/17/2019 20102TTT103IC02T106
48/170
Algoritmo y Estructura de Datos I
47
Figura 2. Tipos de identificadores
NOTA: El espacio ocupado en la memoria por los tipos de datos aquí mostrados vendrá determinado por el tipo de compilador implementado. En cualquier caso, mediante la función sizeof (tipo de dato) se podrá determinar el número de bytes ocupados.
Variables
Se utilizan para almacenar datos internamente en la memoria de trabajo del ordenador, durante la ejecución de un programa.
Como nombres de variables se admiten letras y números (por norma letras minúsculas). El primer carácter debe ser una letra. No se admiten blancos pero sí el signo de subrayado.
Sólo se admiten los ocho primeros caracteres. Mayúsculas y minúsculas se diferencian. No se pueden emplear palabras clave del lenguaje.
Las variables
deben
ser
declaradas
según
el
tipo
de
datos
que
van
a almacenar.
Bien al comienzo del programa o antes de ser usadas por primera vez.
La forma de declararlas es: Se define el tipo de dato a almacenar. Nombre de la variable.
Asignación de un valor inicial (no obligatorio).
8/17/2019 20102TTT103IC02T106
49/170
Algoritmo y Estructura de Datos I
48
Ejemplo:
/* Declaración de variables */ #include main() { int a=3, b=7, c=0; c=a*b; printf(“El resultado es: %d”,c); }
Constantes Son
valores
que
no
varían
durante
la
ejecución
de
un
programa.
Pueden
adoptar
cualquiera de los tipos de datos declarados anteriormente. Es conveniente declararlas al principio del programa.
La sentencia #define es usada para definir las constantes y se coloca al principio del programa antes de la función main().
#define PI 3.14159 #define PRIMO 13
Las constantes como norma se suelen escribir con mayúsculas.
Operadores Fundamentales En C se utilizan operadores para representar operaciones matemáticas. Por ejemplo, el operador + hace que se sumen los valores situados a su izquierda y derecha.
Veamos los que hemos dado en llamar fundamentales.
Operador de asignación: = Asigna a la variable de la izquierda el valor de la derecha.
bmw=2002;
Operador de adición: + Hace que los dos valores situados a su izquierda y derecha se sumen.
bmw=10+20;
8/17/2019 20102TTT103IC02T106
50/170
Algoritmo y Estructura de Datos I
49
Operador de sustracción: ‐ Hace que se reste el número situado a su derecha del situado a su izquierda.
costo=350‐25;
El signo menos también se utiliza para indicar o cambiar el signo algebraico de un valor.
pepe=‐12; paco=‐pepe;
Operador de multiplicación: * Hace que se multipliquen los dos valores situados a su
izquierda
y derecha.
pulg=10; cm=2.54*pulg;
Operador de división: / Hace que el valor situado a su izquierda sea dividido por el que se encuentra a su derecha.
cuatro=12.0/3.0;
Operadores Adicionales
A la
lista
de
los
operadores
anteriores
(que
son
los
más
comunes),
vamos
a añadir
ahora
tres operadores que resultan bastantes útiles.
Operador módulo: % Proporciona el resto de la división entera del número situado a su izquierda entre el situado a su derecha.
pepe=15%5;
Operador incremento: ++ Realiza la tarea de incrementar en uno el valor de su operando.
a++; modo sufijo
++a; modo
prefijo
La diferencia entre ambos, reside en el preciso momento en que se realiza la operación incremento.
Operador decremento: ‐‐ Realiza la tarea de disminuir en uno el valor de su operando.
b‐‐; modo sufijo ‐‐b; modo prefijo
8/17/2019 20102TTT103IC02T106
51/170
Algoritmo y Estructura de Datos I
50
La diferencia entre ambos, es la misma que en el caso anterior.
Operadores Condicionales o de Relación Los operadores de relación o condicionales se emplean para hacer comparaciones. A continuación, mostramos una lista completa de estos operadores en C.
Operadores Lógicos Cuando necesitamos combinar dos o más expresiones de relación, hacemos uso de los operadores lógicos. Existen tres operadores lógicos en C.
Operadores de Bit Las operaciones sobre bits se refieren a la comprobación, configuración o desplazamiento de los bits reales en un byte o palabra, que corresponden a los tipos de datos char e int.
No se pueden usar operaciones sobre bits en los tipos float, double, long doublé y void.
Los operadores que existen para el tratamiento de bits, son los siguientes:
8/17/2019 20102TTT103IC02T106
52/170
Algoritmo y Estructura de Datos I
51
Normas de Precedencia de los Operadores No todos los operadores tienen la misma prioridad, lo que quiere decir, que aquellas operaciones que utilizan ciertos operadores se efectuarán antes que otras.
Libreria stdio.h
stdio.h,
que
significa
"standard
input‐output
header" (cabecera estandar E/S), es la biblioteca estándar del lenguaje de programación C, el archivo de cabecera que contiene las definiciones de macros, las constantes, las declaraciones de funciones y la definición de tipos usados por varias operaciones estándar de entrada y salida. Por motivos de compatibilidad, el lenguaje de programación C++ (derivado de C) también tiene su propia implementación de estas
funciones,
que
son
declaradas
con
el
archivo
de
cabecera cstdio.
Las funciones declaradas en stdio.h son sumamente populares.
8/17/2019 20102TTT103IC02T106
53/170
Algoritmo y Estructura de Datos I
52
Ejemplo: En lenguaje C y sus derivados, todas las funciones son declaradas en archivos de cabecera. Así, los programadores tienen que incluir el archivo de cabecera stdio.h dentro del código fuente para poder utilizar las funciones que están declaradas. nota: el compilador diferencia las mayúsculas entre las minúsculas.
#include
int main(void) {
int ch;
while ((ch
= getchar())
!=
EOF)
putchar(ch); putchar('\n');
return 0; }
El programa lee todas las entradas desde la entrada estándar y las muestra en la salida estándar, línea a línea.
Funciones miembro
Las funciones
declaradas
en
stdio.h
pueden
clasificarse
en
dos
categorías:
Funciones de manipulación de ficheros y funciones de manipulación de entradas y salidas.
Nombre Descripción
Funciones de manipulación de ficheros
fclose cierra un fichero a través de su puntero
fopen,
freopen, fdopen
abre un
fichero
para
lectura,
para
escritura/reescritura
o para
adición
remove elimina un fichero
rename cambia al fichero de nombre
rewind La función rewind coloca el indicador de posición de fichero para el stream apuntado por stream al comienzo del fichero.
tmpfile crea y abre un fichero temporal que es borrado cuando cerramos con la función fclose()
8/17/2019 20102TTT103IC02T106
54/170
Algoritmo y Estructura de Datos I
53
Funciones
de
manipulación
de
entradas
y
salidas
clearerr Despeja los indicadores de final de fichero y de posición de fichero para el stream apuntado por stream al comienzo del fichero.
feof comprueba el indicador de final de fichero
ferror comprueba el indicador de errores
fflush
Si stream apunta a un stream de salida o de actualización cuya operación más reciente no era de entrada, la función fflush envía cualquier dato aún sin escribir al entorno local o a ser escrito en el fichero; si no, entonces el comportamiento no está definido. Si stream es un puntero nulo, la función fflush realiza el despeje para todos los streams cuyo comportamiento está descrito
anteriormente.
fgetpos devuelve la posición actual del fichero
fgetc devuelve un carácter de un fichero
fgets consigue una cadena de caracteres de un fichero
fputc escribe un carácter en un fichero
fputs escribe una cadena de caracteres en un fichero
ftell devuelve la posición actual del fichero como número de bytes
fseek sitúa el puntero de un fichero en una posición aleatoria
fsetpos cambia la posición actual de un fichero
fread lee diferentes tamaños de datos de un fichero
fwrite
envía, desde el array apuntado por puntero, hasta nmemb de elementos cuyo tamaño es especificado por tamanyo. El indicador de posición de ficheros es avanzado por el número de caracteres escritos correctamente. Si existe un error, el valor resultante del indicador de posición de ficheros es indeterminado.
getc devuelve un carácter desde un fichero
getchar igual que getc
gets lee caracteres de entrada hasta que encuentra un salto de línea, y los almacena en un único argumento.
printf, fprintf, sprintf snprintf
usados para imprimir salidas de datos
vprintf también utilizado para imprimir salidas
8/17/2019 20102TTT103IC02T106
55/170
Algoritmo y Estructura de Datos I
54
perror
escribe
un
mensaje
de
error
a
stderr
putc devuelve un carácter de un fichero
putchar, fputchar
igual que putc(stdout)
scanf, fscanf, sscanf
utilizado para introducir entradas.
vfscanf, vscanf, vsscanf
también utilizado para introducir entradas.
setbuf Esta función es equivalente a la función setvbuf pasando los valores _IOFBF para modo y BUFSIZ para tamaño, o (si acumulador es un puntero nulo), con el valor _IONBF para modo.
setvbuf
sólo puede ser usada después de que el stream apuntado por stream ha sido asociado con un fichero abierto y antes de otra operación cualquiera es llevada acabo al stream. El argumento modo determina cómo stream será almacenado según lo siguiente: _IOFBF ocasiona la entrada/salida a ser completamente almacenado; _IOLBF ocasiona la entrada/salida a almacenar por líneas; _IONBF ocasiona la entrada/salida a no ser almacenado. Si acumulador no es un puntero nulo, el array al que es
apuntado
puede
ser
usado
en
vez
de
la
acumulación
adjudicada
por
la
función setvbuf. El argumento tamanyo específica el tamaño del array.
tmpnam
Genera una cadena de caracteres que es un nombre válido para ficheros y que no es igual al nombre de un fichero existente. La función tmpnam genera una cadena diferente cada vez que es llamada, hasta un máximo de TMP_MAX veces. Si la función es llamada más veces que TMP_MAX,entonces el comportamiento de la función está definido según la implementación del compilador.
ungetc
puts imprime una de cadena de caracteres
Funciones de Entrada/Salida Las funciones de entrada/salida permiten al programa comunicarse con el exterior. Son utilizadas para sacar determinadas informaciones por la pantalla y capturar valores por el teclado. Son estándar de la propia librería de C por lo que no hay necesidad de definirlas de nuevo.
8/17/2019 20102TTT103IC02T106
56/170
Algoritmo y Estructura de Datos I
55
Función printf() Lee datos del programa (variables, resultados de operaciones, frases, mensajes, etc.) y los envía a la pantalla. El formato es el siguiente:
printf(“Cadena de control”, variables, operaciones, ...);
La cadena de control se usa para escribir mensajes, identificar el tipo de dato que se va a mostrar, indicar controles tales como: salto de línea, salto de página, etc. Los identificadores empleados son los siguientes:
Un número colocado entre el % y el orden de formato, actúa como especificador mínimo
de
ancho
de
campo.
Este
especificador
completa
la
salida
con
blancos
o
ceros
para
asegurar que al menos es la longitud mínima. Si la cadena o el número a representar es mayor que el campo mínimo, el campo se amplía para imprimir la cadena o el número completo.
Ejemplos:
%5d ajuste a la derecha, rellena con espacios %05d juste a la derecha, rellena con ceros %10.4f ajuste a la derecha, rellena con espacios y cuatro decimales %‐10.2f ajuste a la izquierda, rellena con espacios y dos decimales
Caracteres de control son:
Control Efecto en pantalla
\n cambia de línea \r retorno de carro \t tabulador \b retroceso del cursor una posición \f cambio de página
8/17/2019 20102TTT103IC02T106
57/170
Algoritmo y Estructura de Datos I
56
\\ barra atrás (\) \’ apóstrofe (‘) \” comillas (“)
Función scanf() Esta función, lee datos del teclado y los entrega al programa. El formato es el siguiente:
scanf(“Cadena de control”, variable, variable, ...);
La cadena de control se usa para identificar el tipo de dato que se va a introducir o capturar. Los identificadores empleados son los mismos que los empleados en la función printf().
La variable o variables que se van a introducir tendrán que ir acompañadas delante del nombre por el signo (&). Si el dato que se va a introducir es una tira de caracteres tipo char[ ], no es necesario el signo.
Ejemplo:
/* Programa de empleo de printf() y scanf() */ main() { int edad;
char nombre[20];
printf(“Introduce nombre: \n“); scanf(“%s”, nombre); printf(“Introduce edad: \n”); scanf(“%d”,&edad); printf(“Tu nombre es %s y tienes %d años. \n”, nombre, edad); }
Librería conio.h Las funciones de conio (CONsole Input Output) permiten, como las de Ncurses, cambiar el
color del
texto
y del
fondo,
mostrar
caracteres
en
cualquier
posición
de
la
consola,
leer
datos de entrada sin necesidad de pulsar intro, y un montón de cosas más. Eso sí, es bastante más restrictiva que Ncurses en otros aspectos, como la definición y manipulación de ventanas.
Conio es una librería no estándar. Estaba disponible en la mayor parte de los compiladores de C para entornos MS‐DOS y Windows 3.x, pero había diferencias sustanciales entre unas implementaciones y otras, precisamente debido a que la librería no es estándar.
8/17/2019 20102TTT103IC02T106
58/170
Algoritmo y Estructura de Datos I
57
En lenguaje C esta librería contiene los prototipos de las funciones, macros, y constantes para preparar y manipular la consola en modo texto en el entorno de MS‐DOS.
Lee un solo carácter directamente desde el teclado, sin mostrar tal carácter en pantalla.
La función getch retorna el carácter leído desde el teclado.
Ejemplo: