1
Otoño 2013
Arreglos
Unidad 0
Programación AVANZADA
Contenido
Definición
Procesamiento de Arreglos
Paso de Parámetro a funciones
Arreglos multidimensionales
2
Introducción
•
Una variable puede
almacenar un valor único.
Ejemplo
–
a = 5;
–
contador = 0;
•
Si necesitamos 5 valores
diferentes del mismo tipo,
usaríamos 5 variables
–
int a,b,c,d,e;
•
Si el número de valores a
guardar es mayor a 5
necesitamos una
estrategia diferente
•
Los arreglos nos
permitirán definir
conjunto de valores del
mismo tipo
3
Arreglo
•
Un arreglo es una colección finita y homogénea
de datos.
•
Cada elemento de la colección es almacenado en
una casilla del arreglo
•
Para obtener cada elemento se debe referenciar
por medio del índice del arreglo
4 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9
0 1 2 3 4 5 6 7 8 9 D
Definición
•
Un arreglo se define de la siguiente forma:
tipo nombre_del_arreglo[expresion]
5Tipo de
datos:
int
float
char
Nombre de la
variable
Indica la cantidad de
elementos del arreglo
Ejemplo
SIZE = 10;
int A[10];
int B[SIZE];
int C[SIZE*2];
6 15 23 8 14 0 -6 11 4 -5 8A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
A
Arreglo
•
El compilador se encarga de reservar el
espacio en memoria necesario para almacenar
los datos del arreglo
7 15 23 8 14 0 A[0] A[1] A[2] A[3] A[4]
A
Inicialización
int A[10] = {15,23,8,14,0,-6,11,4,-5,8}
int A[] = {15,23,8,14,0,-6,11,4,-5,8}
8 15 23 8 14 0 -6 11 4 -5 8A
15 23 8 14 0 -6 11 4 -5 8A
Inicialización
int A[10] = {15,23}
int A[10] = {}
9 15 23 0 0 0 0 0 0 0 0A
0 0 0 0 0 0 0 0 0 0A
Definición de Constantes
•
El tamaño del arreglo puede definirse por medio de
una constante, de esta forma será mas fácil modificar
el programa en caso necesario
#define nombre expresion
•
#define es una directiva al compilador que indica que
el texto que sigue sera reemplazado por la expresión
•
Ejemplo
#define size 15
10
Ejemplo
•
Escriba un programa en el cual lea 10 números
enteros y almacénelos en un arreglo
•
Busque un numero dado en el arreglo e
indique cuantas veces aparece dentro del
arreglo
Ejemplo
#include <iostream>#define size 10 using namespace std; int main() { int i,num,freq=0; int arreglo[size]={}; for(i=0;i<size;i++){ cout << “Arreglo[“ << i << “]=”; cin >> arreglo[i]; }
cout << “Indique el número que va a buscar ”; cin >> num; for(i=0;i<size;i++){
if(arreglo[i] == num) freq++;}
cout << “El número “ << num << “ se encuentra “ << freq << “veces en el arreglo”;
Ejemplo
•
Escriba un programa en el cual lea 10 números
reales y almacénelos en un arreglo
•
Calcule la media de los números
•
Calcule la desviación de la media para cada
número
13
Ejemplo
#include <iostream> #define size 100 using namespace std; int main() { int i,n;float media=0,num[size]={}; // lea los números
cout << “Proporcione la cantidad de números a leer ”; cin >> n;
for(i=0;i<n;i++){
cout << “Numero ” << i << “ “; cin>> num[i]; media += num[i];
}
// calcule la media media = media/n;
cout << “La media es ” << media;
// calcule la desviación de la media para cada muestra cout <<“\nLa desviacion por muestra es\n”; for(i=0;i<n;i++)
cout << “Numero “ << i << “ = ” << num[i] << “ desviacion” << media – num[i] << endl;
return 0; }
14
Ejemplo
•
Lee y almacena las calificaciones de 20
alumnos. Las calificaciones son números
enteros comprendidos entre 5 y 10.
•
Escribe un programa que calcule, almacene e
imprima la frecuencia de cada una de las
calificaciones y además obtenga e imprima la
frecuencia mas alta
•
Si hubiera calificaciones con la misma
frecuencia, debe obtener la primer ocurrencia
15
Ejemplo
#include <iostream> #define size 100 using namespace std; int main() { int i,n,Max,indice; int cal[size],freq[6]={0};// lea los números
cout <<"Proporcione la cantidad de calificaciones "; cin >> n;
cout <<"Proporcione las calificaciones (5 -10)\n"; for(i=0;i<n;i++){ cout << "Calificacion " << i << " = "; cin>>cal[i]; } 16
Ejemplo
// calcule la frecuencia
for(i=0;i<n;i++)
freq[(cal[i]-5)]++;
// imprima las frecuencias
cout << "Las frecuencias de las calificaciones
son:\n";
for(i=0; i < 6; i++)
cout << "Existen " << freq [i] << "
alumnos con calificacion = " << i+5 << endl;
17
Ejemplo
// determine la maxima frecuencia
Max = freq[0]; indice = 0;
for(i=1; i < 6; i++)
if (Max < freq[i]){
Max = freq[i];
indice = i;}
cout << "La calificacion con mayor frecuencia
es " << indice + 5 << endl;
return 0;
}
Paso de arreglo como parámetro
•
Los arreglos pueden pasar como parámetros hacia las
funciones
•
Los arreglos pasan por referencia hacia las funciones
por lo cual las funciones pueden afectar su valor
original
•
En la declaración de arreglos formales se le indican los
corchetes para indicar que se espera un arreglo
•
La llamada a la función no incluye los corchetes
19
Ejemplo
void lectura(int A[],int size)
{
for(int i=0; i < size; i++)
{
cout <<"dato " << i << " = ";
cin >> A[i];
}
}
20Ejemplo
void imprime(int A[],int size)
{
for(int i=0; i < size; i++)
cout <<"dato " << i << " = "
<< A[i] << endl;
}
21
Ejemplo
void frecuencia(int f[], int A[], int size)
{
for(int i=0; i < size; i++)
f[A[i]-5]++;
}
22
Ejemplo
int maximo(int A[],int size)
{
int max = A[0];
int indice = 0;
for(int i=1; i < size; i++)
if(max < A[i])
{
max = A[i];
indice = i;
}
return indice;
}
Ejemplo
#include <iostream>
#define size 100
using namespace std;
int main()
{
int i,n,Max,indice;
int cal[size],freq[6]={0};
// lea los números
cout <<"Proporcione la cantidad de
calificaciones ";
cin >> n;
cout <<"Proporcione las calificaciones
(5 -10)\n";
Ejemplo
// calcule la frecuencia
frecuencia(freq,cal,n);
// imprima las frecuencias
cout << "Las frecuencias de las
calificaciones son:\n";
for(i=0; i < 6; i++)
cout << "Existen " << freq [i]
<< " alumnos con calificacion = "
<< i+5 << endl;
25
Ejemplo
// determine la maxima frecuencia
indice = maximo(freq,6);
cout << "La calificacion con mayor frecuencia
es " << indice + 5 << endl;
return 0;
}
26
Ejercicio
•
Escriba una función que calcule la media de
una lista de números enteros
•
La función debe recibir como parámetros de
entrada el arreglo y el tamaño del arreglo
•
La función deberá regresar la media de la lista
de números
27
Solución
float media(float A[], int size)
{
int i;
float suma=0;
for(i=0; i < size; i++)
suma+=A[i];
return (suma/size);
}
28
Ejemplo
#include <iostream> #define size 100 using namespace std; int main() { int i,n;float m,num[size]={}; // lea los números
cout << “Proporcione la cantidad de números a leer ”; cin >> n;
for(i=0;i<n;i++){
cout << “Numero ” << i << “ “; cin>> num[i]; }
// calcule la media m = media(num,n); cout << “La media es ” << m;
// calcule la desviación de la media para cada muestra cout <<“\nLa desviacion por muestra es\n”; for(i=0;i<n;i++)
cout << “Numero “ << i << “ = ” << num[i] << “ desviacion” << media – num[i] << endl;
return 0; }
29
Ejemplo
#include <iostream> #define size 100 using namespace std; int main() { int i,n;float m,num[size]={}; // lea los números
cout << “Proporcione la cantidad de números a leer ”; cin >> n;
for(i=0;i<n;i++){
cout << “Numero ” << i << “ “; cin>> num[i]; }
// calcule la media
cout << “La media es ” << media(num,n);;
// calcule la desviación de la media para cada muestra cout <<“\nLa desviacion por muestra es\n”; for(i=0;i<n;i++)
cout << “Numero “ << i << “ = ” << num[i] << “ desviacion” << media – num[i] << endl;
return 0; }
ARREGLOS MULTIDIMENSIONALES
Otoño 2013 31Arreglos bidimensionales
•
Arreglos en 2D
–
Tablas con renglones y columnas (Arreglo
mx
n)
–
Matriz: Especificar Renglon, luego Columna
Renglón 0
Columna 0
Columna 1 Columna 2 Columna 3
a[0][0] a[1][0] a[2][0] a[0][1] a[1][1] a[2][1] a[0][2] a[1][2] a[2][2] a[0][3] a[1][3] a[2][3] Índice Renglón Nombre del Arreglo
Índice Columna Renglón 1 Renglón 2
Arreglos Bidimensionales
•
Inicialización
–int b[2][2]={{1,2},{3,4}};–
Se inicializan grupos por renglón entre llaves { }
–
Si no existen suficientes elementos, estos son
puestos a cero
int b[2][2]={{1},{3,4}};
•
Haciendo referencia a elementos específicos
–
Especificar renglón, después columna
cout << b[0][1]; cin >> b[0][1]; 1 2 3 4 1 0 3 4
Ejemplo 1
•
Escriba un programa que lea un arreglo
bidimensional
•
El programa deberá imprimir los valores de la
diagonal
Ejemplo 1
void lectura(int A[][size], int row) {
for(int i=0; i< row; i++) for (int j = 0; j < row; j++) { cout << "A[" << i << "]" << "[" << j << "]=" ; cin >> A[i][j]; } }
void imprime(int A[][size], int row) {
for(int i=0; i< row; i++){ for (int j = 0; j < row; j++)
cout << "A[" << i << "]" << "[" << j << "]=" << A[i][j]; cout << endl;
} }
Imprime los valores de la diagonal
void diagonal(int A[][size], int row)
{
for(int i=0; i< row; i++)
cout << A[i][i] << endl;
cout << endl;
Programa que imprime la diagonal de una matriz
#include <iostream> #define size 3
using namespace std;
void lectura(int A[][size], int row); void imprime(int A[][size], int row); void diagonal(int A[][size], int row);
main() { int matriz[size][size]; lectura(matriz,size); imprime(matriz,size);
cout << "Los elementos de la diagonal son: "; diagonal(matriz,size);
return 0; }
Programa que realiza la suma de dos matrices
void suma(int A[][MAX], int
B[][MAX], int C[][MAX], int row,
int col)
{
for(int i=0; i< row; i++)
for (int j = 0; j < col; j++)
C[i][j]=A[i][j]+B[i][j];
}
Ejemplo 2
void lectura(int A[][size], int row) {
for(int i=0; i< row; i++) for (int j = 0; j < row; j++) { cout << "A[" << i << "]" << "[" << j << "]=" ; cin >> A[i][j]; } }
void imprime(int A[][size], int row) {
for(int i=0; i< row; i++){ for (int j = 0; j < row; j++)
cout << "A[" << i << "]" << "[" << j << "]=" << A[i][j]; cout << endl; } }
Ejemplo:
#include <iostream> #define MAX 2 using namespace std;void lectura(int A[][MAX], int row, int col); void imprime(int A[][MAX], int row, int col);
void suma(int A[][MAX],int B[][MAX],int C[][MAX], int row, int col);
main() {
int A[MAX][MAX],B[MAX][MAX];
cout <<"Proporcione los elementos de la matriz A\n”; lectura(A,MAX,MAX);
cout <<"\n\nProporcione los elementos de la matriz B\n"); lectura(B,MAX,MAX);
suma(A,B,B,MAX,MAX); cout <<"El resultado es: \n"); imprime(B,MAX,MAX);
return 0; }
Ejemplo 3
•
La traza de una matriz esta definida como la suma
de los elementos de la diagonal de la matriz
•
Ejemplo:
•
Escriba un programa que calcule la traza de una
matriz
2
1
11
12
1
2
8
4
2
6
3
2
12
tr
traza
int traza(int A[][MAX], int row)
{
int suma = 0;
for(int i=0; i< row; i++)
suma += A[i][i];
}
Programa que calcula la traza de una matriz
#include <stdio.h>#include <stdlib.h> #define size 3
void lectura(int A[][size], int row); void imprime(int A[][size], int row); void traza(int A[][size], int row); main() { int matriz[size][size]; lectura(matriz,size); imprime(matriz,size);
cout <<"La traza de la matriz es "<<traza(matriz,size)<< endl; return 0;
}
Ejemplo 4
•
Realice un programa que transforme la fecha
del formato:
dd/mm/aa
•
Al formato:
dd de mes de 20aa
•
Ejemplo:
–
23/02/02
–
23 de febrero del 2002
Ejemplo 4
int check_format(char date[])
{
for(int i = 0; i < 8; i++)
{
if((i == 2)||(i==5)){
if(date[i] != '/')
return 0;}
else
if(!isdigit(date[i]))
return 0;
}
return 1;
}
int main() { char fecha[8]; int mes,dia,year; char meses[12][12]={"Enero","Febrero","Marzo","Abril","Mayo","J unio","Julio","Agosto“,"Septiembre", "Octubre", "Noviembre", "Diciembre"};cout << "Proporciona una fecha en el formato dd/mm/aa "; cin >> fecha; if (check_format(fecha)) { dia = ((fecha[0]-48)*10)+(fecha[1]-48); mes = ((fecha[3]-48)*10)+(fecha[4]-48); year = ((fecha[6]-48)*10)+(fecha[7]-48); if (year <= 10) year += 2000; else year += 1900;
if ((dia < 32) && (dia > 0) && (mes < 13) && (mes > 0)) cout<<"\n\n%d de %s de %d\n\n", dia, meses[mes-1],year); else
cout << "\nError en la fecha\n"); }
else
cout << "\nError en el formato\n"); return 0;