8 - Arrays, vectores y matrices
Uno de los elementos fundamentales presentes en cualquier lenguaje de programación son los vectores (unidimensionales) y las matrices (multidimensionales), englobados ambos en el termino "array". Un array es el conjunto ordenado de un determinado número de variables del mismo tipo, por ejemplo 100 números enteros, 50 caracteres o 10 boleanos. Estos vectores se reservan en memoria en C como si fuesen variables normales, salvo que indicando entre corchetes la longitud necesaria.
int numeros[100];
char frase[50];
bool respuestas[10];
constantes
Pero antes de meternos más al tema de arrays, he de comentar otro elemento importante en el lenguaje y que es útil para esta lección, las constantes.
Una constante es una reserva de memoria, al igual que la variable, salvo por el detalle de que el valor de la constante se especifica en su creación y nunca más puede volver a ser cambiado. La definición (nunca mejor dicho) de constantes se realiza con la etiqueta #define
#define PI 3.141592
#define ANCHO 1920
#define ALTO 1080
Detalles sobre estas líneas para crear constantes:
-
No tienen ; al final
-
Se colocan fuera del main, junto a los #include
-
Sus nombres se escriben en mayúsculas y con _ en el caso de que sea necesario (esto por convención, no es una regla fija)
El uso de constantes dentro de nuestro programa se hace igual que cualquier variable.
area = PI * pow(r, 2);
perimetro = 2 * PI * r;
Una práctica muy habitual es definir la longitud de nuestros arrays con constantes. Supongamos que tenemos un programa con varios arrays del mismo tamaño, y en el que vamos a usar mucho la cifra de ese tamaño en bucles o cualquier cosa, lo más lógico entonces es crear arrays de esta manera:
#define MAX_TAMANO 1024
int numeros[MAX_TAMANO];
char letras[MAX_TAMANO];
valores en arrays
En la creación de un array pueden llenarse sus valores directamente de esta manera:
char letras[10] = {'h', 'o', 'l', 'a', 'q', 'u', 'e', 't', 'a', 'l'};
Mientras que para acceder a sus valores y cambiarlos desde cualquier punto del programa, la sintaxis para ambas cosas es la misma:
numeros[10] = 64;
fprintf(stdout, "%d", numeros[10]);
En este caso la posicion 10 de 'numeros' se ha llenado con el valor 64 y posteriormente se ha accedido a ese valor para que se imprima por pantalla.
Un detalle muy importante a tener en cuenta es que en C la primera posicion de un array es la posicion [0], y si el array ha sido creado con longitud A, su último valor está en [A-1].
Arrays, punteros y funciones
Al crear un array, su nombre dentro de un programa es un puntero que hace referencia al primer miembro del vector, es decir teniendo:
int numeros[MAX_TAMANO];
int *a = numeros;
en el puntero a entero a estamos metiendo la dirección al primer número del array, es decir, esa línea sería completamente equivalente a:
int *a = &(numeros[0]);
Otro detalle importante es que en la reserva de memoria cuando se crea un array las posiciones reservadas van seguidas. Es decir si la primera posicion array[0] es 10000, array[1] estará en 10001, y así en adelante.
Este detalle de que el nombre del array es un puntero es muy importante, ya que no hay manera de poner un array como parámetro ni de entrada ni de salida de una función, es decir, estos prototipos son incorrectos:
funcion1 (int a[10]);
funcion2 (int a[]);
int [20] funcion3 (void);
Puesto que el nombre de un array es un puntero, si queremos enviar o recibir un array en una función, el parámetro correcto es usar la dirección de memoria:
#define LARGO 10
//recibe un array y devuelve la suma de sus miembros
int sumatorio (int* vector);
int main(void){
int impares[LARGO] = {1,3,5,7,9,11,13,15,17,19};
int total;
total = sumatorio(impares) //el nombre tal cual 'impares' ya es un puntero
}
Deberes - lección 8
El procesado de texto con C y arrays de variables char es más complejo que en otros lenguajes, y eso le hace merecer una lección complementaria en este curso, que será a continuación, por lo que de momento, los deberes van a estar basados en números. Siempre que el objetivo de los deberes sea crear una función se recomienda probarla en un pequeño programa para comprobar que funciona como debería.
1- Crear varios arrays de distintos tamaños. Probar definir su longitud con constantes, con una variable, dejando los corchetes vacíos, poniendo un número muy grande... qué es lo que ocurre en cada caso?
2- Crear una función que reciba un array de enteros y la imprima por pantalla de la siguiente forma:
dado:
int vector[10] = {1,2,3,4,5,6,7,8,9,10};
el resultado es:
[1 2 3 4 5 6 7 8 9 10]
Realizar también la versión para variables float. En este caso además del array de entrada, otro parámetro de entrada puede ser el número de decimales a imprimir. En ambos casos puede ser útil que se especifique siempre la longitud a imprimir:
void imprimirArrayInt(int* array, int longitud);
void imprimirArrayFloat(float* array, int decimales, int longitud);
3- Hacer una familia de funciones que sirvan para 'inicializar' los arrays, es decir, que llenen de ceros todas las posiciones del array en el caso de que sean números, o espacios en blanco en el caso de letras.
4- Realizar una función que cuente los elementos de un array hasta que encuentre un número concreto, por ejemplo:
contarHasta(array , 0);
siendo 'array'
[1 5 2 7 2 7 2 0 4 6 2]
deberia contar los huecos que hay hasta el primer 0, es decir, 7.
5- Una función que reciba dos arrays enteros y devuelva otro array con la suma punto a punto, es decir, que haga la operación estilo:
[1 2 3] + [4 5 6] = [5 7 9]
Cuidado que los arrays deberán ser del mismo tamaño.
6-crear las funciones sumatorio y productorio del contenido de un array.
7- Crear un pequeño programa de gestión con la función menú que hicimos unas lecciones atrás. Al comenzar el programa se debe crear un array, inicializarlo a ceros y a continuación gestionar su estado mediante las opciones del menú, que deberán ser:
-borrar todo el contenido del array
-mostrar por pantalla el contenido
-añadir un número distinto de 0 al array
-comprobar cuantos huecos libres quedan en el array
-mostrar el sumatorio de los valores del array
-salir