Guia 09 (Arrays y Structs)

March 18, 2018 | Author: skilltik | Category: Array Data Structure, C++, Matrix (Mathematics), Computer Program, Data


Comments



Description

Universidad Nacional del Litoral Facultad de Ingeniería y Ciencias Hídricas Departamento de InformáticaFUNDAMENTOS 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 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.     Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 3 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: Nro. de columnas de la matriz 0 0 1 2 3 4 5.34 1.55 6.87 3.21 4.04 1 6.71 1.16 3.12 5.90 8.00 2 4.22 1.65 6.37 3.24 10.11 3 12.02 11.34 13.00 13.72 13.82 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11 7.92 1.16 3.16 5.98 4.43 Nro. de filas de la matriz Elemento [4][3] de la matriz. Elemento [3][0] de la matriz.  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. i: índice para las filas 1.16 3.12 5.90 8.00 3.24 1.34 10.11 1.65 6.37 3.24 10.11 13.72 34.65 13.82 11.34 13.00 13.72 13.82 3.24 21.11 10.11 3.24 10.11 3.24 10.11 13.72 23.54 13.82 13.72 13.82 13.72 13.82 13.72 14.52 13.82 k: índice para la 3ra dimensión j: índice para columnas 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. Organización en memoria de los arreglos Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 4 Declaración e inicialización de un arreglo 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. Arreglos lineales 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} Para operar con arreglos bidimensionales (matrices) debemos declarar las dos dimensiones de la tabla. Arreglos bidimensionales /*Definición de la matriz mat de 10x6 elementos enteros */ int mat[10][6] // declaración de la matriz de enteros mat Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 5 /* 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[1][0]=78 m[0][1]=34 m[1][1]=90 m[0][2]=56 m[1][2]=100 SI quisiéramos asignarlos por columnas solo deberíamos intercambiar los ciclos for del ejemplo. 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. Dimensión y longitud de un arreglo Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 6 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: Indices enumerados 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 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); leer_arreglo(int arg[]) En el siguiente ejemplo se invoca 2 veces a la función muestra_arreglo( ) pasándole en cada caso un arreglo y su longitud. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 7 // 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 12 41 4 22 6 15 Obsérvese que en el ejemplo se invoca dos veces a la función muestra_arreglo() empleando como argumentos arreglos de diferente dimensión. 10 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. Arreglos multidimesionales void leer_tabla(int t[][10], int num_filas); 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: El modificador const y parámetros de tipo arreglo void permite_cambiar( int lista[], int n); { ...... lista[3]= 255; //modifica el parámetro de llamada ..... Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 8 } 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 struct ficha( char *apellido; char *nombres; long dni; int edad; int 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 Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 9 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. Es posible emplear arreglos como miembros de una composición struct. Pero también podemos definir un arreglo cuyos elementos sean estructuras. Arreglo de structs 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; } Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 10 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. 2. 3. 4. 5. 6. 7. #include <iostream.h> //-------------------------------------------------------typedef struct{ char ape[15]; char nom[20]; long dni; } 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; Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 11 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.            Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 12  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. ..... void main () coinst N=120; gen_array(a,1000,1500,N); cout<<”Valor a insertar:”; cin>>m>>p; insertar(a,N,m,p); .... } 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: Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 13 DS  x1  x 2  x 3 ........  xn N ( x1  m ) 2  ( x 2  m ) 2 ........  ( xn  m ) 2 N M 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. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 14 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 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. opera_complex(complejo c1, compljo c2, char op) Ingeniería Informática – Fundamentos de Programación 2008 Unidad 9 15 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}; Es posible organizar un arreglo bidimensional en un arreglo lineal. Si responde por sí ¿cómo ubica a cada elemento?. 9.5 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. Ingeniería Informática – Fundamentos de Programación 2008
Copyright © 2024 DOKUMEN.SITE Inc.