martes, 26 de enero de 2016

LA CONSTRUCCIÓN DE VECTORES, MATRICES Y PUNTEROS EN C++

Estimados lectores y fans, les pido disculpas por este humilde y sencillo post, se que este tutorial es una humillación a su inteligencia y profesionalismo, pero comprendan que esto va dedicado a personas que como yo recién 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 de la U y mucho también lo aprendí por cuenta propia. Así que agradecimientos al teacher Patricio del cual aprendí muchísimo. Una vez más a ustedes y a los tantos miles de seguidores que me leen a diario las disculpas del caso.
Vamos ir avanzando de a pocos así que no se preocupen y desesperen porfavor, paciencia. La idea es que esta sección crezca con su ayuda, feedback y motivación. Luego vamos a ver ejemplos con objetos, clases, sobrecarga de operadores, métodos de búsqueda, màs ordenación, punteros, listas, pilas, colas, templates… por ahora sigo practicando y haciendo simples cosas con este lenguaje.

VECTORES

Un vector, también 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 despues de otro. A este grupo de elementos se les identifica por un mismo nombre y la posición en la que se encuentran. La primera posición del array es la posición 0.
Podríamos 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 sintaxix: Tipo nombre[tamanyo];
Ejm:
1
2
3
int a[5]; // Vector de 5 enteros
float b[5]; // vector de 5 flotantes
Producto product[5]; // vector de 5 objetos de tipo Producto
Podríamos también inicializar el vector en la declaración:
1
2
3
int a[] = {5, 15, 20, 25, 30};
float b[] = {10.5, 20.5, 30.5, 12.5, 50.5}
Producto product[] = {celular, calculadora, camara, ipod, usb}
Como hay 5 elementos en cada array, automáticamente 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 tamaño del vector ni tampoco inicializé sus elementos.
Asigno valores a los elementos de un vector indicando su posición:
1
2
int a[4] = 30; // le asigno el valor 30 a la posición 4 del vector.
product[2].setPrecio(300) // le asigno un precio de 300 al producto en la posición 2.
Obviamente el método setPrecio() debe de estar implementado. Para llenar, recorrer e imprimir un vector podemos utilizar un bucle for:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main()
{
  int dim;
  cout << "Ingresa la dimension del vector" << endl;
  cin >> dim; // Supongamos que ingrese 10
  int vector[dim]; // mi vector es de tamanyo 10
  for(int i = 0; i < dim; i++){
    vector[i] = i * 10;
    cout << vector[i] << endl;
  }
  return 0;
}



MATRICES

Una matriz es un vector de vectores o un también llamado array bidimensional. La manera de declarar una matriz es C++ es similar a un vector:
1
int matrix[rows][cols];
int es el tipo de dato, matrix es el nombre del todo el conjunto de datos y debo de especificar el numero de filas y columnas.
Las matrices también 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 definición lo indica, un vector de vectores, es decir, los vectores están uno detrás del otro juntos.
La forma de acceder a los elementos de la matriz es utilizando su nombre e indicando los 2 subíndices 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. Bueno y para recorrer una matriz podemos usar igualmente un bucle. En este caso usando 2 for:
1
2
3
4
5
for(int i = 0; i < rows; i++) {
  for(int j = 0; j < cols; j++) {
    matrix[i][j] = i % j;
  }
}

PUNTEROS

El valor de todas las variales que manejamos en nuestros programas se almacenan en memoria y tienen una dirección. Un puntero es una variable especial que apunta a la dirección de memoria de una variable.
El puntero tiene a su vez su propia dirección. Todas estas direcciones tienen un formato hexadecimal.
Los punteros son herramientas muy poderosas con muchas utilidades y enormes ventajas como veremos más adelante. A grandes rasgos, un puntero me permite desplazarme en la memoria, apuntar, redireccionar a ciertas variables, funciones, métodos, objetos, etc sin necesidad de mover grandes bloques de datos, lo cual nos ahorra muchísimo el consumo de memoria en los programas.
Un puntero se debe declarar de acuerdo al tipo de dato al que apunta. Ejem:
1
2
3
int *var; // un puntero que puede apuntar a cualquier variable de tipo entero.
char *u;  // puntero de tipo char
Persona *per; // puntero de tipo persona
Para determinar,asignar la dirección de una variable en c++, se usa el operador & y para obtener el contenido de un puntero utilizamos el operador * Ejem:
1
2
3
4
5
6
7
int a; // entero
int *b; // puntero a entero
a = 20; // a tiene 20
b = &a; // asigno la dirección de a al puntero b
cout << b << endl; // imprime la dirección de memoria de a;
cout << *b; // imprime 20, osea el contenido de a
Ahora analicemos las siguientes instrucciones y veamos como las variables van cambiando de valor en tiempo de ejecución:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
using namespace std;
int main()
{
    int a;
    int b;
    cout << "Ingresa el valor de a: ";
    cin >> a;
    cout << endl;
    cout << "Ingresa el valor de b: ";
    cin >> b;
    cout << endl;
    // Punteros de tipo entero
    int *p;
    int *p2;
    cout << "Antes" << endl;
    cout << "Variable a = " << a << endl;
    cout << "Direccion de a = " << &a << endl << endl;
    cout << "Variable b = " << b << endl;
    cout << "Direccion de b = " << &b << endl << endl;
    // Tiene basura al principio, podria inicializar con *p=0
    cout << "Contenido de p (Basura)= " << *p << endl;
    cout << "Direccion de p = " << &p << endl << endl;
    cout << "Despues" << endl;
    a++;
    p= &a;
    cout << "Contenido de p =  " << *p << endl;
    // p ahora tiene la dirección de b
    p = &b;
    // Le sumo 20 al contenido de p, es decir, estoy incrementando el valor de b
    *p +=20;
    cout << "Variable a = " << a << endl;
    cout << "Variable b = " << b << endl << endl;
    // p ahora tiene la dirección de a
    p=&a;
    // Contenido de p es igual al contenido de a * 5
    *p = a * 5;
    cout << "Contenido de p = " << *p << endl;
    cout << "Variable a = " << a << endl << endl;
    // Tiene basura al principio, podria inicializar con *p2=0
    cout << "Contenido de p2 (Basura) = " << *p2 << endl;
    cout << "Direccion de p2 = " << &p2 << endl << endl;
    // El contenido de p es asignado al contenido de p2
    p2 = p;
    // Incremento 15 al contenido de p2
    *p2 += 15;
    cout << "Contenido de p2 = " << *p2 << endl;
    // p apunta a otra dirección de memoria,se desplaza 4 bytes en memoria
    p++;
    // El contenido de esa nueva dirección
    cout << "Contenido de p (Basura) = " << *p << endl;
    return 0;
}





PARA VER EL FUNCIONAMIENTO DEL PROGRAMA DE EJEMPLO, DIRIGIRSE A ESTE ENLACE DONDE COPIE Y PEGUE EL EJEMPLO .

http://cpp.sh/


FUENTE DE CONSULTA
  • https://ronnyml.wordpress.com/2009/07/04/vectores-matrices-y-punteros-en-c/
  • https://www.programarya.com/Cursos/C++/Estructuras-de-Datos/Matrices
  • https://msdn.microsoft.com/es-es/library/7wkxxx2e.aspx

No hay comentarios:

Publicar un comentario