Está en la página 1de 7

Elaborado por: Tsu Miguel Ortega - 10569471 Vectores, Matrices y Punteros en c++ Mini-tutorial bsico dedicado a personas que

como yo recin empiezan con sus primeros pininos en C++. Espero de verdad le sea til a alguien. Escribir todo esto, me cost una noche entera y mucho caf. Parte de los conceptos aqu los aprend en clases y mucho tambin lo aprend por cuenta propia. As que agradecimientos a la teacher Ingris de la cual aprend muchsimo. Una vez ms a ustedes y las disculpas del caso. Vamos ir avanzando de a pocos as que no se preocupen y desesperen por favor, paciencia. La idea es que esta seccin crezca con su ayuda, feedback y motivacin. Luego vamos a ver ejemplos con objetos, clases, sobrecarga de operadores, mtodos de bsqueda, ms ordenacin, punteros, listas, pilas, colas, templetes por ahora sigo practicando y haciendo simples cosas con este lenguaje. Los cdigos los compil con g++, el compilador de GNU. VECTORES Un vector, tambin llamado array(arreglo) unidimensional, es una estructura de datos que permite agrupar elementos del mismo tipo y almacenarlos en un solo bloque de memoria juntos, uno despus de otro. A este grupo de elementos se les identifica por un mismo nombre y la posicin en la que se encuentran. La primera posicin del array es la posicin 0. Podramos agrupar en un array una serie de elementos de tipo enteros, flotantes, caracteres, objetos, etc. Crear un vector en c++ es sencillo, seguimos la siguiente sintaxis: Tipo nombre [tamao]; Ejm: 1 int a[5];//Vector de 5 enteros 2 float b[5];//vector de 5 flotantes 3 Producto product[5];//vector de 5 objetos de tipo Producto Podramos tambin inicializar el vector en la declaracin: 1 int a[] = {5,15,20,25,30}; 2 float b[] = {10.5,20.5,30.5,12.5,50.5} 3 Producto product[] = {celular,calculadora,camara,ipod,usb} Como hay 5 elementos en cada array, automticamente se le asignar 5 espacios de memoria a cada vector. Pero si trato de crear el vector de la forma int a[]; el compilador mostrar un error, porque no indiqu el tamao del vector ni tampoco inicialic sus elementos. Asigno valores a los elementos de un vector indicando su posicin: int a[4] = 30; // le asigno el valor 30 a la posicin 4 del vector, es decir, al 5to 1 elemento. 2 product[2].setPrecio(300) // le asigno un precio de 300 al producto en la posicin 2, o sea al tercer elemento. Obviamente el mtodo setPrecio() debe de estar implementado. Para llenar, recorrer e imprimir un vector podemos utilizar un bucle for: 1 2 #include <iostream> using namespace std;

Elaborado por: Tsu Miguel Ortega - 10569471 3 4 int main() 5 { 6 int dim; 7 cout << "Ingresa la dimensin del vector" << endl; 8 cin >> dim; // Supongamos que ingrese 10 9 int vector[dim]; // mi vector es de tamao 10 10 11 for(int i=0;i < dim;i++){ 12 vector[i] = i * 10; 13 cout << vector[i] << " "; 14 } 15 16 return 0; 17 } La salida del programa mostrar: 0 10 20 30 40 50 60 70 80 90 Fcil verdad? Bien ahora creen 2 o ms vectores y empiecen a hacer funciones bsicas como sumar, restar, buscar, ordenar, moda, etc que ayudan mucho a ir desarrollando la lgica. No vale copiar y pegar, mejor es practicar, practicar y practicar. Aqu una funcin simple para sumar 2 vectores a y b y poner el resultado en un tercer vector c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <iostream> using namespace std; void sumar(int a[], int b[], int c[],int dim){ for (int i=0; i<dim; i++) { c[i]=a[i] + b[i]; } } void imprimir(int v[],int dim) { for(int i=0;i<dim;i++){ cout << v[i] << " "; } cout << endl << endl; } int main() { int dim; cout << "Ingresa la dimensin" << endl; cin >> dim; int a[dim]; int b[dim]; int c[dim];

Elaborado por: Tsu Miguel Ortega - 10569471 27 28 for(int i=0;i<dim;i++){ 29 a[i] = i * 10; 30 b[i] = i * 5; 31 } 32 33 cout << "Vector A " << endl; 34 imprimir(a,dim); 35 36 cout << "Vector B " << endl; 37 imprimir(b,dim); 38 39 sumar(a,b,c,dim); 40 cout << "Vector C " << endl; 41 42 imprimir(c,dim); 43 return 0; 44 } Este programa me botara (si ingreso una dimensin de 10): Vector 0 10 20 30 40 50 60 70 80 90 VECTOR 0 5 10 15 20 25 30 35 40 45 VECTOR 0 15 30 45 60 75 90 105 120 135 Entonces para tomar en cuenta: A B C

Todo vector debe tener definido un tipo de dato. Todo vector necesita de una dimensin o tamao. El cdigo de arriba se puede mejorar muchsimo con objetos y clases, este es solo un pequeo ejemplo. MATRICES Una matriz es un vector de vectores o un tambin llamado array bidimensional. La manera de declarar una matriz es c++ es similar a un vector: 1 int matriz[fils][cols]; int es el tipo de dato, matriz es el nombre del todo el conjunto de datos y debo de especificar el nmero de filas y columnas. Las matrices tambin pueden ser de distintos tipos de datos como char, float, double,etc. Las matrices en c++ se almacenan al igual que los vectores en posiciones consecutivas de memoria. Usualmente uno se hace la idea que una matriz es como un tablero. Pero internamente el manejo es como su definicin lo indica, un vector de vectores, es decir, los vectores estn uno detrs del otro juntos. La forma de acceder a los elementos de la matriz es utilizando su nombre e indicando los 2 subndices que van en los corchetes. Si Coloco int matriz [2][3]=10; //estoy asignando al cuarto elemento de la tercera fila el valor 10. No olvidar que tanto filas como columnas se enumeran a partir de 0.

Elaborado por: Tsu Miguel Ortega - 10569471 Bueno y para recorrer una matriz podemos usar igualmente un bucle. En este caso 2 for 1 for(int i=0;i<fils;i++){ 2 for(int j=0;j<cols;j++){ 3 matriz[i][j] = i % j; 4 } 5 } PUNTEROS El valor de todas las variables que manejamos en nuestros programas se almacenan en memoria y tienen una direccin. Un puntero es una variable especial que apunta a la direccin de memoria de una variable. El puntero tiene a su vez su propia direccin. Todas estas direcciones tienen un formato hexadecimal. Los punteros son herramientas muy poderosas con muchas utilidades y enormes ventajas como veremos ms adelante. A grandes rasgos, un puntero me permite desplazarme en la memoria, apuntar, redireccionar a ciertas variables, funciones, mtodos, objetos sin necesidad de mover grandes bloques de datos, lo cual nos ahorra muchsimo el consumo de memoria en los programas. Un puntero se debe declarar de acuerdo al tipo de dato al que apunta. Ejm: int *var; //Un puntero llamado var que podr apuntar a cualquier 1 variable de tipo entero. 2 char *u;//puntero de tipo char 3 Persona *per;//puntero de tipo persona Para determinar, asignar la direccin de una variable en c++, se usa el operador & y para obtener el contenido de un puntero utilizamos el operador * Ejm: 1 int a;//entero 2 int *b;//puntero a entero 3 a = 20;//a tiene 20 4 b=&a;//asigno la direccin de a al puntero b 5 6 cout << b << endl; // imprima la direccin de memoria de a; 7 cout << *b;// imprimir 20, sea el contenido de a Ahora analicemos las siguientes instrucciones y veamos como las variables van cambiando de valor en tiempo de ejecucin: 1 #include <iostream> 2 using namespace std; 3 int main () { 4 int a=10; 5 int b=20; 6 int *p,*p2;//punteros de tipo entero 7 8 cout << "ANTES" << endl; 9 cout << "Variable a = " << a << endl; 10

Elaborado por: Tsu Miguel Ortega - 10569471 11 cout << "Direccin de a = " << &a << endl << endl; 12 13 cout << "Variable b = " << b << endl; 14 cout << "Direccin de b = " << &b << endl << endl; 15 16 cout << "Contenido de p (BASURA)= " << *p << endl;//tiene basura al principio, 17 podria inicializar con *p=0 18 cout << "Direccin de p = " << &p << endl << endl; 19 20 cout << "DESPUES" << endl; 21 a++;//incremento a 22 p= &a; //p ahora tiene a la direccin de a 23 24 cout << "Contenido de p = " << *p << endl; 25 26 p = &b;//p ahora tiene la direccin de b 27 *p +=20; // le sumo 20 al contenido de p, es decir, estoy incrementando el valor de b 28 29 cout << "Variable a = " << a << endl; 30 cout << "Variable b = " << b << endl << endl; 31 32 p=&a;//p ahora tiene la direccin de a 33 *p = a * 5;//contenido de p es igual al contenido de a * 5 34 35 cout << "Contenido de p = " << *p << endl; 36 cout << "Variable a = " << a << endl << endl; 37 38 cout << "Contenido de p2 (BASURA) = " << *p2 << endl;//tiene basura al principio, 39 podria inicializar con *p2=0 40 cout << "Direccin de p2 = " << &p2 << endl << endl; 41 42 p2 = p;//el contenido de p es asignado al contenido de p2 43 *p2 +=15;//incremento 15 al contenido de p2 44 45 cout << "Contenido de p2 = " << *p2 << endl;//igual al contenido de p 46 p++;//p apunta a otra direccin de memoria, se desplaza 4 bytes en memoria 47 cout << "Contenido de p (BASURA) = " << *p << endl;//el contenido de esa nueva 48 direccin return 0; } La salida del programa: ANTES Variable a = 10 Direccin de a = 0x22ff74 Variable b = 2 Direccin de b = 0x22ff70 Contenido de p (BASURA)= -1017291943 Direccin de p = 0x22ff6c

Elaborado por: Tsu Miguel Ortega - 10569471 DESPUES Contenido de p = 11 Variable a = 11 Variable b = 40 Contenido de p = 55 Variable a = 55 Contenido de p2 (BASURA) = 2293680 Direccin de p2 = 0x22ff68 Contenido de p2 = 70 Contenido de p (BASURA) = 2293680 El contenido de p y p2 al principio es basura porque no tienen ningn valor asignado aun. Podramos asignar el valor NULL a un puntero para luego posteriormente en algn problema que se me presente saber el estado del puntero y saber si contiene algo o no, as: int *p= NULL; ARITMTICA DE PUNTEROS En las ltimas sentencias del programa anterior: p++; cout << *p; Pueden visualizar que estoy incrementando el puntero p en 1. Esto quiere decir que el puntero se desplazara 4 bytes en memoria (en este caso por ser entero) y entonces apuntara a otra direccin. Por eso es que el nuevo contenido de p es basura o bueno el contenido de lo que tiene esa nueva direccin a la que apunta. Supongamos que definir un entero y puntero de tipo char: 1 char c; 2 char *d; 3 4 d= &c;//asigno la direccin de c a d 5 c='u';//asigno el valor u a mi variable c 6 c--;//desplazo una posicin a c 7 cout << *d;// No Imprimir u porque fjense que desplac c en sentido negativo 1 byte (los char ocupan a 1 byte). Es decir, que si d estaba apuntado a una direccin como por ejemplo 0x22ff99, despus del c estar apuntando a algo como 0x22ff98 Para tomar en cuenta cosas que no puedo hacer con punteros: 1 2 3 4 5 6 7 8 9 int a=15; int *p; double *q; void *r; p = a; //No puedo hacer esto porque estoy asignando una variable a un puntero y un puntero es una direccin. p = &50; // 50 es un valor constante en este caso y no una variable, por lo tanto no

Elaborado por: Tsu Miguel Ortega - 10569471 10 tiene direccin 11 p = &(a+1); //una expresin no tiene direccin 12 p = 30;//igual que el primer error, 30 es un entero. &a = p;//no puedo cambiar la direccin de una variable p = q;//p es puntero de tipo entero y q de tipo double Un puntero de tipo void, es un puntero al cual le podemos asignar cualquier tipo de puntero. Por lo tanto si podramos hacer esto: r = p; VECTORES Y PUNTEROS Cuando declaramos un vector int v[10];El nombre del vector, o sea v, es un puntero al primer elemento del vector, es decir a v[0].Entonces como un vector es un puntero al primer elemento del mismo, tambin podramos hacer aritmtica de punteros con el vector. (v+1) ;//apuntara a v[1]; 1 *(v+5);//me refiero al contenido de v[5] 2 3 //Y tambin a los punteros les puedo poner ndices: 4 5 int *p; //puntero de tipo entero 6 p = &v[0];//p apunta a la direccin del vector v[0] o tambin a v. p = v 7 p[8] = 80; //le asigno el valor 80 al puntero en la posicin 8, es decir a 8 v[8]

También podría gustarte