Guia 09 (Arrays y Structs)
Click here to load reader
Transcript of 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
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.
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.
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
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.
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.
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 .....
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; };
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; }
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;
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.
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); .... }
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.
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.
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.