Está en la página 1de 45

Capítulo 6

Arreglos
Declaración de Arreglos
<tipo> <nombre>[tamaño];
Secuencia
de variables
homogéneas int a[10];
de acceso
aleatorio 0 1 2 3 4 5 6 7 8 9

1516 índices
18

20

22
direcciones 24
consecutivas contenido
26
de memoria de memoria
28

30

32

34
Asignación de Valores
Asignación “aleatoria”

int a[10];

a[3] = -5;
a[7] = 13;
a[0] = 9;

9 ? ? -5 ? ? ? 13 ? ?

0 1 2 3 4 5 6 7 8 9

Las celdas no asignadas tienen “basura”


Inicialización de Arreglos
a) No. de inicializadores = tamaño del arreglo:

lista de inicialización

int b[5] = { -2, 4, 7, -1 ,8 };

-2 4 7 -1 8
0 1 2 3 4
b) No. de inicializadores < tamaño del arreglo:

int c[5] = { -2, 4, 7 };

-2 4 7 ? ?
0 1 2 3 4
Inicialización de Arreglos
c) Sin especificación del tamaño:

int d[ ] = { 5, -3, 6 };

5 -3 6
0 1 2

d) Más inicializadores que localidades:


valores no asignados
int e[3] = { 5, -3, 6, 7, 2, 9 };

5 -3 6
0 1 2
Asignación desde el Teclado
int a[5];
0 1 2 3 4

int i = 2;
dirección contenido variable
2324 a[0]

scanf(“%d”, &a[ i ] ); 26 a[1]

28 a[2]

30 a[3]

32 a[4]

RAM
Ejemplo: Sumatoria de 5 enteros
/* Version 2*/
1*/
#include <stdio.h>

int main()
{
int x[5]
x1 ==-3,{-3,
x25,= 7,
5, 4,
x3-1};
= 7,
int x4
i, s=0;
= 4, x5 = -1;
int s;
for(i=0; i<5; i++)
s = x1 s +=
+ x2
x[i];
+ x3 + x4 + x5;

printf(“s = %d\n”, s);


return 0;
}
Inicialización con Números Pares
#include <stdio.h>
#define TAM 10
i 0 0

1 2
int main()
{ 2 4
int i, a[TAM];
3 6
/* asignacion */
for(i=0; i<TAM; i++) 4 8
a[i] = 2*i;
5 10
/* impresión */
for(i=0; i<TAM; i++) 6 12
printf(“%d\n”,a[i]);
7 14
return 0;
8 16
}
9 18
Directivas

#define Define una macro para el preprocesador


#elif Inclusión alternativa de texto
#else Inclusión alternativa de texto
#error Produce mensaje de error al tiempo de compilación
#if Inclusión condicional de texto sobre una constante
#ifdef Inclusión condicional de texto, si macro definida
#ifndef Inclusión condicional de texto, si macro no definida
#include Insertar texto desde otro archivo
#line Número de línea para mensajes del compilador
#pragma Información al compilador dependiente de la implementación
#undef Remueve una macro definición
Desviación Estándar
• Problema: Tenemos dos máquina que producen n
cojinetes idénticos y queremos determinar cual
tiene mejor desempeño.
x i
x i 1
• Solución: Usar desviación estándar n

 x  x
n 2
i
 i 1
n 1
Desviación Estándar
#include <stdio.h>
#include <math.h>
n

  x  x
2
#define TAM 10
i n
 i 1 int main()
n 1 {
int i, x[TAM];
n
s   xi
float p, r, d, s=0

for(i=0; i<TAM; i++){


printf("Teclea x[%d]: ",i); i 1
scanf("%d",&x[i]);
s += x[i];
} s
p = (float)s/TAM; p
s = 0; n
for(i=0; i<TAM; i++){
r = x[i] - p; 2
s += r*r; n
} s    xi  p 
d = sqrt(s/(TAM-1)); i 1
printf("Desv = %f\n",d);

system("pause"); s
return 0; 
} n 1
x
Vectores

 
a  b  (ax  bx )i  (a y  by )j  (az  bz )k

c=a+b

j
a
k i

a  (ax i  a y j  az k) Suma
de
b  (bx i  by j  bz k) vectores
Suma de Vectores
0 1 2 ... n-1

#include <stdio.h> a

int main()
{ + + … +
int a[5] = {-2, 3, 7, 4, -5};
int b[5] = {9, 6, -1, -8, 2};
int c[5], i; b

for(i=0;i<5;i++)
c[i] = a[i] + b[i]; = = … =

for(i=0;i<5;i++) c
printf(“c[%d]=%d\n”,i,c[i]);

return 0;
}   
c  ab
Producto Vectorial
#include <stdio.h>

ab int main()


{
a int a[3] = {-2, 3, 7};
b int b[3] = {9, 6, -1};
int c[3];

c[0] = a[1]*b[2]-a[2]*b[1];
c[1] = a[0]*b[2]-a[2]*b[0];
c[2] = a[0]*b[1]-a[1]*b[0];

i j k printf(“c=(%di+%dj+%dk)\n”,
ay az ax az ax ay
a  b  ax ay az  i j k c[0],c[1],c[2]);
by bz bx bz bx by return 0;
bx by bz }
 i (a y bz  a z by )  j (a x bz  a z bx )  k (a x by  a y bx )
Producto Escalar de Vectores
0 1 2 3 4
#include <stdio.h> n
a
int main()
c   ai  bi
{ i 1
0 
int a[5] = {-2, 3, 7, 4, -5};
int b[5] = {9, 6, -1, -8, 2}; 1 
int c=0, i; + c
2 
for(i=0;i<5;i++) 3 
c += a[i] * b[i];
4 
printf(“c=%d\n”,c); b
return 0;
}
Aplicaciones de Vectores
Problema de Ordenación

Algoritmo
Algoritmo a’1,a’2,…,a’n
a1,a2,…,an de
de  a’1a’2…a’n
Ordenación
Ordenación

Algoritmos de Ordenación: Todos los algoritmos


1. Insertion Sort de ordenación hace uso
2. Bubble Sort de dos operaciones básicas:
3. Merge Sort 1. Comparación
4. Quick Sort 2. Intercambio
5. Heap Sort
6. : aj 2 aj+1
aj > aj+1 1 3
aux
Ordenación de Arreglos: Burbuja
#include <stdio.h>
9 2 7 4 6
int main()
{
2 9 7 4 6 int a[5] = {9,2,7,4,6};
int i, j, aux;

for(i=0; i<4;i++)
2 7 9 4 6 for(j=0;j<4;j++)
if(a[j]>a[j+1]){
aux = a[j];
2 7 4 9 6 a[j]=a[j+1];
a[j+1]=aux;
}
2 7 4 6 9
for(i=0;i<5;i++)
printf(“\t%d”,a[i]);
printf(“\n”);

return 0;
}
Problema de Búsqueda

i  ai = k
a1,a2,…,an
Algoritmo
Algoritmo
de
de
Búsqueda
Búsqueda
k -1  k a
Búsqueda Lineal
k 7 a #include <stdio.h>
int main()
13 0 {
int i, k, a[]={13,5,9,12,6,34,7,42,2,56};
5 1

9 2 printf(“Teclea k: “);
scanf(“%d”,&k);
12 3 for(i=0; i<10; i++)
if (k == a[i])
6 4 break;
if (i>=10)
34 5 printf(“Error: %d no esta:”,k);
else
7 6 =i printf(“%d esta en posicion %d\n”,k,i);
return 0;
42 7 }
2 8

56 9
Búsqueda Binaria
#include <stdio.h>
a #include <math.h>
int main()
k 51 4 0 low {
int low, mid, up, k=51;
9 1 int a[]={4,9,13,24,36,47,51,65,73,86};
low = 0;
13 2 up = 9;
while(low <= up) {
24 3 mid = ceil((low+up)/2);
if (k < a[mid])
36 4 up = mid - 1;
else if (k > a[mid])
l  u 
47 5 mid m   low = mid + 1;
 2  else {
51 6 printf("%d en %d\n",k,mid);
system("pause");
return 0;
65 7
}
}
73 8 printf("No se encuentra\n");
system("pause");
86 9 up return -1;
}
Valor Devuelto por main()
Cuando se invoca una función, el valor devuelto
es recibido por aquel que hizo la llamada:

invocación
“el
“elque “el
que “elque
quees
es
llama”
llama” llamado”
llamado”
regreso

miprog
main()
main(){{
::
return
return-1;
-1;
}}

miprog.exe
Matrices: Arreglos 2D
int a[2][3] = { {-3,8,5} , {9,-2,4} }; representación “universal”
0 1 2 0 1 2

0 -3 8 5 0 -3 8 5

1 9 -2 4
0 1 2
1
9 -2 4
: :
1516 -3
18 8
20 5
RAM Una
Unamatriz,
matriz,es
esen
en
22 9 realidad
realidadun
un
24 -2 “arreglo
“arreglode
dearreglos”
arreglos”
26 4
: :
Multiplicación de Matrices
Cm p  Amn Bn p
p
ci , j   ai ,k  bk , j
k 1

3 -2 5 -3 6 0

-7 9 4 8 -4 = -42

A23 5 9 C22

B32
2
c0, 0   ai ,k  bk , j  a0.0b0, 0  a0.1b1, 0  a0.2b2, 0  3(3)  (2)(8)  5(5)  0
k 0
2
c1,1   ai ,k  bk , j  a1.0b0,1  a1.1b1,1  a1.2b2,1  7(6)  9(4)  4(9)  42
k 0
Multiplicación de Matrices
Cm p  Amn Bn p i  0,1,2,..., m
n j  0,1,2,..., n
ci , j   ai ,k  bk , j k  0,1,2,..., n
k 1

#include <stdio.h> for(i=0;i<m;i++)


for(j=0;j<n;j++)
int main() for(k=0;k<n;k++)
{ c[i][j] += a[i][k]*b[k][j];
int i,j,k,m,n,p;
int a[2][3] = {{3,-2,5},{-7,9,4}}; for(i=0;i<m;i++){
int b[3][2] = {{-3,6},{8,-4},{5,9}}; for(j=0;j<p;j++)
int c[2][2] = {0}; printf(“\t%d”,c[i][j]);
printf(“\n”);
m=2; }
n=3; return 0;
p=2; }
Arreglos Multidimensionales
-3 8 5 int a[2][3][3] = {
{
9 2-2 94 7 {4,3,1},
4 3 1 {2,9,7},
6 -5 3 {-3,8,5}
-2 7 -8 },
{
{-2,7,-8},
{6,-5,3},
{9,-2,4}
}
4 3 1 2 9 7 -3 8 5 };

Arreglos
Arreglosde
demayor
mayor
-2 7 -8 6 -5 3 9 -2 4 dimensionalidad
dimensionalidadyaya
no
noresultan
resultanprácticos
prácticos
Arreglos de Caracteres y Cadenas

char s[ ] = {‘H’,’o’,’l’,’a’};

‘H’ ‘o’ ‘l’ ‘a’

char s[ ] = “Hola”;

‘H’ ‘o’ ‘l’ ‘a’ ‘\0’

“Fin de Cadena”
(EOS – End Of String)
Valor ASCII 0
Cadenas de Caracteres
OJO: tamaño suficiente para la
char w[10]; cadena más larga posible
:
scanf(“%s”, w);

OJO: no lleva &, ya que w


es un arreglo

:
72 ‘H’
Hola
111 ‘o’
valores
108
ASCII ‘l’
97 ‘a’
EOS 0 ‘\0’
agregado :
por RAM
scanf()
Impresión de Cadenas

char w[ ] = “Texto”;
:
printf(“%s”, w);

‘T’ ‘e’ ‘x’ ‘t’ ‘o’ ‘\0’ T e x t o


Ejemplo: Copiar una Cadena
0 1 2 3 4 5 6 7 8 9

s1 F i l o m e n a 0

s2 F i l o m e n a 0

#include <stdio.h>
Idea: Copiar de uno en uno
los caracteres hasta int main()
encontrar el EOS. {
char s1[10] = “Filomena”;
char s2[10];
int i;
Filomena
for(i=0; s1[ i ] != ‘\0’; i++)
s2[i] = s1[i];
s2[i] = ‘\0’;
printf(“%s”, s2);
return 0;
}
Ejemplo: Concatenar dos Cadenas
0 1 2 3 4 0 1 2 3 4

s1 F i l o 0 s2 m e n a 0

s3 F i l o m e n a 0

#include <stdio.h>
Idea: Copiar hasta el int main()
EOS de la primer {
cadena y a partir de char s1[5] = “Filo”;
allí copiar la segunda. char s2[5] = “mema”;
char s3[10];
int i, j;

for(i=0,j=0; s1[ i ] != ‘\0’; i++,j++)


Filo+mena=Filomena s3[j] = s1[i];
for(i=0; s2[ i ] != ‘\0’; i++,j++)
s3[j] = s1[i];
s[j] = ‘\0’;
printf(“%s+%s=%s\n”,s1,s2,s3);
return 0;
}
Conceptos Adicionales sobre Arreglos
La notación de arreglos a[n] tiene varios significados:
1. Cuando es empleada en el lado izquierdo de una asignación, significa la
dirección del elemento.
2. Cuando es empleada en una expresión significa su valor.

a[5] 5 13 3 9 6
dirección de 0 1 2 3 4
memoria
a = &a[0] = 2346 0101 a[0]
&a[1] = 2348 1101 a[1]
&a[2] = 2350 0011 a[2]
&a[3] = 2352 1001 a[3]

Por convención, &a[4] = 2354 0110 a[4]


el nombre de un arreglo
es su dirección de inicio Contenido de
memoria
Arreglo (Lista) de Cadenas
tamaño
fijo

A l e x 0 0
Alex

Ana 1
A n a 0

Sofía

Paola S o f i a 0 2

Lidia
P a o l a 0 3

char
char lista[5][6];
lista[5][6];
L i d i a 0 4
Lista de Cadenas

Arreglo de
5 cadenas
#include <stdio.h> de longitud máxima 6
(incluido el EOS)
int main()
{
int i;
char c[5][6];

for(i=0; i<5; i++){


printf(“Teclea nombre: “);
scanf(“%s”, c[ i ]);
}
for(i=0; i<5; i++)
printf(“\nNombre %d: %s“,i,c[ i ]);
return 0;
}

NOTA: c[i][j] se
NOTA:c[i][j] serefiere
refiereaaun
unsolo
solocaracter,
caracter,
mientras
mientrasque c[i]se
quec[i] serefiere
refiereaauna
unacadena.
cadena.
Arreglo (Lista) de Cadenas
0 1 2 3 4 5
char
charc[5][6]
c[5][6]=={{
“Alex”,”Ana”,
“Alex”,”Ana”, A l e x 0 0
“Sofia”,”Paola”,
“Sofia”,”Paola”,
”Lidia”
”Lidia”};};

A n a 0 1

caracter: c[2][2]

S o f i a 0 2

cadena: c[3]

P a o l a 0 3

L i d i a 0 4
ctype.h
Tipo Nombre Parámetros Descripción
int isdigit (int c) dígito (‘0’,...,‘9’)
int isalpha (int c) letra (‘A’,...,‘Z’, ‘a’,...,‘z’ )
int isalnum (int c) dígito o letra
int isxdigit (int c) dígito hexadecimal (‘0’,...,‘9’, ‘A’,...,‘F’)
int islower (int c) letra minúscula (‘a’,...,‘z’)
int isupper (int c) letra mayúscula (‘A’,...,‘Z’)
int isspace (int c) espacio (‘ ’, ‘\n’, ‘\t’, ‘\f’, ‘\r’, ‘\v’ )
int iscntrl (int c) carácter de control
int ispunct (int c) distinto a espacio, dígito o letra
int isprint (int c) imprimible incluyendo el espacio
int isgraph (int c) imprimible sin incluir el espacio
int tolower (int c) carácter c en minúsculas
int toupper (int c) carácter c en mayúsculas
stdlib.h

Tipo Nomb Parámetros


double atof (const char *nPtr)
int atoi (const char *nPtr)
long atol (const char *nPtr)
double strtod (const char *nPtr, char **endPtr)
long strtol (const char *nPtr, char **endPtr, int base)
unsigned long strtoul (const char *nPtr, char **endPtr, int base)
string.h
Nomb Parámetros Descripción
strcpy (hil1, hil2) copia el contenido de hil2 a hil1
strncpy (hil1, hil2, n) copia n caracteres de hil2 a hil1
strcat (hil1, hil2) concatena hil2 a hil1
strncat (hil1, hil2, n) concatena n caracteres de hil2 a hil1
strcmp (hil1, hil2) compara hil1 con hil2
strncmp (hil1, hil2, n) compara n caracteres de hil1 e hil2, hil1 puede ser
constante.
strchr (hil, ch) regresa un apuntador a la primera instancia de ch
en hil, si no regresa NULL
strrchr (hil, ch) regresa un apuntador a la ultima instancia de ch en
hil, si no regresa NULL
strstr (hil, subhil) regresa un apuntador a la primera instancia de
subhil en hil, si no regresa NULL
strpbrk (hil, subhil) regresa un apuntador a la primera instancia de
cualquier carácter de subhil en hil, si no regresa NULL
strcspn (hil1, hil2) regresa la longitud del segmento inicial de la hil1,
consistiendo de caracteres no contenidos en hil2.
strcspn (hil1, hil2) regresa la longitud del segmento inicial de la hil1,
consistiendo solo de caracteres contenidos en hil2.
Ordenación de Cadenas

Paola Alex

Ana Ana
Algoritmo
Algoritmo
Sofía Lidia
de
de
Ordenación
Ordenación
Alex Paola

Lidia Sofía

Comparación: strcmp(s1,s2)
Intercambio: strcpy(s1,s2)
int strcmp(char s1[], char s2[])

< 0: s1 < s2 > 0: s1 > s2


strcmp(s1, s2)

= 0: s1 = s2

PRMG, (c) 2009 40


Ordenación de Cadenas: Burbuja
#include <stdio.h>
#include <string.h> 0 “Paola”
1 “Ana”
2 “Sofía”
int main() 3 “Alex”
4 “Lidia”
{
char c[5][6] = {“Paola”, “Ana”, “Sofia”, “Alex”, “Lidia”};
char aux[6];
int i,j;
2
for(i=0; i<4; i++)
for(j=0; j<4; j++) c[j] > c[j+1]
if (strcmp(c[j],c[j+1]) > 0) { 1
strcpy(aux,c[j]);

3
strcpy(c[j],c[j+1]); aux
strcpy(c[j+1],aux);
}

for(i=0; i<5; i++)


printf(“%s\n”,c[i]);
return 0;
}
Ejercicio: Directorio Telefónico

Paso 1: Leer Lista de Nombres Paso 2: Leer Lista de Teléfonos

Alex 1234567890

Ana 2345678901

Sofía 3456789012

Paola 4567890123

Lidia 5678901234

nombres teléfonos

PRMG, (c) 2009 42


Ejercicio: Directorio Telefónico

Paso 3: Ordenar Lista de Nombres Paso 4: Ordenar Lista de Teléfonos

Alex 1234567890

Ana 2345678901

Lidia 5678901234

Paola 4567890123

Sofia 3456789012

nombres teléfonos

PRMG, (c) 2009 43


Ejercicio: Directorio Telefónico

Paso 5: Pedir un Nombre, Paso 6: Buscar Teléfono


Buscar en Lista Desplegar en Pantalla

Alex 1234567890

Ana 2345678901
Pa 4567890123
ola Lidia 5678901234

Paola 4567890123

Sofía 3456789012

nombres teléfonos

PRMG, (c) 2009 44


Fin de Capítulo

PRMG, (c) 2016 45

También podría gustarte