introducion a la programacion

of 114 /114
MODULO CURSO INTRODUCCION A LA PROGRAMACION IVAN ARTURO LOPEZ ORTIZ [email protected] [email protected] UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD FACULTAD DE CIENCIAS BÁSICAS E INGENIERÍA PROGRAMA INGENIERIA DE SISTEMAS BOGOTÁ D.C., 2005

Author: vladimir-rafael-arnedo-pomares

Post on 23-Mar-2016

217 views

Category:

Documents


1 download

Embed Size (px)

DESCRIPTION

Este es el modulo de programacion Basica

TRANSCRIPT

  • MODULO

    CURSO INTRODUCCION A LA PROGRAMACION

    IVAN ARTURO LOPEZ ORTIZ [email protected]

    [email protected]

    UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD

    FACULTAD DE CIENCIAS BSICAS E INGENIERA

    PROGRAMA INGENIERIA DE SISTEMAS BOGOT D.C., 2005

  • PROTOCOLO ACADEMICO Y GUA DIDCTICA CURSO: ALGORITMOS

    @CopyRigth Universidad Nacional Abierta y a Distancia

    ISBN

    2005 Centro Nacional de Medios para el Aprendizaje

  • PROTOCOLO ACADEMICO Y GUA DIDCTICA _____________________________ 6 1.-FICHA TECNICA ________________________________________________ 9 INTRODUCCION __________________________________________________ 11

    1.0 Primera Unidad______________________________________________ 1

    1.2 INTENCIONALIDADES FORMATIVAS: __________________________________ 1 1.3.1 EDITOR LENGUAJE C++ ________________________________________ 3 1.3.2 ESTRUCTURA GENERAL DE UN PROGRAMA: _________________________ 4 1.3.3 DEPURACIN DE PROGRAMAS ___________________________________ 4 EL PROCESO DE DEPURACIN _______________________________________ 4 Lectura #1 Programar Con Estilo ____________________________________ 5 1.4 FUNCIONES _________________________________________________ 10 1.4.1 PROTOTIPOS _______________________________________________ 11 1.4.1.1 La Definicin De Una Funcin _______________________________ 12 1.4.1.2 Paso De Parmetros Por Valor: ______________________________ 12 1.4.1.3 Paso De Parmetros Por Referencia: _________________________ 15 1.4.2 VARIABLES LOCALES Y GLOBALES _______________________________ 18 1.4.3 RECURSIVIDAD______________________________________________ 20 1.5 PUNTEROS: _________________________________________________ 21

    2.0 Segunda Unidad ___________________________________________ 26

    1.2 INTENCIONALIDADES FORMATIVAS: _________________________________ 26 UNIDADES DIDCTICAS:____________________________________________ 27 2.1 ARREGLOS UNIDIMENSIONALES:___________________________________ 28 2.2 ARREGLO DE CARACTERES Y CADENAS _____________________________ 34

    Librera String: Librera Estndar Del Ansi C, Entre Sus Principales Funciones Estn: ________________________________________________________ 36

    Librera Ctype Ansi C ____________________________________________ 36

    2.3 ORDENACIN Y BSQUEDA _____________________________________ 42 2.3.1 BSQUEDA: ________________________________________________ 42 2.3.1.1bsqueda Lineal __________________________________________ 42 2.3.1.2 Busqueda Binaria: ________________________________________ 44 2.3.1.3 Busqueda De Hash . ______________________________________ 46 2.3.2 ORDENAMIENTO: ____________________________________________ 47 2.3.2.1 Ordenacin Mediante El Algoritmo Burbuja:_____________________ 47 2.3.2.2 Ordenamiento Por Insercin_________________________________ 50 2.3.2.3 Ordenamiento Shell :______________________________________ 53 2.3.2.4 Ordenacin Rpida (Quicksort) : _____________________________ 56 3.3 MATRICES O ARREGLOS BIDIMENSIONALES:__________________________ 65

    3.0 Unidad Nmero 3 ___________________________________________ 70

  • 3.1 ESTRUCTURAS Y ARCHIVOS______________________________________ 70 1.2 INTENCIONALIDADES FORMATIVAS: _________________________________ 70 3.1.1 ESTRUCTURAS: _____________________________________________ 70 3.2.1 ARCHIVOS O FICHEROS:_______________________________________ 74 3.2.1.1operaciones Con Archivos___________________________________ 77 3.2.1.2 Archivos Tipo Texto _______________________________________ 78 3.2.1.2 Archivos De Acceso Directo_________________________________ 86

    Bibliografa ____________________________________________________ 93

    Sitios Web ____________________________________________________ 93

    Anexos _______________________________________________________ 95

    ANEXO TIPOS DE DATOS___________________________________________ 96 ANEXO INDICE DE FUNCIONES _______________________________________ 99 ANEXO ERRORES COMUNES DE PROGRAMACIN ________________________ 103

  • 1.-FICHA TECNICA

    NOMBRE DEL CURSO ALGORITMOS.

    PALABRAS CLAVE

    Computadora, Hardware, Software, Informtica, Cdigo binario, Perifricos, Memoria, Programacin de computadoras, programador, Programacin estructurada, Lenguaje de programacin, Interprete, Compilador, Variable, Constante, Diagramas de flujo, Algoritmos, Toma de decisin, Ciclos, Funciones, estructuras, arreglos, cadenas, ficheros, ordenamiento, bsqueda

    INSTITUCION UNIVERSIDAD NACIONAL ABIERTA Y A

    DISTANCIA UNAD

    CIUDAD SANTA FE DE BOGOT AUTOR DEL

    PROTOCOLO ACADEMICO

    IVAN ARTURO LOPEZ ORTIZ [email protected] [email protected]

    AO 2005 UNIDAD ACADEMICA FACULTAD DE CIENCIAS BASICAS E INGENIERIA

    CAMPO DE FORMACION PROFESIONAL

    AREA DE CONOCIMIENTO INGENIERIA DE SISTEMAS Y AFINES

    CREDITOS ACADEMICOS TRES (3)

    TIPO DE CURSO TEORICO PRCTICO DESTINATARIOS Estudiantes de diversos programas de la UNAD,

    COMPETENCIA GENERAL DE APRENDIZAJE

    El estudiante se inicia en los fundamentos esenciales de las tcnicas y destrezas del diseo, anlisis y

    construccin de algoritmos y programas informticos METODOLOGIA DE

    OFERTA A DISTANCIA FORMATO DE CIRCULACION

    Documentos impresos en papel con apoyo en Web; CD-ROM.

    DENOMINACION DE LAS UNIDADES

    DIDACTICAS

    1. Conceptos, antecedentes y desarrollo de algoritmos

    2. Estructura general de un algoritmo 3. Herramienta de programacin

  • PLANIFICACIN DE LAS UNIDADES DIDCTICAS.

    Unidades didcticas, captulos, temas, secciones, fragmentos Unidades Didcticas captulos temas Secciones

    Anlisis y diseo Estructuracin Abstraccin de datos Documentacin Control de versiones

    Generalidades

    Editor de C++ Estructura General

    de un Programa Depuracin de

    programas

    Estructura de una funcin

    Prototipos Llamados de funcin Funciones

    incorporadas Funciones propias

    Declaracin Paso de parmetros por Valor

    Parmetros Variables locales y

    globales

    Parmetros por valor Parmetros por prototipo

    Recursividad

    Funciones Funciones

    Biblioteca de funciones

    Funciones de carcter Funciones numricas Funciones de fecha y

    hora Otras funciones

    Introduccin a la programacin en C o C++

    Punteros Direcciones de

    referencia Conceptos de

    punteros y utilizacin

    Arreglos unidimensionales Declaracin

    Arreglos de caracteres y cadenas Funciones

    Ordenacin Bsqueda Tipos de algoritmos Arreglos

    Arreglos bidimensionales Declaracin

    Declaracin de una estructura

    Estructuras anidadas

    Estructuras y Archivos

    Archivos de Entrada y salida

    Archivos tipo texto Archivos binarios Acceso aleatoria a

    archivos

    Funciones E/S

  • INTRODUCCION

    El curso de introduccin a la programacin es un curso que cobra vital importancia y al cual se le puede sacar el mximo provecho, puesto que los participantes tienen conocimientos previos fuertes, que vienen del curso inmediatamente anterior (algoritmos), y sobretodo de su ltima unidad donde se inicia el trabajo con un lenguaje de programacin especifico, en este modulo se incluir un pequeo apartado al retomar conceptos bsicos del lenguaje de programacin , de su compiladores, sobretodo de su editor, algunas lecturas que permiten conceptualizar la forma de depurar programas, se reforzara los conceptos sobre funciones, complementndolas con trabajo de recursividad, y a pesar de que en algoritmos se trabaja la parte de funciones es bueno prestarle mucho inters, ya que C++ es un lenguaje que se trabaja todo bajo funciones, luego continuamos con un trabajo importante referido a punteros, la razn es que cuando hablamos de funciones, estructuras, archivos, los punteros cobran vital importancia en el funcionamiento adecuado de estos tems. En una segunda unidad nos afrentamos a las estructuras estticas y le dedicamos todo un capitulo a este tema y consider que no es suficiente para abordar todos los apartados, es aqu donde se ve la necesidad de que el estudiante se apropie de los temas e investigue ms por su cuenta, aproveche los recurso de biblioteca y las consultas de Internet para ampliar aun ms los conceptos, se trabaja tambin y por tratarse de vectores, las cadenas de caracteres. Por ultimo es importante que los datos no se queden nicamente en la memoria del computador, sino que sean escritos en un dispositivo de almacenamiento para que puedan recuperarse en cualquier momento. Este tema es un poco complejo se pide a los participantes que no solo se queden con los ejercicios propuestos, sino que traten de mirar un poco ms este tema, es uno de los ms apasionantes, pues es la base abordar los temas que se acercan cuando inicien el trabajo con bases de datos.

    Para terminar, solo resta decir que este modulo esta construido, con base en una recopilacin de ejercicios prcticos que llevara al estudiante a un aprendizaje significativo, complementado con teora y una amplia referencia bibliografica y direcciones web.

    Nuevamente reiterearles la invitacin a que consulten diversidad de textos que existen con referencia a los temas que se trabajan en este modulo.

  • 1

    1.0 PRIMERA UNIDAD

    La primera unidad de una u otra manera se trata de un pequeo repaso sobre la programacin de computadoras, asiendo especial nfasis en la programacin utilizando un lenguaje especifico, como lo es C++. Es importante que los estudiantes retomen el modulo de algoritmos, para recordar algunos de los conceptos olvidados, lo mismo que bibliografa referente al tema. Esta primera unidad comprende una pequea induccin al editor del lenguaje que se utilizara a lo largo del modulo, se prestara primordial inters al tema de las funciones tratado al final del ultimo capitulo de algoritmos, pero complementndolo con temas nuevos como son las funciones recursivas.

    Igualmente estn implcitas diferentes estrategias de pensamiento de orden superior que el estudiante ir afianzado gracias al apoyo permanente del tutor, quien es el mediador del proceso de aprendizaje.

    A lo largo de esta unidad se presentan una serie de ejercicios que le permiten al estudiante verificar la evolucin de su aprendizaje.

    1.2 intencionalidades formativas:

    Afianzar conocimientos referentes a la programacin de computadoras, con un lenguaje especifico

    Propsitos de la unidad

    Realizar recuento de las principales caractersticas de la programacin de computadoras

    Dominar de manera general el entorno de programacin con el compilador C++

    Fortalecer los temas de funciones

    Objetivos de la unidad

    Conocer la funcionalidad del editor del compilador utilizado aqu Motivar a descubrir que otras funciones tiene el editor del lenguaje Determinar las tcnicas de programacin, utilizando C++ como lenguaje

    de base

    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

    modularizacion de los programas

  • 2

    Metas de aprendizaje

    El estudiante es capaz de desarrollar programas mediante la utilizacin de funciones

    UNIDADES DIDCTICAS:

    PALABRAS CLAVES: Copilador Editor Funciones Recursividad

    /*******************************************

  • 3

    1.3.1 Editor lenguaje C++

    1.- procesos de apertura cierre grabado. 2.- Procesos de edicin Copiar, cortar, pegar. 3.-realizar bsquedas por diferentes criterios en un texto de programa 4.-opciones para correr los programas 5.-opciones para compilar los programas, una de las ms importantes 6.-permite tener diversidad de parmetros para depurar programas 7.-opciones necesarias para crear proyectos desde cero 8.-permite configurar todo el entorno e inclusive opciones de trabajo en modo grafico 9.-cada programa se puede trabajar en ventanas independientes 10.-importante toda una ayuda de comando, funciones con ejemplos 11.-barra de mens 12.-espacio para escribir los programas, el editor propiamente dicho 13.-espacio donde aparecen o se configuran diversidad de ventas de apoyo al programa 14.-barra de ayudas y accesos rpidos 15.-nombre que toman los archivos

    1 2 3 4 5 6 7 8 910

    11

    12

    13

    14

    15

  • 4

    1.3.2 Estructura general de un programa:

    Un programa en c++ esta constituido bsicamente por:

    directivas del pre-procesador: [declaracin de variables globales] [prototipos de funciones] funcin main [definiciones de funciones]

    Directivas del Pre-procesador: en este se encuentra Los archivos de cabecera nos permiten indicarle al compilador que pretendemos hacer uso de las funcionalidades que nos proporcionan unas ciertas bibliotecas (en este caso predefinidas). En este caso concreto queremos emplear la biblioteca de entrada/salida iostream para lo cual tenemos que incluir iostream.h. #include

    Declaracin de variables y constantes globales: recordemos que la variables y constantes globales son aquellas que su valor afecta a todo el programa

    Cabecera de funciones: se realiza una descripcin a manera de prototipo de las funciones que se crearan ms adelante

    Funcin main(): todo programa escrito en c++ esta constituido por funciones, y la funcin principal es Main(),

    Definicin de funciones: es necesario crear las funciones que se definieron como prototipos para darle viabilidad al programa

    Sentencias: cada una de las ordenes que se le da al compilador por medio del lenguaje para que efectu una accin,

    Observacin importante: a pesar que se recomienda la utilizacin de prototipos, C++ permite la utilizacin directa de las funciones, es decir: puedo en la seccin de prototipos, realizar toda la funcin y la funcin principal main (), estar al finalizar

    1.3.3 Depuracin de programas

    La depuracin es determinacin de las causas de los errores y correccin de los mismos, en un programa determinado. El proceso de depuracin

    1. Estudio de los sntomas del error 2. Determinacin de las causas 3. Correccin 4. Prueba.

    Pueden existir varias causas de error que se pueden agrupar en dos grandes grupos:

  • 5

    1.- Errores de sintaxis 2.- Errores lgicos: Para el primer caso, al momento de compilar el programa, este detecta los errores y es posible corregirlos, mirar el el siguiente grafico

    Mirar anexo referente a errores comunes de programacin y algunas buenas prcticas de programacin, propuesto por Miguel . Toledo Martnez1

    Los errores lgicos son ms difciles de corregir, pues el compilador no los detecta, veamos un ejemplo, estamos realizando un programa para el pago de la nomina de 500 empleados y nos equivocamos a la hora de hacer la formula de los descuentos, en ves de realizar la resta hacemos una suma, como se puede ver en este ejemplo es un error muy grave, pero de anlisis y no de sintaxis. Es indispensable realizar una buena interpretacin del problema para continuar con el anlisis respectivo.

    Lectura #1 Programar con estilo

    Introduccin

    !"#$ %

    $ & ' (

    1 http://www.galeon.com/neoprogramadores/soyc-cpp.pdf

  • 6

    ) * ) ) +* * ", - .

    -

    &/0

    /'1"23/43$5/

    1 6

    )&'

    ")'

    $ 7*& #, !'

    ) 8 #,

    3- $) // 9* & ' :" ;;

  • 7

    12**)$ " - - 2 3 )

    Estructuracin

    # $ ) 1 &' 1 &''> $ ! 0 - "

    void ImprimirRecords() { Datos=LeerDatos(Fichero); DibujarPantalla(); EscribirRecords(Datos); EsperarTecla(); }

    1 )

    Abstraccin de datos

    # $ 1

    )&'

    )1-) (?!" ) 6 ) *

    ( 4 $ ) 5 $

    )

  • 8

    $ 2

    ) 6 [email protected]#!?!!AA'

    1 $ $

    Documentacin

    ,

    #

    1

    ;!

    ;>

    &B '

    ;! @

    ;!

    = 22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22C7D9E1>E22!1*>E(>(7C> )(!(22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22=F7E+G$*

    @;8(#1;22+1>BHI2HI2JHHI;K;0

    JL22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22B(*F7E(>722L?

    22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #

    ;C7

    ;& '

    ;E

    ;(

    22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  • 9

    22C7D9E1E)22!1*>E(>(7C!)- 22EMD1FE7* NC-)22C7F1-

  • 10

    !+,&(U!JWXI'

    (U!-1

    - 1

    ,&)' 1 (U!$

    )

    &'&'()-

    /****

    1.4 FUNCIONES

    Una de las herramientas fundamentales a lo largo de la historia de la programacin, ha sido la inclusin de funciones, que se comportan como mini programas dentro de otro programa, permitiendo la reduccin de espacio, la agrupacin de muchas sentencias repetitivas bajo un mismos nombre, permiten que los programas sean legibles, estructurados y comprensibles, logrando con esto poder actualizar y/o corregir los programas de una manera rpida, sin tener que afectar la integridad de todo el programa. Podemos definir a las funciones como:

    Una funcin es simplemente un algoritmo el cual devuelve un nico valor al sitio del programa en que fue invocada o llamada

    Es un conjunto de instrucciones que cumplen con una tarea especfica YUna funcin es una seccin de cdigo independiente, con nombre, que

    ejecuta una tarea especfica y opcionalmente devuelve un valor al programa que la llam

    De acuerdo a las definiciones dadas podemos, podemos decir lo siguiente:

    Una funcin tiene un nico nombre, al utilizar ste nombre en otras partes del programa se pueden ejecutar los enunciados contenidos en la funcin. A esto se le conoce como llamar o llamado a la funcin, e inclusive se puede llamar desde otras funciones

    Una funcin es independiente, es decir pude ejecutar sus tareas sin interferencia interferir en otras partes del programa.

    Una funcin ejecuta una tarea especfica. Una tarea es un trabajo discreto que un programa debe ejecutar como parte de su desempeo general, por ejemplo mandar una lnea de texto a centrar, realizar ordenamientos, realizar clculos matemticos, ..

    Una funcin opcionalmente devuelve un valor al programa que la llam. Cuando un programa llama a una funcin se ejecutan los enunciados contenidos en sta, si el programa lo requiere, stos enunciados pueden devolver un valor al programa que llam a la funcin mediante la orden return,

  • 11

    Otras caractersticas importantes de las funciones y/o profundizacin a las anteriores:

    Las funciones se comportan como si fuesen variables Se pueden definir funciones como "extern" o "static"., pro defecto estn

    definidas como extern, es decir afectan todo el programa Las funciones estn concebidas para devolver valores, por defecto el

    valor es int, de querer que la funcin no retorne valor, se le antecede al instruccin void o puede tomar cualquier valor como si fuese una variable

    Las funciones deben tener nombres y se aconseja que este nombre identifique claramente lo que hace la funcin, si se necesita varias palabras para el nombre, se recomienda separarlo con un guin _ o iniciando con mayscula la primera letra de la palabra , un ejemplo pude ser centrar _ palabra, Centrar palabra,

    Los parmetros de una funcin van entre parntesis y representa los valores de salida, y podemos afirmara que cada parmetro es una variable, en caso de no realizar paso de parmetros, simplemente se escribe el nombre de la funcin y los parntesis llamado()

    Las funciones se comportan exactamente como programas, por lo tanto deben tener un inicio y un fin { }

    C++ esta soportado mediante funciones, de hecho el programa principal es una funcin main()

    1.4.1 Prototipos

    Para utilizar una funcin en un programa se requiere en primer lugar declararla y despus definirla. La declaracin de la funcin le indica al compilador el nombre, el tipo de dato devuelto por la funcin y los parmetros pasados a la funcin. A la declaracin de una funcin se le llama tambin el prototipo

    Un prototipo es una declaracin de una funcin. Consistente simplemente en el encabezado de la funcin, terminado con punto y coma (;)lo que hace es avisar al compilador, como se va a llamar la funcin y si recibe y devuelve informacin La estructura de un prototipo es: func();

    Ejemplo: int Mayor(int a, int b);// es un prototipo de funcin que devuelve un entero y recibe dos parmetros 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++ quedara as:

  • 12

    [directivas del pre-procesador: includes y defines] [declaracin de variables y constantes globales] [prototipos de funciones] [declaraciones de clases] funcin main () [definiciones de funciones]//definidas en los prototipos [definiciones de clases]

    Para llamar a una funcin de ejemplo (mayor) la cual la tenemos con dos parmetros y una segunda funcin llamada cuadro, la cual no contiene parmetros se debe respetar la sintaxis siguiente: x = mayor (, ); x = cuadro (); La variable x tomar el valor regresado por la funcin.

    Cuando la funcin termina deber regresar a donde fue llamada. Esto se hace a travs de la instruccin: return. Esta instruccin existe bajo dos formas: 1.)return(x); 2.) return(0)

    La primera regresa al programa que la llam el valor de x, La segunda simplemente regresa el control a quien llam a la funcin

    1.4.1.1 La definicin de una funcin Es en s la funcin misma, est compuesta en su primer lnea de cdigo por el encabezado que debe ser idntico al prototipo de la funcin pero en ste caso no se utiliza el punto y coma al final y adems, al contrario del prototipo, donde es opcional incluir el nombre de las variables utilizadas como argumentos como lo vimos antes, en el encabezado de la funcin si se debe incluir el nombre de las variables. Enseguida del encabezado est el cuerpo de la funcin que contiene, encerrados entre llaves, procesos propios que debe realizar la funcin. Si la funcin devuelve algn valor, ste se debe especificar al final del cuerpo de la funcin, mediante la instruccin return(variable)

    1.4.1.2 Paso de parmetros por Valor: En el caso de parmetros por valor: el valor de la variable que se est pasando, es asignado a la variable local que es declarada al definir la funcin. Tanto la variable que se utilice al efectuar la invocacin como la que la recibe "por valor" deben ser del mismo tipo, en caso contrario se presentar un error.

    Es hora de llevar lo anterior a la prctica, realizaremos un ejemplo para determinar cada una de las partes que conforman un programa con funciones:

    //*********************************************************

  • 13

    Se esta pasando valores a la funcin divide, primero el valor x inicial y en el segundo llamado el valor y inicial

    Los valores X y Y, se convierten en valorx, valory, lo mismo sucede en la funcin multiplica

    // Programa que permite realizar una multiplicacin // y una suma mediante ala utilizacin de funciones //*********************************************************

    #include void divide (int x, int y); int multiplica (int, int);

    // Funcin principal int main() { int x, y,r; cout x cin >> y; divide(x, y); // llama a la funcin "Divide" divide(y, x); r = multiplica(x, y); cout

  • 14

    El siguiente programa soluciona un sistema lineal de tres incgnitas con tres variables, por el mtodo de Cramer, mediante la utilizacin de funciones

    #include #include

    // declaracin de variables globales float a,b,c,d,e,f,g,h,i,j,k,l, // coeficientes y trminos independientes X, Y, Z; // incgnitas a encontrar.

    void LeerCoeficientes(); // prototipo de funcin que permite leer los coeficientes

    void CalculoIncognitas(); // prototipo de funcin que permite realizar los calculos

    void EscribirResultados();// prototipo -funcin que permite escribir los resultados

    void main(){ LeerCoeficientes(); // lamado a caca una de las fucnciones CalculoIncognitas(); EscribirResultados(); }

    // Desarrollo de la Funcin que permite leer las variables void LeerCoeficientes() { cout b; cout > c; cout > d; cout f; cout > g; cout > h; cout j; cout > k; cout > l; }

    // En esta funcin se realiza el calculo de las incognitas void CalculoIncognitas() {

  • 15

    float DetX, DetY, DetZ, DetSistema; // Variables locales DetSistema = a*f*k + e*j*c + i*b*g - i*f*c - j*g*a - k*e*b; DetX = d*f*k + h*j*c + l*b*g - l*f*c - j*g*d - k*h*b; DetY = a*h*k + e*l*c + i*l*g - i*h*c - l*g*a - k*e*d; DetZ = a*f*l + e*j*d + i*b*h - i*f*d - j*h*a - l*e*b; X = DetX / DetSistema; Y = DetY / DetSistema; Z = DetZ / DetSistema; }

    // funcion que permite mostrar por pantalla los resultados void EscribirResultados() { cout

  • 16

    Otra forma de comunicacin, adicional al retorno de un valor, el cual puede producir una funcin, consiste en el paso de parmetros por referencia, en el cual cada variable pasada como parmetro, puede ser modificada por las instrucciones contenidas en el mbito de la funcin.

    En la invocacin se pasa la variable de igual forma que se hace por valor, esto es una "desventaja" ya que al ver la instruccin no nos daramos cuenta si se est pasando por referencia o valor, la costumbre nos hara pensar que es por valor, pero para estar seguros debemos ver la definicin de la funcin; al identificador que recibe, en la definicin de la funcin, se le antepondr el operador de direccin, &; de esta forma, en la memoria RAM tomar la misma direccin del parmetro de invocacin

    No nos inquietemos, en el siguiente capitulo se estudiar lo referente a punteros, esto nos permitir una mayor claridad, sin embargo es bueno que el estudiante vaya indagando acerca de este apasionante tema.

    Miremos el siguiente ejemplo: donde se hace el intercambio de dos valores en la memoria ram del computador

    //Paso de parmetros por referencia // #include #include

    void intercambio(int *, int *); // prototipo de la funcin

    main() { int a = 20, b = 30; intercambio(&a, &b); // a y b son pasados por referencia cout

  • 17

    #include

    int leer();

    CalcularBinario(int, int);

    void main() { int i, decimal, binario[20];

    decimal = leer(); CalcularBinario(decimal, binario); }

    int leer() { int N;

    cout > N; return (N); }

    CalcularBinario(int N, int *p) { int c,r;

    c = N >> 1; *p = N % 2; cout

  • 18

    S ___ No ____

    c) void Invertir(int, unsigned char) S ___ No ____

    d) void sumar(float valor); S ___ No ____

    e) float suma(float int); S ___ No ____

    f) int mayor(int, int, int); S ___ No ____

    g) char Menu(int opciones); S ___ No ____

    1.4.2 Variables locales y globales

    En C++ est permitido declarar variables en cualquier parte del cdigo fuente. Adems de pasar variables como parte del argumento de una funcin, tambin es posible declarar variables dentro del cuerpo de una funcin, a este tipo de variables se les llama locales ya que slo son tiles dentro del cuerpo de la funcin. Los parmetros utilizados en una funcin se consideran como variables de tipo local y se utilizan exactamente de la misma manera, como lo demuestra en el siguiente codigo

    int suma(int valor1, int valor2) { int local; // variable local

    local = valor1 + valor2;

    return local; }

    " # #

  • 19

    #include

    int global; // variable global

    void funcion1(int parametro);

    int main() { int local1, i, global=30;

    cout

  • 20

    1.4.3 Recursividad

    Esta es la propiedad que tienen las funciones en C++ de poder llamarse a si mismas. Se dice que una funcin es recursiva cuando se autollama. No todas la funciones pueden llamarse a si mismas (ser recursivas), deben estar diseadas especialmente para que tengan una final y no se conviertan en ciclos o bucles infinitos.

    1 $ # F1-$PKPZIZ?ZJZLKLJH1

    #include double factorial(int valor);

    int K=1; // variable global, para un contador general

    int main() { int num;

    cout num; cout

  • 21

    return resultado; }

    1.) la funcin se declara de tipo doble, puesto que los valores que retornan la funcin pueden ser demasiado grandes.

    2.) Tambin se utiliza una variable global (K), que sirve de contador, para determinar el nmero de iteraciones que la funcin se repite

    3.) El programa empieza solicitndole un nmero entero y despus llama por primera vez a la funcin factorial ( ). La recursividad necesita una condicin para terminar el proceso en el momento especifico, por sta razn, la funcin factorial ( ) determina en primer lugar si el valor pasado como parmetro de la funcin es igual a 1, en cuyo caso la funcin retorna 1. Si el valor del parmetro es mayor que 1, entonces la funcin factorial ( ) se llama a s misma tomando como parmetro el valor original menos uno, multiplicando ste valor por el valor del parmetro original y almacenando el resultado en la variable llamada resultado. (se recomienda realizar una prueba de escritorio para entender un poco ms el movimiento de la funcin y sus iteraciones)

    1.5 PUNTEROS:

    Podremos deducir por el nombre que un puntero, que es algo que apunta a algn lado, en el caso de la programacin de computadoras, los punteros apuntan a direcciones de memoria, Los punteros son variables las cuales guardan direcciones de memoria RAM. En memoria un puntero ocupa 2 bytes.

    La direccin de memoria RAM que almacena un puntero (p) corresponder a la direccin base de otra variable(x) que est en memoria, decimos entonces que el puntero "apunta" a esta variable, de la siguiente forma: P X 1200 "P apunta a X" 1200

    Para este caso tomaremos una direccin no real (1200), la verdadera direccin la asigna el sistema operativo, a travs del compilador

    En memoria, la variable P almacena un valor de 1200. La variable X se encuentra en la direccin de memoria 1200.La abstraccin que se debe hacer es la de que P apunta o seala a X.

    Para definir un puntero se inicia definiendo el tipo (int, flota, char), luego se antepone el * la nombre de la variable ejemplo int *X.

  • 22

    La direccin de memoria se representa a travs de notacin hexadecimal Si se define Int *X, k=23 y queremos que X tome la direccin de la variable K entonces: P=&K; Esta instruccin se debe interpretar as: La direccin (&) de la variable K de tipo entero, se asigna ala variable puntero P, una representacin grfica quedar as:

    0X0012FF78 00000000 00001101 0x0012FF7C 0x0012FF78 0x0012FF79 Y si se quiere visualizar el valor de la variable K a travs del puntero, queda as: Cout

  • 23

    #include void main(){ int *p, x=13; cout

  • 24

    Estudiemos el funcionamiento del programa:

    Se asigna a ptInt la direccin de var1. Entonces el valor de ptInt es la direccin de memoria de var1.

    A var2 se asigna el valor al que ptInt apunta. Entonces el valor de var2 es el contenido de la localizacin de memoria la que ptInt apunta (var1).

    Despus de imprimir los tres valores por primera vez, el contenido de la direccin a la que apunta ptInt es cambiado a 5. Como este contenido es var1, el valor de var1 es ahora 5, pero var2 no es modificado.

    Las dos ltimas lneas ilustran cmo los operadores * y & son conceptos inversos. Ntese que el orden de precedencia es de izquierda a derecha, por tanto el ms cercano a la variable es siempre el primero que se aplica.

    Taller Punteros

    1) investigue porque un puntero ocupa 2 bytes? 2) Donde radica la importancia de la utilizacin de punteros 3) Cuales son las restricciones del uso de los punteros

    Taller cerificacion Fin unidad

    1.- Existe un ejercicio clsico, la intencionalidad no es transcibirlo, 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 localizacin a otra. Los discos son frgiles; solamente uno se puede llevar al mismo tiempo. Un disco no se puede colocar encima de un disco ms pequeo, menos valioso. Y, hay solamente otra localizacin en el templo (adems de la original y de la localizacin 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 atrs, entre la pila original, la pila en la nueva localizacin, y la localizacin intermedia, manteniendo siempre el orden (ms grande en el fondo, ms pequeo 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 localizacin, el templo se convertir en polvo y el mundo terminar. T que crees? .........Bueno dejmonos de leyendas y vamos a lo que vamos....... El "Juego" torres de Hanoi consiste en tres palos, en el cual el primer palo tiene N nmero de argollas colocadas de tal manera que las ms grandes siempre deben estar por debajo de las ms pequeas...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

  • 25

    tal manera que se mueve una argolla a la vez y que nunca una argolla grande quede encima de una pequea....

    Torre 1............... Torre 2............... Torre 3

  • 26

    2.0 SEGUNDA UNIDAD

    Arreglos unidimensionales Arreglos de caracteres y cadenas Arreglos bidimensionales Ordenacin Bsqueda

    Esta unidad nos permite afrentarnos un poco en el mundo de los datos estructurados, para tal efecto iniciaremos con los datos mas sencillos como los son los arreglos unidimensionales, realizando ejemplos de diferente tipo, y se presentar una vez se tenga dominio sobre este tema, abordaremos un tipo especial de arreglos unidimensionales como lo son las cadenas de caracteres, para seguir con los arreglos bidimensionales o matices, se nombraran simplemente los arreglos multidimencionales, y se espera que el estudiante profundice mas sobre este tema, tambin se profundiza sobre las operaciones fundamentales que se hacen con los arreglos como los son la ordenacin y la bsqueda , para lo cual se revisarn diversidad de algoritmos que dan solucin a estos temas, al finalizar cada tema se propondr una serie de ejercicios que le permitan al estudiante realizar una auto evaluacin de lo aprendido, lo mismo que interactuar con los compaeros del pequeo grupo colaborativo.

    1.2 intencionalidades formativas:

    Conceptuar referente a estructuras de datos que manipulan volumen mayor de informacin

    Propsitos de la unidad Conocer el trabajo que se realiza con vectores, arreglos y cadenas de

    caracteres Realizar bsquedas y ordenamientos utilizando algoritmos diseados

    para tal fin

    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 bsqueda y ordenamiento

    Competencias de la unidad:

    Dominar las tecnicas de bsqueda y ordenamiento aplicado a estructuras bsicas de la programacin

    El estudiante aplica los vectores y arreglos como herramienta fundamental en la programacin de computadoras

  • 27

    Metas de aprendizaje

    Realizar programas con un alto grado de complejidad

    UNIDADES DIDCTICAS:

    PALABRAS CLAVES:

    Arreglos Bsqueda Ordenamiento String

  • 28

    2.1 Arreglos unidimensionales:

    Los arreglos unidimensionales son estructura de datos esttica que le periten almacenar gran cantidad de informacin bajo un mismo nombre, tambin reciben el nombre de vectores en lgebra o arreglos unidimensionales en programacin

    Los procesos normales con un vector o con sus elementos incluyen: Declarar toda la lista, Capturar sus elementos, Desplegarlos, Realizar operaciones con ellos, entre otros procesos

    Para decalar un arreglo o una lista se usa el siguiente formato:

    tipodato nombre[cantidad de elementos];

    ejemplos; int edades[12]; float sueldos[10]; Char carreras[10];//

    El tema del manejo da cadena de caracteres, es apasionante, se recomienda iniciar su estudio, para abordar temas posteriores

    /** Como se ve, el nmero de elementos del arreglo estar dado por el nmero encerrado entre [ ] al declararlo, esto se llama dimensionamiento., es obligatorio, a menos que se de implcitamente el tamao del arreglo por medio de la inicializacin del mismo como as:

    char Operador[] = {'U', N', 'A', 'D'}; int Enteros[] = { 4, 13, 0, 5, 6, -23, 7, 345, 45, -12};

    En el primer ejemplo, Operador ser un arreglo de cuatro posiciones, y queda inicializado con los correspondientes caracteres dados entre llaves. El segundo ejemplo el vector Enteros tendr 10 posiciones.

    En un arreglo de N elementos organizados en una dimensin donde N recibe el nombre de longitud o tamao del vector. Para hacer referencia a un elemento del vector se usa el nombre del mismo, seguido del ndice (entre corchetes), el cual indica una posicin en particular del vector. Por ejemplo:

    Vec[x]

    Donde: VecNombre del arreglo x Numero de datos que constituyen el arreglo

  • 29

    Siendo ms claros, si queremos manejar un conjunto de 9 elementos de tipo entero, tendremos que definir un arreglo de la siguiente manera:

    Int c[9]: esquemticamente queda as:

    Que es el subndice? Es el Es el nmero que hace referencia a una celda especfica del arreglo, en el caso de c++ el subndice es un valor que inicia desde cero y se extiende hasta el valor que se haya definido el arreglo, es importante no confundir el subndice con el valor que toma el arreglo en esa posicin, para el ejemplo anterior el arreglo toma el nombre de c y si queremos referirnos a una posicin en especial, por ejemplo a la posicin nmero 4 x= c[4], para este caso la variable x tomara el valor de -200.14

    Normalmente un arreglo va acompaado de un ciclo, y el ms comn para manipular arreglos es el ciclo for, ya que se conoce una dimensin exacta del arreglo.

    3.2

    -1.0

    4.75

    3.14

    0.23

    -200.14

    10.78

    18.84

    0.7550

    1983.0

    c[0]

    c[1]

    c[2]

    c[3]

    c[3]

    c[4]

    c[5]

    c[6]

    c[7]

    c[8]

    Nombre del arreglo

    Los registros se acceden a travs de un subndice

  • 30

    Es importante realizarle una limpieza a todas las posiciones del arreglo, antes de iniciar a trabajar con ellas, miremos un segmento de programa que permita poner en ceros (0) todas la posiciones del vector anterior Void Main () { Int c [10], k; For(k=0;k

  • 31

    edad_mayor= edad[0 ]; // edad_mayor toma el primer valor del arreglo

    for (k=0; k

  • 32

    3. Leer un vector A de N elementos y un vector B de M elementos (pueden ser repetidos en cada vector). Cuntas veces se encuentra presente cada elemento de A en B, no incluya elementos repetidos?.

    4. Llenar dos vectores A y B de 25 elementos cada uno, sumar el elemento uno del vector A con el elemento uno del vector B y as sucesivamente hasta 25, almacenar el resultado en un vector C, visualizar los tres vectores

    5. Lea un vector A de N elementos todos diferentes y un vector B de M elementos los cuales pueden ser repetidos. Cuntas veces se encuentra presente cada elemento de A en B?

    6. Llenar un vector de 20 elementos, imprimir la posicin y el valor del elemento mayor almacenado en el vector. Suponga que todos los elementos del vector son diferentes.( solo cambia una condicin a nuestro ejemplo de trabajo )

    7. Se tiene un vector de N posiciones de tipo entero. Generar a partir de l otros tres vectores A, B y C de suerte que en A estn solo los nmeros pares, en B los impares y en C los mltiplos de 10.

    8. Almacenar 500 nmeros en un vector, elevar al cuadrado cada valor almacenado en el vector, almacenar el resultado en otro vector. Imprimir el vector original y el vector resultante.

    9. Almacenar 300 nmeros en un vector, imprimir cuantos son ceros, cuantos son negativos, cuantos positivos. Imprimir adems la suma de los negativos y la suma de los positivos.

    10. Almacenar 150 nmeros en un vector, almacenarlos en otro vector en orden inverso al vector original e imprimir el vector resultante.

    11. Se tienen almacenados en la memoria dos vectores M y N de cien elementos cada uno. Hacer un algoritmo y programa que escriba la palabra Iguales si ambos vectores son iguales y Diferentes si no lo son. Sern iguales cuando en la misma posicin de ambos vectores se tenga el mismo valor para todos los elementos.

    12. Se tiene el vector A con 100 elementos almacenados. Disee un algoritmo y programa que escriba SI si el vector esta ordenado ascendentemente o NO si el vector no esta ordenado

    13. Leer valores numricos en un vector en desorden, a continuacin mostrarlo en la misma secuencia pero ignorando los elementos repetidos y diciendo cuntos se imprimieron?.

    14. Disee un algoritmo y programa que lea un nmero cualquiera y lo busque en el vector X, el cual tiene almacenados 80 elementos. Escribir

  • 33

    la posicin donde se encuentra almacenado el nmero en el vector o el mensaje NO si no lo encuentra. Bsqueda secuencial.

    15. Disee un algoritmo y programa que lea dos vectores A y B de 20 elementos cada uno y multiplique el primer elemento de A con el ultimo elemento de B y luego el segundo elemento de A por el diecinueveavo elemento de B y as sucesivamente hasta llegar al veinteavo elemento de A por el primer elemento de B. El resultado de la multiplicacin almacenarlo en un vector C.

    16. Disee un algoritmo y programa que almacene en un vector llamado Fibon[100] los 100 primeros nmeros de la serie fibonacci., recuerde que esta serie inicia as: 0,1,1,2,3,5,8,13..N100

  • 34

    2.2 Arreglo De Caracteres y Cadenas

    Una vez se conceptualizo el concepto fundamental de lo que es un vector o arreglo unidimensional, se puede con gran facilidad hablar de cadena de caracteres, pues se comporta como un arreglo de este tipo, a diferencia de otros lenguajes que trae un tipo primitivo para el manejo de este tipo de datos, normalmente se denominan string La declaracin es similar a un vector normal ejemplo: char cadena[10] en este caso hemos abierto un arreglo de 10 espacios para manejar una cadena de 9 caracteres Observacin si se debe definir una cadena con un espacio ms, puesto que C++ reserva la ultima posicin para identificar el fin de la cadena \0

    Una cadena puede almacenar todo tipo de informacin de tipo alfanumrico como: nombres de personas, mensajes de error, nmeros de telfono, direcciones entre otras . La asignacin directa slo est permitida cuando se hace junto con la declaracin. Por ejemplo:

    char S[5]; S = "UNAD"

    O tambin podemos realizar una asignacin uno a uno as:

    char S [5]; S [0] = 'U'; S [1] = 'N'; S [2] = 'A'; S [3] = 'D'; S [4] = '/000';

    Realicemos un ejemplo Escribir un programa que lea el nombre, la edad y el nmero de telfono de un usuario y los muestre en pantalla.

    #include #include

    int main() { char Nombre[30]; // cadena para almacenar el nombre (29 caracteres) int Edad; // Un entero para la edad char Telfono[13]; // Y otra cadena para el nmero de telfono (12 dgitos)

    // Mensaje para el usuario y captura de informacin cout >Nombre; cout

  • 35

    cin>>Edad; cout Telfono;

    // Visualizacin de los datos ledos cout

  • 36

    Librera string: librera estndar del ANSI C, entre sus principales funciones estn:

    Memchr: void *memchr (const void *s, int c, size_t n);

    Localiza la primera aparicin de un carcter para en los primero n caracteres de una cadena

    Ejemplo

    #include #include #include

    int main() { char cadena[] = "Mundo cruel..."; char *puntero;

    puntero = (char *)memchr( cadena, 'd', 15 ); cout

  • 37

    // Mediante la utilizacin de un ciclo podemos convertir toda una cadena que esta en //maysculas a minsculas

    #include #include

    int main() { char cadena[ ] = "UNIVERSIDAD UNAD-"; int i;

    for(i = 0; cadena[ i]; i++) cadena[i] = tolower(cadena[i]); cout

  • 38

    1. Ejemplo de funciones varias para manipular cadenas de caracteres. La mayora vienen incorporadas en el archivo a incluir string.h.

    #include #include /* NULL*/ #include #include #include

    int longitud (char *cadena){ //Similar a la funcin strlen de string.h int c=0;

    while(*cadena){ c++; cadena++; } return c; }

    void AMayusculas(char *cadena){ //similar a strupr de string.h while (*cadena){ if (*cadena>=97 && *cadena=65 && *cadena

  • 39

    void CopiarCadena(char *cadena2, char *cadena1){//Copia cadena1 en cadena2

    *cadena2 = *cadena1; while(*cadena1){ cadena2++; cadena1++; *cadena2 = *cadena1; } } void ConcatenarCadena(char *cadena2, char *cadena1){ //esta funcin es similar a strcat de string.h while (*cadena2) //Encuentra final de cadena2 cadena2++;

    while(*cadena1){ //aade contenido de cadena1 a cadena2 *cadena2 = *cadena1; cadena2++; cadena1++; } *cadena2 = '\0'; //coloca terminador nulo a la cadena2 }

    int CompararCadenas(char *cadena2, char *cadena1){//Similar a strcmp de string.h int posicion=1; //de la primera diferencia.

    while(*cadena1 == *cadena2){ if( *cadena1 == NULL && *cadena2 == NULL) return 0; //las cadenas son iguales cadena1++; cadena2++; posicion++; } if (*cadena1-1 < *cadena2-1) posicion = -posicion;

    return posicion; }

    int ContarOcurrenciaCaracter(char *cadena, char caracter){ int c=0;

    while(*cadena != NULL){ if (*cadena == caracter) c++; cadena++; }

    return c; }

  • 40

    int SustituirCaracterPorOtro(char *cadena, char carviejo, char carnuevo){ int contador=0;

    while(*cadena){ if (*cadena == carviejo){ *cadena = carnuevo; contador++; } cadena++; } return contador; }

    void main(){ char c1, c2, s2[80], *s1="Esto es una prueba"; int pos;

    clrscr(); cout

  • 41

    else cout

  • 42

    2.3 Ordenacin y Bsqueda

    Una de las mayores actividades que los computadores realizan con los datos incorporados, es estar buscando informacin y ordenarlos permanentemente, de acuerdo a unos criterios establecidos por los usuarios, por consiguiente estos temas cobran vital importancia para los estudiantes del presente curso. Los temas se tratan con algoritmos ya realizados por expertos, lo que pretendemos es simplemente estudiarlos y adecuarlos a ejercicios propuestos.

    Es vital que para poder conceptualizar estos temas, se tenga claridad en el manejo de vectores.

    2.3.1 Bsqueda: La bsqueda es una tarea que uno realiza permanentemente, en toda actividad, cuando se esta en un supermercado uno busca artculos 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 bsqueda esta presente en cada una de las actividades.

    Los algoritmos ms utilizados para la realizacin de bsquedas son:

    Lineal o Secuencial Binaria. Hash (transformacin de claves).

    2.3.1.1Bsqueda lineal Es el mtodo para buscar algo dentro de un arreglo , donde se hace un recorrido de inicio a fin de, realizado las comparaciones necesarias hasta encontrar el elemento requerido . Para entenderlo mejor realizamos el algoritmo necesario

    encontro = FALSE para k= 0 hasta n haga

    si X[k] = ValorBuscado haga mostrar Elemento encontrado en la posicin , k

    encontro = TRUE k=n;

    fin si fin para si encontro = FALSE haga

    mostrar No se encontr el elemento fin si

  • 43

    A continuacin un ejemplo de bsqueda lineal #include #include #include

    // Prototipos de las funciones. void mostrar(int *arreglo, int n); int buscar(int valor, int *arreglo, int n);

    void main(void) { int n; // numero de elementos del vector < 100 int valor; // El numero a buscar int i; // Contador int arreglo[100]; // Arreglo de enteros

    clrscr(); coutn;

    for (i=0;i

  • 44

    { int i; // Contador

    for (i=0; i

  • 45

    Ahora el elemento central es mayor que el valor que se esta buscando, por lo tanto hay que proceder hacia la izquierda

    19 Existe en la posicin 5

    encontro = 0 menor = 1 mayor = n mientras menor

  • 46

    cout

  • 47

    Es otro mtodo complejo de bsqueda, que tiene ventajas con respeto al mtodo binario, puesto que no requiere que el vector este ordenado. Este mtodo no lo veremos en este modulo, pues presenta colisiones. Si esta interesado en profundizar un poco ms en este mtodo, refirase a la siguiente direccin http://www.itlp.edu.mx/publica/tutoriales/estru1/18.htm,.

    2.3.2 Ordenamiento:

    a pesar que no es una actividad tan constante como la bsqueda de datos, muchas veces necesitamos ordenar los datos para tener una informacin ms consistente, es as que se han desarrollado numerosos algoritmos que permite dar un orden adecuado a los datos, entre ellos podemos encontrar unos sencillos, otros complejos otros eficientes y otros no tanto. Los algoritmos que revisaremos en este apartado son

    1. Burbuja (intercambio). 2. Insercin (baraja) 3. Insercin binaria 4. Seleccin. 5. Shell. 6. Ordenacin rpida (Quicksort). 7. Mergesort

    De los cuales en este modulo presentamos el 1,2,4,5 los otros son variaciones de los primeros

    2.3.2.1 Ordenacin mediante el algoritmo Burbuja: Este es el mtodo ms fcil de utilizar y aprender, tambin 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 queremos ordenar ascendente o descendentemente); esto producir que en el arreglo quede como su ltimo elemento, el ms grande. Este proceso deber repetirse recorriendo todo el arreglo hasta que no ocurra ningn 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 ascendete o descendente

    2. Comparar A[1] y A[2]; Si estn en orden, se mantienen como estn; en caso contrario, se intercambian entres s.

    3. A continuacin se comparan los elementos 2 y 3; de nuevo se intercambian si es necesario.

    4. El proceso contina 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

  • 48

    Temporal = Elemento[i] Elemento[i] = Elemento [i+1] Elemento [i+1] = Temporal fin si fin para

    Para poder realizar este intercambio no apoyamos en una variable temporal que permite almacenar uno de los valores por un periodo, para que no se pierda.

    Ahora miremos el cdigo

    #include #include #include

    // Prototipos de las funciones. void MostrarVector(int *arreglo, int n); void burbuja(int *arreglo, int n);

    void main(void) { int n; // Numero de elementos del vector int i; // Contador int arreglo[100]; // Arreglo de enteros

    clrscr(); coutn;

    for (i=0;i

  • 49

    void MostrarVector(int *arreglo, int n) { int i; // Contador for (i=0;i

  • 50

    2 - 1 - 3 - 4 - 5

    1 - 2 - 3 - 4 - 5

    Nuevamente se sugiere la realizacin de nuevas pruebasa de escritorio para entender mejor el comportamiento de este programa

    Tambin existen formas de mejorar la efectividad de este algoritmo, se le sugiere tratar de implementar soluciones que mejoren los procesos en este algoritmo

    2.3.2.2 Ordenamiento por insercin

    En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posicin apropiada con respecto al resto de los elementos ya ordenados.

    As por ejemplo, si tenemos el vector

    53 15 27 31 29 11 59 7

    Podemos insertar el elemento 15 en la posicin 1 y mover el 53 a la posicin 2, con lo que tendramos los dos primeros elementos ordenados como se aprecia en la Error! No se encuentra el origen de la referencia..

    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 seran los que se aprecian en la Error! No se encuentra el origen de la referencia..

    15 53 27 31 29 11 59 7

    Como resultado:

    15 27 53 31 29 11 59 7

    Como se puede observar el mtodo se basa en comparaciones y desplazamientos sucesivos. El algoritmo de ordenacin de un vector X para N elementos se realiza recorriendo el vector e insertando el elemento correspondiente en el lugar adecuado. De esto tenemos que el siguiente pseudocdigo nos da una idea general de la labor a realizar:

  • 51

    para i =2 hasta i = n haga Inserte X[i] en la posicin adecuada entre X[1] y X[i-1] fin para

    El desarrollo de est operacin de insercin se puede realizar en dos partes principales. La primera determinar en que lugar debe ir el elemento que se esta evaluado.

    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 insercin, 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 pseudocdigo 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 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

    veamos el comportamiento del cdigo

  • 52

    #include #include #include #define MAXNUM 100

    // Prototipos de las funciones. void MostrarVector(int *arreglo, int n); void insercion(int *arreglo, int n);

    void main(void) { int n; // numero de elementos del vector int i; // Contador int arreglo[100]; // Arreglo de enteros

    clrscr(); coutn;

    for (i=0;i

  • 53

    int temporal; // Variable que conserva el elemento X[i] int lugar; // Variable del lugar donde se debe insertar

    for (i=1;i

  • 54

    fin mientras

    Es momento de realizar la prueba de escritorio, consideremos el siguiente vector:

    4 10 9 3 7 2 1 9

    Decidimos ordenarlo en forma ascendente: Salto = 4 y es 0 Cambio = 0 I = 1

    4 10 9 3 7 2 1 9

    Como la condicin no se cumple 4 no es mayor que siete, se incremente i y contina el proceso Variable i = 2

    4 10 9 3 7 2 1 9

    Como podemos observar el nmero 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

    La variable cambios toma el valor de 1, el proceso continua hasta que i llega a n- salto, para el primer caso hasta 4, luego se divide nuevamente en 2 y luego en uno.

    Ahora miremos el cdigo

    #include #include #include // Prototipos de las funciones. void MostrarVector(int *arreglo, int n); int shell(int *arreglo, int n);

    void main(void) { int n; // El numero de elementos del vector int i; // Contador int arreglo[100]; // Arreglo de enteros

  • 55

    clrscr(); coutn;

    for (i=0;i

  • 56

    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; }

    2.3.2.4 Ordenacin rpida (quicksort) :

    Algoritmo desarrollado por Charles Hoare propuesto en 1962. Este es el mtodo de ordenamiento, que trae a mi mente viejos recuerdos, pues gracias a una exposicin magistral de este mtodo, me gane un cinco que necesita para pasar el curso de algoritmos en la U donde estudiaba, por el ao de 1989 (hace rato.). Bueno dejemos los sentimentalismos con los algoritmos y al grano, es un mtodo de ordenamiento, muy eficiente, a pesar de que han salido variaciones del mismo. El algoritmo consiste en: Proceso interativo. Para cada paso, se escoge un elemento "a" de alguna posicin especfica 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 ultimo elemento del arreglo. En la comparacin, si el elemento "a" toma la ultima posicin y el ltimo elemento toma la posicin 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 penltimo 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 comparacin de "a" se hace con los elementos del arreglo que se encuentran en posicin 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.

    Vemos grficamente tomado el siguiente vector 43 2 90 52 87 100 -10 68 13 7 21 45

  • 57

    Las variables izq (izquierda) y der (derecha), una variable para controlar el punto pvot (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 -10 68 13 7 21 45 50 0 43

    En este caso la posicin ms a la izquierda es 0, la ms a la derecha es 12, se escoge como "pivote" el primer trmino de la lista, es decir la posicin ms a la izquierda, tal como est escrito en la tabla anterior.

    Se procede a comparar el pivote, 43, con el valor ms a la derecha, posicin 12 cuyo valor es 50. Se verifica que 43 y 50 estn 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 -10 68 13 7 21 45 50 0 43

    Se compara ahora el pivote 43, en posicin cero, con el nmero en posicin der=11, es decir 45, nuevamente estn 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 -10 68 13 7 21 45 50 0 43

    Se compara ahora 43 con 21 de la posicin der=10, no estn 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

    21

    2 90 50 87 100 -10 68 13 7 21 45 50 0 10

    21

    2 90 50 87 100 -10 68 13 7 43 45 50

    0 10

    43

  • 58

    Se actualiza la posicin del pivote, ahora est en 10, y se comienza a comparar desde la izquierda, como lo seala la flecha en la tabla anterior. As se compara 43 con 21, los cuales estn 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 -10 68 13 7 43 45 50 10 43

    Por esto se incrementa izquierda y se compara el 43 con el 2, igualmente estn en orden ascendente relativo; se incrementa izquierda nuevamente llegando a donde est el nmero 90 en la posicin 2 del vector:

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    2 10 21 2 90 50 87 100 -10 68 13 7 43 45 50 10 43

    El 90 al compararlo con el pivote 43 es mayor, por esto debern ser intercambiados, y actualizada la posicin del pivote:

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 90 50 87 100 -10 68 13 7 90 45 50 0 10

    21

    2 43 50 87 100 -10 68 13 7 90 45 50

    10

    2

    43

    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 9 21 2 43 50 87 100 -10 68 13 7 90 45 50 2 43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 50 87 100 -10 68 13 7 90 45 50 2 9

    21

    2 7 50 87 100 -10 68 13 43 90 45 50

    2

    9

    43

  • 59

    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 -10 68 13 43 90 45 50 9 43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 50 87 100 -10 68 13 50 90 45 50 3 9

    21

    2 7 43 87 100 -10 68 13 50 90 45 50

    9

    3

    43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    3 8 21 2 7 43 87 100 -10 68 13 50 90 45 50 3 43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 13 87 100 -10 68 13 50 90 45 50 3 8

    21

    2 7 13 87 100 -10 68 43 50 90 45 50

    3

    8

    43

    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 -10 68 43 50 90 45 50 8 43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 13 87 100 -10 68 87 50 90 45 50 4 8

    21

    2 7 13 43 100 -10 68 87 50 90 45 50

    8

    4

    43

    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 -10 68 87 50 90 45 50 4 43

    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 -10 68 87 50 90 45 50 4 43

  • 60

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 13 -10 100 -10 68 87 50 90 45 50 4 6

    21

    2 7 13 -10 100 43 68 87 50 90 45 50

    4

    6

    43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    5 6 21 2 7 13 -10 100 43 68 87 50 90 45 50 6 43

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    21

    2 7 13 -10 100 100 68 87 50 90 45 50 5 6

    21

    2 7 13 -10 43 100 68 87 50 90 45 50

    6

    5

    43

    Al avanzar desde la derecha hacia la izquierda, la variable der se encuentra con la posicin donde est el pivote, e izq ya estaba en el mismo valor, es decir las tres variables "se encuentran en el mismo sitio", as:

    Izq

    der 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    PosPiv Pivote

    5 5 21 2 7 13 -10 43 100 68 87 50 90 45 50 5 43

    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 posicin 0 a la 4, con todos sus elementos menores; y una sublista a la derecha, desde la posicin 6 hasta la 12, en desorden y con todos mayores que el pivote. A partir de este punto se procede con el mismo procedimiento sequido para la lista completa, en cada una de las sublistas y por separado

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

    #include #include #include

  • 61

    // 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);

    void main(void) { int n; // numero de elementos del vector int i; // Contador int arreglo[100]; // Arreglo de enteros

    clrscr(); coutn;

    for (i=0;i

  • 62

    if (izquierda < derecha) { pivote = arreglo[derecha]; mayor = izquierda-1; menor = derecha; while (mayor = izquierda) { menor--; if (arreglo[menor]

  • 63

    Ejercicios de verificacin

    1: Recopilacin de preguntas de seleccin mltiple con nica respuesta

    A. Propsito principal de un ordenamiento es

    a. Facilitar las bsquedass de los miembros de un conjunto ordenado b. Buscar los elementos de un conjunto c. Ordenar en base a su valor

    B. Cuando es conveniente usar los ordenamientos

    a. Cuando se requiere hacer una cantidad considerable de bsquedas 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 dems

    a. Algoritmo de enumeracin b. Algoritmo de insercin 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 inserccin

    E. Compara cada elemento del arreglo con el siguiente, si el elemento es mayor que el se sigue, entonces surge un intercambio.

    a. Mtodo de Burbuja b. Mtodo de Quicksort c. Mtodo de Shell

    F. Este tipo de algoritmos se selecciona o se busca el elemento ms pequeo o ms grande de todo el conjunto de elementos y se coloca en la posicin adecuada

    a. Algoritmo de Shell b. Algoritmo de seleccin c. Algoritmo de seleccin directa

  • 64

    G. Este ordenamiento lleva elnombre de su inventor

    a. Ordenamiento Quicksort b. Ordenamiento de Burbuja c. Ordenamiento de Shell

    2) deduzca, indague, consulte, cuales son las ventajas y/o desventajas de los mtodos de bsqueda y ordenamiento aqu expuestos

    3) Realice un programa que permita introducir en un arreglo de n elementos valores de tipo entero y a travs de un men, realizar las siguientes funciones:

    1. Ingreso de datos 2. Bsqueda 3. Ordenamiento 4. Estadstica 5. Salir

    En cada uno de los mens se incluir, un segundo submen, por ejemplo el item nmero

    3 Ordenamiento pude incluir los metodos de Por burbuja Por insercin

    ..

    Y as sucesivamente, en el men estadista, se debe presentar un informe de la cantidad de iteraciones que cumple una opcin de las anteriores.

  • 65

    0 1 2 3 4 5

    Fila

    0 1 2 3 4 5

    columna

    Celda (3,5)

    3.3 Matrices o arreglos bidimensionales:

    Por que mostrar una imagen de una hoja de calculo (Excel), como inicio de este apartado, es simple es el ejemplo tpico de una matriz, como se observa esta dividido en filas y columnas, y cada posicin se lo conoce como celda, de igual manera se comporta una matriz en c++, solo que las columnas no estn identificadas con letras sino con nmeros al igual que las filas.

    Entonces podemos decir que las matrices es una coleccin de localidades asociadas a un nombre, slo que los datos se organizan en dos dimensiones.

    Por ello, para hacer referencia a una localidad del arreglo se necesitan de dos nmeros:

    El nmero de la fila . El nmero de columna.

    Por consiguiente la lectura de la posicin de la matriz se hace fila columna, de acuerdo al siguiente grafico.

    0 1

    2

    3

    0 1 2 3 A[0][0] A[0][1] A[0][2] A[0][3] A[1][0] A[1][1] A[1][2] A[1][3] A[2][0] A[2][1] A[2][2] A[2][3] A[3][0] A[3][1] A[3][2] A[3][3]

    El primer ndice siempre indica las filas

    El segundo ndice siempre indica las columnas

  • 66

    Realicemos un ejemplo, para entender mejor :

    Se lee un arreglo bidimensional por teclado y luego se muestra en pantalla adecuadamente.

    #include #include #include

    const int MaxFilas=5; const int MaxColumnas=4;

    void main(){ int fila, columna, MATRIZ[MaxFilas][MaxColumnas];

    clrscr(); for ( fila = 0; fila < MaxFilas; fila++) for ( columna = 0; columna < MaxColumnas; columna++) { cout

  • 67

    #include #include #include #include

    const int MaxM=10; const int MaxN=8;

    void main(){ int i, M, j, N; float A[MaxM][MaxN], B[MaxN][MaxM];

    clrscr(); do{ cout

  • 68

    Es importante que usted realice la prueba de escritorio para este ejemplo antes de codificarlo, para conceptualizar cada una de las partes del mismo

    Ejercicios de verificacin

    1. Realizar un programa que almacene nmeros en una matriz de 5 * 6. Imprimir la suma de cada una de las filas de la matriz.

    2. Hacer un programa que llene una matriz de 10 * 10 y determine la posicin [rengln, columna] del nmero mayor almacenado en la matriz.

    3. Implementar un programa que llene una matriz de 7 * 7. Calcular la suma de cada fila y almacenarla en un vector, la suma de cada columna y almacenarla en otro vector.

    4. Elaborar un programa que llene una matriz de 20 * 20. Sumar las columnas e imprimir que columna tuvo la mxima suma y la suma de esa columna.

    5. Originar un programa que llene una matriz de 5 * 5 y que almacene la diagonal principal en un vector. Imprimir el vector resultante.

    6. Producir un programa que llene una matriz de 10 * 10 y que almacene en la diagonal principal unos y en las dems posiciones ceros.

    7. se desea hacer un programa que llene una matriz de 6 * 8 y que almacene toda la matriz en un vector. Imprimir el vector resultante.

    8. Hacer un algoritmo y programa que llene una matriz de 8 * 8, que almacene la suma de las filas y la suma de las columnas en un vector. Imprimir el vector resultante.

    9. Hacer un algoritmo y programa que llene una matriz de 5 * 6 y que imprima cuantos de los nmeros almacenados son ceros, cuantos son positivos y cuantos son negativos.

    10. Disee un programa que escriba el nmero de la hilera cuya suma sea mayor que las dems hileras. Suponga que todas las hileras suman diferente cantidad.

    11. El dueo de una cadena de tiendas de artculos deportivos desea controlar sus ventas por medio de una computadora. Los datos de entrada son:

    a) El numero de la tienda (1 a 50) b) Un numero que indica el deporte del articulo (1 a 20) c) El costo del artculo.

    Al final del da el programa imprime lo siguiente: 1. Las ventas totales en el da para cada tienda 2. Las ventas totales para cada uno de los deportes. 3. Las ventas totales de todas las tiendas.

  • 69

    12. Se tiene almacenada la matriz M (50,5) la cul contiene la informacin sobre las calificaciones de la materia de introduccin a la programacin. Disee un programa que imprima: a) Cantidad de alumnos que aprobaron la materia. b) Cantidad de alumnos que tienen derecho a nivelacin. c) El (o los) numero (s) de control de lo(s) alumno(s) que haya (n) obtenido la mxima calificacin final.

    14 realizar la multiplicacin de dos matrices (tenga en cuenta las reglas para la multiplicacin de matrices)

    13 existe un ejercicio que me gusta mucho, es el problema de los movimientos de posibles que tiene un caballo en un tablero de ajedrez, recordemos que los caballos en este juego hace movimientos en forma de L, la idea del ejercicio es que a partir de una posicin dada el caballo pueda desplazarse lo ms lejos posible, de ah en adelante usted podr realizar mucha variaciones al ejercicio

  • 70

    3.0 UNIDAD NMERO 3

    3.1 ESTRUCTURAS Y ARCHIVOS

    Hasta el momento solo hemos trabajado con datos de un unc tipo o ilimitados en tamao, afortunadamente los lenguajes de programacin y C++ para se preciso dejan al usuario construir o combinar diversidad de datos para conformar estructuras complejas de informacin, esto ser la primera parte, pero la segunda es la ms importante, si ustedes se han dado cuenta hasta el momento solo hemos trabajado a nivel de memoria, es decir todo funciona si el programa se esta ejecutando, pero en el momento que deja de ejecutarse, se pierde toda la informacin en el almacenada, la solucin llega con la construccin de estructuras que se puedan almacenar y acceder en forma de archivos.

    1.2 intencionalidades formativas:

    Determinar los mecanismos que se utilizan para combinar diferentes tipos de datos

    Propsitos de la unidad

    Manipular diversidad de datos en forma simultanea Grabar datos en unidades de almacenamiento fsicas

    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 es que se escriben datos en medios fiscos

    Metas de aprendizaje

    Realizar programas que presten un verdadero servicio, cuando se trate de guardar infamacin

    UNIDADES DIDCTICAS:

    Palabras claves:

    Archivos Ficheros Estructuras

    3.1.1 Estructuras:

  • 71

    Las estructuras estn compuestas como ya dijimos por una serie de componentes individuales llamados miembros, para hacerlo ms grafico podemos decir que queremos ingresar datos de una persona como su nombre, apellido, direccin, salario, edad cada miembro de la estructura es de dato diferente, una estructura no tiene restricciones para contener un nmero determinado de miembros, e inclusive podemos realizar estructuras que contengan otras estructuras.. Veamos un ejemplo: Se desea llevar los datos de una coleccin de pelculas, para ello tenemos: Titulo, Protagonista Genero Precio Fecha de compra

    Para este ejemplo encontramos cinco miembros, ahora debemos deducir que tipo de datos contiene cada uno de ellos.

    Miembro Tipo Titulo Vector de 30 caracteres titulo [30] Protagonista Vector de 30 caracteres prota [30] Genero Vector de 10 caracteres genero [10] Precio float Fecha de compra Vector de 10 caracteres fecha [10]

    Si tenemos datos quedara as

    Miembro Dato Titulo Corto circuito Protagonista Alambrito Genero Accin Precio 25.580 Fecha de compra 01/01/05

    Bien pero como se declara en un programa,

    Sencillo

    Struct pelcula { char titulo[30]; char prota[30]; char genero[10]; float precio; char fecha[10]; } Nombre; // variable que refiere a la estructura

  • 72

    Lo mejor es hacerlo con la codificacin real de un ejercicio, supongamos que deseamos llevar los datos de bsicos de un empleado

    #include

    void main(){ const int Max=20;

    struct registro { char nombre[Max]; int edad; float salario; } empleado;

    cout > empleado.nombre; cout > empleado.edad; cout > empleado.salario;

    cout

  • 73

    int num_reg = 0, i;

    cout

  • 74

    Pero bien lo que hemos realizado hasta el momento es agrupar diversos datos, pero igual, cuando se termina de ejecutar el programa, los datos se han perdido, la forma de solucionar este problema es mediante la utilizacin de archivos

    3.2.1 Archivos o ficheros:

    Es el mecanismo que nos proporcionan los lenguajes de programacin, para almacenar gran cantidad de datos en medios fsicos, (disco duro, disquetes, cd rom), antes de iniciar con la construccin de algoritmos o programas es importante manejar algunos conceptos bsicos referentes a este tema, entre ellos estn:

    DATO: Unidad lgica de informacin que se suministra a la computadora, para el funcionamiento de un sistema de informacin.

    INFORMACIN: Conjunto de datos o noticias de un tema especfico. SISTEMA: Conjunto de elementos independientes, conjunto de axiomas y reglas que determinan un perfecto desarrollo de sus funciones.

    Programa que formando parte de un Sistema Operativo permite el manejo de archivos de una manera transparente, es decir sin tener en cuenta el tipo de unidad en las que este se encuentre.

    REGISTRO: Est compuesto de campos y estos campos contienen los atributos de una Entidad.

    ENTIDAD: Todo aquello de lo cual podemos obtener informacin, la informacin obtenida de una entidad son los atributos. Esto puede ser de forma tangible o intangible. La informacin obtenida de una entidad son los atributos.

    ATRIBUTOS: Medida, peso, color, etc. (caractersticas). CAMPO: Zona de informacin definida en una memoria.

    La descripcin de los datos y las de las relaciones que entre ellas hay, adopta una de las dos formas, lgica y fsica.

    DATO FSICO: La descripcin fsica de los datos se ocupan de como se los registro el Hardware.

    DATO LGICO: La descripcin lgica, en cambio se refiere a la forma con que los datos se presentan al programador de aplicaciones al usuario final.

  • 75

    Clasificacin de los archivos

    En base a su funcin, existen 6 tipos bsicos de archivos clasificados por la funcin que desempean en un sistema de informacin

    ARCHIVO MAESTRO.

    ARCHIVO DE TRANSACCIONES.

    ARCHIVO DE REPORTE.

    ARCHIVO DE TRABAJO.

    ARCHIVO DE PROGRAMA.

    ARCHIVO DE TEXTO.

    ARCHIVO MAESTRO: Representa una visin esttica de algn aspecto de los negocios de una organizacin en un momento dado. Un Registro en un archivo maestro registra el estado de alguno de sus componentes. Ejemplo: los pagos efectuados a un empleado Un archivo maestro contiene datos relativamente permanentes o datos de estados histricos. Los cambios que han de ser aplicados al archivo maestro, son recolectados en un archivo de transacciones.

    ARCHIVO DE TRANSACIONES: Puede contener datos para agregar un nuevo registro o para borrar, modificar un registro maestro. Cada registro en un archivo de transacciones representa un vento a un cambio de alguna cosa, esto sucede permanentemente, en las aplicaciones comunes, por ejemplo modificaciones en un editor de texto o en una hoja de clculo

    ARCHIVO DE REPORTE: Contiene datos que son formateados para su representacin al usuario; ejemplo: Archivo de reporte de una nomina ARCHIVO DE TRABAJO: Es un archivo temporal en el sistema, no tiene las caractersticas de E/S de un archivo de transacciones de reporte; ejemplo: Archivo de trabajo para el ordenamiento de empleados. El archivo de trabajo se usa comnmente para pasar datos creados por un programa a otro programa.

    ARCHIVO DE PROGRAMA: Contiene instrucciones para procesar datos, las cuales pueden almacenarse en otros archivos o recibir en la memoria principal.

  • 76

    Ejemplo: El cdigo de un lenguaje: de alto nivel (lenguaje c, c++, etc), lenguaje ensamblador, lenguaje mquina.

    ARCHIVO TEXTO: Contiene datos alfanumricos y grficos ingresados a travs de un editor de texto. Block de notas

    En general C++ proporciona la manipulacin de tantos tipos de archivos como tipos de datos existen,

    El paquete Standard de input/output de "C" y por ende de C++, hace disponible 4 mtodos o maneras diferentes de leer y escribir los datos a disco.

    1.- Datos a ser grabados o ledos como un carcter a la vez, se utilizaran funciones anlogas a getchar y putchar.

    2.- Datos que pueden ser ledos o grabados como una string se usaran funciones analogas a gets y puts.

    3.- Datos que se capturen o desplieguen con formatos parecidos a los usados por scanf y printf se usaran funciones similares, es decir sern problemas que involucran mezclas de strings, caracteres, floats, etc.

    4.- Tambin se podrn leer y escribir datos de tipo arreglo y registros utilizando instrucciones apropiadas, en resumen:

    carcter string Formateado Registros y arreglos

    Leer getc() fgets() fscanf() fread() Escribir putc() fputs() fprintf() fwrite()

    Almacenamiento en archivos

    En este curso trabajaremos dos mtodos de almacenamiento: Modo Texto: en este caso los datos son almacenados usando Ascii y por tanto son plenamente visibles usando cualquier editor.

    Modo Binario: en este caso los datos son almacenados en notacin hexadecimal y por tanto se ocupa un editor binario para reconocerlos, sin embargo un archivo binario es mas compacto que un archivo texto.

  • 77

    3.2.1.1Operaciones con Archivos

    Existen muchas operaciones asociadas a archivos en c++, las ms elementales son:

    1.- Creacin de Archivo.- En este proceso se pretende solamente crear un archivo nuevo en disco con su nombre, tipo y especialidad de almacenamiento de datos apropiado. archdisco = fopen("c:\\ac\\alumnos.dat","w"); 2.- Apertura de Archivos.- En este caso se pretende abrir un archivo ya existente en disco para procesarlo ya sea para cargar, grabar o modificar estructuras en sus registros o leer algn registro en especial para ser manipulado de acuerdo a la necesidad del usuario

    Observacin: No confundir creacin con apertura, creacin es un proceso que solo se ejecuta una sola vez en la vida de un archivo, si se ejecuta ms de una vez los datos del archivo se pierden, mientras que apertura, siempre se esta realizando por los programas especializados en algn proceso.

    3.-Cierre de archivos: Es la operacin ms importante en cualquier programa que maneje archivos, de no cerrar los archivos existe mucha probabilidad que se pierdan los datos.

    4.-Altas en archivo.- En este proceso se captura una estructura en memoria con sus datos pertinentes y despus se graba la estructura al archivo en disco.

    5.-Lectura de archivo.- En este proceso se abre el archivo, se manda el registro de disco a una estructura en memoria para su procesamiento.

    6.- Consulta de archivos: En este proceso se pretende desplegar todos los registros del archivo en disco a la pantalla. o a otro dispositivo como la impresora

    7.-Bsqueda en archivos: Una de las operaciones ms comunes consiste en que el usuario pide toda la informacin de algn registro,.

    8.- Filtros.- En este proceso el usuario esta interesado en algn conjunto de registros con caractersticas comunes (condicin), por ejemplo todos los alumnos de "introduccin a la programacin" que tengan notas promedio superiores a 4.5 o todos los empleados que ganen mas de $5500.00 pesos,

    9.-Modificaciones de registros o archivos: Problema muy comn, donde los datos originales ya grabados se tienen que cambiar o actualizar, por ejemplo el nombre no era "Pedro" sino "Jos", o la calificacin no es 3.5 si no 2.0, ..

  • 78

    10.- Bajas de registros: tambin muy comn este proceso, por ejemplo el alumno deserto, el cliente se fue del pas

    3.2.1.2 Archivos tipo texto

    Trabajemos un ejemplo para determinar como se realiza la creacin fsica de un archivo tipo texto:

    #include #include #include #include struct { int matricula; char nombre[30]; int edad;}alumno; void main() { clrscr(); //creando y cerrando el archivo en disco FILE *archivo; archivo = fopen("c:\\ac\\alumnos.dat","w"); fclose(archivo); cout

  • 79

    En "C++" una variable apuntador se declara anteponiendo un asterisco antes del nombre, como ya lo vimos en el apartado de apuntadores (recuerdan) En el programa se est creando una variable apuntador bautizada con el nombre de archivo (original no) que almacenara la direccin fsica de el archivo en disco,

    Como segundo paso se abre el archivo con la instruccin fopen(): archivo = fopen("c:\\a1212c\\alumnos.dat","w"); Observar que el path es la direccin fsica en el disco del computador .

    Observar el doble diagonal (\\) en el parmetro. La funcin fopen() cuando realiza el trabajo de abrir un archivo, regresa la direccin fsica donde crea o graba el archivo en disco.

    El primer parmetro o argumento en esta funcin es la unidad de disco y el nombre del archivo.

    El segundo