Sie sind auf Seite 1von 16

5.

5.1. Definicin de una tabla y acceso a los datos


Una tabla, vector, matriz o array (que algunos autores traducen por arreglo) es
un conjunto de elementos, todos los cuales son del mismo tipo. Estos elementos
tendrn todos el mismo nombre, y ocuparn un espacio contiguo en la memoria.
Por ejemplo, si queremos definir un grupo de 4 nmeros enteros, usaramos
int ejemplo[4];

Podemos acceder a cada uno de los valores individuales indicando su nombre


(ejemplo) y el nmero de elemento que nos interesa, pero con una precaucin: se
empieza a numerar desde 0, as que en el caso anterior tendramos 4 elementos,
que seran ejemplo[0], ejemplo[1], ejemplo[2], ejemplo[3].
Como ejemplo, vamos a definir un grupo de 5 nmeros enteros y hallar su suma:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.01:
// Primer ejemplo de tablas

#include <iostream>
using namespace std;

int main()
{
int numero[5];

// Un array de 5 numeros enteros

int suma;

// Un entero que guardar la suma

numero[0] = 200;
numero[1] = 150;
numero[2] = 100;
numero[3] = -50;

// Les damos valores

numero[4] = 300;
suma = numero[0] +

// Y hallamos la suma

numero[1] + numero[2] + numero[3] + numero[4];


cout << "Su suma es " << suma;
/* Nota: esta es la forma ms ineficiente e incmoda...
Ya lo iremos mejorando */

return 0;
}

Ejercicios propuestos:

(5.1.1) Un programa que pida al usuario 4 nmeros, los memorice


(utilizando una tabla), calcule su media aritmtica y despus muestre en
pantalla la media y los datos tecleados.

(5.1.2) Un programa que pida al usuario 5 nmeros reales y luego los


muestre en el orden contrario al que se introdujeron.

5.2. Valor inicial de una tabla


Al igual que ocurra con las variables normales, podemos dar valor a los
elementos de una tabla al principio del programa. Ser ms cmodo que dar los
valores uno por uno, como hemos hecho antes. Esta vez los indicaremos todos
entre llaves, separados por comas:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.02:
// Segundo ejemplo de tablas

#include <iostream>
using namespace std;

int main()
{
int numero[5] =

// Un array de 5 nmeros enteros

{200, 150, 100, -50, 300};


int suma;

// Un entero que guardar la suma

suma = numero[0] +

// Y hallamos la suma

numero[1] + numero[2] + numero[3] + numero[4];


cout << "Su suma es " << suma;
/* Nota: esta forma es algo menos engorrosa, pero todava no */
/* est bien hecho.

Lo seguiremos mejorando */

return 0;
}

Ejercicios propuestos:

(5.2.1) Un programa que almacene en una tabla el nmero de das que


tiene cada mes (supondremos que es un ao no bisiesto), pida al usuario
que le indique un mes (1=enero, 12=diciembre) y muestre en pantalla el
nmero de das que tiene ese mes.

(5.2.2) Un programa que almacene en una tabla el nmero de das que


tiene cada mes (ao no bisiesto), pida al usuario que le indique un mes (ej.
2 para febrero) y un da (ej. el da 15) y diga qu nmero de da es dentro
del ao (por ejemplo, el 15 de febrero sera el da nmero 46, el 31 de
diciembre sera el da 365).

5.3. Recorriendo los elementos de una tabla


Es de esperar que exista una forma ms cmoda de acceder a varios elementos
de un array, sin tener siempre que repetirlos todos, como hemos hecho en

suma = numero[0] + numero[1] + numero[2] + numero[3] + numero[4];

El truco consistir en emplear cualquiera de las estructuras repetitivas que ya


hemos visto (while, do..while, for). Lo ms habitual, ya que sabemos cuntos
elementos tiene un array, es usar un "for" para contar, as:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.03:
// Tercer ejemplo de tablas (for)

#include <iostream>
using namespace std;

int main()
{
int numero[5] =

// Un array de 5 nmeros enteros

{200, 150, 100, -50, 300};


int suma;

// Un entero que guardar la suma

int i;

// Para recorrer el array

suma = 0;

// Valor inicial

for (i=0; i<=4; i++)

// Y hallamos la suma

suma += numero[i];

cout << "Su suma es " << suma;


return 0;
}

En este caso, que slo sumbamos 5 nmeros, no hemos escrito mucho menos,
pero si trabajsemos con 100, 500 o 1000 nmeros, la ganancia en comodidad s
que est clara.
Ejercicios propuestos:

(5.3.1) A partir del programa propuesto en 5.2.2, que almacenaba en una


tabla el nmero de das que tiene cada mes, crear otro que pida al usuario
que le indique la fecha, detallando el da (1 al 31) y el mes (1=enero,
12=diciembre), como respuesta muestre en pantalla el nmero de das que
quedan hasta final de ao.

(5.3.2) Crear un programa que pida al usuario 10 nmeros enteros y luego


los muestre en orden inverso (del ltimo al primero), usando "for".

(5.3.3) Crear un programa que pida al usuario 10 nmeros reales, calcule


su media y luego muestre los que estn por encima de la media.

(5.3.4) Un programa que pida al usuario 10 nmeros enteros y calcule (y


muestre) cul es el mayor de ellos.

En fsica se usan mucho los "vectores", para representar magnitudes que no se


pueden expresar slo con un nmero. Por ejemplo, para una temperatura basta
con decir cosas como "tengo 39 grados", pero para una fuerza no basta con decir
que es de 200 N, sino que tambin es importante en qu direccin (y sentido) se
aplica esa fuerza: no tendr el mismo efecto si se aplica en el centro de un cuerpo
o en un extremo, ni si comprime que si estira. Un vector se suele representar a
partir de sus "componentes", que son las coordenadas de su extremo
(suponiendo que comienza en el punto (0,0). Un vector en el plano tendr dos
componentes (x,y) y un vector en el espacio tendr 3 componentes (x,y,z).como
un conjunto de varias coordenadas. As, un programa que pida al usuario las
coordenadas de 2 vectores en el espacio y halle su vector suma sera:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.04:
// Vectores, primer contacto

#include <iostream>
using namespace std;

int main()
{
float vector1[3];
float vector2[3];
float vectorSuma[3];
int i;

// Pedimos los datos del primer vector


for (i=0; i<3; i++)
{
cout << "Introduce la componente " << i
<< " del primer vector: ";
cin >> vector1[i];
}

// Pedimos los datos del segundo vector


for (i=0; i<3; i++)
{
cout << "Introduce la componente " << i
<< " del segundo vector: ";
cin >> vector2[i];
}

// Calculamos la suma
for (i=0; i<3; i++)
vectorSuma[i] = vector1[i] + vector2[i];

// Y mostramos el resultado
cout << "El vector suma es ";
for (i=0; i<3; i++)
cout << vectorSuma[i] << " ";

return 0;

No veremos ms detalles sobre vectores, porque este no es un curso de fsica.


Pero s propondemos algunos ejercicios para que pueda aplicar sus conocimientos
quien ya ha estudiado con anterioridad lo que es un vector...
Ejercicios propuestos sobre vectores:

(5.3.5) Un programa que pida al usuario los datos de dos vectores en el


plano (2 coordenadas) y calcule su diferencia.

(5.3.6) Un programa que pida al usuario las componentes de dos vectores


en el espacio (3 coordenadas) y calcule su producto escalar.

(5.3.7) Un programa que pida al usuario las componentes de dos vectores


en el espacio y calcule su producto vectorial.

(5.3.8) Un programa que pida al usuario dos vectores en el plano (2


coordenadas) y diga si son linealmente dependientes (sus componentes
son proporcionales).

5.4. Tablas bidimensionales


Podemos declarar tablas de dos o ms dimensiones. Por ejemplo, si queremos
guardar datos de dos grupos de alumnos, cada uno de los cuales tiene 20
alumnos, tenemos dos opciones:

Podemos usar int datosAlumnos[40] y entonces debemos recordar que los


20 primeros datos corresponden realmente a un grupo de alumnos y los 20
siguientes a otro grupo.

O bien podemos emplear int datosAlumnos[2][20] y entonces sabemos que


los datos de la forma datosAlumnos[0][i] son los del primer grupo, y los
datosAlumnos[1][i] son los del segundo.

En cualquier caso, si queremos indicar valores iniciales, lo haremos entre llaves,


igual que si fuera una tabla de una nica dimensin. Vamos a verlo con un ejemplo
de su uso:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.05:
// Array de dos dimensiones

#include <iostream>
using namespace std;

int main()
{
int notas[2][10] =
{
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }
};

cout << "La nota del tercer alumno del grupo 1 es "
<< notas[0][2];

return 0;
}

Este tipo de tablas son las que se usan tambin para guardar matrices, cuando
hay que resolver problemas matemticos ms complejos. Por ejemplo, un
programa que pida al usuario los datos de dos matrices de 3x3 y luego muestre su
suma podra ser as:

// Introduccin a C++, Nacho Cabanes


// Ejemplo 05.06
// Matrices, primer contacto

#include <iostream>
using namespace std;

int main()
{
float matriz[2][3][3];
float matrizSuma[3][3];
int m, fila, columna;

// Pedimos los datos de las dos matrices


for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
{
cout << "En la matriz " << m+1
<< ", dime el dato de la fila " << fila+1
<< " y la columna " << columna+1 << ": ";
cin >> matriz[m][fila][columna];
}

// Calculamos la suma
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
matrizSuma[fila][columna] = matriz[0][fila][columna]
+ matriz[1][fila][columna];

// Y mostramos el resultado (puede salir un poco descolocado)


cout << "La matriz suma es " << endl;
for (fila=0; fila<3; fila++)

{
for (columna=0; columna<3; columna++)
cout << matrizSuma[fila][columna] << " ";
cout << endl;
}

return 0;
}

Cuidado: no podemos dar por sentado que los datos de un array tengan valor
inicial 0, sino que pueden contener "basura" (lo que hubiera en cada posicin de
memoria anteriormente), de modo que este programa es incorrecto y puee mostrar
resultados incorrectos:
// Introduccin a C++, Nacho Cabanes
// Ejemplo 05.06b:
// Matrices, lgica errnea (sin dar valor inicial)

#include <iostream>
using namespace std;

int main()
{
float matriz[2][3][3];
float matrizSuma[3][3];
int m, fila, columna;

// Pedimos los datos de las dos matrices


for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
{
cout << "En la matriz " << m+1

<< ", dime el dato de la fila " << fila+1


<< " y la columna " << columna+1 << ": ";
cin >> matriz[m][fila][columna];
}

// Calculamos la suma
for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
matrizSuma[fila][columna] += matriz[m][fila][columna];
// La lnea anterior es errnea: estamos dando por sentado
// que la matriz suma contiene ceros, y quiz no sea as

// Y mostramos el resultado (puede salir un poco descolocado)


cout << "La suma es ";
for (fila=0; fila<3; fila++)
{
for (columna=0; columna<3; columna++)
cout << matrizSuma[fila][columna] << " ";
cout << endl;
}

return 0;
}

5.2 MANEJO ARCHIVOS

5.2 Archivos reales y virtuales

Archivo Virtual y Archivo Real


Un archivo virtual (Fig.5.2.1), es un archivo de uso temporal que es utilizado por los procesos del
sistema mientras se estn ejecutando dichos procesos. Estos archivos se crean durante la
ejecucin de un sistema y los utiliza para el almacenamiento de informacin, intercambio y
organizacin mientras se ejecuta el sistema (Fig. 5.2.2), su tamao es muy variable y terminan al
detener la ejecucin del sistema, muchos de ellos son borrados, por ejemplo, los
archivos *.tmp(Fig. 5.2.3) .
Se le conoce como archivo virtual, aquel que contiene los datos generados por el usuario.

Fig.5.2.1 Archivo virtual

Fig. 5.2.2 Ejecucin del proceso

Fig. 5.2.3 Archivos temporales(*.tmp)


Archivo Real (Fig. 5.2.4) : Es un objeto que contiene programas, datos o cualquier otro elemento.
Un archivo se muestra de manera real, en la informacin del espacio que ocupa en un disco duro o
sistema de almacenamiento, en otras palabras su tamao en bytes.

Fig. 5.2.4 Ejemplos de archivos reales

5.1 Concepto Son los algoritmos y estructuras lgicas utilizadas para poder
acceder a la informacin que tenemos en el disco. Cada uno de los sistemas
operativos crea estas estructuras y logaritmos de diferente manera
independientemente del hardware. El desempeo de nuestro disco duro, la
confiabilidad, seguridad, capacidad de expansin y la compatibilidad, estar en
funcin de estas estructuras lgicas.
Fat 12: Es el sistema de archivos de DOS, y es con el que formateamos los
disquetes. Fue muy utilizado en las primeras PCs.
Fat 16: Este sistema de archivos tena muchas limitaciones, por ejemplo si el
disco duro era mayor de 2 GB, era imposible particionarlos y no usaba nombre
largos en los archivos, solo 8 caracteres. Fat 32: Fue utilizado a partir de 1997,
y pudo ser utilizado en Windows 98, pero a medida que el tamao de los discos
duros se incrementaba, surgieron nuevas limitaciones. Se llam Fat32, por que
utiliza nmeros de 32 bits para representar a los clusters en lugar de los 16 en
los sistemas anteriores. 5.2 Nocin de archivo real y virtual Es un archivo de
uso temporal que es utilizado por los procesos del sistema mientras se estn
ejecutando dichos procesos. Estos archivos se crean durante la ejecucin de un

sistema y los utiliza para el almacenamiento de informacin, intercambio y


organizacin mientras se ejecuta el sistema (Fig. 5.2.2), su tamao es muy
variable y terminan al detener la ejecucin del sistema, muchos de ellos son
borrados, por ejemplo, los archivos *.tmp 5.3 Componentes de un sistema de
archivos Lo conforman todas aquellas rutinas encargadas de administrar todos
los aspectos relacionados con el manejo de Archivos. En UNIX se define un File
System como un sistema de software dedicado a la creacin, destruccin,
organizacin y lectura, escritura y control de acceso de los archivos,
funcionalmente los componentes de un sistema de archivos son lenguajes de
comandos, interpretador de comandos, manejador del almacenamiento
secundario, sistema de entrada y salida y mecanismos de respaldo y
recuperacin. En general, un Sistema de Archivos est compuesto por: Mtodos
De Acceso, Administracin De Archivos, Administracin De Almacenamiento
Secundario, Mecanismos De Integridad. Mtodos De Acceso. Se ocupan de la
manera en que se tendr acceso a la informacin almacenada en el archivo.
Ejemplo: Secuencial, Directo, indexado, etc. Administracin De Archivos. Se
ocupa de ofrecer los mecanismos para almacenar, compartir y asegurar
archivos, as como para hacer referencia a ellos. Administracin De
Almacenamiento Secundario. Se ocupa de asignar espacio para los archivos en
los dispositivos de almacenamiento secundario. En la siguiente figura se
muestra un ejemplo de la administracin de espacio en un disco duro. 5.4
Organizacin lgica y fsica Se refiere a las diferentes maneras en las que
puede ser organizada la informacin de los archivos, as como las diferentes
maneras en que sta puede ser accesada. Dado que hay 2 niveles de visin de
los archivos (fsico y lgico), se puede hablar tambin de 2 aspectos de
organizacin de archivos: Organizacin de archivos lgicos y de archivos
fsicos. Fig. 5.4.1 Organizacin de un sistema de archivos utilizando directorios.
Organizacin lgica. La mayora de las computadoras organizan los archivos en
jerarquas llamadas carpetas, directorios o catlogos. (El concepto es el mismo
independientemente de la terminologa usada.) Cada carpeta puede contener
un nmero arbitrario de archivos, y tambin puede contener otras carpetas.
Las otras carpetas pueden contener todava ms archivos y carpetas, y as
sucesivamente, construyndose un estructura en rbol en la que una carpeta
raz (el nombre vara de una computadora a otra) puede contener cualquier
nmero de niveles de otras carpetas y archivos. A las carpetas se les puede dar
nombre exactamente igual que a los archivos (excepto para la carpeta raz,
que a menudo no tiene nombre). El uso de carpetas hace ms fcil organizar
los archivos de una manera lgica. 5.5 Mecanismos de acceso a los archivos
Existen varios mecanismos para acceder los archivos: Directorios, descriptores
de archivos, mecanismos de control de acceso y procedimientos para abrir y
cerrar archivos. Descriptores de archivos. El descriptor de archivos o bloque de
control de archivos es un bloque de control que contiene informacin que el
sistema necesita para administrar un archivo. Es una estructura muy
dependiente del sistema. Puede incluir la siguiente informacin: Nombre

simblico del archivo. Localizacin del archivo en el almacenamiento


secundario. Organizacin del archivo (mtodo de organizacin y acceso).
Tipo de dispositivo. Datos de control de acceso. Tipo (archivo de datos,
programa objeto, programa fuente, etc.). Disposicin (permanente contra
temporal). Fecha y tiempo de creacin. Fecha de destruccin. Fecha de la
ltima modificacin. Suma de las actividades de acceso (nmero de lecturas,
por ejemplo). Los descriptores de archivos suelen mantenerse en el
almacenamiento secundario; se pasan al almacenamiento primario al abrir el
archivo. El descriptor de archivos es controlado por el sistema de archivos ; el
usuario puede no hacer referencia directa a l. 5.6 Manejo de espacio en
memoria secundaria A diferencia de la Memoria Principal la Memoria
Secundaria , auxiliar, masiva, externa no es tan veloz pero tiene gran
capacidad para almacenar informacin en dispositivos tales como discos,
cintas magnticas, discos pticos. Frecuentemente los datos y programas se
graban en la Memoria Secundaria , de esta forma, cuando se ejecuta varias
veces un programa o se utilicen repetidamente unos datos, no es necesario
darlos de nuevo a travs del dispositivo de entrada. 5.7 Modelo jerrquico El
directorio contiene un conjunto de datos por cada archivo referenciado. Fig.
5.7.1 Ejemplo de directorio jerrquico Una posibilidad es que el directorio
contenga por cada archivo referenciado: El nombre. Sus atributos. Las
direcciones en disco donde se almacenan los datos. Otra posibilidad es que
cada entrada del directorio contenga: El nombre del archivo. Un apuntador a
otra estructura de datos donde se encuentran los atributos y las, direcciones
en disco. 5.8 Mecanismos de recuperacin en caso de falla Recuperacin Los
archivos y directorios se mantienen tanto en memoria principal como en disco,
y debe tener. Se cuidado para que los fallos del sistema no provoquen una
prdida de datos o una incoherencia en los mismos. Comprobacin de
coherencia. Como hemos explicado en la Seccin 11.3, parte de la informacin
de directorios se almacena en la memoria principal (o en cach) para acelerar
el acceso. La informacin de directorios en11a memoria principal est,
generalmente, ms actualizada que la correspondiente informacin en el disco,
porque la informacin de directorios almacenada en cach no se escribe
necesariamente en el disco nada ms producirse la actualizacin. Considere,
entonces, el posible ejemplo de un fallo de la computadora. El contenido de la
cach y de los bferes, as como de las operaciones de E/S que se estuvieran
realizando en ese momento, pueden perderse, y con l se perdern los
cambios realizados en los directorios correspondientes a los archivos abiertos.
Dicho suceso puede dejar el sistema de archivos en un estado incoherente. El
estado real de algunos archivos no ser el que se describe en la estructura de
directorios. Con frecuencia, suele ejecutarse un programa especial durante el
reinicio para comprobar las posibles incoherencias del disco y corregidas.

Das könnte Ihnen auch gefallen