Guia 09 (Arrays y Structs)

15

Click here to load reader

Transcript of Guia 09 (Arrays y Structs)

Page 1: Guia 09 (Arrays y Structs)

Universidad Nacional del Litoral Facultad de Ingeniería y Ciencias Hídricas

Departamento de Informática

FUNDAMENTOS

DE PROGRAMACIÓN Asignatura correspondiente al plan de estudios

de la carrera de Ingeniería Informática

UNIDAD 9

ARRAYS y STRUCTS

Ing. Horacio Loyarte ® 2008

Page 2: Guia 09 (Arrays y Structs)

Unidad 9 2

Ingeniería Informática � Fundamentos de Programación 2008

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. Además estudiaremos otra estructura de datos importante como struct y analizaremos el porqué de su presencia en C++ y las ventajas de su empleo. Veremos que es posible combinar estructuras de datos de acuerdo a las necesidades del caso a resolver.

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.

Características de los arreglos estáticos en C++

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 del

elemento. Se puede emplear como índice cualquier expresión que arroje un entero

dentro del rango establecido (dimensión) para dicho índice. El índice que determina la posición de los elementos de u arreglo

comienza siempre con cero. Se debe establecer en la declaración, la cantidad de elementos

(dimensión) que puede tener como máximo el arreglo en el programa. C++ admite operar fuera del rango preestablecido por la dimensión, pero

con resultados impredecibles.

Page 3: Guia 09 (Arrays y Structs)

Unidad 9 3

Ingeniería Informática � Fundamentos de Programación 2008

Clasificación de los Arreglos

En base al número de índices que determinan la posición de un elemento en el

arreglo podemos definir: Arreglos lineales o unidimensionales: la posición de un elemento la determina

un único índice. También conocidos como listas o vectores Ejemplo: en el caso de un arreglo lineal v de 200 elementos de tipo int:

v[0] v[1] v[2] v[3] v[4] v[5] v[6] .......... v[199] 23 56 71 19 33 90 48 .......... 74

Arreglos bidimensionales: se requieren 2 índices para posicionar un elemento en la colección. También conocidos como tablas o matrices.

Ejemplo: observemos gráficamente el caso de un arreglo de números de punto

flotante (float)de 5 filas por 12 columnas:

0 1 2 3 11 0 5.34 6.71 4.22 12.02 ... ... ... ... 7.92

1 1.55 1.16 1.65 11.34 ... ... ... ... 1.16

2 6.87 3.12 6.37 13.00 ... ... ... ... 3.16

3 3.21 5.90 3.24 13.72 ... ... ... ... 5.98

4 4.04 8.00 10.11 13.82 ... ... ... ... 4.43

Arreglos multidimensionales: se requieren más de 2 índices para posicionar un

elemento en la colección. También conocidos como tablas o matrices

multidimensionales. Ejemplo: arreglo de reales tri-dimensional. Analice algunos casos donde se

requiera la necesidad de platear estructuras como la de la figura.

Organización en memoria de los arreglos C++ como la mayoría de los lenguajes de programación, reserva segmentos de memoria contigua para almacenar los arreglos. El tamaño de memoria reservada se basa en la declaración del arreglo, y es un segmento estático: si el arreglo se declara en main{ }, durante toda la vida o ejecución del programa, estará

ocupando la porción de memoria necesaria y ese recurso no podrá ser empleado en otra cosa. Si se lo declara dentro de una función o bloque, ocupará memoria mientras el control de ejecución opere dentro de la función o del bloque.

i: índice para

las filas

Nro. de columnas

de la matriz

1.16 1.65 11.34 3.24 13.72 3.12 6.37 13.00 10.11 13.82 5.90 3.24 13.72 3.24 13.72 8.00 10.11 13.82 10.11 13.82 3.24 13.72 3.24 13.72 13.72 1.34 34.65 21.11 23.54 14.52 10.11 13.82 10.11 13.82 13.82

j: índice para columnas

k: índice para

la 3ra dimensión

Nro. de filas

de la matriz

Elemento [4][3] de

la matriz. Elemento [3][0] de

la matriz.

Page 4: Guia 09 (Arrays y Structs)

Unidad 9 4

Ingeniería Informática � Fundamentos de Programación 2008

Declaración e inicialización de un arreglo Arreglos lineales Los arreglos estáticos en C++ se declaran y definen como cualquier otra variable. Usualmente se establece la dimensión de la estructura, es decir, la

cantidad máxima de elementos que puede contener en el programa. const m = 100; ........... int z[m]; char mensaje[30]; double tabla[4] [12]; static float lista[200]; Tener en cuenta que C++ considera al primer elemento de un array en la posición 0, por tanto una declaración int x[3] implica que podremos referenciar en el programa a los elementos x[0], x[1], x[2]. Para inicializar un arreglo en el programa podemos recorrer cada elemento del arreglo para asignar los valores correspondientes, o bien, pueden inicializarse los elementos en la misma declaración, enumerando la lista de datos a asignar. // definición del arreglo x formado por 100 enteros al azar int x[100]; for (int i=0; i<99; i++) { x[i]= rand( ); } Nota: la función rand( ) pertenece a la librería stdlib.h y es una rutina matemática para generar números pseudoaleatorios enteros entre 0 y RAND_MAX. // definición e inicialización del array de caracteres z char z[7] = {�J�, �M�, �L�, �P�, �Q�, �W�, �H�} /* definición de un array t con algunos valores iniciales; el resto de los elementos se inicializan a cero */ float t[5] = {7.1,8.4} /* El siguiente arreglo no tiene dimensión. Por defecto C++ asume como tamaño la cantidad de valores iniciales */ int m[]={34, 56, 20, 41, 72} Arreglos bidimensionales Para operar con arreglos bidimensionales (matrices) debemos declarar las dos dimensiones de la tabla. /*Definición de la matriz mat de 10x6 elementos enteros */ int mat[10][6] // declaración de la matriz de enteros mat

Page 5: Guia 09 (Arrays y Structs)

Unidad 9 5

Ingeniería Informática � Fundamentos de Programación 2008

/* Inicialización de la matriz mat recorriéndola por filas con datos ingresados por consola */ 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.

//Ejemplo: mostrar una matriz de 2x 3 elementos //en forma de tabla #include<iomanip.h> #include<conio.h> 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 } }

En el ejemplo anterior se ha inicializado una matriz m de 6 elementos enteros donde se asignan los datos por filas. Es decir que: int m[2][3]={12,34,56,78,90,100}; ha permitido asignar los datos de la manera siguiente: m[0][0]=12 m[0][1]=34 m[0][2]=56 m[1][0]=78 m[1][1]=90 m[1][2]=100 SI quisiéramos asignarlos por columnas solo deberíamos intercambiar los ciclos for del ejemplo. Dimensión y longitud de un arreglo Los arreglos son estructuras estáticas que requieren establecer la cantidad de elementos que pueden almacenar. Pero en la práctica no siempre se conoce la

cantidad exacta de elementos a asignar al arreglo; entonces se debe dimensionar por exceso. El valor empleado para declarar el arreglo se denomina dimensión D y la

cantidad real de elementos utilizados es la longitud L del arreglo. Si en un programa L<D habrá posiciones vacías en la estructura, lo cual no representa u

propblema. Obviamente, debemos tener cuidado en recorrer el arreglo en toda su longitud L y no en toda su dimensión D.

Page 6: Guia 09 (Arrays y Structs)

Unidad 9 6

Ingeniería Informática � Fundamentos de Programación 2008

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]; }; ..... } Observe la declaración del arreglo venta y el empleo de la variable mes en la estructura iterativa for.

Arreglos como parámetros de funciones Es posible utilizar arreglos como parámetros de funciones. En C++ no es posible pasar por valor un bloque de memoria completo como parámetro a una función,

aún si está ordenado como un arreglo, pero está permitido pasar su dirección de

memoria, lo cuál es mucho más rápido y eficiente. Al pasar una dirección de

memoria estamos efectuando un pasaje por referencia. Para admitir arreglos lineales como parámetros lo único que se debe hacer al

declarar la función es especificar en el argumento el tipo de dato que contiene el

arreglo, un identificador y un par de corchetes vacíos [ ]. Por ejemplo, observemos la siguiente función:

void leer_arreglo(int arg[])

Vemos que la función leer_arreglo( ) admite un parámetro llamado arg que es un arreglo de enteros (int). ¿Donde está el pasaje por referencia o la

dirección de memoria del inicio del arreglo?. Respuesta: en el nombre del

arreglo.

El nombre del arreglo identifica a una variable que contiene la dirección de memoria donde comienza el bloque donde se aloja el

arreglo. En otras palabras: el nombre del arreglo tiene la dirección de

memoria del elemento 0 del arreglo.

Para llamar a la función leer_arreglo() del ejemplo anterior debemos utilizar como parámetro actual un arreglo; para ello es suficiente utilizar el

identificador del arreglo:

int miarreglo [30]; leer_arreglo(miarreglo);

En el siguiente ejemplo se invoca 2 veces a la función muestra_arreglo( ) pasándole en cada caso un arreglo y su longitud.

Page 7: Guia 09 (Arrays y Structs)

Unidad 9 7

Ingeniería Informática � Fundamentos de Programación 2008

// Ejemplo: arreglos como parámetros #include <iostream.h> #include <iomanip.h> void muestra_arreglo (int lista[], int largo) int main () { int v1[] = {35, 41, 22}; int v2[] = {12, 4, 6, 15, 10}; muestra_arreglo(v1,3); muestra_arreglo(v2,5); return 0; } void muestra_arreglo (int lista[], int largo) { for (int i=0; i<largo; i++) cout<<setw(4)<<lista[i]; cout<<endl; }

La salida del programa será:

35 41 22 12 4 6 15 10

Obsérvese que en el ejemplo se invoca dos veces a la función muestra_arreglo() empleando como argumentos arreglos de diferente dimensión. 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);

El modificador const y parámetros de tipo arreglo Hemos visto que al pasar un arreglo como parámetro, se pasa la dirección de

memoria del inicio del arreglo y por lo tanto estamos efectuando un pasaje de parámetros por referencia. Esto implica que cualquier modificación efectuada en

uno o más elementos del arreglo durante la ejecución de una función, implicará

la automática modificación del arreglo utilizado como parámetro actual o de

llamada. Para evitar que un arreglo sea modificado al pasarlo como parámetro, debe

utilizarse el modificador const precediendo al parámetro formal en el prototipo de la función. Observemos las dos funciones siguientes: void permite_cambiar( int lista[], int n); { ...... lista[3]= 255; //modifica el parámetro de llamada .....

Page 8: Guia 09 (Arrays y Structs)

Unidad 9 8

Ingeniería Informática � Fundamentos de Programación 2008

} void no_permite_cambiar(const int lista[], int n); { ...... lista[10]= 320; //error de compilación ..... } En la primer función, el cambio efectuado en lista[3] se prodcirá simultáneamente el arreglo que se utilice como parámetro para llamar a esta

función. La segunda función producirá un error de compilación, pues se establece que el parámetro lista[]debe permanecer constante.

Estructuras. El tipo struct.

Un arreglo es una estructura de datos homogénea, es decir solo admite una

colección de elementos de igual tipo. A menudo se requiere organizar los datos de una entidad en una estructura, pero admitiendo información de diferente naturaleza (tipo). C++ dispone para este caso del tipo struct.

Un struct en C++ es una colección de componentes, los cuales pueden ser de diferente tipo. Cada componente o miembro debe declararse individualmente. Su sintaxis general es la siguiente: 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 apellido nombres Dni Edad

Cant_materias Los miembros individuales de una estructura pueden ser de tipos simples, arrays, punteros e inclusive struct. En cuanto a los nombres de estos miembros o componentes deben ser diferentes, pero pueden coincidir con el identificador de alguna otra variable definida fuera de dicha estructura. No se puede inicializar un miembro al definir la estructura. Al definir una estructura estamos planteando el esquema de la composición pero

sin definir ninguna variable en particular. Para declarar variables de tipo struct se debe indicar lo siguiente:

struct ficha x,y; // x e y se declaran de tipo ficha

struct ficha( char *apellido; char *nombres; long dni; int edad; int cant_materias; };

Page 9: Guia 09 (Arrays y Structs)

Unidad 9 9

Ingeniería Informática � Fundamentos de Programación 2008

Se puede combinar la definición de la composición de la estructura con la

declaración de las variables y con su inicialización: struct ficha(

char *apellido; char *nombres; long dni; int edad;

int cant_materias; } x =(�Lopez�, �Gerardo�, 24567890, 21, 11);

En este ejemplo, ficha es el nombre de la estructura, x la variable de tipo ficha y los datos especificados entre { } los valores iniciales de los miembros apellido, nombres, dni, edad, cant_materias. 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; };

struct ficha z[5] =( {�Lopez�,�Gerardo�,24567890, 21, 11}, {"Giménez","Ana",25689901,20), {"Zapata","Andrés", 26701231,19,8}, {"Farías","Marina",23199870,22,15}, {"Martino","Manuel",24500654,21,10} }

En el caso anterior se declara e inicializa un arreglo z de 5 elementos de tipo ficha. Para mostrar el miembro dni del tercer elemento del arreglo debemos escribir:

cout<<z[2].dni;

Para cambiar el miembro edad a 22 en el 4to elemento del arreglo z debemos escribir:

z[3].edad=22;

Para leer los apellidos, nombres y dni en modo consola:

for (int i=0; i<5; i++) { cin.getline( z[i].apellido,15); cin.getline( z[i].nombres,20 ); cin>>z[i].dni; }

Para mostrar un listado con los miembros apelido y dni del arreglo z, se codifica de la siguiente forma:

for (int i=0; i<5; i++) { cout<<z[i].apellido<<" "<<z[i].dni<<endl; }

Page 10: Guia 09 (Arrays y Structs)

Unidad 9 10

Ingeniería Informática � Fundamentos de Programación 2008

Procesamiento de una variable struct Para procesar la información relacionada a una estructura podemos operar con

sus miembros individualmente o en ocasiones con la estructura completa. Para acceder a un miembro individual debemos utilizar el identificador de la variable struct, un punto de separación y el nombre del miembro componente.

variable.miembro

Considere el siguiente código de ejemplo.

1. #include <iostream.h> 2. //-------------------------------------------------------- 3. typedef struct{ 4. char ape[15]; 5. char nom[20]; 6. long dni; 7. } registro;

//--------------------------------------------------------- 8. int main( ) 9. { 10. registro f,z; 11. cin.getline(f.ape,15); 12. cin.getline(f.nom,20); 13. cin>>f.dni; 14. z=f; 15. cout<<z.ape<<" "<<z.nom<<"---DNI:"<<z.dni<<endl; 16. return 0; 17. }

Observe en la línea 10 la declaración de las variables struct f y z. Las líneas

11,12 y 13 permiten asignar datos ingresando los valores de los miembros en modo consola. En la línea 14 se asigna la variable struct completa f a una

variable de igual tipo z. En 15 se muestran los miembros de z.

Tipos definidos por el usuario: typedef Es posible en C++ identificar a tipos existentes o estructuras de datos con nombres y tratarlos como si fueran nuevos tipos de datos. Entonces, las variables o funciones podrán declararse en base a estos nuevos nombres que representan tipos de datos de C++. Estos tipos de datos definidos por el usuario no tiene la importancia que revisten en otros lenguajes (Pascal por ejemplo). Para asignar un nombre correspondiente a una definición de tipoy en C++ debemos empelar la palabra reservada typedef. Veamos algunos ejemplos:

typedef unsigned char byte; /*se le da el alias byte a los char sin signo */ typedef int tabla[50][12]; /*definición del nombre tabla como matriz de 50x12 enteros */ typedef struct {

char *apellido; char *nombres; long dni; int edad;

Page 11: Guia 09 (Arrays y Structs)

Unidad 9 11

Ingeniería Informática � Fundamentos de Programación 2008

int cant_materias; } ficha // definición del tipo ficha como estructura

En base a las definiciones de tipo anteriores so válidas las siguientes declaraciones:

byte b; ficha x,y[200]; tabla m,t; 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.

Page 12: Guia 09 (Arrays y Structs)

Unidad 9 12

Ingeniería Informática � Fundamentos de Programación 2008

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

enteros entre 1000 y 1500 y mostrarlo en el display de video. Luego ingresar dos valores en las variables m y p. El valor m

debe ser insertado en la posición p del arreglo. Mostrar el vector modificado. 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:

..... void main () coinst N=120; gen_array(a,1000,1500,N); cout<<�Valor a insertar:�; cin>>m>>p; insertar(a,N,m,p); .... }

Page 13: Guia 09 (Arrays y Structs)

Unidad 9 13

Ingeniería Informática � Fundamentos de Programación 2008

Mx x x xn

N

1 2 3 ........

DSx m x m xn m

N

21 22 2( ) ( ) ........ ( )

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.

Page 14: Guia 09 (Arrays y Structs)

Unidad 9 14

Ingeniería Informática � Fundamentos de Programación 2008

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.

Page 15: Guia 09 (Arrays y Structs)

Unidad 9 15

Ingeniería Informática � Fundamentos de Programación 2008

Cuestionario 9.1 ¿Qué tipos de datos se admiten como índices de una estructura de tipo

array en C++?

9.2 ¿Cómo se indica en C++ la dimensión de un arreglo al pasarlo como parámetro en la llamada de una función?

9.3 ¿Si un arreglo es pasado como parámetro a una función, y es modificado

dentro de esta. ¿Qué ocurre con el arreglo empleado en la llamada de la

función?

9.4 ¿Cuántos bytes ocupan en memoria los siguientes arreglos declarados como sigue?. Nota: los datos int y float ocupan 4 bytes. a) int x[]={12,56,78} b) char a[]; c) float nuevo[10]={2.34, 4.51, 9.02};

9.5 Es posible organizar un arreglo bidimensional en un arreglo lineal. Si responde por sí ¿cómo ubica a cada elemento?.

9.6 ¿Los arreglos ocupan siempre la misma cantidad de memoria durante la

ejecución de un programa ?

9.7 ¿Qué ocurre si accede a un elemento de un arreglo que no fue inicializado todavía?

9.8 ¿Es posible declarar un struct dentro de otro struct? Si responde por sí

proponga un ejemplo.

9.9 ¿Qué diferencia encuentra entre un struct y un array? ¿Cuándo conviene

emplear cada uno?

9.10 ¿Puede una función devolver un struct? ¿Y devolver un arreglo? Si

responde por sí proponga un ejemplo en cada caso.

9.11 ¿Es posible pasar por valor un arreglo a una función? Explique.