Modularización en lenguaje C...
Transcript of Modularización en lenguaje C...
F. de la Informática- Int.a la Computación - Int.a la Programación 1
Modularización en lenguaje C
Funciones
Primer Cuatrimestre 2018
2
Ejercicio: Dado el siguiente algoritmo incompleto codificado en Lenguaje de Diseño, complételo y modifíquelo de manera tal que el nuevo algoritmo cumpla con todas las siguientes condiciones:
a) Defina el subalgoritmo Ingreso que permita ingresar datos en UN arreglo de enteros. El ingreso de los datos a los arreglos NUM1 y NUM2, deberá hacerse mediate las correspondientes invocaciones del subalgoritmo Ingreso.
b) Defina, además, el subalgoritmo Multiplos que permita determinar la cantidad de números que no sean múltiplos de un determinado número.
c) Utilice el subalgoritmo Multiplos para desarrollar las tareas 3 y 4 ALGORITMO "ALGO" COMENZAR NUM1: arreglo [1 a 30] entero NUM2: arreglo [1 a 20] entero
I: entero PARA I DESDE 1 HASTA 30 CON PASO 1 HACER
LEER NUM1[I] FINPARA PARA I DESDE 20 HASTA 1 CON PASO -1 HACER
LEER NUM2[I] FINPARA Determinar cantidad de números que no sean múltiplos de siete del arreglo NUM1
Determinar cantidad de números que no sean múltiplos de 4 del arreglo NUM2
FIN
1
2
3
4
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
Subalgoritmo “Ingreso” (inout NUM1: arreglo entero ,in inicio, final, FE: entero inout NUM2: arreglo entero ,in inicio2, final2, FE2: entero)
Comenzar I: entero Escribir: “ingrese datos enteros al primer arreglo ” Para I desde inicio hasta final con paso FE hacer Leer NUM1[I] Fin para Escribir: “ingrese datos enteros al segundo arreglo ” Para I desde inicio2 hasta final2 con paso FE2 hacer Leer NUM2[I] Fin para
Fin
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, NUM2, 20,1,-1) . . . Fin
Solución 1
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
4
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
Solución 2
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
5
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 - 2018
¿Cómoinvocarlo?
6
Subalgoritmo “Multiplo” (inout NUM1: arreglo de entero, in Li: entero, in Lo, in P, in Mul, out Cant)
Comenzar I: entero Cant <-0 Para I desde Li hasta Lo con paso P hacer
Si NUM1 [I]//Mul <>0 entonces Cant<-Cant +1 Finsi
Fin para Fin
Modularización
¿Es posible determinar con el subalgoritmo Multiplo la cantidad de valores que son múltiplos de 6?
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
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 - 2018
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 que invoca (puede ser el M. Principal o cualquier otro módulo) 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 - 2018
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 - 2018
10
Ejemplo:Dado un número n entero positivo, se desea calcular eimprimir el factorial den,n2y den3. Definir unmódulo(función)paraelcálculodelfactorial.(EjemplovistoenLenguajedeDiseño)
FUNCIONES Lenguaje “C”
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
F. de la Informática - Int.a la Computación - Int.a la Programación
11
ALGORITMO“CalculoFactoriales”COMENZARFACTORIALFACTORIALFACTORIALFIN
SUBALGORITMO“FACTORIAL”COMENZARN,FACT,I:enteroLEERNFACT 1PARAIDESDE1HASTANCONPASO1HACER
FACT FACT*IFINPARAESCRIBIRFACTFIN
Programa Principal
main
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 - 2018
12
FUNCIONES
Factorial
invocación retorno
Programa Principal
Gráficamente
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
13
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 - 2018
F. de la Informática - Int.a la Computación - Int.a la Programación
14
#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 - 2018
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
15
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 - 2018
F. de la Informática - Int.a la Computación - Int.a la Programación
16
F U N C I O N E S
#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. de la Informática - Int.a la Computación - Int.a la Programación - 2018
#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);
}
17
Á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 - 2018
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); } 18
Á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 - 2018
F. de la Informática - Int.a la Computación - Int.a la Programación
19
Problema:
LavariablenNOEXISTEdentrodelcuerpodelafunciónFactorial.
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 - 2018
20
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 - 2018
#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); }
21
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 - 2018
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(); } 22
FUNCIONES
Parámetro Formal
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
23
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 - 2018
24
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 - 2018
25
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 - 2018
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); }
26
#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 - 2018
27
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 - 2018
28
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 - 2018
29
#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:variableGlobal,comúnaambasfunciones.
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
30
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 - 2018
• 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. 31
return <expresión>
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
32
#include <stdio.h> int fact=1; int n; int main() { int aux, res1, res2, res3; printf(“Ingrese el número”); scanf(“%d”, &aux); getchar(); n = aux; Factorial(); res1 = fact; n = aux * aux; Factorial(n); res2 = fact; n = aux * aux * aux; Factorial(n); res3 = fact; return(0); }
void Factorial(){ int i; int n; int fact = 1; for (i =1; i <= n; 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 - 2018
Para la creación de una función, el formato general a seguir es el siguiente:
33
<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 - 2018
34
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 - 2018
35
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 - 2018
36
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)
?
Copia de contenido FUNCIONES
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
37
Memoria
Cuenta(a, largo);
void Cuenta(int arr[], int lgt)
Copia de contenido FUNCIONES
0x9200 0x9201 0x9203 0x9204 0x9202 5 4 8 8 ... 9
a[0] a[1] a[2] a[3] a[4]
... 0x8000 0x9200
a
0x9400 arr
0x9200 ...
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018
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 - 2018
39
Finalmente FUNCIONES
¿En qué consiste un programa en C
En principio: Un programa en C consiste de un conjunto defunciones(incluidalafunciónmain),ydeclaracionesdevariablescontenidos en un archivo. Cualquier función invoca a cualquierfunción.
F. de la Informática - Int.a la Computación - Int.a la Programación - 2018