Programación de Computadores 8 Arreglos Prof. Javier Cañas R. Universidad Técnica Federico Santa María Departamento de Informática Contenido 1 Introducción 2 Arreglos Simples 3 Matrices 4 Arreglos y Funciones 5 Estructuras Complejas 6 Strings Javier Cañas 2000 2 1 1 Introducción •Los arreglos son datos estructurados. A diferencia de las estructuras (struct) sus elementos son todos del mismo tipo •Son las estructuras de datos más utilizadas •Permiten agrupar items del mismo tipo •Modelan vectores, matrices, strings,... Javier Cañas 2000 3 2 Arreglos Simples • Un arreglo agrupa items de datos del mismo tipo, por ejemplo: enteros, flotantes, etc... • Por ejemplo, queremos registrar 4 edades de 4 personas en una misma estructura. En este caso le ponemos como nombre edad y definimos su tamaño como 4 Javier Cañas 2000 4 2 Ejemplo de Arreglos int edad[4]; // definición ........ for ( int j= 0 ; j< 4; j++) {cout<< “Ingrese edad:” cin >> edad[ j ]; } .................... int x= edad[2]; // asignamos a x la // edad del elemento 2 Javier Cañas 2000 5 Estructura de un arreglo a[10] 0 1 El primer elemento tiene índice cero . . . 9 Javier Cañas 2000 6 3 Inicialización • Al igual que los tipos simples y las estructuras, los arreglos se pueden inicializar • Por ejemplo, se define e inicializa el arreglo llamado datos int datos[8]= {3,0,15,4,-3,11,7, 100}; Javier Cañas 2000 7 Ejercicio • Confeccionar un programa en C++ que permita calcular los días transcurridos desde una fecha hasta la fecha actual • Ejemplo de la interacción: – Ingresar mes ( 1 a 12): 3 – Ingresar día ( 1 a 31) : 11 – Total días transcurridos del año: 70 Javier Cañas 2000 8 4 Observación • Al inicializar arreglos se pueden omitir el tamaño int dias_mes[] = { 31, 28, 31, 30,31,30,31,31,30,31,30,31 }; Javier Cañas 2000 9 3 Matrices • Cuando los elementos de un arreglo son arreglos, se tiene una estructura llamada arreglos multidimencionales o matrices. • Las Matrices se utilizan ampliamente en problemas relacionados con Algebra Lineal, simulación, procesamiento de texto etc.. Javier Cañas 2000 10 5 Ejemplo de Arreglos Multidimensionales Se desea definir una matriz de 4x3 enteros const int Filas= 4; const int Columnas= 3; float matriz[Filas][Columnas]; Javier Cañas 2000 11 Ejemplo de matriz de 4x3 0 1 2 matriz[3][1] 0 1 2 3 Javier Cañas 2000 12 6 Inicialización de Arreglos Multidimensionales • Los Arreglos Multidimencionales se inicializan igual que las matrices • Ejemplo: float matriz [Filas][Columnas] = { {1.3,0.0,-7.5}, {5.1,-3,8,11.3}, {21.5,9.0,7.3}, {8.3,-1.2,4.0} }; Javier Cañas 2000 13 4 Arreglos y Funciones • Arreglos pueden ser pasados a funciones como parámetros de funciones. • Es posible pasar por valor o referencia. Lo usual es el paso de referencia ya que de esta forma se ahorra memoria al evitar la copia local de toda la estructura • El siguiente ejemplo muestra prototipos de funciones que utilizan arreglos como argumentos Javier Cañas 2000 14 7 Prototipos de ejemplos void funcion(float[Fil][Col); void funcion(float[ ][Col] ); void otra_fun (int elem[ ] ); • Cuando se invoca la función, sólo es necesario indicar el nombre del arreglo Ej: display(matriz); /* matriz es el nombre del arreglo*/ Javier Cañas 2000 15 Ejemplos de Funciones /*Función para ingresar datos a un arreglo*/ void ingresar(int a[],int num) { for (int i=0;i<num; i++) {cout << “arreglo[“<<i<<“]: ”; cin >> a[i]; } } Javier Cañas 2000 16 8 ...Ejemplos de Funciones /*Función para mostrar datos de un arreglo*/ void mostrar(int a[],int num) { for (int i=0;i<num; i++) cout << a[i]<< “ “; cout<<endl; } Javier Cañas 2000 17 Ordenamiento (Sort) • Los ordenamientos junto con las búsquedas, representan las operaciones más frecuentes sobre arreglos. • Existen muchos algoritmos, entre los cuales destaca Quick Sort. • Veremos un algoritmo llamado Bubble Sort, que si bien no es muy eficiente, se destaca por su simplicidad Javier Cañas 2000 18 9 Bubble Sort • Se desea ordenar en forma ascendente un arreglo A de enteros de tamaño N • La estructura global del algoritmo es: for(int i=0; i <N; ++i) for(int j=0; j <=i; ++j) if (A[i] < A[j]) Intercambiar A[i] con A[j] Javier Cañas 2000 19 Función Bubble Sort void bubblesort(int a[], int num) { for(int i=0; i <num; ++i) for(int j=0; j <=i; ++j) if (a[i] < a[j]) {int temp=a[i]; a[i]=a[j]; a[j]=temp;} } Javier Cañas 2000 20 10 5 Estructuras Complejas • Arreglos se pueden combinar con otras estructuras para crear objetos complejos • A modo de ejemplo: – Arreglos de objetos – Objetos que incluyen arreglos • A continuación se muestran algunos ejemplos Javier Cañas 2000 21 Arreglo de Estructuras struct repuesto { int modelo; int PN; float valor; }; repuesto lista[1000]; // define //arreglo de repuestos Javier Cañas 2000 22 11 Arreglos y Clases • Arreglos también pueden ser miembros de clases • Ilustraremos esta idea definiendo una estructura de amplio uso en computación llamada Stack o Pila. • En un Stack sólo se puede insertar o eliminar elementos por el tope. • La siguiente diapositiva muestra un Stack Javier Cañas 2000 23 El Stack Tope del Stack top Javier Cañas 2000 24 12 La Clase Stack class stack { private: int st [ MAX]; int top; public: stack() {top=0;} // constructor void push(int var){st[++top]= var;} int pop( ) {return st[top--]; } }; Javier Cañas 2000 25 Arreglos de Objetos • un objeto puede contener arreglos • un arreglo puede contener objetos • Revisaremos esta idea volviendo a un viejo ejemplo: el sistema de inventario de repuestos Javier Cañas 2000 26 13 Ejemplo de Arreglos de Objetos const int MAX= 1000 class Repuesto {private: int modelo,PN; float valor; public: void set (int m, int pn, float c) {modelo= m; PN= pn; valor= c; } Javier Cañas 2000 27 ...Arreglos de Objetos void show ( ) { cout << “\n Modelo” << modelo; cout << “, PN” << PN; cout << “, costo $” << valor; } }; // fin de la declaración clase void main ( ) { Repuesto pieza[MAX] ....... Javier Cañas 2000 28 14 6 Strings • Son arreglos de tipo char • Pueden ser variables o constantes • Tienen gran importancia por sus aplicaciones en el manejo de documentos, bibliotecas electrónicas, motores de búsqueda etc.. • Existe un área especial de la informática llamada “String Processing” dedicada a investigar en esta área Javier Cañas 2000 29 Ejemplo de String Un string es una secuencia de caracteres imprimibles. Por ejemplo: “Hola Mundo” es un string H o l a M u n d o \0 Este carácter es obligatorio y señala el término del string Javier Cañas 2000 30 15 Strings y Caracteres ¿Qué diferencia existe entre el carácter ‘a’ y el string “a”? El carácter ‘a’ ocupa un Byte y el string “a ” ocupa 2 Bytes ya que siempre se termina con el Byte Nulo (\0) a a 1 Byte \0 2 Bytes Javier Cañas 2000 31 Ejemplo de Variables strings #include <iostream.h> const int MAX= 80 void main ( ) { char str[MAX]; cout <<“\n Ingrese un strings:”; cin >>str; cout>>“\n El string es:” <<str; } Javier Cañas 2000 32 16 Observación • En el ejemplo anterior, ¿ Cómo evitar que un usuario ingrese más caracteres? • La solución es usar un manipulador especial llamado setw (visto en capítulo anterior) Javier Cañas 2000 33 El Manipulador “setw” # include <iomanip. h > const int MAX= 20; void main ( ) { char str[MAX]; cout << “\n Ingresar un string:”; cin >> setw(MAX) >> str; } Javier Cañas 2000 34 17 Constantes strings Se puede inicializar un strings a un valor constante al momento de definirlo // inicializar un string #include < iostream.h > void main ( ) { char str[]= “ Hola Mundo”; cout << str;} • Javier Cañas 2000 35 Constantes strings • También se podría haber inicializado de la forma corriente, al igual que cualquier arreglo: char str[]={‘H’,‘o’,‘l’,‘a’,‘ ‘, ‘M’,‘u’,‘n’,‘d’,‘o’,‘\0’}; Javier Cañas 2000 36 18 La función get • En el ejemplo anterior, el programa escribiría: Hola (no escribe mundo) • ¿ Qué pasa? – Lo que pasa es que el operador de inserción >> considera un espacio como carácter de terminación: cin::get( ) get es función miembro de la clase de stream cin Javier Cañas 2000 37 ¿ Cómo usar get ? #include<iostream.h> const int MAX= 80; void main ( ) {char str [MAX]; cout << “ \n Ingrese un string:”; cin.get(str, MAX); cout<< “El string ingresado es:” <<str; } ¡ Ahora sale: Hola Mundo ! Javier Cañas 2000 38 19 Lectura de Múltiples Líneas • ¿ Cómo leer un string formado por varias líneas? • La función cin :: get ( ) nos puede ayudar • Es necesario definir un carácter de terminación Javier Cañas 2000 39 Ejemplo de Lectura de Múltiples Líneas Se desea leer: La programación en C++ es muy entretenida. $ terminador cin.get(str, MAX,’$’); Por defecto la terminación es ‘\n’ Javier Cañas 2000 40 20 Copia de Strings • Supongamos que tenemos: – char string1[80]=“Informática”; – char string2[80]; • Se desea copiar el string1 en el string2 • ¿Cómo hacerlo? Hay dos formas – Por programa que manipule arreglos – Usando bibliotecas especializadas Javier Cañas 2000 41 Copia de strings por programa # include <string.h> const int MAX= 80; void main ( ) {char str1[ ]= “ Hola Mundo”; char str2[MAX]; //string vacío for(int j=0;j<strlen(str1); j++) str2[j]= str1[j]; str2[j]= ‘\0’; } Javier Cañas 2000 42 21 Copia de strings: Uso de bibliotecas strcpy(str2, str1); strcpy(destino, fuente); es necesario incluir: #include <string.h> Javier Cañas 2000 43 Arreglos de strings const int DIAS= 7;// nº de strings const int MAX= 10; // Tamaño Máx. void main ( ) { char semana[ DIAS][MAX]= { “ Domingo”,“ Lunes”,...” Sabado”}; for ( int j= 0; j< DIAS; j++) cout << semana [ j] << endl; } Javier Cañas 2000 44 22 Ejemplo de Arreglos de strings 0 1 2 3 4 5 6 0 D L M M J V S 1 o u a i u i á 2 m n r é e e b 3 i e t r v r a 4 n s e c e n d 5 g \0 s o s e o 6 o \0 l \0 s \0 7 \0 8 9 e s \0 \0 Javier Cañas 2000 45 Tipo string definido por el usuario • Usando clases es posible definir un tipo string y soportar por ejemplo asignaciones • ¿ Qué se gana? – como se trabaja con objetos, se pueden usar asignaciones Javier Cañas 2000 46 23 Ejemplo de Tipo string definido por el usuario #include<string.h>//Para strcpy( ),strcat( const int sz= 80; class string {private: char str [ sz]; ) Javier Cañas 2000 47 Ejemplo de Tipo string definido por el usuario public: string( ) { str [ 0]= ‘\0’;} string(char s[]){ strcpy(str,s); } void display( ) { cout << str;} void concat ( String sz) {if (strlen(str)+strlen(sz.str) < sz) strcat(str,sz.Str);// concatena else cout << “ \n string muy largo”; } }; Javier Cañas 2000 48 24 Ejemplo de uso de la Clase void main ( ) {string s1(“Feliz Navidad”); /* uso de constructor 2*/ string s2= “ Feliz Año Nuevo”; /* uso de constructor 2*/ string s3; // constructor 1 s2. Display ( ); s3= s1; // asignación s3.concat( s2);} Javier Cañas 2000 49 FIN Arreglos 25