















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Apuntes de arreglos Si queremos inicializar todo el array con el mismo valor, por ejemplo el 0, podemos recorrerlo con una sentencia repetitiva e ir asignando el valor 0 a cada una de las celdas. A continuación mostramos el mismo ejemplo con las sentencias f or, while y do-while. Es muy sencillo y contiene únicamente el código principal para inicializar un array bidimensional recorriéndolo. En el siguiente ejemplo se realiza esta operación con un array de 10 filas y 5 columnas de tipo int y con la sentencia f or.
Tipo: Apuntes
1 / 23
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
En este capítulo aprenderá:
176 Capítulo 10
A la hora de realizar algunos programas surge la necesidad de almacenar varios datos, para lo cual deberíamos utilizar varias variables. Un programa que almacene 4 edades escritas por el usuario mediante el te- clado y después muestre la media lo podríamos hacer de la forma que se describe a continuación: #include <stdio.h> int main (void)
{ int edad 1 , edad2, edad3, edad4; int media; /* Pedimos la edad de la persona 1. / printf ("Introduzca la edad de la persona 1: "); scanf ("%d", Sedadl); / Pedimos la edad de la persona 2. / printf ("Introduzca la edad de la persona 2: "); scanf ("%d”, &edad2); / Pedimos la edad de la persona 3. / printf ("Introduzca la edad de la persona 3: "); scanf ("%d", &edad3); / Pedimos la edad de la persona 4. / printf ("Introduzca la edad de la persona 4: "); scanf ("%d", &edad4); / Calculamos la media y la mostramos. */ media = (edadl + edad2 + edad3 + edad4) / 4; printf ("La media es; %d", media); } Pero si nos dicen que calculemos la media de edad de 20 ó 50 personas... ¡tendríamos que crear 20 ó 50 variables "edad"!, por no hablar de la expresión que calcula la media, que sería enorme. Realmente estamos ante un problema y la solución está en los arrays. Un array se define como una colección indexada de variables del mismo tipo, a las que nos referimos con el nombre del array junto con el índice. Los arrays pueden ser unidimensionales o multidimensionales (como las bi- dimensionales o las tridimensionales), pero nosotros nos centraremos en los unidimensionales y en los bidimensionales. Para poder entender esta definición vamos a pasar ahora a los arrays unidi- mensionales.
178 Capitulo 10
Grupo A
Figura 10.3. Representación gráfica de mi_array.
Observe en qué poco espacio podemos declarar tantas variables, teniendo en cuenta que cada celda del array se comporta como una variable. Piense que declarar 500 variables de tipo int es tan sencillo como escribir: int va- riables [ 500] ;. En cada una de las celdas de mi_array podemos almacenar datos de tipo int, pero ¿cómo? Continuemos.
La sintaxis para declarar un array unidimensional es: tipo identificador[tamaño]; Donde tipo es el tipo de dato que van a almacenar las celdas (y que es el mismo para todas), identif icador es el nombre del array unidimensional, y tamaño es el número de celdas que tiene. La siguiente línea de código declara un array unidimensional que se llama mi_array, de tipo int y con 5 celdas. int mi_array[5]; Su representación gráfica se muestra en la figura 10.3.
mi array
Figura 10.2. Un grupo de taquillas es similar a un array unidimensional.
Arrays 179
Para acceder a una celda del array unidimensional, tanto para obtener su contenido como para asignarle un valor, escribimos el identificador del array (para indicar con qué array trabajaremos) seguido del índice o posición de la celda entre corchetes (para indicar con qué celda del array vamos a trabajar):
identificador[indice]
Veamos unos ejemplos.
mi_array[0] = 10;
Si en el cuarto ejemplo el usuario escribe el número 30 mediante el teclado, el aspecto de mi_array sería el de la figura 10.4.
0 1 2 3 4 mi_array 10 17 30
Figura 10.4. Aspecto de mi_arrray tras los ejemplos.
En el mismo momento de la declaración del array podemos asignar unos va- lores iniciales a sus celdas. La sintaxis es:
tipo identificador[tamaño] = {lista_de_valores};
Donde lista_de_valores son los distintos valores de las celdas separa- dos por comas: valor_l, valor_2, ..., valoran. Estos valores se asignan a las celdas siguiendo el orden: de la celda 0 a la última.
Arrays 181
números[6]=0; /* Cuando celda toma el valor 6 (séptima iteración). */
números[7]=0; /* Cuando celda toma el valor 7 (octava iteración). */
números[8]=0; /* Cuando celda toma el valor 8 (novena iteración). */
números[9]=0; /* Cuando celda toma el valor 9 (decima iteración). */
Tras lo cual el array almacena el valor 0 en todas y cada una de sus celdas. El mismo ejemplo con la sentencia (^) while:
int números[10]; int celda; celda=0; while (celda<10) { números[celda]=0; celda++; } El mismo ejemplo con la sentencia do-while:
int números[10]; int celda; celda=0; do { números[celda]=0; celda++; } while (celda<10);
Si queremos almacenar en el array distintos valores introducidos por teclado podemos recorrerlo e ir asignando a cada una de las celdas un valor me- diante cualquier función de lectura del teclado. A continuación mostramos el mismo ejemplo con las tres sentencias repetitivas y únicamente con el código principal. En el siguiente ejemplo se realiza esta operación con un array de 10 celdas de tipo int, la sentencia for y la función scanf. int números[10]; int celda; for (celda=0; celda<10; celda++) scanf (“%d”,^ &numeros[celda]);
En cada iteración o repetición del bucle for la variable celda toma un valor del 0 al 9. El resultado es que el bucle es equivalente al siguiente listado: scanf ("%d"/&numeros [0] ) ; /* Primera iteración. / scanf ("%d",&numeros [1] ) ; / Segunda iteración. / scanf ("%d",&numeros [2] ) ;/ Tercera iteración. */
182 Capitulólo
scanf ("%d",&numeros [3]); /* Cuarta iteración. / scanf ("%d", &numeros[4]); / Quinta iteración. / scanf ("%d",&numeros [5]); / Sexta iteración. / scanf ("%d”, &numeros[6]); / Séptima iteración. / scanf ("%d", &numeros[7]); / Octava iteración. / scanf ("%d",&numeros [8]); / Novena iteración. / scanf ("%d", &numeros[9]); / Decima iteración. */ Si va a utilizar este código como ejemplo para hacer otro programa recuerde que delante de cada lectura del teclado (scanf) debe mostrar algún tipo de mensaje al usuario (mediante printf, por ejemplo). Recuerde también que puede ser necesario utilizar la función f f lush tras la llamada a la función scanf. El mismo ejemplo con la sentencia while:
int números[10]; int celda; celda=0; while (celda<10) {
scanf ("%d", &numeros[celda]); celda++; }
El mismo ejemplo con la sentencia do-while: int números[10]; int celda; celda=0; do { scanf ("%d", &numeros[celda]); celda++; } while (celda<10);
Si lo que queremos es mostrar el contenido del array podemos recorrerlo e ir mostrando el contenido de cada una de las celdas. A continuación mostra- mos el mismo ejemplo con las tres sentencias repetitivas y únicamente con el código principal. En el siguiente ejemplo se realiza esta operación con un array de 10 celdas de tipo int, la sentencia for y la función printf. int números[10]; int celda; for (celda=0; celda<10; celda++) printf ("%d", números[celda]);
184 Capitulólo
#include <stdio.h> int main (void) { char letras[10]; /* Para almacenar los caracteres. / int celda; / Para almacenar el numero de la celda. / int contador; / Para contar las 'a' o 'A'. / / Pedimos caracteres al usuario y los almacenamos en las celdas del array letras. / for (celda=0; celda<10; celda++) } printf ("Escriba un carácter para la celda %d: ", celda); scanf ("%c", &letras[celda]); fflush (stdin); } / Antes de empezar a contar las 'a' o 'A' ponemos la variable contado con el valor 0. / contador = 0; / Recorremos el array en busca de 'a' o 'A'. Si las encontramos aumentamos el valor de la variable contador, que es la que lleva la cuenta de cuantas hay. / for (celda=0; celda<10; celda++) { if ((letras[celda] == 'a') || (letras[celda] == 'A')) contador++; } / Mostramos un mensaje indicando el numero de 'a' o 'A' que se han encontrado. / printf ("\nHay %d 'a' o 'A'.", contador); / Hacemos una pausa hasta que el usuario pulse Intro */ fflush(stdin); printf("\nPulse Intro para finalizar..."); getchar(); } 0 i 2 3 4 5 6 7 8 9
'a' 'G' 'P' 'o' T 'A' 'S’ ’a' 'b’ 'V'
Figura 10.7. Ejemplo del array de caracteres.
Lo más destacable para comentar de este programa es el bucle for que cuenta el número de 'a' o 'A' que hay en el array : for (celda=0; celda<10; celda++) { if ((letras[celda] == 'a') || (letras[celda] == 'A')) contador++; }
letras
Arrays 185
En cada repetición del bucle la variable celda toma un valor del 0 al 9. De esta manera, en la primera iteración la condición es equivalente a: if ( (letras[0] == 'a') || (letras[0] == 'A')) contador++;
Si partimos del supuesto de que el array almacena los mismos datos de la fi- gura 10.7, entonces la condición es verdadera, porque en la celda 0 hay una 'a', y el valor de la variable contador se incrementa en una unidad. En la siguiente iteración celda vale 1 y la condición es equivalente a: if ( (letras[1] == 'a') || (letras[l] == 'A')) contador++;
En este caso, la condición es falsa, porque en la celda 1 hay una 'G', y el valor de la variable contador no se incrementa, contador++ no se ejecuta. Y así sucesivamente. El resultado en la pantalla se muestra en la figura 10.8.
Figura 10.8. Resultado de contar el número de 'a' y 'A'.
Si la forma de representar un array unidimensional es como se muestra en la figura 10.9.
0 1 2 3 4
array_unldimensional
Figura 10.9. Representación de un array unidimensional.
Arrays 187
Donde tipo es el tipo de dato que van a almacenar las celdas (y que es el mismo para todas), identificador es el nombre del array bidimensional, numero_filas es el número de filas del array y numero_columas es el número de columnas del array. La siguiente línea de código declara un array bidimensional que se llama array_bi, de tipo int y con 4 filas y 6 columnas.
int array_bi[4][6];
Su representación gráfica se muestra en la figura 10.12.
Figura 10.12. Representación gráfica de array_bi.
En cada una de las celdas de array_bi podemos almacenar datos que sean de tipo int.
Para acceder a una celda del array bidimensional, tanto para obtener su contenido como para asignar un valor a ésta, escribimos el identificador del array seguido del índice de la fila entre corchetes y del índice de la columna entre corchetes:
identificador[indice_fila][indice_columna]
Veamos unos ejemplos.
array_bi 0 1 2 3 4 5
0
1
2
3
188 Capítulo 10
array_bi
1
3
Figura 10.13. Aspecto de arrray_bi tras los ejemplos.
En el mismo momento de la declaración del array podemos asignar unos va- lores iniciales a sus celdas. La sintaxis es: tipo identificador[numero_filas][numero_columnas] = {lista_de_valores}; Donde lista_de_valores son los distintos valores de las celdas separados por comas: valor_l, valor_2,..., valor_n. Estos valores se asignan a las celdas siguiendo el orden: de la fila 0 a la última y de la columna 0 a la última; gráficamente: de izquierda a derecha y de arriba abajo. Así, si escribimos la siguiente declaración: int tabla[31[4] =
1, 2, 3, 4, 12, 100, 7, - 2, 27, 29, 501, 12
el array tabla quedará como se muestra en la figura 10.14. No es necesario escribir la inicialización colocada de tal manera, pero así ayuda a ver claramente qué valor va en cada celda.
0 1 2 3 4 5
701
8
11
190 Capítulo 10
int números[10][5]; int fila, columna; for (fila=0; fila<10; fila++) for (columna=0; columna<5; columna++) números[fila][columna]=0; Para cada iteración del primer bucle for la variable fila toma un valor de 0 a 9 y se produce un ejecución completa de la segunda sentencia for, que está anidada. En cada iteración del segundo for la variable columna toma un valor de 0 a 4. De esta manera, la ejecución completa de la primera itera- ción del primer for (cuando fila toma el valor 0) es equivalente a: números[0][0]=0; números[0][1]=0; números[0][2]=0; números[0][3]=0; números[0][4]-0; La ejecución completa de la segunda iteración del primer for (cuando fila toma el valor 1) es equivalente a: números[1][0]=0; números[1][1]=0; números[1][2]=0; números[1][3]=0; números[1][4]=0; Y así sucesivamente. Como puede observarse, la forma que se ha utilizado para acceder al array consiste en seleccionar una fila y recorrer sus columnas, seleccionar otra fila y recorrer sus columnas. Tras la ejecución completa, el array almacena en todas sus celdas el valor 0. El mismo ejemplo con la sentencia while: int números[10][5] ; int fila, columna; fila=0; while (fila<10) { columna=0; while (columna<5) { números[fila][columna]= ; columna++; } fila++; } El mismo ejemplo con la sentencia do-while: int números[10][5]; int fila, columna; fila=0; do
Arrays 191
Si queremos almacenar en el array bidimensional distintos valores introduci- dos por teclado podemos recorrerlo e ir asignando a cada una de las celdas un valor mediante cualquier función de lectura del teclado. A continuación mostramos el mismo ejemplo con las tres sentencias repetitivas y únicamen- te con el código principal. En el siguiente ejemplo se realiza esta operación con un array de 10 filas y 5 columnas de tipo int, la sentencia f or y la función scanf. int números[10][5]; int fila, columna; for (fila=0; fila<10; fila++) for (columna=0; columna<5; columna++) scanf("%d", ínumeros[fila][columna]);
Para cada iteración del primer bucle for la variable fila toma un valor de 0 a 9 y se produce un ejecución completa de la segunda sentencia for, que está anidada. En cada iteración del segundo for la variable columna toma un valor de 0 a 4. De esta manera, la ejecución completa de la primera iteración del primer for (cuando f i l a toma el valor 0) es equivalente a:
scanf ("%d", &numeros[0][0]); scanf ("%d", &numeros[0][1]); scanf ("%d", &numeros[0][2]); scanf ("%d", &numeros[0][3]); scanf ("%d", &numeros[0][4]);
La ejecución completa de la segunda iteración del primer for (cuando fila toma el valor 1) es equivalente a:
scanf ("%d", &numeros[1][0]); scanf ("%d", &numeros[1][1]); scanf ("%d", &numeros[1][2]); scanf ("%d", &numeros[1][3]); scanf ("%d", &numeros[1][4]);
{ columna=0; do { numeros[fila][columna]= ; columna++; } while (columna<5); fila++; } while (fila<10);
Arrays 193
int números[10] [5]; int fila, columna; for (fila=0; fila<10; fila++) for (columna=0; columna<5; columna++) printf("%d", &numeros[fila][columna]);
Para cada iteración del primer bucle for la variable fila toma un valor de 0 a 9 y se produce un ejecución completa de la segunda sentencia for, que está anidada. En cada iteración del segundo for la variable columna toma un valor de 0 a 4. De esta manera, la ejecución completa de la primera iteración del primer for (cuando fila toma el valor 0) es equivalente a: scanf ("%d", números[0][0]) ; printf ("%d", números[0][1]); printf ("%d", números[0][2]); printf ("%dn, números[0][3]); printf ("%d", números[0][4]);
La ejecución completa de la segunda iteración del primer for (cuando fila toma el valor 1) es equivalente a: printf ("%d", números[1][0]); printf ("%dM, números[1][1]); printf ("%d ", números[1][2]); printf (n%dM, números[1][3]); printf ("%d", números[1][4]);
Y así sucesivamente. En la pantalla aparecerán todos los valores almacena- dos en el array, uno seguido de otro. Habrá que añadir algunos detalles a la cadena de la función printf para mejorar la presentación en pantalla. El mismo ejemplo con la sentencia while:
int números[10][5]; int fila, columna; fila=0;
while (fila<10) {
columna=0; while (columna<5) { printf("%d", números[fila][columna]); columna++; } fila++;
}
El mismo ejemplo con la sentencia do-while:
int números[10][5]; int fila, columna; fila=0; do {
194 Capitulólo
columna=0; do { printf("%d", números[fila][columna]); columna++; } while (columna<5); fila++; } while (fila<10);
El siguiente programa crea un array bidimensional de 5 filas y 6 columnas. La primera celda de cada columna almacenará el número de expediente de los alumnos de una clase (hay 6 alumnos). Las tres celdas que hay por debajo de la primera almacenarán las notas de tres asignaturas. La última celda de la columna almacenará la nota media de las tres notas del alumno de dicha columna. Todos los valores son números enteros, luego el array es de tipo int. En la figura 10.16 se muestra un esquema.
Alumno Alumno Alumno Alumno Alumno Alumno 1 2 3 4 5 6 N° Expediente: 301 302 303 304 305 306
Nota 1 : 7 5 8 6 6 7
Nota 2: 10 6 9 5 10 8
Nota 3: 5 5 7 5 5 6
Nota Media: 7 5 8 5 7 7
Figura 10.16. Esquema.
El programa rellena el array bidimensional pidiendo al usuario en primer lugar el número de expediente del alumno y, en segundo lugar, sus tres notas. Esto lo hará para los seis alumnos. Después, se calcula la nota media de las tres notas de cada alumno y la almacena en la celda correspondiente. Por último, se muestra el número de expediente del alumno con la nota media mayor y dicha nota. #include <stdio.h> int main (void) {