Está en la página 1de 65

Clase 02-03:

REPASO
Subprogramas, Parámetros,Variables y arreglos
multidimensionles
Bibliografía.
 Deitel H.M. “Como Programar en
C/C++”. Ed. Prentice Hall
 Joyanes, Luis. “C++ a su alcance: un
enfoque orientado a objetos”. Ed.
McGraw Hill
 Diccionario de la Real Academia de la
Lengua Española (RAE). disponible en
www.rae.es
Ejercicio 
1. Que son Lenguajes interpretados vs Lenguajes
compilados
2. Como funciona un programa implementado en
C?? Como se comporta el código, Que partes de
la máquina intervienen??
3. Como funciona el paso por valor y el paso por
referencia?? Diferencias??
Tarea
1. Que son Lenguajes interpretados vs
Lenguajes compilados

https://www.youtube.com/watch?v=sKIgTk5NDAI
Tarea
2. Como funciona un programa
implementado en C?? Como se
comporta el código, Que partes de la
máquina intervienen??
Ambiente Típico
de Desarrollo en C
(Tomado de Deittel Pag. 12)
Tarea (otra vez…  )
1. Escribir el psuedocódigo y después la implementación
de un programa que pida al usuario 12 números
enteros para ser almacenados en un vector. Después,
el programa deberá escribir dichos números en
pantalla de manera inversa a como fueron ingresados,
indicar cuál es el número menor y el número de veces
que aparece éste, así como el lugar o los lugares que
ocupa dicho número en la lista.
En Dev C++
Motivación
How do you eat an elephant?

One bite at a time


Divide y Vencerás…
 Consiste en la descomposición de un
problema en sus elementos mas simples
 Cada una de las soluciones es implementada
en un módulo diferente
 Es la técnica fundamental de la división
funcional en subprogramas o subrutinas
◦ Estos siempre estarán ligados a un programa
principal
◦ Puede identificarse dos tipos fundamentales:
 Funciones
 Procedimientos
PREGUNTA
 Es lo mismo hablar de:
◦ Procedimiento
◦ Función
Veamos
Inicio
//Proc y funciones principal()
Void procedimiento() Escriba (“Digite el valor del
primer numero: ”)
Entero funcion(int a,int b)
Lea(a);
Escriba (“Digite el valor del
//Variables globales segundo número: ”)
Entero a,b,resultado; Lea(b);
resultado=funcion(a,b);
procedimiento() Escriba (“El resultado por
función es” + resultado)
resultado=a+b;
Escriba (“El resultado por
Escriba(resultado)
procedimiento es” +
Fin_procedimiento procedimiento())
Fin_principal
Entero funcion(int local_a,int Fin inicio
local_b)
retorna= local_a + local_b;
Fin_funcion
Entonces…
 Funciones
◦ Son aquellos subprogramas que toman una o
varias entradas, retornando un único
resultado
◦ Su principal inconveniente es que puede retornar
solo un valor
 Procedimientos
◦ Son usados en caso que se requiera retornar 0..*
valores (uno, inclusive)
◦ También son subprogramas, pero tras ejecutarse,
no tienen nombres asociados, sino que el retorno
de valores se realiza a través de parámetros
Subprograma.
 Puede ser conocido como subrutina, función,
método o procedimiento
 Corresponde a un segmento de código que será
ejecutado al interior de uno mas grande
 Normalmente se emplea para brindar un servicio
al segmento mayor, aunque siendo independiente
de éste
 La calidad del subprograma se deriva de la
facilidad con que es llamado y la transparencia
con que retorna el control al código principal
Todo bien, pero…
 Puede tener problemáticas derivadas del
manejo de “vuelta simple” o del retorno de
un valor que ha sido procesado
◦ Pérdida del control de la ejecución
◦ Distorsión de la ejecución y dilución de la
responsabilidad por el abuso en la construcción
de subrutinas
◦ Hay lenguajes de programación que hacen
distinción entre funciones y subprogramas
◦ (eg. ADA, SmalTalk)
Ventajas en el uso de subprogramas.
 Reduce ostensiblemente la replicación de código
◦ Fomenta la reutilización de componentes y librerías de
funciones
 Facilita la descomposición funcional de procesos
en tareas de simple ejecución
 Mejora la capacidad de mantenimiento y de
modificación por corrección o extensión
 Incrementa la legibilidad de un programa
 Oculta segmentos del programa que pueden
considerarse delicados o de acceso restringido
Componentes de un subprograma.
 Cuerpo de código principal, ejecutable
al momento que el subprograma sea
solicitado
 Parámetros, que son entregados al
subprograma al momento de ser
solicitado
 Valor de retorno, entregado
normalmente a una variable en el punto
de llamada con el fin de ser empleado
Efectos secundarios de los
subprogramas.
 En muchas de las actividades en las que
puede emplearse subprogramas, es
posible encontrarse con “efectos
secundarios”, derivados de la
concurrencia
◦ Manejo de rutinas con apuntadores
◦ Rutinas de pseudorandomización
◦ Manejo de estructuras de
almacenamiento (generalmente archivos)
Tarea (otra vez…  )
1. Escribir el psuedocódigo y después la implementación
de un programa que pida al usuario 12 números
enteros para ser almacenados en un vector. Después,
el programa deberá escribir dichos números en
pantalla de manera inversa a como fueron ingresados,
indicar cuál es el número menor y el número de veces
que aparece éste, así como el lugar o los lugares que
ocupa dicho número en la lista.
(Utilice subprogramas)
Paso de argumentos.
 Los lenguajes de programación modernos
implementan dos métodos para el paso de
argumentos:
◦ Paso por valor
◦ Paso por referencia.

 Normalmente se maneja el paso por


valor como el método por defecto.
Paso de argumentos…
Parámetros por valor.
 Implica que al compilar y ejecutar la función,
ésta recibe copia de los valores de los
parámetros
◦ Las variables reales no se pasan a la función
 Esto se desenvuelve en el contexto de las
variables locales y globales
◦ Variables locales
 Son declaradas y administradas al interior de un
segmento de código específico (limitado por llaves)
◦ Variables globales
 Son declaradas y administradas en cualquier parte del
código; para ser globales deben identificarse como tal.
Ejemplo…
#include <iostream.h> void argumentos(int x,
void argumentos(int x, int y){
int y); x=x+y;
y=y+y;
main(){ cout<<“la variable x es
ahora: ”<<x;
int x, y;
cout<<“la variable y es
cout<<“introduzca dos ahora: ”<<y;
valores”;
}
cin>>x;
cin>>y;
argumentos(x, y);
cout<<“los números
son: ”<<x<<y;
}
Otro caso…
#include <iostream.h> Void main(void){
int n=10;
void local(int valor){ cout<<“Antes de entrar
cout<<“Dentro del al procedimiento,
procedimiento, valor ” valor ” << n;
<< valor; local(n);
valor = 75; cout<<“Luego de salir
cout<<“Antes de salir del procedimiento,
del procedimiento, valor ” << n;
valor ” << valor; }
} Salidas:
Antes de entrar a la función, valor 10
Dentro de la funcion, valor 10
Antes de salir de la funcion, valor 75
Luego de salir de la funcion, valor 10
Paso de argumentos…
Parámetros por referencia.
 Es empleado cuando se requiere que el
cambio de valor se vea reflejado en la
variable real
 El paso de la referencia indica que se pasa
la dirección que indica a la función donde
existe la variable en memoria
◦ Para el caso de C++, se indica el paso por
referencia con el símbolo ampersand (&) al
declarar la función
Otro caso…
#include <iostream.h> Void main(void){
int n=10;
void local(int &valor){ cout<<“Antes de entrar
cout<<“Dentro del al procedimiento,
procedimiento, valor ” valor ” << n;
<< valor; local(n);
valor = 75; cout<<“Luego de salir
cout<<“Antes de salir del procedimiento,
del procedimiento, valor ” << n;
valor ” << valor; }
} Salidas:
Antes de entrar a la función, valor 10
Dentro de la funcion, valor 10
Antes de salir de la funcion, valor 75
Luego de salir de la funcion, valor 75
Otro caso…
void f(int &x){ int f(int &x){
x*=10; x*=10;
} return x;
}
Dentro del procedimiento: Dentro de la función:
… …
int x=10; int x=10; y;
f(x); y = f(x);
cout<<x; cout<<y;
//el valor es 100 //el valor es 100
//Cual es el valor de x??

Se requiere de una función que multiplique un


valor por 10 y devuelva el valor modificado
Entonces…¿Cuándo uno o el otro?
 Las referencias son particularmente útiles
cuando se pasan estructuras grandes u
objetos a la función
◦ De esta manera se pasa la dirección, no el objeto
completo
 Algo importante, las referencias no son
punteros, ya que no pueden manipularse ni
soportan operaciones aritméticas
◦ Su propósito es facilitar la aceptación de estructuras y
objetos de gran tamaño
◦ Líneas como función(n + 50) no serían válidas
por que no se pasa un número
Tarea
1. Escribir el psuedocódigo y después la implementación
de un programa que pida al usuario 12 números
enteros para ser almacenados en un vector. Después,
el programa deberá escribir dichos números en
pantalla de manera inversa a como fueron ingresados,
indicar cuál es el número menor y el número de veces
que aparece éste, así como el lugar o los lugares que
ocupa dicho número en la lista.

Ojo hacerlo con subprogramas


pasando el arreglo por referencia
Ámbito.
 Considerando la definición “plana” de la
palabra, podría considerarse como “el
espacio enmarcado entre dos límites”
[RAE, 2010]
 Esto indica que hay un área de influencia,
marcada normalmente por el contorno dado
a un espacio
Ámbito de una variable.
 Éste se refiere al área en la que se conoce la
variable; correspondiente al área en la que está
definida y se puede hacer referencia a ella
◦ El área en la que se conoce la variable puede estar
dentro de una función, o podría conocerse
globalmente en toda la aplicación
◦ A las primeras se les conoce como variables
locales y a las segundas como variables globales
¿Y esto para que?...
 Comprender en el ámbito de las variables es
importante a la hora de desarrollar aplicaciones
 El ámbito no sólo indica cuándo y dónde puede
hacer referencia a las variables, sino también el
tiempo durante el cual una determinada
variable existe en una aplicación
◦ Al definir variables en el cuerpo de una función,
éstas dejan de existir al finalizar la función
especificada
◦ Hacer referencia a ellas desencadenará errores,
provocando un comportamiento inesperado
Veamos…
 Las Variables globales son visibles para
todas las funciones y ámbitos del
programa
◦ Es como si se definiera en todas las áreas del
código
 Las Variables locales están disponibles
en el cuerpo de la función en la que se
han declarado (incluidas entre llaves)
◦ Así que solo tienen efecto en una parte del
código
Veamos…
 Si consideramos que las variables locales
solo tienen impacto al interior de la
función…
◦ ¿Qué pasa si se nombra de la misma manera
una variable local a las funciones “X” y “Y”?
◦ No pasa nada, son variables completamente
diferentes
 (piénsese en las variables normalmente empleadas
en los ciclos o iteraciones: i, j, k…)
En Dev C++
Problema
 Se requiere almacenar, de manera
genérica los diferentes datos de los
estudiantes, cada uno con nombre,
apellido, cc y nota parcial.
¿Qué son?...
 Son los creados por el programador para
satisfacer sus necesidades
 Por ejemplo, para el caso de C++
◦ Int Edad = 14
◦ Objeto = new clase
 Pueden dividirse en 2 grandes grupos:
◦ Simples
 Corresponden a tipos de dato nativos
◦ Complejos
 Corresponden a estructuras de objetos
Otra forma de clasificarlos…
 TD Escalares:
◦ Son aquellos tipos de datos cuyos miembros están
compuestos por un solo ítem (Dato).
 Ej: int, float, char etc.

 TD Escalares Agregados:
◦ Son aquellos que están compuestos por más de un
elemento de información (Dato), a cada uno de estos
elementos se les conoce como miembros o componentes
 Ejemplo: Las estructuras y uniones en C/C++.
Veamos…
Estructuras.
 Son tipos de datos compuestos formados por
varios datos llamados campos o miembros
 Cada uno de estos posee su propio espacio
en memoria
 Pueden incluso haber estructuras dentro de
estructuras

struct nombre_de_estructura
{
Campos de la estructura;
};
Tipos de datos Primitivos
Nombre Descripción Tamaño* Rango de valores*
Caracter o entero con signo: -128 to
Char 1byte
pequeño 127sin signo: 0 a 255
con signo: -32768 a
short int (short) Entero corto 2bytes 32767sin signo: 0 a
65535
con signo: -
2147483648 a
int Entero 4bytes
2147483647sin signo:
0 a 4294967295
con signo: -
2147483648 a
long int (long) Entero largo 4bytes
2147483647sin signo:
0 a 4294967295
Valor booleano. Puede
bool tomar dos valores: 1byte true o false
verdadero o falso
Número de punto
float 4bytes 3.4e +/- 38 (7 digitos)
flotante
De punto flotante de 1.7e +/- 308 (15
double 8bytes
doble precisión digitos)
Long de punto
1.7e +/- 308 (15
long double flotante de doble 8bytes
digitos)
precisión
Un ejemplo…
struct estudiante
{
char nombre[20];
char apellido[20];
float nota;
int id;
};

struct estudiante pedro; // Vble de tipo estructura
// estudiante
Algo así como…
Otro ejemplo…
struct estudiante

char nombre[20];

char apellido[20];

float nota;

int id;

} juan, luisa; //Declara la estructura y

// 2 vbles
Acceso a los campos de la
estructura.
 Para acceder a cada uno de los campos
de la estructura se utiliza:
◦ vbleEstructura.campo

 Ej:
◦ juan.nota=4.0;
◦ cin>> juan.nombre;
◦ cout<<juan.nombre<<" "<<juan.nota;
En Dev C++
Tarea
1. Hacer un arreglo de estructuras que
permita recibir 6 estudiantes y después
los despliegue por pantalla con todos sus
detalles.
Arreglos Multidimensionales
(Matrices)
PROYECTOS

Secuencia Nocturna

https://www.youtube.com/watch?v=taKhErZeFbM&feature=youtu.be

Secuencia Diurna

https://www.youtube.com/watch?v=zJ_uPLm2gTg&t=1h10m
CÁMARAS DRON

Secuencia Nocturna

https://www.youtube.com/watch?v=tlJ08qnGf2M&feature=youtu.be

Secuencia Diurna

https://www.youtube.com/watch?v=UQfPGHtr72k&feature=youtu.be
DEMO
El problema de una sola dimensión.
 Considerando la problemática, pensemos en
lo siguiente:
◦ Una cadena de almacenes tiene 4 sucursales, y de
cada una desea saber las ventas de “jabón
suavecito” durante los 7 días de la semana
 ¿Podríamos resolver este problema con
arreglos unidimensionales?
◦ Podría crearse un arreglo por cada almacén y
referenciar el día de la semana solicitado
◦ … o simplemente, creamos una estructura
bidimensional llamada matriz
Sería algo como esto…

9 5 6 2 4 8 3
9 5 6 2 4 8 3
SUCURSALES
9 5 6 2 4 8 3
9 5 6 2 4 8 3

El contenido de los vectores se referencia a base


DÍAS DE LA SEMANA

de filas y columnas al interior de una estructura de


corchetes separados [fila][columna].

Así, el contenido de la matriz en la fila 1 y columna


4 sería (2), y se referenciaría así:

matriz[1][4] = 2;
Sería algo como esto…
Arreglos bidimensionales.
 Puede considerarse como la unión de
diversos arreglos unidimensionales
◦ Cumple además una de sus normas: solo se
puede guardar en ellos valores del mismo tipo
 Los arreglos bidimensionales se
representan en memoria de la siguiente
manera (para el caso de edad):
edad:array[1..100, 1..100]of int
 A los arreglos bidimensionales se les
conoce como “Matrices”
Matrices…
El caso de C++.
 La instrucción para declarar un vector bidimensional es:
tipo nombre_matriz[tamañof][tamañoc];
 Donde tipo es cualquier tipo de dato nativo o generado
por el usuario; por ejemplo:
int ventas[10][20];
 Y su estructura sería similar a la que se puede apreciar
en la siguiente tabla:
Matrices…
El caso de los subíndices.
 En este caso, cada posición de la matriz tiene
un identificador
◦ También se denota por medio del uso de
corchetes “[ ]” posterior al nombre de la matriz,
situando en su interior la posición deseada
 P.ej., Texto[3][4]=a; Precios[0][0]=500
◦ La posición también puede ser representada por
medio de una variable cuyo valor pueda cambiar
a medida que avanza la ejecución del programa
 P.ej., Texto[i][j]=a; Precios[k][l]=500
 Estas posiciones normalmente se apoyan en el uso de
ciclos anidados para lograr el recorrido por la
estructura de espacios de la matriz
Pensemos…
 Ahora podemos dar solución a los
problemas planteados para este
segmento:
◦ Una cadena de almacenes tiene 4 sucursales, y
de cada una desea saber las ventas de “jabón
suavecito” durante los 7 días de la semana
 La idea es entonces crear una estructura
de matriz que maneje la información de
las ventas
Sería algo así
 Se genera una matriz de tipo entero con 4
filas por 7 columnas (28 posiciones):
ventas:array[1..4,1..7]of int (notación)
int ventas[4][7]; (C++)
 Ahora, se recorre la matriz, pudiendo
realizar operaciones con los números
for (int i=0; i<4; i++){
for (int j=0; j<7; j++){
valor = ventas[i][j];
}
}
Ejercicio
 Se requiere escribir un programa que
genere un triangulo equilátero de
asteriscos secuenciales así:
El usuario debe ingresar el numero
* máximo de asteriscos de la base.
Como será el manejo de los
* * índices??
Que se debe tener en cuenta para
* * * el cambio de línea?

* * * *
* * * * *
Actividades.
 Además de los arreglos uni/bidimensionales, es
posible trabajar con arreglos de más dimensiones,
denominados arreglos multidimensionales. Como un
ejemplo deben desarrollar el siguiente ejercicio:
 Se desea escribir un programa que permita manejar la
información de habitantes de un complejo
habitacional. Este posee 7 torres, cada torre posee 20
pisos y cada piso 6 departamentos.
◦ Haga los algoritmos que permitan:
 Llenar la información de cada departamento del complejo
 Posteriormente, conocer la cantidad total de habitantes del
complejo
 Conocer la cantidad promedio de habitantes por piso de cada
torre
 Conocer la cantidad promedio de habitantes por torre
 La cantidad de apartamentos que tienen mas y menos habitantes
que el promedio general
Pista…
Es algo como esto:
Actividades.
 Desarrollar el Taller 01 (Arreglos y
Matrices) como un refuerzo para la el
quiz, junto con el último ejercicio.

También podría gustarte