Modularización en lenguaje C Funcionesdirinfo.unsl.edu.ar/servicios/abm/assets/uploads/... ·...
Transcript of Modularización en lenguaje C Funcionesdirinfo.unsl.edu.ar/servicios/abm/assets/uploads/... ·...
F. de la Informática- Int.a la Computación - Int.a la Programación
1
Modularización en lenguaje C
Funciones
PrimerCuatrimestre 2015
2
Modularización
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
3
Modularización
Algoritmo "ALGO” Comenzar NUM1: arreglo [1…30] de entero NUM2: arreglo [1…20] de entero I: entero Ingreso (NUM1 ,1,30,1) Ingreso (NUM2 ,20,1,-1) . . . Fin
Subalgoritmo “Ingreso” (inout NUM: arreglo entero ,in inicio, final, FE: entero) Comenzar
I: entero Escribir: “ingrese datos enteros” Para I desde inicio hasta final con paso FE hacer Leer NUM[I] Fin para
Fin
4
Subalgoritmo “Multiplo” (inout NUM1: arreglo entero, inout NUM2: arreglo entero) Comenzar I: entero Cant: entero Cant2: entero Cant <-0 Para I desde 1 hasta 30 con paso 1 hacer Si NUM1 [I]//7 <>0 entonces Cant<-cant +1 Fin si Fin para Cant2<-0 Para I desde 20 hasta 1 con paso -1 hacer Si NUM2 [I] //4 <>0 entonces Cant 2 <- cant2 +1 Fin si Fin para Fin
Modularización
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
5
Introducción
#include <stdio.h> int main(){ int resultado=1; /* valor fibonacci */ int numero; /* numero a introducir por el usuario */ int p; printf( "Introduzca un entero: " ); scanf( "%d", &numero); /* obtiene un entero del usuario */ getchar(); /* calcula el valor fibonacci del numero ingresado*/ if ( numero == 0 || numero == 1 ) {
resultado = numero;} /* fin de if */ else {
for (p=1; p<numero; p++){ resultado = resultado+ (p+1);} }
printf( "Fibonacci( %d ) = %d", numero, resultado ); /* muestra el resultado */ return (0); /* indica terminacion exitosa */ } /* fin de main */
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
printf( "Introduzca un entero: " ); scanf( "%d", &numero); /* obtiene un entero del usuario */ getchar(); /* calcula el valor fibonacci del numero ingresado*/ if ( numero == 0 || numero == 1 ) {
resultado = numero;} /* fin de if */ else {
for (p=1; p<numero; p++){ resultado = resultado+ (p+1);} }
printf( "Fibonacci( %d ) = %d", numero, resultado ); /* muestra el resultado */ printf( "Introduzca otro entero: " ); scanf( "%d", &numero); /* obtiene segundo entero del usuario */ getchar(); /* calcula el valor fibonacci del numero ingresado*/ if ( numero == 0 || numero == 1 ) {
resultado = numero;} /* fin de if */ else {
for (p=1; p<numero; p++){ resultado = resultado+ (p+1);} }
printf( "Fibonacci( %d ) = %d", numero, resultado ); /* muestra el resultado */ 6
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
7
Una vez que definimos un método que resuelva un problema
concreto, se pretende ser capaces de usarlo tantas veces como sea necesario
sin tener que reescribirlo.
Objetivo:
Modularización
L. de Diseño
Subalgoritmos Funciones
C
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
8
FUNCIONES
Programa Principal Función de Tarea Específica
La modularización determina como mínimo dos módulos bien definidos de la solución: el Módulo Principal y el Módulo que realiza la Tarea Específica. El módulo principal es el algoritmo que soluciona el problema general planteado y que invoca a la/s función/es. Usualmente es el ‘Programa Principal’.
Una función (subalgoritmo) es un conjunto de instrucciones que realizan una tarea en particular.
Módulo que Invoca Módulo Invocado
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
9
FUNCIONES
La modularización determina como mínimo dos módulos bien definidos de la solución: el Módulo que Invoca y el Módulo Invocado.
Una función (subalgoritmo) es un conjunto de instrucciones que realizan una tarea en particular.
Módulo que Invoca Módulo Invocado
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
F. de la Informática - Int.a la Computación - Int.a la Programación
10
FUNCIONES
La modularización determina como mínimo dos módulos bien definidos de la solución: el Módulo que Invoca y el Módulo Invocado.
Una función (subalgoritmo) es un conjunto de instrucciones que realizan una tarea en particular.
Módulo que Invoca Módulo Invocado
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
11
Ejemplo: Dado un número n entero posi0vo, se desea calcular e imprimir el factorial de n, n2 y de n3. Definir un módulo (función) para el cálculo del factorial. (Ejemplo visto en Lenguaje de Diseño)
FUNCIONES Lenguaje “C”
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
F. de la Informática - Int.a la Computación - Int.a la Programación
12
ALGORITMO “Calculo Factoriales” COMENZAR FACTORIAL FACTORIAL FACTORIAL FIN
SUBALGORITMO “Factorial” COMENZAR N, FACT, I: entero LEER N FACT 1 PARA I DESDE 1 HASTA N CON PASO 1 HACER
FACT FACT * I FINPARA ESCRIBIR FACT FIN
Programa Principal
Función
F U N C I O N E S
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
13
FUNCIONES
Factorial
invocación retorno
Programa Principal
Gráficamente
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
14
Solución General (en Leng. de Diseño)
Cuerpo del Programa Ppal. SUBALGORITMO “Factorial”
COMENZAR FACT, I: entero FACT 1 PARA I DESDE 1 HASTA N CON PASO 1 HACER
FACT FACT * I FINPARA ESCRIBIR FACT FIN
?
Queda por resolver
Cuerpo de la Función.
ALGORITMO “Calculo Factoriales” COMENZAR N, AUX: entero LEER AUX N AUX FACTORIAL N AUX^2 FACTORIAL N AUX^3 FACTORIAL FIN
N
N
N
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
F. de la Informática - Int.a la Computación - Int.a la Programación
15
#include <stdio.h> int main() { int n; int aux; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(); /* 1er Fact. */ n = aux * aux; Factorial(); /* 2do Fact. */ n = aux * aux * aux; Factorial(); /* 3er Fact. */ return(0); }
Solución General (en Leng. “C”)
El programa principal conserva el nombre main
Cuerpo del Programa Ppal.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
int Factorial(){ int i; int fact; fact = 1; for (i =1; i <= n; i=i+1 ){ fact = fact * i; } printf(“El factorial es: %d\n”, fact); return(0); }
F. de la Informática - Int.a la Computación - Int.a la Programación
16
Que valores toma ?
Cuerpo de la Función.
La función adquiere nombre propio.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
F. de la Informática - Int.a la Computación - Int.a la Programación
17
#include <stdio.h> int Factorial(){ int i; int fact; fact = 1; for (i =1; i <= n; i=i+1 ){ fact = fact * i; } printf(“El factorial es: %d\n”, fact); return(0);} int main() { int n; int aux; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(); /* 1er Fact. */ n = aux * aux; Factorial(); /* 2do Fact. */ n = aux * aux * aux; Factorial(); /* 3er Fact. */ return(0);}
F U N C I O N E S
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
#include <stdio.h>
int main() { int n; int aux; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(); /* 1er Fact. */ n = aux * aux; Factorial(); /* 2do Fact. */ n = aux * aux * aux; Factorial(); /* 3er Fact. */ return(0);
}
F. de la Informática - Int.a la Computación - Int.a la Programación
18
Ámbito de una variable / constante
El ámbito de una variable es el bloque de código en el cual una variable existe y puede ser utilizada para procesar.
Ámbito para n, aux
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
int Factorial(){ int i; int fact; fact = 1; for (i =1; i <= n; i=i+1 ){ fact = fact * i; } printf(“El fact. es: %d\n”, fact); return(0); } 19
Ámbito de una variable / constante FUNCIONES
?
Ámbito para i, fact
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
F. de la Informática - Int.a la Computación - Int.a la Programación
20
Problema:
La variable n NO EXISTE dentro del cuerpo de la función Factorial.
Toda variable definida dentro del cuerpo del Prog. Ppal. o de una función se denomina LOCAL al Prog. Ppal. o función.
Programa Ppal. (main) n, aux
‘n, aux’ son LOCALES al Prog. Ppal.
‘i, fact’ son LOCALES a Factorial.
Función (Factorial) i, fact
F U N C I O N E S
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
21
Solución 1 Mediante el uso de PARÁMETROS
Programa Ppal. (main) n, aux
Invocación n
Función (Factorial) i, fact
Retorno
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
#include <stdio.h> int main() { int n; int aux; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(n); /* 1er Fact. */ n = aux * aux; Factorial(n); /* 2do Fact. */ n = aux * aux * aux; Factorial(n); /* 3er Fact. */ return(0); }
22
Ejemplo
Parámetro Actual
F U N C I O N E S
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
int Factorial(int nu){ int i; int fact; fact = 1; for (i =1; i <= nu; i=i+1 ){ fact = fact * i; } printf(“El factorial es: %d\n”, fact); return(); } 23
FUNCIONES
Parámetro Formal
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
24
El Parámetro Actual y el Parámetro Formal son dos variables diferentes. La manera en que ‘C’ transfiere la información es mediante la COPIA del contenido del parámetro actual en el parámetro formal.
int main ()
n, aux
Invocación 20
Factorial (nu) nu, i, fact
Retorno
n =20; Factorial(n);
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
25
Memoria 20 1230
0x3000
n
... 0x4231 0x4232
...
Memoria
0x8650 nu
... 0x9100 0x9001
... 30
Se copia el valor 20
La variable ‘nu’ es local a la función Factorial. Cuando la ejecución de la función es finalizada, la variable ‘nu‘ desaparece y con ella su contenido.
Problema:
¿Cómo se debe trabajar si se desea que los cambios producidos en los valores en el cuerpo de la función se reflejen afuera?.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
26
Intento de Solución: Colocar la variable ‘fact’ como local a main(). Pasarla como parámetro.
Invocación 20, 0
Factorial (nu, fa) nu, i, fa
Retorno
int main () n, aux, fact
n =20; Factorial(n, fact);
fact =0;
Ejemplo: Se desea almacenar el resultado del cálculo del factorial para cada uno de los números entregados a la función.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
int main() { int n, fact; int aux, res1, res2, res3; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); fact = 0; n = aux; Factorial(n, fact); res1 = fact; n = aux * aux; Factorial(n, fact); res2 = fact; n = aux * aux * aux; Factorial(n, fact); res3 = fact; return(0); }
27
#include <stdio.h> int Factorial(int nu, int fa){ int i; fa = 1; for (i =1; i <= nu; i=i+1 ){ fa = fa * i; } printf(“El factorial es: %d\n”, fa); return(); }
Ejemplo:
Se desea almacenar el resultado del cálculo del factorial para cada uno de los números entregados a la función.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
28
Memoria 0 1230
0x3000
fact ...
0x4231 0x4232 ...
Memoria
0x8650 fa
... 0x9100 0x9001
... 30
Se copian los valores
0x2999
n
0x8649 nu
20
20 0
Factorial(n, fact);
int Factorial(int nu, int fa)
Problema: • Toda modificación hecha sobre la variable ‘fa’ se pierde cuando la ejecución de la función finaliza. El contenido de ‘fact’ no varía. • En el lenguaje C el valor contenido en los parámetros actuales o reales es copiado como contenido de los respectivos parámetros formales. Es decir realiza el pasaje por valor.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
29
Solución
Se define a la variable fuera del cuerpo del Prog. Ppal. y la función. En este caso se dice que la variable es GLOBAL y es común a ambos.
Programa Ppal. (main) n, aux, res1, res2, res3
Función (Factorial) nu
‘n, aux, res1, res2, res3’ son LOCALES al Prog. Ppal.
‘nu’ es LOCAL a Factorial.
fact ‘fact’ es GLOBAL al Prog. Total.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
30
#include <stdio.h> int fact; int main() { int n; int aux, res1, res2, res3; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(n); /* 1er Fact. */ res1 = fact; n = aux * aux; Factorial(n); /* 2do Fact. */ res2 = fact; n = aux * aux * aux; Factorial(n); /* 3er Fact. */ res3 = fact; return(0); }
int Factorial(int nu){ int i; fact = 1; for (i =1; i <= nu; i=i+1 ){ fact = fact * i; } printf(“El factorial es: %d\n”, fact); return(); }
fact : variable Global, común a ambas funciones.
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
31
Otra Solución
Devolución de un valor desde una función y a través de variables externas. La proposición return es el mecanismo por medio del cual desde una función invocada se puede enviar información hacia la función invocante.
#include <stdio.h> int main() { int mal1, mal2, min; int Control = 1; scanf (“%d”, &mal1); getchar(); scanf (“%d”, &mal2); getchar(); while (Control != 0) { min = imin(mal1, mal2); printf( “El menor entre %d y %d es %d \n”, mal1, mal2, min); Control = 0; if (min == mal1) {Control = 1; scanf (“%d”, &mal1); scanf (“%d”, &mal2); }} return 0; }
int imin( int n, int m) { int minimo; if (n < m) {
minimo = n; else
minimo = m; } return(minimo); }
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
• La palabra clave return hace que el valor de la siguiente expresión se transmita como valor de retorno de la función. • La sentencia return termina la ejecución de la función y devuelve el control a la sentencia siguiente a la sentencia de invocación.
int main() { int min; … min = imin (mal1, mal2); … } int imin( int n, int m) … int mini; … return(mini);
• El tipo del valor de retorno debe coincidir con el tipo de la función. • La declaración de tipo forma parte de la definición de la función. Tener presente que se refiere a su valor de retorno y no a sus parámetros.
• Las funciones que carecen de valor de retorno deben declararse de tipo void. 32
return <expresión>
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
33
#include <stdio.h> int fact; int main() { int n; int aux, res1, res2, res3; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(n); res1 = fact; n = aux * aux; Factorial(n); res2 = fact; n = aux * aux * aux; Factorial(n); res3 = fact; return(0); }
void Factorial(int nu){ int i; fact = 1; for (i =1; i <= nu; i=i+1 ){ fact = fact * i; } return(); }
F U N C I O N E S
Por ejemplo
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
Para la creación de una función, el formato general a seguir es el siguiente:
34
<especificador-de-tipo> <nombre-de-funcion> (lista-de-parametros) {
<variables locales a la función> <código de la función> return ( );
}
• El especificador-de-tipo indica el tipo de la función y puede ser de cualquier tipo válido. • Si no se especifica el tipo, entonces el procesador asume por defecto entero. • La sentencia return termina la ejecución de la función y devuelve el control a la sentencia siguiente en el módulo invocante
• La función puede devolver un valor mediante el uso de la sentencia return.
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
35
Ejemplo: a) Realizar un programa que, dado un arreglo de enteros con un cero como elemento, cuente cuantos elementos se encuentran antes del cero y los convierta a su respectivo valor opuesto. Para ello se debe utilizar una función.
#include <stdio.h> int contador; /* cuenta posiciones */ int main() { int a[10] = {4, 5, 8, 9, 8, 1, 0, 1, 9, 3}; int largo = 10; /* long. del arreglo */ Cuenta(a, largo); printf(“El nro. de elem. es: %d\n”, contador); return(0); }
Arreglos Como Parámetros
Nombre del arreglo
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
36
void Cuenta(int arr[], int lgt) { int pos; contador = 0; pos = 0; while ((arr[pos] != 0) && (pos < lgt)) {
contador = contador + 1; arr[pos] = arr[pos]* (-1); pos = pos + 1;
} return(); }
Arreglos Como Parámetros
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
37
lgt
Memoria
0 1230 0x3000
contador ...
0x4231 0x4232 ...
0x8650 ...
0x9100 0x9001 ...
Se copian los valores correspondientes
0x2999
largo
0x8649
20
20
0x9200 0x9201 0x9203 0x9204 0x9202 5 4 8 8 ... ... 9
a[0] a[1] a[2] a[3] a[4]
... 0x9806
Cuenta(a, largo);
void Cuenta(int arr[], int lgt)
?
El pasar arreglos como parámetros es equivalente a colocarlos como variables globales.
Copia de contenido FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015
38
Ejemplo #include <stdio.h> int a[10] = {4, 5, 8, 9, 8, 1, 0, 1, 9, 3}; int largo = 10; /* long. del arreglo */ int contador; /* cuenta posiciones */ int main() { Cuenta(); printf(“El nro. de elem. es: %d\n”, contador); return(0); }
int Cuenta() { int pos; contador = 0; pos = 0; while ((a[pos] != 0) && (pos < largo)) {
contador = contador + 1; a[pos] = a[pos]* (-1); pos = pos + 1;
} return(0); }
FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2015