Curso 04-05. Práctica 3 1 Funciones CONTENIDO Consideraciones sobre funciones Estructura de un programa en C Uso de funciones Paso de parámetros Punteros.

Slides:



Advertisements
Presentaciones similares
Unidad 15 Características de C++ no relacionadas con el DOO.
Advertisements

DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Funciones y recursividad
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Repaso para la construcción del intérprete 2012
Elementos básicos del Lenguaje
Fundamentos de la Programación Estructurada
Procedimientos y Funciones
Programación I Teoría III
Direcciones, Arreglos y Argumentos de Funciones
Funciones. Programación, Algoritmos y Estructuras de Datos.
Punteros Universidad Nacional Mayor de San Marcos
FUNCIONES EN C.
INFORMATICA I Arreglos 1 CLASE 17.
Programación en C (Segunda Parte) DATSI, FI, UPM José M. Peña
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Ismael Camarero1. 2 ¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria.
Programación Estructurada
Unidad 3 Punteros.
Ingeniero Anyelo Quintero
Tema 3. Optimización de Código
Acciones y funciones Concepto
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Funciones “En C” Semestre de Otoño 2006 Claudio Gutiérrez-Soto.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
2 Acciones y funciones 2.1 Concepto
Funciones en lenguaje C
Funciones y procedimientos
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
El lenguaje de programación C - Funciones -
Programación I Teoría VI: Recursividad

1 Procedimientos Es un conjunto de sentencias incluidas entre las declaraciones Sub o Function y End Sub/Function VB utiliza varios tipos de procedimientos:
Compiladores II ( /04/ :03) Tema 2. Generación de Código para Estructuras Complejas Lecciones 3 y 4.
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Diseño de algoritmos “Punteros”
Lenguaje C.
Semana 5 Subprogramas..
FUNCIONES EN C. SOBRE FUNCIONES... Caja negra in_1 in_N out_1 In_2 Función: Nombre. (Con el cual es invocada). Entradas. (Parámetros de la función). Salida.
Introducción a los punteros
Prog. Univ. Rodríguez Rey, Pablo Funciones Programación I.
TABLAS Definición. El tipo tabla permite definir objetos formados por un conjunto de elementos del mismo tipo. Ejemplos. El tipo tabla se utiliza para.
Descomposición Modular. Funciones
COMPUTACIÓN I TEMA 6. Pasaje de parámetros por Referencia. Uso de apuntadores Prof. Mireya Morales.
Unidad II Introducción a la programación en C++
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
Informática Ingeniería en Electrónica y Automática Industrial
Informática Ingeniería en Electrónica y Automática Industrial
Programación en C para electrónicos
Punteros.
PUNTEROS Y REFERENCIAS
APUNTADORES.
FUNDAMENTOS DE PROGRAMACIÓN
Términos algoritmo diseñar algoritmo implementar algoritmo
INTRODUCCION A LA PROGRAMACION
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings
PRINCIPIOS DE PROGRAMACIÓN

LENGUAJE “C” Programación.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
Paso de Parámetros a una Función Prof. Flor Narciso Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de.
Funciones Copyright © 2005 Unidad 1. Copyright © 2005 Objetivos del Aprendizaje Explicar la naturaleza y usos de las funciones. Describir algunas funciones.
MEMORIA DINÁMICA.
1 Procedimientos y Funciones Introducción a la Informática Departamento de Sistemas Universidad del Cauca 2006.
Introducción al Lenguaje C (I) Tipos básicos, arrays y punteros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión
Funciones y paso de parámetros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Unidad Didáctica 24.
Transcripción de la presentación:

Curso Práctica 3 1 Funciones CONTENIDO Consideraciones sobre funciones Estructura de un programa en C Uso de funciones Paso de parámetros Punteros Ejemplo

Curso Práctica 3 2 Funciones Todo programa C está construido en base a funciones. Las funciones permiten estructurar la codificación de los programas reduciendo su complejidad y como consecuencia, mejorando la eficiencia de su desarrollo. Las funciones permiten la reutilización de código. La subdivisión de un programa en varias funciones dependerá, en general, del número de tareas independientes y/o del número de veces que se repita o pueda repetirse una tarea.

Curso Práctica 3 3 Funciones Las funciones pueden devolver un valor.  Si no devuelve nada se declara de tipo void.  Si devuelve un valor, la función se declara del tipo de dato que coincide con el tipo del valor que se devuelve. (se verá más adelante). Con independencia del número de funciones en que se descomponga un programa siempre debe existir una y sólo una función que se llame main( ), ya que cualquier programa C empieza ejecutándose por la citada función main(). En este curso declararemos a la función main() de tipo void.

Curso Práctica 3 4 Funciones Estructura general de un programa C en IP1 definiciones y declaraciones void main (void) { declaración de variables instrucciones } tipo1 nombre_función1 (tipo11 arg11, tipo12 arg12,...) { declaración de variables instrucciones } tipo2 nombre_función2 (tipo21 arg21, tipo22 arg22,...)... tipoN nombre_funciónN (tipoN1 argN1, tipoN2 argN2,...) { declaración de variables instrucciones } definiciones y declaraciones void main (void) { declaración de variables instrucciones } tipo1 nombre_función1 (tipo11 arg11, tipo12 arg12,...) { declaración de variables instrucciones } tipo2 nombre_función2 (tipo21 arg21, tipo22 arg22,...)... tipoN nombre_funciónN (tipoN1 argN1, tipoN2 argN2,...) { declaración de variables instrucciones } tipo1 nombre_función1 (tipo11, tipo12,...); tipo2 nombre_función2 (tipo21, tipo22,...);... tipoN nombre_funciónN (tipoN1, tipoN2,...); tipo1 nombre_función1 (tipo11, tipo12,...); tipo2 nombre_función2 (tipo21, tipo22,...);... tipoN nombre_funciónN (tipoN1, tipoN2,...);

Curso Práctica 3 5 Funciones LEA func nombre (e1:T1;...; en:Tn) dev (r:Tr) Pre: {P(e1, e2,..., en)} Post: {Q(e1, e2,..., en, r)} cons definición de constantes var declaración de variables prin sentencias fin LEA func nombre (e1:T1;...; en:Tn) dev (r:Tr) Pre: {P(e1, e2,..., en)} Post: {Q(e1, e2,..., en, r)} cons definición de constantes var declaración de variables prin sentencias fin C Tr nombre (T1 e1,..., Tn en) { Tr r; declaración de variables instrucciones return r; } C Tr nombre (T1 e1,..., Tn en) { Tr r; declaración de variables instrucciones return r; } Definición de Función: (LEA vs C) ¡ mismo tipo ! return return asigna un valor a la función

Curso Práctica 3 6 Funciones LEA func factorial (n: entero) dev (f: entero) Pre: {n>=0} Post: {f=n!} var i: entero prin := mientras i < n i := i + 1 f := f * i fmientras fin LEA func factorial (n: entero) dev (f: entero) Pre: {n>=0} Post: {f=n!} var i: entero prin := mientras i < n i := i + 1 f := f * i fmientras fin C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; } C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; } Definición de Función: (ejemplo) El valor que tenga variable f cuando se ejecute la sentencia return será el valor que tome la función factorial

Curso Práctica 3 7 Funciones LEA En una asignación: variable := nombre_función (lista de parámetros) Dentro de una expresión: E (x, nombre_función (lista de parámetros)) LEA En una asignación: variable := nombre_función (lista de parámetros) Dentro de una expresión: E (x, nombre_función (lista de parámetros)) C En una asignación: variable = nombre_función (lista de parámetros); Dentro de una expresión: E (x, nombre_función (lista de parámetros)) C En una asignación: variable = nombre_función (lista de parámetros); Dentro de una expresión: E (x, nombre_función (lista de parámetros)) Llamada a una Función: (LEA vs C) Dado que después de la ejecución de una función esta toma un valor, puede ser usada como una variable que almacena dicho valor y, por ejemplo, asignarla a una variable.

Curso Práctica 3 8 Funciones LEA a, b, f, año, ndias: entero En una asignación: f := factorial (5) f := factorial (a) / factorial (a-b) Dentro de una expresión: si esBisiesto(año) ndias := 366 fsi LEA a, b, f, año, ndias: entero En una asignación: f := factorial (5) f := factorial (a) / factorial (a-b) Dentro de una expresión: si esBisiesto(año) ndias := 366 fsi C int a, b, f, anyo, ndias; En una asignación: f = factorial (5); f = factorial (a) / factorial (a-b); Dentro de una expresión: if (esBisiesto(anyo)) ndias = 366; C int a, b, f, anyo, ndias; En una asignación: f = factorial (5); f = factorial (a) / factorial (a-b); Dentro de una expresión: if (esBisiesto(anyo)) ndias = 366; Llamada a una Función: (ejemplo)

Curso Práctica 3 9 C #include int factorial (int); void main (void) { int fac; fac = factorial (7); C #include int factorial (int); void main (void) { int fac; fac = factorial (7); Funciones Una función (en ejemplo: factorial), puede retornar en cada llamada un único valor a otra función que la invoca (en ejemplo: main). La palabra reservada return permite asignar este valor a la función invocada (en ejemplo: factorial ( )). C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; } C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; } C #include int factorial (int); void main (void) { int fac; fac = factorial (7); printf (“Factorial de 7 = %d”, fac); } C #include int factorial (int); void main (void) { int fac; fac = factorial (7); printf (“Factorial de 7 = %d”, fac); } 5040

Curso Práctica 3 10 Funciones / Se utiliza como argumentos de salida o de entrada/salida. / Permite el comportamiento de una función como procedimiento. / Es necesario el uso de punteros. PASO DE PARÁMETROS POR VALOR POR REFERENCIA / Se utilizan como argumentos de entrada

Curso Práctica 3 11 Funciones Paso de parámetros por valor: Los valores de las variables o de las constantes que se escriben como argumentos en la invocación de una función, se copian en las direcciones de memoria reservada a los parámetros formales de la función invocada. 0 x 0 y 0 z 0.0 media #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; Memoria main #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); 736 #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); #include float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); Memoria media_aritmética float media_aritmética (int a, int b, int c) { float media_aritmética (int a, int b, int c) { 3 a 7 b 6 c float media_aritmética (int a, int b, int c) { a = a + b + c; float media_aritmética (int a, int b, int c) { a = a + b + c; 16 float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); } float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); } #include float media_aritmética (int, int, int); void main (void) { int x, y, z; float media; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); printf (“La media vale %f\n”,media); } #include float media_aritmética (int, int, int); void main (void) { int x, y, z; float media; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); printf (“La media vale %f\n”,media); } ,33

Curso Práctica 3 12 Funciones 4 En C no existen procedimientos, pero se puede conseguir que una función actúe como un procedimiento mediante el uso de punteros en los parámetros formales de la función. 4 Un puntero es una variable capaz de almacenar direcciones de memoria y mediante los operadores adecuados acceder a la información que contiene la dirección de memoria a la que “apunta” en cada momento. Operador * sirve para: – Declarar un puntero, (p.e.: int *pint, float *pf;) – Acceder la información apuntada por el puntero. Operador & devuelve la dirección donde el compilador ubica una variable en la memoria. Paso de parámetros por referencia I:

Curso Práctica x 8 y 8A48 8A4A #include void intercambio (int *, int *); void main (void) { int x=5, y=8; #include void intercambio (int *, int *); void main (void) { int x=5, y=8; Memoria main #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); Funciones Paso de parámetros por referencia II: void intercambio (int *p1, int *p2) { void intercambio (int *p1, int *p2) { 8A48 p1 8A4A p2 Memoria intercambio Se pasan las direcciones de las variables que queremos sean modificadas por la función, de manera que dentro de la función definimos los correspondientes punteros que almacenan las citadas direcciones. Se pasan las direcciones Son punteros almacenan direcciones ? tmp void intercambio (int *p1, int *p2) { int tmp; void intercambio (int *p1, int *p2) { int tmp; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; 8 5 El contenido de lo apuntado por p1 5 5 void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; 8 void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; 5 void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); 8 5 #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); } #include void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); } 8 5

Curso Práctica 3 14 Funciones Ejemplos de uso de operadores de punteros.- Se declaran dos variable enteras “i” y “j” y un puntero a entero “p” int i, j, *p; Suponemos que “i” y “j” se ubican en las direcciones 13B6 e 5FC4, respectivamente. Contenido de la memoria 13B6 ? 5FC4 ? ? ? i j p Variable operación i=15; 15 p=&i; ( p “apunta” a i) j=*p; (se accede a lo apuntado por p) 13B6 15

Curso Práctica 3 15 Funciones LEA proc nombre (ent e1:Te1;...; en:Ten; sal s1:Ts1;...; sm:Tsm; es r1:Tr1;...; rp:Trp) Pre: {P(e1,..., en, r1,..., rp)} Post: {Q(e1,..., en, s1,..., sm, r1,..., rp)} cons definición de constantes var declaración de variables prin sentencias exp (ei, si, ri, x) sentencias fin LEA proc nombre (ent e1:Te1;...; en:Ten; sal s1:Ts1;...; sm:Tsm; es r1:Tr1;...; rp:Trp) Pre: {P(e1,..., en, r1,..., rp)} Post: {Q(e1,..., en, s1,..., sm, r1,..., rp)} cons definición de constantes var declaración de variables prin sentencias exp (ei, si, ri, x) sentencias fin C typedef Ts1 * PTs1;... typedef Tr1 * PTr1;... void nombre (Te1 e1,..., Ten en, PTs1 s1,..., PTsm sm, PTr1 r1,..., PTrp rp) { declaración de variables instrucciones exp (ei, *si, *ri, x); instrucciones } C typedef Ts1 * PTs1;... typedef Tr1 * PTr1;... void nombre (Te1 e1,..., Ten en, PTs1 s1,..., PTsm sm, PTr1 r1,..., PTrp rp) { declaración de variables instrucciones exp (ei, *si, *ri, x); instrucciones } Definición de Procedimiento: (LEA vs C)

Curso Práctica 3 16 Funciones #include typedef int * Pint; typedef float * Pfloat; void MulDiv (int, int, Pint, Pfloat); void main (void) { int x, y, m; float d; printf (“\n Teclee dos números:”); scanf (“%d%d”, &x, &y); MulDiv (x, y, &m, &d); printf (“%d * %d=%d”, x, y, m); printf (“%d / %d =%f”, x, y, d); } #include typedef int * Pint; typedef float * Pfloat; void MulDiv (int, int, Pint, Pfloat); void main (void) { int x, y, m; float d; printf (“\n Teclee dos números:”); scanf (“%d%d”, &x, &y); MulDiv (x, y, &m, &d); printf (“%d * %d=%d”, x, y, m); printf (“%d / %d =%f”, x, y, d); } Ejemplo de llamada y Definición de Procedimiento: Distinguir entre el operador “ * ” de multiplicación, y el operador “ * ” de contenido Llamadas por valor : “x” e “y” Llamadas por referencia: “m” y “d” void MulDiv (int op1, int op2, Pint mul, Pfloat div) { assert (op2!=0) ; * mul = op1 * op2; * div = (1.0* op1) / op2; } void MulDiv (int op1, int op2, Pint mul, Pfloat div) { assert (op2!=0) ; * mul = op1 * op2; * div = (1.0* op1) / op2; } printf (“\n Teclee dos números:”);