Upload
kmantilla
View
230
Download
0
Embed Size (px)
Citation preview
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
1/14
11
TRABAJO DE C++ DE FUNCIONES Y MACROS
DISEO Y ADMINISTRACIN DE SISTEMAS
UTS
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
2/14
QUEESU
FU
I
?
Una funcin es un conjunto de lneas de cdigo que realizan una
tarea especfica y puede retornar un valor. Las funciones pueden
tomar parmetros que modifiquen su funcionamiento. Las
funciones son utilizadas para descomponer grandes problemas en
tareas simples y para implementar operaciones que son
comnmente utilizadas durante un programa y de esta manerareducir la cantidad de cdigo.
uando una funcin es invocada se le
pasa el control a la misma, una vez que esta finaliz con su tarea el
control es devuelto al punto desde el cual la funcin fue llamada.
4.4.1
eclaracin de funciones
La declaracin da a conocer la funcin al compilador, de forma que
a partir del punto de declaracin, ya se pueden realizar
invocaciones a la misma.
su vez, la definicin estar en algn otro
punto del programa, tal vez en una librera externa (en forma ya
compilada) o en otr o mdulo de programa (como texto fuente).
Una funcin puede ser declarada varias veces en un mismo
programa, y las declaraciones pueden aparecer en cualquier orden;en un fichero fuente o en varios, pero en cualquier caso antes de su
uso, es decir: antes de cualquier invocacin a la funcin .
dems de
declarar el nombre de la funcin y el tipo devuelto (por defecto se
supone int ( ) se declaran tambin el tipo de los parmetros .
CLASES DE FUNCIONES
1. LA FUNCIN MAIN.Es imprescindible en cualquierprograma C++ representa elpunto
deiniciodesuejecucin.
Porlogeneral,sudeclaracinadoptalaforma:
Intmain();
Aunque en realidad, el mdulo de inicio la invoca con dos
parmetros (recibidos a su vez del S
), denominados
tradicionalmente argcyargv,contraccionesde "argumentcount" y
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
3/14
"argume
vec
or" res
ec
ivame
e. El
rimero es un entero
ue
re
resenta el nmero
e comandos
ue se
asan; el segundo es un
untero aunamatri de cadenas literales de distintas longitudes
es
decir:
untero a matri de
unteros
; cada una de estas cadenas
re
resenta en ltimo e
tremo los comandos iniciales
ue se
uieren
asar al
rograma, generalmente
ara controlar as
ectos
de su comportamiento. As pues, la declaracin ms genrica de
main es del tipo:
Intmain
intargc, c
ar*argv []
;
Nota: el Estndar establece
ue el compilador debe aceptar
paramain cual
uierade las dos formas anteriores.
Por convencin, argv [0] es el nombre con
ue se
a llamado al
programa
normalmente ser el nombre del fic
ero ejecutable
incluyendo su direccin completa -path-
. Este dato es
proporcionado automticamente por el SO; as pues, el valor
mnimo paraarg
es 1. Despus seguirn los
ue introduzcamos en
la lneade comandos, separados por espacios.
Como ejemplo, puede usarse el siguiente programa, al
ue
llamaremos prueba.exe:
#include // Pruebade parmetros para funcinmain
int main
int argc, char* argv []
{
int i;
printf
"Se han pasado %3d argumentos:\n", argc
;
for(i=0; i
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
4/14
y No puede ser invocada e plcitamente a lo largo delprograma, es invocadade formaautomticapor el mdulo
de inicio.
y No puede obtenerse su direccin,por lo tanto no puedendeclararse punteros a ella:
Int(*pmain)() = &main; // Error!!
y No puede ser sobrecargaday No puede serdeclarada como inliney maindebe estar en el espacio global de unade las unidades
de compilacindel programa, lo
ue significa
ue no puede
pertenecerauna clase.
Valor devueltopormain
En muchos sistemas operativos el valor devuelto por la funcin
main es utilizado como control de estado para el entorno desde el
ue se ha ejecutado el programa (este valor es considerado el
estado deretornodel programa). En UNIX, MS-DOS y MS Windows,los 8 bits ms bajos del valor devuelto son pasados al programa
invocante o al intrprete de comandos. Este "estado de retorno" se
utiliza en ocasiones para cambiar el curso de un programa, un
proceso por lotes o unguinpara el ejecutorde comandos.
Algunos compiladores pueden generar un aviso de error si se
intenta compilarun programa cuya funcin main no devuelva un
int. Por contra,algunas plataformas puedenprovocar fallos cuando
estos programas arrancan o a suterminacin, ya
ue esperanunint
de retorno.
En los programas C++ no es necesario devolver nada desde la
funcinmain,aunque enrealidad ladefinicinde esta sea intmain
(). Larazn es que el Estndargarantizaque si main llegaa su final
alcanzando el corchete de cierre "}" sin haber encontrado una
sentenciareturn, el compiladordebe devolverautomticamente un
0 indicando un final correcto,de formaque enausenciade ningn
retorno el compiladorproporcionaautomticamente unreturn 0;
Nota: no obstante lo anterior, el comportamiento concreto
varade un compiladora otro. Por ejemplo,unprograma en el
que se alcanza el corchete de cierre de la funcin main sin
ninguna sentenciade retorno compila sindificultadni aviso de
ningntipo en Borland C++ 5.5,mientras que MS Visual C++ 6.0
avisa: warning C4508: main: function should return a value;
'void' returntype assumed.
En cualquier caso, es prctica de buena programacin incluir un
valorde retorno para la funcinmain. Tradicionalmente 0 significa
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
5/14
una terminacin correcta del programa, cualquier otro valor es
seal de terminacinanormal (error o e
cepcin).
Si el programaterminaporuna invocacina la funcinexit, el valor
devuelto pormain es el argumento pasado aexit Por ejemplo, si el
programa contiene la llamada e
it(1), el valordevuelto es 1.
2. FUNC ! N VOID.Ba jo ciertas circunstancias se desear escribir funciones que no
regresen valor alguno (esto sera algo parecido a escribir
procedures en Pascal) y para ello podemos declarar a la funcin
como void. La palabra reservada void es utilizada para declarar
funciones sin valor de retorno y tambin para indicar que una
funcin especfica no requiere de parmetros. Por ejemplo, la
funcinpausa()que se ver en seguida,no devolver valoralguno y
lamismano requiere de parmetros.
// Esta funcinrequiere delalibreraiostream
C"
DIGO DE LAFUNCIN VOID
#include
Usingnamespacestd;
Void sumar ()
{
Intnum1,num2,r;
Cout>num1;
Cout>num2;
r = num1 + num2;
Cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
6/14
Tipo nombre (){}
El tipo se refiere al tipo de dato (int, float, void, char) y en las
funciones que no retornan siempre es void.
El nombre es el nombre de la funcin: cualquieraque empiece con
una letra,que sea significativo y que no seaunapalabrareservada.
Para llamarlas slo hay que escribir el nombre de la funcin seguido
de sus parntesis y unpunto y coma(;).
Nombre ();
Imagnense que estn entrenando a superro ahacerse el muertito.
Cada vezque ustedes dicen muertito, el perro se tirade espaldas
en el suelo, cierra los ojos y saca la lengua. En programacin, el
contenido de la funcin sera tirarse de espaldas, cerrar los ojos y
sacar la lengua; el nombre de la funcin seramuertito; y cada vez
que nosotros decimos muertito estamos llamando a la funcin.
Nuestra funcin seraalgo as:
voidmuertito()
{
Perro.Tirarse(posicion='espalda');
Perro[OjoDer].Cerrar();
Perro[OjoIzq].Cerrar();
Perro[Lengua].Sacar();
}Jajaja,bueno, bueno. Ya en serio vamos a hacer un clsico Hola
Mundo pero usando una funcin:
#include
usingnamespace std;
voidhola()
{
cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
7/14
compilador se brinca a la funcin, la ejecuta y cuando termina,
vuelve al punto desde donde brinc.
Si pudieran leerle lamente aun compilador, este dira:
Linea 1. Incluir la librera iostream. OK
Linea 2. Usar el namespace estndar. OK
Linea 3. Oh!una funcin llamadahola, larecordar.
Linea 4. Llave. Parte de la funcin. Ignorar
Linea 5. Imprimir Hola Mundo!. Parte de la funcin. Ignorar
Linea 6. Llave. Parte de la funcin. Ignorar
Linea 7. Por fin el main!
Linea 8. Llave. Entrar
Linea 9. Esta funcin se me hace conocida oh s ya recuerdo.
Ejecutar lineas 4, 5 y 6
Linea 10. Llave. Salir
Ahora veamos una funcinque snos es til:
#include
usingnamespace std;
voidhola(charnombre[50])
{
cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
8/14
3. FUNCIN BINARIAFuncinbinario ()automticamente hace unbucle si necesidadde
que le coloque un while o un for pero pasa primero por el else
despus cae en la condicin y al final es que sale del condicional e
imprime el modulo.
QUE SIGN
IFICA
ESTA
F
UNC
ION:
Dentro de binario, llama desde dentro otra vez a la funcin, amenos que de 0.Llamada a binario(n);
int binario (int num) {
- si es 0 sale de binario- sino vuelve a entrar enbinario connum/2(adems hace sacar el 0o el 1 correspondiente)
}
Se trata de llamadas recursivas a una funcin. Cuando se llama a
ella misma de nuevo (con otro argumento).Es un mtodo muy elegante y econmico, te recomiendo que lo
comprendas bien.Se produce una cadenade llamadas abinario (), se vanguardandolos valores y cuando se retorna, se retorna siguiendo toda la cadenasucesivamente.
CDIGO DE LA FUNCION BINARIO #include
#include
Usingnamespacestd;
Intbinario(intnum);
Intn,b;
intmain()
{
cout>n;
cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
9/14
{
if(num == 0){
return 0;}
else
{
binario(num/2);
}
b=num%2;
cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
10/14
3. Carcterde fin. El carcterque el usuario vausar como final de la
cadena. Por lo general es el Enter que se representa como \n
(diagonal n).
Por ejemplo, supongamos que tenemos un arreglo char de 500
elementos llamado str (nuestra string) y queremos pedirle al
usuario que la llene, la funcin cin.getline quedaraas:
cin.getline (str, 500, '\n');
Como ven, los parmetros van separados por comas (,), y el
carcterde fin est entre comillas simples ().
CODIGO DE LAFUNCIONCIN.GETLINE ();
#include
Usingnamespacestd;
Intmain ()
{
Charstr [500];
Cout
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
11/14
Definicinde algunos macros de c++
Assert
Esta macro est diseada para capturar los errores de
programacin,no de usuario o correr errores, yaque por lo generalcon discapacidad despus de un programa se cierra la fase dedepuracin.
ParmetrosExpresin
Expresin a evaluar. Si esta expresin se evala a 0, estoprovocaunerrorde asercinde que termina el programa.
#define assert ( test )
Errno
error de dominio: Algunas funciones matemticas slo se definen
para ciertos valores reales,que se llama sudominio,por ejemplo, la
funcin de raz cuadrada slo est definido para los nmeros no-
negativos,por lo tanto el sqrt funcinasignaa errno el EDOM si esllamado conunargumento negativo.
Esta macro se expande a unlvaluemodificable de tipo int,por lo
que se puede leer y modificar un programa.
errno se pone a cero al inicio del programa, y determinadas
funciones de la biblioteca estndar de C modificar su valor a un
valor diferente de cero para indicar algn tipo de error. Tambin
puede modificar su valor o puestaa cero a su conveniencia.
Erange
Rango deerror: El rango de valores que se puedenrepresentar con
una variable es limitado. Por ejemplo, funciones matemticas,
como prisionero de guerra puede salida de la gama que puede
representarse por una variable de punto flotante, o funciones
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
12/14
como strtodpuede encontrar secuencias de dgitos yaque el rango
representable por un valor int. En estos casos, errno se establece
en ERANGE.
#define ERANGE
Filenamemax
Longitud mxima delosnombres dearchivo
Esta macro se expande a una constante expresin integralcorrespondiente al tamao necesario para una serie de
elementos chara celebrar el nombre del archivo de cadena mslargapermitidapor el sistema. O, si el sistemano impone ningunarestriccin, se establece en el tamao recomendado para lasmatrices de caracteres destinados a contener cualquiernombre dearchivo.
Porquutilizarmacros?
Las macros no siguen la sintaxis del lenguaje de programacin en elque se programan, sino que son meta programas que generancdigo. Tienen supropia sintaxis de definicin y de expansin. Por
ello es posible utilizarlos para extender un lenguaje deprogramacin,aadindole nuevas caractersticas.
Incluso es posible utilizar las macros de un lenguaje deprogramacinminimalista como Scheme para construirprototiposde nuevos lenguajes de programacin. Son muy usadas enuniversidades y departamentos de investigacinpara crearnuevasprimitivas y nuevas lenguajes orientados adominios especficos. Unejemplo es larobtica. Se handefinido lenguajes de programacin
especficos orientado al control de tareas y de acciones de robotsautnomos utilizando macros definidas en Scheme.
Las macros han sido precursoras de algunas tcnicas de meta -programacin de los lenguajes modernos. Entendemos por meta-programacin la utilizacin de elementos que se salen del propio
lenguaje para extenderlo.
Ejemplos de ejercicios de macros
Ladirectiva#definedefine una macro. Las macros proporcionanunmecanismo de reemplazo de tokens con o sin una serie de
parmetros formales (parecidos a las funciones). Esta similitud conlas funciones hace que en ocasiones sirvan para una especie de
sustitucininlineaunque estaprcticapresenta sus riesgos.
Sintaxis
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
13/14
#define macro_identificador
1 ejercicio
# include
# define INICIO 0 /* Punto de inicio del bucle */ # define FINAL 9 /* Findel bucle */
# define MAX(A,B)((A)>(B)?(A):(B)) /* Definicinmacro de Max*/# define MIN(A,B)((A)>(B)?(B):(A)) /* Definicinmacro de Min*/
intmain(){
int indice,mn,mx ;int contador = 5 ;
for(indice = INICIO ; indice
8/6/2019 TRABAJO DE C++ DE FUNCIONES Y MACROS
14/14
#define CUADRADO(A)(A)*(A) /* Macro correcta parael cuadrado */#define SUMA_EQUIVOCADA(A)(A)+(A) /* Macro equivocadapara la suma*/
#define SUMA_CORRECTA(A)((A)+(A)) /* Macro correcta parala suma*/#define INICIO 1
#define FINAL 7
intmain()
{int i, offset ;offset = 5 ;for(i = INICIO ; i