Apuntes_Practica_4_07_08.pdf

Embed Size (px)

Citation preview

  • Introduccin a los Computadores

    Prctica n 4

    Pg 1

    Introduccin. Un tipo de datos estructurado es un tipo de datos formado por una coleccin organizada de componentes de algn otro tipo de datos. Podremos hacer referencia tanto a la coleccin de elementos completa como a cada uno de sus componentes de forma individual. El array es un tipo de datos estructurado formado por un nmero fijo de elementos del mismo tipo. Se caracteriza porque se puede acceder de manera directa a sus elementos. El tipo de los elementos del array se conoce como tipo base y la cantidad de elementos como dimensin. Declaracin de variables de array. Una variable array se declara de forma similar a otras variables, excepto que se debe indicar el tamao o longitud del array (dimensin).

    tipo nombre_array [dimensin]; Donde tipo es el tipo base del array, y dimensin es un nmero entero positivo mayor que cero que indica la cantidad de elementos del array (equivalente a la cardinalidad del tipo ndice del array). Ejemplos: int vector [10]; // Array de 10 enteros char frase [80]; // Array de 80 caracteres bool flags [5], logicos [10]; // Array de 5 lgicos y otro de 10 lgicos Una variable de array se puede ver como un conjunto de variables del mismo tipo (tipo base del array) a las que denominamos con un nombre comn. Algunas caractersticas importantes de los arrays son: Los elementos del array se almacenan consecutivamente en memoria. El nombre del array especifica la direccin en memoria del primer elemento del mismo. El nombre del array es una direccin constante, es decir no puede modificarse su valor. Como tipo estructurado, no esta permitida la lectura y escritura directa sobre dispositivos de E/S

    estndares. Este tipo de operaciones debe realizarse elemento a elemento. Todas las operaciones disponibles para el tipo base de un array, pueden usarse sobre los componentes

    individuales del mismo. Acceso a componentes de un array (operador selector). Se puede acceder a cada componente de una variable de array usando su nombre seguido de lo que denominamos ndice entre corchetes. El ndice de un elemento de un array es un valor entero positivo que indica el orden o posicin del elemento dentro del array.

    nombre_array [ndice] Los ndices comienzan siempre por 0, es decir el primer elemento de un array tiene ndice 0. De modo que si el array a tiene n elementos, sus nombres son a[0], a[1], ., a[n-1]. Ejemplos: const int MAXA = 10;

    char a [MAXA]; // Array de 10 caracteres int i;

  • Introduccin a los Computadores Prctica 4

    i = 7; a [7] = 'c'; if (a [i] < 'Z')

    ... El ndice es calculable, es decir, como ndice para seleccionar un elemento de un array podemos usar una expresin, el valor resultante de la evaluacin de la misma se utilizar entonces como ndice para seleccionar un elemento concreto.

    Importante: C++ no avisa de indexaciones del array fuera del rango.

    Inicializacin de variables array. Al igual que con cualquier otra variable, es necesario asignar valores a los componentes de un array antes de utilizarlos. Esto puede realizarse usando sentencias de asignacin individuales sobre los componentes o usando el operador de inicializacin. La inicializacin de un array se puede realizar en la misma sentencia en la que se declara: tipo_base nombre_array [dimensin] = {elemento_1, elemento_2, ..., elemento_N};

    Ejemplo: int a [3] = {10, 20, 30}; Es equivalente a: int a [3]; a [0] = 10;

    a [1] = 20; a [2] = 30;

    Constantes de array. C++ permite la existencia de constantes de array. Para definir un array constante, se declara como si se tratara de una variable de array pero usando el modificador const y se aade a continuacin el operador de inicializacin para darle valor.

    const tipo_base nombre_array [dimensin] = {valor_1, valor_2, ... , valor_N}; Ejemplo: const char nombre [5] = {'L','u','c','a','s'}; Definicin de tipos (la sentencia typedef) C++ permite asignar un nombre alternativo a cualquier tipo de datos mediante la sentencia typedef. Sintaxis:

    typedef tipo identificador; Ejemplo: Declarar objetos de tipo TContador: typedef int TContador; const Tcontador K = 1000; Tcontador i, j; El objetivo fundamental de esta sentencia es mejorar la claridad del cdigo fuente asociando nombres simblicos a tipos de datos definidos por el programador.

    Pg 2

  • Introduccin a los Computadores Prctica 4 typedef char [80] Tlinea80; Tlinea80 linetxt, msg_error; Tambin se puede utilizar como un mecanismo para definir un nuevo nombre de tipo: 1. Escribir la sentencia como si una variable del tipo deseado se estuviera declarando. 2. En el lugar donde aparece el nombre de la variable declarada, poner el nuevo nombre de tipo. 3. Delante de todo esto colocar la palabra typedef. Asignacin e igualdad de arrays C++ no permite la asignacin o comparacin de dos arrays completos. Ejemplo: const int MAXVECTOR = 3;

    typedef int Tarray [MAXVECTOR]; TArray u, v;

    ... u = v; // Produce un error de compilacin

    Aunque el tipo de los arrays u y v es el mismo, el compilador detectar un error. La razn es que C++ intenta realmente asignar la direccin base del array v al array u, y al ser esta constante, se produce el error (Recurdese que el nombre de un array representa la direccin base del mismo en la memoria, y que sta es constante, no puede modificarse) De igual manera ocurre en las comparaciones, ya que lo que realmente compara C++ son las direcciones base de los arrays y no su contenido. Por ello, para realizar estas operaciones ser necesario desarrollar los correspondientes subprogramas. Funciones y arrays Un array se puede pasar como argumento de una funcin, aunque lo que se pasa realmente es una referencia al primer elemento del array (la direccin base del array). CUIDADO: En C++ los parmetros de arrays siempre se pasan por referencia, aunque no se indique as en la definicin de la funcin. Ejemplo: const int MAXVECTOR = 3;

    typedef int Tvector [MAXVECTOR]; void cambiar (Tvector x) {

    x [0] = 10; // Modifica parmetro formal. } int main () {

    Tvector v = {1, 2, 3}; cambiar (v); // El componente v[0] vale ahora 10.

    }

    El resultado devuelto por una funcin NO puede ser un array, por tanto es errneo declarar funciones que devuelvan tipos array. Para devolver un array desde una funcin ser necesario utilizar un parmetro pasado por referencia.

    Pg 3

  • Introduccin a los Computadores Prctica 4 El operador sizeof. El operador sizeof devuelve el nmero de bytes necesarios para contener una variable del tipo indicado por su argumento.

    sizeof (NombreTipo) Si se usa el operador sizeof sobre un tipo array, devolver el nmero de bytes necesarios para almacenar el array completo. De esta forma, conociendo el tipo base de un array podemos calcular su dimensin mediante el cociente sizeof (TipoArray) / sizeof (TipoBase). EJEMPLO: El siguiente programa realiza el cambio de base 10 a base 16 de un nmero natural introducido por teclado. /*---------------------------------------------------------------- | Autor: | | Fecha: Versin: 1.0 | |-----------------------------------------------------------------| | Descripcin del Programa: convhexa.cpp | | | | Arrays, enteros, caracteres y bucles. | | | | Este programa realiza el cambio de base 10 a base 16 de un | | nmero natural. | | ----------------------------------------------------------------*/ // Incluir E/S y Libreras Standard #include #include using namespace std; // Zona de Declaracin de Constantes const int MAX_DIGITOS = 16; // Los 16 digitos hexadecimales const int MAX_CIFRAS = 20; // Numeros de hasta 20 cifras hexadecimales // Zona de Declaracin de Tipos typedef char Tdigitos [MAX_DIGITOS]; typedef int Tnumero [MAX_CIFRAS]; // Zona de Cabeceras de Procedimientos y Funciones // Programa Principal int main() { // Zona de Declaracin de Variables del Programa principal const Tdigitos t1 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',

    'A', 'B', 'C', 'D', 'E', 'F'}; Tnumero t2; unsigned int r, num; // Zona de instrucciones cout

  • Introduccin a los Computadores Prctica 4 r ++; } cout 0) // Saca el resultado { r --; cout
  • Introduccin a los Computadores Prctica 4 Hay que tener en cuenta que en la implementacin con arrays de caracteres, C++ aade automticamente el carcter NULO al final del literal, por lo que el espacio de almacenamiento necesario para el literal ser un carcter ms que su longitud, incluyendo el caso de la cadena vaca. As por ejemplo: "Lucas" se almacenara como 'L','u','c','a','s','\0' (6 caracteres)

    "" se almacenara como '\0' (1 carcter) Variables y constantes de cadenas de caracteres. La definicin de variables de cadena de caracteres como arrays de caracteres sigue las mismas reglas que para definir cualquier otra variable de array. Aunque con una peculiaridad, ya que C++ permite asignar a una variable de array de caracteres un literal de forma directa. Esto puede realizarse usando sentencias de asignacin en el cdigo o bien usando el operador de inicializacin en la sentencia de declaracin de la variable de cadena.

    TCadena nombre_cadena [= ]; Ejemplos:

    typedef char TCadena [80]; TCadena frase1 = "hola"; // Declaracin de array con inicializacin TCadena frase2; // Declaracin de array sin inicializar TCadena mitexto = ""; // Inicializa a cadena vaca

    ... int main () { ... frase2 = "adios"; // Asigna valor de literal al array frase2 ... La sentencia TCadena frase1 = "hola"; es equivalente a las siguientes asignaciones individuales de los caracteres del array frase1: frase1 [0] = 'h'; frase1 [1] = 'o'; frase1 [2] = 'l'; frase1 [3] = 'a'; frase1 [4] = '\0'; La sentencia TCadena mitexto = ""; es equivalente a las siguientes asignaciones individuales de los caracteres del array mitexto: mitexto [0] = '\0'; Por ltimo, la sentencia frase2 = "adios"; es equivalente a las siguientes asignaciones individuales de los caracteres del array frase2: frase2 [0] = 'a'; frase2 [1] = 'd'; frase2 [2] = 'i'; frase2 [3] = 'o'; frase2 [4] = 's'; frase2 [5] = '\0'; El resto de los elementos de los arrays anteriores quedarn sin inicializar, aunque a efectos prcticos esto tiene poca importancia, ya que el valor de la cadena almacenada en el array finaliza con el carcter terminador, no tenindose en cuenta para nada el resto de caracteres del array.

    Pg 6

  • Introduccin a los Computadores Prctica 4 Para definir un array de caracteres constante, se declara igual que un array constante, usando el modificador const y se aade a continuacin el operador de inicializacin para darle valor. El valor en este caso puede expresarse tambin mediante un literal.

    const TCadena nombre_cadena = ; Ejemplo: const TCadena nombre = "Lucas"; es equivalente a : const TCadena nombre = {'L','u','c','a','s','\0'}; Operaciones con cadenas de caracteres. Asignacin y comparacin de cadenas de caracteres. Como se ha visto anteriormente C++ permite la asignacin de literales a variables de cadena de caracteres, sin embargo, no es posible la asignacin o comparacin de dos variables de cadena o entre variables y constantes, ya que rigen las mismas limitaciones que para los arrays. Por ello, para realizar estas operaciones ser necesario desarrollar los correspondientes subprogramas. Sin embargo, C++ incorpora una librera que incluye diversas operaciones sobre arrays de caracteres, entre las que se encuentran la asignacin o copia y la comparacin. Se ver ms adelante. Entrada y salida. C++, al igual que la mayora de los lenguajes de programacin tienen operadores que permiten la entrada/salida de cadenas de caracteres por pantalla/teclado de forma directa. La salida de cadenas de caracteres en C++ se realiza de la misma forma que si fuera un tipo predefinido, es decir, usando el flujo cout (cout

  • Introduccin a los Computadores Prctica 4

    void LeeCadena (TCadena &s) // LeeCadena es un procedimiento debido a que las funciones C++ no // pueden devolver arrays {

    int i; char c;

    i = 0; c = cin.get (); // Lectura adelantada while (( i < MAXCAD ) && ( c != INTRO )) {

    s [i] = c; i ++; c = cin.get4(); // cin.get lee 1 carcter sin saltarse los // de control

    } s [i] = '\0'; // Inserta el NULO terminador

    } La otra opcin, que adems es la ms adecuada, es el uso de la funcin getline sobre el objeto cin, la cual permite leer una cadena de caracteres hasta un nmero mximo de caracteres o un separador que se le indique. Dicha funcin getline tiene tres parmetros: la cadena de caracteres, el nmero mximo de caracteres a leer por teclado (que ser el tamao del array donde se guarda la cadena menos uno, para dejar cabida al terminador) y opcionalmente el valor de un carcter separador, que en caso de indicarse, detendr la lectura al detectar en la entrada dicho carcter. Si no se indica este ltimo parmetro, se recogern todos los caracteres de la entrada hasta llegar al final de lnea (carcter INTRO o de fin de lnea).

    cin.getline (TCadena &cadena, int max_caracteres [, char separador]) Donde el ltimo parmetro (separador) es opcional. La funcin getline se encarga de colocar la cadena correctamente en el array, incluyendo el carcter terminador al final. Esta funcin ser la que utilicemos normalmente para leer cadenas de caracteres, ya que, aunque debemos pasarle como parmetros tanto el nmero mximo de caracteres como opcionalmente el separador de cadenas, la llamada cin.getline (s, MAXCAD, INTRO), o simplemente cin.getline (s, MAXCAD), tiene exactamente el mismo funcionamiento que la funcin LEER (s) definida para el pseudolenguaje. Ejemplo:

    ...int main()

    { TCadena miCadena; ... cout

  • Introduccin a los Computadores Prctica 4 Asignacin (copia) de cadenas.

    strcpy (TCadena &s1, const TCadena s2); Copia el contenido de la cadena s2 sobre la variable de cadena s1. Ejemplo:

    ... TCadena s1, s2; s2 = "ejemplo"; strcpy (s1, s2); // Pone en s1 el texto "ejemplo" cout

  • Introduccin a los Computadores Prctica 4

    unsigned int strlen (const TCadena s) Devuelve la longitud de la cadena contenida en s. Ejemplo:

    ... typedef char TCadena [80]; TCadena s1 = "Pedro Picapiedra"; TCadena s2 = "Pablo Marmol"; TCadena s3 = ""; cout