Investigacion Programacion PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 17

INSTITUTO TECNOLÓGICO DEL ISTMO

CARRERA:
INGENIERIA ELECTRICA

NOMBRE DE LA ASIGNATURA:
PROGRAMACION

NOMBRE DE LA MAESTRO:
PERALTA GONZALEZ LORENA

NOMBRE DEL TRABAJO:


INVESTIGACION

NOMBRE DEL ALUMNO:


JOSE FERNANDO GARCIA GONZALEZ

GRADO: 3 GRUPO: U
2.4.1 PROTOTIPO DE UNA FUNCION

Como el compilador trabaja sólo con la información contenida en un


único fichero, a menudo es preciso “informar” al compilador de que en
otro fichero existe una función. Esto se consigue insertando, en lugar
de la definición de la función (que ya está presente en otro fichero), su
prototipo. El prototipo de una función es una línea similar a la primera
de su declaración: tipo del resultado, seguido del nombre de la función
y de la lista de tipos de datos de los parámetros separados por comas
y rodeados por paréntesis. Toda función que se invoca debe ir
precedida o de su definición o de su prototipo. La definición y el
prototipo de la función pueden estar presentes en el mismo fichero. El
siguiente ejemplo ilustra esta situación:

1 /* Prototipo */
2 int addition(int, int);
3 /* Función principal */
4 int main()
5 {
6 int i, j;
7
8 i = 10;
9 j = 20;
10 /* Invocación de la función */
11 i += addition(i, j);
12 }
13 /* Definición de la función */
14 int addition(int a, int b)
15 {
16 return (a + b);
17 }
Prototipos de Funciones

Primero recordar que en el lenguaje de Arduino al contrario que en


estandar C, no es necesario declarar los prototipos de las funciones,
puesto que de eso se encarga el de incluirlo el arduino builder, al igual
que de añadir la función Main.

En C++ es obligatorio usar prototipos. Un prototipo es una declaración


de una función. Consiste en una presentación de la función,
exactamente con la misma estructura que la definición, pero sin
cuerpo y terminada con un «;».

En general, el prototipo de una función se compone de las siguientes


secciones:

 Opcionalmente, una palabra que especifique el tipo de


almacenamiento, puede ser extern o static. Si no se especifica
ninguna, por defecto será extern.
 El tipo del valor de retorno, que puede ser void, si no
necesitamos valor de retorno.
 Modificadores opcionales.
 El identificador de la función. Es costumbre, muy útil y muy
recomendable, poner nombres que indiquen, lo más claramente
posible, qué es lo que hace la función, y que permitan interpretar
qué hace el programa con sólo leerlos.
 Una lista de declaraciones de parámetros entre paréntesis. Los
parámetros de una función son los valores de entrada (y en
ocasiones también de salida).

Un prototipo sirve para indicar al compilador los tipos de retorno y los


de los parámetros de una función, de modo que compruebe si son del
tipo correcto cada vez que se use esta función dentro del programa, o
para hacer las conversiones de tipo cuando sea necesario.

Normalmente, los prototipos de las funciones se declaran dentro del


fichero del programa, o bien se incluyen desde un fichero externo,
llamado fichero de cabecera, (para esto se usa la directiva #include).

Ya lo hemos dicho más arriba, pero las funciones son extern por
defecto. Esto quiere decir que son accesibles desde cualquier punto
del programa, aunque se encuentren en otros ficheros fuente del
mismo programa. En contraposición las funciones declaradas static
sólo son accesibles dentro del fichero fuente donde se definen.

Si programamos en Arduino clases o librerías, es posible que debamos


utilizar los prototipos de funciones.

Bibliotecas/Librerías en C++

Junto con los compiladores de C y C++, se incluyen ciertos archivos


llamados bibliotecas más comúnmente librerías. Las bibliotecas
contienen el código objeto de muchos programas que permiten hacer
cosas comunes, como leer el teclado, escribir en la pantalla, manejar
números, realizar funciones matemáticas, etc.

Las bibliotecas están clasificadas por el tipo de trabajos que hacen,


hay bibliotecas de entrada y salida, matemáticas, de manejo de
memoria, de manejo de textos y como imaginarás existen muchísimas
librerías disponibles y todas con una función específica.

La declaración de librerías, tanto en C como en C++, se debe hacer al


principio de todo nuestro código, antes de la declaración de cualquier
función o línea de código, debemos indicarle al compilador que
librerías usar, para el saber qué términos están correctos en la
escritura de nuestro código y cuáles no. La sintaxis es la siguiente:
#include <nombre de la librería> o alternativamente #include
«nombre de la librería». En tu código puedes declarar todas las
librerías que quieras aunque en realidad no tienen sentido declarar
una librería que no vas a usar en tu programa, sin embargo no existe
límite para esto.

La directiva de preprocesador #include se usa en los lenguajes C y


C++ para “incluir” las declaraciones de otro fichero en la compilación.
Esta directiva no tiene más misterio para proyectos pequeños. En
cambio, puede ayudar aprovechar bien esta directiva en proyectos con
un gran número de subdirectorios.

Ejemplo:

1 #include "iostream"
2 #include "string"
3 #include <math.h>
4 using namespace std;

Lo único adicional, es la línea que dice using namespace std; esta


línea nos ayuda a declarar un espacio de nombre que evita tener que
usarlo cada que accedemos a alguna función específica de una
librería. Teniendo este namespace declarado podemos llamar por
ejemplo el comando cout >>, que pertenece a la librería iostream, sin
embargo sin este namespace sería std::cout >>, imagina tener que
hacer esto cada vez que uses algún comando o función de las
librerías, sería bastante tedioso.

Algunas de las librerías de uso más común de C++ y que forman parte
de las librerías estándar de este lenguaje.

 fstream: Flujos hacia/desde ficheros. Permite la manipulación de


archivos desde el programar, tanto leer como escribir en ellos.
 iosfwd: Contiene declaraciones adelantadas de todas las
plantillas de flujos y sus typedefs estándar. Por ejemplo ostream.
 iostream: Parte del a STL que contiene los algoritmos estándar,
es quizá la más usada e importante (aunque no indispensable).
 math: Contiene los prototipos de las funciones y otras
definiciones para el uso y manipulación de funciones
matemáticas.
 memory: Utilidades relativas a la gestión de memoria, incluyendo
asignadores y punteros inteligentes (auto_ptr). «auto_ptr» es una
clase que conforma la librería memory y permite un fácil manejo
de punteros y su destrucción automáticamente.
 ostream: Algoritmos estándar para los flujos de salida.
 Librería stdio: Contiene los prototipos de las funciones, macros, y
tipos para manipular datos de entrada y salida.
 Librería stdlib: Contiene los prototipos de las funciones, macros,
y tipos para utilidades de uso general.
 string: Parte de la STL relativa a contenedores tipo string; una
generalización de las cadenas alfanuméricas para albergar
cadenas de objetos.
 vector: Parte de la STL relativa a los contenedores tipo vector;
una generalización de las matrices unidimensionales C/C++
 list: Permite implementar listas doblemente enlazadas (listas
enlazadas dobles) fácilmente.
 iterator: Proporciona un conjunto de clases para iterar
elementos.
 regex: Proporciona fácil acceso al uso de expresiones regulares
para la comparación de patrones.
 thread: Útil para trabajar programación multihilos y crear
múltiples hilos en nuestra aplicación.

Arduino ya incluye diversas librerías por defecto sin llamarlas


explícitamente, p.e. math.h
2.4.2 PRINCIPAL Y SUBFUNCIONES
PROGRAMACIÓN DE MÓDULOS. TIPOS: PROCEDIMIENTOS SUB,
FUNCIONES FUNCTION.
Visual Basic, como no podía ser de otra manera, está orientado a la
programación modular. Ya hemos comentado que puede haber cierta
confusión terminológica: el concepto de módulo que hemos usado en
cursos de bases de programación de aprenderaprogramar.com no
coincide con el concepto de módulo en la terminología de Visual Basic.

Vamos a hacer una clasificación libre tratando de conectar el Visual


Basic con el desarrollo que hemos realizado en otros cursos.

Terminología de Visual
DESCRIPCIÓN
Basic
Módulo de formulario
Formulario: ventana de formulario,
(fichero *.frm ó *.vb, según
objetos sobre el formulario, código
versiones)
Código de declaraciones y definiciones Módulo estándar (fichero
de procedimientos, tipos y datos con *.bas ó *.vb, según
carácter público para otros módulos versiones)
Módulo de clase (Fichero
Código de definición de una clase de
*.cls ó *.vb, según
objeto
versiones)
Módulo de código que se ejecuta
Procedimiento conducido
cuando tiene lugar un evento
por eventos (Sub)
determinado
Módulo de código que se ejecuta
Procedimientos generales
cuando es llamado desde algún punto
(Sub)
del programa
Módulo de código que se ejecuta
Procedimiento función
cuando es llamado desde algún punto
(Function)
del programa y devuelve un valor

Dado que el código contenido en un módulo estándar de Visual Basic


es accesible desde distintos formularios del programa, será ventajoso
colocar en este módulo todo lo que queramos disponer como "código
compartido".
Buscando analogías con el desarrollo que hacemos en los cursos de
pseudocódigo de aprenderaprogramar.com, usaremos el evento que se
produce cuando ordenamos la ejecución de nuestros programas (carga
del formulario o Form_Load) para disponer en él el código del "algoritmo
principal" o guía del programa y el resto del código irá ordenado en
procedimientos conducidos por eventos, procedimientos generales ó
procedimientos función.
Habíamos dicho que un módulo no se ejecuta hasta que es llamado a
ejecutarse desde el algoritmo principal de acuerdo con la sintaxis de
pseudocódigo:

Llamar [Nombre del Módulo]

Sin embargo con programación guiada por eventos esto es sólo


parcialmente cierto: un módulo puede ejecutarse por ser llamado desde
algún punto del código pero también sin ser llamado desde el código,
cuando tiene lugar un determinado evento.
La declaración de un procedimiento general se realizará mediante la
sintaxis:
[Carácter Público o Privado] Sub [Nombre del
procedimiento]([Parámetros])

EJEMPLO

Private Sub Calcular()

Todo procedimiento tiene un final indicado mediante End Sub, aunque


se puede provocar una salida forzada usando la expresión Exit Sub.
El carácter público o privado se establece mediante las palabras clave
Public o Private, que dan lugar a que dicho procedimiento pueda
invocarse o no desde otros módulos. Sub indica que se está
declarando un procedimiento Sub con un nombre determinado, y los
paréntesis están destinados a contener parámetros requeridos por el
procedimiento para ser invocado. El paso de parámetros lo veremos
más adelante, por lo que consideraremos de momento procedimientos
sin parámetro (paréntesis vacíos).
La declaración de un procedimiento conducido por eventos la
realizaremos usando las listas desplegables de objetos y eventos que
vimos cuando hablamos de botones (Buttons o Command Buttons).
De esta manera, al seleccionar un objeto y un evento
automáticamente nos aparecerá un código del tipo (según versiones
habrá diferencias):

Código (versiones V
Código (versiones VB menos recientes)
recientes)

ub Text1_Change() Private Sub


TextBox1_TextChang
sender As System.Obj
ByVal e As System.Ev
Handles
TextBox1.TextChange

End Sub

Este es un procedimiento conducido por eventos que se invoca cuando


el texto contenido en el TextBox cambia. No prestaremos atención de
momento a los parámetros que puedan aparecer automáticamente.
La declaración de una función se realizará mediante la sintaxis:

[Carácter Público o Privado] Function [Nombre de la


función]([Parámetros]) As [Tipo de dato]

EJEMPLO

Private Function Hipotenusa() As Single


·
·
·
End Function

Como hemos dicho, una función devuelve un valor, de ahí que


especifiquemos un tipo de dato para ella. En caso de no especificarse,
el tipo será Variant u Object (dependiendo de la versión) por defecto.
El flujo para una función sigue las mismas reglas que para un
procedimiento general o conducido por eventos: al llegar a End Function
el control vuelve a la sentencia inmediatamente posterior a la llamada
efectuada. Se puede provocar la salida forzada de una función
utilizando la expresión Exit Function.
Los procedimientos pueden insertarse en el programa en cualquier
orden, aunque siempre será recomendable tratar de disponerlos en el
mismo orden que está previsto que se ejecuten.
La llamada de un procedimiento general o conducido por eventos se
realiza, cuando no hay parámetros que pasar, simplemente escribiendo
su nombre, o bien usando Call [Nombre]. La llamada a una función se
hará normalmente para obtener un valor o asignar un valor a una
variable, en expresiones del tipo:
Label1.Text = Label1.Text & [Nombre de la función]()
Variable = [Nombre de la función]()
If [Nombre de la función]() > [Variable]

Hay que recordar siempre que una "función" ejecuta un código y


devuelve un valor: podríamos decir que es un híbrido entre una variable
y un procedimiento.
La llamada a un procedimiento desde sí mismo es posible, dando lugar
a un anidamiento o recursión. Habrá de existir una condición que
evolucione para dar lugar a la salida de la recursión, regresando el
control del flujo a la instrucción posterior desde la que se autollamó el
módulo. No vamos a desarrollar contenidos relativos a la recursión, pero
si tienes interés en profundizar en esta técnica de programación te
remitimos a profundizar en esta materia mediante otros cursos que se
ofrecen en aprenderaprogramar.com.
Una llamada del algoritmo principal a sí mismo, que en su momento
escribimos como Llamar Inicio, sería posible con Visual Basic, pero no
vamos a entrar a detallar este tipo de cuestiones que raramente se
usarán.

EJERCICIO
Transformar el siguiente programa "Comunicado" en código de Visual
Basic.

1. Inicio [PROGRAMA Comunicado curso Visual Basic


aprenderaprogramar.com]
2. Mostrar “Comunicado de la empresa”
3. Llamar Saludo
4. Llamar Comunicado
5. Llamar Despedida
6. Fin

Módulo Saludo
1. Mostrar “Con motivo de la celebración el próximo día
5 del Día Mundial del Medioambiente la empresa saluda
a todos los empleados y les agradece el compromiso
con el cuidado de la naturaleza”
FinMódulo

Módulo Comunicado
1. Mostrar “Con motivo de dicha conmemoración está
previsto realizar un acto de plantación de árboles en los
jardines del edificio central el próximo día 5 a las 12 del
mediodía al que están todos invitados”
FinMódulo

Módulo Despedida
1. Mostrar “La empresa agradece su participación y
les invita a sumarse al programa <<Empleados por
una ciudad
sostenible>>. At
entamente, El Director General”
FinMódulo

SOLUCIÓN
Código (versiones VB menos
Código (versiones VB más recientes)
recientes)

REM Curso Visual Basic


'Curso VB aprenderaprogramar.com aprenderaprogramar.com
Option Explicit Option Explicit On
'Algoritmo principal Public Class Form1

Private Sub Form_Load() Private Sub Form1_Load(ByVal


MsgBox("Comunicado de la empresa") sender As System.Object, ByVal e As
Saludo 'Invocación del procedimiento System.EventArgs) Handles
Saludo MyBase.Load
Comunicado 'Invocación del MsgBox("Comunicado de la empresa")
procedimiento Comunicado Saludo() 'Invocación del procedimiento
Despedida 'Invocación del Saludo
procedimiento Despedida Comunicado() 'Invocación del
End Sub procedimiento Comunicado
Despedida() 'Invocación del
Private Sub Saludo() procedimiento Despedida
MsgBox("Con motivo de la celebración End Sub
el próximo día 5 del Día Mundial del
Medioambiente") Private Sub Saludo()
End Sub MsgBox("Con motivo de la
celebración el próximo día 5 del Día
Private Sub Comunicado() Mundial del Medioambiente")
MsgBox("Se invita a todos los End Sub
empleados a un acto de plantación de
árboles a las 5 de la tarde en los Private Sub Comunicado()
jardines del edificio central") MsgBox("Se invita a todos los
End Sub empleados a un acto de plantación de
árboles a las 5 de la tarde en los jardines
Private Sub Despedida() del edificio central")
MsgBox("La empresa agradece su End Sub
participación")
End Sub Private Sub Despedida()
MsgBox("La empresa agradece su
participación")
End Sub
End Class

El único interés de este ejercicio es reforzar la idea de estructura basada


en algoritmo principal e invocación de módulos a la hora de construir
nuestros programas.
4.2.3 PASO DE PARÁMETROS ENTRE FUNCIONES

Los parámetros son variables locales a los que se les asigna un valor
antes de comenzar la ejecución del cuerpo de una función. Su ámbito
de validez, por tanto, es el propio cuerpo de la función. El mecanismo
de paso de parámetros a las funciones es fundamental para
comprender el comportamiento de los programas en C.

Considera el siguiente programa:

1 int addition(int a, int b)


2 {
3 return (a + b);
4 }
5 int main()
6 {
7 int x = 10;
8 int y = 20;
9 int z;
10
11 z = addition(x, y);
12 }

Los parámetros a y b declarados en la línea 1 son válidos únicamente


en la expresión de la línea 3. Las variables x, y y z, por su lado, son
válidas en el cuerpo de la función main (líneas 7 a 11).

El ámbito de las variables x, y y z (ámbito llamador), y el de las


variables a y b (ámbito llamado) son totalmente diferentes. El ámbito
llamador desaparece temporalmente cuando se invoca la función
desde la lińea 11. Durante esa ejecución, el ámbito llamado es el
visible. Al terminar la función, el ámbito llamado desaparece y se
recupera el ámbito llamador.

La comunicación entre estos dos ámbitos se realiza en la línea 11.


Antes de comenzar la ejecución de la función, los valores de las
variables del ámbito llamador son copiadas sobre las variables
del ámbito llamado. Cuando termina la ejecución de la función, la
expresión de la llamada en la línea 11 se reemplaza por el valor
devuelto. En la siguiente figura se ilustra este procedimiento para el
ejemplo anterior.

El paso de parámetros y la devolución de resultado en las funciones C


se realiza por valor, es decir, copiando los valores entre los dos
ámbitos .

Las variables locales de la función (incluidos los parámetros)


desaparecen al término de la función, por lo que cualquier valor que se
quiera guardar, debe ser devuelto como resultado (ver ejercicio 1).

4.2.1. Tablas como parámetros a una función

La copia de parámetros del ámbito llamador al llamado tiene una


excepción. Cuando una función recibe como parámetro una tabla, en
lugar de realizarse un duplicado se copia su dirección de memoria.
Como consecuencia, si una función modifica una tabla que recibe
como parámetro, estos cambios sí son visibles en el ámbito llamador.
El siguiente ejemplo ilustra esta situación:

1 #define NUMBER 100


2
3 void fill(int table[NUMBER], int size)
4 {
5 int i;
6 for (i = 0; i < size; i++)
7 {
8 table[i] = 0;
9 }
10 }
11
12 int main()
13 {
14 int i, data[NUMBER];
15
16 for (i = 0; i < size; i++)
17 {
18 data[i] = 10;
19 }
20 fill(data, NUMBER);
21 /* Valores de data todos a cero */
22 }

Para la explicación de este comportamiento es preciso primero


comprender el mecanismo de punteros en C.

También podría gustarte