Arrays 2021
Arrays 2021
Arrays
Contenido
Concepto de array ................................................................................................................................................... 1
Vectores (Arrays de una dimensión) ....................................................................................................................... 3
Matrices (Arrays bidimensionales).......................................................................................................................... 6
Manejo de arrays en módulos ............................................................................................................................. 10
Arrays especiales: Las cadenas de caracteres ....................................................................................................... 13
Definición e inicialización .................................................................................................................................. 14
Operaciones con cadenas ................................................................................................................................. 16
Funciones de tratamiento de cadenas existentes en C/C++ ............................................................................. 21
strlen() ........................................................................................................................................................... 22
strcat() y strncat() ....................................................................................................................................... 22
strcmp() y strncmp() .................................................................................................................................... 23
Argumentos del main() ..................................................................................................................................... 25
Búsqueda y ordenación......................................................................................................................................... 27
Métodos de búsqueda .......................................................................................................................................... 27
Búsqueda secuencial o lineal ............................................................................................................................ 27
Búsqueda binaria o dicotómica ......................................................................................................................... 29
Métodos de ordenación ........................................................................................................................................ 30
Ordenación por intercambio ............................................................................................................................. 30
Ordenación por selección ................................................................................................................................. 31
Ordenación por inserción.................................................................................................................................. 32
Tipos de datos definidos por el usuario ................................................................................................................ 32
Concepto de array
Los arrays surgen de la necesidad de tratar conjuntos de datos del mismo
tipo relacionados entre sí, de forma que mediante un nombre común y una
variable o valor indicador podamos referirnos bien a todos ellos o a uno en
particular. Constituyen una de las estructuras de datos más importantes.
Son tipos de datos estructurados; es decir, se construyen sobre los tipos de
datos simples existentes en los diversos lenguajes.
Un array es una estructura homogénea de datos, de tamaño constante 1 en
la que se accede a cada uno de sus elementos mediante un identificador
común y uno o varios índices. Según la definición podemos ver:
▪ Unidimensionales (vectores)
▪ Bidimensionales (matrices)
Por ejemplo, un array puede contener todo enteros, o todo caracteres, pero
no puede contener ambos.
1
En P1 se emplearán arrays estáticos
Un grupo de diez amigos quiere organizar una fiesta y necesita almacenar
la cantidad de dinero que tiene cada uno en el bolsillo, así como la cantidad
que tienen en total.
#include <iostream>
using namespace std;
int main() {
float amigo1, amigo2, amigo3, amigo4, amigo5, amigo6,
amigo7, amigo8, amigo9, amigo10, total;
return 0;
}
Imagina qué ocurriría si el número de amigos se incrementa. En ese caso
es mejor reducir las amistades o encontrar otra solución para almacenar
tantos datos.
tipoBase nombreArray[tam];
tamaño el array
Para poder utilizar una variable de tipo array primero tenemos que
declararla. Ejemplo:
int x[7];
Al igual que a una variable simple, podemos asignarle unos valores iniciales,
independientemente de que durante el proceso del programa se modifiquen
eventualmente. Por ejemplo:
int vector1[]={1,3,15,18,-2,15,44,12,1,4};
#include <iostream>
using namespace std;
int main(){
return 0;
}
Ejemplo::
int lista[10][25];
Hay que dejar claro que si la matriz tiene 10 filas, se accede desde el
elemento que se encuentra en la posición 0 hasta el elemento que se
encuentra en la posición 9, y lo mismo con las columnas, si tiene 25
columnas irá por tanto desde la columna 0 hasta la columna 24.
Con los elementos que componen la estructura podemos realizar las mismas
operaciones que con el tipo base al que pertenecen.
int matriz[25][25];
matriz00 = 1 matriz01 = 2
matriz10 = 10 matriz11 = 20
#include <iostream>
using namespace std;
int main(){
float notas[NOTAS];
int matrizA[CUANTOS][CUANTOS];
int matrizB[20][CUANTOS];
int main() {
float amigos[AMIGOS], total;
int i;
cout << "En total disponemos de " << total << " euros" <<
endl;
return 0;
}
En el anterior ejercicio, ¿por qué utilizo la constante AMIGOS?
El código está más claro.
Podría poner directamente el 10, pero al hacerlo así si
cambiamos el total de amigos, sólo con cambiar el valor que
asigno a la constante, ya lo tendría todo actualizado.
En el mismo ejercicio, ¿por qué voy desde “0” hasta “<AMIGOS” y no hasta
“<=AMIGOS”?
Comparando este ejercicio que utiliza vectores con el que no las utiliza,
vemos que el número de líneas es similar, ¿por qué lo utilizo?
#include <iostream>
using namespace std;
int main() {
int vecA[CUANTOS], vecB[CUANTOS];
leeVector(vecA);
copyVecs(vecA,vecB);
if (compVecs(vecA,vecB))
cout << "Los vectores son idénticos" << endl;
else
cout << "Los vectores no son iguales" << endl;
escVector(vecB);
cout << endl;
return 0;
}
La ejecución sería:
Así pues, los arrays siempre son pasados por referencia en C/C++.
Cualquier modificación sobre ellos será permanente. La forma de acceder a
un determinado elemento del vector, dado que como hemos dicho el
identificador representa la dirección de memoria, se realiza calculando el
desplazamiento necesario para llegar al índice correspondiente.
Al inicio del programa se han escrito los prototipos de las funciones que se
van a definir a continuación. Como no es necesario especificar ningún
identificador, se declaran el tipo de elementos que va a almacenar el vector
y se indica que se trata de un array por los dos corchetes, sin tamaño.
Utilizar arrays como parámetros para las funciones implica el paso de los
mismos por referencia, por lo que cualquier alteración de los valores que a
ellos pertenecen se mantendrá cuando finalice la ejecución de las mismas.
#include <iostream>
using namespace std;
int main() {
int numero[5]; /* Un array de 5 números enteros */
int suma; /* Un entero que será la suma */
#include <iostream>
using namespace std;
int main() {
int numero[TOTAL]={200, 150, 100, -50, 300};
int suma, i;
suma = 0;
for (i=0; i < TOTAL; i++)
suma = suma + numero[i];
Definición e inicialización
Normalmente, cuando se le asigna una cadena constante a un array como
parte de la definición, se omite el tamaño del array. El tamaño adecuado
será asignado automáticamente, incluyendo la previsión del carácter nulo
'\0’, que se añade, también automáticamente, al final de la cadena.
El mes es FEBRERO
mientras que
Veamos esto con un ejemplo que iremos presentando poco a poco para su
comprensión:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char cad1[MAX], cad2[MAX];
int longitud, resultado_comparacion;
strcpy(cad2,cad1);
// Mostramos el contenido de cada cadena
cout << "cad1 contiene " << cad1 << endl;
cout << "cad2 contiene " << cad2 << endl;
strcat(cad1,cad2);
// Mostramos el contenido de cada cadena
cout << "cad1 contiene " << cad1 << endl;
cout << "cad2 contiene " << cad2 << endl;
res = -1;
len1 = longitud(s1);
len2 = longitud(s2);
return(res);
}
int main() {
char nombre[TAM];
return 0;
}
#include <iostream>
using namespace std;
return 0;
}
Sea cual sea el código empleado, ¿cómo mostrarías por pantalla la inicial
de tu nombre?
#include <iostream>
using namespace std;
int main() {
char nombre[TAM];
cout << "Tu nombre empieza por "<< nombre[0] << endl;
return 0;
}
Funciones de tratamiento de cadenas existentes en C/C++
Algunos ejemplos podrían ser:
Función Significado
int strlen(char []) Longitud de la cadena de caracteres.
strcat(char [], char []) Concatenación de cadenas de caracteres.
strncat(char [], char [], int) Concatenación de n caracteres.
int strcmp(char [], char []) Comparación de cadenas de caracteres.
int strncmp(char [], char [], int) Comparación de n caracteres.
strlen()
La función strlen() calcula la longitud de una cadena de caracteres. La
longitud de una cadena de caracteres es un entero que indica el número de
caracteres que forman parte de la cadena, excluyendo el carácter nulo del
final. Por ejemplo, para una cadena definida como
char alfabeto[]="abcdefghijklmnopqrstuvwxyz";
la instrucción
strlen(alfabeto)
strcat() y strncat()
Las funciones strcat() y strncat() se usan para concatenar dos
cadenas de caracteres. Cuando se concatenan dos cadenas de caracteres,
los contenidos de la segunda cadena se copian al final de la primera. En
este caso, se usa strcat(cad1, cad2) para combinar las dos cadenas. Es
importante que la primera cadena tenga definida una longitud suficiente
como para almacenar la cadena concatenada. Dicha función necesita dos
argumentos: los nombres de las cadenas a concatenar. El primer
argumento será el destino de la nueva cadena.
strncat(cad1, cad2, n)
strcmp() y strncmp()
Las funciones strcmp() y strncmp() se usan para comparar dos cadenas
de caracteres. La comparación se hace carácter a carácter. Cada función
devuelve un valor que depende del resultado de la comparación. El valor
entero devuelto es:
Realiza un programa que pida por teclado una frase y almacene en otra
variable únicamente las 4 primeras letras. Posteriormente las debe mostrar.
#include <iostream>
#include <cstring>
int main() {
char texto[TAM], reducido[MINI];
return 0;
}
int main() {
char nombre[TAM], apellido[TAM], completo[TAM];
strcpy(completo, nombre);
strcat(completo, " ");
strcat(completo, apellido);
cout << "Tu nombre completo es: " << completo << endl;
return 0;
}
#include <iostream>
#include <cstring>
int main() {
char texto1[TAM], texto2[TAM];
if (strcmp(texto1, texto2)==0)
cout << "Son iguales" << endl;
else
cout << "Son distintas" << endl;
return 0;
}
Modifica el programa anterior para que te indique si son iguales o cual es
mayor que la otra (según nuestro sistema alfabético).
if (strcmp(texto1, texto2) == 0)
cout << "Son iguales" << endl;
else if (strcmp(texto1, texto2) > 0)
cout << texto1 << " es mayor que " << texto2 <<
endl;
else
cout << texto1 << " es menor que " << texto2 <<
endl;
#include <iostream>
#include <cstring>
int main() {
char mensajeError[FILAS][COLUMNAS] = {
"Fichero no encontrado",
"El fichero no se puede abrir para escritura",
"El fichero está vacío",
"El fichero contiene datos de tipo incorrecto"
"El fichero está siendo usado"
};
return 0;
}
• int main()
#include <iostream>
using namespace std;
cout << "Se han pasado " << argc << " argumentos" <<endl;
for (i=0; i<argc; i++)
cout << "argumento " << i << " " << argv[i] << endl;
return 0;
}
lineadecomando:~$ programa p1 p2 p3
Se ha pasado 4 argumentos
argumento 0 programa
argumento 1 p1
argumento 2 p2
argumento 3 p3
Búsqueda y ordenación
Dos importantes aplicaciones en que intervienen arrays son la búsqueda y
la ordenación. La primera implica la búsqueda de un valor específico en
un array y el informe de su ubicación (posición). Si éste no se encuentra,
deberá informarse de este hecho. En la segunda aplicación interviene el
ordenamiento de los elementos de un array en sentido creciente o
decreciente. Para simplificar las cosas, imaginaremos que los arrays son
de enteros. Pese a ello, las técnicas desarrolladas se aplicarán a cualquier
tipo de datos para los cuales tengan sentido las comparaciones de orden.
Esto incluye específicamente a tipos enteros, reales, cadena y escalares
definidos por el usuario.
Métodos de búsqueda
La búsqueda es una operación que tiene por objeto la localización de un
elemento dentro de la estructura de datos. El elemento que se busca se
caracteriza o distingue por el valor de una clave o la combinación de varias
si la clave es compleja. A partir de ahora cuando se haga mención a la
“clave'', se entenderá por el valor, simple o no, que caracteriza al elemento.
encontrado=false;
busc=-1;
i=0;
while ((i<lon) && (!encontrado) ){
if (s[i]==clave)
encontrado=true;
else i=i+1;
}
if (encontrado)
busc=i;
return(busc);
}
encontrado = false;
inicio = 0;
busc = -1;
final = lon-1;
while ((inicio <= final) && (!encontrado)) {
medio = (inicio+final) / 2;
if (s[medio] == clave )
encontrado = true;
else if (s[medio] < clave)
inicio = medio + 1;
else
final = medio - 1;
}
if (encontrado)
busc = medio;
return(busc);
}
Métodos de ordenación
Dado un array que contiene N valores, deseamos reordenar el array de
modo que los valores se encuentren en orden creciente.
El proceso sigue buscando el más pequeño (orden creciente) del resto del
array y colocándolo en la posición 1 y así sucesivamente.
i = k;
j = k+1;
while (j < n) {
if (v[j] < v[i])
i = j;
j = j+1;
}
aux = v[k];
v[k] = v[i];
v[i] = aux;
}
Ordenación por inserción
El fundamento de este método consiste en insertar los elementos no
ordenados del array en subarrays del mismo que ya estén ordenados. Es
evidente que si tenemos un subarray de N-1 elementos ya ordenado, si
introducimos un elemento en la posición adecuada, obtendremos un array
de N elementos ordenado. Dependiendo del método elegido para encontrar
la posición de inserción tendremos distintas versiones del método de
inserción.
...
}
Si utilizáramos una nueva definición de tipos de datos:
int main(){
Tnotas notasProg1, notasProg2;
Tcadena nomAlum1, nomAlum2;
Tmatriz matriz1, matriz2;
...
}
Es equivalente a