Programación I
Lucas Mesas Tabares
CLASE 7
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
236
Temas del programa
Temas de esta clase:
➢ Precedencia y Asociatividad
➢ Matrices
○ Arrays (Arreglos)
○ Arreglos Multidimensionales
○ Inicialización de Arrays Multidimensionales
○ Arreglos Pasados Como Parámetros
○ Acceso a los Elementos de los Arrays Bidimensionales
○ Acceso a los Elementos de los Arrays de más Dimensiones
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
237
Programación I - Clase 7
Manejo de variables:
Lenguaje “C”
(21 palabras)
Resumen de lo visto hasta ahora
Especificadores de Tipo:
char
double
float
int
Modificadores de Tipo:
long
short
signed
unsigned
Reglas:
Signos:
➢
➢
➢
➢
Palabras claves
/ reservadas
Operadores
Delimitadores
Puntuación
➢
➢
➢
➢
➢
➢
➢
➢
Sintaxis
Control de flujo
Estructuración
Precedencia
Asociatividad
Alcance
Estilo
Promoción
Control de programa:
(11 palabras)
“Tipos” Especiales:
void
enum
Selección Simple:
if / else
Calificadores de Tipo:
const
volatile
Selección Múltiple:
switch / case / default
Clases de Almacenamiento:
auto
extern
register
static
Repetición:
for
while / do
Enunciados Modificadores:
break
continue
goto
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
Tipos de Datos Derivados:
struct
typedef
union
Operadores:
return
sizeof
238
Programación I - Matrices
Precedencia y Asociatividad
I - D : Izquierda → Derecha.
D - I : Derecha → Izquierda.
La prioridad o precedencia de operadores determina
el orden en el que se aplican los operadores a un valor.
Los operadores C vienen definidos en una tabla con dieciséis grupos.
Los operadores del grupo i tienen mayor prioridad que los del grupo i+1,
y así sucesivamente:
✓
Si dos operadores se aplican al mismo operando, el operador con mayor
prioridad se aplica primero.
✓
Todos los operadores del mismo grupo tienen igual prioridad y
asociatividad.
✓
Si dos operandos tienen igual prioridad, el operador con prioridad más
alta se aplica primero.
✓
La asociatividad izquierda-derecha significa aplicar el operador más a la
izquierda primero y en la asociatividad derecha-izquierda se aplica
primero el operador más a la derecha.
✓
Los paréntesis tienen la máxima prioridad.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
239
Programación I - Matrices
Arrays (Arreglos)
Un “array” es una colección de variables de un
cierto tipo, colocadas en forma contigua en la
memoria.
✓
Al igual que cualquier otra variable, los “array” deben ser definidos,
así el compilador puede saber cuál es el tipo del arreglo, y cual es
el largo que necesitamos.
✓
Cada ítem del array se denomina elemento.
➢
En este ejemplo:
int temperaturas[7];
○
int es el tipo de variables que almacena el arreglo
○
temperaturas es el nombre del arreglo
○
el [7] nos dice cuántas variables (elementos) de tipo int habrá en nuestro arreglo.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
240
Programación I - Matrices
Arreglos Multidimensionales
✓
Los arrays vistos anteriormente se conocen como arrays
unidimensionales (una sola dimensión) y se
caracterizan por tener un solo subíndice.
✓
Estos arrays se conocen también por el término listas.
✓
Los arrays multidimensionales son aquellos que tienen
más de una dimensión y, en consecuencia, más de un
índice.
✓
Los arrays más usuales son los de dos dimensiones,
conocidos también por el nombre de tablas o matrices.
✓
Sin embargo, es posible crear arrays de tantas
dimensiones como requieran sus aplicaciones, esto es,
tres, cuatro o más dimensiones.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
241
Programación I - Matrices
Arreglos Multidimensionales
0
✓
✓
✓
Obsérvese que en el array bidimensional, si
las filas se etiquetan de 0 a m y las
columnas de 0 a n, el número de elementos
que tendrá el array será el resultado del
producto (m+1) × (n+1).
El sistema de localizar un elemento será
por las coordenadas representadas por su
número de fila y su número de columna
(a, b).
La sintaxis para la declaración de un array
de dos dimensiones es:
<tipo de dato Elemento> <nombre array> [<Número de Filas>] [<Número de Columnas>]
n
0
m
Atención
Al contrario que otros lenguajes, C requiere que
cada dimensión esté encerrada entre corchetes.
La sentencia int temperaturas[7, 3];
no es válida.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
242
Programación I - Matrices
Arreglos Multidimensionales
✓
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 carácter,
sino que cada elemento es otro array.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
243
BREAK
✓
10 minutos
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
244
Programación I - Matrices
✓
Los elementos de los arrays se
almacenan en memoria de modo
que el subíndice más próximo al
nombre del array es la fila y el
otro subíndice, la columna.
✓
En la tabla de resultado se ven
todos los elementos y las
posiciones en memoria del array
Arreglos
Multidimensionales
int porcentajes[3][7];
➢
Se observa que cada entero
ocupa 4 bytes.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
245
Programación I - Matrices
Inicialización de Arrays Multidimensionales
✓
Los arrays multidimensionales se pueden inicializar, al igual que los de una
dimensión, cuando se declaran.
✓
La inicialización consta de una lista de constantes separadas por comas y
encerradas entre llaves.
✓
Los arrays multidimensionales (a menos que sean globales) no se inicializan
a valores específicos a menos que se les asignen valores en el momento de
la declaración o en el programa. Si se inicializan uno o más elementos, pero
no todos, C rellena el resto con ceros o valores nulos ('\0')
✓
Si se desea inicializar a cero un array multidimensional, utilice una sentencia
tal como ésta:
int porcentajes[2][5] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
246
Programación I - Matrices
Arreglos Pasados Como Parámetros
●
En C todos los arrays se pasan por referencia (dirección).
●
Esto significa que cuando se llama a una función y se utiliza
un array como parámetro, se debe tener cuidado de no
modificar los arrays en una función llamada.
●
C trata automáticamente la llamada a la función como si
hubiera situado el operador de dirección & delante del
nombre del array.
●
El número real de elementos se pasa mediante una variable
entera independiente.
●
Cuando se pasa un array a una función, se pasa realmente
sólo la dirección de la celda de memoria donde comienza
el array.
●
La función puede cambiar entonces el contenido del array
accediendo directamente a las celdas de memoria en
donde se almacenan los elementos del array.
●
Así, aunque el nombre del array se pasa “por valor”, sus
elementos se pueden cambiar como si se hubieran pasado
por referencia.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
247
Programación I - Matrices
Arreglos Pasados Como Parámetros
➢
Cuando se utiliza una variable array como argumento, la función receptora puede no conocer
cuántos elementos existen en el array.
➢
Sin su conocimiento una función no puede utilizar el array.
➢
Aunque la variable array puede apuntar al comienzo de él, no proporciona ninguna indicación de
donde termina el array.
✓
Se pueden utilizar dos métodos alternativos para permitir que una función conozca el
número de argumentos asociados con un array que se pasa como argumento de una
función:
✓
situar un valor de señal al final del array, que indique a la función que se ha de
detener el proceso en ese momento;
✓
pasar un segundo argumento que indica el número de elementos del array.
➢
Todas las cadenas utilizan el primer método ya que terminan en nulo.
➢
Una segunda alternativa es pasar el número de elementos del array siempre que se pasa el array
como un argumento.
➢
El array y el número de elementos se convierten entonces en una pareja de argumentos que se
asocian con la función llamada.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
248
Programación I - Matrices
Acceso a los Elementos de los
Arrays Bidimensionales
✓
Se puede acceder a los elementos de
arrays bidimensionales 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 asignación directa
de valores a los elementos es:
En este
ejemplo se
ven dos
formas
diferentes
pasar las
dimensiones
de la matriz
Inserción de Elementos
<nombre array>[indice fila][indice columna] = valor elemento;
Extracción de Elementos
<variable> = <nombre array>[indice fila][indice columna];
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
249
BREAK
✓
10 minutos
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
250
Programación I - Matrices
Acceso a los Elementos de los Arrays de más Dimensiones
✓
Se puede acceder a los
elementos de arrays de n
dimensiones de igual forma
que a los elementos de un
array unidimensional o
bidimensional.
✓
La diferencia reside en que
en los elementos
n-dimensionales deben
especificarse los índices de
cada una de las
dimensiones.
✓
Se puede acceder a los
elementos de arrays
n-dimensionales mediante
n bucles anidados.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
251
Programación I - Matrices
Ejemplo Para Analizar de
Arrays Bidimensionales
En este
ejemplo
recorremos
una matriz
¡¡¡como un
arreglo!!!
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
252
Programación I - Clase 7
Manejo de variables:
Lenguaje “C”
(21 palabras)
Resumen incluyendo lo visto en la clase de hoy
Especificadores de Tipo:
char
double
float
int
Modificadores de Tipo:
long
short
signed
unsigned
Reglas:
Signos:
➢
➢
➢
➢
Palabras claves
/ reservadas
Operadores
Delimitadores
Puntuación
➢
➢
➢
➢
➢
➢
➢
➢
Sintaxis
Control de flujo
Estructuración
Precedencia
Asociatividad
Alcance
Estilo
Promoción
Control de programa:
(11 palabras)
“Tipos” Especiales:
void
enum
Selección Simple:
if / else
Calificadores de Tipo:
const
volatile
Selección Múltiple:
switch / case / default
Clases de Almacenamiento:
auto
extern
register
static
Repetición:
for
while / do
Enunciados Modificadores:
break
continue
goto
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
Tipos de Datos Derivados:
struct
typedef
union
Operadores:
return
sizeof
253
Actividad de repaso
Federico De Sía
Técnico Universitario en Programación
https://independent.academia.edu/FedericoDeSía
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
254
Programación I
int main(){
int temperaturas[7][24];
Ejemplo de repaso
for(int d = 0; d < 7; d++) {
printf("\n\nTemperaturas del dia %d\n", d + 1);
for(int h = 0; h < 24; h++){
int temp;
printf("Ingrese la temperatura de las %dhs: ", h);
scanf("%d", &temp);
temperaturas[d][h] = temp;
}
Arreglos
Multidimensionales
}
int mayorD = 0;
int mayorH = 0;
int temperaturas[7][24]
[0]
[1]
[2]
[3]
[4]
[5]
[...]
[0]
15
15
14
14
14
15
19
[1]
18
17
18
18
19
19
24
[2]
21
20
17
16
16
16
20
[3]
17
16
15
14
14
13
[4]
19
16
14
12
12
14
22
[5]
20
17
17
16
15
16
21
[6]
20
18
15
15
15
16
23
...
for(int d = 0; d < 7; d++){
for(int h = 1; h < 24; h++){
int temp = temperaturas[d][h];
if(temp > temperaturas[mayorD][mayorH]){
mayorD = d;
mayorH = h;
}
}
}
[23]
21
printf("\n\nLa temperatura mas alta fue %d (registrada el dia %d a las %dhs)",
temperaturas[mayorD][mayorH], mayorD + 1, mayorH);
return 0;
}
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
255
Programación I
int main(){
char dias[7][10] = {
"Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"
};
int temperaturas[7][24];
Ejemplo de repaso
for(int d = 0; d < 7; d++) {
printf("\n\nTemperaturas del dia %s\n", dias[d]);
for(int h = 0; h < 24; h++){
int temp;
printf("Ingrese la temperatura de las %dhs: ", h);
scanf("%d", &temp);
temperaturas[d][h] = temp;
Arreglos
Multidimensionales
}
}
char dias[7][10]
int mayorDia = 0;
int mayorHora = 0;
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[0]
L
u
n
e
s
\0
[1]
M
a
r
t
e
s
\0
[2]
M
i
e
r
c
o
l
[3]
J
u
e
v
e
s
\0
[4]
V
i
e
r
n
e
s
[5]
S
a
b
a
d
o
\0
[6]
D
o
m
i
n
g
o
[7]
e
[8]
s
[9]
for(int d = 0; d < 7; d++){
for(int h = 1; h < 24; h++){
int temp = temperaturas[d][h];
if(temp > temperaturas[mayorDia][mayorHora]){
mayorDia = d;
mayorHora = h;
}
}
}
\0
\0
printf("\nLa temperatura mas alta fue %d (registrada el dia %s a las %dhs)",
temperaturas[mayorDia][mayorHora], dias[mayorDia], mayorHora);
return 0;
\0
}
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
256
Programación I
int main(){
char dias[7][10] = {
"Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"
};
int temperaturas[7][24];
Ejemplo de repaso
for(int d = 0; d < 7; d++) {
printf("\n\nTemperaturas del dia %s\n", dias[d]);
for(int h = 0; h < 24; h++){
int temp;
printf("Ingrese la temperatura de las %dhs: ", h);
scanf("%d", &temp);
temperaturas[d][h] = temp;
Arreglos
Multidimensionales
}
}
Salida
del programa
int mayorDia
= 0;
int temperaturas[7][24]
int mayorHora = 0;
[0]
[1]
[2]
[3]
[4]
[5]
[...]
[0]
15
15
14
14
14
15
19
[1]
18
17
18
18
19
19
24
[2]
21
20
17
16
16
16
20
[3]
17
16
15
14
14
13
[4]
19
16
14
12
12
14
22
[5]
20
17
17
16
15
16
21
[6]
20
18
15
15
15
16
23
...
[23]
21
...
Temperaturas del dia Domingo:
Ingrese la temperatura de las 0hs: 20
Ingrese la temperatura de las 1hs: 18
Ingrese la temperatura de las 2hs: 15
Ingrese la temperatura de las 3hs: 15
...
Ingrese la temperatura de las 23hs: 23
La temperatura mas alta fue 24 (registrada el dia Martes a las 23hs)
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
257
Programación I
int main(){
int temperaturas[31][24][12];
Ejemplo de repaso
for(int m = 0; m < 12; m++){
for(int d = 0; d < 31; d++) {
for(int h = 0; h < 24; h++){
int temp = ObtenerNumeroAleatorio(10, 25);
temperaturas[m][d][h] = temp;
}
int temperaturas[31][24][12]
}
}
]
[0
[1
]
]
[2
.]
[..
1]
[1
[0]
[1]
[2]
[3]
[4]
[5]
[...]
[23]
17
16
16
16
17
18
20
18
17
18
18
19
19
20
21
20
17
16
16
16
22
[0]
15
15
14
17
14
16
14
15
15
14
14
19
13
22
[1]
18
17
18
19
18
16
19
14
19
12
12
24
14
24
[2]
21
20
17
16
16
16
[3]
17
16
15
14
20
14
18
13
15
[4]
19
16
14
12
12
14
15
20
18
15
15
15
16
...
...
...
21
15 ... 16
22
...
...
...
[...]
[30]
20
...
...
...
printf("\nConsultar temperatura\n");
int dia;
printf("Ingrese el dia: ");
scanf("%d", &dia);
int mes;
printf("Ingrese el mes: ");
scanf("%d", &mes);
...
...
...
printf("\nTemperaturas del %d/%d:", dia, mes);
for(int h = 0; h < 24; h++){
25
int temp = temperaturas[mes - 1][dia - 1][h];
...
...
printf("\n%dhs: %d", h, temp);
}
23
return 0;
}
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
258
Programación I
int main(){
int temperaturas[31][24][12];
Ejemplo de repaso
for(int m = 0; m < 12; m++){
for(int d = 0; d < 31; d++) {
for(int h = 0; h < 24; h++){
int temp = ObtenerNumeroAleatorio(10, 25);
temperaturas[m][d][h] = temp;
}
int temperaturas[31][24][12]
}
}
.]
]
[0
[1
]
]
[2
1]
[1
[..
[0]
[1]
[2]
[3]
[4]
[5]
[...]
[23]
17
16
16
16
17
18
20
18
17
18
18
19
19
20
21
20
17
16
16
16
22
Consultar temperatura
Ingrese el dia: 1
[0]
15
15
14
17
14
16
14
15
15
14
14
19
13
22
[1]
18
17
18
19
18
16
19
14
19
12
12
24
14
24
[2]
21
20
17
16
16
16
[3]
[4]
17
19
16
16
15
14
14
20
12
14
18
12
13
15
15
14
20
18
15
15
15
16
...
...
...
21
15 ... 16
22
...
...
...
[...]
[30]
20
...
...
...
...
...
Salida del programa
Ingrese el mes: 12
Temperaturas del 1/12:
...
...
...
0hs: 17
25
1hs: 16
2hs: 16
3hs: 16
4hs: 17
...
23
23hs: 20
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
259
Programación I
Ejercicio de repaso
A continuación se muestran dos
programas diferentes. Analícelos y
responda:
¿Qué hacen estos programas?
a) Ninguno de los programas funciona
correctamente debido a errores en el
código.
b) Ambos hacen exactamente lo mismo,
cargan los mismos datos y muestran
exactamente el mismo resultado por
pantalla.
c) Ambos hacen cosas diferentes,
cargan datos diferentes y por lo tanto
muestran diferentes resultados por
pantalla.
Programa 1
Programa 2
#include <stdio.h>
#include <stdio.h>
#define Y 3
#define X 7
#define Z 4
const int Y = 3;
const int X = 7;
const int Z = 4;
void Funcion1(int M[Y][X][Z])
{
for (int z = 0; z < Z; z++) {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
M[y][x][z] = y * X + x + z * Y * X;
}
}
}
}
void Funcion(const int A[])
{
for (int z = 0; z < Z; z++) {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
printf("\t%i", A[y * X + x + z * Y * X]);
}
printf("\n");
}
printf("\n");
}
}
void Funcion2(const int M[Y][X][Z])
{
for (int z = 0; z < Z; z++) {
for (int y = 0; y < Y; y++) {
for (int i = 0; i < X; i++) {
printf("\t%i", M[y][i][z]);
}
printf("\n");
}
printf("\n");
}
}
int main()
{
int A[Y * X * Z];
for (int i = 0; i < (Y * X * Z); i++) {
A[i] = i;
}
Funcion(A);
return 0;
}
int main()
{
int M[Y][X][Z];
Funcion1(M);
Funcion2(M);
return 0;
}
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
260
Programación I
Ejercicio de repaso
A continuación se muestran dos
programas diferentes. Analícelos y
responda:
Programa 1
#include <stdio.h>
#define Y 3
#define X 7
#define Z 4
const int Y = 3;
const int X = 7;
const int Z = 4;
void Funcion1(int M[Y][X][Z])
{
for (int z = 0; z < Z; z++) {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
M[y][x][z]
= y * X + x + z * Y * X;
Salida de ambos
programas
}
}
}
}
0
1
2
3
4
5
void Funcion(const int A[])
{
for (int z = 0; z < Z; z++) {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
printf("\t%i", A[y * X + x + z * Y * X]);
}
printf("\n");
}
printf("\n");
6
}
13
}
7
¿Qué hacen estos programas?
a) Ninguno de los programas funciona
correctamente debido a errores en el
código.
b) Ambos hacen exactamente lo mismo,
cargan los mismos datos y muestran
exactamente el mismo resultado por
pantalla.
c) Ambos hacen cosas diferentes,
cargan datos diferentes y por lo tanto
muestran diferentes resultados por
pantalla.
Programa 2
#include <stdio.h>
8
9
10
11
void Funcion2(const int M[Y][X][Z])
14
15
16
17
18
{
for (int z = 0; z < Z; z++) {
for
< Y; y++)24{
21 (int y22= 0; y 23
25
for (int i = 0; i < X; i++) {
28
29
30
31
32
printf("\t%i", M[y][i][z]);
35 }
36
37
38
39
printf("\n");
}
42
43
44
45
46
printf("\n");
49
50
51
52
53
}
56
57
58
59
60
}
12
19
26
33
20
int main()
{ 27
int A[Y * X * Z];
34
40
41 for (int i = 0; i < (Y * X * Z); i++) {
47
48 }
54
55 Funcion(A);
A[i] = i;
61
62 return 0;
}
int main()
63
64
{
70
71
int M[Y][X][Z];
77
78
Funcion1(M);
Funcion2(M);
return 0;
}
65
66
67
68
69
72
73
74
75
76
79
80
81
82
83
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
261
Bibliografía
Using the GNU Compiler Collection
Manual del Compilador GCC
https://gcc.gnu.org/onlinedocs/
Programación en C
Metodología, algoritmos y estructura de datos
Luis Joyanes Aguilar - Ignacio Zahonero Martinez
SEGUNDA EDICIÓN
Editorial Mc Graw Hill
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
262
Presentaciones de las clases
Disponibles en
ACADEMIA
http://utn.academia.edu/LucasMesasTabares
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
263
Y eso es todo… ¡por ahora!
Gracias
Lucas Mesas Tabares
http://utn.academia.edu/LucasMesasTabares
lmesast@gmail.com
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares - lmesast@gmail.com
264