Documente Academic
Documente Profesional
Documente Cultură
FUNDAMENTOS
DE PROGRAMACIÓN
Asignatura correspondiente al plan de estudios
de la carrera de Ingeniería Informática
UNIDAD 9
ARRAYS y STRUCTS
UNIDAD 9
Arrays y Structs
Introducción
En esta unidad aprenderemos a emplear dos importantes estructuras de datos
en C++. Aplicaremos los conceptos estudiados en Fundamentos de
Programación: los arreglos, empleando la sintaxis de C++. Estudiaremos como
declarar y definir arreglos estáticos en C++, como se almacenan en memoria y
como se acceden para ser modificados o utilizados. Analizaremos sus ventajas
y limitaciones.
Definición de arreglo
Definimos como array a la estructura de datos formada por
una secuencia de elementos homogéneos (de igual tipo).
Cada elemento tiene una posición relativa -que puede ser
establecida por uno o más índices- dentro de la secuencia.
const m = 100;
...........
int z[m];
char mensaje[30];
double tabla[4] [12];
static float lista[200];
Arreglos bidimensionales
Para operar con arreglos bidimensionales (matrices) debemos declarar las dos
dimensiones de la tabla.
int mat[10][6] ;
for (int i=0; i<10; i++)
{ for (int j=0; j<6; j++)
{
cout<<"dato de fila "<<i<<" columna "<<j<<":";
cin >> mat[i][j];
}
}
El ejemplo siguiente contiene el código C++ que permite mostrar una matriz
dispuesta en filas y columnas en la pantalla.
void main(void)
{
int m[2][3]={12,34,56,78,90,100};
int i,j;
for (i=0;i<2;i++)
{
for (j=0; j<3; j++)
{
cout<<setw(4)<<m[i][j]; //escribe elementos de una fila
}
cout<<endl; //avanza a la próxima línea
}
}
Indices enumerados
Hemos estudiamos las constantes enumeradas que permiten al programador
definir nuevos tipos de datos en C++. Es posible emplear tales tipos para asignar
datos e inclusive definir índices de un arreglo. Observemos el siguiente ejemplo:
void main()
{
enum meses{ENE,FEB,MAR,ABR,MAY,JUN,JUL,AGO,SET,OCT,NOV,DIC};
meses mes;
float venta[DIC];
for(mes=ENE; mes<DIC+1; mes++)
{
cin>>venta[mes];
};
.....
}
int main ()
{
int v1[] = {35, 41, 22};
int v2[] = {12, 4, 6, 15, 10};
muestra_arreglo(v1,3);
muestra_arreglo(v2,5);
return 0;
}
Arreglos multidimesionales
Si se trata de pasar como parámetro un arreglo de más de una dimensión, el
parámetro formal debe tener los corchetes correspondientes al primer índice
vacíos, pero establecer explícitamente las otras dimensiones.
void leer_tabla(int t[][10], int num_filas);
struct compuesta(
miembro 1;
miembro 2;
miembro 3;
.....
miembro n;
);
En la definición es obligatorio explicitar el tipo struct y a continuación el
identificador (compuesta en el ejemplo) de la estructura. Luego, entre
paréntesis deben definirse cada uno de los componentes o miembros).
Tomemos el siguiente ejemplo:
ficha struct ficha(
apellido char *apellido;
nombres char *nombres;
Dni long dni;
int edad;
Edad int cant_materias;
Cant_materias };
struct ficha(
char *apellido;
char *nombres;
long dni;
int edad;
int cant_materias;
} x =(“Lopez”, “Gerardo”, 24567890, 21, 11);
Arreglo de structs
Es posible emplear arreglos como miembros de una composición struct. Pero
también podemos definir un arreglo cuyos elementos sean estructuras.
struct ficha {
char *apellido;
char *nombres;
long dni;
int edad;
int cant_materias;
};
typedef struct {
char *apellido;
char *nombres;
long dni;
int edad;
int cant_materias;
} ficha // definición del tipo ficha como estructura
En el último ejemplo, b se declara de tipo byte; x es una variable individual que puede
almacenar la información de una entidad de acuerdo a los miembros definidos en el tipo
struct ficha; la variable y es un array donde cada elemento es del tipo struct
ficha.; las variables m y t se declaran como arreglos bidimensionales de 50x12
elementos enteros.
Síntesis
Un arreglo es una colección de datos relacionados de igual tipo e
identificados bajo un nombre genérico único.
La estructura completa ocupa un segmento de memoria único y sus
elementos se almacenan en forma contigua.
Para procesar un elemento del arreglo, se debe especificar el nombre de
la estructura y uno o más índices que determinan la posición relativa del
elemento.
El índice que determina la posición de los elementos de u arreglo
comienza siempre con cero.
En la declaración se debe establecer la cantidad de elementos
(dimensión) que puede tener como máximo el arreglo en el programa o
definir los elementos que lo componen.
La dimensión de un arreglo debe ser siempre mayor o igual a su
longitud.
Si se requiere 2 índices para establecer la posición de un elemento, el
arreglo es una tabla o matriz. Con 3 índices es una matriz tridimensional
y con más índices una matriz multidimensional.
El nombre de un arreglo representa la dirección de memoria del inicio el
arreglo (de su primer elemento).
Al pasar arreglos como parámetros de funciones la relación entre
parámetro formal-parámetro actual es similar al pasaje por referencia.
Para evitar cambios en el arreglo enviado en la llamada a una función se
debe preceder a la variable arreglo establecida como parámetro formal
en el prototipo de la función con el modificador const.
Un struct es una estructura de datos e C++ que permite organizar un
conjunto de datos relacionados de diferente tipo. Estos datos que
conforman el struct se denominan miembros.
Los miembros de un struct pueden ser de tipo simple o también otras
estructuras de datos: arreglos, structs, etc.
También los elementos de un arreglo pueden ser de tipo struct.
Los objetos cin y cout para flujos de entrada y salida no permiten operar
estructuras de datos completas. Se deben utilizar los componentes de
una estructura, como el elemento de un arreglo o un miembro de un
struct.
C++ admite la identificación de tipos a través de la palabra clave
typedef. Estas definiciones suelen ser globales y se realizan
usualmente fuera de la función principal de programa main().
Actividades
Ejercicios
En los ejercicios que impliquen la codificación de un programa debe observar los
pasos siguientes:
i) Salvar en diskette, compilar, --si es necesario-- depurar, y ejecutar el programa
propuesto.
ii) Proponer una adecuada interfaz hombre-máquina considerando un usuario final
que carece de instrucción en informática y programación.
Ejercicio 9.1
Generar aleatoriamente un arreglo lineal .....
a de 120 elementos numéricos, con void main ()
enteros entre 1000 y 1500 y mostrarlo en coinst N=120;
el display de video. Luego ingresar dos gen_array(a,1000,1500,N);
valores en las variables m y p. El valor m cout<<”Valor a insertar:”;
debe ser insertado en la posición p del cin>>m>>p;
arreglo. Mostrar el vector modificado. insertar(a,N,m,p);
....
Utilice el código del recuadro de la }
derecha, complételo y diseñe las
funciones allí invocadas.
Ejercicio 9.2
Leer las calificaciones y dni de un grupo de alumnos que asistieron a una
evaluación parcial de programación. Generar un vector con los dni de los
alumnos aprobados y otro con los dni de los no aprobados (Nota<7). Los datos
finalizan con el dni 0.
Se desea obtener como información de salida en el orden indicado:
a. Un listado de los DNI de los alumnos aprobados.
b. Las 2 mayores calificaciones y los DNI de los alumnos que las obtuvieron.
c. Un listado con los DNI de los alumnos que no aprobaron la evaluación.
Ejercicio 9.3
Leer N datos numéricos. Obtener la media y la desviación standard de la lista.
Las expresiones para el cálculo se indican abajo. Utilice 2 funciones llamadas
media( ) y desviostd( ) para resolver el caso:
x1 x 2 x 3 ........ xn
M
N
( x1 m ) 2 ( x 2 m ) 2 ........ ( xn m ) 2
DS
N
Ejercicio 9.4
Leer en un arreglo lineal una lista de N datos numéricos. Eliminar del arreglo el
valor 523. Si este dato aparece más de una vez eliminar todas las ocurrencias.
Informar el arreglo así modificado.
Pregunta: al eliminar el valor 523 de la lista, ¿aumenta la disponibilidad de
recursos en la computadora (memoria)?
Ejercicio 9.5
Una asociación cooperadora escolar recibe aportes de dinero variable de los
estudiantes asociados. Se leen sin orden alguno los montos aportados en el
último año y la fecha correspondiente (día,mes). Estos datos terminan con el
valor de monto cero. Informe: a) el total recaudado por mes, b) El mes de menor
aporte.
Para resolver el problema organice un arreglo de 12 elementos con los montos
mensuales de los aportes y considere el tipo enumerado meses
enum meses{ENE,FEB,MAR,ABR,MAY,JUN,JUL,AGO,SET,OCT,NOV,DIC};
para referenciar a cada elemento del arreglo.
Ejercicio 9.6
En una olimpíada estudiantil compiten N alumnos en 3 pruebas (1: matemáticas,
2: física y 3: computación).. Se ingresan por cada inscripto el DNI y su número
asignado para la competencia (entre 1 y N).
Luego, sin orden alguno, se van ingresando ternas con los puntajes de cada
prueba: nro de participante, código de actividad (1: matemáticas, 2: física y 3:
computación), puntaje en la actividad. Escriba un algoritmo que determine: a) El
DNI del ganador de la competencia y el puntaje total obtenido. b) El DNI del
estudiante que ocupó el 2do lugar y su puntaje. c) ¿Qué puntaje obtuvo en
Computación el ganador de la competencia?
Ejercicio 9.7
Una empresa distribuidora comercializa 25 artículos. Posee 4 sucursales y
desea analizar el desempeño de las mismas. Para ello se ingresan los datos
correspondientes a las ventas efectuadas en cierto período: código sucursal
(1..4), código artículo (1..25), cantidad unidades vendidas. Determine e informe:
a. Las cantidades de unidades vendidas por la empresa de cada artículo.
b. El total de unidades vendidas por la sucursal 3, sumando todos los
artículos.
c. La cantidad vendida por la sucursal 1 del artículo 6.
d. La sucursal que vendió más unidades del artículo 8.
Ejercicio 9.8
Considere el mismo enunciado del problema anterior. Incorpore –además- los
datos de los precios de los 25 artículos que comercializa la empresa.
Determine e informe: a) La recaudación de cada sucursal. b) La recaudación de
la empresa. c) La sucursal que obtuvo mayor recaudación.
Ejercicio 9.9
Se leen los datos de una matriz o tabla de 5x12 que contiene los valores en mm
de lluvias producidas en 5 departamentos de la provincia durante los 12 meses
de 2005. Se sabe que en algunos departamentos tienen datos faltantes por lo
que aparecen valores negativos (-1) en cada uno de esos casos. Escriba un
programa C++ que: a) complete los datos de lluvia faltantes con el promedio
anual de precipitación en el departamento correspondiente. Cada promedio debe
obtenerse con los datos reales existentes (no contar los -1). b) Amplíe la matriz
agregando una nueva columna con los totales de mm caídos en todo el año en
cada departamento. Informe: 1) la matriz original de datos, 2) la matriz
modificada y 3) los totales anuales de lluvia por departamento.
Ejercicio 9.10
Declare un tipo struct con el nombre ficha_alumno indicando al menos 10
campos de tipo simple o string correspondientes a los datos de un alumno de la
UNL. Luego declare 3 variables de ese tipo.
Nota: para declarar un string llamado apellido debe escribir:
char apellido[12];
Ejercicio 9.11
a) Considere el struct ficha_alumno del ejercicio anterior. Agregue al tipo
ficha_alumno un campo llamado materias el cual debe almacenar las
calificaciones (de 1 a 10) de las asignaturas aprobadas por cada alumno en su
carrera. Considere que la carrera consta de 32 materias.
b) Indique la sintaxis para asignar las calificaciones 8, 7 y 10 a las materias 6, 11
y 12 respectivamente a los miembros correspondientes de una variable de tipo
ficha_alumno.
Ejercicio 9.12
Declare una variable x con la cual Ud. pueda representar en un programa C++ a
una lista de hasta 200 alumnos, cuyos datos se organizan en la estructura tipo
ficha_alumno que creó antes.
Ejercicio 9.13
Un número complejo tiene la forma a+bi donde a y b son números reales. Las
operaciones básicas con complejos son: Suma, Resta, Producto y Cociente:
Escriba un programa C++ que permita ingresar las componentes de 2 números
complejos y a través de un menú el usuario seleccione la operación a realizar.
Proponga funciones para cada operación de complejos, que permitan devolver el
complejo resultante. Proponga una struct llamado complejo de 2 miembros:
parte_real y parte_imag para representar y operar los números complejos.
Ejercicio 9.14
Considere el struct complejo del ejercicio anterior. Escriba una función C++
llamada opera_complex( ) cuyo prototipo se indica abajo:
complejo opera_complex(complejo c1, compljo c2, char op)
Su objetivo es recibir 2 complejos como parámetros y un carácter que indique la
operación: ‘+’,’-‘,’*’ . Debe devolver el resultado de la operación.
Cuestionario
9.1 ¿Qué tipos de datos se admiten como índices de una estructura de tipo
array en C++?
9.8 ¿Es posible declarar un struct dentro de otro struct? Si responde por sí
proponga un ejemplo.
9.11 ¿Es posible pasar por valor un arreglo a una función? Explique.