capitulo 8

Anuncio
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
Descargar