Sunteți pe pagina 1din 139
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA
PROGRAMA DE INGENIERÍA DE SISTEMAS
301304 – INTRODUCCIÓN A LA PROGRAMACIÓN
MIRIAN BENAVIDES RUANO
(Director Nacional)
SERGIO BERMÚDEZ
ROJAS Acreditador
PASTO
Julio de 2012
1
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
ASPECTOS DE PROPIEDAD INTELECTUAL Y VERSIONAMIENTO
El presente módulo fue diseñado en el año 2004 por el Ing. IVAN
ARTURO LÓPEZ, docente de la UNAD, y ubicado en el CEAD de Popayán, el
Ing. López es Ingeniero de Sistemas, y especialista en Pedagogía para el
Desarrollo del Aprendizaje Autónomo y Estudiante master educación y tics
UOC (Universidad Oberta de Cataluña). Ha tenido tres actualizaciones, una
desarrollada por el Ing. Iván López en los años 2005, la segunda hecha en el
año 2008 por la Ing. IRINA NARVÁEZ ESPINOSA, quien ha sido tutora de la
UNAD en los CEAD de Acacias y José Acevedo y Gómez, desde el año 2001, es
Ingeniera de Sistemas, especialista en Pedagogía para el Desarrollo del
Aprendizaje Autónomo y aspirante al título de magíster en Informática
Educativa.
En el año 2009 el Ing. SERGIO BERMÚDEZ ROJAS, tutor del CEAD
Barranquilla, apoyó el proceso de revisión de estilo del módulo y dio aportes
disciplinares, didácticos y pedagógicos en el proceso de acreditación de material
didáctico desarrollado en el mes de JULIO de 2009.
En ENERO de 2011 el módulo fue actualizado por la Ing. MIRIAN
BENAVIDES RUANO, Docente Auxiliar en el CEAD Pasto, Ingeniera de
Sistemas, Especialista en Docencia Universitaria y Especialista en Informática y
Telemática, quien se desempeña como Directora del curso a nivel nacional desde
AGOSTO de 2010. Quien además realizó La actualización más reciente en
JULIO de 2012.
2
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
INTRODUCCIÓN
El curso de introducción a la programación es de gran importancia puesto que
permite familiarizar al estudiante con la metodología requerida para la resolución
de problemas a través de medios informáticos, presentando los elementos
básicos en la programación. Para ello, es indispensable que los estudiantes
cuenten con los conocimientos adquiridos en el curso de algoritmos. El lenguaje
de programación que se utilizará es C, bajo los paradigmas de programación
estructurada y procedural.
Este módulo está organizado por unidades, capítulos y lecciones. Inicia
retomando los aspectos generales de la programación, un acercamiento al
lenguaje de programación C, las características del editor que se utilizará y las
estructuras de programación básicas a utilizar como las sentencias de control
selectivas y repetitivas. También se abordan temas como el trabajo con funciones
y la recursividad.
En la segunda unidad se aborda el tema de las estructuras estáticas para
almacenamiento de información, y se dedica todo un capítulo a este tema,
aunque no es suficiente para abordar todos los apartados, por lo que se confirma
la necesidad de que el estudiante se apropie de los temas e investigue más por
su cuenta, aproveche los recursos de biblioteca y las consultas de Internet para
ampliar aun más los conceptos. Se trabaja el tema de vectores (unidimensionales
y bidimensionales), y las cadenas de caracteres, los métodos de ordenamiento y
de búsqueda, así como el trabajo con punteros.
Finalmente, en atención a la importancia del almacenamiento de información en
medios externos, para permitir su recuperación en el momento que se necesite,
en la tercera unidad se reflexiona sobre el manejo de estructuras y archivos,
donde se destacan los aspectos más importantes como características,
clasificación y mecanismos de acceso a la información.
Aunque para la realización del módulo se han realizado esfuerzos por sintetizar
los temas más importantes de la programación, es indispensable que los
estudiantes no se queden únicamente con lo expuesto en este documento, sino
que traten de profundizar más, aprovechando las múltiples opciones que se
ofrecen en la red; esta tarea puede ser apasionante, pues es la base para
abordar los temas que se acercan cuando inicien el trabajo con bases de datos.
Para terminar, solo resta decir que este módulo está construido, con base en una
recopilación de conceptos de diferente autores, que llevarán al estudiante a un
aprendizaje significativo, complementado con ejercicios, una amplia referencia
bibliográfica y direcciones web, que posibilitarán una mayor autonomía y
confianza por parte del estudiante.
3
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
ÍNDICE DE CONTENIDO
ITEM
TEMA
PAG
INTRODUCCIÓN
3
1.0
UNIDAD 1: INTRODUCCIÓN A LA PROGRAMACIÓN EN C
9
1.1
CAPITULO 1: GENERALIDADES
11
1.1.1
Lección 1: Revisión de conceptos generales de programación
11
1.1.2
Lección 2: Historia del Lenguaje C
13
1.1.3
Lección 3: Traductores de lenguaje
15
1.1.4
Lección 4: Editor de Lenguaje C
16
1.1.5
Lección 5: Depuración de Programas
19
1.2
CAPITULO 2: CONCEPTOS BÁSICOS DE LOS PROGRAMAS EN C
22
1.2.1
Lección 6: Estructura general de un programa en C
22
1.2.2
Lección 7: Elementos de un programa en C
24
1.2.3
Lección 8: Tipos de datos
24
1.2.4
Lección 9: Entradas y salidas
26
1.2.5
Lección 10: Operadores y expresiones
28
1.3
CAPITULO 3: SENTENCIAS DE CONTROL Y FUNCIONES
30
1.3.1
Lección 11: Sentencias de control selectiva if else, switch
30
1.3.2
Lección 12: Sentencias de control repetitivas for, while, do while
32
1.3.3
Lección 13: Funciones, declaración
34
1.3.4
Lección 14: Llamados de función
36
1.3.5
Lección 15: Recursividad
37
4
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
1.4
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD 1
39
2.0
UNIDAD 2: ARREGLOS
40
2.1
CAPITULO 4: ARREGLOS Y CADENAS
41
2.1.1
Lección 16: Definición y Declaración
41
2.1.2
Lección 17: Arreglos Unidimensionales
44
2.1.3
Lección 18: Arreglos Bidimensionales
46
2.1.4
Lección 19: Cadenas de Caracter
47
2.1.5
Lección 20: Funciones de cadena
48
2.2
CAPITULO 5: ORDENACIÓN Y BÚSQUEDA
51
2.2.1
Lección 21: Importancia de la organización de datos
51
2.2.2
Lección 22: Ordenación
51
2.2.3
Lección 23: Métodos de ordenación
53
2.2.4
Lección 24: Búsqueda
69
2.2.5
Lección 25: Métodos de búsqueda
70
2.3
CAPITULO 6: PUNTEROS O APUNTADORES
74
2.3.1
Lección 26: Definición
74
2.3.2
Lección 27: Declaración de punteros
74
2.3.3
Lección 28: Operadores de punteros
75
2.3.4
Lección 29: Apuntadores y funciones
78
2.3.5
Lección 30: Apuntadores y arreglos
79
2.4
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD 2
82
3.0
UNIDAD 3: ESTRUCTURAS Y ARCHIVOS
83
3.1
CAPITULO 7: ESTRUCTURAS
86
3.1.1
Lección 31: Declaración de una Estructura
86
5
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
3.1.2
Lección 32: Asignación de Estructuras
87
3.1.3
Lección 33: Estructuras Anidadas
88
3.1.4
Lección 34: Estructuras Anónimas
89
3.1.5
Lección 35: Ejercicios
92
3.2
CAPITULO 8: ARCHIVOS
93
3.2.1
Lección 36: Definición
93
3.2.2
Lección 37: Características de los Archivos
94
3.2.3
Lección 38: Clasificación de los Archivos
95
3.2.4
Lección 39: Tipos de Archivos
97
3.2.5
Lección 40: Ejercicios
98
3.3
CAPITULO 9: ACCESO A LOS ARCHIVOS
99
3.3.1
Lección 41: Operaciones que se realizan a los Archivos
99
3.3.2
Lección 42: Organización y acceso de los Archivos
101
3.3.3
Lección 43: Instrucciones para manejar archivos
102
3.3.4
Lección 44: Archivos tipo Texto
105
3.3.5
Lección 45: Archivos de acceso directo
114
3.4
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD 3
121
BIBLIOGRAFÍA
113
ANEXO 1: Tipos de Datos
124
ANEXO 2: Índice de funciones
128
ANEXO 3: Errores Comunes de Programación
135
6
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
LISTADO DE TABLAS
TEMA
PAG
TABLA 1. Tipos de datos básicos
25
TABLA 2. Funciones para trabajar con archivos
97
TABLA 3. Tipos de datos
124
TABLA 4. Operadores
127
7
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
LISTADO DE GRÁFICOS Y FIGURAS
TEMA
PAG
FIGURA 1. Proceso de compilación y linkado
16
FIGURA 2. Entorno de trabajo Dev-C++
17
FIGURA 3. Torres de Hanoi
39
FIGURA 4. Vector
44
FIGURA 5. Matriz
46
FIGURA 6. Ventana de ejecución 1
106
FIGURA 7. Recomendación
107
FIGURA 8. Ventana de ejecución 2
109
FIGURA 9. Ventana de ejecución 3
112
FIGURA 10. Ventana de ejecución 4
115
8
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
UNIDAD 1
Nombre
de
la
INTRODUCCIÓN A LA PROGRAMACIÓN EN C
Unidad
Introducción
En la primera unidad se busca crear el enlace de los conceptos que los
estudiantes han adquirido en el curso previo de algoritmos y la utilización
de un lenguaje de programación, en este caso C, como medio para
desarrollar soluciones computacionales, expresadas en programas. Para
lograrlo se parte de reconocer los conceptos generales de programación,
analizar la importancia del lenguaje C, revisando su trayectoria,
analizando su entono de trabajo y las estructuras que utiliza para el
desarrollo de programas.
Para abordar de manera adecuada la construcción de programas, se
estudian los tipos de datos, las sentencias de control de datos, tanto
selectivas como repetitivas, y el manejo de funciones.
Cabe resaltar que si bien es cierto que para la construcción del presente
módulo, se tuvo en cuenta textos de autores reconocidos y sitios web
especializados en programación, es vital que todos los estudiantes estén
siempre atentos a las posibilidades que les ofrece la web, mediante
diversos recursos multimediales (videos, tutoriales, textos en línea) para
ampliar y profundizar sus conocimientos.
Justificación
La primera unidad permite que el estudiante realice un repaso sobre la
conceptualización del tema de programación de computadores, y lo va
involucrando en actividades prácticas utilizando el editor para el lenguaje
C.
Es importante que los estudiantes retomen el modulo de algoritmos, para
recordar algunos de los conceptos olvidados, y consulten bibliografía de
los temas que se van abordando.
Intencionalidades
Formativas
Afianzar conocimientos referentes a la programación de computadoras,
con un lenguaje especifico
Propósitos de la unidad
Realizar recuento de las principales características de la
programación de computadoras
Manejar el entorno de programación con el compilador C
Fortalecer los temas de funciones
Objetivos de la unidad
Conocer la funcionalidad del editor del compilador aquí utilizado.
Motivar a descubrir que otras funciones tiene el editor del lenguaje.
Determinar las técnicas de programación, utilizando C, como
lenguaje de base.
9
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Competencias de la unidad
∑ El estudiante domina los conceptos previos necesarios para el
desarrollo de programas en C
∑ El estudiante reconoce el funcionamiento general del editor de C
∑ El estudiante aplica las funciones como herramienta fundamental en
la modularización de los programas
Metas de aprendizaje
El estudiante es capaz de desarrollar programas mediante la utilización
de funciones.
Denominación de
capítulos
Capítulo 1: Generalidades
Capítulo 2: Conceptos básicos de los programas en C
Capítulo 3: Sentencias de control y funciones
10
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 1: GENERALIDADES
Introducción
Es fundamental iniciar el curso de introducción a la programación, abordando
contenidos que ubiquen al estudiante en el entorno de trabajo, por ello se
incluyen temáticas generales de gran importancia para comprender los conceptos
básicos de programación estructurada y procedural.
Es así como se han elegido cinco lecciones que parten de información general
sobre los aspectos más relevantes de la programación, los requerimientos que se
deben tener en cuenta antes de iniciar con la codificación propiamente dicha de
programas en el Lenguaje C, la descripción del entorno de trabajo del lenguaje,
donde se explica de manera general la forma como se construye un programa,
utilizando el entorno propio del lenguaje de programación y las estructuras
básicas que constituyen un programa en C.
Se analiza la temática de los compiladores y de manera específica el compilador
del lenguaje C, para apoyar al estudiante en la comprensión sobre la forma como
un conjunto de instrucciones debidamente estructuradas pueden lograr la
construcción de programas que sirvan de solución a problemas específicos que
puedan ser resueltos mediante un sistema informático, partiendo de
interpretaciones adecuadas, diseños sólidos y revisiones constantes para
posibilitar depuraciones óptimas que solucionen problemas lógicos y de sintaxis.
Finalmente, debido a que el tema de la programación es bastante amplio, es
indispensable que el estudiante utilice todos los recursos que se encuentren a su
alcance para lograr una verdadera comprensión de los temas expuestos, puesto
que el módulo constituye un punto de partida para avanzar en su proceso de
aprendizaje. Queda abierta entonces la invitación a consultar la bibliografía
sugerida y aprovechar todas las herramientas que se encuentran en la web para
avanzar en el proceso de construcción de conocimiento.
Lección 1: Revisión de conceptos generales de programación
Programación: es un proceso mediante el cual se convierten especificaciones
generales de la solución de un problema, en instrucciones que el computador
puede interpretar y que producen los resultados deseados (desarrollo de
software).
Programa: lista de instrucciones que el computador sigue para convertir datos en
información. Estas dependen del lenguaje de programación que se utilice.
11
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

Un programa debe ser:

Confiable y funcional

∑ Confiable y funcional ∑ Comprensible ∑ Documentado Fases para la creación de un programa ∑

Comprensible

Documentado

∑ Confiable y funcional ∑ Comprensible ∑ Documentado Fases para la creación de un programa ∑
∑ Confiable y funcional ∑ Comprensible ∑ Documentado Fases para la creación de un programa ∑

Fases para la creación de un programa

Definición del problema: clara y precisa

∑ o o
o
o

o

Análisis del problema: requiere identificar

Datos de salida (información que debe producir el programa)

Datos de entrada (datos que debe suministrar el usuario para lograr los resultados esperados

Datos de proceso (fórmulas necesarias para procesar los datos)

Diseño de la solución: lista ordenada y cronológica de los pasos a seguir para lograr resultados (diagramas de flujo, pseudocódigo, etc.). Debe ser simple, clara, precisa, exacta, tener un orden lógico e indicar su inicio y final.

∑ ∑
Codificación: escribir la solución del problema en un lenguaje de programación (traducir el diagrama de

Codificación: escribir la solución del problema en un lenguaje de programación (traducir el diagrama de flujo o pseudocódigo en instrucciones que puedan ser interpretadas por el computador)

(traducir el diagrama de flujo o pseudocódigo en instrucciones que puedan ser interpretadas por el computador)

Prueba y depuración: ejecutar el software para identificar y eliminar los errores (de sintaxis o de tipo lógico)

Documentación: guía que facilita futuras modificaciones del software

Programación estructurada : se caracteriza por organizar las instrucciones de manera secuencial, de tal manera

Programación estructurada: se caracteriza por organizar las instrucciones de manera secuencial, de tal manera que es posible leer la codificación desde el inicio hasta el final en forma continua sin saltar de un lugar a otro, siguiendo el camino lógico establecido por el programador.

En este paradigma de programación se debe prestar especial atención a la etapa de diseño de la solución, una vez establecidos los pasos secuenciales, la codificación es más fácil.

Características: la estructura del programa se realiza de la manera más clara y precisa posible, para ello utiliza:

Secuencia: sucesión simple de operaciones

Selección: bifurcación condicional de una o más operaciones

Iteracción: repetición de tareas mientras se cumple una o más condiciones

Ventajas:

Tiene una estructura clara y por ende una buena presentación.

Es más fácil de comprender

Facilita la revisión de la codificación

Reduce el tiempo de prueba y depuración

12

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

Programación Procedural: es un tipo de programación estructurada en donde el código se divide en porciones llamadas "procedimientos" o "funciones". Este tipo de programas permite que una porción de programa sea llamada varias veces sin que tenga que volver a escribir todo el código, simplemente se realiza el llamado a la función o procedimiento que se requiere. Este tipo de programación se basa en subdividir un programa en piezas lógicas para reducir su complejidad según el principio de "divide y vencerás".

según el principio de "divide y vencerás". Identación: utilización de sangrías (espacios) para
según el principio de "divide y vencerás". Identación: utilización de sangrías (espacios) para
según el principio de "divide y vencerás". Identación: utilización de sangrías (espacios) para
según el principio de "divide y vencerás". Identación: utilización de sangrías (espacios) para

Identación: utilización de sangrías (espacios) para facilitar la lectura del programa puesto que muestra en forma gráfica las relaciones entre las instrucciones.

en forma gráfica las relaciones entre las instrucciones. Para aprovechar la identación en un programa en

Para aprovechar la identación en un programa en C se sugiere:

Escribir en la misma columna los indicadores de inicio y fin de cada bloque de sentencias

∑ ∑ Lenguaje de Programación C Según Cesar Becerra: ∑ C ∑
Lenguaje de Programación C
Según Cesar Becerra:
C

Utilizar diferentes sangrías para indicar anidamientos de instrucciones

Escribir una instrucción por línea

de instrucciones Escribir una instrucción por línea es un lenguaje de nivel medio: combina elementos de

es un lenguaje de nivel medio: combina elementos de lenguajes de alto

de nivel medio: combina elementos de lenguajes de alto nivel con la funcionalidad del ensamblador. Su

nivel con la funcionalidad del ensamblador.

Su código es transportable: funciona en equipos APPLEE como en IBM.

Es estructurado: permite el uso de subrutinas (parte del código que maneja

 

sus propias variables y que pueden ser llamadas en diferentes partes del programa principal)

  sus propias variables y que pueden ser llamadas en diferentes partes del programa principal)

Funcionalidad: en un comienzo se utilizó por su potencia y eficacia en

   

programas de sistemas (sistemas operativos, interpretes, editores,

 
   
ensambladores, compiladores, administradores de bases de datos); pero actualmente para todo tipo de desarrollos.

ensambladores, compiladores, administradores de bases de datos); pero actualmente para todo tipo de desarrollos.

es compilador, los lenguajes al ser ejecutados pueden interpretarse (línea

C

a

fuente se convierte en programa objeto, de manera que el compilador lo ejecuta directamente).

línea), o compilarse (utiliza compilador para ejecutarse, todo el programa

(utiliza compilador para ejecutarse, todo el programa Lección 2: Historia del Lenguaje C Para hablar de

Lección 2: Historia del Lenguaje C

Para hablar de la historia del lenguaje C, es indispensable mencionar que en 1967 Martin Richard creo el lenguaje BCPL que fue la base para la creación del lenguaje B escrito por Ken Thompson en 1970.

El

programación anterior, el lenguaje B, con el objetivo de recodificar el sistema

lenguaje C es nace por la necesidad de evolucionar el lenguaje de

 

13

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

operativo UNIX que, hasta esa fecha, se programaba directamente en ensamblador, con el inconveniente de estar vinculado a máquinas concretas (según el juego de instrucciones de cada máquina). Por tanto, se hacía necesario un lenguaje que permitiese al programador abstraerse de la capa hardware y conseguir una mayor portabilidad del código, algo que se realizó en B (basándose en el BCPL de Martin Richard de 1967).

en B (basándose en el BCPL de Martin Richard de 1967). Lo nuevo que Dennis Ritchie
en B (basándose en el BCPL de Martin Richard de 1967). Lo nuevo que Dennis Ritchie
en B (basándose en el BCPL de Martin Richard de 1967). Lo nuevo que Dennis Ritchie
en B (basándose en el BCPL de Martin Richard de 1967). Lo nuevo que Dennis Ritchie

Lo nuevo que Dennis Ritchie le incorporó a C, fue los tipos y estructuras de datos que consiguen clarificar la programación y obtener un lenguaje mucho más eficiente. Ritchie diseñó, desde 1970 a 1972 junto a Brian Kernighan, un lenguaje que permitía realizar una programación estructurada en la que se podían economizar las expresiones a usar y con el que los desarrolladores podrían contar con un buen conjunto de operadores y tipos de datos para programar tanto en alto como en bajo nivel de manera simultánea.

con un buen conjunto de operadores y tipos de datos para programar tanto en alto como
con un buen conjunto de operadores y tipos de datos para programar tanto en alto como
Entre sus características: ∑ Núcleo de lenguaje simple que incluye funciones matemáticas y de manejo

Entre sus características:

Núcleo de lenguaje simple que incluye funciones matemáticas y de manejo de archivos proporcionadas por bibliotecas

∑ ∑ ∑ ∑ ∑

Lenguaje flexible que permitía programar de manera estructurada y no estructurada

Inclusión de un sistema de tipos que impedía la realización de operaciones sin sentido

Acceso a memoria de bajo nivel mediante el uso de punteros

Conjunto reducido de palabras reservadas

Paso de parámetros a funciones por valor

Tipos de datos agregados (struct) que permitían combinar, bajo un mismo tipo, datos de tipos distintos y manejarlos como uno solo.

   

Como el C es un lenguaje muy poderoso y flexible su uso se difundió muy rápidamente más allá de los laboratorios Bell. Los programadores de todo el mundo comenzaron a usarlo para escribir todo tipo de programas. Sin embargo, diferentes organizaciones comenzaron a utilizar muy pronto sus propias versiones del C, las pequeñas diferencias entre las implementaciones comenzaron a dar problemas a los programadores. Para resolver este problema, el American National Stándards (ANSI) formo un comité en 1983 para establecer una definición estándar del C, que llegó a ser conocida como C estándar ANSI. Con unas cuantas excepciones, todos los compiladores del C modernos de adhieren a este estándar.

compiladores del C modernos de adhieren a este estándar. El lenguaje C inicialmente fue creado para
compiladores del C modernos de adhieren a este estándar. El lenguaje C inicialmente fue creado para

El lenguaje C inicialmente fue creado para la programación de:

Sistemas operativos

Intérpretes

Editores

Ensambladores

 

Compiladores

 

14

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

Administradores de bases de datos.

Actualmente, debido a sus características, puede ser utilizado para todo tipo de programas. En 1983

Actualmente, debido a sus características, puede ser utilizado para todo tipo de programas.

puede ser utilizado para todo tipo de programas. En 1983 se formó el comité para el
puede ser utilizado para todo tipo de programas. En 1983 se formó el comité para el

En 1983 se formó el comité para el estándar ANSI C, con el objetivo de crear un lenguaje uniforme a partir del C original, desarrollado por Kernighan y Ritchie en 1972. Hasta entonces el estándar lo marcaba el libro escrito en 1978 por estos dos autores mencionados.

el libro escrito en 1978 por estos dos autores mencionados. En 1980, se comenzó a desarrollar

En 1980, se comenzó a desarrollar el lenguaje C++, su autor fue B. Stroustrup. Al comienzo era una extensión del lenguaje C que fue denominada C with clases, sin embargo es considerado por muchos autores como un lenguaje diferente al C.

La evolución de C++ ha continuado con la aparición de Java, un lenguaje creado simplificando algunas cosas de C++ y añadiendo otras, que se utiliza para realizar aplicaciones en Internet.

que se utiliza para realizar aplicaciones en Internet. El C++ es a la vez un lenguaje
que se utiliza para realizar aplicaciones en Internet. El C++ es a la vez un lenguaje

El C++ es a la vez un lenguaje procedural (orientado a algoritmos) y orientado a

objetos. Como lenguaje procedural se asemeja al C y es compatible con él, aunque ya se ha dicho que presenta ciertas ventajas. Como lenguaje orientado a objetos, se basa en una filosofía completamente diferente, que exige del programador un completo cambio de mentalidad. Las características propias de la

   

Programación Orientada a Objetos (Object Oriented Programming, u OOP) de C++ son modificaciones mayores que sí cambian radicalmente su naturaleza.

Es de anotar, que para el curso se trabajará con el lenguaje de programación C, utilizando los paradigmas de programación estructurada y procedural.

Lección 3: Traductores de lenguaje

 
Al escribir un programa en un lenguaje de programación determinado, este no se puede ejecutar

Al escribir un programa en un lenguaje de programación determinado, este no se puede ejecutar directamente, porque el computador no entiende las órdenes, para lograrlo es indispensable traducirlo en términos que el procesador del computador pueda interpretar lo que se le pide hacer. Para realizar ese proceso se tienen los traductores, que no son otra cosa que programas que tienen como misión analizar los programas que se han escrito en un lenguaje de alto nivel (programas fuente), en este caso C, y los traducen a código máquina. Ahora bien, en el computador en que se ejecuta el programa, el procesador lee e interpreta ese código máquina.

Para entender mejor el proceso de conversión, es necesario aclarar ciertos términos:

Programa fuente: es la codificación escrita por el programador en un lenguaje

 

15

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
de alto nivel, contiene las sentencias del programa en un lenguaje de
programación. Para que sea ejecutable debe ser traducido.
∑ Compilador: es el programa que se encarga de traducir los programa fuentes
escritos en el lenguaje de alto nivel a lenguaje de máquina y además
comprueba que las llamadas a las funciones de librería se realicen de manera
correcta.
∑ Programa objeto: es el programa fuente traducido por el compilador a código
máquina. Hay que recordar, que el programa aún no es directamente
ejecutable en esta etapa.
∑ Linker (montador o enlazador): Es el programa encargado de insertar al
programa objeto el código máquina de las funciones de las librerías (archivos
de biblioteca) usadas en el programa y realizar el proceso de montaje, que
producirá un programa ejecutable .exe. Las librerias son una colección de
código (funciones) ya programado y traducido a código máquina, listo para
utilizar en un programa y que facilita la labor del programador.
∑ Programa Ejecutable: Traducción completa a código máquina,
realizada por el enlazador, del programa fuente y que ya es directamente
ejecutable.
Representación de la compilación y linkado.
Programa
Programa
Programa
Compilación
Enlazador
fuente
objeto
ejecutable
FIGURA 1. Proceso de compilación y linkado
De lo anterior se deduce que el código escrito por el programador es el programa
fuente y para que ese programa se ejecute y cumpla el objetivo para el que fue
creado, debe pasar por los procesos de compilación (programa objeto) y enlace
(programa ejecutable). Al realizar el programa fuente se deben tener cuenta que
las sentencias y sintaxis sean correctas, de lo contrario no se puede compilar.
Lección 4: Editor de lenguaje C
Para trabajar con C, se utilizará el entorno integrado de desarrollo Dev-C++, que
permite trabajar tanto con C, como con C++. Dev-C++ es un software de libre
distribución, sujeto a los términos de la Licencia Pública General (GPL) de GNU.
16
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Su entorno de trabajo es bastante cómodo y fácil de asimilar, con seguridad la
práctica le permitirá familiarizarse con él y lograr buenos desempeños.
Como en el sistema Windows, se trabaja con ventanas que tienen título, barra de
menú, barra de íconos de acceso rápido, barra de estado y la ventana para
escribir la codificación del programa.
FIGURA 2. Entorno de trabajo Dev-C++
Antes de iniciar el trabajo con Dev-C++, se recomienda que se personalicen las
siguientes opciones:
Herramientas / Opciones del Entorno / Interfaz / Idioma: Español (Castellano)
Herramientas / Opciones de Compilador / Configuración / Compilador de C /
Soporte para Programas ANSI Estándar en C: Yes.
Herramientas / Opciones de Compilador / Configuración / Linker / Generar
Información de Debug: Yes.
Herramientas / Opciones del Entorno / Principal / Crear archivos de respaldo
(Copia de Seguridad).
Herramientas / Opciones del Editor / Principal / Resaltar llaves y paréntesis
concordantes.
17
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Herramientas / Opciones del Editor / Sintaxis / Pre-configuraciones: Classic.
A continuación se describen las tareas más importantes:
Editar un programa
∑ Un archivo fuente nuevo: Archivo / Nuevo / Código Fuente. La forma corta es
Ctrl+N
∑ Un fichero fuente ya existente: Archivo / Abrir Proyecto o Archivo. La forma
corta es Ctrl+O
∑ Un fichero fuente ya existente, y que se editó recientemente (Dev-C++ guarda
un historial de los últimos 10 ficheros fuente distintos que se han abierto):
Archivo / Abrir Archivo Reciente.
Guardar un Fichero Fuente
Archivo / Guardar. La forma corta es Ctrl+S
Compilar un programa
Ejecutar / Compilar. La forma corta es Ctrl+F9
Recuerde que al compilar se tiene el código objeto del programa, pero aún no se
tiene el archivo ejecutable. Para generar el ejecutable se debe compilar y ejecutar.
Ejecutar y compilar
Ejecutar / Compilar y Ejecutar. La forma corta es F9
El resultado de la compilación se pueden observar en la pestaña (ubicada en la
parte inferior) Resultado de la compilación y Compilador.
Cómo Ejecutar un programa
∑ Para ejecutar un programa, previamente compilado: Ejecutar / Ejecutar. La
forma corta es Ctrl+F10
∑ Para realizar compilación y ejecución en un solo paso: Ejecutar / Compilar y
Ejecutar. La forma corta es F9
La ejecución del programa se realizará en una ventada de MS-DOS emergente.
Por defecto, el fichero ejecutable se crea en el mismo directorio donde se
almacenó el fichero fuente.
18
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Cerrar ventanas de edición
∑ Cierra el documento que se encuentra activo: Archivo / Cerrar. La forma corta
es Alt+F4, o bien, pulsar sobre el editor que se desea cerrar con el botón
derecho del ratón y elegir la opción Cerrar.
∑ Si hay varios documentos activos y se desea cerrarlos todos, basta con seguir
cualquiera de los procesos anteriores y seleccionar Cerrar Todo.
Lección 5: Depuración de programas
La depuración permite determinar las causas de los errores y por tanto facilita la
corrección de los mismos, en un programa determinado.
El proceso de depuración
1. Estudio de los síntomas del error
2. Determinación de las causas
3. Corrección
4. Prueba.
Pueden existir varias causas de error que se pueden agrupar en dos grandes
grupos:
1.- Errores de sintaxis
2.- Errores lógicos:
Para el primer caso, al momento de compilar el programa, éste detecta los
errores y es posible corregirlos.
Mirar anexo referente a errores comunes de programación y algunas buenas
prácticas de programación, propuesto por Miguel Á. Toledo Martínez 1
Los errores lógicos son más difíciles de corregir, pues el compilador no los
detecta. Un ejemplo válido se muestra al analizar un programa para el pago de la
nómina de 500 empleados, se produce una equivocación a la hora de hacer la
fórmula de los descuentos, en lugar de realizar la resta se hace una suma. Como
se puede ver en este ejemplo es un error muy grave, pero de análisis y no
de sintaxis, por lo tanto el programa no lo detectará. Por lo tanto es indispensable
realizar una buena interpretación del problema para desarrollar el diseño y
codificación del programa.
19
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Detección de Errores
Cuando la fase de compilación no ha terminado con éxito, en la parte inferior de la
ventana principal aparece activada la pestaña Compilador, con tres columnas:
∑ Línea: Indica la línea donde el compilador detectó el error sobre el fichero
fuente. Realmente el error puede estar en dicha línea o en alguna de las
anteriores. Haciendo doble click en esta fila de la pestaña Compilación, el
cursor se ubicará sobre la línea del fichero fuente donde el compilador detectó
el error.
∑ Unidad: Indica la ubicación del fichero en la unidad de almacenamiento.
∑ Mensaje: Indica el tipo de error detectado por el compilador. En esta columna
también aparece una fila que no tiene asociado número de línea, y que brinda
información sobre la función en la que se produjo el error.
Después de corregir un error, se sugiere guardar el archivo y volver a compilar.
Esto hay que hacerlo siempre, aunque aparezcan más errores en la ventana, ya
que es muy posible que el resto de los errores sean consecuencia del primero.
Cómo Depurar programas
Un depurador permite ejecutar paso a paso un programa, observando el valor de
las variables que más interesan. Por lo tanto es una herramienta muy útil para
detectar errores lógicos que de otro modo resultarían muy difíciles de localizar.
Dev C++ cuenta con el depurador gdb integrado. Antes de compilar, y para que se
añada al fichero ejecutable cierta información que luego utilizará el depurador de
programas, se debe comprobar que está seleccionada la siguiente opción:
Herramientas / Opciones de Compilador / Configuración / Linker / Generar
Información de Debug: Yes.
Comenzar la depuración
1. Colocar el cursor sobre la primera instrucción de main.
2. Pulsar Ctrl+F5, o bien mover el ratón a la parte más izquierda de una línea de
código y pulsar el botón izquierdo del ratón en dicha posición, o bien Depurar /
Añadir / Quitar punto de ruptura. Esto hará que quede marcada la instrucción,
indicando que se insertado un punto de ruptura (la línea quedará marcada en
rojo) que obligará al depurador a detenerse en este punto. Para eliminar los
puntos de ruptura se realiza la misma operación que para marcarlos.
3. Pulsar F8, o bien, Depurar / Depurar (esto se puede hacer en el Menú
Principal, o en las pestañas inferiores), con lo que comenzará la ejecución
paso a paso del programa, indicándose en azul cuál será la siguiente línea que
se ejecutará. Además aparecerá una ventana de MS-DOS para que se realicen
las entradas y salidas que el programa necesite durante su depuración.
20
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Control de la depuración.
Siguiente Paso (F7): ejecuta la siguiente instrucción del programa (la marcada en
color azul). Cuando dicha instrucción contiene una llamada a una función/método,
dicha función/método se ejecuta completamente tras seleccionar Siguiente Paso.
Esta posibilidad es muy útil cuando hay seguridad de que esa función/método no
contiene ningún tipo de error.
Avanzar Paso a Paso (Shift+F7): ejecuta la siguiente instrucción del programa. Si
dicha instrucción contiene una llamada a una función o método el índice de
ejecución (línea marcada en azul) se situará en la primera sentencia de dicha
función/método para ejecutarlo paso a paso.
Saltar Paso (Ctrl+F7): Ejecuta instrucciones hasta alcanzar el siguiente punto de
ruptura. Cuando no hay puntos de ruptura situados después de la sentencia
actual, se ejecutarán todas las instrucciones hasta finalizar el programa.
Ir a cursor (Shift+F4): ejecuta sentencias hasta el lugar donde se sitúa el cursor.
Parar ejecución (Ctrl+Alt+F2): Detiene la ejecución paso a paso, sin necesidad
de llegar al final del programa.
Visualización del contenido de las variables
Para ello existe la ventana Watch, que se activa pulsando la pestaña Depurar
situada en la parte izquierda del entorno.
Cuando se quiere añadir una variable a dicha ventana se puede: pulsar la opción
Añadir Watch (F4) para después escribir el nombre de la variable, o seleccionar
la variable con el ratón y pulsar Añadir Watch.
Para eliminar una variable de la ventana Watch, se marca y se pulsa Quitar
Watch.
21
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 2: CONCEPTOS BÁSICOS DE LOS PROGRAMAS EN C
Introducción
C es un lenguaje de programación de propósito general que utiliza, en relación a
otros lenguajes, una cantidad bastante limitada de términos específicos, y cuenta
con control de flujo, estructuras sencillas y un buen conjunto de operadores. Se
podría decir que es un lenguaje pequeño, sencillo y no está especializado en
ningún tipo de aplicación, lo que lo convierte en un lenguaje potente, con un
campo de aplicación muy amplio que facilita los procesos de aprendizaje, porque
con dedicación en poco tiempo se puede conocer lo esencial para desarrollar
buenos programas
En este capítulo se abordarán los conceptos básicos necesarios para iniciar este
recorrido sobre programación.
Lección 6: Estructura general de un programa en C
Un programa en C está constituido básicamente por:
∑ Directivas del pre-procesador:
∑ [declaración de variables globales]
∑ [prototipos de funciones]
∑ Función main
∑ [definiciones de funciones]
Directivas del Pre-procesador: las directivas son instrucciones que se le dan al
compilador antes de que se compile el programa principal. Las más usuales son:
#include y #define. La directiva #include indica al compilador que lea el archivo
fuente que está a continuación, y su contenido lo inserte en la posición donde se
encuentra dicha directiva.
Los archivos mencionados se conocen como archivos de cabecera o archivos de
inclusión. Por ejemplo se puede indicarle al compilador que se va a hacer uso
de las funcionalidades que proporcionan ciertas bibliotecas (en este caso
predefinidas), de tal manera que para emplear la biblioteca de entrada/salida
iostream se debe incluir iostream.h.
#include <iostream.h>
La directiva #define, indica al compilador que defina un ítem de datos u operación
para el programa que se está desarrollando. Por ejemplo:
#define CANTIDAD 100
Esta instrucción indica que se sustituya CANTIDAD por el valor 100, cada vez que
22
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
aparezca en el programa.
Declaración de variables y constantes globales: las variables y constantes
globales son aquellas cuyo valor afecta a todo el programa, esto es que se
reconocen en todas las funciones donde se utilicen. Deben ubicarse antes de la
función main(), se indica el tipo de dato y el nombre de la variable. Ejemplo:
Int VARIABLE1;
Cabecera de funciones: se realiza una descripción a manera de prototipo
de las funciones que se crearan más adelante. Ejemplo:
Int funcion1();
Función main(): todo programa escrito en C está constituido por funciones, y la
función principal es main(), que no puede faltar en ningún programa. Luego del
termino main() se escribe el bloque de código, que generalmente incluye
llamadas a otras funciones definidas por el usuario. Ejemplo de su estructura:
int main()
{ sentencia 1;
sentencia 2;
return(0)
}
Las variables y constantes globales se definen antes de la función principal
main(), asi como las variables y constantes locales se declaran en la cabecera del
cuerpo de la función principal y de otra función definida por usuario.
Las sentencias que se incluyen en las funciones, finaliza con punto y coma (;).
Definición de funciones: es necesario crear las funciones que se definieron
como prototipos para darle viabilidad al programa. Las funciones se crean para
realizar una tarea específica, pueden devolver o no datos y utilizar o no
argumentos. Todas las funciones tienen nombre. Recuerde que debe declarar su
prototipo antes de la función principal main(), de lo contrario al compilar el
programa se generará un error.
Sentencias: cada una de las ordenes que se le da al compilador por medio del
lenguaje para que efectué una acción. Las sentencias finalizan con punto y coma
(;).
23
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Lección 7: Elementos de un programa en C
Los elementos más relevantes de un programa en C son:
Identificadores: un identificador es una secuencia de caracteres, letras,
dígitos y subrayados (_). Para escribir un identificador se debe tener en cuenta:
o
El primer carácter sólo puede ser una letra o un subrayado (no pueden
iniciar con dígitos).
o
Son sensibles a las mayúsculas, esto es, existe diferencia entre: UNAD,
Unad, uNad.
o
Pueden tener cualquier longitud, pero sólo son significativos los 32
primeros.
o
No pueden ser palabras reservadas, como if, switch, int, entre otras.
∑ Palabras reservadas: son términos especiales que hacen parte del lenguaje y
tienen un significado especial. Estas palabras reservadas no se pueden utilizar
como nombre de identificador o función.
Las siguientes son palabras reservadas: asm, enum, auto, extern, break, float,
case, for, char, goto, const, if, signed, sizeof, static, struct, switch, typedef,
continue, default, do, double, else, int, long, register, return, short, union,
unsigned, void, volatile, while.
∑ Comentarios: es toda la información que se añade al archivo del programa y
que es ignorada por el compilador. Generalmente son aclaraciones que se
realizan sobre las estructuras y datos que se están manejando. En C los
comentarios inician por /* y terminan con */ y cuando el comentario alcanza
en una sola línea se utiliza //ejemplo de comentario de una línea.
∑ Signos de puntuación y separadores: todas las sentencia en C terminan con
punto y coma (;). Los separadores son espacios en blanco, tabulaciones,
retornos de carro y avances de línea. Los signos que también se utilizan son:
!
% [ ] ^ \ &
; *
'
(
:
) <
- >
+ ? = ,
{
.
} / ~
"
∑ Archivos de cabecera: son archivos especiales que contienen declaraciones
de elementos y funciones de la biblioteca. Utiliza la directiva #include para
insertar los archivos de cabecera. Ejemplo: si va a utilizar las funciones printf()
y scanf() debe declarar la librería stdio.h asi:
#include <stdio.h> /* o bien */ #include "stdio.h"
Lección 8: Tipos de datos
C no cuenta con muchos tipos de datos predefinidos, sin embargo si tiene la
24
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
capacidad para crear sus propios tipos de datos. Los tipos básicos son;
Enteros
∑ Números de coma flotante (reales)
∑ Caracteres
La siguiente tabla muestra los distintos tipos de dato que se pueden usar en C
para declarar variables.
TIPOS DE DATOS BÁSICOS RECONOCIDOS POR TURBO C
TIPO
TAMAÑO en
Bytes de la Variable
RANGO de Valores que
Puede Almacenar
Cuando Usamos
char
1
0 255
‘Á’
’Z’,
$
Para almacenar
int
2
-32767 32768
números enteros
Para almacenar
double
8
1.7E-308 1.7E308
números Reales
float
4
3E-38 3E38
Variables que
almacenan números
reales.
pointer
2 byte
Punteros near,
es, _es, ss
Para variables que
guardan direcciones
de memoria
long double
10 bytes
3.4E-4932 a 1.1 E 4932
Variables Reales
TABLA 1. Tipos de datos básicos
Declaración de Variables
Antes del main() o después de él se deben definir las variables, ejemplo:
float
a, b, x;
Las variables que se declaran dentro del main() se dice que son variables
locales, las que se declaran antes del main() se dicen globales.
Una variable se puede declarar de las siguientes maneras:
Formato general: tipo_de_dato nombre_variable = valor_inicial. Ejemplo;
int variable1 = 100;
Se pueden declarar múltiples variables en una línea, asi:
int edad, tipo, categoría = 2; //tipo de dato entero
int v1; int v2;
int serie1 = 123, serie2 = 456;
float nota1=2.5;
char letra = ´C´
//tipo de dato real
//tipo de dato caracter
25
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Lección 9: Entradas y salidas
Se iniciará por analizar cómo se realiza la presentación de datos e información por
pantalla, para ello se puede utilizar las funciones printf() o cout, aunque esta última
corresponde más al lenguaje de C++.
Salidas por pantalla
printf( ) es una función standar de salida de C, está disponible al incluir stdio.h
tiene 2 partes: nombre de la función y sus argumentos. Ej. printf(“mi edad es
%d\n”, edad).
o
Primer argumento: es una cadena de caracteres que puede tener
caracteres y/o secuencias de escape y/o códigos de formato. Las
secuencias de escape inician con \.
Ej. \n secuencia de escape que indica retorno de carro (nueva línea); y los
códigos de formato inician con %. Ej: %d indica que un entero se
visualizará en forma decimal entera.
o
Segundo argumento contiene la o las variables que se van a mostrar. Los
argumentos se separan mediante una coma.
o
El número de variables debe corresponder al número de indicadores de
formato que se tienen en el primer argumento.
o
Ejemplo: int a = 10, b = 20, c;
printf(“\nEl valor de a es %d”,a); // 1 indicador y 1 variable
printf(“\nEl valor de b es %d”, b); // 1 indicador y 1 variable
c= a + b;
printf(“\n %d + % d = %d”, a,b,c); // 3 indicadores y 3 variables
Los indicadores de formato son:
%c
caracter
%d
int
%ld
long int
%f
float
%lf
double
%s
cadena
Un pequeño programa sería el siguente:
#include<stdio.h>
#include<conio.h>
int main()
{ int edad = 20;
printf(“Mi nombre es María y tengo %d”,edad);
getch();
return(0);
}
cout << imprime en pantalla la información, sea esta una cadena de texto (se
escribe entre comillas dobles) o el valor que contiene una variable. Además se
puede incluir indicadores de formato que indican una tarea específica como
saltar una línea o tabular. Requiere incluir la librería iostram.h
26
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Ejemplos:
int x = 10;
cout << “Programa de Ingeniería”; // imprime una cadena
cout << “\n”; // ejecuta un salto de línea
cout << x; // imprime el valor que contiene la variable x
cout << “\n El valor de x es “; // imprime El valor de x es 10
Almacenar datos
Los datos se pueden almacenar en las variables desde la codificación, a esto se le
conoce como asignar valores.
Ejemplos: int a = 30; // declaración de una variable y asignación de valor
float b;
// declaración de una variable
b = 35.45 // asignación de un valor a la variable b
Entradas por teclado
scanf(): la función scanf(), disponible al incluir stdio.h, permite leer datos por
teclado. La función scanf se usa de un modo similar a printf(), su primer
argumento es una cadena con marcas de formato. A éste le siguen una o más
direcciones de memoria. Si desea leer por teclado el valor de una variable
entera a, puede hacerlo así: scanf ("%d", &a);
Observe que la variable cuyo valor se lee por teclado va obligatoriamente
precedida por el operador &: es así como se obtiene la dirección de memoria
en la que se almacena el valor de la variable. Uno de los errores más
comunes es omitir el carácter & que debe preceder a todas las variables
escalares en scanf .
Sintaxis: scanf(“indicador_de_formato”, identificador)
o
Los argumentos indican los tipos de datos que se van leer y el nombre
de las variables donde se van a guardar. Ej: scanf(“%d”, &pies).
o
A los identificadores les precede el &, salvo cuando se trata de vectores,
como es el caso de las cadenas.
o
Para almacenar un carácter utilice cscanf( );
o
Ejemplo: int a;
char letra, palabra[10];
printf(“Digite un número : ”);
scanf(“%d ”, &a);
printf(“\n Digite una vocal : ”);
cscanf(“%c”, &letra);
printf(“\n Digite una palabra : ”);
scanf(“%s”, palabra);
27
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Lección 10: Operadores y expresiones
Una expresión es una sucesión de operadores y operandos debidamente
relacionados que especifican un cálculo.
Ejemplo: int a=10, b=20, total=0;
total = a + b; //ésta es una expresión
Operadores
Los operadores se clasifican en:
Operador de asignación: permite asignar un valor a una variable numérica. El
operador igual (=) asigna el valor de la expresión derecha a la variable situada
en la izquierda. Ej. A = 10; //almacena el valor 10 en la variable A.
∑ Operadores aritméticos: se utilizan para realizar operaciones aritméticas
básicas.
o
Suma: +
o
Resta: -
o
Multiplicación: *
o
División: /
o
Módulo: % Se utiliza para encontrar el valor del residuo de una
división. Ej. x = 5 / 2; // el valor que se almacena en x es 1
o
Incremento: ++ Incrementa el valor de una variable de tipo numérico en
1. Ej. int x = 10;
x++; // el valor de x es 11
o
Decremento: -- Decrementa el valor de una variable de tipo numérico
en 1. Ej. int y = 5;
y--;
// el valor de y es 4
Las prioridades de ejecución son:
o
++ y --,
o
*, /, %
o
+, -
∑ Operadores Lógicos
o
&& es conocido como and (y). Se utiliza para unir condiciones, para que
la expresión sea verdadera, todas las condiciones que se unen deben
ser verdaderas.
o
|| operador or (o). La sentencia es verdadera cuando una de las
condiciones es verdadera. (alt-124).
o
! niega la expresión o condición. Ej. !(a>b) indica a no es mayor que b
28
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Otros Operadores Relacionales
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
= = igual. Se utiliza para condiciones
29
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 3: SENTENCIAS DE CONTROL Y FUNCIONES
Introducción
La forma más razonable de encarar el desarrollo de un programa complicado es
aplicar lo que se ha dado en llamar "Programación Top-Down".
Esto implica que, luego de conocer cuál es la meta a alcanzar, se subdivide esta
en otras varias tareas concurrentes, por ejemplo:
Leer un teclado, procesar datos, mostrar los resultados. Luego a estas se las
vuelve a dividir en otras menores:
Y así se continúa hasta llegar a tener un gran conjunto de pequeñas y simples
tareas, del tipo de "leer una tecla" ó "imprimir un caracter". Luego sólo resta
abocarse a resolver cada una de ellas por separado. De esta forma el
programador, sólo se las tendrá que ver con diminutas piezas de programa, de
pocas líneas, cuya escritura y corrección posterior es una tarea simple.
Tal es el criterio con que está estructurado el lenguaje C, donde una de sus
herramientas fundamentales son las funciones. Todo compilador comercial trae
una gran cantidad de Librerías de toda índole, matemáticas, de entrada - salida,
de manejo de textos, de manejo de gráficos, etc, que solucionan la mayor parte
de los problemas básicos de programación.
Ahora bien, para que esos bloques de código cumplan tareas específicas, es
indispensable incluir sentencias de control y repetitivas que apoyan el diseño
estructural de un programa y que se debe utilizar en atención a lo que se requiere
lograr en la tarea.
Lección 11: Sentencias de control selectivas if else, switch
Las sentencias condicionales permiten elegir entre dos o más opciones.
if … else: Se utiliza para elegir entre dos opciones.
Sintaxis: if (condicion) sentencia si la condición es verdadera
else sentencia si la condición es falsa.
En C, si se utiliza más de una sentencia es necesario utilizar llaves.
Ejs: if (a= = b) printf(“iguales”);
else printf(“diferentes”);
if (a= = b)
30
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
{
c++;
x
= z;
}
else
{
v--;
y
= t;
}
Los if pueden anidarse para evaluar varias condiciones. Ej.
if (condicion1)
{
sentencia 1;
sentencia 2;
if (condición 2)
{
if (condición 3)
{
sentencia 3;
sentencia 4;
}
else
{
sentencia 5;
sentencia 6;
}
}
}
else
{
sentencia 7;
sentencia 8;
}
switch: es una sentencia de bifurcación múltiple, que permite comparar una
variable sucesivamente frente a una lista de constantes enteras o de carácter.
Al encontrar una coincidencia se ejecuta el bloque de sentencias respectivas.
Sintaxis: switch(variable)
{
case constante1:
{
bloque de sentencias;
break;
}
case constante2:
{
bloque de sentencias;
break;
}
case constante3:
{
bloque de sentencias;
break;
}
default:
{
bloque de sentencias;
31
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
}
}
La opción default se ejecuta cuando no hay coincidencias y es opcional.
Se diferencia de if en que sólo permite comprobar por igualdad.
Ej. char letra;
printf(“Digite letra : ”); cscanf(“%c”,&letra);
switch ( letra)
{
case ‘a’:
printf ( “ letra a “);
break;
case ‘e’:
printf ( “ letra e “);
break;
case ‘i’:
printf ( “ letra i “);
break;
case ‘o’:
printf ( “ letra o “);
break;
case ‘u’:
printf ( “ letra u “);
break;
default :
printf ( “ no es vocal “);
}
Lección 12: Sentencias de control repetitivas for, while, do while
Las sentencias de control repetitivas, conocidas también como ciclos, permiten
repetir un conjunto de instrucciones, mientras se cumpla una condición. Utiliza una
variable control y puede interrumpirse mediante la instrucción break.
for (inicialización ; condición ; incremento)
{ bloque de sentencias;
}
Ej. Imprimir los números pares comprendidos entre 0 y 20.
int i, residuo;
for (i=1 ; i<=20; i++)
{
residuo = i % 2;
if ( !residuo) printf(“\n %d”, i);
}
Si únicamente existe una sentencia que ejecutar la sintaxis es:
int i;
for(i=1; i<=10; i++) printf(“%d”, i);
32
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
La siguiente sintaxis for( ; ; ) crea un ciclo infinito, a menos que exista una
condición interna que obligue a salir del ciclo. Ej.
int i;
char r;
for ( ; ; )
{ printf(“Desea continuar (s/n) : ”);
cscanf(“%c”,&r);
if ( r != ‘s’) break;
}
Sentencia break: se utiliza para terminar la ejecución de un ciclo. Ejemplo:
int i;
for(i=0; i<=10; i++)
{
printf (“\n %d”,i);
if (i= =5) break;
} // únicamente imprime los números del 0 al 5.
∑ Ciclo while: ejecuta un bloque de sentencias mientras la condición que evalúa
es verdadera. Las condiciones que debe cumplir son:
o
Antes del ciclo la variable que se evalúa debe tener un valor que haga la
condición verdadera.
Dentro del ciclo la variable control debe cambiar para que en algún
momento la condición sea falsa y pueda terminar el ciclo.
Ej. Verificar si el valor digitado en nota, es un número entre 0 y 5.
float nota;
printf(“Digite nota : ”);
scanf (“%f ”,&nota);
while ( nota <0 || nota > 5)
{ printf(“NOTA INCORRECTA”);
printf(“Digite nota : ”);
scanf (“%f ”,&nota);
o
}
∑ Ciclo do …
while: ejecuta un bloque de sentencias y al final verifica si la
condición es verdadera. La diferencia fundamental entre los ciclos while y do
while, es que el primero evalúa la condición al inicio del ciclo y el segundo la
evalúa al final. Esto hace que el bloque de sentencias en do while, se ejecuten
por lo menos una vez.
Sintaxis: do
{ bloque de sentencias;
}
while (condición) ;
Ej.:
33
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
int op;
do
{ printf(“\n\n”);
printf(“1. Llenar información ”);
printf(“\n2. Mostrar información ”);
printf(“\n3. Eliminar información ”);
printf(“\n4. Salir ”);
printf(“\n\n”);
printf(“Elija opción : ”);
scanf(“%d”, &op);
switch(op)
{ case 1:
{
printf(“\n Llenar”);
break;
}
case 1:
{
printf(“\n Mostrar”);
break;
}
case 1:
{
printf(“\n Eliminar”);
break;
}
}
while(op!=4);
printf(“\nDigite una tecla para continuar …”);
getch( );
}
Lección 13: Funciones, declaración
Todo programa bien estructurado utiliza funciones creadas por el programador, a
continuación se describen los pasos básicos para trabajar con funciones.
Definición de una Función: la definición de una función puede ubicarse en
cualquier lugar del programa, con sólo dos restricciones: debe hallarse luego de
dar su prototipo, y no puede estar dentro de la definición de otra función (incluida
main() ). Es decir que a diferencia de Pascal, en C las definiciones no pueden
anidarse.
NOTA: no confundir definición con llamada; una función puede llamar a tantas
otras como desee.
La
definición
debe
comenzar
con
un
encabezamiento,
que
debe
coincidir
34
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
totalmente con el prototipo declarado para la misma, y a continuación del mismo,
encerradas por llaves se escribirán las sentencias que la componen; por ejemplo:
#include <stdio.h>
float mi_funcion(int i, double j ); /* DECLARACION observe que termina en ";" */
main()
{
float k ; int p ; double z ;
k = mi_funcion( p, z );
/* LLAMADA a la función */
}
/* fin de la función main() */
float mi_funcion(int i, double j )
/* DEFINICION observe que NO lleva ";" */
{
float n
printf("%d", i );
/* LLAMADA a otra función */
return ( 2 * n );
/* RETORNO devolviendo un valor float */
}
Declaración de una Función: antes de escribir una función es necesario
informarle al Compilador los tamaños de los valores que se le enviarán en el stack
y el tamaño de los valores que ella retornará al programa invocante.
Estas informaciones están contenidas en la DECLARACIÓN del PROTOTIPO DE
LA FUNCIÓN.
Formalmente dicha declaración queda dada por:
tipo del valor de retorno
nombre_de_la_función(lista de tipos de parámetros)
Algunos ejemplos :
float mi_funcion(int i, double j ) ;
double otra_funcion(void) ;
otra_mas(long p) ;
void
la_ultima(long double z, char y, int x, unsigned long w) ;
El primer término del prototipo indica el tipo de dato retornado por la función; en
caso de obviarse el mismo, se toma por omisión el tipo int. Sin embargo, aunque
35
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

la función devuelva este tipo de dato, para evitar malas interpretaciones es conveniente explicitarlo. Ya que el "default" del tipo de retorno es el int, se debe indicar cuando la función NO retorna nada, esto se realiza por medio de la palabra void (sin valor). Cuando no se envían argumentos, el paréntesis correspondiente queda vacio.

argumentos, el paréntesis correspondiente queda vacio. La declaración debe anteceder, en el programa, a la
argumentos, el paréntesis correspondiente queda vacio. La declaración debe anteceder, en el programa, a la
argumentos, el paréntesis correspondiente queda vacio. La declaración debe anteceder, en el programa, a la

La declaración debe anteceder, en el programa, a la definición de la función. Es normal, por razones de legibilidad de la documentación, encontrar todas las declaraciones de las funciones usadas en el programa, en el HEADER del mismo, junto con los include de los archivos *.h que tienen los prototipos de las funciones de Librería.

*.h que tienen los prototipos de las funciones de Librería. Si una ó más de nuestras
*.h que tienen los prototipos de las funciones de Librería. Si una ó más de nuestras

Si una ó más de nuestras funciones son usadas habitualmente, se puede disponer su prototipo en un archivo de texto, e incluirlo las veces que se necesite.

cuadrado(); cout << cuadrado(25); ó
cuadrado();
cout << cuadrado(25);
ó
se necesite. cuadrado(); cout << cuadrado(25); ó Lección 14: Llamados de Función Una vez que en

Lección 14: Llamados de Función

Una vez que en su programa se ha definido una función, esta puede ser llamada las veces que sean necesarias. Para llamar a una función basta con hacer referencia a su nombre y si la misma requiere de parámetros estos deberán indicarse dentro de paréntesis.

Para llamar a una función que no requiera de parámetros se deberá indicar el nombre de la misma seguida de paréntesis vacios. Por ejemplo, para llamar una función llamada “cuadrado”, se escribiría:

Si la función cuadrado utiliza un parámetro de tipo int, se escribiría:

cout << cuadrado(X);

Si la función cuadrado utiliza un parámetro y además devuelve un valor, su llamada sería:

R = cuadrado(X); // guardar en R el cuadrado de X

sería: R = cuadrado(X); // guardar en R el cuadrado de X Prototipos: para utilizar una

Prototipos: para utilizar una función en un programa, se requiere en primer lugar declararla y después definirla. La declaración de la función le indica al compilador

el nombre, el tipo de dato devuelto por la función y los parámetros pasados a la función. A la declaración de una función se le llama también el prototipo

de una función se le llama también el prototipo Un prototipo es una declaración de una

Un prototipo es una declaración de una función. Consiste simplemente en el encabezado de la función, terminado con punto y coma (;) lo que hace es avisar al compilador, como se va a llamar la función y si recibe y devuelve información

La estructura de un prototipo es:

<tipo> func(<lista de declaración de parámetros>);

36

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Ejemplo:
int Mayor(int a, int b); // es un prototipo de función que devuelve un entero y
recibe dos parámetros enteros.
Aunque C permite realizar el prototipo de la siguiente manera:
int Mayor(int,int);
Sin necesidad de escribir el nombre de las variables; entonces La estructura de
un programa en C quedaría así:
[directivas del pre-procesador: include y define]
[declaración de variables y constantes globales]
[prototipos de funciones]
función main ()
[definiciones de funciones] //definidas en los prototipos
Lección 15: Recursividad
Esta es la propiedad que tienen las funciones en C de poder llamarse a sí
mismas. Se dice que una función es recursiva cuando se autollama. No todas
las funciones pueden llamarse a sí mismas (ser recursivas), deben
estar diseñadas especialmente para que tengan un final y no se conviertan en
ciclos o bucles infinitos.
Es importante notar que cuando una función se llama a sí misma, una nueva
copia de esta función es la que se ejecuta. Las variables locales de la segunda
función no interfieren con las variables locales de la primera, así mismo, las
variables locales no se pueden afectar mutuamente. Se tomará como ejemplo
un programa que calcule el factorial de un número entero introducido por el
usuario. El factorial está definido como el producto del número en cuestión por
todos los números enteros menores que él, de tal manera que el factorial de
5=5*4*3*2*1 = 120. El código puede quedar así:
#include <iostream.h>
double factorial(int valor);
int K=1; // variable global, para un contador general
int main()
{
int num;
cout << "Introduzca un numero" << endl;
cin >> num;
37
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
cout << endl;
cout << “El factorial del número es “ << factorial(num) << endl;
cout << "La función se llamo en forma recursiva " << k << " veces" << endl;
return 0;
}
double factorial(int valor)
{
double R;
if(valor<=1) return 1;
else
{
R= (valor*factorial(valor-1)); K = K+1;
}
return resultado;
}
1.
La función se declara de tipo doble, puesto que los valores que retorna la
función pueden ser demasiado grandes.
2.
También se utiliza una variable global (K), que sirve de contador, para
determinar el número de iteraciones que la función se repite
3.
El programa empieza solicitándole un número entero y después llama por
primera vez a la función factorial ( ). La recursividad necesita una condición
para terminar el proceso en el momento especifico, por ésta razón, la función
factorial () determina en primer lugar si el valor pasado como parámetro de la
función es igual a 1, en cuyo caso la función retorna 1. Si el valor del
parámetro es mayor que 1, entonces la función factorial ( ) se llama a sí
misma tomando como parámetro el valor original menos uno, multiplicando
éste valor por el valor del parámetro original y almacenando el
resultado en la variable llamada resultado. (se recomienda realizar una
prueba de escritorio para entender un poco más el movimiento de la
función y sus iteraciones).
38
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD 1
Existe un ejercicio clásico, la intencionalidad no es transcribirlo, es leer los
enunciados y desarrollarlo utilizando funciones recursivas, se trata de las torres
de Hanoi
La Leyenda: En una ciudad antigua en la India, los monjes de un templo tienen
que mover una pila de 64 discos sagrados a partir de una localización a otra. Los
discos son frágiles; solamente uno se puede llevar al mismo tiempo. Un disco no
se puede colocar encima de un disco más pequeño, menos valioso. Y,
hay solamente otra localización en el templo (además de la original y de la
localización de destino) bastante sagrada y solo una pila de discos se puede
colocar allí. Así pues, los monjes comienzan a mover discos hacia adelante y
hacia atrás, entre la pila original, la pila en la nueva localización, y la
localización intermedia, manteniendo siempre el orden (más grande en el fondo,
más pequeño en la tapa). La leyenda consiste en que, antes de que los monjes
hagan el movimiento final de terminar la pila nueva en la nueva localización, el
templo se convertirá en polvo y el mundo terminará. Tú qué crees?
dejémonos de leyendas y vamos a lo que vamos
Bueno
El "Juego" torres de Hanoi consiste en tres palos, en el cual el primer palo tiene N
número de argollas colocadas de tal manera que las más grandes siempre deben
estar por debajo de las más pequeñas
el
segundo palo le podremos llamar palo
auxiliar y es el que nos ayudará de cierta manera a lograr el desarrollo del juego
el cual será lograr pasar todas las argollas al tercer palo de tal manera que se
mueve una argolla a la vez y que nunca una argolla grande quede encima
de una pequeña …
FIGURA 3. Torres de Hanoi
39
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
UNIDAD 2
Nombre de la Unidad
ARREGLOS
Introducción
En la unidad 1 ya se estudió el tema de algunos tipos básicos de datos,
como por ejemplo char, int y float. El lenguaje C permite, organizar
y almacenar datos, de diversas maneras, una de las formas utilizadas
son las variables que guardan un solo dato a la vez. También hay
estructuras más complejas, como es el caso de los arreglos.
Arreglo: colección ordenada de elementos de un mismo tipo. Ordenada
significa que cada elemento tiene una ubicación determinada dentro del
arreglo, la cual se debe conocer para lograr tener acceso a uno de sus
elementos.
Se iniciará con los arreglos unidimensionales, luego los arreglos
bidimensionales, también llamados matrices, se estudiará un tipo
especial de arreglo, como es la cadena, con las funciones más
importantes para trabajar con ellas. También se abordará los temas de
ordenación y búsqueda de datos. Y finalizará con el tema de punteros o
apuntadores.
Justificación
Todo programa de computador utiliza datos, que una vez procesados se
convierten en información, es decir que pasan de ser datos simples a
datos con significados, que ayudan a entender una situación. Pues bien,
el reto es que esos datos se organicen y almacenen de tal manera, que
faciliten su manipulación y administración.
Cuando se necesita un dato específico se recurre al proceso de
búsqueda, y para que ésta sea más ágil, una gran ayuda es que los
datos estén organizados en atención a uno o varios criterios. De ahí la
importancia de conocer como se almacenan datos de igual tipo, y como
se realizan los procesos de ordenación y búsqueda.
Intencionalidades
Formativas
Conceptuar referente a estructuras de datos que manipulan volumen
mayor de información
Propósitos de la unidad
Conocer el trabajo que se realiza con vectores, arreglos y
cadenas de caracteres.
Realizar búsquedas y ordenamientos utilizando algoritmos
diseñados para tal fin.
Interpretar el trabajo con punteros o apuntadores
Objetivos de la unidad
Tener claridad en la importancia que tienen los vectores, los
arreglos y las cadenas de caracteres.
Tener claridad en los criterios de búsqueda y ordenamiento.
Analizar el trabajo con punteros o apuntadores
40
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Competencias de la unidad
Dominar las técnicas de búsqueda y ordenamiento aplicado a
estructuras básicas de la programación.
El estudiante aplica los vectores y arreglos como herramienta
fundamental en la programación de computadoras.
El estudiante utiliza los punteros para almacenar y acceder a la
información.
Metas de aprendizaje
Realizar programas con un nivel medio de complejidad
Denominación de
capítulos
Arreglos y cadenas
Ordenación y búsqueda
Punteros o apuntadores
41
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 4: ARREGLOS Y CADENAS
Introducción
Esta unidad permite el acercamiento al mundo de los datos estructurados,
para tal efecto se iniciará con los datos más sencillos como son los arreglos
unidimensionales, luego se trabajará con arreglos bidimensionales, conocidos
también como matrices, para continuar con las cadenas de caracteres.
Además de la importancia de conocer como se almacena la información, es
indispensable saber cómo acceder a ella; estos temas serán aclarados en la
organización y búsqueda de datos, donde se analizarán diferentes propuestas
para realizar esos procesos.
Lección 16: Definición y Declaración
Los arreglos son una colección de variables del mismo tipo que se referencian
utilizando un nombre común. Un arreglo consta de posiciones de
memoria contigua. La dirección más baja corresponde al primer elemento y la
más alta al último. Un arreglo puede tener una o varias dimensiones. Para
acceder a un elemento en particular de un arreglo se usa un índice.
El formato para declarar un arreglo unidimensional es:
tipo nombre_arr [ tamaño ]
Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez
elementos se hace de la siguiente forma:
int listanum[10];
En C, todos los arreglos usan cero como índice para el primer elemento. Por
tanto, el ejemplo anterior declara un arreglo de enteros con diez elementos
desde listanum[0] hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es:
listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/
num = listanum[2]; /* Asigna el contenido del 3er elemento a la variable
num */
El lenguaje C no realiza comprobación de contornos en los arreglos. En el caso
de que sobrepase el final durante una operación de asignación, entonces
42
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
se asignarán valores a otra variable o a un trozo del código, esto es, si se
dimensiona un arreglo de tamaño N, se puede referenciar el arreglo por encima
de N sin provocar ningún mensaje de error en tiempo de compilación o ejecución,
incluso aunque probablemente se provoque el fallo del programa. Como
programador se es responsable de asegurar que todos los arreglos sean lo
suficientemente grandes para guardar los datos que se indicarán en el programa.
C permite arreglos con más de una dimensión, el formato general es:
tipo nombre_arr [ tam1 ][ tam2 ]
[ tamN];
Por ejemplo un arreglo de enteros bidimensionales se escribirá como:
int tabladenums[50][50];
Observar
que
para
declarar
cada
dimensión
lleva
sus
propios
paréntesis
cuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo
unidimensional, esto es,
tabladenums[2][3] = 15; /* Asigna 15 al elemento de la 3ª fila y la 4ª
columna*/
num = tabladenums[25][16];
A continuación se muestra un ejemplo que asigna al primer elemento de un
arreglo bidimensional cero, al siguiente 1, y así sucesivamente.
main()
{
int t,i,num[3][4];
for(t=0; t<3; ++t)
for(i=0; i<4; ++i)
num[t][i]=(t*4)+i*1;
for(t=0; t<3; ++t)
{
for(i=0; i<4; ++i)
printf("num[%d][%d]=%d ", t,i,num[t][i]);
printf("\n");
}
}
En C se permite la inicialización de arreglos, debiendo seguir el siguiente
formato:
43
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
tipo nombre_arr[ tam1 ][ tam2 ]
[ tamN] = {lista-valores};
Por ejemplo:
int i[10] = {1,2,3,4,5,6,7,8,9,10};
int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
Lección 17: Arreglos Unidimensionales
También son llamados arrays unidimensionales y lo podríamos definir como un
conjunto de variables del mismo tipo y tamaño que ocupan posiciones
consecutivas en la memoria del ordenador. El tamaño en memoria que ocupa un
array es siempre fijo y no puede variar. Para calcular el tamaño en memoria que
puede ocupar un array sólo se tiene que multiplicar el número de elementos del
array por el tamaño en bytes del tipo de este. Es decir se aplica la siguiente
fórmula:
bytes totales = sizeof(tipo base) * número de elementos
Para declarar un vector se utiliza la siguiente sintaxis:
int vector[X];
Donde x, es un valor numérico que indica el número de elementos que contendrá
el vector.
En un arreglo unidimensional, el índice se ubica de forma gráfica tal y como lo ve
en la siguiente figura.
VECTOR[X]
0
1
2
3
4
5
6
7
FIGURA 4. Vector
Como se puede observar sólo se necesita de un índice (x) para acceder a cada
elemento de la “lista”. Por ejemplo si se quisiera rellenar la casilla 4 dándole el
valor 10, solo tendría que escribir la sentencia: vector[4]=10;
Cuando un array se pasa como argumento de una función, no se pasa una copia
completa del array, sino sólo la dirección del primer elemento del array. Para
44
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
hacer referencia a la dirección de inicio de un array se puede utilizar cualquiera
de estas dos formas (siendo más habitual la segunda)
Int *P, *Q;
P=&array[0]; /* Apunta al inicio del array, posición “0” */
Q=array;
/* Realiza la misma función que la línea de código anterior */
Ejemplo del uso de un vector:
#include <stdio.h>
#include <conio.h>
main()
{
int vector[7]; /* tipo nombre_del_array[Tamaño] */
int c;
/* Contador */
for(c=0;c<=6;c++)
{
printf("Numero para guardar en vector[%d]: ",c);
scanf("%d",&vector[c]);
}
for(c=0;c<=6;c++)
{
printf("\nValor Vector[%d]=%d",c,vector[c]);
}
getch();
}
Las principales operaciones que se realizan con un array son:
∑ Acceso: cada elemento de un array se nombra con el identificador del array
al que perteneces seguido de su posición entre corchetes [n-1]. Es decir, si en
un array[10], queremos nombrar la 4 posición, esta sería array[3].
∑ Asignación: normalmente para asignar valores a un array se utiliza un bucle
for. El ejemplo anterior muestra perfectamente el comportamiento y la
funcionalidad de este bucle.
El índice del for ha de ser capaz de recorrer todas las casillas del array.
∑ Iniciación: a un array se le puede dar valores iniciales, (donde lista de valores
es una lista de constante separadas por comas) para ello se declararía de la
siguiente forma:
45
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Tipo nombre_array[tamaño]={lista_valores};
int lista[6]={2,4,6,8,1,5};
int datos[100]={0};
int num[4]={4,5};
// todos se inicializan a 0
// equivale a {4,5,0,0}
Es muy importante que se inicialicen los arrays antes de usarlos, ya que
la declaración sólo reserva espacio en memoria para el array declarado,
sin asignación por defecto por parte del sistema.
Lección 18: Arreglos Bidimensionales
Se conocen también como MATRICES. Son arreglos de dos dimensiones que
utilizan dos índices para indicar la posición de cada elemento, el primero indica el
número de la fila y el segundo el número de la columna (los índices inician en 0).
Ejemplo de una matriz de 3 filas y 5 columnas, que contiene datos de tipo carácter
char matriz[3][5]
0
1
2
3
4
índice de columnas
0
a
b
c
d
e
Índice de
filas
1
e
f
g
h
i
3
j
k
l
m
n
FIGURA 5. Matríz
El carácter g se encuentra en matriz [1][2]
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
char matriz[7][7]; /* Declaración de matriz de 7*7 caracteres */
int c,d;
/* Contadores */
for(c=0;c<=6;c++)
{
for(d=0;d<=6;d++)
46
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
{
printf("Caracter para guardar en matriz[%d][%d]: ",c,d);
scanf("%c",&matriz[c][d]);
getchar();
}
}
for(c=0;c<=6;c++)
{
for(d=0;d<=6;d++)
{
printf("\nValor matriz[%d][%d]=%c",c,d,matriz[c][d]);
}
}
getch();
}
Lección 19: Cadenas de Carácter
A diferencia de otros lenguajes de programación que emplean un tipo
denominado cadena string para manipular un conjunto de símbolos, en C, se
debe simular mediante un arreglo de caracteres, en donde la terminación de la
cadena se debe indicar con nulo. Un nulo se especifica como '\0'. Por lo anterior,
cuando se declare un arreglo de caracteres se debe considerar un carácter
adicional a la cadena más larga que se vaya a guardar. Por ejemplo, si se quiere
declarar un arreglo cadena que guarde una cadena de diez caracteres, se hará
como:
char cadena[11];
Se pueden hacer también inicializaciones de arreglos de caracteres en donde
automáticamente C asigna el caracter nulo al final de la cadena, de la siguiente
forma:
char nombre_arr[ tam ]="cadena";
Por ejemplo, el siguiente fragmento inicializa cadena con ``hola'':
char cadena[5]="hola";
El código anterior es equivalente a: char cadena[5]={'h','o','l','a','\0'};
Para asignar la entrada estándar a una cadena se puede usar la función scanf
con la opción %s (observar que no se requiere usar el operador &), de igual forma
47
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
para mostrarlo en la salida estándar.
Por ejemplo:
main()
{
char nombre[15], apellidos[30];
printf("Introduce tu nombre: ");
scanf("%s",nombre);
printf("Introduce tus apellidos: ");
scanf("%s",apellidos);
printf("Usted es %s %s\n",nombre,apellidos);
}
El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o
flotantes, por lo que lo siguiente no es válido:
main()
{
char nombre[40], apellidos[40], completo[80];
nombre="José María";
/* Ilegal */
apellidos="Morelos y Pavón";
/* Ilegal */
completo="Gral."+nombre+appellidos; /* Ilegal */
}
Lección 20: Funciones de cadena
Existen funciones de carácter y cadena que amplían sus posibilidades de uso, a
continuación se explican algunas de ellas.
Funciones de Carácter
Para trabajarlas es necesario incluir en los programas la librería ctype.h
toupper( variable_char ): convierte un caracter a mayúsculas.
Ej. 1
char rta = ‘s’;
rta = toupper( rta ); // en la variable rta se encuentra ahora el carácter ‘S’
Ej. 2 char x;
Ej. 3
x = toupper(getche( )); // guarda en la variable x una letra en mayúsculas
// digitada por el usuario.
if ( toupper( getche( ) = = ‘S’) // verifica que la letra digitada por el
// usuario sea ‘S’.
tolower( variable_char) convierte un carácter a minúsculas.
48
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Funciones de Cadena
Para trabajar con cadenas es necesario utilizar ciertas funciones, que requieren
incluir en el programa la libreria: string.h
strcpy(cadena1,cadena2): copia en cadena1 el contenido de cadena2.
El primer argumento deben ser de tipo array de caracteres, el segundo puede
ser un array de caracteres o una expresión encerrada entre comillas dobles.
Ej. 1
char t1[20];
strcpy(t1,”HOLA”);
Ej. 2
char t2[20], t3[20]=”PASTO”;
strcpy(t1,t2);
∑ strcat(cadena1, cadena2): se utiliza para unir dos cadenas. El resultado se
guarda en la cadena1.
Ej. 1
char t1[20]=”HOLA”;
strcat(t1,”JUAN”);
Ej. 2
char t1[20]=”HOLA”, t2[20]=”MUNDO”;
strcat(t1,t2);
Si se requiere un espacio, este debe estar incluido en una de las cadenas
∑ strcmp(cadena1, cadena2): compara dos cadenas y devuelve el valor 0 si las
cadenas son iguales. Si la cadena1 es lexicográficamente mayor que la
cadena2, devuelve un valor positivo, de lo contrario será negativo.
Como la función devuelve un valor entero, es necesario asignarlo a una
variable de ese tipo, y luego evaluarla
Ej 1.
Ej. 2
Ej. 3
Ej. 4
int rta;
rta = strcmp(“HOLA”,”hola”);
if (rta= =0) printf(“iguales”);
else printf(“diferentes”);
int rta;
char t1[2]=”a”,t2[2]=”A”;
rta = strcmp(t1,t2);
if (rta= = 0) printf(“iguales”);
else printf(“diferentes”);
int rta;
char t1[20]=”SISTEMAS”;
rta = strcmp(t1,”informatica”);
if (rta= = 0) printf(“iguales”);
else printf(“diferentes”);
char t1[10]:
for( ; ; )
{ printf(“\ndigite una palabra”); gets(t1);
49
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
if (¡strcpm(“salir”,t1)) break;
}
strlen(cadena): devuelve el número de caracteres que tiene la cadena.
Ej. 1
int x;
x
E. 2
= strlen(“informatica”);
int x;
char t1[10]=”CALI”;
x
= strlen(t1);
Ej. 3
int x;
char t1[20]
x
= strlen(gets(t1));
50
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

CAPITULO 5: ORDENACIÓN Y BÚSQUEDA

Introducción

CAPITULO 5: ORDENACIÓN Y BÚSQUEDA Introducción Al realizar diversas actividades, se guarda información que
CAPITULO 5: ORDENACIÓN Y BÚSQUEDA Introducción Al realizar diversas actividades, se guarda información que
CAPITULO 5: ORDENACIÓN Y BÚSQUEDA Introducción Al realizar diversas actividades, se guarda información que

Al realizar diversas actividades, se guarda información que posteriormente se retomará. Para que esta última tarea sea más fácil, es importante que la información esté organizada de acuerdo a criterios predefinidos. De estos temas se trata el presente capítulo de los métodos de ordenación y búsqueda de datos, como se realizan, que características tienen, etc.

datos, como se realizan, que características tienen, etc. Lección 21: Importancia de la organización de datos
datos, como se realizan, que características tienen, etc. Lección 21: Importancia de la organización de datos
datos, como se realizan, que características tienen, etc. Lección 21: Importancia de la organización de datos

Lección 21: Importancia de la organización de datos

forma como se lleva a cabo. información de ordenamiento. una
forma como se lleva
a cabo.
información de
ordenamiento.
una

manera

especial

La organización es una labor común que se realiza cotidianamente, es un

proceso tan común en la vida diaria, que generalmente no se analiza mucho en la

La organización hace referencia a colocar

en un criterio de
en
un
criterio
de

basándose

En la ciencia de la computación la organización de datos también cumple un rol

muy importante, ya sea como un fin en sí o como parte de otros procedimientos más complejos. En gran medida de la organización de los datos depende el tiempo que se requiere para realizar búsquedas de información, tarea que es bastante frecuente en los sistemas computacionales.

que es bastante frecuente en los sistemas computacionales. En atención a la importancia que reviste la

En atención a la importancia que reviste la organización de los datos, se han desarrollado muchas técnicas en este ámbito, cada una con características específicas, con ventajas y desventajas sobre las demás. El propósito principal de un ordenamiento es el de facilitar la búsqueda de información.

es el de facilitar la búsqueda de información. El ordenar un grupo de datos significa mover
es el de facilitar la búsqueda de información. El ordenar un grupo de datos significa mover

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente.

Lección 22: Ordenación

La ordenación o clasificación de datos (sort, en inglés) es una operación consistente en disponer un conjunto —estructura— de datos en algún determinado orden con respecto a uno de los campos de elementos del conjunto. Por ejemplo, cada elemento del conjunto de datos de una guía telefónica tiene un campo nombre, un campo dirección y un campo número de teléfono; la guía telefónica está dispuesta en orden alfabético de nombres; los elementos numéricos se pueden ordenar en orden creciente o decreciente de acuerdo al valor numérico del elemento. En terminología de ordenación, el elemento por el cual está ordenado un conjunto de datos (o se está buscando) se denomina clave.

51

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

 

Una colección de datos (estructura) puede ser almacenada en un archivo, un array (vector o tabla), un array de registros, una lista enlazada o un árbol. Cuando los datos están almacenados en un array, una lista enlazada o un árbol, se denomina ordenación interna. Si los datos están almacenados en un archivo, el proceso de ordenación se llama ordenación externa.

el proceso de ordenación se llama ordenación externa . Una lista se dice que está ordenada
el proceso de ordenación se llama ordenación externa . Una lista se dice que está ordenada
el proceso de ordenación se llama ordenación externa . Una lista se dice que está ordenada
el proceso de ordenación se llama ordenación externa . Una lista se dice que está ordenada

Una lista se dice que está ordenada por la clave k si la lista está en orden ascendente o descendente con respecto a esta clave. La lista se dice que está en orden ascendente si: i < j implica que k[i] <= k[j] y se dice que está en orden descendente si: i > j implica que k[i] <= k[j] para todos los elementos de la lista. Por ejemplo, para una guía telefónica, la lista está clasificada en orden ascendente por el campo clave k, donde k[i] es el nombre del abonado (apellidos, nombre).

donde k [ i ] es el nombre del abonado (apellidos, nombre). 4 5 14 21
4 5 14 21 32 75 70 35 16 14
4
5
14
21
32
75
70
35
16
14

45

12

nombre). 4 5 14 21 32 75 70 35 16 14 45 12 orden ascendente orden

orden ascendente

orden descendente

Zacarias Rodriguez Martinez Lopez Garcia

orden descendente

Los métodos (algoritmos) de ordenación son numerosos, por ello se debe prestar especial atención en su elección. ¿Cómo se sabe cuál es el mejor algoritmo? La eficiencia es el factor que mide la calidad y rendimiento de un algoritmo. En el caso de la operación de ordenación, dos criterios se suelen seguir a la hora de

y rendimiento de un algoritmo. En el caso de la operación de ordenación, dos criterios se

decidir qué algoritmo —de entre los que resuelven la ordenación— es el más eficiente:

 

1) tiempo menor de ejecución en computadora. 2) menor número de instrucciones.

   

Sin embargo, no siempre es fácil efectuar estas medidas: puede no disponerse de

instrucciones para medida de tiempo —aunque no sea éste el caso del lenguaje

C—, y las instrucciones pueden variar, dependiendo del lenguaje y del propio

     
     
   

estilo del programador. Por esta razón, el mejor criterio para medir la eficiencia de un algoritmo es aislar una operación específica clave en la ordenación y contar el número de veces que se realiza. Así, en el caso de los algoritmos de ordenación,

clave en la ordenación y contar el número de veces que se realiza. Así, en el

se utilizará como medida de su eficiencia el número de comparaciones entre elementos efectuados. El algoritmo de ordenación A será más eficiente que el B, si requiere menor número de comparaciones.

que el B, si requiere menor número de comparaciones. Así, en el caso de ordenar los

Así, en el caso de ordenar los elementos de un vector, el número de comparaciones será función del número de elementos (n) del vector (array). Por consiguiente, se puede expresar el número de comparaciones en términos de n (por ejemplo, n+4, o bien n2 en lugar de números enteros.

 

52

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Se
utiliza
el
orden
ascendente
sobre
vectores
o
listas (arrays
unidimensionales). Los métodos de ordenación se suelen dividir en dos
grandes grupos:
directos burbuja, selección, inserción
indirectos (avanzados) Shell, ordenación rápida, ordenación por mezcla,
Radixsort
En el caso de listas pequeñas, los métodos directos se muestran eficientes, sobre
todo porque los algoritmos son sencillos; su uso es muy frecuente. Sin embargo,
en listas grandes estos métodos se muestran ineficaces y es preciso recurrir a los
métodos avanzados.
Lección 23: Métodos de ordenación
Método Burbuja
El Ordenamiento de Burbuja (Bubble Sort en inglés) es un sencillo algoritmo de
ordenamiento. Funciona revisando cada elemento de la lista que va a ser
ordenada con el siguiente, intercambiándolos de posición si están en el orden
equivocado. Es necesario revisar varias veces toda la lista hasta que no
se necesiten más intercambios, lo cual significa que la lista está ordenada. Este
algoritmo obtiene su nombre de la forma con la que suben por la lista los
elementos durante los intercambios, como si fueran pequeñas "burbujas".
También es conocido como el método del intercambio directo. Dado que solo
usa comparaciones para operar elementos, se lo considera un algoritmo de
comparación, siendo el más sencillo de implementar.
Este es el método más fácil de utilizar y aprender, también se lo conoce como
ordenamiento directo o de intercambio, consiste en: que va comparando cada
elemento del arreglo con el siguiente; si un elemento es mayor que el que le
sigue, entonces se intercambian (dependiendo si se quiere ordenar
ascendente o descendentemente); esto producirá que en el arreglo quede
como su último elemento, el más grande. Este proceso deberá repetirse
recorriendo todo el arreglo hasta que no ocurra ningún intercambio. Los
elementos que van quedando ordenados ya no se comparan, los pasos son:
Los pasos a dar son:
1.
se decide como se quiere el resultado del ordenamiento, si ascendente o
descendente
2.
Comparar A[1] y A[2]; Si están en orden, se mantienen como están; en caso
contrario, se intercambian entres sí.
53
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
3.
A continuación se comparan los elementos 2 y 3; de nuevo se intercambian si
es necesario.
4.
El proceso continúa hasta que cada elemento del vector ha sido comparado
con sus elementos adyacentes y se han realizado los intercambios necesarios.
Este será el algoritmo
Para i =1 hasta n haga
si elemento[i] > elemento [i+1] haga
Temporal = Elemento[i] Elemento[i] = Elemento [i+1] Elemento [i+1]
= Temporal
fin si
fin para
Para poder realizar este intercambio se debe apoyar en una variable temporal que
permite almacenar uno de los valores por un periodo, para que no se pierda.
Ahora analice el código
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
void burbuja(int *arreglo, int n);
int main()
{
int n; // Numero de elementos del vector
int i; // Contador
int arreglo[100]; // Arreglo de enteros
system(“cls”);
cout<<"Digite el numero de elementos < 100:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"Digite valor para la posición :"<< i+1<<" ";
cin>>arreglo[i];
}
cout<<"\nVector
Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nProcesamiento
Burbuja:\n";
burbuja(arreglo, n);
54
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<<arreglo[i];
cout<<"\n";
}
// Ordenamiento por burbuja.
void burbuja(int *arreglo, int n)
{
int i,j; // Contadores
int temporal; // Variable para intercambio de contenidos
for (i=0;i<n-1;i++)
for (j=0;j<n-1;j++)
if (arreglo[j]>arreglo[j+1])
{
temporal=arreglo[j];
arreglo[j]=arreglo[j+1];
arreglo[j+1]=temporal;
}
}
Esta es la lista:
4
- 3 - 5 - 2 - 1
Existen 5 elementos. Es decir, n toma el valor 5. Se inicia comparando el primero
con el segundo elemento. 4 es mayor que 3, así que se intercambian.
Ahora se tiene:
3
- 4 - 5 - 2 - 1
Ahora se compara el segundo con el tercero: 4 es menor que 5, así que no se
hace nada. Se continúa con el tercero y el cuarto: 5 es mayor que 2.
55
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Se intercambia y se obtiene:
3
- 4 - 2 - 5 - 1
Se compara
el
cuarto
y
el
quinto:
5
es
mayor
que
1.
Se intercambia
nuevamente:
3
- 4 -
2 -
1
-
5
Repitiendo este proceso se obtienen los siguientes resultados:
3
- 2 -
1 - 4 -
5
2
- 1
-
3 - 4 -
5
1
- 2 - 3 - 4 - 5
Nuevamente se sugiere la realización de nuevas pruebas de escritorio para
entender mejor el comportamiento de este programa.
También existen formas de mejorar la efectividad de este algoritmo, se le sugiere
tratar de implementar soluciones que mejoren los procesos en este algoritmo
Método de Inserción
En este tipo de algoritmo los elementos que van a ser ordenados son
considerados uno a la vez. Cada elemento es INSERTADO en la posición
apropiada con respecto al resto de los elementos ya ordenados.
Así por ejemplo, si se tiene el vector
53
15
27
31
29
11
59
7
Se puede insertar el elemento 15 en la posición 1 y mover el 53 a la posición 2,
con lo que se tienen los dos primeros elementos ordenados, como se puede
apreciar.
15
53
27
31
29
11
59
7
Repitiendo el proceso anterior pero con la casilla 3, se puede observar que la
sublista a la izquierda esta ordenada y los movimientos serían:
15
53
27
31
29
11
59
7
56
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Como resultado:
15
27
53
31
29
11
59
7
Como se puede observar el método se basa en comparaciones y
desplazamientos sucesivos. El algoritmo de ordenación de un vector X para N
elementos se realiza recorriendo el vector e insertando el elemento
correspondiente en el lugar adecuado. El siguiente pseudocódigo da una
idea general de la labor a realizar:
para i =2 hasta i = n haga
Inserte X[i] en la posición adecuada entre X[1] y X[i-1]
fin para
El desarrollo de esta operación de inserción se puede realizar en dos partes
principales. La primera determinar en qué lugar debe ir el elemento que se está
evaluando.
lugar = i temporal = X[i]
para j =1 hasta j = i - 1 haga
si temporal < X[j] haga
lugar = j
salir para
fin si
fin para
La segunda, empieza con preguntar si se debe mover el elemento y si es así se
corren hacia la derecha del lugar de inserción, los elementos así:
si lugar < i haga
para j = i – 1 hasta j = lugar en decrementos de 1 haga
X[j+1] = X[j]
fin para
X[lugar] = temporal
fin si
De esta forma el pseudocódigo final queda de la siguiente manera:
para i
=2 hasta
i
=
n
haga lugar = i
temporal = X[i]
para j =1 hasta j = i - 1 haga
57
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
si temporal < X[j] haga
lugar = j
salir para
fin si
fin para
si lugar < i haga
para j = i – 1 hasta j = lugar en decrementos de 1 haga
X[j+1] = X[j]
fin para
X[lugar] = temporal
fin si
fin para
La codificación sería:
#include <conio.h>
#include <iostream.h>
#define MAXNUM 100
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
void insercion(int *arreglo, int n);
int main()
{
int n; // numero de elementos del vector
int i; // Contador
int arreglo[100]; // Arreglo de enteros
system(“cls”);
cout<<"Digite el numero de elementos:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"por favor escriba el valor en la posicion :" <<i+1;
cin>>arreglo[i];
}
cout<<"\nVector Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nOrdenamiento por inserción:\n";
insercion(arreglo, n);
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
58
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
// función para mostrar por pantalla
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<< arreglo[i];
cout<<"\n";
}
// función que realiza el ordenamiento
void insercion(int *arreglo, int n)
{
int i,j; // Contadores
int temporal; // Variable que conserva el elemento X[i]
int lugar; // Variable del lugar donde se debe insertar
for (i=1;i<n;i++)
{
lugar=i;
temporal= arreglo[i];
for (j=0;j<=i-1;j++)
{
if (temporal<arreglo[j])
{
lugar=j;
break;
}
}
if (lugar<i)
{
for (j=i-1;j>=lugar;j--)
arreglo[j+1]=arreglo[j];
arreglo[lugar]=temporal;
}
}
}
Método Shell
Toma este nombre de su inventor Donald Shell, es como utilizar el ordenamiento
burbuja pero comparando e intercambiando los elementos. La idea es seleccionar
fragmentos de un arreglo para ser ordenados y ordenarlos por el método directo.
Luego se toman nuevos fragmentos hasta quedar ordenado por completo
59
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
El algoritmo será:
salto = n div 2
mientras salto <> 0 haga
repita
cambios = 0
para i N1 hasta n – salto haga
si X[i] > X[i+salto] haga
temporal = X[i]
X[i] = X[i+salto]
X[i+salto] = temporal
cambios = 1
fin si
fin para
hasta que cambios = 0 salto = saldo div 2
fin mientras
Es momento de realizar la prueba de escritorio, considere el siguiente vector:
4
10
9
3
7
2
1
9
Se decide ordenarlo en forma ascendente:
Salto = 4 y es <> 0
Cambio = 0
I = 1
4
10
9
3
7
2
1
9
Como la condición no se cumple 4 no es mayor que siete, se incremente i y
continúa el proceso
Variable i = 2
4
10
9
3
7
2
1
9
Como se puede observar el número 10 si es mayor que el 2 por lo tanto hay un
intercambio y el vector resultante es:
4
10
9
3
7
2
1
9
60
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
La variable cambio toma el valor de 1, el proceso continúa hasta que i llega a n-
salto, para el primer caso hasta 4, luego se divide nuevamente en 2 y luego en
uno.
Ahora analice el código
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
int shell(int *arreglo, int n);
int main()
{
int n; // El numero de elementos del vector
int i; // Contador
int arreglo[100]; // Arreglo de enteros
system(“cls”);
cout<<"Digite el numero de elementos < 100:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"digite valor para ["<<i+1<<"] ";
cin>>arreglo[i];
}
cout<<"\nVector Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nOrdenamiento por shell:\n";
cout<<"\n Numero iterciones" <<shell(arreglo, n);
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<< arreglo[i]<<" ";
cout<<"\n";
61
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
}
// Ordenamiento por shell.
int shell(int *arreglo, int n)
{
int ciclos=0; // Contador de ciclos i
nt i; // Contador
int salto; // Variable para el tamaño del salto
int temporal; // Variable para intercambio de contenidos
int cambio; // Variable lógica para detener una iteración
salto=n/2;
while (salto!=0)
{
do
{
cambio=0;
for(i=0;i<n-salto;i++)
{
ciclos++;
if(arreglo[i]>arreglo[i+salto])
{
temporal=arreglo[i];
arreglo[i]=arreglo[i+salto];
arreglo[i+salto]=temporal;
cambio=1;
}
}
} while (cambio!=0);
salto=salto/2;
}
return ciclos;
}
Método Quicksort
Algoritmo desarrollado por Charles Hoare propuesto en 1962. Para cada paso,
se escoge un elemento "a" de alguna posición específica dentro del arreglo.
Ese elemento "a" es el que se procederá a colocar en el lugar que le corresponda.
Por conveniencia se seleccionará a "a" como el primer elemento del arreglo. El
elemento "a" se procede a comparar con el resto de los elementos del arreglo.
Una forma puede ser: comparar "a" con el último elemento del arreglo. En la
comparación, si el elemento "a" toma la última posición y el último elemento toma
62
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
la posición 1 se procede a seguir comparando a "a" pero ahora con el segundo
elemento. Si "a" resulta ser menor que el segundo elemento se hace el
intercambio y se procede a comparar "a" con el penúltimo y así sucesivamente
hasta que "a" se compara con todos los elementos restantes del arreglo. Note que
cada vez que ocurre un intercambio de valores, la comparación de "a" se hace
con los elementos del arreglo que se encuentran en posición contraria a la que se
está haciendo.
Una vez que se terminó de comparar "a" con todos los elementos, "a" ya se
encuentra en su lugar y a la izquierda de "a" quedan todos los elementos
menores a él y a su derecha todos los mayores.
Se toma el sub-arreglo izquierdo (los menores de "a") y se realiza el mismo
procedimiento. Se toma el sub-arreglo derecho (los mayores de "a") y se realiza
el mismo procedimiento. Este proceso se realiza hasta que los sub-arreglos sean
de un elemento.
Obsérvelo gráficamente, tomado el siguiente vector
43
2
90
52
87
100
-10
68
13
7
21
45
Las variables izq (izquierda) y der (derecha), una variable para controlar el punto
pívot (pivote), que se puede mirar su comportamiento en los extremos resaltados
Izq
Der
0
1 2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
0
11
43
2 90
50
87
100
-
68
13
7
21
45
50
0
43
10
En este caso la posición más a la izquierda es 0, la más a la derecha es 12, se
escoge como "pivote" el primer término de la lista, es decir la posición más a la
izquierda, tal como está escrito en la tabla anterior.
Se procede a comparar el pivote, 43, con el valor más a la derecha, posición 12
cuyo valor es 50. Se verifica que 43 y 50 están en posiciones relativas,
ascendentemente, adecuadas, por esto comenzamos a movernos a la izquierda,
decrementando Der, así:
Izq
Der
0
1 2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
0
11
43
2 90
50
87
100
-
68
13
7
21
45
50
0
43
10
O
63
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Se compara ahora el pivote 43, en posición cero, con el número en posición
der=11, es decir 45, nuevamente están en posiciones relativas adecuadas a
nuestro ordenamiento ascendente, por esto se decremento derecha (Der--):
Izq
Der
0
1 2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
0
11
43
2 90
50
87
100
-
68
13
7
21
45
50
0
43
10
O
Se compara ahora 43 con 21 de la posición der=10, no están en posiciones
relativas ordenadas, se procederá entonces a su intercambio, quedando el vector,
paso a paso así:
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
0
10
43
2
90
50
87
100
-
68
13
7
21
45
50
0
43
10
10
21
2
90
50
87
100
-
68
13
7
43
45
50
10
Se actualiza la posición del pivote, ahora está en 10, y se comienza a comparar
desde la izquierda, como lo señala la flecha en la tabla anterior. Así se compara
43 con 21, los cuales están en posiciones relativas adecuadas:
Izq
Der
0
1 2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
1
10
21
2 90
50
87
100
-
68
13
7
43
45
50
10
43
10
Por esto se incrementa izquierda y se compara el 43 con el 2, igualmente están
en orden ascendente relativo; se incrementa izquierda nuevamente llegando a
donde está el número 90 en la posición 2 del vector:
Izq
Der
0
1 2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
1
10
21
2 90
50
87
100
-
68
13
7
43
45
50
10
43
10
El 90 al compararlo con el pivote 43 es mayor, por esto deberán ser
intercambiados, y actualizada la posición del pivote:
64
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
0
10
21
2
90
50
87
100
-
68
13
7
43
45
50
10
43
10
2
21
2
43
50
87
100
-
68
13
7
90
45
50
10
Siguiendo este proceso se obtiene la siguiente secuencia de posiciones:
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
2
90
21
2
43
50
87
100
-
68
13
7
90
45
50
2
43
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
2
9
21
2
43
50
87
100
-
68
13
7
90
45
50
2
43
10
9
21
2
7
50
87
100
-
68
13
43
90
45
50
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
3
9
21
2
7
50
87
100
-
68
13
43
90
45
50
9
43
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
3
9
21
2
7
50
87
100
-
68
13
43
90
45
50
9
43
10
3
21
2
7
43
87
100
-
68
13
50
90
45
50
10
Izq
De
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPi
Pivote
r
v
65
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
3
8
21
2
7
43
87
10
-
68
13
50
90
45
50
3
43
0
10
De
0
1
2
3
4
5
6
7
8
9
1
11
1
PosPi
Pivote
Izq
r
0
2
3
8
21
2
7
43
87
100
-10
68
1
5
9
45
5
3
43
3
0
0
0
8
21
2
7
13
87
100
-10
68
4
5
9
45
5
3
0
0
0
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
4
8
21
2
7
13
87
100
-
68
43
50
90
45
50
8
43
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
4
8
21
2
7
13
87
100
-
68
43
50
90
45
50
8
43
10
4
21
2
7
13
43
100
-
68
87
50
90
45
50
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
4
7
21
2
7
13
43
100
-
68
87
50
90
45
50
4
43
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
4
6
21
2
7
13
43
100
-
68
87
50
90
45
50
4
43
10
6
21
2
7
13
-
100
43
68
87
50
90
45
50
10
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
5
6
21
2
7
13
-
100
43
68
87
50
90
45
50
6
43
66
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

10
10
Izq Der 0 1 2 3 4 5 6 7 8 9 10 11 12
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
PosPiv
Pivote
5
6
21
2
7
13
-
100
43
68
87
50
90
45
50
6
43
10
5
21
2
7
13
-
43
100
68
87
50
90
45
50
10
10 5 21 2 7 13 - 43 100 68 87 50 90 45 50 10
10 5 21 2 7 13 - 43 100 68 87 50 90 45 50 10

Al avanzar desde la derecha hacia la izquierda, la variable Der se encuentra con la posición donde está el pivote, e Izq ya estaba en el mismo valor, es decir las tres variables "se encuentran en el mismo sitio", así:

PosPiv Pivote 5 43
PosPiv
Pivote
5
43
Izq Der 0 1 2 3 4 5 6 7 8 9 10 11 12
Izq
Der
0
1
2
3
4
5
6
7
8
9
10
11
12
5
5
21
2
7
13
-
43
100
68
87
50
90
45
50
10
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
void QuickSort(int *arreglo, int l, int r);
void intercambiar(int *arreglo, int pos1, int pos2);
int main()
{

int n; // numero de elementos del vector int i; // Contador int arreglo[100]; // Arreglo de enteros

Se observa que el valor del pivote, 43, está en el sitio que le corresponde en ordenamiento ascendente, y que a su izquierda se forma una sublista, desordenada, desde la posición 0 a la 4, con todos sus elementos menores; y una sublista a la derecha, desde la posición 6 hasta la 12, en desorden y con todos mayores que el pivote. A partir de este punto se procede con el mismo procedimiento seguido para la lista completa, en cada una de las sublistas y por separado.

Con lo anterior se puede describir el siguiente algoritmo para que usted mediante una prueba de escritorio verifique que hace

67

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
system(“cls”);
cout<<"Digite el numero de elementos:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"Digite valor para la posicion :[" <<i+1<<"] ";
cin>>arreglo[i];
}
cout<<"\nVector Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nOrdenamiento por QuickSort:\n";
QuickSort(arreglo,0,n-1);
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<<arreglo[i]<< " ";
cout<<"\n";
}
// Ordenamiento QuickSort.
void QuickSort(int *arreglo, int izquierda, int derecha)
{
int mayor; // Posicion de un elemento mayor al pivote
int menor; // Posicion de un elemento menor al pivote
int pivote; // Elemento pivote
if (izquierda < derecha)
{
pivote = arreglo[derecha];
mayor = izquierda-1;
menor = derecha;
while (mayor <= menor)
{
while (mayor <= derecha)
{
mayor++;
if (arreglo[mayor] >= pivote) break;
68
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

}

while (menor >= izquierda)

{

{ menor--; if (arreglo[menor] <= pivote) break; } if (mayor < menor) intercambiar(arreglo,mayor,menor); }

menor--; if (arreglo[menor] <= pivote) break;

{ menor--; if (arreglo[menor] <= pivote) break; } if (mayor < menor) intercambiar(arreglo,mayor,menor); }
{ menor--; if (arreglo[menor] <= pivote) break; } if (mayor < menor) intercambiar(arreglo,mayor,menor); }

}

}

if (mayor < menor) intercambiar(arreglo,mayor,menor);

}

if (mayor < menor) intercambiar(arreglo,mayor,menor); } intercambiar(arreglo,derecha,mayor);

intercambiar(arreglo,derecha,mayor);

QuickSort(arreglo,izquierda,mayor-1);

QuickSort(arreglo,mayor+1,derecha);

}

}

void intercambiar(int arreglo[], int pos1, int pos2) { int temporal; // Variable para intercambio de
void intercambiar(int arreglo[], int pos1, int pos2) { int temporal; // Variable para intercambio de

void intercambiar(int arreglo[], int pos1, int pos2)

{

int temporal; // Variable para intercambio de contenidos temporal = arreglo[pos1]; arreglo[pos1] = arreglo[pos2]; arreglo[pos2] = temporal;

}

Bueno sólo queda que usted que es una persona muy “pila”, indague más acerca de estos métodos, tanto de búsqueda como de ordenamiento , o realice nuevas mejoras a estos programas aquí desarrollados.

Lección 24: Búsqueda

La búsqueda es una tarea que se realiza permanentemente, en toda actividad, por ejemplo, cuando se está en un supermercado uno busca artículos en particular, en una multitud de gente se busca a alguien en especial, en un directorio se busca a una persona. Como se observa la búsqueda está presente en cada una de las actividades.

la búsqueda está presente en cada una de las actividades. Un algoritmo de búsqueda es aquel

Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento concreto dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en cuestión pertenece o no a dicho conjunto, además de su localización dentro de éste.

Este problema puede reducirse a devolver la existencia de un número en un vector.

su localización dentro de éste. Este problema puede reducirse a devolver la existencia de un número

69

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Lección 25: Métodos de búsqueda
Método Lineal
Es el método para buscar algo dentro de un arreglo, donde se hace un recorrido
de inicio a fin, realizando las comparaciones necesarias hasta encontrar el
elemento requerido.
Para entenderlo mejor se realiza el algoritmo necesario
encontro = FALSE
para k= 0 hasta n haga
si X[k] = ValorBuscado haga
mostrar “Elemento encontrado en la posición “, k
encontro = TRUE
k=n;
fin si
fin para
si encontro = FALSE haga
mostrar “No se encontró el elemento“
fin si
A continuación un ejemplo de búsqueda lineal
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void mostrar(int *arreglo, int n);
int buscar(int valor, int *arreglo, int n);
int main()
{
int n; // numero de elementos del vector < 100
int valor; // El numero a buscar
int i; // Contador
int x; // Almacenará el valor devuelto por la función
int arreglo[100]; // Arreglo de enteros
system(“cls”);
cout<<"Digite el numero de elementos:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"Digite el dato ", i;
70
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
cin>>arreglo[i];
}
cout<<"Digite el numero a buscar:";
cin>>valor; cout<<"\nVector Leido:\n";
mostrar(arreglo,n);
cout<<"\nBusqueda lineal:\n";
if ((x=buscar(valor, arreglo, n)) != -1)
cout<<"\nEncontrado en la posicion \n"<<x+1;
else
cout<<"\nNo existe en el arreglo\n";
getch();
}
// función que permite mostrar en la pantalla el vector
void mostrar(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<< arreglo[i];
cout<<"\n";
}
// función Búsqueda lineal.
int buscar(int valor, int *arreglo, int n)
{
int i; // Contador
for (i=n-1; i>=0; i--)
if (valor == arreglo[i]) break;
// condicional para encontrar el elemento
return (i);
}
Se recomienda realizar prueba de escritorio para determinar el comportamiento
del anterior código.
Binaria
Este algoritmo permite buscar de una manera más eficiente un dato dentro de un
arreglo, para hacer esto se determina el elemento central del arreglo y se
compara con el valor que se está buscando, si coincide termina la búsqueda y en
caso de no ser así se determina si el dato es mayor o menor que el elemento
central, de esta forma se elimina una mitad del arreglo junto con el elemento
central para repetir el proceso hasta encontrarlo o tener solo un elemento en el
71
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
arreglo. Para poder aplicar este algoritmo se requiere que el arreglo este
ordenado. Su implementación es la siguiente:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 15
main()
{
int a[TAM], busca, temp, bajo, alto, central, i;
printf("Llenando el arreglo con números aleatorios\n");
for (int i=0; i< TAM; i++)
a[i]=rand()%100; //llena el vector con 15 números aleatorios entre 0 y 100
//Implementación de Ordenamiento por burbuja de menor a mayor
printf ("Ordenando arreglo
\n");
for (int j=1; j <= TAM; j++)
for (i=0; i< TAM-1; i++)
if (a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
//Implementación de búsqueda binaria
printf ("\nIntroduce un numero a buscar: ");
scanf ("%d", &busca);
bajo = 0;
alto = TAM-1;
central = (bajo+alto)/2;
while (bajo < alto && busca != a[central])
{
if(busca > a[central])
bajo = central+1;
else
alto = central-1;
central=(bajo+alto)/2;
}
if (busca == a[central])
printf("\n%d encontrado en posicion %d", busca, central);
72
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
else
printf("\n%d no existe", busca);
printf ("\n\nEl arreglo ordenado era\n\n");
for (i=0; i< TAM; i++)
printf ("%d ", a[i]);
getch();
}
Método de Hash
La idea principal de este método consiste en aplicar una función que traduce el
valor del elemento buscado en un rango de direcciones relativas. Una desventaja
importante de este método es que puede ocasionar colisiones.
funcion hash (valor_buscado)
inicio
hash <- valor_buscado mod numero_primo
fin
inicio <- hash (valor)
il <- inicio encontrado <- falso
repite
si arreglo[il] = valor entonces encontrado <- verdadero
en caso contrario il <- (il +1) mod N
hasta encontrado o il = inicio
fin
73
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 6: PUNTEROS O APUNTADORES
Introducción
Los apuntadores son una parte fundamental de C. Si usted no puede usar los
apuntadores apropiadamente entonces está perdiendo la potencia y la flexibilidad
que C ofrece básicamente.
El lenguaje C, usa los apuntadores en forma extensiva. ¿Por qué?
Es la única forma de expresar algunos cálculos.
Se genera código compacto y eficiente.
Es una herramienta muy poderosa.
C usa apuntadores explícitamente con: Arreglos, Estructuras y Funciones
Lección 26: Definición
Un puntero o apuntador es una variable que contiene la dirección de memoria
de un dato o de otra variable que contiene al dato, esto es, que el puntero apunta
al espacio físico donde está el dato o la variable. Puede apuntar a un objeto de
cualquier tipo, por ejemplo: a una estructura o a una función.
Es muy importante prestar especial atención a la creación de punteros, puesto
que si por error apuntan a algún lugar inesperado, se puede producir una
violación de memoria, lo que constituye un gran error.
Lección 27: Declaración de Punteros
Puntero: es una variable a la que se asigna una dirección de memoria. El puntero
debe definirse con el mismo tipo de la variable a la cual apunta.
Ejemplo: si se define la variable llamada X, de tipo entero, el puntero que
contendrá su dirección debe ser de tipo entero, así:
int X; \\ define la variable X de tipo entero
int *px; \\ define un variable tipo puntero llamada px
Para diferenciar un apuntador de otra variable, al nombre del puntero se le
antepone un asterisco (*) Ejemplo: int *px;
Al definir un apuntador o puntero, este contiene una dirección que no indica una
variable conocida, si se desea que contenga la dirección de una variable, esta se
debe asignar.
74
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
La sintaxis es: px=&x; con esta instrucción ahora se tiene almacenado en px la
dirección de memoria donde se encuentra la variable x.
A la variable x, se le debe asignar un valor, porque hasta el momento esta vacía.
Esto se puede hacer de dos formas:
X=10;
ó
*px = 10;
Se debe tener claro que de acuerdo a las asignaciones que se realicen, se van a
presentar diferencias en el contenido de las variables y los apuntadores.
Ej. int x, *px;
px = &x; \\ asigna a px la dirección de la variable x
*px = 10; \\ asigna el valor 10 a la variable x, es lo mismo que decir x = 10.
\\ Prácticamente la expresión *px es la variable x.
Ejercicio: analizar el siguiente programa
main ( )
{
int x, *px;
px = &x;
*px = 0;
*px = *px + 5;
x = *px – 1;
printf ( “ %d %d “, x, *px );
getch ( );
main ( )
int x, *px;
{
px = &x;
x = 0;
x = x + 5;
x = x – 1;
printf ( “ %d %d “, x, *px );
getch ( );
}
}
Para declarar un puntero se debe situar un asterisco delante del nombre de la
variable tipo puntero.
char *ptr1; //puntero a un char "utilizado para las cadenas de longitud variable".
int *ptr2; //puntero a un entero.
float *ptr3; //puntero a un float
int *p1, num1, num2, *p2; //punteros a enteros *p1, *p2
Para recuperar la dirección de la variable a la que se apunta, se debe situar &
delante de la variable.
Ej.: p1=&num1;
Lección 28: Operadores de Punteros
Un apuntador es una variable que contiene la dirección en memoria de otra
variable. Se pueden tener apuntadores a cualquier tipo de variable.
El operador unario o monádico & devuelve la dirección de memoria de una
variable.
75
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
El operador de indirección o dereferencia * devuelve el ``contenido de un objeto
apuntado por un apuntador''.
Para declarar un apuntador para una variable entera hacer:
int *apuntador;
Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede
asignar la dirección de un short int a un long int.
Para tener una mejor idea, considerar el siguiente código:
main()
{
int x = 1, y = 2;
int *ap;
ap = &x;
y
= *ap;
x
= ap;
*ap = 3;
}
Cuando se compile el código se mostrará el siguiente mensaje:
warning: assignment makes integer from pointer without a cast.
Con el objetivo de entender el comportamiento del código suponga que la variable
x está en la localidad de la memoria 100, y en 200 y ap en 1000. Nota: un
apuntador es una variable, por lo tanto, sus valores necesitan ser guardados en
algún lado.
int x = 1, y = 2;
int *ap;
ap = &x;
100
200
1000
x
1
y
2
ap
100
Las variables x e y son declaradas e inicializadas con 1 y 2 respectivamente, ap
es declarado como un apuntador a entero y se le asigna la dirección de x (&x).
Por lo que ap se carga con el valor 100.
y = *ap;
76
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION

100 200 1000 x 1 y 1 ap 100
100
200
1000
x
1
y
1
ap
100
100 200 1000 x 1 y 1 ap 100 Después y obtiene el contenido de ap.
100 200 1000 x 1 y 1 ap 100 Después y obtiene el contenido de ap.

Después y obtiene el contenido de ap. En el ejemplo ap apunta a la localidad de

memoria 100 -- la localidad de x. Por lo tanto, y obtiene el valor de x -- el cual es

1.

x = ap;

100

200

1000

x

100

y

1

ap

100

Como se ha visto C no es muy estricto en la asignación de valores de diferente tipo (apuntador a entero). Así que es perfectamente legal (aunque el compilador genera un aviso de cuidado) asigna el valor actual de ap a la variable x. El valor de ap en ese momento es 100.

*ap = 3; 100 200 1000 x 3 y 1 ap 100
*ap = 3;
100
200
1000
x
3
y
1
ap
100
es 100. *ap = 3; 100 200 1000 x 3 y 1 ap 100 int *ap;

int *ap; *ap = 100;

Finalmente se asigna un valor al contenido de un apuntador (*ap).

Importante: Cuando un apuntador es declarado, apunta a algún lado. Se debe inicializar el apuntador antes de usarlo. Por lo que:

main()

{

}

puede generar un error en tiempo de ejecución o presentar un comportamiento errático.

El uso correcto será:

main()

{

int *ap; int x; ap = &x;

77

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
*ap = 100;
}
Con los apuntadores se puede realizar también aritmética entera, por ejemplo:
main()
{
float *flp, *flq;
*flp = *flp + 10;
++*flp;
(*flp)++;
flq = flp;
}
NOTA: Un apuntador a cualquier tipo de variable es una dirección en memoria la
cual es una dirección entera, pero un apuntador NO es un entero.
La razón por la cual se asocia un apuntador a un tipo de dato, es porque se debe
conocer en cuántos bytes está guardado el dato. De tal forma, que cuando se
incrementa un apuntador, se incrementa el apuntador por un ``bloque'' de
memoria, en donde el bloque está en función del tamaño del dato.
Por lo tanto para un apuntador a un char, se agrega un byte a la dirección y para
un apuntador a entero o a flotante se agregan 4 bytes. De esta forma si a un
apuntador a flotante se le suman 2, el apuntador entonces se mueve dos
posiciones float que equivalen a 8 bytes.
Lección 29: Apuntadores y funciones
Cuando C pasa argumentos a funciones, los pasa por valor, es decir, si el
parámetro es modificado dentro de la función, una vez que termina la función el
valor pasado de la variable permanece inalterado.
Hay muchos casos en que se quiere alterar el argumento pasado a la función y
recibir el nuevo valor una vez que la función ha terminado. Para hacer lo anterior
se debe usar una llamada por referencia, en C se puede simular pasando un
puntero al argumento. Con esto se provoca que la computadora pase la
dirección del argumento a la función.
Para entender mejor lo anterior considere la función swap() que intercambia el
valor de dos argumentos enteros:
78
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
void swap(int *px, int *py);
main()
{
int x, y;
x = 10; y = 20;
printf("x=%d\ty=%d\n",x,y);
swap(&x, &y);
printf("x=%d\ty=%d\n",x,y);
getch();
}
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
/* guarda el valor de la direccion x */
/* pone y en x */
/* pone x en y */
}
Lección 30: Apuntadores y Arreglos
Existe una relación estrecha entre los punteros y los arreglos. En C, un nombre
de un arreglo es un índice a la dirección de comienzo del arreglo. En esencia, el
nombre de un arreglo es un puntero al arreglo. Considere lo siguiente:
int a[10], x;
int *ap;
ap = &a[0];
/* ap apunta a la dirección de a[0] */
x
= *ap;
/* A x se le asigna el contenido de ap (a[0] en este caso) */
*(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando ap*/
Como se puede observar en el ejemplo la sentencia a[1] es idéntica a *(ap+1). Se
debe tener cuidado ya que C no hace una revisión de los límites del arreglo, por
lo
que se puede ir fácilmente más allá del arreglo en memoria y sobreescribir
otras cosas.
C
sin embargo es mucho más sutil en su relación entre arreglos y apuntadores.
Por ejemplo se puede teclear solamente:
ap = a; en vez de ap = &a[0];
y
también *(a + i) en vez de a[i], esto es, &a[i] es equivalente con a+i.
Y
como se ve en el ejemplo, el direccionamiento de apuntadores se puede
79
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
expresar como:
a[i] que es equivalente a *(ap + i)
Sin embargo los apuntadores y los arreglos son diferentes:
Un apuntador es una variable. Se puede hacer ap = a y ap++.
Un arreglo NO ES una variable.
Hacer a = ap y a++ ES ILEGAL.
NOTA: Esta parte es muy importante, asegúrese de haberla entendido.
Con lo comentado se puede entender como los arreglos son pasados a
las funciones. Cuando un arreglo es pasado a una función lo que en realidad se le
está pasando es la localidad de su elemento inicial en memoria.
Por lo tanto:
strlen(s) es equivalente a strlen(&s[0])
Esta es la razón por la cual se declara la función como:
int strlen(char s[]); y una declaración equivalente es int strlen(char *s); ya que char
s[] es igual que char *s.
La función strlen() es una función de la biblioteca estándar que regresa la longitud
de una cadena. Se muestra enseguida la versión de esta función que podría
escribirse:
int strlen(char *s)
{
char *p = s;
while ( *p != '\0' )
p++;
return p - s;
}
Se muestra enseguida una función para copiar una cadena en otra. Al igual que
en el ejercicio anterior existe en la biblioteca estándar una función que hace lo
mismo.
void strcpy(char *s, char *t)
{
while ( (*s++ = *t++) != '\0' );
}
80
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
En los dos últimos ejemplos se emplean apuntadores y asignación por valor.
Nota: Se emplea el uso del carácter nulo con la sentencia while para encontrar el
fin de la cadena.
81
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD 2
1:
Recopilación
de
preguntas
de
selección
múltiple
con
única
respuesta
A.
Propósito principal de un ordenamiento es
1.
2.
3.
Facilitar las búsquedas de los miembros de un conjunto
ordenado
Buscar los elementos de un conjunto
Ordenar en base a su valor
B.
Cuando es conveniente usar los ordenamientos
a.
Cuando
se
requiere
hacer
una
cantidad
considerable
de
búsquedas
b. Cuando se tienen varios directorios
c. Cuando se considera el factor del tiempo
C.
En este tipo de algoritmos cada elemento es comparado contra los
demás
a. Algoritmo de enumeración
b. Algoritmo de inserción
c. Algoritmo de intercambio
D.
En este algoritmo los elementos que van a ser ordenados son
considerados uno a la vez
a. Algoritmo de burbuja
b. Algoritmo de shell
c. Algoritmos de insercción
E.
Compara cada elemento del arreglo con el siguiente, si el elemento
es mayor que él se sigue, entonces surge un intercambio.
a. Método de Burbuja
b. Método de Quicksort
c. Método de Shell
F. Este tipo de algoritmos se selecciona o se busca el elemento más
pequeño o más grande de todo el conjunto de elementos y se coloca
en la posición adecuada
82
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
a. Algoritmo de Shell
b. Algoritmo de selección
c. Algoritmo de selección directa
G.
Este ordenamiento lleva el nombre de su inventor
a. Ordenamiento Quicksort
b. Ordenamiento de Burbuja
c.
Ordenamiento de Shell
2) Deduzca, indague, consulte, cuáles son las ventajas y/o desventajas de los
métodos de búsqueda y ordenamiento aquí expuestos
3) Realice un programa que permita introducir en un arreglo de n elementos
valores de tipo entero y a través de un menú, realizar las siguientes funciones:
A. Ingreso de datos
B. Búsqueda
C. Ordenamiento
D. Estadística
E. Salir
En cada uno de los menús se incluirá, un segundo submenú, por ejemplo el item
número 3 Ordenamiento puede incluir los métodos de:
Por burbuja
Por inserción
Y así sucesivamente, en el menú estadista, se debe presentar un informe de la
cantidad de iteraciones que cumple una opción de las anteriores.
83
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
UNIDAD 3
Nombre de la Unidad
ESTRUCTURAS Y ARCHIVOS
Introducción
Los archivos como colección de datos sirven como entrada y salida
de datos al computador y son manejados con programas.
Los archivos pueden ser contrastados con Arrays y registros. En un
registro se deben especificar los campos, él número de elementos de
un arrays (o arreglo), el número de caracteres en una cadena, entre
otros, por esto se denotan como: Estructuras Estáticas.
En los archivos no se requiere de un tamaño predeterminado, esto
significa que se pueden tener archivos de datos más grandes o
pequeños, según se necesiten.
Cada archivo es referenciado por su identificador (su nombre).
Justificación
Hasta el momento sólo se ha trabajado con vectores que almacenan
datos del mismo tipo y que tienen un tamaño definido, que no se
puede cambiar durante la ejecución del programa. Afortunadamente
los lenguajes de programación C y C++, dejan al usuario construir o
combinar diversidad de datos para conformar estructuras complejas
de información, lo que amplía las posibilidades de trabajo con datos.
Además, hasta el momento los datos que se procesaban en un
programa se perdían, cuando éste dejaba de ejecutarse, puesto que
se estaba trabajando con memoria principal, ahora la solución llega
con la construcción de estructuras que se puedan almacenar y
acceder en forma de archivos, que se almacenan en memoria
secundaria.
84
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Intencionalidades
Formativas
Determinar los mecanismos que se utilizan para combinar diferentes
tipos de datos
Propósitos de la unidad
Manipular diversidad de datos en forma simultánea
Grabar datos en unidades de almacenamiento físicas
Objetivos de la unidad
Desarrollar programas que manipulen cantidad de datos de
diferentes tipos y que puedan almacenarse y recuperase en
cualquier momento
Competencias de la unidad
Dominar el manejo de estructuras con diversidad de datos
Comprender
como
se
almacenan
y
recuperan
datos
en
medios fiscos
Metas de aprendizaje
Realizar programas que presten un verdadero servicio,
cuando se trate de guardar información
Denominación de
capítulos
ESTRUCTURAS
ARCHIVOS
ACCESO A LOS ARCHIVOS
85
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
CAPITULO 7: ESTRUCTURAS
Introducción
Las estructuras están compuestas, como ya se dijo, por una serie de
componentes individuales llamados miembros, para hacerlo más grafico se puede
decir que al ingresar datos de una persona como su nombre, apellido, dirección,
salario, edad… cada tipo de información corresponde a un miembro de la
estructura. Una estructura no tiene restricciones para contener un número
determinado de miembros, e inclusive se pueden realizar estructuras que
contengan otras estructuras.
Lección 31: Declaración de una Estructura
En C una estructura es una colección de variables que se referencian bajo el
mismo nombre. Una estructura proporciona un medio conveniente para mantener
junta información relacionada.
Al crear o definir una estructura se forma una plantilla que puede usar el
programador para definir una variable de tipo estructura. Las variables que
conforman la estructura son llamadas (elementos) de la estructura.
EJEMPLO:
struct dire
{
char nombre[30];
char dirección[30];
char ciudad[30];
int telefono;
int prefijo;
};
Para definir una variable de tipo estructura se procede así:
struct dire cliente;
La variable en memoria se la puede imaginar así:
CLIENTE
NOMBRE
DIRECCION
CIUDAD
TELEFONO
PREFIJO
De lo anterior se debe sacar como conclusión que la variable cliente, almacena 5
datos diferentes, que son: NOMBRE, DIRECCION, CIUDAD, TELEFONO,
PREFIJO.
86
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 301304 – INTRODUCCION A LA PROGRAMACION
Otra manera de declarar la misma variable es así:
typedef struct {
char nombre[30];
char dirección[30];
char ciudad[30];
int telefono;
int prefijo;
}
dire;
En
este
caso
se ha
definido un
tipo
de
dato
llamado
dire,
que
es
una
estructura
Para definir variables de ese tipo sólo se necesita escribir: dire cliente;
EJEMPLO:
Se desea crear una variable de tipo estructura para almacenar un número
complejo.
Recuerde que un número complejo, tiene parte real, parte imaginaria
Si quedo claro lo anterior, entonces se puede escribir:
typedef struct {
double p_real;
double p_imaginario;