You are on page 1of 38

Asignatura:

PROGRAMACIN ESTRUCTURADA

TIPOS DE DATOS
COMPUESTOS ESTTICOS EN
C

2012

AUTOR: ING. KARINA ESQUIVEL

Tipos de Datos Compuestos Estticos en C

ARRAYS (listas y tablas) EN C




INTRODUCCIN:

Arreglo: Un Arreglo es una estructura de datos que almacena bajo el mismo nombre (variable)
a una coleccin de datos del mismo tipo. Los arreglos se caracterizan por:
Almacenar los elementos en posiciones contiguas de memoria.
Tienen un mismo nombre de variable que representa a todos los elementos.
Para hacer referencia a esos elementos es necesario utilizar un ndice que especifica el
lugar que ocupa cada elemento dentro del archivo.
Un array (lista o tabla) es una coleccin de datos del mismo tipo que se referencian por un
nombre comn. Los datos se llaman elementos del array y se numeran consecutivamente 0, 1,
2, 3, etc. El tipo de elementos almacenados en el array puede ser cualquier tipo de dato C,
incluyendo estructuras definidas por el usuario. Normalmente el array se utiliza para
almacenar tipos tales como char, int o float.
Cada tem del array se denomina elemento. Los elementos de un array se numeran
consecutivamente 0, 1, 2, 3... Estos nmeros se denominan valores ndice o subndice del
array. El trmino subndice se utiliza ya que se especifica igual que en matemticas, como una
secuencia a0, a1, a2, a3 Estos nmeros localizan la posicin del elemento dentro del array,
proporcionando acceso directo al array.
Si el nombre del array es "a", entonces a[0] es el nombre (valor) del elemento que est en la
posicin 0, a[1] es el nombre (valor) del elemento que est en la posicin 1, etc. En general, el
elemento i-simo est en la posicin i-1. De modo que si el array tiene n elementos, sus
nombres son a[0], a[1], a[2], ., a[n-1].
Grficamente se representa as el array a de 6 elementos:
int a[6];

//Declara un array de 6 elementos enteros

Figura: Array de 6 elementos.


El array tiene 6 elementos: a[0] contiene 5, a[1] contiene 8, a[2] contiene 6, a[3] contiene 10,
a[4] contiene 9, a[5] contiene 4. En un array sus elementos se almacenan siempre en una
secuencia de posiciones de memoria contiguas.
2

Tipos de Datos Compuestos Estticos en C

En C los ndices de un array siempre tiene como lmite inferior 0, como ndice superior el
tamao del array menos 1.

DEFINICIN Y DECLARACIN DE ARRAYS EN C:

Al igual que con cualquier tipo de variable, se debe declarar un array antes de utilizarlo. Un
array se declara de forma similar a otros tipos de datos, excepto que se debe indicar al
compilador el tamao o longitud del array.
La sintaxis para declarar un array es simple:
tipo nombreArray [numerodeElementos];
Siendo:
tipo: El tipo de los elementos que conformarn el array.
nombreArray: El nombre de nuestro array .
numerodeElementos: Un nmero entero mayor que cero que indica el tamao del array.
Declaracin de arrays (Ejemplos):
int array1[100]; /* Declara un array de 100 elementos enteros */
char array2[15]; /* Declara un array de 15 caracteres */
Si por ejemplo, se quiere crear un array de nmeros reales y su tamao es una constante
representada por un parmetro:
#define NE 20
float array[NE];
Para acceder al elemento 3 y leer un valor de entrada del array: scanf(%f,&array[2]);
Por ejemplo, para crear un array (lista) de diez variables enteras, se escribe:
int numeros[10];
Esta declaracin hace que el compilador reserve espacio suficiente para contener diez valores
enteros. En C los enteros ocupan, normalmente, 2 bytes, de modo que un array de diez enteros
ocupa 20 bytes de memoria.
Precaucin: C no comprueba que los ndices del array estn dentro del rango definido. As, por
ejemplo, se puede intentar acceder a numeros [12] y el compilador no producir ningn error,
lo que puede producir un fallo en su programa, dependiendo del contexto en que se encuentre
el error.

Tipos de Datos Compuestos Estticos en C

SUBNDICES DE UN ARRAY:

El ndice de un array se denomina, con frecuencia, subndice del array. El trmino procede de
las matemticas, en las que un subndice se utiliza para representar un elemento determinado.
int numeros[4];
numeros0
equivale a
numeros1
equivale a
numeros2
equivale a
numeros3
equivale a

numeros[0]
numeros[1]
numeros[2]
numeros[3]

El mtodo de numeracin del elemento i-simo con el ndice o subndice i-1 se denomina
indexacin basada en cero. Su uso tiene el efecto de que el ndice de un elemento del array es
siempre el mismo que el nmero de pasos desde el elemento inicial numeros[0] a ese elemento.
Por ejemplo, numeros[3] est a 3 pasos o posiciones del elemento numeros[0].
Ejemplos:
int edad[5]; //Array edad, contiene 5 elementos: el primero edad[0] y el ltimo edad[4]
int pesos[25], longitudes[100];
// Declara dos arrays de enteros
float salarios[25];
//Declara un array de 25 elementos float
double temperaturas[50];
//Declara un array de 50 elementos double
char letras[15];
//Declara un array de caracteres

ALMACENAMIENTO EN MEMORIA DE LOS ARRAYS:

Los elementos de los arrays se almacenan en bloques contiguos. As por ejemplo, los arrays:
int edades[5];
char codigos[5];

Precaucin: C permite asignar valores fuera de rango a los subndices. Se debe tener cuidado
no hacer esta accin, debido a que se sobreescribiran datos o cdigo.
Los arrays de caracteres funcionan de igual forma que los arrays numricos, partiendo de la
base de que cada carcter ocupa normalmente un byte. As, por ejemplo, un array llamado
ciudad se puede representar de la siguiente manera:

Tipos de Datos Compuestos Estticos en C

Ejemplo:

char ciudad[]= Leon;


ciudad
L

[0]

[1]

[2]

[3]

\0

Es importante tomar en cuenta que en las cadenas de caracteres el sistema siempre inserta un
ltimo carcter (nulo, \0) para indicar el fin de cadena.

INICIALIZACIN DE UN ARRAY

Se deben asignar valores a los elementos del array antes de utilizarlos, tal como se asignan
valores a variables. Para asignar valores a cada elemento del array de enteros edades, se
puede escribir:
edades [0] = 15;
edades [1] = 25;
edades [3] = 30;
edades [4] = 35;
La primera sentencia fija edades[0] al valor 15, edades[1] al valor 25, etc. Sin embargo, este
mtodo no es prctico cuando el array contiene muchos elementos. El mtodo utilizado,
normalmente, es inicializar el array completo en una sola sentencia.
Ejemplo: int edades[4]={15,25,30,35};
Cuando se inicializa un array, el tamao del array se puede determinar automticamente por
las constantes de inicializacin. Estas constantes se separan por comas y se encierran entre
llaves, como en los siguientes ejemplos:
int numeros[6] = {10, 20, 30, 40, 50, 60};
int n[ ]= {3, 4, 5}; //Declara un array de 3 elementos
char c[ ] = {L,u,i,s}; //Declara un array de 4 elementos
En C las cadenas de caracteres, se caracterizan por tener un carcter final que indica el fin de
la cadena, es el carcter nulo (\0). Lo habitual es inicializar un array de caracteres (una
variable cadena) con una constante cadena. Ejemplo: char cad [ ] = Hola mundo;

Tipos de Datos Compuestos Estticos en C

El mtodo de inicializar arrays mediante valores constantes despus de su definicin es


adecuado cuando el nmero de elementos del array es pequeo. Por ejemplo, para inicializar un
array de 10 enteros a los valores de 10 a 1 y visualizar dichos valores en un orden inverso, se
puede escribir:
Ejemplo #1: Programa que imprime los nmeros del 1 al 10 en orden descendente.
//orden_desc.c
#include<stdio.h>
void main()
{
int i,cuenta[10]={1,2,3,4,5,6,7,8,9,10};
for( i=9;i>=0;i--)
printf("\n ELEMENTO[%d]: %d\n", i, cuenta[i]);
}
Ejemplo de Salida:

Ejemplo #2: Programa para inicializar un array de 10 elementos enteros a 1.


//inicializar.c
#include<stdio.h>
void main()
{
int valores[10],i;
for(i=0;i<=9;i++)
valores[i]=1;
printf("Elemento\tValor\n");
printf("--------\t------");
for(i=0;i<=9;i++)
printf("\n%d\t\t%d",i,valores[i]);
}

Tipos de Datos Compuestos Estticos en C

Ejemplo de Salida:


Se pueden asignar constantes simblicas como valores numricos, de modo que las
sentencias siguientes son vlidas:
#define ENE 31
#define FEB 28
#define MAR 31

int meses [12] =


NOV, DIC};

{ENE, FEB, MAR, ABR, MAY, JUN, JUL, JUL, AGO, SEP, OCT,


Pueden asignarse valores a un array utilizando un bucle for, while o do-while y ste
suele ser el sistema ms empleado normalmente.
Ejemplo #3: Programa que lee en un array las edades de un grupo de N estudiantes y
visualiza el promedio de edad de dicho grupo.
Pseudocdigo:
Proceso edad_promedio
Dimension aEdades[5];
sum<-0;
prom<-0.0;
indice<-1;
Mientras indice <= 5 Hacer
Escribir 'Ingrese la edad de la persona ', indice, ': ';
Leer aEdades[indice];
indice <- indice + 1;
FinMientras
indice<-1;
Mientras indice <= 5 Hacer
sum <- sum + aEdades[indice];
indice <- indice + 1;
FinMientras
7

Tipos de Datos Compuestos Estticos en C

prom<-sum/5;
Escribir 'La edad promedio es: ', prom;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int aEdades[100],indice=1,nest,sum=0;
float prom=0.0;
printf("\nCUANTOS ESTUDIANTES?");
scanf("%d",&nest);
while(indice<=nest)
{
printf("Ingrese la edad de la persona %d: ",indice);
scanf("%d",&aEdades[indice]);
indice++;
}
indice=1;
while(indice<=nest)
{
sum+= aEdades[indice];
indice++;
}
prom=sum/nest;
printf("La edad promedio es:%.f\n",prom);
}
Ejemplo de Salida:

Tipos de Datos Compuestos Estticos en C

Ejemplo #4: Programa en C que al recibir como dato un arreglo unidimensional de nmeros
reales, obtenga como resultado la suma del cuadrado de los nmeros.
//cuadrado_array.c
Solucin en Pseudocdigo:
Proceso cuadrado_array
Dimension numeros[10];
sum<-0;
indice<-1;
Mientras indice <= 10 Hacer
Escribir 'Ingrese el numero';
Leer numeros[indice];
cuadrado <- numeros[indice]* numeros[indice];
suma <-suma + cuadrado;
indice <- indice + 1;
FinMientras
Escribir 'La suma de los cuadrados de los ',indice-1,' numeros',' es ',suma;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<math.h>
void main()
{
int numeros[10],indice=1,cuadrado,sum=0;
while(indice<=10)
{
printf("Ingrese el numero %d:",indice);
scanf("%d",&numeros[indice]);
cuadrado=pow(numeros[indice],2);
sum+=cuadrado;
indice++;
}
printf("La suma de los cuadrados de los %d numeros es:%d\n",indice-1,sum);
}

Tipos de Datos Compuestos Estticos en C

Ejemplo de Salida:

Ejemplo #5: Programa en C que almacene en un arreglo unidimensional de tipo entero los
primeros 10 nmeros primos.
Cdigo en Lenguaje C
//primos_array.c
#include <stdio.h>
int main(void)
{
int n, i,p=0,nprimos[10];
printf("\nLos 10 primeros numeros primos son:\n\n");
/*Se analizarn los nmeros empezando desde 1, 2, 3, etc hasta que se muestren 10 nmeros
primos, es decir, hasta que p sea igual a 10*/
for(n=1; ;n++ )
{
/*Para disminuir el nmero de divisiones debemos empezar en 2 y terminar en un
valor igual a la mitad del nmero analizado. La divisin por nmeros mayores
tendrn un residuo que ser siempre mayor a 0*/
for(i=2; i <= n/2; i++)
{
/*Si hay algn nmero dentro del rango 2 a n/2 por el cual n sea divisible,
ya no tiene sentido seguir dividiendo porque n ya no sera primo; por lo
tanto, se debera salir del lazo*/
if (n%i == 0)
break;
}

10

Tipos de Datos Compuestos Estticos en C

if (i >= n/2+1 )
{
/*Si es que se ha probado con todas las divisiones cuyo divisores estn en
el rango 2 a n/2, el nmero ser primo y ser impreso en la tabla*/
nprimos[p]=n;
//Cada vez que se muestra un nmero primo, se incrementa el contador p
p++;
if (p==10)
//Cuando se cuenta 10 nmeros primos impresos se saldr del lazo
break;
}
}
//Impresin de los nmeros primos
for(i=0; i <10; i++)
printf("%d -> ",nprimos[i]);
return 1;
}
Ejemplo de Salida:

Ejemplo #6: Realice un programa en C que cree un array de N elementos enteros, cuyos
valores numricos se ingresaran por teclado, y luego obtenga la suma y el promedio de
los elementos ubicados en las posiciones pares del array.
Solucin en Pseudocdigo:
Proceso pospares
Dimension pospares[10];
pospar<-0;
sum<-0;
Para in<-1 Hasta 10 Con Paso 1 Hacer
Escribir 'Ingrese el numero', in;
Leer pospares[in];
Si in % 2 = 0 Entonces
pospar <- pospar +1;
sum <- sum + pospares[in];
FinSi
FinPara
prom <- sum / pospar;
Escribir 'La Suma de los ',pospar, 'que hay en posiciones pares es: ', sum;
11

Tipos de Datos Compuestos Estticos en C

Escribir 'El Promedio de los ',pospar, 'que hay en posiciones pares es: ', prom;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<math.h>
void main()
{
int pospares[50],in,nelem,pospar=0,sum=0;
float prom;
printf("Cuantos elementos?");
scanf("%d",&nelem);
for(in=0;in<nelem;in++)
{
printf("Ingrese el numero %d:",in+1);
scanf("%d",&pospares[in]);
if(in%2==0)
{
pospar++;
sum+=pospares[in];
}
}
prom=sum/pospar;
printf("La suma de los %d numeros que hay en posiciones pares es:%d\n",pospar,sum);
printf("El promedio de los %d numeros que hay en posiciones pares
es:%.2f\n",pospar,prom);
}
Ejemplo de Salida:

12

Tipos de Datos Compuestos Estticos en C

Ejemplo #7: Realice un programa en C que lea en un array la edad de los N estudiantes
de la asignatura de Programacin Estructurada, calcule y muestre cual es la edad mnima
y mxima.
Cdigo en Lenguaje C:
//edadmax_min.c
#include<stdio.h>
void main()
{
int edades[100],e,nest,emax = 0,emin = 100;
printf("Cuantos estudiantes?");
scanf("%d",&nest);
for(e=0;e<nest;e++)
{
printf("Edad[%d]: ",e+1);
scanf("%d",&edades[e]);
if(edades[e]>emax)
emax = edades[e];
if(edades[e]<emin)
emin= edades[e];
}
printf("\n\t***LISTA DE EDADES***\n");
for(e=0;e<nest;e++)
{
printf(" %d ",edades[e]);
}
printf("\n\nLa edad minima es =%d\n",emin);
printf("\nLa edad maxima=%d\n\n",emax);
}
Ejemplo de Salida:

13

Tipos de Datos Compuestos Estticos en C

ARRAY DE CARACTERES Y CADENAS DE TEXTO

Una cadena de texto es un conjunto de caracteres, tales como: Programacin. C soporta


cadenas de texto utilizando un array de caracteres que contenga una secuencia de caracteres:
 Ejemplo: char Cadena[]= Programacion;
Es importante comprender la diferencia entre un array de caracteres y una cadena de
caracteres. Las cadenas contienen un carcter nulo al final del array de caracteres.

Cadena[0]
Cadena[1]
Cadena[2]
Cadena[3]
Cadena[4]
Cadena[5]
Cadena[6]
Cadena[7]
Cadena[8]
Cadena[9]
Cadena[10]
Cadena[11]

P
r
o
g
r
a
m
a
c
i
o
n

Cadena[0]
Cadena[1]
Cadena[2]
Cadena[3]
Cadena[4]
Cadena[5]
Cadena[6]
Cadena[7]
Cadena[8]
Cadena[9]
Cadena[10]
Cadena[11]
Cadena[12]
Cadena

Array de Caracteres

P
r
o
g
r
a
m
a
c
i
o
n
\0

Carcter Nulo

Las cadenas se sealan incluyendo un carcter final de la cadena; el carcter nulo (\0), cuyo
valor en el cdigo ASCII es 0. El medio ms fcil de inicializar un array de caracteres es hacer
la inicializacin de la declaracin:
char Cadena[13]=Programacion;
El compilador aade automticamente un carcter nulo al final de la cadena, de modo que la
secuencia real sera:
char Cadena[13]=Programacion;
Cadena

14

\0

Tipos de Datos Compuestos Estticos en C

La asignacin de valores a Cadena se puede hacer del modo siguiente:


Cadena[0]= P'
Cadena[1]= r'
Cadena[2]= o'
Cadena[3]= g'
Cadena[4]= r'
Cadena[5]= a'
Cadena[6]= m'
Cadena[7]= a'
Cadena[8]= c'
Cadena[9]= i'
Cadena[10]= o'
Cadena[11]= n'
Cadena[12]= \0'
Sin embargo, no se puede asignar una cadena a un array del siguiente modo: Cadena =
"ABCDEF";
Para copiar una constante cadena o copiar una variable de cadena a otra variable de cadena se
debe utilizar la funcin de la biblioteca estndar -posteriormente se estudiar- strcpy( )
(copiar cadenas).
strcpy( ) permite copiar una constante de cadena en una cadena. Para copiar el nombre "karen"
en el array nombre, se puede escribir strcpy(nombre, "karen" ) ; /*Copia karen en nombre */
strcpy( ) aade un carcter nulo al final de la cadena. A fin de que no se produzcan errores en
la sentencia anterior, se debe asegurar que el array de caracteres nombre tenga elementos
suficientes para contener la cadena situada a su derecha.
Ejemplo:
#include <stdio.h>
#include <string.h>
#define MAXLON 10
int main(void)
{
char original[MAXLON+1] = "cadena";
char copia[MAXLON+1];
strcpy(copia, original);
//Copia el contenido de original en copia.
return 0;
}

15

Tipos de Datos Compuestos Estticos en C

Ejemplo #8: Programa en C que compara las longitudes de dos cadenas de caracteres
ledas por teclado, e imprime un mensaje indicando si ambas cadenas tienen o no la misma
longitud.
Cdigo en Lenguaje C:
//longitud.c
#include<stdio.h>
void main()
{
char cad1[30],cad2[30];
int c1=0,c2=0;
printf("Cadena 1:");
gets(cad1);
printf("Cadena 2:");
gets(cad2);
while(cad1[c1] != '\0')
c1++;
while(cad2[c2] != '\0')
c2++;
printf("\nLa cadena 1 tiene %d caracteres\n",c1);
printf("\nLa cadena 2 tiene %d caracteres\n",c2);
if(c1==c2)
printf("%s y %s tienen LA MISMA LONGITUD\n",cad1,cad2);
else
printf("%s y %s tienen DIFERENTE LONGITUD\n",cad1,cad2);
}
Ejemplo de Salida:

16

Tipos de Datos Compuestos Estticos en C

Ejemplo #9: Programa en C que permite al usuario introducir una cadena, y determina si
la cadena es un palndromo comprobando la igualdad de los smbolos comenzando por
ambos extremos de la cadena.
Cdigo en Lenguaje C
#include<stdio.h>
#include<string.h>
void main()
{
char palabra[30];
int longcad,numc=0,alto=0;
printf("Introduzca la cadena:");
scanf("%s",palabra);
longcad=strlen(palabra)-1;
while((numc<=longcad) && !alto)
{
if(palabra[numc] != palabra[longcad])
alto=1;
numc++;
longcad--;
}
if(!alto)
printf("%s es PALINDROMO\n",palabra);
else
printf("%s NO es PALINDROMO\n",palabra);
}
Ejemplo de Salida:

17

Tipos de Datos Compuestos Estticos en C

Ejemplo #10: Este programa lee una cadena de caracteres y convierte los caracteres de
minscula a mayscula y viceversa.
Cdigo en Lenguaje C
//mayuscula_minu.c
#include <stdio.h>
void main(void)
{
char texto[20];
int i=0,n,dif;
dif = 'a'-'A';
printf("Introduzca una cadena: ");
scanf("%s",texto);
while (texto[i] != '\0')
{
if ((texto[i] >='a')&&(texto[i] <='z'))
texto[i] -= dif;
else if ((texto[i]>='A')&&(texto[i]<='Z'))
texto[i] += dif;
i++;
}
texto[i] = '\0';
printf("\n****RESULTADO****\n");
for (n=0; n<=i; n++)
{
printf("%c", texto[n]);
}
printf("\n\n");
}
Ejemplo de Salida:

18

Tipos de Datos Compuestos Estticos en C

Ejemplo #11: Programa en C que pide al usuario ingrese una cadena de caracteres e
imprime la cadena sin los signos de puntuacin ni los nmeros. Adems los caracteres
alfabticos en minscula se convierten a mayscula.
Cdigo en Lenguaje C
//Signos_numeros.c
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
void main()
{
char cadena[50];
int i=0;
printf("Introduzca una cadena que incluya digitos y signos de puntuacion:\n");
gets(cadena);
while(cadena[i] != '\0')
{
if((ispunct(cadena[i]) ==0) && (isdigit(cadena[i])==0))
{
if((islower(cadena[i])) != 0)
cadena[i]= toupper(cadena[i]);
printf("%c",cadena[i]);
}
i++;
}
}
Ejemplo de Salida:

19

Tipos de Datos Compuestos Estticos en C

Ejemplo #12: Programa en C que cuenta e imprime las vocales en minscula y mayscula
de una cadena de caracteres leda por teclado.
Cdigo en Lenguaje C:
//cuentavocales.c
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#define MAXLON 80
int main(void)
{
char a[MAXLON+1];
int i, longitud,contmin=0,contmay=0;
printf ("Introduce una cadena (max. %d caracteres.): ", MAXLON);
gets(a);
longitud = strlen(a);
for (i = 0; i < longitud ; i++)
{
if (a[i] =='a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
contmin++;
if (a[i] =='A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')
contmay++;
}
printf ("***Hay %d Vocales Minusculas***\n", contmin);
printf ("***Hay %d Vocales Mayusculas***\n", contmay);
return 0;
}
Ejemplo de Salida:

20

Tipos de Datos Compuestos Estticos en C

ARRAYS MULTIDIMENSIONALES

Los arrays multidimensionales son aquellos que tienen ms de una dimensin y en consecuencia,
ms de un ndice. Los arrays ms usuales son los de dos dimensiones, conocidos tambin por el
nombre de tablas o matrices. Sin embargo, es posible crear arrays de tantas dimensiones
como requieran sus aplicaciones.
Un array de dos dimensiones equivale a una tabla de mltiples filas y mltiples columnas.

Estructura de un array de dos dimensiones.

Si las filas se etiquetan de 0 a m y las columnas de 0 a n, el nmero de elementos que tendr


el array ser el resultado del producto (m+1) x (n+1). El sistema para localizar un elemento
ser por las coordenadas representadas por el nmero de fila y su nmero de columna (a, b).
La sintaxis para la declaracin de un array de dos dimensiones es:
<tipo de datoElemento> <nombre array>[<Nmero de Filas>] [<Nmero de Columnas>]
Ejemplos de declaracin de tablas:
char Pantalla[25][80];
int puestos[6][8];
int equipos[4][30];
int matriz[4][2];
Un array de dos dimensiones en realidad es un array de arrays. Es decir, es un array
unidimensional y cada elemento no es un valor entero, o de coma flotante o carcter, sino que
cada elemento es otro array.
Los elementos de los arrays se almacenan en memoria de modo que el subndice ms prximo al
nombre del array es la fila y el otro subndice, la columna.

21

Tipos de Datos Compuestos Estticos en C

INICIALIZACIN DE ARRAYS MULTIDIMENSIONALES

Los arrays multidimensionales se pueden inicializar, al igual que los de una dimensin, cuando se
declaran. La inicializacin consta de una lista de constantes separadas por comas y encerradas
entre llaves.
Ejemplo: int tabla[4][2];

Ejemplos:
int tabla [2] [3] = {51, 52, 53, 54, 55, 56};
O bien:
int tabla [2] [3] = {{51, 52, 53}, {54, 55, 56}};
int tabla [2] [3] = {
{51, 52, 53},
{54, 55, 56}
};
int tabla2 [3] [4] = { {1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};

ACCESO A LOS ELEMENTOS DE LOS ARRAYS MULTIDIMENSIONALES

Se puede acceder a los elementos de arrays multidimensionales de igual forma que a los
elementos de un array unidimensional. La diferencia reside en que en los elementos
bidimensionales deben especificarse los ndices de la fila y la columna.
El formato general para asignacin directa de valores a los elementos es:
Insercin de elementos
<Nombre array> [ndice fila] [ndice columna] = valor elemento;
Extraccin de elementos:
<Variable> = <nombre array> [ndice fila] [ndice columna];

22

Tipos de Datos Compuestos Estticos en C


LECTURA
Y
BIDIMENSIONALES

ESCRITURA

Las funciones de entrada o salida


bidimensional.

DE

ELEMENTOS

DE

ARRAYS

se aplican de igual forma a los elementos de un array

Por ejemplo:
int tabla[3][4];
double resistencias[4][5];
scanf(%d, &tabla[2][3]);
printf(%d,tabla[1][1]);
scanf(%lf,&resistencias [2][4]);
if( asientosLibres [3][1])
puts(VERDADERO);
else
puts(FALSO);

ACCESO A ELEMENTOS MEDIANTE BUCLES

Se puede acceder a los elementos de arrays bidimensionales mediante bucles anidados.


Su sintaxis es:
int indicefila, indicecolum;
for(indicefila = 0; indicefila < NumFilas; ++indicefila)
for(indicecolum = 0; indicecolum < NumColumnas; ++indicecolum)
Procesar Elemento [indicefila] [indicecolum];
Ejemplo #13: Lectura y Visualizacin de un array de dos dimensiones (3 filas y 4
columnas).
//arraybidi.c
#include<stdio.h>
void main()
{
int i,j,datos[3][4]= {{1,2,3,4}, {5,6,7,8},{9,10,11,12}};
printf("\n***Visualizacion del Array 3F x 4C***\n");
for(i=0; i<3; i++)
{
for(j=0;j<4;j++)
printf("%d ",datos[i][j]);
printf("\n");
}
}
23

Tipos de Datos Compuestos Estticos en C

Ejemplo de Salida:

Ejemplo #14: Programa en C que lee un array bidimensional cuadrado e imprime los
elementos de la diagonal principal de dicha matriz.
Solucin en Pseudocdigo:
Proceso imprimirdiagonal
Dimension matrizA[3,3]; //arreglo de dos dimensiones (12 elementos)
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
Escribir 'Elemento[',f, ', ',c, ']:';
Leer matrizA[f,c]; //se almacena el elemento
FinPara
FinPara
Escribir "***DATOS DE LA MATRIZ***";
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
Escribir matrizA[f,c]; //se imprime el elemento
FinPara
FinPara
Escribir "Diagonal Principal";
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
si f = c Entonces
Escribir matrizA[f,c]; //se imprime el elemento
FinSi
FinPara
FinPara
FinProceso

24

Tipos de Datos Compuestos Estticos en C

Cdigo en Lenguaje C
//diagonal.c
#include<stdio.h>
#define MAXF 3
#define MAXC 3
void main()
{
int matrizA[MAXF][MAXC],f,c;
printf("Datos de la matriz\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
printf("Elemento[%d][%d]:",f+1,c+1);
scanf("%d",&matrizA[f][c]);
}
}
printf("\n***DATOS DE LA MATRIZ***\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
printf("%d ",matrizA[f][c]);
}
printf("\n");
}
printf("\nDiagonal Principal\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
if(f==c)
printf("%d ",matrizA[f][c]);
}
printf("\n");
}
}

25

Tipos de Datos Compuestos Estticos en C

Ejemplo de Salida:

Ejemplo #15: Programa en C que lee una matriz de N*M elementos enteros y determine
la posicin [fila,columna] del nmero mayor almacenado en la matriz. Suponga que los
datos introducidos son diferentes.
//mayorbidimensional.c
#include<stdio.h>
#define MAXF 50
#define MAXC 50
void main()
{
int matriz[MAXF][MAXC],mayor=0,f,c,posif,posic, nfil,ncol;
printf("Introduzca el numero de filas: ");
scanf("%d",&nfil);
printf("Introduzca el numero de columnas: ");
scanf("%d",&ncol);
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("Elemento[%d][%d]: ",f,c);
scanf("%d",&matriz[f][c]);
}
}

26

Tipos de Datos Compuestos Estticos en C

printf("\n***ELEMENTOS DEL ARRAY***\n");


for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%d ",matriz[f][c]);
if(matriz[f][c]>mayor)
{
mayor=matriz[f][c];
posif=f;
posic=c;
}
}
printf("\n");
}
printf("\n%d ES EL ELEMENTO MAYOR Y SE
[%d,%d]\n",mayor,posif,posic);
}
Ejemplo de Salida:

27

ENCUENTRA

EN LA

POSICION

Tipos de Datos Compuestos Estticos en C

Ejemplo #16: Programa en C que intercambia las columnas de un arreglo bidimensional.


Los elementos de la primera columna se intercambian con los de la ltima, los de la
segunda con los de la penltima, y as sucesivamente.
//intercambia.c
#include<stdio.h>
const int MAX=50;
void main()
{
float intercambia[MAX][MAX],aux=0.0;
int f,c,nfil,ncol;
do
{
printf("Introduzca el numero de filas: ");
scanf("%d",&nfil);
}while(nfil>MAX || nfil <1);// Se verifica que el numero de filas sea correcto
do
{
printf("Introduzca el numero de columnas: ");
scanf("%d",&ncol);
}while(ncol>MAX || ncol <1); // Se verifica que el numero de columnas sea correcto
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("Elemento[%d][%d]: ",f,c);
scanf("%f",&intercambia[f][c]);
}
}
printf("\nElementos del array antes del intercambio\n");
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%f ",intercambia[f][c]);
}
printf("\n");
}

28

Tipos de Datos Compuestos Estticos en C

//Observa que el ndice del array correspondiente a las columnas solo se mueve a la mitad
for(c=0;c<(ncol/2);c++)
{
for(f=0;f<nfil;f++)
{
aux = intercambia[f][c];
intercambia[f][c] = intercambia[f][ncol-c-1];
intercambia[f][ncol-c-1]=aux;
}
}
printf("\n***INTERCAMBIO DE COLUMNAS***\n");
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%f ",intercambia[f][c]);
}
printf("\n");
}
}
Ejemplo de Salida:

29

Tipos de Datos Compuestos Estticos en C

Ejemplo #17: Crear un programa que cree un array de N X M indicando que una empresa
tiene N vendedores cada uno de los cuales vende 5 productos. El array almacena los
ingresos obtenidos por cada vendedor en cada producto, imprimir el total de cada
vendedor y obtener los ingresos totales de la tienda.
//tienda.c
#include<stdio.h>
#define NV 100
#define NP 5
void main()
{
int tienda[NV][NP],suma_vta,v,p,nv;
int total_vta=0;
printf("Introduzca el numero de vendedores:");
scanf("%d",&nv);
//Lectura de los datos de la matriz
for(v=0;v<nv;v++)
{
printf("\n***VENDEDOR %d***\n",v+1);
for(p=0;p<NP;p++)
{
printf("Venta[%d][%d]: ",v+1,p+1);
scanf("%d",&tienda[v][p]);
}
}
//Escribir la suma de las M ventas realizadas por cada vendedor
for(v=0;v<nv;v++)
{
suma_vta=0;
for(p=0;p<NP;p++)
{
suma_vta += tienda[v][p];
}
printf("El vendedor[%d] vendio C$: %d\n",v+1,suma_vta);
total_vta += suma_vta;
}
printf("\n\tEL TOTAL DE VENTAS ES C$ %d\n",total_vta);
}

30

Tipos de Datos Compuestos Estticos en C

Ejemplo de Salida:

ARRAY DE CADENAS DE CARACTERES

Las matrices de cadenas de caracteres son matrices multidimensionales, generalmente de dos


dimensiones, en las que cada fila se corresponde con una cadena de caracteres. Una fila ser
una matriz unidimensional de tipo char.
La definicin de una matriz de cadenas de caracteres puede hacerse de la siguiente forma:
char nombre_matriz [filas] [longitud_filas];
Ejemplo: char m[F][C];
caracteres cada fila*/

/*Crea un matriz de cadenas de caracteres de F filas por C

A partir de esta lnea de cdigo, C crea una matriz unidimensional m con los elementos, m[0],
m[1], , m[F-1], que a su vez son matrices unidimensionales de C elementos de tipo char.
Grficamente podemos representarlo as:

El tipo de elementos de m es char[] y el tipo de los elementos de las matrices referenciadas


por m [0], m[1],, es char.

31

Tipos de Datos Compuestos Estticos en C

Para acceder a los elementos de la matriz m, puesto que se trata de una matriz de cadenas de
caracteres, se utiliza slo el primer subndice, el que indica la fila. Slo se utiliza dos
subndices cuando sea necesario acceder a un carcter individual.
Es importante remarcar que m[0], m[1], etc, son cadenas de caracteres y que, por ejemplo,
m[3][1] es un carcter; el que est en la fila 1, columna 3.
Ejemplo #18: Programa para leer una lista de nombres y los almacene en una matriz.
Una vez construida, visualiza su contenido.
//cadenas.c
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define FIL 100
#define COL 80
void main()
{
char nombre[FIL][COL];
int nf=0,f;
char *fin,resp;
do
{
printf("Cuantas cadenas desea leer: ");
scanf("%d",&nf);
}while(nf<1 || nf>FIL);
fflush(stdin);
printf("Escriba las cadenas que desea introducir:\n");
for(f=0;f<nf;f++)
{
printf("Nombre[%d]: ",f);
fin=gets(nombre[f]);
}
nf= f;
do
{
printf("Desea visualizar el contenido de la matriz? (s/n)");
resp= tolower(getchar());

32

Tipos de Datos Compuestos Estticos en C

}while(resp != 's' && resp != 'n');

if(resp == 's')
{
//Visualizar la lista de nombres
printf("\n");
for(f=0;f<nf;f++)
printf("%s\n",nombre[f]);
}
}
Ejemplo de Salida:

UTILIZACIN DE ARRAYS COMO PARMETRO:

En C todos los arrays se pasan por referencia (direccin). Esto significa que cuando se llama a
una funcin y se utiliza un array como parmetro, se debe tener cuidado de no modificar los
arrays en una funcin llamada. C trata automticamente la llamada a la funcin como si hubiera
situado el operador de direccin & delante del nombre del array.
Dadas las siguientes declaraciones:
#define MAX 100
double datos[MAXl;
Se puede declarar una funcin que acepte un array de valores double como parmetro. La
funcin SumaDeDatos() puede tener el siguiente prototipo:
double SumaDeDatos(double datos[MAXl);

33

Tipos de Datos Compuestos Estticos en C

Incluso mejor si se dejan los corchetes en blanco y se aade un segundo parmetro que indica
el tamao del array:
double SumaDeDatos(double datos[], int n);
A la funcin SumaDeDatos se pueden entonces pasar argumentos de tipo array junto con un
entero n, que informa a la funcin sobre cuantos valores contiene el array. Por ejemplo, esta
sentencia visualiza la suma de valores de los datos del array:
printf ("\nSuma = %lf",SumaDeDatos(datos,MAX)) ;
double SumaDeDatos(double datos[ ], int n)
{
double suma = 0;
while (n > 0)
suma += datos[--nl;
return suma;
}
Cuando se utiliza una variable array como argumento, la funcin receptora puede no conocer
cuntos elementos existen en el array. Sin su conocimiento una funcin no puede utilizar el
array. Aunque la variable array puede apuntar al comienzo de l, no proporciona ninguna
indicacin de donde termina el array.
Se pueden utilizar dos mtodos alternativos para permitir que una funcin conozca el
nmero de argumentos asociados con un array que se pasa como argumento de una
funcin:
Situar un valor de seal al final del array, que indique a la funcin que se ha de detener

el proceso en ese momento;
Pasar un segundo argumento que indica el nmero de elementos del array.

Ejemplo #19: Programa en C que intercambia las columnas de un arreglo bidimensional.
Los elementos de la primera fila se intercambian con los de la ltima, los de la segunda
con los de la penltima, y as sucesivamente, implementando funciones.
//intercambiafns.c
#include<stdio.h>
#define MAX 50
//Prototipos de Funciones
void LeerArray(float [ ][MAX],int,int);
void ImprimirArray(float [ ][MAX],int,int);
void IntercambiaCol(float [ ][MAX],int,int);

34

Tipos de Datos Compuestos Estticos en C

void main()
{
float intercambia[MAX][MAX];
int nfil,ncol;
do
{
printf("Introduzca el numero de filas: ");
scanf("%d",&nfil);
}while(nfil>MAX || nfil <1);// Se verifica que el numero de filas sea correcto
do
{
printf("Introduzca el numero de columnas: ");
scanf("%d",&ncol);
}while(ncol>MAX || ncol <1); // Se verifica que el numero de columnas sea correcto
//Llamadas a funciones
LeerArray(intercambia,nfil,ncol);
printf("\nElementos del array antes del intercambio\n");
ImprimirArray(intercambia,nfil,ncol);
IntercambiaCol(intercambia,nfil,ncol);
printf("\n***INTERCAMBIO DE COLUMNAS***\n");
ImprimirArray(intercambia,nfil,ncol);
}

//Esta funcin lee un array bidimensional de tipo float de nfilas y ncolumnas


void LeerArray(float intercambia[ ][MAX],int nfil,int ncol)
{
int f,c;
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("Elemento[%d][%d]: ",f,c);
scanf("%f",&intercambia[f][c]);
}
}
}

35

Tipos de Datos Compuestos Estticos en C

//Esta funcin intercambia las columnas del array.


void IntercambiaCol(float intercambia[ ][MAX],int nfil,int ncol)
{
int f,c;
float aux;

//Observa que el ndice del array correspondiente a las columnas solo se mueve a la mitad
for(c=0;c<(ncol/2);c++)
{
for(f=0;f<nfil;f++)
{
aux = intercambia[f][c];
intercambia[f][c] = intercambia[f][ncol-c-1];
intercambia[f][ncol-c-1]=aux;
}
}
}
//Esta funcin imprime un array bidimensional de tipo float de nfilas y ncolumnas
void ImprimirArray(float intercambia[ ][MAX],int nfil,int ncol)
{
int f,c;
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%f ",intercambia[f][c]);
}
printf("\n");
}
}

36

Tipos de Datos Compuestos Estticos en C

EJERCICIOS PROPUESTOS:
1. Realice un programa en C que lea N elementos enteros y que imprima el nmero de
veces que se repite un nmero X en dicho array.
2. Realice un programa en C que lea en un array la calificacin de 50 estudiantes. Calcule e
imprima el porcentaje de aprobados y reprobados tomando en cuenta que la calificacin
mnima para aprobar es 70 pts.
3. Realice un programa en C que permita leer dos arrays de 10 elementos cada uno e
imprimir la palabra IGUALES si ambos arrays son iguales y DIFERENTES si no los son.
Tomar en cuenta que sern iguales si en la misma posicin de ambos arrays se encuentra
el mismo elemento.
4. Realice un programa en C que permita al Director del Consejo Supremo Electoral
encontrar el nmero y porcentaje de votos obtenidos por cada uno de los 3 candidatos
de la contienda electoral en relacin a los 3000 votantes que asistieron a las urnas a
depositar su voto. Lea en un array la intencin de voto de cada una de las personas.
5. Escribe un programa en C que lea del teclado una cadena y muestre en la pantalla la
cantidad de consonantes y de vocales que contiene dicha cadena.
6. Realice un programa en C que permita calcular la suma de los elementos de la diagonal
principal de una matriz (N*N), el producto de los elementos de la diagonal secundaria.
7. Las calificaciones de los estudiantes del Departamento de Computacin se tienen en una
matriz de N x M elementos (N, nmero de alumnos; M, nmero de asignaturas). Realizar
un programa en C que imprima el promedio de notas de cada alumno y el promedio
general.
8. Escribir un programa que rellene automticamente una matriz N*M con la suma de sus
ndices (Es decir, el elemento a[1][1] = 1+1=2, a[3][2] = 3+2=5). El programa mostrar la
matriz resultante por pantalla.
9. Realice un programa que cuente el nmero de veces que se repite una palabra en una
frase.
10.
Realice un programa en C que permita introducir una lista con las edades de los N
estudiantes de la asignatura de Programacin Estructurada que imprima el array de las
edades en formato descendente, cul es la edad menor, edad promedio. Defina las
siguientes funciones:

37

Tipos de Datos Compuestos Estticos en C

int CalcularMnimo(int edades[],int nelem);


int Promedio(int edades[],int nelem);
void ImprimirDescendente(int edades[],int nelem);
11.
Realice un programa en C que lea un array bidimensional de N filas y M columnas
y que imprima el nmero de dgitos que tiene cada elemento del array.
Ejemplo:

BIBLIOGRAFA BSICA:
Ceballos, Francisco Javier: C/C++ Curso de Programacin, 2da Edicin. Editorial RA-MA,
2002.
Joyanes Aguilar, Luis; Zahonero Martnez Ignacio: Programacin en C. McGraw Hill, 2001.
Gottfried, Byron S: Programacin en C. McGraw Hill, 1991.

38