Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
curso-cpp:contenedor-vector [2017/10/12 18:11] santo [Motivación] |
curso-cpp:contenedor-vector [2017/10/29 19:25] santo |
||
---|---|---|---|
Línea 4: | Línea 4: | ||
Supongamos que queremos crear programas capaces de realizar las siguientes tareas: | Supongamos que queremos crear programas capaces de realizar las siguientes tareas: | ||
- | - [[http://juez.oia.unsam.edu.ar/#/task/busca_repetidos/statement|Dada una secuencia de números, determinar si tiene repetidos]]. | + | - Dada una secuencia de números, determinar si tiene repetidos. |
- Dada una secuencia de números, decidir si es "capicúa". | - Dada una secuencia de números, decidir si es "capicúa". | ||
- Dada una secuencia de números, imprimirla al revés. | - Dada una secuencia de números, imprimirla al revés. | ||
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 138: | Línea 138: | ||
==== 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; | ||
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 237: | Línea 237: | ||
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: | 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> | + | <code cpp> |
vector<vector<int>> matriz(N); | vector<vector<int>> matriz(N); | ||
for (int i = 0; i < N; i++) | for (int i = 0; i < N; i++) | ||
Línea 247: | Línea 247: | ||
Una forma más práctica de lograr esto (aunque más avanzada de entender) es directamente usar la siguiente línea: | Una forma más práctica de lograr esto (aunque más avanzada de entender) es directamente usar la siguiente línea: | ||
- | <code> | + | <code cpp> |
vector<vector<int>> matriz(N, vector<int>(M)); | vector<vector<int>> matriz(N, vector<int>(M)); | ||
</code> | </code> | ||
Línea 257: | 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. |