Documente Academic
Documente Profesional
Documente Cultură
Programación - IQ
Unidad 6 - Arreglos y datos complejos.
Competencia específica a desarrollar:
Resolver problemas específicos aplicando Arreglos, para estructurar modelos que integren un lenguaje
adecuado en el ámbito de interés.
Introducción
Los arreglos también son conocidos como Array, por su nombre en inglés, y un arreglo es un conjunto de
variables del mismo tipo que tienen el mismo nombre y se diferencian por un índice.
Para entender el concepto y el uso de los arreglos, se presenta el siguiente ejemplo:
Supongamos que un meteorólogo quiere guardar en una computadora la temperatura que se ha registrado
en cada hora durante el día. Y para darle cierta utilidad, al final se calcula la media de las temperaturas
registradas. Con los conocimientos que se tienen hasta ahora, el programa podría ser de la siguiente
forma:
#include <stdio.h>
int main()
{
/* Se declaran 24 variables, una para cada hora del dia */
int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16;
int temp17, temp18, temp19, temp20, temp21, temp22, temp23, temp0;
int media;
int hora;
programa mayor, probablemente habrá que escribirlo muchas más veces. Si en un momento dado se
quiere cambiar la dimensión del arreglo, se tendrá que cambiar en todos los lugares donde se use. Si hay
una equivocación al escribir el tamaño (ponemos 25 en lugar de 24) se cometerá un error y puede no ser
posible darse cuenta. Por eso es más recomendable el uso de constantes con un nombre declaradas con la
sentencia #define, por ejemplo:
#include <stdio.h>
#define ELEMENTOS 24
int main()
{
int temp[ELEMENTOS]; /* Para declarar las 24 variables */
float media;
int hora;
Nota: ¿Qué pasaría si se registran menos elementos de los reservados?, no pasa nada, sólo que los
elementos que no se registren valdrán cero.
Paso de un arreglo a una función
En el lenguaje C no se puede pasar un arreglo entero a una función. Lo que se tiene que hacer es pasar un
puntero (apuntador) al arreglo. Con este puntero se puede recorrer el arreglo completo:
#include <stdio.h>
int sumar( int *m )
{
int suma, i;
suma = 0;
for( i=0; i<10; i++ )
{
suma += m[i];
}
return suma;
}
int main()
{
int contador;
int matriz[10] = { 10, 11, 13, 10, 14, 9, 10, 18, 10, 10 };
También se puede utilizar una estructura for dentro de otra estructura for para inicializar los valores de un
arreglo de dos dimensiones.
Para leer desde teclado una matriz de números enteros de dimensión 3x3.
#include <stdio.h>
#define TAM 3
void main()
{
int matriz[TAM][TAM];
int i, j;
for( i=0; i<TAM ; i++)
{
for( j=0; j<TAM; j++)
{
printf(”Ingrese el elemento [%d,%d]: “,i,j);
scanf(“%d”,&matriz[i][j]);
}
}
}
Supongamos que ahora se quiere almacenar las temperaturas de cada hora de todo un día y toda la
semana. Según lo que se aprendió en los temas anteriores, se puede usar un arreglo unidimensional para
día de la semana. En cada uno de esos arreglos se podría almacenar las temperaturas de cada día.
Una posible solución sería:
#include <stdio.h>
#define DIAS 7
#define HORAS 24
int main()
{
int temp[DIAS][HORAS];
float media = 0;
int hora, dia;
5
| Programación - IQ| Unidad 6 |
Así un TDA es una generalización de los tipos de datos primitivos de un lenguaje de programación. Un TDA
encapsula la definición del tipo y todas las operaciones con este tipo.
Los lenguajes de programación entregan al programador ciertos tipos de datos básicos o primitivos,
especificando el conjunto de valores que una variable de uno de esos tipos puede tomar y el conjunto de
operaciones realizables sobre los mismos.
Los TDA’s son generalizaciones de los tipos de datos básicos y de las operaciones primitivas. Además, un
TDA encapsula cierto tipo de datos en el sentido que es posible poner la definición del tipo y todas las
operaciones con ese tipo en una sección de un programa.
Cada conjunto de operaciones define un TDA distinto. Por ejemplo, se puede definir un tipo de datos
abstracto CONJUNTO con el cual se pueden definir las siguientes operaciones:
• ANULA(A) Hace vacío al conjunto A
• UNION(A, B, C) Construye el conjunto C a partir de la unión de los conjuntos A y B.
• TAMAÑO(A) Entrega la cantidad de elementos del conjunto A.
Existen muchas estructuras de datos que se pueden utilizar para implantar eficientemente un conjunto. Por
ejemplo, mediante arreglos. Las operaciones sobre conjuntos se pueden implantar mediante funciones.
Especificación de un TDA
Es la descripción formal del tipo de dato que representa a una entidad a través de sus propiedades y su
comportamiento. Dos niveles:
Especificación Sintáctica:
¿Qué hace? Especificación de las entidades y sus propiedades (interfaz)
• Definir el nombre de las entidades abstractas.
• Definir el nombre de las operaciones indicando el dominio (argumentos) y el codominio o rango (los
valores de retorno)
Especificación Semántica:
¿Cómo lo hace? Descripción de la representación del objeto (estructura de los datos) y desarrollo de las
operaciones.
1) Definir el significado de cada operación usando los símbolos definidos en la especificación
sintáctica.
Ejemplo: implementación del TDA conjunto
El objetivo del ejemplo es definir una clase que gestione conjuntos de enteros. Las operaciones para el
conjunto de enteros son las siguientes:
Unión.- La unión de dos conjuntos A y B, denotado por A B; es el conjunto de todos los elementos
que están en A, en B o en ambos.
Intersección.- La intersección de dos conjuntos A y B, denotado por A B; es el conjunto de todos los
elementos que pertenecen a ambos A y B simultáneamente.
Diferencia.- La diferencia de conjuntos A y B, denotado por A - B; es el conjunto de elementos que
pertenecen a A pero no pertenecen a B
Pertenencia.- El número entero x es un miembro o pertenece al conjunto A si x es un elemento de A.
Esta operación se denota por x A .
Comparaciones.- Los conjuntos pueden compararse entre sí mediante el uso de operadores
relacionales.
a. Subconjunto.- El conjunto A es un subconjunto del conjunto B si y solo si todo elemento de A
es también un elemento de B.
b. Igualdad.- El conjunto A es igual al conjunto B si y solo si cada elemento de A está en B y
cada elemento de B está en A.
7
| Programación - IQ| Unidad 6 |
8
| Programación - IQ| Unidad 6 |
9
| Programación - IQ| Unidad 6 |
cout<<elem[i]<<"\t";
cout<<endl;
} else
cout<<"El conjunto esta vacio"<<endl;
}
//ordenar los elementos del conjunto
void conjunto::ordenar() {
int i,j,x;
if ( ne > 1 ) {
for(i=0; i<ne-1; i++)
for(j=i+1; j<ne; j++)
if ( elem[i] > elem[j] ) {
x = elem[i];
elem[i] = elem[j];
elem[j] = x;
}
}
}
// el elemento pertenece al conjunto?
bool conjunto::pertenece(int x) {
int i;
bool b;
b = false;
i = 0;
while( b == false && i < ne)
if (elem[i] == x)
b = true;
else
i++;
return b;
}
//cardinalidad: numero de elementos del conjunto
int conjunto::cardinalidad() {
return ne;
}
//definiendo la union de conjuntos
conjunto operator+(conjunto c1, conjunto c2) {
conjunto c3;
int x, i;
for(i=0; i<c1.ne; i++)
c3.elem[i] = c1.elem[i];
c3.ne = c1.ne;
for(i=0; i<c2.ne; i++) {
x = c2.elem[i];
if (c3.pertenece(x) == false) {
c3.elem[c3.ne] = x;
c3.ne++;
}
}
return c3;
}
//definiendo la interseccion de conjuntos
conjunto operator*(conjunto c1, conjunto c2) {
conjunto c3;
int x,i;
10
| Programación - IQ| Unidad 6 |
11
| Programación - IQ| Unidad 6 |
12