Teoria 7 Programacion
Teoria 7 Programacion
)
Introducción a la Algorítmica Retomando lo que hemos visto sobre tipos de datos al comienzo del curso, podemos
y Programación (3300) recordar que los algoritmos generalmente operan sobre datos de distinta naturaleza
(números, letras, palabras, símbolos, etc.) y por lo tanto, los programas que implementan
dichos algoritmos necesitan representarlos de alguna manera.
Prof. Ariel Ferreira Szpiniak - aferreira@[Link]
Departamento de Computación De allí que definimos a un tipo de dato como una clase de objetos
Facultad de Cs. Exactas, Fco-Qcas y Naturales de datos ligados a un conjunto de operaciones para crearlos y
Universidad Nacional de Río Cuarto manipularlos.
Los tipos de datos se caracterizan por:
• Un rango de valores posibles,
Tipo de Dato Estructurado Homogéneo: Arreglo Por ello se dice que un tipo es el conjunto de valores posibles
que puede tomar una variable.
2023 Lic. Ariel Ferreira Szpiniak 1 2023 Lic. Ariel Ferreira Szpiniak 2
2023 Lic. Ariel Ferreira Szpiniak 5 2023 Lic. Ariel Ferreira Szpiniak 6
Compuestos o
Estructurados ¡¡¡Pero son 150!!!
Heterogéneos Registro
2023 Lic. Ariel Ferreira Szpiniak 7 2023 Lic. Ariel Ferreira Szpiniak 8
Arreglo - Motivación Arreglo
Definición: un arreglo es una colección finita (tiene un límite),
Otro problema: aunque declaráramos las 150 variables en el homogénea (elementos del mismo tipo) y “ordenada” (no < o >
léxico de mi algoritmo. sino que se sabe quien es el primero, el segundo, el tercero, etc.)
¿Y si se agrega un socio más al club? ¿Alcanzan las 150 de elementos. Los más comunes son los uni y los bidimensionales.
Columnas
variables? 1 2 3 4
Entonces, ¿qué podemos hacer? 1 2 3 4 5 6 7 1 4 6 -2 1
tempMin 5 6 0 -3 3 8 4 Filas 2 7 8 -4 0
subrango de Z), necesitaríamos algo que nos permita Tiene dos partes importantes: las componentes y los índices.
“contener” una serie de variables del mismo tipo.
●
Componentes: hacen referencia a los elementos.
●
Índices: es la posición donde se encuentra el elemento.
¿Existe eso? ¡si! ¡Los arreglos! Para poder referirnos a los datos dentro de una posición del
arreglo, se especifica el nombre del arreglo y el número de
posición del elemento.
2023 Lic. Ariel Ferreira Szpiniak 9 2023 Lic. Ariel Ferreira Szpiniak 10
Arreglo Arreglo
• Se llaman array (arreglo es la traducción). Los tipos de arreglo más utilizados son
• Son estáticos, es decir, están disponibles desde el mismo
momento que son declaradas (léxico global, léxico local,
parámetro formal) y conservan el mismo tamaño durante
toda la ejecución. Es decir, se comportan de la misma Unidimensional Bidimensional
Columnas
forma que las variables de tipos simples y registro. En los 1 2 3 4 5 6 7
1 2 3 4
algoritmos adoptaremos el mismo comportamiento. tempMin 5 6 0 -3 3 8 4
4 6 -2 1
1
• En la memoria de una computadora (implementación), las Filas 2 7 8 -4 0
posiciones contiguas, relacionadas entre sí, por el hecho También hay Tridimensional. Algunos lenguajes permiten más dimensiones aún.
Las posiciones generalmente se cuentan a partir del 1 como primera posición
de que todas tienen el mismo nombre y los datos que
(Notación Algorítmica) o del 0 (Lenguaje C).
contiene son todos del mismo tipo.
2023 Lic. Ariel Ferreira Szpiniak 11 2023 Lic. Ariel Ferreira Szpiniak 12
Arreglo Unidimensional
Arreglo Unidimensional Selección de componentes
La estructura más simple es el arreglo de una En Notación Algorítmica y en Lenguaje C la selección de una
dimensión, también llamado vector por ser usado componente se realiza haciendo referencia a la posición.
para resolver problemas matemáticos (álgebra). Esto se logra con el uso del operador [ ] (corchetes),
colocando el índice (número) correspondiente al componente
El arreglo está formado por una sucesión de dentro del corchete, como por ejemplo:
elementos consecutivos. No deben dejarse “huecos”
Para referirse a una componente de un arreglo se utilizará el
(componentes sin datos).
nombre de la variable y un índice entre corchetes ( [índice] ).
Índices Ejemplo: notas[4]
Nombre del Límite máximo
arreglo 1 2 3 4 5 6 7 Índices
Nombre del Límite máximo
notas 5 7 10 9 7 9 4 1 2 3 4 5 6 7
arreglo
Componentes notas 5 7 10 9 7 9 4
Componentes
2023 Lic. Ariel Ferreira Szpiniak 13 2023 Lic. Ariel Ferreira Szpiniak 14
2023 Lic. Ariel Ferreira Szpiniak 17 2023 Lic. Ariel Ferreira Szpiniak 18
2023 Lic. Ariel Ferreira Szpiniak 31 2023 Lic. Ariel Ferreira Szpiniak 32
Arreglo Unidimensional Declaración de Arreglos
//sigue ¿Porqué NO hago Para evitar tener por separado las 3 variables de edades (edadesSocGym,
i 1 edadesSocPat, edadesSocNat) y las 3 variables de cantidades (cantGym,
mientras i<=cantNat hacer todas las entradas
Entrada: edadesSocNat[i] de gimnasia, patín cantPat, cantNat) podemos construir un registro para cada caso. Cada registro
i i+1 relaciona el arreglo de edades del deporte con la cantidad de cada uno.
fmientras y natación en un
i 1 mismo ciclo? NMax = 250
mientras i<=cantGym hacer TArreglo = arreglo [1..NMax] de Z+
Salida: edadesSocGym[i]
i i+1 TData = <edades TArreglo, cant (0..NMax)>
fmientras
¿Porqué NO hago
edadesSocGym, edadesSocPat, edadesSocNat TData
i 1 todas las salidas
mientras i<=cantPat hacer i Z //¿podría ser un subrango?
Salida: edadesSocPat[i] de gimnasia, patín edadesSocGym edadesSocNat
i i+1 y natación en un 1 2 3 250 1 2 3 250
fmientras
i 1 mismo ciclo? edades edades
cant cant
mientras i<=cantNat hacer
Salida: edadesSocNat[i] edadesSocPat
i i+1 1 2 3 250
fmientras
edades
Fin
cant
2023 Lic. Ariel Ferreira Szpiniak 33 2023 Lic. Ariel Ferreira Szpiniak 34
2023 Lic. Ariel Ferreira Szpiniak 35 2023 Lic. Ariel Ferreira Szpiniak 36
Declaración de Arreglos Declaración de Arreglos
Esta propuesta de utilizar un registro de dos campos, uno con el arreglo y otro
con la cantidad de componentes ocupados, es una buena práctica porque
encapsula las edades de cada deporte con las cantidades respectivas. Es la Otra forma, que no es recomendable debido a que obstaculiza la
forma en que trabajaremos con arreglo.
modularización (el pasaje de parámetros, por ejemplo).
Notación algorítmica
nombreTipo = arreglo [límiteInferior..límiteSuperior] de tipo //tipo
Notación algorítmica
nombreRegistro = <campoArreglo nombreTipo, nombreCant Nombre arreglo [límiteInferior..límiteSuperior] de tipo
(límiteInferior-1..límiteSuperior+1)> // nombreCant tiene ese rango máximo Ejemplo:
nombreVar nombreRegistro //variable notas arreglo [1..7] de Z
Ejemplo:
TElem = Z //tipo Pero es un estilo muy utilizado en Lenguaje C.
NMax = 7 //constante int notas[7]; // definición clásica
TArreglo = arreglo [1..NMax] de TElem //tipo
TData = <a TArreglo, cant (0..NMax)>
notas TData //variable
2023 Lic. Ariel Ferreira Szpiniak 37 2023 Lic. Ariel Ferreira Szpiniak 38
2023 Lic. Ariel Ferreira Szpiniak 39 2023 Lic. Ariel Ferreira Szpiniak 40
Ejemplo I Ejemplo I
Se necesita almacenar 100 letras. Se necesita almacenar 100 letras.
Nota: resolver utilizando arreglos y estructura iterativa repetir. Nota: resolver utilizando arreglos y estructura iterativa mientras.
Algoritmo MisLetras Algoritmo MisLetras
Léxico
1 2 3 100 Léxico
1 2 3 100
Max = 100 letras Max = 100 letras
TElem = Caracter TElem = Caracter
TLetras = arreglo[1..Max] de Telem // o Caracter TLetras = arreglo[1..Max] de Telem // o Caracter
letras TLetras letras TLetras
indice Z // o subrango Prueba de Escritorio indice Z // o subrango Prueba de Escritorio
Inicio Inicio
Ciclo indice Ciclo indice
Fin Fin
2023 Lic. Ariel Ferreira Szpiniak 41 2023 Lic. Ariel Ferreira Szpiniak 42
Fin Fin
2023 Lic. Ariel Ferreira Szpiniak 43 2023 Lic. Ariel Ferreira Szpiniak 44
Ejemplo II Ejemplo III
Se necesita almacenar no más de 100 letras. letras Se necesita almacenar no más de 100 letras, como máximo, y luego informarlas en el
Algoritmo MisLetras mismo orden en que fueron obtenidas. letras
1 2 3 4 …. 100
Léxico Algoritmo MisLetras
Max = 100 l Léxico 1 2 3 4 …. 100
TElem = Caracter
TLetras = arreglo[1..Max] de Telem // o Caracter
cant Max = 100
TElem = Caracter
l
TData = <l TLetras, cant (0..Max)> TLetras = arreglo[1..Max] de TElem cant
letras TData TData = <l TLetras, cant (0..Max)>
indice Z // o subrango letras TData
Inicio Prueba deEscritorio indice Z Prueba de Escritorio Prueba de Escritorio
Inicio
Ciclo indice [Link] Ciclo 1 indice [Link] Ciclo 2 indice [Link]
Fin
Fin
2023 Lic. Ariel Ferreira Szpiniak 45 2023 Lic. Ariel Ferreira Szpiniak 46
Ejemplo IV Ejemplo V
Se necesita almacenar no más de 100 letras, como máximo, y luego informarlas en el Se necesita almacenar no más de 100 letras, como máximo, y luego informar todas las
orden inverso en que fueron obtenidas. letras vocales.
Algoritmo MisLetrasInverso Algoritmo MisLetrasInverso
letras
Léxico 1 2 3 4 …. 100 Léxico 1 2 3 4 …. 100
Max = 100 l Max = 100
TElem = Caracter TLetras = arreglo[1..Max] de Caracter l
TLetras = arreglo[1..Max] de TElem cant TData = <l TLetras, cant (0..Max)>
cant
TData = <l TLetras, cant (0..Max)> letras TData
letras TData indice Z
indice Z Prueba deEscritorio Prueba de Escritorio Función EsVocal(dato v Caracter) → Lógico
Inicio … Prueba de Escritorio
Ciclo 1 indice [Link] Ciclo 2 indice [Link] fFunción v
Inicio
Fin Fin
2023 Lic. Ariel Ferreira Szpiniak 47 2023 Lic. Ariel Ferreira Szpiniak 48
Ejemplo VI Ejemplo VII
Se necesita almacenar a lo sumo 80 vocales (solo vocales) en letra mayúscula y luego Se necesita almacenar n números enteros (150 como máximo), y luego informarlos en
informar la vocal que más veces se repite. orden inverso al que fueron obtenidos.
Algoritmo OrdenInverso
Aclaración: cada vocal debe ser almacenada en mayúscula.
Algoritmo Vocales
2023 Lic. Ariel Ferreira Szpiniak 49 2023 Lic. Ariel Ferreira Szpiniak 50
1 2 3 4 5 6 7 0 1 2 3 4 5 6
notas notas
Notación Algorítmica C
2023 Lic. Ariel Ferreira Szpiniak 53 2023 Lic. Ariel Ferreira Szpiniak 54
2023 Lic. Ariel Ferreira Szpiniak 55 2023 Lic. Ariel Ferreira Szpiniak 56
Arreglo Unidimensional en C Arreglo Unidimensional en C
/*
// GuardarNotasV2 - definicion usando TArreglo
Algoritmo GuardarNotasV2 - definicion usando TArreglo
#include <stdio.h>
Léxico
#define NMax 7
NMax = 7
typedef int TArreglo [NMax];
TArreglo = arreglo [1..NMax] de Z+
TArreglo notas;
notas e TArreglo // variable de tipo arreglo
int n;
n e Z+ // variable
int i;
i e Z // Z+ o subrango de 1 a NMax+1
Inicio
int main(){
i <-- 1
i=0;
mientras i<=NMax hacer
while(i<NMax){
Entrada: n
scanf("%d",&n);
notas[i] <-- n //almacena
notas[i]=n;
i <-- i+1
i++;
fmientras
}
Fin
return 0;
*/
}
// sigue...
2023 Lic. Ariel Ferreira Szpiniak 57 2023 Lic. Ariel Ferreira Szpiniak 58
2023 Lic. Ariel Ferreira Szpiniak 59 2023 Lic. Ariel Ferreira Szpiniak 60
Arreglo Unidimensional en C Arreglo Unidimensional en C
#include <stdio.h> // OrdenInverso Ejemplo VII
#include <string.h>
/*
#define Max 150 Algoritmo GestionarNotas
typedef struct { Léxico
int d[Max]; NMax = 7
int cant; TArreglo = arreglo [1..NMax] de Z // tipo arreglo
}TData; TData = <n e TArreglo, cant e (0..NMax)> // tipo registro
TData datos; notas e TData // variable
int i;
i e Z
int main(){
i=0;
Inicio
printf("Ingrese cantidad de elementos: "); i <-- 1
scanf("%d",&[Link]); mientras i<=NMax hacer
printf("Ingrese %d numeros\n",[Link]); Entrada: notas.n[i] //almacena
while(i<[Link]){ i <-- i+1
scanf("%d",&datos.d[i]); fmientras
i++; i <-- 1
}
mientras i<=NMax hacer
i=[Link]-1;
Salida: notas.n[i] // informa
while(i>=0){
printf("elemento en la posicion %d es %d\n", i,datos.d[i]); i <-- i+1
i--; fmientras
} Fin
return 0; */
}
2023 Lic. Ariel Ferreira Szpiniak 61 2023 Lic. Ariel Ferreira Szpiniak 62
3 9 6 7 3 Ejemplo: buscaMinas[5,3]
2023 Lic. Ariel Ferreira Szpiniak 65 2023 Lic. Ariel Ferreira Szpiniak 66
2023 Lic. Ariel Ferreira Szpiniak 67 2023 Lic. Ariel Ferreira Szpiniak 68
Arreglo Bidimensional Arreglo Bidimensional
Ejemplo II Ejemplo II
Se desea poder almacenar un tablero de 16x30 del juego de buscaminas y luego mostrar
Algoritmo Juego Prueba de Escritorio
los números almacenados.
Léxico i j i<=Fila j<=Columna
Fila = 16 1 V Algoritmo Juego
Columna = 30 1 1 V Léxico
TMina = arreglo[1..Fila, 1..Columna] de (0..9) 1 2 V
i Z // o subrango Fila = 16
j Z // o subrango 1 3 V Columna = 30
buscaMinas TMina // variable ………………...….. TMina = arreglo[1..Fila, 1..Columna] de (0..9)
Inicio 1 30 V i, j Z // o subrango
1 31 F buscaMinas TMina // variable
para (i1, i<=Fila, ii+1) hacer
para (j1, j<=Columna, jj+1) hacer 2 31 V
2 1 V // continua
Entrada: buscaMinas[i,j]
2 2 V
fpara
2 3 V
fpara
………………….....
Fin
2023 Lic. Ariel Ferreira Szpiniak 69 2023 Lic. Ariel Ferreira Szpiniak 70
para (j1, j<=Columna, jj+1) hacer i j i<=Fila j<=Columna {ef: A=[x11, x12, ..., x1i, ..., x1(n-1), x1n, e, x22, ..., x2i, ..., x2 (n-1), x2n]}
2023 Lic. Ariel Ferreira Szpiniak 71 2023 Lic. Ariel Ferreira Szpiniak 72
Declaración de Arreglo Ejemplo III
Bidimensional Se necesitan almacenar los nombres que representan a los estudiantes sentados en el aula 79. El aula
79 contiene 5 hileras (filas) de 7 sillas cada una (columnas).
Para declarar una matriz se debe, preferentemente, declarar un nuevo tipo previamente. Algoritmo Aula79
Se le da un nombre al tipo, y además se define su tamaño y el tipo de datos (caracteres, Léxico
Fila = 5
enteros, etc.) que van a contener los arreglos que se definan en el futuro. Columna = 7
Luego se declaran todas las variables del tipo arreglo que sean necesarias. TAula = arreglo[1..Fila, 1..Columna] de Cadena
i Z // o subrango
j Z // o subrango
Notación algorítmica aula79 TAula
Inicio
nombreTipo = arreglo [límiteInfFila..límiteSupFila,
límiteInfCol..límiteSupCol] de tipo //tipo
nombreVar nombreTipo //variable
Ejemplo:
TElem Z //tipo
NMaxFila = 7 //constante
NMaxCol = 10 //constante
TMat = arreglo [1..NMaxFila, 1..NMaxCol] de TElem //tipo
notas TMat //variable
Fin
2023 Lic. Ariel Ferreira Szpiniak 73 2023 Lic. Ariel Ferreira Szpiniak 74
2023 Lic. Ariel Ferreira Szpiniak 77 2023 Lic. Ariel Ferreira Szpiniak 78
2023 Lic. Ariel Ferreira Szpiniak 79 2023 Lic. Ariel Ferreira Szpiniak 80
Arreglo Bidimensional Ejemplo VI
//sigue
Ejemplo V Modificar el algoritmo del Ejemplo IV, diapo 71, para modularizar en una acción el almacenamiento de los
nombres de los estudiantes sentados en las primeras 3 hileras del aula.
Algoritmo Aula79
Inicio
[Link]2
[Link]30
para (i1, i<=[Link], ii+1) hacer
para (j1, j<=[Link], jj+1) hacer
Entrada: buscaMinas.m[i,j]
fpara
fpara
para (i1, i<=[Link], ii+1) hacer
para (j1, j<=[Link], jj+1) hacer
Salida: buscaMinas.m[i,j]
fpara
fpara
Fin
2023 Lic. Ariel Ferreira Szpiniak 81 2023 Lic. Ariel Ferreira Szpiniak 82
2023 Lic. Ariel Ferreira Szpiniak 83 2023 Lic. Ariel Ferreira Szpiniak 84
Ejemplo IX Ejemplo X
Resolver el mismo problema anterior pero definiendo la matriz dentro de un registro. Un piso rectangular contiene 20 baldosas de largo y 30 de ancho. Cada baldosa posee
un número (entre 0 y 1) que identifica su dureza. Es necesario almacenar los datos de
cada una de las baldosas y luego calcular el promedio de dureza de todo el piso.
Algoritmo DurezaPromedio
Léxico
N = 20
M = 30
TNumReales = arreglo[1..N, 1..M] de R
acum, promedio R
i, j Z
piso TNumReales
Inicio
i 1
acum 0
mientras i <= N hacer
j 1
Prueba de Escritorio
mientras j <= M hacer i j i<=N j<=M
acum acum + piso[i,j]
j j+1
fmientras
i i+1
fmientras
promedio acum/(N+M) //dureza promedio
Salida:promedio
Fin
2023 Lic. Ariel Ferreira Szpiniak 85 2023 Lic. Ariel Ferreira Szpiniak 86
Ejemplo XI
Un piso rectangular contiene 20 baldosas de largo y 30 de ancho. Cada baldosa posee un número
(entre 0 y 1) que identifica su dureza. Es necesario almacenar los datos de cada una de las
Lenguaje C
baldosas y luego calcular el promedio de dureza de todo el piso.
Algoritmo DurezaPromedio
Léxico
N = 20
Arreglo Bidimensional
M = 30
TNumReales = arreglo[1..N, 1..M] de R
TData = <a TNumReales, cantFila (0..N), cantCol (0..M)> 1 2 3 4 0 1 2 3
acum, promedio R
i, j Z
piso TData 1 4 6 -2 1 0 4 6 -2 1
Inicio
i 1 2 7 8 -4 0 1 7 8 -4 0
acum 0
mientras i <= [Link] hacer 3 9 6 7 3 2 9 6 7 3
j 1
Prueba de Escritorio
i j i<=N j<=M
mientras j <= [Link] hacer
acum acum + piso.a[i,j]
Notación Algorítmica C
j j+1
fmientras Los límites inferiores de filas y columnas
son fijos, siempre comienzan con 0
i i+1
fmientras
promedio acum/(N+M) //dureza promedio
Salida:promedio
Fin
2023 Lic. Ariel Ferreira Szpiniak 87 2023 Lic. Ariel Ferreira Szpiniak 88
Arreglo Bidimensional en C Arreglo Bidimensional en C
/* Ejemplo V /*
Algoritmo Juego2 - Ejemplo V (buscaMinas)
Fil = 16 Léxico
Col = 30 Fil = 16
TMina = arreglo[1..Fil, 1..Col] de (0..9) Col = 30
TData = <m e TMina, cantFila e (0..Fil), cantCol e (0..Col) TMina = arreglo[1..Fil, 1..Col] de (0..9)
TData = <m e TMina, cantFila e (0..Fil), cantCol e (0..Col) //tipo
//tipo
buscaMinas e TData // variable
buscaMinas e TData // variable i, j e Z // o subrango
i, j e Z // o subrango Inicio
*/ [Link]<--2
[Link]<--30
#define Fil 16 para (i<--1, i<=[Link], i<--i+1) hacer
#define Col 30 para (j<--1, j<=[Link], j<--j+1) hacer
typedef struct { Entrada: buscaMinas.m[i,j]
fpara
int m[Fil][Col]; fpara
int cantFila; para (i<--1, i<=[Link], i<--i+1) hacer
int cantCol; para (j<--1, j<=[Link], j<--j+1) hacer
Salida: buscaMinas.m[i,j]
}TData; fpara
TData buscaMinas; fpara
int i,j; Fin
*/
2023 Lic. Ariel Ferreira Szpiniak 89 2023 Lic. Ariel Ferreira Szpiniak 90
2023 Lic. Ariel Ferreira Szpiniak 93 2023 Lic. Ariel Ferreira Szpiniak 94
Compartir Igual: Si usted mezcla, transforma o crea nuevo material a partir de esta obra,
usted podrá distribuir su contribución siempre que utilice la misma licencia que la obra original.
Este material está bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional