Sei sulla pagina 1di 15

TRABAJO ARREGLOS, MATRICES Y VECTORES

Presentado a: JECKSON ENRIQUE LOZA ARENAS INSTRUCTOR/INGENIERO DE SISTEMAS

DIEGO ALONSO ORTEGA PICO

UNIDADES TECNOLGICAS DE SANTANDER TECNOLOGA GESTIN EN SUSTEMAS INFORMTICOS BARRANCABERMEJA 2012

TRABAJO ARREGLOS, MATRICES Y VECTORES

DIEGO ALONSO ORTEGA PICO

Nociones bsicas sobre arreglos en lenguaje c++ y operaciones ejecutables con este, Vectores y matrices por sintaxis.

UNIDADES TECNOLOGICAS DE SANTANDER TECNOLOGA GESTIN EN SUSTEMAS INFORMTICOS BARRANCABERMEJA 2012

CONTENIDO

INTRODUCCIN 1.0 Operaciones con Arreglos 1.1.0 Acceso 1.1.1 Asignacin 1.1.2 Iniciacin 1.1.3 Lectura/Escritura 2.0 Definicin de matriz 3.0 Sintaxis 4.0 Acceso a elementos 5.0 Inicializacin CONCLUSIN BIBLIOGRAFA

INTRODUCCIN

Concepto introductorio:

Los vectores son un tipo de contenedores secuenciales; se llama as debido a que su orden es estrictamente lineal, es decir, una posicin tras otra. La clase vector es muy til para trabajar con cierta cantidad de datos desconocidos y arreglos, pues permite manejar dinmicamente objetos en dichos arreglos, pudiendo crearlos de clases y variables expandiendo o contrayendo el arreglo. Teniendo en cuenta que uno de los problemas ms comunes en los diversos sistemas de informacin es el tratamiento o procesamiento de un gran volumen de datos o de informacin. Las variables manejadas hasta ahora no pueden ayudar a resolver este problema. Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares, porque solo permiten almacenar o procesar un dato a la vez. No confundir esto con el tipo de dato o rango de datos que una variable tiene la capacidad de almacenar. Por ejemplo si se quiere almacenar nombre y edad de 15 personas con el mtodo tradicional se ocuparan 30 variables y esto solo es nombre y edad de 15 personas, agreguen ms datos y ms personas y ya es tiempo de empezar a analizar otro tipo de variables. Se ocupan entonces variables que sean capaces de almacenar y manipular conjuntos de datos a la vez.

1.0 Operaciones con Arreglos:


Cuando un array se pasa como argumento de una funcin, no se pasa una copia completa del array, sino solo la direccin del primer elemento del array. Para hacer referencia a la direccin de inicio de un array podemos utilizar cualquiera de estas dos formas (siendo ms habitual la segunda)

Int *P, *Q; P=&array[0]; Q=array; /* Apunta al inicio del array, posicin 0 */ /* Realiza la misma funcin que la lnea de cdigo anterior */

Ejemplo1:

#include <stdio.h> int main() { int vector[7]; int c;

for(c=0;c<=6;c++) { printf("Numero para guardar en vector[%d]: ",c); scanf("%d",&vector[c]); }

for(c=0;c<=6;c++) { printf("\nValor Vector[%d]=%d",c,vector[c]);

} return 0; }

Las principales operaciones que se realizan con un array son: 1.1.0 Acceso: cada elemento de un array se nombra con el identificador del array al que perteneces seguido de su posicin entre corchetes [n-1]. Es decir, si en un array[10], queremos nombrar la 4 posicin, esta sera array[3]. 1.1.1 Asignacin: normalmente para asignar valores a un array utilizamos un bucle for. El ejemplo anterior nos muestra perfectamente el comportamiento y la funcionalidad de este bucle. El ndice del for ha de ser capaz de recorrer todas las casillas del array. 1.1.2 Iniciacin: a un array le podemos dar valores iniciales, para ello se declarara de la siguiente forma: (Donde lista de valores es una lista de constante separadas por comas) Tipo nombre_array[tamao]={lista_valores};

int lista[6]={2,4,6,8,1,5}; int datos[100]={0}; int num[4]={4,5}; // todos se inicializan a 0 // equivale a {4,5,0,0}

Es muy importante que se inicialicen los arrays antes de usarlos, ya que la declaracin slo reserva espacio en memoria para el array declarado, sin asignacin por defecto por parte del sistema. 1.1.3 Lectura/Escritura: la lectura y escritura se realiza componente a componente de la forma habitual, tal como se ha visto en el ejemplo anterior. Aplicacin de Arreglos. Veamos un ejemplo donde un arreglo puede simplificar ms el planteamiento de la solucin de un problema. Supongamos que somos meteorlogos y queremos guardar en la computadora la temperatura que ha hecho cada hora del da. Para darle cierta utilidad al final

calcularemos la media de las temperaturas. Con lo que sabemos hasta ahora sera algo as Ejemplo2:

#include <stdio.h> int main() { /* Declaramos 24 variables, una para cada hora del dia */ int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; int temp17, temp18, temp19, temp20, temp21, temp22, temp23, temp0; int media; /* Ahora tenemos que dar el valor de cada una */ printf( "Temperatura de las 0: " ); scanf( "%i", &temp0 ); printf( "Temperatura de las 1: " ); scanf( "%i", &temp1 ); printf( "Temperatura de las 2: " ); scanf( "%i", &temp2 ); ... printf( "Temperatura de las 23: " ); scanf( "%i", &temp23 ); media = ( temp0 + temp1 + temp2 + temp3 + temp4 + ... + temp23 ) / 24; printf( "\nLa temperatura media es %i\n", media ); }

Los puntos suspensivos son para no tener que escribir todo el cdigo, pero sera repetir las lneas anteriores cambiando la variable por la siguiente Ahora vamos a hacer el programa con arreglos, sustituyendo todas las variables por un conjunto. Observa que todas las variables son del mismo tipo, por lo que pueden agruparse.

Ejemplo3:

#include <stdio.h> int main() { int temp[24]; float media = 0; int hora;

/* Ahora tenemos que dar el valor de cada una */ for( hora=0; hora<24; hora++ ) { printf( "Temperatura de las %i: ", hora ); scanf( "%i", &temp[hora] ); media += temp[hora]; } media = media / 24; printf( "\nLa temperatura media es %f\n", media ); }

La lnea 5 ya contiene a las 24 variables a utilizar y por medio de un for en la lnea 10 recorremos cada uno de sus valores. Se ha utilizado la variable media como un sumador de cada valor y luego para almacenar el resultado dividindolo entre 24.

2.0 Definicin de matriz


Desde el punto de vista del programa, una matriz (array vector) es una zona de almacenamiento contiguo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz. Desde el punto de vista lgico podemos considerarlas como un conjunto de elementos ordenados en fila. As pues, en principio todas las matrices son de una dimensin, la dimensin principal, pero veremos que los elementos de esta fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multi-dimensionales, aunque las ms fciles de "ver" o imaginar son las de dos y tres dimensiones.

3.0 Sintaxis
La declaracin de matrices sigue la siguiente sintaxis: tipoX etiqueta [<expr-const>] tipoX es el tipo de los elementos que sern almacenados en la matriz. Puede ser cualquier type-id vlido a excepcin de void y de funciones (no pueden existir matrices de funciones, pero s de punteros-a-funcin). Etiqueta es el identificador <expr-const>: una expresin cuyo resultado debe ser una constante entera positiva n distinta de cero, que es el nmero de elementos de la matriz. Los elementos estn numerados desde0 hasta n-1. Nota: no confundir el valor n con el hecho de que los elementos estn numerados de 0 a n-1. Por ejemplo, el elemento a[9] es el ltimo de la matriz definida

como: int a. Esta "extraa" ocurrencia es herencia del C clsico y una costumbre muy extendida en la informtica (empezar a contar por el cero); aunque se habita uno a ella rpidamente, la verdad es que resulta un poco extraa al principio. Ejemplos: int a[10]; // declara una matriz de 10 elementos enteros char ch[10] // dem de 10 elementos char char* p[10] // dem de 10 elementos puntero-a-carcter struct St mst[10] // dem de 10 elementos estructuras tipo St Observe en esta ltima sentencia, que los elementos no tienen porqu ser necesariamente tipos simples (reconstruidas en el lenguaje). Tambin pueden ser tipos abstractos. Incluso su declaracin puede realizarse en la misma sentencia que declara la matriz. Por ejemplo: struc St { int orden; char* plato; char* descripc; } mst[10]; Esta sentencia declara una matriz mst de 10 estructuras tipo St; ambas se declaran en la misma sentencia. La exigencia de que el resultado de <expr-const> sea un valor constante, es de la mayor trascendencia para entender las limitaciones de las matrices C++. Significa que el tamao de la matriz debe ser conocida en tiempo de compilacin. Por ejemplo, no es posible algo como: unsigned int size; ... char matriz[size]; // Error!! en su lugar debe hacerse: const unsigned int size = 10; ... char matriz[size]; // Ok. pero entonces es preferible establecer directamente: char matriz[10]; o mejor an: #define ASIZE 10 ... char matriz[ASIZE]; // Ok. // Ok.

En general, cuando se necesitan matrices que cambien de tamao en "runtime", suele recurrirse a crearlas en el montn mediante el operador new que s permite definir su tamao en funcin de una variable. Por ejemplo: unsigned int size; ... char* mptr = new char[size];

// Ok.

En este caso las matrices no son referenciadas directamente, sino a travs de un puntero, y una vez creadas tampoco es posible cambiar su tamao. El recurso utilizado cuando se necesita cambiar este, es crear otra matriz del tamao adecuado; copiar en su caso los miembros de la antigua a la nueva; borrar la antigua (liberar el espacio asignado), y finalmente, asignar el puntero a la nueva matriz. De esta forma la ilusin del usuario es que realmente se ha cambiado el tamao de la matriz, aunque la realidad subyacente sea muy diferente. Otro recurso, utilizado cuando la matriz "puede" crecer pero no se est muy seguro, es crearla con un tamao inicial algo mayor que lo necesario (por ejemplo un 25%). En estos casos se dispone de cierto espacio de reserva antes que sea necesario proceder a un proceso de copia total. No obstante lo anterior, en C-99 s es lcita la declaracin de matrices de longitud variable ("variable length arrays") que es como se conoce a las que pueden definir su tamao en runtime. Es decir, en este entorno estn permitidas declaraciones del tipo unsigned int size; char matriz[size]; // Ok

Como el resto de las variables, la declaracin de matrices puede estar acompaada de los correspondientes especificadores de almacenamiento, aunque por su propia naturaleza, con los actuales procesadores no tiene sentido declararlas variables de registro. Ejemplo: extern a1[]; // L.1: Ok.! static int a2[2]; // Ok.! register char a3[20]; // No tiene sentido!! auto char a4[3]; // Ok.! Nota: por una larga tradicin de C, en algunos compiladores la lnea 1 equivale a extern int a1[], sin embargo en algn compilador puede dar error porque el ANSI C++ prohbe la declaracin de objetos sin la especificacin de tipo.

4.0 Acceso a elementos


Existen dos formas de acceder a los elementos de una matriz: mediante subndices y mediante punteros. En cuanto a la primera, el empleo de subndices es la forma que podemos llamar "cannica". Por ejemplo a[i] representa el elemento i+1avo. Recuerde que la numeracin empieza por 0, de forma que a es en realidad el segundo elemento de elemento de matriz). El acceso a elementos mediante punteros, se detalla en el apartado siguiente. Los elementos de la matriz del primer ejemplo se referencian mediante: a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8] y a[9]

La numeracin de subndices de una matriz de n elementos es de 0 a n-1

En ciertos contextos, el primer declarador de una matriz puede no contener una <expresin> dentro de las llaves, por ejemplo: int array[]; Este tipo de matriz, de tamao indeterminado, resulta aceptable en situaciones donde el tamao no es necesario para reservar espacio, pero siguen siendo necesarias las llaves para indicar que la variable es una matriz. Por ejemplo, una declaracin extern de una matriz no necesita el tamao exacto de la misma; alguna otra declaracin tampoco la necesita, porque el tamao est implcito en el declarador. Por ejemplo: char arr[] = "AEIOU"; // declara matriz de 6 elementos [1] char arr[] = {'A','E','I','O','U'}; // declara matriz de 5 elementos

En otros casos, como en la definicin de parmetros de funciones, no es necesario especificar el tamao de la matriz a referenciada por un puntero. Por ejemplo: int func(char* ptr[]); Este prototipo indica que func recibe como argumento una matriz-de-punteros-acarcter, sin especificar nada sobre su tamao; las llaves [ ] son necesarias para avisar a la funcin que se trata de una matriz de punteros, ya que la expresin: int func(char* ptr); Indicara simplemente puntero-a-carcter. Nota: como una extensin especial del ANSI, C++Builder tambin permite una matriz de tamao indefinido como el miembro final de una estructura. Dicha matriz no incrementa el tamao de la estructura, excepto que puede aadirse relleno para asegurar que la matriz est correctamente alineada. Estas estructuras se utilizan normalmente en asignacin dinmica, y debe aadirse explcitamente el tamao actual de la matriz al tamao de la estructura para la asignacin del espacio.

5.0 Inicializacin
En ocasiones la declaracin puede incluir una inicializacin de la matriz como en los siguientes ejemplos: cons int an[5] = {1, 2, 3, 4, 5}; // L.1: char ak[5] = {'a','e','i','o','u'}; // L.2: int ax[6] = {1,2,3,4}; // L.3: == {1,2,3,4,0,0} char c[2] = {'1','2','3'}; // L.4: Error! char c[2] = "AEIOU"; // L.5: Error! char ac[5] = "AEIOU"; // L.6: Ok.

char ac[6] = "AEIOU"; int ai[] = {1,2,3,4,5}; char as[] = "AEI";

// L.7: == {'A','E','I','O','U','\0'} // L.8: // L.9: == {'a','e','i','\0'}

Cuando el tamao sealado es menor que la lista de inicio se produce un error Si el tamao es mayor, se rellenan los espacios sobrantes con ceros (. Nota: algunos de estos comportamientos son especficos del compilador y pueden variar segn el entorno. Por ejemplo, la asignaci es perfectamente vlida en Borland C++ 5.5 para Windows, mientras que da error en el compilador GNU Cpp para Linux; la razn es que este ltimo considera que una cadena del tipo "AEIOU" incluye implcitamente el carcter "\0" de fin de cadena ( 4.3.4) incluso en estos casos de inicializacin de matrices (lo normal es que el terminador sea considerado cuando se trata de asignacin a punteros). Como puede verse en L.8 y L.9, si se incluye una inicializacin de en la misma sentencia, excepcionalmente puede omitirse el tamao en la declaracin. La razn es que el compilador puede deducir lo contando los elementos de la lista de inicio. Las cinco expresiones que siguen son igualmente vlidas y definen st como matriz de caracteres de 6 elementos (el ltimo elemento de la primera matriz es distinto al resto): char st[] = "AEIOU" // define la matriz "AEIOU\0" char st[6] = "AEIOU\""; char st[6] = {'A','E','I','O','U','\"'}; char st[6] = {'A','E','I','O','U','"'}; char st[6] = {'A','E','I','O','U',34}; Una expresin como: char st[4]= "AEIOU"; produce un error: Too many initializers, en cambio: char st[7]= "AEIOU"; no produce error; el espacio sobrante se llena de nulos (2 posiciones en este caso). Un ejemplo ejecutable con una inicializacin ms compleja #include <iostream> using namespace std; #define DIMENSION ((int) (sizeof mst / sizeof mst [0])) struct St { int orden; char* plato; char* desc; } mst [] = { 1, "Entrada", "Sopa juliana", 2, "Segundo", "Filete empanado", 3, "Postre ", "Tarta al Whisky", }; int main() { // ========== for (int i = 0 ; i < DIMENSION; i++) cout << mst[i].orden << " " << mst[i].plato << " " << mst[i].desc << endl;

return 0; } 1 Entrada Sopa juliana 2 Segundo Filete empanado 3 Postre Tarta al Whisky

C++ no tiene operadores para manejar matrices (ni cadenas de caracteres) como una sola unidad, solo quizs en la inicializacin como hemos visto. Por esta razn, aunque es posible establecer expresiones como: char ac[5]="AEIOU"; sin embargo, las sentencias (asignaciones) segunda y tercera que siguen son ilegales. char ac[5]; // L.1: declaracin. ac[5] = "AEIOU"; // L.2: Ilegal!! ac = "AEIOU"; // L.3: Ilegal!!

La explicacin es que en L.1 se declara ac como array de 5 caracteres; en L.2 el compilador crea una matriz de 6 caracteres "AEIOU", la almacena en algn sitio, e intenta asignar la direccin del primer carcter (un puntero char*) al elemento ac[5] que es (debe ser) un char, para ello debe hacer una conversin de tipo char* a char, operacin ilegal que es sealada por el compilador Las cosas ocurren lo mismo, solo que en ltima instancia, se intenta asignar el puntero char* al nemnico ac. Como veremos en, en la mayora de los casos, ac sera interpretado automticamente por el compilador como la direccin del primer elemento de la matriz, pero en este caso no es as, lo que nos seala el compilador es que en el lado izquierdo (receptor) de la asignacin, debe haber un Lvalue es decir, una direccin de memoria donde comenzar el almacenamiento; direccin que puede ser expresada directamente por un escalar (que represente una direccin de memoria) o una expresin que pueda traducirse a una direccin. En este caso no es lo uno ni lo otro; el compilador interpreta ac simplemente como un nemnico que no tiene Lvalue (zona de almacenamiento). En cambio, las expresiones siguientes son vlidas: char* ac; // L.4: ac = "AEIOU"; // L.5: Ok!! La explicacin, es que aqu L.4 declara ac como puntero a carcter (sin iniciar); en L.5 el compilador crea la cadena de caracteres "AEIOU\0", la almacena en algn sitio como matriz de 6 caracteres constantes, y asigna al puntero ac la direccin del primer elemento de dicha matriz, lo que es perfectamente legal. En ocasiones, una asignacin como la anterior puede estar enmascarada y no ser fcilmente reconocible, con lo que podra interpretarse que la expresin es legal. Por ejemplo, el caso que sigue compila sin error: ... void func (char ac[]) { ac = "AEIOU";

... } La explicacin que en este caso no se produzca error en la asignacin, es que el compilador considera que el argumento ac es un puntero-a-char, con lo que estaramos en los casos. La veracidad de las afirmaciones anteriores puede ponerse de manifiesto con un sencillo programita de prueba: #include <iostream.h> // Prueba de asignacin #include <typeinfo.h> void func(char ar[]) { ar = "AEIOU"; cout << ar << endl; cout << "ar es del tipo: " << typeid(ar).name() << endl; // L.7: } int main(void) { // =============== char arr[5] = {'1','2','3','4','5'}; func(arr); return 0; } Respecto al porqu decimos que declara 6 elementos, y no 5 como parecera lgico, ver "Constantes literales Si se compila como programa C (Borland C++ permite compilar indistintamente en uno u otro lenguaje), produce el error: Nonportable pointer conversin. Las cosas ocurren aproximadamente de la misma manera en muchos otros lenguajes de programacin. Por ejemplo, en Visual Basic (un producto de Microsoft), la declaracin Dim x[10] As Interger, produce una matriz de once elementos numerados del 0 al 10 (no de diez numerados del 0 al 9 como su homloga en C++). La costumbre de empezar a contar desde cero, que ha trascendido desde C a C++ y a otros lenguajes de programacin, ha llevado a algn autor a afirmar que "Los ordenadores empiezan a contar desde cero" Refirindonos a estas "costumbres informticas" y aunque no sea de aplicacin a los ndices de matrices C++, podemos aadir que en cuestin de ndices, tambin es costumbre que nmeros negativos se refieran a posiciones desde el final. As -1 sera el ltimo elemento, -2 el penltimo. Etc. Seguramente el lector se encontrar con esta convencin en multitud de ocasiones.

CONCLUSION

Potrebbero piacerti anche