int num[365]; /* primer elemento: num[0],Es posible tener un array local, sólo visible en la función donde se ha declarado, y global, visible por todas las funciones del programa a partir del lugar donde se encuentra la declaración del mismo:
último elemento: num[364] */
double matriz[10][5]; /* matriz de 50 reales:
matriz[0][0]: primera fila y primera columna,
matriz[9][4]: última fila y última columna */
char trinitotolueno[70][7][5]; /* array de caracteres tridimensional */
int temp[65]; /* array global de 65 enteros */Al igual que ocurre con las demás variables, los arrays se pueden inicializar al declararlos.
int main() {
double lluvia[200]; /* array local de 200 reales */
.
.
.
}
#include <stdio.h>Ejercicio: En el ejemplo 4.1 el tamaño del array se calcula tanto en tiempo de compilación como en tiempo de ejecución, de modo que en caso de que sea necesario modificar el contenido del array, basta con actualizar la declaración de sus elementos, encerrados entre llaves. A partir de dicho ejemplo, eliminar los dos últimos elementos del array, ejecutar el programa una vez compilado y comprobar el resultado. Añadir a la versión original del ejemplo dos nuevos elementos y comprobar de nuevo el resultado de la ejecución.
int dias[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/* el compilador cuenta el número de elementos del array y por tanto no es necesario que éste aparezca explícitamente entre los corchetes */
int main() {
int i = 0;
for (; i < sizeof(dias)/sizeof(int); i++)
printf("El mes %d tiene %d dias.\n", i + 1, dias[i]);
/* en la expresión de test del bucle se calcula el número de elementos del array */
system("pause");
return 0;
}
char nums[4] = {1, 2, 3, 4, 5}; /* declaración incorrecta */Se puede asignar un valor a un elemento concreto del array, como si de una variable elemental se tratara.
int antifaz[4] = {5, 6, 7, 8};
/* antifaz == &antifaz[0] */
#include <stdio.h>
int main() {int antifaz[4] = {5, 6, 7, 8};
printf("antifaz: %p. &antifaz[0]: %p.\n", antifaz, &antifaz[0]);
system("pause");
return 0;
}
int cuad[2][3] = {{1, 2, 3}, {4, 5, 6}};También es posible declarar arrays con un mayor número de índices. El límite está en la memoria del ordenador que se utilice.
int cuad[2][3] = {1, 2, 3, 4, 5, 6};
int solido[10][20][30]; /* 6000 enteros */Ejercicio: Modificar el programa del ejemplo 4.3 para que lea del teclado los datos de una matriz de 5x4 enteros y posteriormente los presente al usuario a través de la pantalla.
Ejemplo 4.7. Escribir un programa en el cual se inicialice una tabla de 2x4 enteros con los números consecutivos del 1 al 8. A continuación, una función auxiliar multiplicará por dos todos los elementos del array. Finalmente, la función principal imprimirá los enteros de la tabla, ya modificados, en formato de matriz (cada fila en una línea distinta).#include <stdio.h>
int main() {int i, j, nums[5][4];
.
.
.
system("pause");
return 0;
}
#include <stdio.h>Con la declaración del parámetro formal int arr[][4] o int arr[2][4], el compilador puede calcular la dirección efectiva del acceso al elemento arr[i][j] sumando, en primer lugar, a la dirección base de la tabla (arr) i veces el tamaño de una fila, que en este caso es el número de bytes de cuatro elementos de tipo entero: dieciséis bytes si se asume un tamaño de cuatro bytes para un entero. Una vez posicionado en la fila correspondiente, el compilador para terminar de calcular la dirección de acceso a la columna concreta añadirá a la suma anterior j veces el tamaño de un entero:
void duplica(int [][4], int, int); /* también es válido "int [2][4]" */
int main() {
int basura[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
/* int basura[2][4] = {1, 2, 3, 4, 5, 6, 7, 8}; */
int i, j;
duplica(basura, 2, 4);
for (i = 0; i < 2; i++) {
for (j = 0; j < 4; j++)
printf("%d ", basura[i][j]);
putchar('\n'); /* siguiente fila en nueva línea */
}
system("pause");
return 0;
}
void duplica(int arr[][4], int numfils, int numcols) {
/* también es válido "int arr[2][4]" */
int i, j;
for (i = 0; i < numfils; i++)
for (j = 0; j < numcols; j++)
arr[i][j] *= 2; /* arr[i][j] = arr[i][j] * 2; */
}
#include <stdio.h>Ejemplo 4.8. Realizar un programa que haga uso de una función auxiliar para ordenar ascendentemente un vector de diez enteros mediante el método de la burbuja. Una vez ordenado el vector, la función principal mostrará sus datos en pantalla. Para ordenar un vector mediante el método de la burbuja, en primer lugar es necesario comprobar si de entrada ya está ordenado, de modo que cada uno de sus elementos tenga un valor menor o igual que el siguiente. Si dos elementos consecutivos no cumplen el criterio de ordenación indicado anteriormente, se deberán intercambiar sus valores. En el caso de que se haya tenido que efectuar al menos un intercambio, una vez que finalice la comprobación del vector se deberá iniciar una nueva y proceder del modo descrito. El ciclo de comprobaciones finalizará cuando el vector esté totalmente ordenado.
void creatabla(int [][10], int, int); /* también es válido "int [9][10]" */
int main() {
int tabla[9][10]; /* tablas de multiplicar del uno al nueve */
...
...
for (i = 0; i < 9; i++) {
for (j = 0; j < 10; j++)
printf("%d por %d = %d.\n", i + 1, j + 1, tabla[i][j]);
printf("Pulse una tecla...\n\n");
getch(); /* similar a "getchar()" pero sin pulsar <ENTER> */
}
...
}
void creatabla(int arr[][10], int numfils, int numcols) {
/* también es válido "int arr[9][10]" */
...
...
...
arr[i][j] = (i + 1) * (j + 1);
}
INICIO 1ª 2ª 3ª 4ª 5ª
4 2 0 -1 -3 -3
2 0 -1 -3 -1 -1
0 -1 -3 0 0 0
-1 -3 2 2 2 2
-3 4 4 4 4 4
#include <stdio.h>
#define DIM 10
void burbuja(int [], int); /* encabezamiento o prototipo */
int main() {
int entero[DIM], i;
printf("Carga del vector de %d enteros:\n\n", DIM);
for (i = 0; i < DIM; i++) {
printf("- Elemento %d: ", i);
scanf("%d", &entero[i]);
}
burbuja(entero, DIM); /* parámetros reales */
printf("\nVector de %d enteros ordenado:\n", DIM);
for (i = 0; i < DIM; i++)
printf("\n- Elemento %d: %d.", i, entero[i]);
printf("\n\n"); /* dos saltos de línea */
system("pause");
return 0;
}
void burbuja(int vector[], int n) { /* parámetros formales */
int i, w, aux;
do {
w = 0;
for (i = 0; i < n - 1; i++) /* comprobación del orden */
if (vector[i] > vector[i + 1]) { /* dos elementos desordenados */
aux = vector[i]; /* intercambio de elementos */
vector[i] = vector[i + 1];
vector[i + 1] = aux;
w = 1; /* hay que volver a comprobar el vector */
}
} while(w); /* while(w == 1); */
}
void escalar(double a[], double b[], double num). Asigna al parámetro de salida b el resultado de multiplicar el complejo a por el escalar num.Para obtener la raíz cuadrada de un número real y el seno y el coseno de un ángulo pueden utilizarse respectivamente las siguientes funciones, cuyos prototipos se encuentan en el fichero de encabezamiento <math.h>:
void suma(double a[], double b[], double c[]). Suma los complejos a y b, y asigna el resultado al parámetro de salida c.
double modulo(double a[]). Devuelve como resultado el módulo del complejo a.
void producto(double a[], double b[], double c[]). Multiplica los complejos a y b, y asigna el resultado al parámetro de salida c.
void vector(double mod, double arg, double a[]). Asigna al parámetro de salida a las componentes vectoriales del complejo expresado en forma polar mediante el módulo mod y el argumento arg.