Sunteți pe pagina 1din 15

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

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 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
Nro. de filas 4 4.04 8.00 10.11 13.82 ... ... ... ... 4.43
de la matriz
Elemento [4][3] de
Elemento [3][0] de la matriz.
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.

1.16 1.65 11.34 3.24 13.72


i: índice para 3.12 6.37 13.00 10.11 13.82
las filas 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 k: índice para
1.34 34.65 21.11 23.54 14.52 la 3ra dimensión
10.11 13.82 10.11 13.82 13.82

j: índice para columnas

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.

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


Unidad 9 4

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

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[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.

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


Unidad 9 6

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.

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 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
.....

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 struct ficha(
apellido char *apellido;
nombres char *nombres;
Dni long dni;
int edad;
Edad int cant_materias;
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.

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; }

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. #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;

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 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:

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


Unidad 9 13

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.

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 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.

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};

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.

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

S-ar putea să vă placă și