Está en la página 1de 12

FUNDAMENTOS DE PROGRAMACIÓN.

APUNTES

UNIDAD 4.
Estructuras de datos estáticas. ARRAYS.

4.1 DEFINICION Y USO.

Un array es una colección de variables del mismo tipo que se


denominan por un nombre común. A un elemento específico de un array
se accede mediante un índice.

En C todos los arrays constan de posiciones de memoria


contiguas. La dirección más baja corresponde al primer elemento y la
dirección más alta al último elemento.

Los arrays pueden tener de una a varias dimensiones.

4.2 ARRAYS UNIDIMENSIONALES

La forma general de declaración de un array unidimensional es:

Tipo nombre_de_variable[tamaño];

Ejemplo: int tabla [10];

En C los arrays tienen que declararse explícitamente para que así


el compilador pueda reservar espacio en memoria para ellos.

Tipo: es el tipo base del array, que es el tipo de cada elemento


del array.
Tamaño: indica cuántos elementos.

Todos los arrays tienen el 0 como índice de su primer elemento.


Por tanto, cuando se escribe.

int tabla[10];

el compilador reserva 10 posiciones de memoria de tamaño entero


(2 bytes).

Dirección de memoria ocupada por la tabla:10*2


la primera posición

Para acceder a un elemento de la tabla indicaremos


nombre_variable[posición] Ejemplo para acceder al elemento 5
tabla[4]

39
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

Ejemplo:

/* Declaración de un array. */

#include <stdio.h>
main() /* Rellenamos del 0 - 9 */
{
int vector[10],i;
for (i=0;i<10;i++) vector[i]=i;
for (i=0;i<10;i++) printf(" %d",vector[i]);
}

0 1 2 3 4 5 6 7 8 9

C no comprueba los límites de los arrays. Se puede sobrepasar


cualquier extremo del array y escribir en alguna otra variable. Es
tarea del programador controlar y comprobar los límites del array.

Inicialización de un array de números

Tipo Nombre de la matriz [longitud] ={lista de valores}

Ejemplos:

*Inicialización de un array entero de longitud 5:


int i[5] ={1,4,9,2,5}

*Inicilaización de un array sin determinar su dimensión:

int pwr[ ] ={1,2,4,8,16,32,64,23};

en este caso solo introducimos 8 valores.

40
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

• CADENAS

El uso más común de los arrays unidimensionales es como cadena de


caracteres. Aunque C no define un tipo cadena, incluye algunas de
las funciones de manipulación de cadenas más potentes de todos los
lenguajes. En C, una cadena se define como un array de caracteres de
cualquier longitud que termina en un carácter nulo \0. Por ello, al
declarar arrays de caracteres es necesario que sean de un carácter
más que la cadena más larga que pueda contener.

Ejemplo para declarar un array s que contenga 10 caracteres se


declarara s[11].

Aunque C no define un tipo de datos de cadenas, permite


disponer de constantes de cadena. Una constante de cadena es una
lista de caracteres encerrada entre dobles comillas.

Ejemplo: “hola, que tal” “esto es un ejemplo”

En este caso no hace falta añadir el carácter nulo al final ya que


el compilador lo hace automáticamente.
Inicialización de un array de cadenas

Ejemplos:

*Inicialización de una cadena de 3 caracteres:


char a[3] ={´A´, ´B´, ´C´}

para imprimir esto deberemos hacerlo carácter a carácter.

Printf(“%c”, a[1]);

*Inicialización de una cadena de 4 caracteres:

char P[4]={‘a’,’b’,’c’,’\0’}….....

Esta cadena tiene el carácter de fin de cadena con lo que se


podrá imprimir como cadena de caracteres:

printf(“%s”,P)
o
printf(P)

*Inicialización de un string de 5 caracteres

(4 de herb y 1 de \0):

char izena[5]=“Herb”

Siempre deberá de ir un carácter más para ´\0´ carácter nulo).

*Inicialización de un string de caracteres sin determinar su


dimensión:

char pompt[ ]=“introduce tu nombre : “;

41
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

Además de las funciones estándar de entrada/salida existen otras


para la lectura y escritura de cadenas (string):

Estas funciones usan el archivo de cabecera: stdio.h

 char *gets(char *var)

Permite leer una cadena de caracteres introducida por el


teclado. Permite introducir una serie de palabras separadas
por espacios en blanco. Termina al pulsar intro, que
introduce un salto de línea y que es reemplazado por el
carácter \0 par indicar el final de la cadena introducida.

 int puts(const char *cadena)

Escribe una cadena de caracteres en la salida standar. Transforma el


carácter \0 en un salto de línea.

Diferencia entre scanf y gets: con scanf solamente leemos una


palabra aunque se introduzcan mas de una mientras que con gets lee
todas las introducidas.

• Funciones de manejo de cadenas

C soporta una gran variedad de funciones de manejo de cadenas.


Algunas de las más comunes: strcpy(), strcat(),strlen()y strcmp().

Todas estas funciones usan el archivo de cabecera: string.h

 char *strcpy(char *s1, const char *s2)

Copia la cadena apuntada por s2 en la apuntada en s1.


Devuelve como resultado s1.


 char *strcat(char *s1, const char *s2)

Concatena la cadena apuntada por s2 en la apuntada en s1.


Devuelve como resultado s1.

 int strlen(const char *s1)

Devuelve la longitud de la cadena apuntada por s1

 int strcmp(const char *s1, const char *s2)

Devuelve cero si las dos cadenas son iguales, mayor que cero
si la cadena apuntada por s1 es mayor que la apuntada por s2
y, y menor que cero si la cadena apuntada por s1 es menor
que la cadena apuntada por s2. Todas las comparaciones se
hacen alfabéticamente.

42
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

Estas funciones usan el archivo de cabecera: conio.h

 int getch()

Devuelve el siguiente carácter leído de la consola, pero no


muestra el carácter por la pantalla.

 int getche()

Devuelve el siguiente carácter leído de la consola, y


muestra el carácter por la pantalla.

Estas dos funciones no están definidas por el estándar de ANSI C.

Ejemplo: uso de las funciones puts, gets

#include <stdio.h>
#include <conio.h>

main()
{
char cadena[80];
printf(“introduzca su nombre completo: ”);
gets(cadena);
printf(“hola ”);
puts(cadena);
printf(“\n\n”);
printf(“\nPulse una tecla para continuar\n”);
getch();

Ejemplo: uso de las funciones de string.

#include <stdio.h>
#include <string.h>

main()
{
char c1[80], c2[80];
gets(c1);
gets(c2);
printf(“longitudes: %d %d\n”, strlen(c1), strlen(c2));
if (!strcmp(c1,c2)) printf(“las cadenas son iguales\n”);
strcat(c1,c2);
printf(“%s\n”,c1);

Si se ejecuta el programa y se introducen las cadenas hola y


hola, la salida es: longitudes 5, 5 las cadenas son iguales
holahola.

43
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

Recordar que strcmp devuelve falso si las cadenas son iguales


por lo que si se está probando la igualdad hay que utilizar el
operador lógico ! para invertir la condición.

Estas funciones usan el archivo de cabecera: ctype.h

 int islower(char ch)

Esta función devuelve un valor distinto de cero si ch es una


letra minúscula, en cualquier otro caso devuelve 0.

 int isupper(char ch)

Esta función devuelve un valor distinto de cero si ch es una


letra mayúscula, en cualquier otro caso devuelve 0.

 char tolower(char ch)

Devuelve el equivalente en minúscula de ch si es una letra;


en cualquier otro caso devuelve ch sin modificar.

 char toupper (char ch)

Devuelve el equivalente en mayúscula de ch si es una;en


cualquier otro caso devuelve ch sin modificar

Ejemplo:

Programa que lea una frase en minúsculas y devuelva en


mayúsculas.

#include "stdio.h"
#include "string.h"
#include "ctype.h"

main()
{

char frase[80];
int cont1;

printf("Escribe una frase: ");


gets(frase);
for(cont1=0; cont1<=strlen(frase); cont1++)
frase[cont1]=toupper(frase[cont1]);
puts(frase);
getchar();
getchar();
}

44
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

4.3 ARRAYS MULTIDIMENSIONALES (MATRICES)

Una matriz es un array multidimensional. Se definen igual que


los vectores excepto que se requiere un índice por cada dimensión.

Su sintaxis es la siguiente:
tipo nombre [tamaño 1][tamaño 2]...;

Una matriz bidimensional se podría representar gráficamente


como una tabla con filas y columnas.

Una matriz m[2][3] tendrá la siguiente estructura:

m Array

0.columna 1.columna 2.columna


0.fila m 0,0 m 0,1 m 0,2
1.fila m 1,0 m 1,1 m 1,2

Para hacer referencia a un elemento del array m, como es un


array de dos dimensiones, necesitaremos dos índices. Uno para
moverse por las filas y otro para las columnas.

Por ejemplo:

m[1][1]=4;
m[0][2]=7;

m Array

columna 0 columna 1 columna 2


fila 0 m 0,0 m 0,1 7
fila 1 m 1,0 4 m 1,2

En el ejemplo puedes ver como se rellena y visualiza una matriz


bidimensional. Se necesitan dos bucles para cada una de las
operaciones. Un bucle controla las filas y otro las columnas.

Ejemplo: /* Matriz bidimensional. */

#include <stdio.h>
main() /* Rellenamos una matriz */
{
int x,i,numeros[3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
getchar();
getchar();

45
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

Si al declarar una matriz también queremos inicializarla, habrá


que tener en cuenta el orden en el que los valores son asignados a
los elementos de la matriz. Veamos algunos ejemplos:

int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; o

int numeros[3][4]={{1,2,3,4}
{5,6,7,8}
{9,10,11,12}};

quedarían asignados de la siguiente manera:

numeros[0][0]=1 numeros[0][1]=2 numeros[0][2]=3 numeros[0][3]=4

numeros[1][0]=5 numeros[1][1]=6 numeros[1][2]=7 numeros[1][3]=8

numeros[2][0]=9 numeros[2][1]=10 numeros[2][2]=11 numeros[2][3]=12

numeros
columna 0 columna 1 columna 2 columna 3
Fila 0 1 2 3 4
Fila 1 5 6 7 8
Fila 2 9 10 11 12

.
 Arrays de cadenas de caracteres

Si queremos utiliza mas de una cadena de caracteres debemos


utilizar un array de dos dimensiones. Cada línea será un array de
una dimensión. Se declarará de la siguiente forma:

char nombre[nº de elementos][longitud de los elementos];

si declaramos char m[3][10];

El código indica, que se ha creado un array unidimensional m cuyos


elementos son m[0], m[1], m[2]. Y a su vez, estos elementos son
arrays de una dimensión de tamaño 10 que tiene elementos de tipo
char.

m0
m1
m2
...

También se pueden inicializar cadenas de texto:

Char dias[7][10]={"lunes","martes","miércoles","jueves","viernes","sábado","domingo"};

Para referirnos a cada palabra bastaría con el primer índice:

printf("%s",dias[i]);

46
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

La matriz tridimensional se utiliza, por ejemplo, para trabajos


gráficos con objetos 3D. Además ocupa mucha memoria.

4.4 BUSQUEDA DE UN ELEMENTO EN UN ARRAY

TAULA BATEAN ELEMENTU BATEN BILAKETA

Tabla desordenada

Se recorrerá toda la tabla desde el primer hasta


el último elemento. Si no se encuentra (el
elemento a encontrar) lo indicaremos.

Tabla ordenada
Búsqueda lineal
Se recorrerá toda la tabla desde el primer
elemento hasta el último si los elementos de la
tabla son menores que el elemento a encontrar.
Si el elemento de la tabla es mayor que el
elemento a encontrar, sabemos, que a partir de
ahí en adelante no estará ya que la tabla esta
ordenada. La búsqueda termina.

Solamente cuando la tabla está ordenada.

El elemento a encontrar se comparará con el


elemento que se encuentra en la mitad de la
tabla. Si es mayor, Si es mayor (el elemento
Búsqueda binaria del array) entonces de la mitad en adelante no
se comparan los elementos, ya que la tabla esta
ordenada. Si es menor al contrario. Luego la
tabla va disminuyendo. El proceso se repetirá
hasta encontrar el elemento o hasta terminar la
tabla.

METODOS DE BUSQUEDA EN UNA TABLA: METODO BINARIO.

izq = 0;
der = n-1; /* n=numero elementos de la tabla */
mit= int((izq+der)/2);
while ((num != tabla[mit])) && (izq<der))
{
if (num> tabla[mit]) izq=der+1;
else der = mit-1;
mit= int((izq+der)/2);
}
if (num == tabla[mit])
{
printf("El numero %d se encuentra en la posicion “,tabla[mit],mit);
} }
else printf("No se encuentra en la tabla.\n");

47
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

4.5 ORDENACION DE UN ARRAY

A la hora de ordenar los elementos de un array existen diferentes


métodos.

Método de selección, de inserción directa, shell, intercalación,


método burbuja.

Nosotros nos vamos a centrar en éste último método. Funciona


revisando cada elemento de la lista que va a ser ordenada con el
siguiente, intercambiándolos de posición si están en el orden
equivocado. Es necesario revisar varias veces toda la lista hasta
que no se necesiten más intercambios, lo cual significa que la lista
está ordenada.

La implementación correspondiente a este método es la siguiente:

Siendo n el número de elementos de un array.

for (i = 0; i < (n-1); i++)


for (j = 0;j <= (n-i-2);j++)
if (taula[j] > taula[j+1])
{
aux = taula[j];
taula[j] = taula[j+1];
taula[j+1] = aux;

4.6 FUNCIONES DE C

En C hay una función que realiza esta ordenación sin tener que
implementarla, llamada bsearch (incluida en stdlib.h):

La función bsearch() realiza una búsqueda binaria en el array


ordenado y devuelve la posición del elemento buscado.

bsearch(valor,nombre_array,numero,tamaño,nom_func)

donde valor es el elemento a buscar, nombre_array es el nombre del


array a ordenar, numero es el número de elementos del array, tamaño
indica el tamaño en bytes de cada elemento y función es una función,
que hay que implementar, que recibe dos elementos y devuelve un
valor.

La función debe tener la siguiente forma:

/* Prototipo de la función de comparar */

int comparar(const void *arg1, const void *arg2)


{
if(*(int *)arg1 < *(int *)arg2) return -1;

48
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

else if(*(int *)arg1 > *(int *)arg2) return 1;


else return 0;
}
Si el elemento no esta devolverá un valor NULL y si no un puntero al
elemento que coincida.

También hay una función que realiza la ordenación sin tener que
implementarla, llamada qsort (incluida en stdlib.h):

qsort(nombre_array,numero,tamaño,función);

donde nombre_array es el nombre del array a ordenar, numero es el


número de elementos del array, tamaño indica el tamaño en bytes de
cada elemento y función es una función, que hay que implementar, que
recibe dos elementos y devuelve :

La función debe tener la siguiente forma:

int comparar(const void *arg1, const void *arg2)


{
if(*(int *)arg1 < *(int *)arg2) return -1;
else if(*(int *)arg1 > *(int *)arg2) return 1;
else return 0;
}

Ejemplo utilizando las dos funciones:

#include <stdlib.h>
#include <stdio.h>

#define ELEMENTOS 100

/* Prototipo de la función de comparar */

int comparar(const void *arg1, const void *arg2)


{
if(*(int *)arg1 < *(int *)arg2) return -1;
else if(*(int *)arg1 > *(int *)arg2) return 1;
else return 0;
}

main()
{
int i, num;
int lista[ELEMENTOS], *elementoPtr;

/* Contenido aleatorio */
for(i = 0; i < ELEMENTOS; i++) lista[i] = rand() % 100 + 1;

/* Quick-Sort */
qsort(lista, ELEMENTOS, sizeof(lista[0]), comparar);

49
FUNDAMENTOS DE PROGRAMACIÓN. APUNTES

/* Mostramos la lista ordenada */

for(i = 0; i < ELEMENTOS; i++) printf("%d ", lista[i]);


printf("\n");

/* Ahora busquemos algunos elementos en la lista */

puts( "Especifique un numero a encontrar dentro de la lista


ordenada\n(un numero negativo para salir):" );
scanf( "%d", &num );
while( num >= 0 )
{elementoPtr=(int*)bsearch(&num, lista, ELEMENTOS, sizeof(lista[0]), comparar );
if( elementoPtr != NULL )
printf( "Encontrado: %d\n", *elementoPtr );
else
printf( "No encontrado: %d\n", num );
scanf( "%d", &num );
}
}

50

También podría gustarte