Herramientas de usuario

Herramientas del sitio


curso-cpp:contenedor-vector

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
curso-cpp:contenedor-vector [2017/02/10 23:26]
santo [Ejercicios]
curso-cpp:contenedor-vector [2017/10/29 19:25] (actual)
santo
Línea 22: Línea 22:
 Por ejemplo, es válido en un programa ((En [[cpp-avanzado:​c++11|C++11]])) declarar vectores de la forma mostrada: Por ejemplo, es válido en un programa ((En [[cpp-avanzado:​c++11|C++11]])) declarar vectores de la forma mostrada:
  
-<​code>​+<​code ​cpp>
 vector<​string>​ v1 = {"​goma",​ "​espuma",​ "​goma",​ "​eva"​};​ vector<​string>​ v1 = {"​goma",​ "​espuma",​ "​goma",​ "​eva"​};​
 vector<​string>​ v2 = {"​a",​ "​b",​ "​c"​};​ vector<​string>​ v2 = {"​a",​ "​b",​ "​c"​};​
Línea 46: Línea 46:
 En estos tres ejemplos, así como en los cinco ejercicios que siguen, siempre que el programa reciba secuencias, supondremos que primero se lee un entero ''​N'',​ con la cantidad de elementos, y luego se leen los elementos de la secuencia en sí. En estos tres ejemplos, así como en los cinco ejercicios que siguen, siempre que el programa reciba secuencias, supondremos que primero se lee un entero ''​N'',​ con la cantidad de elementos, y luego se leen los elementos de la secuencia en sí.
  
-  - <​code>#​include <​iostream>​+  - <​code ​cpp>#​include <​iostream>​
 #include <​vector>​ #include <​vector>​
  
Línea 71: Línea 71:
 } }
 </​code>​ </​code>​
-  - <​code>#​include <​iostream>​+  - <​code ​cpp>#​include <​iostream>​
 #include <​vector>​ #include <​vector>​
  
Línea 95: Línea 95:
 } }
 </​code>​ </​code>​
-  - <​code>#​include <​iostream>​+  - <​code ​cpp>#​include <​iostream>​
 #include <​vector>​ #include <​vector>​
  
Línea 120: Línea 120:
 ==== Ejercicios ==== ==== Ejercicios ====
  
-  - Dada una secuencia de números, determinar cuántas veces aparece cada uno de los números del 1 al 10 en la secuencia. +  - [[http://​juez.oia.unsam.edu.ar/#/​task/​cuenta_numeros/​statement|Dada una secuencia de números, determinar cuántas veces aparece cada uno de los números del 1 al 10 en la secuencia]]
-  - Dada una secuencia de números, determinar cuál es el número que más veces aparece en la secuencia, así como cuántas veces aparece. +  - [[http://​juez.oia.unsam.edu.ar/#/​task/​mas_aparece/​statement|Dada una secuencia de números, determinar cuál es el número que más veces aparece en la secuencia, así como cuántas veces aparece]]
-  - Dada una secuencia de números distintos, determinar cuántos pares de números hay cuya suma sea un múltiplo de 10. +  - [[http://​juez.oia.unsam.edu.ar/#/​task/​cuenta_pares/​statement|Dada una secuencia de números distintos, determinar cuántos pares de números hay cuya suma sea un múltiplo de 10]]
-  - Dada una secuencia de números distintos, determinar cuántos pares de números hay cuya suma sea un número primo. +  - [[http://​juez.oia.unsam.edu.ar/#/​task/​cuenta_primos/​statement|Dada una secuencia de números distintos, determinar cuántos pares de números hay cuya suma sea un número primo]]
-  - Dada una secuencia de números distintos, determinar cuántas ternas (combinaciones de tres) de estos números forman un triángulo (considerando que los números son las longitudes de los lados). Por ejemplo, 2 4 5 son longitudes que forman un triángulo, pero 1 2 5 no (si lo intentamos, primero dibujamos el lado de 5, y luego los lados de 1 y 2 entre los dos son demasiado cortos y "no alcanzan"​ a cerrar un triángulo junto con el lado de 5).+  - [[http://​juez.oia.unsam.edu.ar/#/​task/​cuenta_triangulos/​statement|Dada una secuencia de números distintos, determinar cuántas ternas (combinaciones de tres) de estos números forman un triángulo]] (considerando que los números son las longitudes de los lados). Por ejemplo, 2 4 5 son longitudes que forman un triángulo, pero 1 2 5 no (si lo intentamos, primero dibujamos el lado de 5, y luego los lados de 1 y 2 entre los dos son demasiado cortos y "no alcanzan"​ a cerrar un triángulo junto con el lado de 5).
  
 ===== Modificando el tamaño de un vector ===== ===== Modificando el tamaño de un vector =====
Línea 134: Línea 134:
   * Si v es un vector, con ''​v.resize(nuevoTam)''​ podemos cambiar su tamaño al nuevo valor, que está indicado por ''​nuevoTam''​. Si este valor es más chico que el tamaño actual de ''​v'',​ los elementos sobrantes del final se pierden.   * Si v es un vector, con ''​v.resize(nuevoTam)''​ podemos cambiar su tamaño al nuevo valor, que está indicado por ''​nuevoTam''​. Si este valor es más chico que el tamaño actual de ''​v'',​ los elementos sobrantes del final se pierden.
   * Con ''​v.push_back(e)'',​ **agregamos** el elemento ''​e''​ al final de toda la lista. Por ejemplo si ''​v''​ es un ''​vector<​int>'',​ ''​v.push_back(15)''​ le agrega un 15 al final. El tamaño de un vector aumenta en 1 cuando se hace push_back.   * Con ''​v.push_back(e)'',​ **agregamos** el elemento ''​e''​ al final de toda la lista. Por ejemplo si ''​v''​ es un ''​vector<​int>'',​ ''​v.push_back(15)''​ le agrega un 15 al final. El tamaño de un vector aumenta en 1 cuando se hace push_back.
-  * Con ''​v.pop_back()''​ podemos **borrar** el último elemento de la lista. El tamaño se reduce en 1 al hacer pop_back.+  * Con ''​v.pop_back()''​ podemos **borrar** el último elemento de la lista. El tamaño se reduce en 1 al hacer pop_back. Es por lo tanto una forma más práctica de hacer ''​v.resize(v.size()-1)''​.
  
 ==== Ejercicio ==== ==== Ejercicio ====
  
-    - Se debe leer una secuencia de números positivos que viene de la entrada, pero no sabemos su longitud: la secuencia termina cuando viene un **cero**, que indica que ya no hay que leer más. El programa debe determinar si la secuencia dada tiene repetidos o no.+    - Se debe leer una secuencia de números positivos que viene de la entrada, pero no sabemos su longitud: la secuencia termina cuando viene un **cero**, que indica que ya no hay que leer más. [[http://​juez.oia.unsam.edu.ar/#/​task/​busca_repetidos/​statement|El programa debe determinar si la secuencia dada tiene repetidos o no]].
  
 ===== Sobre el uso de ''​.size()''​ en comparaciones ===== ===== Sobre el uso de ''​.size()''​ en comparaciones =====
Línea 144: Línea 144:
 Si compilamos con [[curso-cpp:​ambiente:​oiax#​configuracion_de_compilacion_con_geany|todos los warnings activados]],​ podremos observar que el compilador genera una advertencia cuando utilizamos ''​.size()''​ en una comparación con enteros. Por ejemplo en un simple recorrido: Si compilamos con [[curso-cpp:​ambiente:​oiax#​configuracion_de_compilacion_con_geany|todos los warnings activados]],​ podremos observar que el compilador genera una advertencia cuando utilizamos ''​.size()''​ en una comparación con enteros. Por ejemplo en un simple recorrido:
  
-<​code>​+<​code ​cpp>
 for (int i = 0; i < v.size(); i++) for (int i = 0; i < v.size(); i++)
     cout << v[i] << endl;     cout << v[i] << endl;
Línea 153: Línea 153:
 Si bien en este ejemplo es relativamente inofensivo, ignorar estas advertencias del compilador puede llevar a **graves errores** en otros casos (por ejemplo, si quisiéramos ignorar el último elemento, y cambiáramos la comparación ''​i < v.size()''​ por ''​i < v.size() - 1'',​ nuestro programa podría colgarse o fallar de manera imprevista). **La solución práctica** a esto es **siempre que usemos ''​.size()''​ en una comparación**,​ rodear a ''​v.size()''​ de ''​int(...)'',​ para indicarle al compilador que queremos que ''​v.size()''​ sea un ''​int''​ "​normal"​. El ejemplo quedaría: Si bien en este ejemplo es relativamente inofensivo, ignorar estas advertencias del compilador puede llevar a **graves errores** en otros casos (por ejemplo, si quisiéramos ignorar el último elemento, y cambiáramos la comparación ''​i < v.size()''​ por ''​i < v.size() - 1'',​ nuestro programa podría colgarse o fallar de manera imprevista). **La solución práctica** a esto es **siempre que usemos ''​.size()''​ en una comparación**,​ rodear a ''​v.size()''​ de ''​int(...)'',​ para indicarle al compilador que queremos que ''​v.size()''​ sea un ''​int''​ "​normal"​. El ejemplo quedaría:
  
-<​code>​+<​code ​cpp>
 for (int i = 0; i < int(v.size());​ i++) for (int i = 0; i < int(v.size());​ i++)
     cout << v[i] << endl;     cout << v[i] << endl;
Línea 166: Línea 166:
 En lugar de hacer por ejemplo: En lugar de hacer por ejemplo:
  
-<​code>​+<​code ​cpp>
 for (int i=0; i<​int(v.size());​ i++) for (int i=0; i<​int(v.size());​ i++)
     cout << v[i] << endl;     cout << v[i] << endl;
Línea 173: Línea 173:
 Podríamos equivalente utilizar el siguiente código: Podríamos equivalente utilizar el siguiente código:
  
-<​code>​+<​code ​cpp>
 for (int x : v) for (int x : v)
     cout << x << endl;     cout << x << endl;
 </​code>​ </​code>​
  
-Al escribir ''​for (int x : v)'',​ directamente ''​x''​ va tomando todos los valores ''​v[i]''​ del ejemplo anterior, es decir, "la iteración se hace sola", lo cual es mucho más cómodo cuando simplemente queremos procesar una vez cada elemento en orden. Cuando queremos trabajar con varios elementos a la vez, generalmente será más cómodo usar la "​iteración clásica"​ que vimos antes.+Al escribir ''​for (int x : v)'',​ directamente ''​x''​ va tomando todos los valores ''​v[i]''​ del ejemplo anterior, es decir, "la iteración se hace sola", lo cual es mucho más cómodo cuando simplemente queremos procesar una vez cada elemento en orden. Cuando queremos trabajar con varios elementos a la vez, generalmente será más cómodo usar la "​iteración clásica"​ que vimos antes (pues queremos tener a mano la variable ''​i''​ que indica la posición actual).
  
 ===== Matrices ===== ===== Matrices =====
Línea 194: Línea 194:
 Hemos visto que podemos usar ''​vector''​ para representar listas de valores, en particular, listas de números. Una manera posible de trabajar con matrices en computación es considerarlas como listas **de filas**: En efecto, si miramos la primera fila del ejemplo anterior, no es más que una lista de 4 números: ''​{1,​2,​5,​8}''​. Por lo tanto, esa primera fila podríamos guardarla en un ''​vector<​int>''​ como los que ya hemos usado: Hemos visto que podemos usar ''​vector''​ para representar listas de valores, en particular, listas de números. Una manera posible de trabajar con matrices en computación es considerarlas como listas **de filas**: En efecto, si miramos la primera fila del ejemplo anterior, no es más que una lista de 4 números: ''​{1,​2,​5,​8}''​. Por lo tanto, esa primera fila podríamos guardarla en un ''​vector<​int>''​ como los que ya hemos usado:
  
-<​code>​+<​code ​cpp>
 vector<​int>​ fila1 = {1,2,5,8}; vector<​int>​ fila1 = {1,2,5,8};
 </​code>​ </​code>​
Línea 200: Línea 200:
 Y lo mismo ocurre con las demás filas: cada una es una lista de 4 elementos: Y lo mismo ocurre con las demás filas: cada una es una lista de 4 elementos:
  
-<​code>​+<​code ​cpp>
 vector<​int>​ fila2 = {9,3,1,5}; vector<​int>​ fila2 = {9,3,1,5};
 vector<​int>​ fila3 = {30,5,3,4}; vector<​int>​ fila3 = {30,5,3,4};
Línea 209: Línea 209:
 El código para guardar la matriz completa queda entonces: El código para guardar la matriz completa queda entonces:
  
-<​code>​+<​code ​cpp>
 vector<​int>​ fila1 = {1,2,5,8}; vector<​int>​ fila1 = {1,2,5,8};
 vector<​int>​ fila2 = {9,3,1,5}; vector<​int>​ fila2 = {9,3,1,5};
Línea 218: Línea 218:
 O incluso, podríamos haber escrito todas las listas directamente sin usar variables intermedias:​ O incluso, podríamos haber escrito todas las listas directamente sin usar variables intermedias:​
  
-<​code>​+<​code ​cpp>
 vector<​vector<​int>>​ matriz = {{1,2,5,8}, {9,3,1,5}, {30,​5,​3,​4}};​ vector<​vector<​int>>​ matriz = {{1,2,5,8}, {9,3,1,5}, {30,​5,​3,​4}};​
 </​code>​ </​code>​
Línea 224: Línea 224:
 Es común en estos casos usar //enters// y espacios para mayor claridad: Es común en estos casos usar //enters// y espacios para mayor claridad:
  
-<​code>​+<​code ​cpp>
 vector<​vector<​int>>​ matriz = { {1,​2,​5,​8}, ​ vector<​vector<​int>>​ matriz = { {1,​2,​5,​8}, ​
                                ​{9,​3,​1,​5}, ​                                ​{9,​3,​1,​5}, ​
Línea 234: Línea 234:
  
 Podemos cambiar el 8 por un 100 haciendo ''​matriz[0][3] = 100''​. Similarmente,​ ''​matriz[1][0] == 9''​ y ''​matriz[1][1] == 3''​. Podemos cambiar el 8 por un 100 haciendo ''​matriz[0][3] = 100''​. Similarmente,​ ''​matriz[1][0] == 9''​ y ''​matriz[1][1] == 3''​.
 +
 +Hemos visto una manera de crear una matriz pequeña manualmente. ¿Cómo podríamos crear una matriz de ''​N''​ filas y ''​M''​ columnas? La siguiente sería una manera basada en las ideas que ya vimos:
 +
 +<code cpp>
 +vector<​vector<​int>>​ matriz(N);
 +for (int i = 0; i < N; i++)
 +    matriz[i].resize(M);​
 +</​code>​
 +
 +Primero creamos ''​matriz'',​ un vector de ''​N''​ elementos, pues la matriz tendrá ''​N''​ filas. Luego recorremos las ''​N''​ filas (por eso hacemos un ''​for'',​ con ''​i''​ variando de ''​0''​ hasta ''​N-1''​),​ y a cada una de ellas le cambiamos el tamaño a ''​M'',​ con el método ''​resize''​ que ya vimos antes.
 +
 +Una forma más práctica de lograr esto (aunque más avanzada de entender) es directamente usar la siguiente línea:
 +
 +<code cpp>
 +vector<​vector<​int>>​ matriz(N, vector<​int>​(M));​
 +</​code>​
 +
 +''​vector<​int>​(M)''​ es una expresión que denota directamente un vector de tamaño ''​M''​. Eso es lo que queremos que sean **cada uno de los N elementos** de la matriz (que es una **lista de filas**). Cuando queríamos crear un vector de ''​N''​ elementos, que todos tengan un cierto valor inicial, indicábamos dos valores entre paréntesis:​ primero la cantidad, y en segundo lugar el **valor**. En este caso, queremos que nuestra matriz tenga ''​N''​ filas, y que **cada una de ellas sea una lista de tamaño M**. Por eso indicamos ''​vector<​int>​(M)''​ como segundo valor entre paréntesis luego de la coma: es el valor que queremos que tome cada elemento de la lista de filas.
  
 Con esta técnica de usar un //vector de vectors// para guardar matrices, ya podemos trabajar con rectángulos de valores (sean letras, números, palabras, etc). Además, al aprender vector y este tipo de técnicas, por primera vez tenemos a nuestra disposición **infinitos** tipos de datos: Antes de conocer vector, solamente conocíamos 4 tipos: ''​int'',​ ''​string'',​ ''​char''​ y ''​bool''​. Ahora que conocemos ''​vector'',​ no tenemos 5 tipos sino infinitos: Pues tenemos ''​vector<​int>'',​ ''​vector<​string>'',​ pero también ''​vector<​vector<​int>>'',​ y ''​vector<​vector<​vector<​int>>>''​ (que sería una lista de matrices de enteros, o lo que es lo mismo, una lista de listas de listas de enteros...) y así podríamos seguir infinitamente. Hemos mostrado el ejemplo de las matrices (o las **listas de listas**) que son por mucho el caso más común. Con esta técnica de usar un //vector de vectors// para guardar matrices, ya podemos trabajar con rectángulos de valores (sean letras, números, palabras, etc). Además, al aprender vector y este tipo de técnicas, por primera vez tenemos a nuestra disposición **infinitos** tipos de datos: Antes de conocer vector, solamente conocíamos 4 tipos: ''​int'',​ ''​string'',​ ''​char''​ y ''​bool''​. Ahora que conocemos ''​vector'',​ no tenemos 5 tipos sino infinitos: Pues tenemos ''​vector<​int>'',​ ''​vector<​string>'',​ pero también ''​vector<​vector<​int>>'',​ y ''​vector<​vector<​vector<​int>>>''​ (que sería una lista de matrices de enteros, o lo que es lo mismo, una lista de listas de listas de enteros...) y así podríamos seguir infinitamente. Hemos mostrado el ejemplo de las matrices (o las **listas de listas**) que son por mucho el caso más común.
Línea 239: Línea 257:
 ==== Ejercicios ==== ==== Ejercicios ====
 En estos ejercicios, suponer que primero se da una línea con un N y un M, que indican la cantidad de filas y columnas respectivamente de la matriz, y luego N líneas con M valores cada una, indicando el contenido de cada fila. En estos ejercicios, suponer que primero se da una línea con un N y un M, que indican la cantidad de filas y columnas respectivamente de la matriz, y luego N líneas con M valores cada una, indicando el contenido de cada fila.
-    - Dada una matriz de números, imprimir las sumas de sus filas y sus columnas (N + M valores en total). +    - Dada una matriz de números, ​[[http://​juez.oia.unsam.edu.ar/#/​task/​suma_filas/​statement|imprimir las sumas de sus filas y sus columnas]] (N + M valores en total). 
-    - Dada una matriz de números, imprimir la matriz traspuesta, es decir, aquella que tiene en la fila i, columna j, lo que la original tenía en la fila j, columna i. +    - Dada una matriz de números, ​[[http://​juez.oia.unsam.edu.ar/#/​task/​matriz_traspuesta/​statement|imprimir la matriz traspuesta]], es decir, aquella que tiene en la fila i, columna j, lo que la original tenía en la fila j, columna i. 
-    - Dado un rectángulo de números enteros (podrían ser negativos), ​¿Cuál ​es la máxima suma posible de un subrectángulo de mayor suma? Un subrectángulo se forma tomando los elementos de un conjunto de filas y columnas todas **contiguas**,​ sin dejar "​agujeros"​. Notar que el subrectángulo no puede ser vacío. +    - Dado un rectángulo de números enteros (podrían ser negativos), ​¿[[http://​juez.oia.unsam.edu.ar/#/​task/​max_sum_rect/​statement|Cuál ​es la máxima suma posible de un subrectángulo de mayor suma]]? Un subrectángulo se forma tomando los elementos de un conjunto de filas y columnas todas **contiguas**,​ sin dejar "​agujeros"​. Notar que el subrectángulo no puede ser vacío. 
-    - Dado un rectángulo de **letras** y una lista de palabras, ​¿Cuáles ​de las palabras aparecen en esta sopa de letras? Las palabras pueden aparecer en horizontal (tanto hacia la derecha como hacia la izquierda) o en vertical (tanto hacia arriba como hacia abajo). No se cuentan las posibles apariciones en diagonal.+    - Dado un rectángulo de **letras** y una lista de palabras, ​¿[[http://​juez.oia.unsam.edu.ar/#/​task/​sopa_de_letras/​statement|Cuáles ​de las palabras aparecen en esta sopa de letras]]? Las palabras pueden aparecer en horizontal (tanto hacia la derecha como hacia la izquierda) o en vertical (tanto hacia arriba como hacia abajo). No se cuentan las posibles apariciones en diagonal.
curso-cpp/contenedor-vector.1486769202.txt.gz · Última modificación: 2017/02/10 23:26 por santo