Academia.eduAcademia.edu

Programación I - Clase 7 - Ciclo Lectivo 2024

2024, Programación I - Clase 7 - Ciclo Lectivo 2024

Presentación utilizada para el dictado de clases de la materia "Programación I" de la "Tecnicatura Superior en Programación". UTN Facultad Regional San Nicolás. Extensión áulica Chivilcoy.

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