SlideShare una empresa de Scribd logo
1 de 146
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 1
12/03/2022
Programación modular
Unidad 4
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo
para uso de los cursos de Algoritmos y Lógica de Programación
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 2
12/03/2022
Objetivo general de la Unidad 4
Implementar funciones propias del programador mediante
la aplicación de la técnica de la programación modular
para la resolución de problemas en el desarrollo de
software con calidad.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 3
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 4
12/03/2022
Diseño descendente (top-down)
• Permite abordar problemas complejos
• Consiste en descomponer el problema grande
en varios pequeños
– Módulos independientes
– Procedimientos, funciones y bloques de código
Modularidad
Función
F1
Función
F2
Procedimiento
P1
Programa
Principal
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 5
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 6
12/03/2022
Dividir y Conquistar (1)
• Debido a la complejidad de los grandes
problemas y las limitaciones de la mente
humana estos no se pueden atacar como
una unidad monolítica
– Aplicar dividir y conquistar
– Dividir en piezas que pueden ser “conquistadas”
por separado. Sino se hizo una división poco
inteligente
• Dividir en piezas con esta propiedad es una
tarea compleja para el diseño de software
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 7
12/03/2022
Dividir y Conquistar (2)
• Las piezas
– Están relacionadas. Juntas forman el sistema
– Entonces, existe comunicación y cooperación
entre las mismas
– Esto agrega complejidad, que surge de la
propia partición
– Cuando el costo de particionar sumado la
complejidad agregada supera los ahorros
logrados por particionar se debe detener el
proceso
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 8
12/03/2022
Modularización
• Módulo: un componente bien definido de un
sistema de software que provee recursos y
servicios
– Están bien definidos:
• Recursos y Servicios
• La forma de suministrarlos (Interfaces)
– Un módulo puede ser un programa o varios, una
subrutina o varias
• Principio de Separación de Intereses
– cada módulo se ocupa de aspectos específicos
(cohesión)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 9
12/03/2022
Modularizar
• Dividir sucesivamente, obteniendo niveles
– Se formará una jerarquía de módulos
– Los de mas bajo nivel
• Resuelven problemas más pequeños y
• Contienen mas detalle
• Hasta que los módulos de nivel inferior
– Sean sumamente simples
– Y solo contengan funciones y procedimientos
– Que resuelven problemas independientes y
pequeños
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 10
12/03/2022
Cuando modularizar
• Si un conjunto de sentencias realiza una tarea
– Recurrente, repetitiva, identificable
• Debe ser un módulo
• Sin embargo,
– Una tarea no necesita ser recurrente para hacerla un
módulo
Modularidad
Función
F1
Función
F2
Procedimiento
P1
Programa
Principal
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 11
12/03/2022
Cohesión
• Se focaliza en conocer el por qué los
elementos de un módulo están juntos en
ese módulo
• El objetivo es tener en un mismo módulo
elementos que están fuertemente
vinculados
– Entonces, módulos más fáciles de entender
– y más fáciles de modificar
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 12
12/03/2022
Descomposición
Deben hacerse módulos, pero con cuidado para permanecer en
la cercanía de M. Debe evitarse hacer pocos o muchos
módulos.
Región de
costo mínimo
M
Costo
del
esfuerzo
Costo de integración
Costo total del software
Costo por módulo
Número de módulos
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 13
12/03/2022
Funciones propias del lenguaje de programación
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
1 abs(i) int stdlib.h int abs(int i);
Devuelve el valor
absoluto de i
x = abs(-7) // x es 7
2 acos(d) double math.h double acos(double d);
Devuelve el arco
coseno de d
angulo = acos(0.5); // angulo
devuelto es phi/3
3 asin(d) double math.h double asin(double d);
Devuelve el arco
seno de d
angulo = asin(0.707); //
aproximadamente phi/4
4 atan(d) double math.h
double atan(double d);
long double tanl(long double
d);
Devuelve la arco
tangente de d.
Calcula el arco
tangente del
argumento x.
Requiere el
llamado de la
biblioteca
complex.h
angulo atan(1.0); // angulo es
phi/4
5 atan(d1, d2) double math.h
double atan(double d1, double
d2);
Devuelve el arco
tangente de d1/d2
angulo = atan(y, x)
6 atof(s) Double stdlib.h
double atof(const char
*cadena)
Convierte la
cadena s a una
cantidad de doble
precisión. Requiere
el llamdo de la
biblioteca math.h
double x;
char *cad_dbl = "200.85"; ...
x=atof(cad_dbl); // convierte
la cadena "200.85" a valor
real
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 14
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
7 atoi(s) int stdlib.h
int atoi(const char
*cadena)
Convierte la cadena s
a un entero.
La cadena debe tener
el siguiente formato:
[espacio en
blanco][signo][ddd]
(siendo obligatorio los
digitos decimales).
int i;
char *cad_ent="123";
...
i=atoi(cad_ent); //convierte
la cadena "123" al entero
123
8 atol(s) long stdlib.h
long atol(const char
*cadena);
Convierte la cadena s
a un entero largo.
La cadena debe tener
el siguiente formato:
[espacio en
blanco][signo][ddd]
(siendo obligatorio los
digitos decimales).
long int i;
char cad_ent="9876543";
...
i=atol(cad_ent); //convierte
la cadena "9876543" al
entero largo
9 calloc(n, s)
void(punt
ero)
malloc.h
y stdlib.h
o bien
alloc.h y
stdlib.h
void *calloc(size_t n,
size_t s);
Reserva memoria
para una formación de
n elementos , cada
uno de s bytes.
Devuelve un puntero
al principio del espacio
reservado.
Si no existente
bastante espacio para
el nuevo bloque o bien
n o s es 0, calloc
devuelve nulo.
long *buffer
buffer=(long *) calloc(40,
sizeof(long));
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 15
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
10 ceil(d) double math.h double ceil(double d);
Devuelve un
valor redondeado
por exceso al
siguiente entero
mayor
redondeo=ceil(5.1);
//redondeo es 6
11 cos(d) double math.h
double cos(double d);
complex cos(complex d);
Devuelve el
coseno de d
coseno_x=cos(1.6543)
12 cosh(d) double math.h
double cos(double d);
complex cos(complex d);
Devuelve el
coseno
hiperbólico de d
d=1.00;
printf("d=%f.nn,d);
13
difftime(11,
12)
double time.h
double difftime(time_t hora2,
time_t hora1)
Devuelve la
diferencia de
tiempo 11(hora2)
- 12(hora1) ,
donde 11 y 12
representan el
tiempo
transcurrido
despues de un
tiempo base (ver
función time)
time_t inicio, fin;
clrscrl();
inicio=time(NULL);
delay(5000)
fin=time(NULL)
print("Diferencia en
segundos: %fn",
difftime(inicio,fin));
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 16
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
14 exit(u) void stdlib.h void exit(int estado)
Cierra todos los
archivos y buffers y
termina el programa.
El valor de u es
asignado por la
funcion para indicar el
estado de
terminación.
exit(0);
15 exp(d) double math.h
double exp(double d);
complex exp(complex
d)
Eleve e a la potencia
d (e=2,7182818... es
la base del sistema
de logaritmos
naturales
(neperianos))
d=100.00;
y=exp(d);
printf("El exponencial de
x=%f.nn",y);
16 fabs(d) double math.h double fabs(double d);
Devuelve el valor
absoluto de d
y=fabs(-7.25); // y vale 7.25
17 fclose(f) int stdio.h int fclose(FILE *f);
Cierra el archivo f.
Devuelve el valor 0 si
el archivo se ha
cerrado con exito.
int fclose(FILE "archivo");
18 feof(f) int stdio.h int feof(FILE *f);
Determina si se ha
encontrado un fin de
archivo. si es asi,
devuelve un valor
distinto de cero, en
otro caso devuelve 0
feof(fichen);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 17
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
19 fgetc(f) int stdio.h int fgetc(FILE f);
Lee un caracter
del archivo f
c+fgetc(fp)
20 fegts(s, i, f)
char(pun
tero)
stdio.h
char *fgets(char s, int s,
FILE *f);
Lee una cadena
s, con i
caracteres, del
archivo f
fgets(caddemo, 80, fp);
22 fmod(d1, d2) double math.h
double fmod(double d1,
double d2);
Devuelve el resto
de d1/d2 (con el
mismo signo que
d1)
resto=fmod(5.0,2.0); // resto
igual a 1.0
23 fprintf(f, ...) int stdio.h
int fprintf(FILE *f, const char
*formato [,arg,...]);
Escribe datos en
el archivo f (el
resto de los
argumentos
fprintf(f1, "El resultado es
%fn",result);
24 fputc(c, f) int stdio.h int fputc(int c, FILE *f);
Escribe un
caracter en el
archivo f
fputc(*(p++), stdout);
25 fputs(s, f) int stdio.h
int fputs(const char *cad,
FILE *f)
Escribe una
cadena de
caracteres en el
archivo f
fputs("esto es una prueba",
f1);
26
fread(s, i1,
i2, f)
int stdio.h
size_t fread(void *b, size_t
t, size_t n, FILE *f);
Lee i2 elementos,
cada uno de
tamano i1 bytes,
desde el archivo f
hasta la cadena s
fread(buf, strlen(msg)+1, 1,
flujo);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 18
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
27 fopen(s1, s2)
file(p
unter
o)
stdio.h
FILE
*fopen(const
char *s1,
const char
*s2)
Abre un archivo llamado s1, del tipo s2. Devuelve
un puntero al archivo. *
if
((corriente2=f
open("datos","
W+"))==NULL
printf("El
archivo...no
se ha abierto
n");
Modo Acción
"r" Abre para lectura
"w"
Abre un archivo vacío para
escritura
"a"
Abre para escritura al final
del archivo
"r+" Abre para lectura/escritura
"w+"
Abre un archivo vacio para
lectura/escritura
"a+" Abre para lectura y anadir
"rb"
Abre un archivo binario
para lectura.
"wb"
Abre un archivo binario
para escritura
"ab"
Abre un archivo binario
para anadir
"rb+"
Abre un archivo binario
para lectura/escritura.
"wb+"
Abre un archivo binario
para lectura/escritura
"ab+"
Abre o crea un archivo
binario para
lectura/escritura
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 19
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
28 free(p) void
malloc.h
o stdlib.h
void free(void
*dir_memoria);
Libera un bloque de memoria
reservada cuyo principio esta
indicado por p.
char *cad;
// asignar memoria a la
cadena
cad=(char *)malloc(50);
...
free(cad); // liberar
memoria
29 fscanf(f, ...) int math.h
int fscanf(FILE *f,
const char *formato,
[, direccion,... ]);
Lee datos del archivo f ( el resto
de los argumentos
fscanf(flujo, %s%f, cad,
&f);
30 fseek(f, l, i) int stdio.h
int fseek(FILE *f, long
desplaza, int origen);
Mueve el puntero al archivo f una
distancia de 1 bytes desde la
posición i (i puede representar el
principio del archivo, la posición
actual del puntero o el fin del
archivo.
Notas
fseek(f1,OL,SEEK_SET);
// ir al principio
Origen Significado
SEEK_SET
Principio de
archivo
SEEK_CUR
Posicion
actual
puntero
SEEK_END
Final del
archivo
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 20
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
31 ftell(f) long int stdio.h
long int ftell(FILE
*f);
Devuelve la posicion
actual del puntero
dentro del archivo f
ftell(fichen)
32
fwrite(s, i1,
i2, f)
int stdio.h
size_t fwrite(const
void *p, size_t i1,
size_t i2, FILE *f);
Escribe i2 elementos,
cada uno de tamano 1
bytes, desde la cadena
s hasta el archivo f
num=fwrite(lista,sizeof(char),25,
flujo);
33 getc(f) int stdio.h int getc(FILE *f);
Lee un caracter del
archivo f
while(c=getc(fx) !=EOF {
print ("%c",c);
}
34 getchar( ) int stdio.h int getchar(void);
Lee un caracter desde
el dispostivo de entrada
estandar
int c;
while((*c=getchar()) != 'n')
print ("%c",c);
35 gets(s)
char(pun
tero)
stdio.h
char *gets(char
*cad);
Lee una cadena de
caracteres desde el
dispositivo de entrada
estandar
gets(nombre);
36 isalnum(c) int ctype.h int isalnum(int c);
Determina si el
argumento es
alfanumerico. Devuelve
un valor disitinto de
cero si es cierto; en
otro caso devuelve 0
carac=getch();
if (isalnum(carac))
print("%c letra|digito n",carac);
else
printf("%c no letra|digito n",
carac);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 21
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
37 isalpha(c) int ctype.h
int isalpha(int
c);
Determina si el argumento
es alfabetico. Devuelve un
valor distinto de cero si es
cierto; en otro caso
devuelve 0.
int c;
if (isalpha(c)) printf("%c es
letran",c);
38 isascii(c) int ctype.h
int isascii(int
c);
Determina si el argumento
es un caracter ASCII.
Devuelve un valor disitinto
de cero si es cierto; en otro
caso devuelve 0
int c;
if (isascii(c)) printf('%c es un
asciin",c)
39 iscntrl(c) int ctype.h
int isacntrl(int
c);
Determina si el argumento
es un caracter ASCII de
control. Devuelve un valor
distinto de cero si es cierto;
en otro caso devuelve 0
if(iscntrl(c)) printf"%c es un
caracter de controln",c);
40 isdigit(c) int ctype.h
int isdigit(int
c);
Determina si el numero es
un digito decimal. Devuelve
un valor disitinto de cero si
es cierto; en otro caso
devuelve 0
if(isdigit(c)) printf"%c es un
digiton",c);
41 isgraph(c) int ctype.h
int isgraph(int
c);
Determina si el argumento
es un caracter ASCII grafico
(hex 0x21 -0x7e; octal 041 -
176). Devuelve un valor
distinto de cero si es cierto;
en otro caso devuelve 0
if(isgraph(c)) printf"%c es un
caracter imprimible(no
espacio)n",c);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 22
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
42 islower(c) int ctype.h
int islower(int
c);
Determina si el argumento
es ua minuscula. Devuelve
un valor distinto de cero si
es cierto; en otro caso
devuelve 0
if(islower(c)) printf"%c es una
letra minusculan",c);
43 isodigit(c) int ctype.h
int isodigit(int
c);
Determina si el argumento
es un digito octal. Devuelve
un valor distinto de cero si
es cierto; en otro caso
devuelve 0
if(isodigit(c)) printf"%c es un
digito octaln",c);
44 isprint(c) int ctype.h
int isprintint
c);
Determina si el el
argumento es un caracter
ASCII imprimible (hex 0x20
-0x7e; octal 040 -176).
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isprint(c)) printf("n"c
imprimiblen",c);
45 ispunct(c) int ctype.h
int ispunct(int
c);
Determina si el argumento
es un caracter de
puntuacion. Devuelve un
valor distinto de cero si es
cierto; en otro caso
devuelve 0
if(ispunct(c)) printf"%c es un
caracter de puntuacionn",c);
46 isspace(c) int ctype.h
int isspace(int
c);
Determina si el argumento
es un espacio en blanco.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isspace(c)) printf"%c es un
espacion",c);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 23
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
47 isupper(c) int ctype.h
int isupper(int
c);
Determina si el argumento
es una mayuscula.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isupper(c)) printf"%c es una
mayusculan",c);
48 isxdigit(c) int ctype.h
int isxdigit(int
c);
Determina si el argumento
es un digito hexadecimal.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
ifisxdigit(c)) print"%c es un digito
hexadecimaln",c)
49 labs(l) long int math.h
long int
labs(long int
l);
Devuelve el calor absoluto
de 1
long lx=-51654,ly;
ly=labs(lx);
50 log(d) double math.h
double
log(double d);
Devuelve el logaritmo
natural de d
hdouble x,y;
x=10;
y=log(x);
51 log10(d) double math.h
double
log10(double
d);
Devuelve el logaritmno (en
base 10) de d
hdouble x,y;
x=10;
y=log10(x);
52 malloc(u)
void(pun
tero)
stdlib.h
void
*malloc(size_t
u);
Reserva u bytes de
memoria. devuelve un
puntero al principio del
espacio reservado
cadena=malloc(MAX_CHR);
53 pow(d1, d2) double math.h
double
pow(double
d1, double
d2);
Devuelve d1 elevado a la
potencia d2
double x=2.0, y=4.0, z;
z=pow(x,y); //z sera 1.60
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 24
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
54 printf(...) int stdio.h
int printf(const
char
*formato[,argu
mento,...]);
Escribe datos en dispositivo de
salida estándar.
print("producto %d y %d es
%dn",x,y,x*y);
55 putc(c, f) int stdio.h
int putc(int c,
FILE *f);
Escribe un caracter en el
archivo f
putc('*',demo);
56 putchar(c) int stdio.h
int putchar(int
c);
Escribe un caracter en el
dispositivo de salida estandar
putchar('B');
57 puts(s) int stdio.h
int puts(const
char *cad)
Escribe una cadena de
caracteres en el dispositivo de
salida estandar
puts("Desea continuar (s/n);
58 rand( ) int stdlib.h int rand(void);
Devuelve un entero positivo
aleatorio
// visualizar 10 numeros
aleatoriosfor (i=0;i<10;i++)
printf("%6d",rand());
Código Formato
%c Caracter
%d Entero Decimal
%e
Real (double o
float), notacion
cientifica.
%f Coma flotante
%s
Cadena de
caracteres
%x
Hexadecimal sin
signo
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 25
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
59 rewind(f) void stdio.h
void
rewind(FILE *f);
Mueve el puntero al principio del
archivo f
rewind(fx);
60 scanf(...) int stdio.h
int scanf(const
char *formato
{,direccion,...]);
Lee datos en dispositivo de
entrada estándar
scanf('%d %f %c %s, &i,
&fp, &c, s);
61 sin(d) double math.h
double
sin(double d);
Devuelve el seno de d
double x, y;
x=0.52;
printf('x =%f radianesn",x);
y=cos(x);
printf("el coseno de x
=%fn",y);
62 sinh(d) double math.h
double
sinh(double d);
Devuelve el seno hiperbolico de
d
y=sinh(x);
63 sqrt(d) double math.h
double
sqrt(double d);
Devuelve la raiz cuadrada de d
printf("%lf",sqrt(25.0); //se
visualiza 5
Codigo Formato
%c Caracter
%d Enetero Decimal
%x Hexadecimal
%i Entero Decimal
%f Numero Real
%o Octal
%p Puntero
%s Cadena
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 26
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
64 srand(u) void stdlib.h
void
srand(unsigne
d u);
Inicializa el generador de
numeros aleatorios
srand(semilla);
65
strcmp(s1,
s2)
int string.h
int
strcmp(const
char*s1, const
char *s2);
Compara dos cadenas de
caracteres
lexicograficamente.
Devuelve un valor negativo
si s1 < s2; 0 si s1 y s2 son
identicas; y un valor positivo
si s1 > s2
i=strcmp("MNP", "mnp"); //
resultado < 0
i=strcmp("abc", "abc"); //
resultado = 0
i=strcmp("xy", "abc"); //
resultado > 0char
s1[80]="Mayo";
char s2[80]="Octubre";
int j;
j=strcmp(s1,s2);
66
strcmpi(s1,
s2)
int string.h
int
strcmpi(const
char*s1, const
char *s2);
Compara dos cadenas de
caracteres
lexicograficamente, sin
diferenciar mayusculas de
minusculas. Devuelve un
valor negativo si s1 < s2; 0
si s1 y s2 son identicas; y
un valor positivo si s1 > s2
v=strcmpi(s1,s2);
67
strcpy(s1,
s2)
char string.h
char
*strcpy(char
s1, const char
s2);
Copia la cadena de
caracteres s2 en la cadena
s1
char *s1="Pepe Luis";
char b[12];
strcpy(s2,s1);
cout <<s2<< 'n';
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 27
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
68 strlen(s) int string.h
size_t
strlen(const
char *s);
Devuelve el numero de
caracteres de una cadena
longitud=strlen(nombre);
char s[81]="Cadena demo';
printf("La longitud de s es:
%dn" strlen(s));
69 strset(c, s)
char(pun
tero)
string.h
char
*strset(char
*cad, int c);
Pone todos los caracteres
de s a c (excluyendo el
caracter nulo del final 0)
char *cad="----";
strset (cad,'x'); // cad es ahora
xxxx
70 system(s) int string.h
system(comd)
;
Pasa la orden al sistema
operativo. Devuelve cero si
la orden se ejecuta
correctamente; en otro caso
devuelve un valor distinto
de cero, tipicamente -1.
system(dir);
71 tan(d) double math.h
double
tan(double d);
Devuelve la tangente de d y=tan(x);
72 tanh(d) double math.h
double
tanh(double
d);
Devuelve la tangente
hiperbolica de d
a=tanh(x);
73 time(p) long int time.h
time_t
time(time_t
*h);
Devuelve el numero de
segundos transcurridos
despues de un tiempo base
designado
time(&hora);
74 toascii int ctype.h
int toascii(int
c);
Convierte el valor del
argumento a ASCII
c=toascii(entero);
75 tolower int
ctype.h o
stdlib.h
int tolower(int
c);
Convierte una letra a
minuscula
c=tolower('s'); //c se convierte
en 's'
76 toupper int
ctype.h o
stdlib.h
int toupper(int
c);
Convierte una letra a
mayuscula
c=toupper('s'); //c se convierte
en 'S'
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 28
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 29
12/03/2022
Estructura de los programas que hemos
visto hasta el momento
• Se tiene un solo archivo
fuente.
• Todo lo que hace el
programa se implementa
dentro de la función main.
#include <archivo_cabecera>
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
instruccion_1;
instruccion_2;
. . .
instruccion_N;
return 0;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 30
12/03/2022
Problemas de esta metodologia
#include <stdio.h>
int a[3],b[3],c[3];
int main() {
int i;
printf(" Ingrese el primer vector: ");
for(i=0;i<3;i++) {
scanf("%d",&a[i]);
}
printf(" vec1 = [%d %d %d]nn",a[0],a[1],a[2]);
printf(" Ingrese el segundo vector: ");
for(i=0;i<3;i++) {
scanf("%d",&b[i]);
}
printf(" vec2 = [%d %d %d]nn",b[0],b[1],b[2]);
for(i=0;i<3;i++) {
c[i]=a[i]+b[i];
}
printf(" vec3 = vec1 + vec2 = [%d %d %d]nn",c[0],c[1],c[2]);
return 0;
}
Repetición de código
Código
chorizudo
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 31
12/03/2022
Problemas de esta metodologia
• Programación repetida.
• A medida que el problema se hace mas
complejo el main tiende a crecer mucho y
hacerse mas difícil de entender.
• Dificultad para programar.
• Poca reutilización de código
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 32
12/03/2022
Ejemplo
...
!
7
!
5
!
3
)
(
7
5
3
+
−
+
−
=
x
x
x
x
x
sen
Realizar un programa que calcule el valor de la función
seno usando la serie equivalente para ello. Los valores
de entrada son x y el numero de términos.
A continuación se muestra la serie equivalente:
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 33
12/03/2022
Solución sin hacer uso de funciones
...
!
7
!
5
!
3
)
(
7
5
3
+
−
+
−
=
x
x
x
x
x
sen
resul
term
Ciclo para generar el numero de
términos que tendrá la serie
Ciclo anidado para calcular el
factorial(que se usara en el
denominador) y la potencia (que
se usara en el numerador).
Parte que sumara o restara el
termino (term) al acumulador
(resul) usado para almacenar la
solución.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 34
12/03/2022
Solución al problema: funciones
#include <archivo_cabecera>
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
instruccion_1;
instruccion_2;
. . .
instruccion_N;
return 0;
}
#include <archivo_cabecera>
protipo_funciones;
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
funcion_1();
funcion_2();
. . .
funcion_N();
return 0;
}
funcion_1() {
codigo_funcion_1;
}
. . .
funcion_N() {
codigo_funcion_N;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 35
12/03/2022
Solución haciendo uso de funciones
Ciclo para generar el numero de
términos que tendrá la serie
Calculo del factorial y la potencia
usando funciones.
Parte que sumara o restara el
termino (term) al acumulador
(resul) usado para almacenar la
solución.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 36
12/03/2022
Solución haciendo uso de funciones
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 37
12/03/2022
Solución haciendo uso de funciones
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 38
12/03/2022
Solución haciendo uso de funciones
#include <stdio.h>
int a[3],b[3],c[3];
void ingresar_vector(int []);
void imprimir_vector(int []);
void sumar_vectores(int [],int [],int );
int main() {
int i;
printf(" Ingrese el primer vector: ");
ingresar_vector(a);
printf(“vec1 = ”);
imprimir_vector(a);
printf(“nn”);
. . .
return 0;
}
void ingresar_vector(int v[]) {
for(i=0;i<3;i++) {
scanf("%d",&v[i]);
}
}
void imprimir_vector(int v[]) {
printf(“[%d %d %d]”,v[0],v[1],v[2]);
}
void sumar_vectores(int v1[],int v2[],int res) {
for(i=0;i<3;i++) {
res[i]=v1[i]+v2[i];
}
}
Prototipos de las funciones
Función principal
Definición de las funciones
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 39
12/03/2022
Implementación de Programas
Utilizando Funciones
• Usualmente los problemas que se resuelven
con un computador son mas grandes y
complejos que los revisados aquí.
• En estos casos, se busca siempre dividir el
problema grande en subproblemas.
• Las funciones son grupos de sentencias bajo
un mismo nombre que nos ayudan en esta
técnica de divide y conquista.
• Son los subproblemas, cada función se
encarga de resolver un problema mas
pequeño.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 40
12/03/2022
Implementación de Programas
Utilizando Funciones
• Hemos utilizado funciones que ya han
sido escritas, e incluidas en librerías.
• Una de las funciones que más hemos
utilizado ha sido printf, de la librería stdio,
para mostrar información en pantalla.
• printf nos ayuda a resolver un problema,
tal como lo hace un programa
• De hecho, todos los programas principales
se escriben como una función: main()
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 41
12/03/2022
Implementación de Programas
Utilizando Funciones
• Las funciones y los programas se parecen
mucho, pero difieren:
– Los programas son usados por un usuario
externo
– Las funciones son utilizadas por un programador
– El usuario del programa “Hola Mundo” no conoce
que es la función printf
– El programador que usa printf no siempre
conocerá explícitamente como ésta hace para
mostrar información en pantalla.
– El programador que escribió printf conoce
exactamente su funcionamiento interno
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 42
12/03/2022
tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N)
{
intruccion_1;
. . .
instrucción_N;
return expresion;
}
Estructura de una función en C
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Cuerpo de la función
Cabecera de la función
Cuerpo de la
función
Tipo de dato retornado
por la función
Nombre de la función
Argumentos de la
función.
Variable retornada por la función
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 43
12/03/2022
Estructura de una función en C
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Tipo de dato retornado
por la función
Nombre de la función
Argumentos de la
función.
Variable retornada por la función
Puede ser cualquier tipo de dato ordinario (int, char, float,
double, etc), un puntero a cualquier tipo de dato, o un dato
tipo struct. Una funcion puede o no retornar un valor.
Puede empezar por una letra o el carácter _.
Después de este puede contener tantas letras
como números o _ se deseen. Si embargo el
compilador ignora a partir de cierta cantidad
Cada parámetro es separado por coma, los
tipos de datos manejados para cada
argumento pueden ser de cualquier tipo de
datos simples o compuestos.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 44
12/03/2022
Conceptos Importantes
• Función
– Grupo de sentencias bajo el mismo nombre
• Llamar a una función
– Ejecutar el grupo de sentencias de una
función. Para lograrlo solo se escribe el
nombre de la función, seguida por una lista
de expresiones, separadas por coma y
encerradas entre paréntesis. Ejemplo
• printf(“%d”, a);
• e = abs(x-y)/ abs(x);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 45
12/03/2022
Conceptos Importantes
• Argumentos
– Se refiere a la lista de expresiones encerradas entre
paréntesis. Permiten pasar la información a la función.
Ejemplo
• printf sabe que imprimir porque se lo indicamos en los
argumentos
– Existen funciones que no necesitan argumentos
• n = GetInteger();
• Retornar
– Una vez “llamada” la función, esta hace su trabajo, y
regresa al mismo punto donde fue llamada. La función ha
“retornado” al punto de llamada, y en la mayoría de los
casos, las funciones envían un valor de retorno.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 46
12/03/2022
Analogía
• Si una función resuelve un determinado problema, se
puede decir que necesita los datos de entrada
(argumentos) y genera una salida (valor que retorna).
• Es similar a cuando un jefe llama a un trabajador para
que efectúe una tarea. Le da las especificaciones
(argumentos) y espera.
• El trabajador a su vez, recibe esta información,
efectúa su trabajo, en la que puede ser que necesite
de la ayuda de otros trabajadores y los “llame”.
• Cuando termina el trabajo, regresa hacia donde su
jefe, y le muestra (retorna) un reporte.
• El jefe nunca supo como el trabajador efectuó su
trabajo o si uso ayuda.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 47
12/03/2022
Argumentos y Retorno: Aclaraciones
• Los datos otorgados a una función, como argumentos,
pudieron ser ingresados, por un usuario externo, mucho
antes de la llamada a la función.
• El resultado que retorna una función, la retorna al programa,
para que se pueda usar en este, cuando se desee. No es
impresa en pantalla, a menos que el programa así lo indique.
void main()
{
double x, y;
printf(“Ingrese un real:”);
x = GetReal();
y = sin(x);
printf(“El seno de x es: %.2f”, y);
}
E/S de datos permiten
a un programa
comunicarse con su
usuario externo
Argumentos y retorno
permiten a una función
comunicarse con el
programa que la llama
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 48
12/03/2022
#include <stdio.h>
int main ( )
{
printf (“Hello World!n”) ;
return 0 ;
}
Llamada a funciones
printf es el nombre de una función
predefinida en la librería stdio
esta cadena de caracteres la estamos
pasando como un argumento (parametro)
a la función printf.
Esto sería la llamada a la función
(function call).
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 49
12/03/2022
Librería MATH
• La librería math.h permite al programador efectuar cálculos matemáticos
comunes
Numero Descripcion Ejemplo
ceil(x) redondea x al entero mas pequeño no menor
que x
ceil(9.2) es 10.0
ceil(-9.8) es –9.0
floor(x) redondea x al entero mas grande no mayor que
x
floor(9.2) es 9.0
floor(-9.8) es –10.0
fabs(x) valor absoluto de x fabs(-9.5) es 9.5
fmod(x,y) residuo de x/y como numero de punto flotante fmod(13.657, 2.333) es
1.992
sqrt(x) raiz cuadrada de x sqrt(9.0) es 3.0
pow(x,y) x elevado a la potencia y pow(2,7) es 128
log(x) logaritmo natural de x(base e) log10(x)
log10(x) logaritmo de x(base 10) log(2.718282) es 1
exp(x) funcion exponencial exp(0.1) es 2.71828
sin(x) seno trigonometrico de x(en radianes) sin(0.0) es 0.0
cos(x) coseno trigonometrico de x(en radianes) cos(0.0) es 1
tan(x) tangente trigonometrico de x(en radianes) tan(0.0) es 0
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 50
12/03/2022
Ejercicio en Clase
• Expresar lo siguiente como una expresión en C
2
2
y
x
distancia +
=
Muestre el valor de x tras la ejecución de las
siguientes sentencias. Asuma x un real
x = fabs(7.5);
x = floor(7.5);
x = ceil(0.0);
x = ceil(-6.4);
x = ceil(-fabs(-8 + floor(-5.5)));



cos
sin
tan =
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 51
12/03/2022
Ejercicio
• Una aplicación de la función floor es redondear un valor a
su entero más próximo. La instrucción:
– y = floor(x+0.5);
redondeará el número x al entero más próximo, y asignará
el resultado a y. Escriba un programa que a 5 números los
redondee al número más próximo. Por cada número,
imprima tanto el original como la cifra redondeada.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 52
12/03/2022
Declaración de una función en C
float suma(float num1, float num2);
int max(int x,int y);
void imprimir_saludo(void);
void imprimir_vector(int v[],int long);
int comparar_vectores(int v1[],int v2[]);
• La declaración de una función se denomina prototipo. Básicamente, la
declaración describe la interfaz de la función. Al declarar una función,
básicamente lo que se esta haciendo es especificar la cabecera.
• La forma general de la declaración de una función es:
• Los nombres de los parámetros se suelen omitir.
float suma(float,float);
int max(int,int);
void imprimir_saludo(void);
void imprimir_vector(int [],int);
int comparar_vectores(int [],int []);
tipo_retorno nombre_funcion(tipo_1,. . ., tipo_N);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 53
12/03/2022
Declaración de Funciones
• En C declaramos las variables que vamos a usar
• Así mismo, cuando se escribe una nueva función, esta debe
ser “declarada”.
• Las declaraciones de las funciones de librerías que usamos,
están en su respectivo archivo de cabecera(.h)
• La declaración de una librería es un poco más elaborada que
la de una variable. En una variable solo se indica el tipo y el
identificador. En una función, se debe indicar:
– El nombre de la función
– El tipo de dato de cada argumento, y en muchos casos, un
identificador para cada uno. Aquí los argumentos van separados
con comas.
– El tipo de dato del valor que va a retornar.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 54
12/03/2022
Declaraciones en math.h
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 55
12/03/2022
Prototipos de Funciones
• La declaración de una función se conoce como el
prototipo de esa función. Ejemplo:
– double sqrt(double x);
• En un prototipo, es opcional especificar un
identificador para cada argumento.
• Son muy útiles, pues aquel que lo ve, ya puede
intentar usar la función, pues conoce sus argumentos
y el retorno.
• También pueden existir funciones que no tomen
argumentos, en estos casos, en el prototipo se incluye
la palabra void, y por supuesto, sin identificador:
– int GetInteger(void);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 56
12/03/2022
Definición de una función en C
• La definición de la función consiste de la cabecera de la función (declarador)
y un bloque de función. La cabecera de la función especifica el nombre de la
función, el tipo el valor de retorno, y los tipos y nombres de sus parámetros. Las
sentencias del bloque de la función específica lo que hace la función.
• Declarar una función dentro de otra es algo prohibido
• La forma general de la declaración de una función es:
tipo_retorno nombre_funcion(tipo_1 param_1,. . .,
tipo_N param_N) {
intruccion_1;
. . .
instrucción_N;
return expresion;
}
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 57
12/03/2022
Creando Funciones
• Ya sabemos usar funciones de librerías, pero llega un
punto en la vida de un programador que deseará
escribir sus propias funciones.
• Vamos a escribir una función:
– Se nos ha asignado escribir un programa que convierta
una temperatura en Celsius a Fahrenheit. Esto se logra
con la fórmula.
• Seria ideal escribir una función que se encargue de
eso, y luego poder usarla cuando deseemos.
32
5
9
+
= C
F
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 58
12/03/2022
Creando Funciones
• Para crear una nueva función se debe seguir los pasos:
– Especificar el prototipo de la función: Declararla. Esto
se hace normalmente luego de las líneas de #include,
antes del programa principal.
– Especificar los pasos de la función, como esta llevara a
cabo su tarea: Implementarla
• En nuestro caso, para declarar el prototipo debemos
pensar
– Que necesitamos que la función genere:
• La temperatura en Fahrenheit(real)
– Que necesita la función para generar esa información:
• La temperatura en Celsius(real)
double CelsiusAFahrenheit (double c);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 59
12/03/2022
Implementación
• Se puede decir que la implementación se
compone de dos partes:
– La cabecera, que luce igual que el prototipo, siempre
con identificadores para cada argumento, y sin el ; al
final
– El cuerpo, que es un bloque de sentencias, por lo
tanto encerrado entre llaves. Si se van a necesitar
variables, se declaran en el bloque.
double CelciusAFahrenheit(double c)
{
/*Cuerpo*/
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 60
12/03/2022
• Si la función debe generar un valor, esta lo retornará
usando la sentencia return dentro del cuerpo de la
función.
• La forma de usarla es:
return (expresión que se debe retornar);
• Esto especifica que la función debe terminar, retornando
el valor calculado.
• Hay funciones que no retornan datos, en este caso, se
puede usar return, pero sin mencionar una expresión.
return;
¿Cómo Retornar?
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 61
12/03/2022
Implementación y Uso
• La función ya esta implementada, lista para
ser usada (llamada) desde cualquier parte.
• Usemos esta función para escribir una tabla
de conversión de temperatura desde los 0°C
a los 100°C, de 5 en 5.
double CelsiusToFahrenheit(double c)
{
return (9.0 / 5.0 * c + 32);
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 62
12/03/2022
Uso de funciones en C
• Una función debe ser declarada antes de ser usada, por ello suele ser
común colocar las declaraciones antes de la función main.
#include <archivo_cabecera>
protipo_funciones;
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
funcion_1();
funcion_2();
. . .
funcion_N();
return 0;
}
funcion_1() {
codigo_funcion_1;
}
. . .
funcion_N() {
codigo_funcion_N;
}
#include <archivo_cabecera>
float suma(float,float);
int main() {
. . .
return 0;
}
float suma(float num1, float num2)
{
float res;
res = num1 + num2;
return res;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 63
12/03/2022
Invocación (llamada) de funciones en C
• Una vez que se han implementado las funciones el siguiente paso consiste en
usarlas (es decir invocarlas).
• Cuando se ejecuta un programa la primera función que se ejecuta es la función
main, por ello su importancia.
• Una función puede invocar otra función.
#include <stdio.h>
float suma(float,float);
int main() {
f1();
f2();
return 0;
}
f1(){
. . .
}
f2() {
f3()
. . .
}
main()
f1()
f2()
f3()
1
0
2
3
4
5
6
7
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 64
12/03/2022
Invocación (llamada) de funciones en C
#include <stdio.h>
float suma(float,float);
int main() {
int a = 3, b = 2, c = 0, d = 3;
int e, f, g, h, i, k;
d = suma(2,-4);
c = suma(a,b);
f = suma(2,c++);
g = suma(++c,d++);
h = suma(suma(1,a),d);
suma(2,3);
return 0;
}
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Una función se puede invocar
las veces que se desee.
Cuando se invoca un función
que retorna un valor se es
libre de llevar el valor
retornado a una variable.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 65
12/03/2022
#include <stdio.h>
#define LIMITEINF 0
#define LIMITESUP 100
#define PASO 5
// Prototipos de Funciones
double CelsiusAFahrenheit(double c);
/* Programa Principal */
void main()
{
int c;
printf(“Tabla de conversion de Celsius a Fahrenheit.n”);
printf(“C Fn”);
for(c = LIMITEINF; c <= LIMITESUP; c = c + PASO)
printf(“%3d %3gn”,c, CelsiusAFahrenheit(c));
}
/*
* Funcion CelsiusAFahrenheit
* Uso: f=CelsiusAFahrenheit(c);
* Esta función retorna el equivalente en Fahrenheit del valor c
en Celsius
*/
double CelsiusAFahrenheit(double c)
{
return (9.0 / 5.0 * c + 32);
}
Uso de una Función
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 66
12/03/2022
Funciones más Complejas
• Nuestra nueva función resuelve un problema
sencillo.
• Las funciones usualmente son mas
complejas, y en su código incluyen las
sentencias de control.
• Además, las funciones no sólo retornan
valores enteros, también pueden retornar
cadenas o valores lógicos.
• EJERCICIO
– Escribir una función MinR en C que indique el
menor valor entre dos valores reales.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 67
12/03/2022
Ejercicio en Clase
• Escribir la función Factorial en C que permita calcular el
factorial de un numero dado.
– El factorial de 0 es 1
– El factorial de 1 es 1(1x1)
– El factorial de 2 es 2(1x2)
– El factorial de 3 es 6(1x2x3)
– El factorial de 4 es 24(1x2x3x4)
– El factorial de un número dado es la multiplicación de todos los
números desde el 1 hasta el mismo.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 68
12/03/2022
Solución
int Factorial(int n)
{
int fact, i;
fact = 1;
if (n==0)
return 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
Inicio
Fin
Recibir n
i >=n
fact = fact * i;
Retornar fact
i = i +1;
Fact = 1;
i = 1;
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 69
12/03/2022
Retornando Cadenas
• Escribir una función en
C que dado un mes (6,
7, 12 ..) retorne su
respectivo nombre
(Junio, Julio,
Diciembre..)
– Debe generar la cadena
del nombre del mes
– Debe recibir el número
del mes, un entero.
• El prototipo sería:
string NombreDeMes(int mes);
string NombreDeMes(int mes)
{
switch(mes)
{
case 1:
return(“Enero”);
break;
case 2:
return(“Febrero”);
break;
case 3:
return(“Marzo”);
break;
case 4:
return(“Abril”);
break;
case 5:
return(“Mayo”);
break;
case 6:
return(“Junio”);
break;
case 7:
return(“Julio”);
break;
case 8:
return(“Agosto”);
break;
case 9:
return(“Septiembre”);
break;
case 10:
return(“Octubre”);
break;
case 11:
return(“Noviembre”);
break;
case 12:
return(“Diciembre”);
break;
default:
return(“Mes no v%clido”,160);
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 70
12/03/2022
Utilizando la nueva función
#include <stdio.h>
#include <simpio.h>
// Declaración de Funciones
string NombreMes(int mes);
void main()
{
int mes,dia,anio;
printf(“Ingrese el dia actual:”);
dia = GetInteger();
printf(“Ingrese el mes actual:”);
mes = GetInteger();
printf(“Ingrese el anio actual:”);
anio = GetInteger();
printf(“La fecha ingresada es: %s %d de %d”, NombreMes(mes), dia, anio);
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 71
12/03/2022
Retornando Bool
• Si las funciones pueden retornar enteros, y
cadenas, porque no van a poder retornar
valores lógicos (bool).
• Las funciones que retornan valores lógicos
se conocen como funciones de predicado.
• Llamar a una función de predicado es
equivalente a hacer una pregunta donde la
respuesta puede ser Verdadera (TRUE) o
Falsa (FALSE).
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 72
12/03/2022
Ejercicios en Clase
• Escribir una función en C que permita
determinar si un número es par.
• Escribir una función en C que permita
determinar si un año es bisiesto.
• Escribir un programa imprima los números
pares hasta el 10.
• Escribir un programa que imprima los
años bisiestos desde 1960 hasta el año
actual.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 73
12/03/2022
Solución
bool EsPar(int n)
{
return (n%2==0);
}
bool EsBisiesto(int anio)
{
return (((anio%4==0)&&(anio % 100!=0) ) || ((anio%400)==0));
}
main()
{
int i;
for(i = 1; i <=10; i++)
{
if(EsPar(i)) printf(“%dn”,i);
}
}
main()
{
int i;
for(i = 1960; i <=2004; i++)
{
if(EsBisiesto(i)) printf(“%dn”, i);
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 74
12/03/2022
Comparando Cadenas
• Ahora que ya sabemos más de las funciones,
estamos listos para conocer algo más de las cadenas.
• Los operadores relacionales, sólo pueden aplicarse
sobre tipos de datos atómicos, y eso dejaba de lado a
las cadenas.
• La única forma, por ejemplo, de determinar la
equivalencia de dos cadenas, seria a través de una
función.
• StringEqual es la función de la librería genlib, que
permite este tipo de comparaciones.
– Compara dos cadenas, que debe recibir como argumentos
– Decide si son o no iguales (VERDADERO O FALSO)
– Es una función predicado
bool StringEqual(string s1, string s2);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 75
12/03/2022
Ejercicio en Clase
• Escriba un programa que sume un grupo
de números enteros ingresados por
teclado. El programa deber permitir el
ingreso del número, y luego preguntarle al
usuario si desea seguir ingresando. Si la
respuesta es no, el programa debe
terminar.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 76
12/03/2022
Solución
void main()
{
int suma, n;
string respuesta;
suma = 0;
while(TRUE)
{
printf(“?”);
n = GetInteger();
suma = suma + n;
printf(“Desea seguir ingresando:”);
respuesta = GetLine();
if(StringEqual(respuesta,”no”))
break;
}
printf(“La suma es:%d”,suma);
}
inicio
Escribi
r(“?”)
Suma = 0
Leer(n)
;
suma =
suma + n
Escribir(“De-
sea seguir?”)
Respuesta
== “no”
Escribi
r(sum
a)
fin
Leer(res
-puesta)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 77
12/03/2022
• Hay una mayor complejidad de la mostrada, en el uso de funciones
• Tomemos como ejemplo el siguiente programa:
#include <stdio.h>
#include <simpio.h>
//Declaración de funciones
int Factorial(int n);
void main()
{
int i;
for (i = 0; i < 10; i ++)
printf(“%dn”, Factorial(i));
}
int Factorial (int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
Si vemos sólo la
función, tiene sentido,
pues se encarga de
calcular el factorial de
la variable n
Si vemos sólo el programa
principal, tiene sentido, pues
se imprime el factorial de
todos los números hasta el 10
Si vemos el
programa principal y
la función como un
todo, puede resultar
un tanto confuso:
• Hay dos
variables con
nombre i
• En el programa se
usa la variable i
como el número al
que se le calcula el
factorial.
• En la función la
variable a la que
se le calcula el
factorial se llama n
La Verdad detrás de las Funciones
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 78
12/03/2022
Paso de Argumentos a Funciones
#include <stdio.h>
#include <simpio.h>
//Declaración de funciones
int Factorial (int n);
void main()
{
int i;
for (i = 0; i < 10; i ++)
printf(“%dn”, Factorial(i));
}
int Factorial (int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
En el programa principal, se calcula el
factorial de i.
En la función se calcula el factorial de n
¿Cómo es que hay diferentes
identificadores para el mismo valor?
La respuesta esta muy relacionada con el
concepto de argumento:
- En el programa principal, i representa el
argumento enviado a la función Factorial.
- En la función Factorial, alguna variable
debe recibir el enviado, para representar
dicho valor. Esta variable puede tener
cualquier nombre, en este caso se le dio
el nombre n.
- Una variable definida en la cabecera de
una función, que sirve para recibir el valor
de un argumento, se conoce como
parámetro.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 79
12/03/2022
#include <stdio.h>
#include <genlib.h>
int Factorial(int n);
main()
{
int i;
for (i = 0; i < 10; i ++)
{
printf(“%dn”, Factorial(i));
}
}
int Factorial(int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
{
fact = fact * i;
}
return (fact);
}
Factorial(0)
n
0
n
1
n
2
Factorial(1)
Factorial(2)
expr
1
expr
1
expr
2
Factorial(3)
n
3
expr
6
1
1
2
6
Pasos para llamar a una Función
• Se evalúan las
expresiones enviadas
como argumentos.
• El valor de cada
argumento es copiado en
orden en cada parámetro
correspondiente de la
función llamada.
• Se ejecutan una a una las
sentencias del cuerpo de
la función hasta que
aparece la sentencia
return.
• Se evalúa la expresión de
la sentencia return.
• El programa que llamó a
la función continúa,
reemplazando en el lugar
de la llamada, el valor
retornado
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 80
12/03/2022
Manejo de Variables Dentro de las
Funciones (Variables Locales)
• En la función Factorial se usa una variable i, y en el programa
principal se usa otra variable i, pero no parece que se usaran para
lo mismo, ¿son diferentes?.
• De hecho, si son diferentes.
– Cada función puede usar sus propias variables, y estas sólo serán
válidas dentro de la función, se conocen como variables locales.
main
i
0
Al llamar a la función Factorial, se crean 3
variables locales a Factorial, pueden tener
cualquier nombre, en este caso: n, fact e i.
Las variables locales del main aun existen,
pero, no se pueden ver mientras Factorial
este activa.
Cuando todo Factorial termina, retorna el
valor, y las variables locales al main
permanecen iguales como antes de la
llamada.
La variable i es local
a la funcion main
Factorial
n fact i
0 1 1
main
i
0
La variable i es local
a la funcion main
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 81
12/03/2022
Ejercicio en Clase
• Suponga que tienen un grupo de 5 monedas americanas:
penny(1 centavo), nickel(5 centavos), dime(10 centavos),
quarter(25 centavos). Se desea conocer de cuantas formas
diferentes, estas se pueden combinar, para formar un par. Se
pueden tomar penny y nickel, o penny y dime, etc
• En este ejemplo n es 5 y k es 2. La solución de cuántas
combinaciones se puede expresar usando:
• Escriba una función en C que permita calcular cuántas
combinaciones de k miembros se pueden generar teniendo n
objetos.
)!
(
!
!
)
,
(
k
n
k
n
k
n
C
−

=
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 82
12/03/2022
Llamando Funciones desde otras
Funciones
• Hasta ahora solo hemos hecho llamadas a funciones desde el
programa principal
• Pero las funciones se pueden llamar desde cualquier parte del
programa, incluso desde otras funciones.
• En este ejemplo, la función necesita recibir el número de objetos (n)
y el número de miembros (k) de cada combinación, para poder
retornar el número de combinaciones posibles. El prototipo:
int Combinaciones (int n, int k)
{
return(Factorial(n)/(Factorial(k)*Factorial(n-k));
}
int Combinaciones (int n, int k);
La implementación se podría lograr, usando la función Factorial que
ya fue implementada:
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 83
12/03/2022
Un Programa Completo
• A continuación la implementación
completa de un programa que hace uso
de la función Combinaciones:
• Nota:
– A este programa le faltan las validaciones de
las respectivas entradas.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 84
12/03/2022
#include <stdio.h>
#include <genlib.h>
#include <simpio.h>
/* Prototipos de Funciones */
int Combinaciones(int n, int k);
int Factorial(int n);
/* Programa Principal */
void main()
{
int n, k;
printf(“Ingrese el numero de objetos(n) ?”);
n = GetInteger();
printf(“Ingrese el numero de miembros de la combinacion(k) ?”);
k = GetInteger();
printf(“C(%d,%d) = %dn”,n,k,Combinaciones(n,k));
}
/*
* Funcion Combinaciones
* Uso: c = Combianciones(n,k);
* Calcula el numero de combinaciones distintas, para elegir k objetos de un grupo de n
*/
int Combinaciones(int n, int k)
{
return(Factorial(n)/(Factorial(k)*Factorial(n-k));
}
/*
* Funcion Factorial
* Uso: f = Factorial(n);
* Retorna el factorial del argumento n
*/
int Factorial(int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
{
fact = fact * i;
}
return (fact);
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 85
12/03/2022
Procedimientos
• Hemos visto que existen funciones que no retornan ningún
valor, como printf:
– printf (“Hola Mundon”);
• A este tipo de funciones que no retornan nada, y que se
llaman únicamente para que ejecuten su código, se les llama
procedimientos.
• Muchos lenguajes de programación separan totalmente el
concepto de funciones, con el de procedimientos, pero C las
trata de igual forma.
• Un procedimiento en C, es una función sin valor de retorno.
– void DarInstrucciones(void);
• Los procedimientos pueden recibir tantos argumentos
necesite.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 86
12/03/2022
void ImprimirMenu (void)
{
printf (“1. Tabla de Sumarn”);
printf (“2. Tabla de Restarn”);
printf (“3. Tabla de Multiplicarn”);
printf (“4. Tabla de Dividirn”);
printf (“5. Salirn”);
}
Implementación de Procedimientos
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 87
12/03/2022
Refinamiento
• Cuando un problema es muy grande, se busca separarlo,
para resolver todo por partes. Esto es ventajoso
– Las partes más pequeñas son mas fáciles de entender
– Si algo falla, el error es mas fácil de encontrar
• Esto se conoce como descomposición de un problema
• Al escribir un programa, usualmente se piensa en el
programa principal (main),y se piensa en las tareas más
importantes
• Se piensa en dividir el programa en componentes
individuales, los cuales pueden ser a su vez, divididos en
piezas más pequeñas.
• Esto se conoce como diseño top-down, o refinamiento
paso a paso.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 88
12/03/2022
• Se requiere escribir un programa que muestre el calendario completo
de un año dado, que no puede ser menor a 1900.
Dar Instrucciones
Ingreso y
Validacion de Año
Imprimir Mes
Mostrar Nombre del
Mes
Determinar que dia
de la semana fue el
primer dia del mes
Dar el respectivo
marqen para el
primer dia del mes
Un Problema más Grande
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 89
12/03/2022
Calendario
Dar Instrucciones Pedir Año Imprimir Calendario
Imprimir Nombre
del Mes
Determinar
cuantos días trae
el mes
Determinar el dia
de la semana
donde cayo el
primer dia
Imprimir el Margen
para el primer dia
del mes
Imprimir Calendario de c/ Mes
Imprimir el
resto de
días
Dependiendo del
mes y de si es
bisiesto, elegir total
de días
Calcular el dia de la
semana del primer dia
del año, contando el
total de días desde
1900 hasta el año
actual, considerando los
años bisiestos
Calcular el dia de la
semana del primer dia del
mes, sumándole al primer
dia del año, el total de días
hasta el mes actual,
considerando el total de
días de cada mes
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 90
12/03/2022
Conclusiones del Refinamiento
• Del refinamiento podemos sacar las funciones que necesitaremos:
– Dar instrucciones:
• void DarInstrucciones(void)
– Pedir año(y validarlo):
• int PedirAnio(void);
– Imprimir todo el Calendario de un año
– void ImprimirCalendario(int anio);
• Imprimir el Calendario de un mes, de un año dado
– void ImprimirCalendario(int mes, int anio);
• Conseguir el nombre de un numero de mes dado
– string NombreDeMes(int mes);
• Determinar el numero de la semana donde cayo el primer día
– int PrimerDiaDelMes(int mes, int anio);
• Imprimir margen para primer día
– void ImprimirMargen(int dia_semana);
– FUNCIONES QUE AYUDAN
• Determinar si un año es bisiesto
– bool EsBisiesto(int anio);
• Determinar el numero de días de un mes, de un año dado
– int DiasDeMes(int mes, int anio);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 91
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 92
12/03/2022
Recursión
• La estrategia a seguir es la delegación de
tareas.
• Es decir que un problema grande se
subdivide en pequeñas tareas, y éstas se
delegan.
• Implica llamar al mismo procedimiento
varias veces.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 93
12/03/2022
La Función Factorial
• Esta función fue implementada
anteriormente con un lazo for.
• La propiedad primordial del factorial es
que está relacionada a su anterior valor
n!=n*(n-1)!
• La función factorial se define como:
n! = 1 si n=0
n*(n-1)! En otro caso
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 94
12/03/2022
La Función Factorial
• Dicha definición es recursiva, porque n! está
en términos de (n-1)!, lo cual tiene la misma
forma del original.
• La implementación de la función en C
usando recursión sería:
int Factorial(int n)
{
if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 95
12/03/2022
Manejo Interno de la Recursión
• En el proceso de encontrar la respuesta,
el computador va hacia los procesos
internos, que son las llamadas al mismo
procedimiento una y otra vez.
• Supongamos que se quiere evaluar
fact= Factorial(4);
• En el programa principal se hace la
primera llamada a la función.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 96
12/03/2022
Primera llamada
main
Factorial
4
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
La función llama a Factorial(n-1), y tan pronto
ésta regrese, se ejecuta la operación indicada
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 97
12/03/2022
Segunda llamada
main
Factorial
3
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
Factorial
Igualmente al anterior caso, aquí se hace otro
llamado interno a la función, y la operación no se
realiza hasta que se retorne dicho valor
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 98
12/03/2022
Tercera llamada
main
Factorial
2
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
Factorial
Siguiendo la lógica, se llama a Factorial(1), y éste a su vez
llama a Factorial(0), realizándose dos llamadas más a la
función
Factorial
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 99
12/03/2022
Última llamada
Factorial
0
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
Factorial
Factorial
main
Factorial
Factorial
En este punto, la situación
varía, como n es 0, la función
retorna su resultado
inmediatamente
return(1);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 100
12/03/2022
Retorno
Factorial
1
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
Factorial
Factorial
Factorial
main
1
Desde este punto, se devuelve el retorno a cada
llamada recursiva
return(1*1);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 101
12/03/2022
Retorno
main
Factorial
2
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
1
Factorial
Factorial
return(2*1);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 102
12/03/2022
Retorno
Factorial
3
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
2
Factorial
main
return(3*2);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 103
12/03/2022
Retorno
main
Factorial
4
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
6
return(4*6);
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 104
12/03/2022
El Paradigma Recursivo
• Toda función recursiva tiene la siguiente
estructura:
if(Prueba para el caso simple){
return(solución simple sin usar recursión);
} else{
return(solución recursiva llamando a la misma función);
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 105
12/03/2022
Otro Ejemplo de Recursión
• Otro ejemplo recursivo es el de elevar un
número entero a una potencia k.
• Su definición es:
nk= 1 si K=0
nxnk-1 en otro caso
La solución recursiva de este problema es
como sigue...
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 106
12/03/2022
Otro Ejemplo de Recursión
static int ElevarEnteroPotencia(int n, int k)
{
if(k==0){
return(1);
} else{
return(n* ElevarEnteroPotencia(n, k-1))
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 107
12/03/2022
Consideraciones
• Los problemas vistos, de factorial y número
elevado a una potencia, tienen soluciones
recursivas naturales, porque:
• Se puede identificar el caso más simple.
• Se puede aplicar recursividad para
descomponer el problema en más simples del
mismo tipo.
• Existen otros problemas en los que la recursión
es un poco más difícil de ver, para tales caso
permutaciones son usadas.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 108
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 109
12/03/2022
Paso de Parámetros
• Hasta ahora vimos y hemos usado una forma sencilla de pasar parámetros a las
funciones
• Cada parámetro de una función espera y recibe una copia del valor de cada
argumento enviado.
• Ejemplo: Cree una función que reciba dos
valores y los intercambie.
• Podríamos decir que el prototipo seria:
– void Intercambiar(int a, int b);
• Al retornar la función no efectuaría el
cambio, como lo deseamos. Recordemos
que, al pasar parámetros, se efectúa una
copia de los valores. Este tipo de paso de
parámetros se conoce como PASO DE
PARAMETROS POR VALOR
x
main
y
3 4
Intercambiar
a b tmp
3 4
3 3
4
x
main
y
3 4
main()
{
int x, y;
printf(“Ingrese x:”);
x = GetInteger();
printf(“Ingrese y:”);
y = GetInteger();
printf(“x = %d, y= %d”, x, y);
Intercambiar(x,y);
printf(“x = %d, y= %d”, x, y);
}
void Intercambiar(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 110
12/03/2022
Otra Forma de pasar Parámetros
• El intercambio en la función anterior no se realiza porque jamás se
trabajó con los argumentos.
• En el paso de parámetros por valor, la función trabaja con una copia
de los argumentos.
• Si deseamos que una función manipule sus parámetros, y esto se
refleje en los argumentos, se usa PASO DE PARÁMETROS POR
REFERENCIA. En este caso:
– La función no trabaja con copias
– Trabaja directamente con los argumentos
– La función no recibe valores, sino que recibe direcciones de memoria…
es decir: punteros
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 111
12/03/2022
El Intercambio
x
main
y
• Para este tipo de problemas, en los cuales necesitamos modificar directamente
los datos que se reciben como parámetros, se usa la PASO DE
PARÁMETROS POR REFERENCIA
• Si la función no va a recibir valores, si no direcciones, el prototipo seria:
void Intercambiar(int *a, int *b);
3 4
• Los parámetros a y b son ahora
punteros, que representan a los
argumentos directamente
• Cualquier cambio que se haga sobre
a y b se esta haciendo realmente a
las variables a las que estos apuntan
Intercambiar
*a *b tmp
4 3
3 4
3 3
4
x
3 4
3
main
y
4 3
main()
{
int x, y;
printf(“Ingrese x:”);
scanf(“%d”,x);
printf(“Ingrese y:”);
scanf(“%d”,y);
printf(“x = %d, y= %d”, x, y);
Intercambiar(&x,&y);
printf(“x = %d, y= %d”, x, y);
}
void Intercambiar(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
En este caso:
a apunta a x,
b apunta a y
a = &x, b = &y
No se envían
valores, se
envían
direcciones
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 112
12/03/2022
Un Uso Mas Interesante
• El paso de parámetros por referencia es útil:
– Cuando deseamos intercambiar valores
– Cuando deseamos que una función retorne mas de un valor
• Como todos sabemos las funciones solo pueden retornar un valor
• Si necesitamos que una función retorne mas de un valor, aquellos
valores que necesitamos retornar, deben ser parámetros por
referencia.
• EJERCICIO EN CLASE
– Crear una función que calcule el menor, el mayor y el promedio de un
arreglo
• Esta función debe retornar 3 valores, usemos parámetros por
referencia
• Si la función retorna mas de 1 valor, podemos declararla como
void…convirtiéndose en un procedimiento.
• void CalcularValores(int arreglo[], int n, int *mayor, int *menor,
int *promedio);
Los datos que
vamos a
retornar, se
declaran como
parámetros
por referencia
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 113
12/03/2022
Solución
• Los cálculos hechos se almacenaran en los parámetros
por referencia:
void CalcValores(int arr[], int n, int *menor, int *mayor, float *promedio){
int i, total;
*menor = arr[0];
*mayor = arr[0];
total = 0;
for(i = 0; i < n; i++){
if(arr[i] < *menor) *menor = arr[i];
if(arr[i] > *mayor) *mayor = arr[i];
total = total + arr[i];
}
*promedio = total/ n;
}
La función no tiene
explícitamente una
sentencia return.
Se trabaja
directamente con los
parámetros recibidos.
Estos son direcciones,
para trabajar con ellas,
usamos el operador *
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 114
12/03/2022
Advertencia
• El paso de parámetros por referencia no debe
reemplazar al paso de parámetros por valor.
• Solo se usan parámetros por referencia cuando
sea imperiosamente necesario.
• Las funciones, aquellas que retornan valores son:
– Fáciles de entender y seguir por cualquier
programador.
– El valor que retornan se puede asignar a una
variable.
– No así con los procedimientos.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 115
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 116
12/03/2022
Diseño De Una Interfase
• Las funciones y los procedimientos nos
ayudan a reducir la complejidad de los
programas.
• Una interfase le da a un programador
cliente, acceso a un grupo de funciones.
• Para añadir una función a una interfase,
debemos hacerlo con un cierto criterio.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 117
12/03/2022
Criterios Para Diseñar una Interfase
• Una interfase bien diseñada, debe cumplir
los siguientes requisitos:
– Unificación
– Simplicidad
– Suficiencia
– Generalidad
– Estabilidad
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 118
12/03/2022
Unificación
• Las funciones (herramientas) dentro de una
librería, deben ser escogidas, de acuerdo a un
cierto tema.
• La unificación también se refiere al enfoque que
se le da a un problema dentro de la misma
librería.
• Por ejemplo:
– Todas las funciones de la librería grafica consideran
que las coordenadas están especificadas en píxeles,
y que la coord. 0,0 esta ubicada en la esquina
superior izq. de un objeto.
– Una función que trabaje con coordenadas en
pulgadas, no conservaría la unificación.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 119
12/03/2022
Simplicidad
• Al diseñar una interfase, el objetivo principal es reducir la
complejidad, a través del uso de ciertas funciones.
• Se trata de proteger al cliente de los detalles complicados.
• La complejidad de la implementación se queda en el lado del
creador de la librería.
• Se “esconde” información del cliente, no se mencionan
detalles en la interfase, ni siquiera a través de comentarios.
• Las funciones también deben ser diseñadas lo más simples
posibles:
– Reduciendo el número de parámetros al mínimo.
– Limitando el total de funciones de la interfase, para no abrumar
al cliente y confundirlo.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 120
12/03/2022
Suficiencia
• Que exista simplicidad, no implica que se debe sacrificar la
suficiencia.
• Al cliente se lo debe proveer de la mayor cantidad de
posibilidades de trabajo.
• Negarle a un cliente una posibilidad de trabajo es fracasar en
el diseño de una interfase.
• Además de que las posibilidades estén disponibles, estas
deben funcionar eficientemente.
• El cliente debe poder confiar en que los resultados dados por
una librería, siempre serán correctos, y que llegaran a el a
tiempo.
• Estos detalles tienen más que ver con la implantación que
con la interfase, pero son estrategias que no debemos pasar
por alto.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 121
12/03/2022
Generalidad
• Una interfase que solo se adapta a las
necesidades de un cliente en particular, puede
que no sirva para otros.
• Una interfase debe ser lo suficientemente general,
para resolver un buen grupo de posibilidades.
• Al crear una interfase debemos olvidarnos de
nuestro punto de vista y ponernos en el lugar de
todos los posibles clientes.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 122
12/03/2022
Estabilidad
• Si la interfase no cambia, los clientes no tienen
porque cambiar sus programas.
• Un creador puede perfectamente hacer cambios a
su librería, y si diseño correctamente su interfase,
estos cambios no afectarán a los clientes.
• Los cambios que haga el creador se harán en la
implementación de la librería.
• Cuando se haga un cambio en la interfase, todos
los clientes deberán cambiar sus programas.
• Usualmente estos cambios son profundos y no se
hacen frecuentemente.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 123
12/03/2022
Al Azar
• Todos hemos usado juegos de computadoras.
• El buscaminas, por ejemplo:
– Nunca se repiten las localidades de las minas.
– Estas fueron ubicadas al azar.
• Lograr que la computadora simule un
comportamiento “al azar” o “aleatorio” es muy útil
para ciertas aplicaciones.
• Sin embargo, esto encierra un cierto nivel de
complejidad.
• Deseamos esconder esa complejidad, usando una
interfase.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 124
12/03/2022
Números Pseudo-Aleatorios
• Un comportamiento determinístico es aquel,
en que las acciones son completamente
predecibles.
• Las computadoras tienen un comportamiento
determinístico, no pueden generar resultados
impredeciblemente.
• Pero pueden simularlo, partiendo de un
procedimiento determinístico. Los números
generados, parecerán ser aleatorios.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 125
12/03/2022
Generación de Números Aleatorios
• La librería en stdlib, incluye en su interfase la función:
– int rand(void);
• El entero que retorna es un número pseudo aleatorio no negativo, ni mayor
a una constante RAND_MAX
#include <stdio.h>
#include <stdlib.h>
#include <genlib.h>
void main()
{
int i, r;
printf("En esta computadora RAND_MAX: %d",
RAND_MAX);
for(i = 0; i < 10; i++)
{
r = rand();
printf("%dn",r);
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 126
12/03/2022
Ejercicio En Clase
• Escribir un programa que simule el lanzamiento de una moneda. El
programa deber “lanzar” 10 veces una moneda e indicar si cayo “Cara”
o “Cruz”.
• Para resolver este problema debemos recordar que rand() nos da un
numero entre 0 y RAND_MAX, es decir, RAND_MAX + 1 posibilidades.
• Nosotros, no deseamos RAND_MAX + 1, deseamos, 2 posibilidades:
RAND_MAX
0 RAND_MAX/2
CARA CRUZ
Podríamos decir, que todos los números menores o iguales que
RAND_MAX/2 representarían la opción 1(Cara) y
Todos los números mayores que RAND_MAX/ 2 representarían la opción
2(Cruz).
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 127
12/03/2022
Solución
#include <genlib.h>
#include <stdio.h>
#include <simpio.h>
#include <stdlib.h>
void main()
{
int i, r;
printf("Simulacion del lanzamiento de Monedasn");
for(i=1; i <= 10; i++){
printf("Lanzamiento No. %dn",i);
r = rand();
if(r<=RAND_MAX/2){
printf("CARAn");
} else {
printf("CRUZn");
}
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 128
12/03/2022
Ejercicio En Clase
• Estuvo bien, y acertada nuestra decisión de dividir para 2,
pues las posibilidades casi se repartieron por la mitad.
• Escribir un programa que simule el lanzamiento de un dado, e
indique el número de lado en que cayo.
• Recordemos, ahora si tenemos 6 posibilidades, deberíamos
dividir nuestro rango, para 6
El tamaño de cada division td =
RAND_MAX/6
td 2*td 3*td 4*td 5*td
0 RAND_MAX
1 2 3 4 5 6
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 129
12/03/2022
Solución
#include <stdio.h>
#include <stdlib.h>
void main()
{
int r,td;
td = RAND_MAX/6;
printf("Simulacion del lanzamiento de un Dadon");
r = rand();
if(r<=td){
printf("Lado 1n");
}else if(r<=td*2){
printf("Lado 2n");
}else if(r<=td*3) {
printf("Lado 3n");
}else if(r<=td*4) {
printf("Lado 4n");
}else if(r<=td*5) {
printf("Lado 5n");
}else {
printf("Lado 6n");
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 130
12/03/2022
El Problema y su Generalización
• Ahora pensemos en otro tipo de aplicación. Se nos pide escribir un
programa que “escoja” una carta de un mazo:
– En ese caso, la computadora debería generar un número entre 1 y 52.
– Seguir el mismo proceso anterior, con 52 posibilidades significaría
escribir muchas líneas de código.
• Se necesita ahora, escribir un programa que simule el modelo de la
ruleta Europea, donde el rango es de 0 a 36:
– Aunque el procedimiento es parecido, el programa anterior es
completamente inútil.
• Debe existir una forma de generalizar el proceso de limitar el rango
de un número generado aleatoriamente:
– La forma más correcta de generalizar algo para su uso continuo, es a
través de una función.
– Cualquier aplicación que necesite generar un número aleatorio en un
rango dado, podrá usar nuestra nueva función.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 131
12/03/2022
d
Una Nueva Herramienta
• Nuestra función generará un número entero, en un rango dado por un limite
inferior y uno superior:
– int RandomInteger(int v_inf, int v_sup);
• El proceso a seguir es el siguiente:
– Generar un entero entre 0 y RAND_MAX(r)
– Normalizar r, para convertirlo en un número real d entre 0 y 1( 0 <= d < 1)
– Escalar el valor d, multiplicándolo por el tamaño del rango deseado, esto ubicará a
d en el rango de 0 a v_sup-v_inf
– Truncar el valor generado, pues deseamos generar un entero(k)
– Trasladar el entero(k) al rango correcto, de v_inf a v_sup
0 RAND_MAX
r
1
v_sup-v_inf
d
v_sup
v_inf k
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 132
12/03/2022
Implementación
int RandomInteger(int v_inf, int v_sup)
{
int r,k;
double d;
r = rand();
d = (double) r / (double) (RAND_MAX +1);
d = d * (v_sup-v_inf+1);
k = (int) d + v_inf;
return k;
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 133
12/03/2022
Usando La función
• Simulación del lanzamiento de 10 monedas
int RandomInteger(int v_inf, int v_sup);
main(){
int i, r;
printf("Simulacion del lanzamiento de Dadosn");
for(i = 1; i <=10; i++){
printf("Lanzamiento No. %d:", i);
r = RandomInteger(1,6);
printf("Lado %dn",r);
}
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 134
12/03/2022
Otro Problema sobre el mismo Tema
• Que esperamos que suceda cuando
volvamos a correr el programa cliente?.
• Lo normal, es esperar que el computador
genere otra tanda de números en un orden
completamente diferente.
• Recordemos, que el computador solo puede
simular que genera números al azar.
• Con cada “corrida” del programa, el
computador generará el mismo grupo de
números.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 135
12/03/2022
La Semilla de la Generación
• El proceso básico con el cual el computador “genera” números “al
azar”, es partiendo de un número inicial.
• Usando ese número, la computadora efectúa sus cálculos, y nos
muestra un número que no esperábamos.
• Su nuevo número “inicial” es ahora el último valor calculado.
• Este número “inicial” que la computadora usa para sus cálculos, se
conoce como “semilla”.
• A menos que se indique la computadora siempre usará la misma
semilla en cada “corrida” de un programa.
Proceso de
Calculo
SEMILLA VALOR “AL
AZAR” No. 1
Proceso de
Calculo
VALOR “AL
AZAR” No. 1
VALOR “AL
AZAR” No. 2
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 136
12/03/2022
Como Cambiar La Semilla
• La librería stdlib provee una función con la que podemos cambiar la
semilla:
– void srand(int);
• La semilla debe ser un entero.
• La idea es que con cada corrida de un programa, la semilla cambie.
• Lo único que sabemos que siempre esta cambiando, es el tiempo,
podemos usarlo en este caso.
• La librería time contiene funciones para conocer y modificar la fecha,
y la hora local:
– La función time devuelve el numero de segundos transcurridos desde las
00:00:00 del primero de Enero de 1970.
• La expresión que permitirá cambiar la semilla de acuerdo al tiempo:
– srand((int) time(NULL));
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 137
12/03/2022
Otra Herramienta
• Todo programa que use números aleatorios,
debería modificar la semilla.
• Para usar la expresión srand, se debe conocer:
– El proceso de generación de números aleatorios.
– La existencia de la función time, de la librería time.
• En conclusión, existe una cierta complejidad en
este proceso, que se puede esconder usando un
procedimiento:
– void Randomize(void);
void Randomize(void){
srand((int) time(NULL));
}
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 138
12/03/2022
Construcción de una Librería Propia
• Ahora poseemos dos herramientas para trabajar con
números aleatorios.
• Lo ideal aquí es crear nuestra propia librería.
• Las librerías que crearemos, son archivos de extensión .lib
• Para lograrlo se deben seguir ciertos pasos:
– Crear un proyecto, de tipo Librería estática
– Añadir al proyecto un archivo de cabecera (para la interfase).
Aquí se añadirán:
• Prototipos
• Declaraciones de constantes
• Nuevos tipos de datos
– Añadir al proyecto un archivo .c que contendrá la
implementación de las herramientas declaradas en la interfase.
– Al terminar, se creará un archivo de extensión .lib, que será
nuestra nueva librería.
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 139
12/03/2022
Crear El Proyecto
Vamos a crear una
librería estática
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 140
12/03/2022
Añadir Los Archivos
Añadimos el archivo de
cabecera(la interfase)
de ext. *.h
Falta añadir el
archivo *.c, para
la
implementacion
El archivo *.c
Ahora ya estan
incluidos todos los
archivos de nuestro
paquete y podemos
continuar
Continuar, el resto de
pasos, son los
mismos para crear un
proyecto normal
Aquí ya aparecerá
elegida la opción de
librería estática, no se
debe cambiar
Nuestra librería se
llamará random.lib y
aquí se indica el
directorio donde se
creará
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 141
12/03/2022
¿Cómo Crear La Interfase?
• La interfase, es, como ya sabemos, la cara que una librería, da a un
cliente.
• En una interfase se pueden incluir:
– Prototipos de funciones
– Declaraciones de constantes (usando #define)
– Declaraciones de nuevos tipos de datos (veremos como más adelante)
• Esto quiere decir que jamás se incluirá implementación en una
interfase.
• El formato general de una interfase es:
#ifndef _nombre_h
#define _nombre_h
/*Líneas de #include para librerías que se vaya a usar*/
/*prototipos de funciones*/
/*definición de constantes*/
/*declaraciones de nuevos tipos de datos*/
#endif
El nombre de la
librería
En programas complejos, una
interfase puede ser incluida en
varios archivos .c, para evitar
“confusiones” se pregunta si la
intefase no ha sido usada aun
(ifndef: if not defined)
Si no ha sido usada, se define,
caso contrario, se ignoran todas las
declaraciones de la misma
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 142
12/03/2022
Nuestra Nueva Interfase
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 143
12/03/2022
La Implementación
Se debe incluir la
interfase, random.h
Al incluirla, asegúrese
de encerrarla entre “”,
y no entre <>
Si al
compilar(Compile-
Make), todo tuvo
éxito, estamos listos
para usar nuestra
librería
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 144
12/03/2022
Un Programa Cliente
• Ahora podemos ponernos del lado del cliente,
como hace para usar esta nueva librería?
• Nuestro nuevo programa usara la librería para
simular el lanzamiento de 10 dados.
Al crear el nuevo
proyecto, como cliente,
se añade la nueva
librería, con su ruta
completa. Para evitar
esto, la solucion es
copiar random.lib en el
directorio lib del
compilador
Al incluir la interfase,
también debe indicarse
la ruta completa. Esto
siempre y cuando el
archivo .h se encuentre
en un directorio
diferente del directorio
de trabajo o del
directorio include del
compilador
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 145
12/03/2022
Evaluación de una Interfase
• Ahora podemos evaluar nuestra interfase, usando los criterios
mencionados al comienzo:
– Unificada: las herramientas de la interfase comparten un tema en
común: los números aleatorios, por lo tanto, si es unificada.
– Simple: no le hemos usado mucho, pero con el programa cliente
podemos darnos una idea de que en realidad esconde la complejidad
correctamente y las herramientas son muy fáciles de usar.
– Suficiente: realmente las herramientas no cubren todo lo que un cliente
pueda desear hacer con los números aleatorios. Aun le falta por
desarrollar.
– General: las herramientas disponibles son bastante generales, en el
sentido de que no están limitadas a un solo tipo de cliente.
• Este seria el caso, si la interfase solo incluyera funciones para simular que un
dado es lanzado, o para simular que una carta es escogida.
• En cambio la interfase provee las herramientas para desarrollar cualquiera de
esas funciones
– Estable: si la interfase satisface los requerimientos anteriores,
probablemente podrá permanecer estable por un buen tiempo
Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 146
12/03/2022
Programación modular
Unidad 4
Final de la unidad
Y del curso…. !Muchas gracias
a todos!

Más contenido relacionado

La actualidad más candente

Consultas multitabla clase
Consultas multitabla claseConsultas multitabla clase
Consultas multitabla claseAlejandra Vera
 
encapsulamiento
encapsulamientoencapsulamiento
encapsulamientozeta2015
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Webjcremiro
 
POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosFranklin Parrales Bravo
 
Clasificacion Lenguajes de Programacion por Su Generacion
Clasificacion Lenguajes de Programacion por Su GeneracionClasificacion Lenguajes de Programacion por Su Generacion
Clasificacion Lenguajes de Programacion por Su GeneracionShirlid .n
 
Cardinalidad
CardinalidadCardinalidad
CardinalidadUTN
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental umlrigo berto
 
Programacion estructurada en objetos
Programacion estructurada en objetosProgramacion estructurada en objetos
Programacion estructurada en objetosAngel Ordoñez
 
Diagrama uml ing software i promecys
Diagrama uml ing software i promecysDiagrama uml ing software i promecys
Diagrama uml ing software i promecysLeonel Narvaez Ruiz
 
Diagrama de clases
Diagrama de clasesDiagrama de clases
Diagrama de clasesstill01
 
Tópicos Avanzados de Programación - Unidad 2 componentes y librerias
Tópicos Avanzados de Programación - Unidad 2 componentes y libreriasTópicos Avanzados de Programación - Unidad 2 componentes y librerias
Tópicos Avanzados de Programación - Unidad 2 componentes y libreriasJosé Antonio Sandoval Acosta
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosFranklin Parrales Bravo
 

La actualidad más candente (20)

Consultas multitabla clase
Consultas multitabla claseConsultas multitabla clase
Consultas multitabla clase
 
encapsulamiento
encapsulamientoencapsulamiento
encapsulamiento
 
Arrays en VB 6.0
Arrays en VB 6.0Arrays en VB 6.0
Arrays en VB 6.0
 
Métodos Formales
Métodos FormalesMétodos Formales
Métodos Formales
 
Patron Singleton
Patron SingletonPatron Singleton
Patron Singleton
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Web
 
Practica 1 alice
Practica 1 alicePractica 1 alice
Practica 1 alice
 
SQLite
SQLiteSQLite
SQLite
 
Modelo de datos
Modelo de datosModelo de datos
Modelo de datos
 
POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilos
 
Clasificacion Lenguajes de Programacion por Su Generacion
Clasificacion Lenguajes de Programacion por Su GeneracionClasificacion Lenguajes de Programacion por Su Generacion
Clasificacion Lenguajes de Programacion por Su Generacion
 
Cardinalidad
CardinalidadCardinalidad
Cardinalidad
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental uml
 
Colas
ColasColas
Colas
 
Programacion estructurada en objetos
Programacion estructurada en objetosProgramacion estructurada en objetos
Programacion estructurada en objetos
 
Diagrama uml ing software i promecys
Diagrama uml ing software i promecysDiagrama uml ing software i promecys
Diagrama uml ing software i promecys
 
Diagrama de clases
Diagrama de clasesDiagrama de clases
Diagrama de clases
 
Tópicos Avanzados de Programación - Unidad 2 componentes y librerias
Tópicos Avanzados de Programación - Unidad 2 componentes y libreriasTópicos Avanzados de Programación - Unidad 2 componentes y librerias
Tópicos Avanzados de Programación - Unidad 2 componentes y librerias
 
Fundamentos de BD - unidad 3 modelo relacional
Fundamentos de BD - unidad 3 modelo relacionalFundamentos de BD - unidad 3 modelo relacional
Fundamentos de BD - unidad 3 modelo relacional
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a Objetos
 

Similar a ALP Unidad 4: Programación modular

Similar a ALP Unidad 4: Programación modular (20)

Computación distribuida usando Python
Computación distribuida usando PythonComputación distribuida usando Python
Computación distribuida usando Python
 
Laboratorio 4
Laboratorio 4Laboratorio 4
Laboratorio 4
 
Laboratorio 4
Laboratorio 4Laboratorio 4
Laboratorio 4
 
Laboratorio 4
Laboratorio 4Laboratorio 4
Laboratorio 4
 
Informatica
InformaticaInformatica
Informatica
 
Tap04 poo
Tap04 pooTap04 poo
Tap04 poo
 
Diapositivas de la poo
Diapositivas de la pooDiapositivas de la poo
Diapositivas de la poo
 
Diseño estructurado
Diseño estructuradoDiseño estructurado
Diseño estructurado
 
Programacion de algoritmos
Programacion de algoritmosProgramacion de algoritmos
Programacion de algoritmos
 
Diapositivas de la poo
Diapositivas de la pooDiapositivas de la poo
Diapositivas de la poo
 
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
 
CREACION DE DLL Y USO (Ejemplo desarrollado)
CREACION DE DLL Y USO (Ejemplo desarrollado)CREACION DE DLL Y USO (Ejemplo desarrollado)
CREACION DE DLL Y USO (Ejemplo desarrollado)
 
Met2 07 01-introduccion_poo
Met2 07 01-introduccion_pooMet2 07 01-introduccion_poo
Met2 07 01-introduccion_poo
 
Programacion modular
Programacion modularProgramacion modular
Programacion modular
 
Estimacion de Proyectos, Ingeniería de Software
Estimacion de Proyectos, Ingeniería de SoftwareEstimacion de Proyectos, Ingeniería de Software
Estimacion de Proyectos, Ingeniería de Software
 
Conceptos básicos de un lenguaje de programación
Conceptos básicos de un lenguaje de programaciónConceptos básicos de un lenguaje de programación
Conceptos básicos de un lenguaje de programación
 
Clase 1_Unidad II (2).pdf
Clase 1_Unidad II  (2).pdfClase 1_Unidad II  (2).pdf
Clase 1_Unidad II (2).pdf
 
Frameworks de templates y xml
Frameworks de templates y xmlFrameworks de templates y xml
Frameworks de templates y xml
 
Clase 09a frameworks
Clase 09a frameworksClase 09a frameworks
Clase 09a frameworks
 
Framework
FrameworkFramework
Framework
 

Más de Franklin Parrales Bravo

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaFranklin Parrales Bravo
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebFranklin Parrales Bravo
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaFranklin Parrales Bravo
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosFranklin Parrales Bravo
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebFranklin Parrales Bravo
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaFranklin Parrales Bravo
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasFranklin Parrales Bravo
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosFranklin Parrales Bravo
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosFranklin Parrales Bravo
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosFranklin Parrales Bravo
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosFranklin Parrales Bravo
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraFranklin Parrales Bravo
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareFranklin Parrales Bravo
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software Franklin Parrales Bravo
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosFranklin Parrales Bravo
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosFranklin Parrales Bravo
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoFranklin Parrales Bravo
 
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4Franklin Parrales Bravo
 
RD Unidad 1: Principios de Comunicación y Redes
RD Unidad 1: Principios de Comunicación y RedesRD Unidad 1: Principios de Comunicación y Redes
RD Unidad 1: Principios de Comunicación y RedesFranklin Parrales Bravo
 

Más de Franklin Parrales Bravo (20)

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en Cuenca
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería Web
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicua
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelos
 
MOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modeladoMOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modelado
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuida
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidas
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgos
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidos
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectos
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestra
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivos
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a Objetos
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y Enrutamiento
 
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
 
RD Unidad 1: Principios de Comunicación y Redes
RD Unidad 1: Principios de Comunicación y RedesRD Unidad 1: Principios de Comunicación y Redes
RD Unidad 1: Principios de Comunicación y Redes
 

ALP Unidad 4: Programación modular

  • 1. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 1 12/03/2022 Programación modular Unidad 4 Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo para uso de los cursos de Algoritmos y Lógica de Programación
  • 2. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 2 12/03/2022 Objetivo general de la Unidad 4 Implementar funciones propias del programador mediante la aplicación de la técnica de la programación modular para la resolución de problemas en el desarrollo de software con calidad.
  • 3. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 3 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas, Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 4. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 4 12/03/2022 Diseño descendente (top-down) • Permite abordar problemas complejos • Consiste en descomponer el problema grande en varios pequeños – Módulos independientes – Procedimientos, funciones y bloques de código Modularidad Función F1 Función F2 Procedimiento P1 Programa Principal
  • 5. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 5 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas, Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 6. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 6 12/03/2022 Dividir y Conquistar (1) • Debido a la complejidad de los grandes problemas y las limitaciones de la mente humana estos no se pueden atacar como una unidad monolítica – Aplicar dividir y conquistar – Dividir en piezas que pueden ser “conquistadas” por separado. Sino se hizo una división poco inteligente • Dividir en piezas con esta propiedad es una tarea compleja para el diseño de software
  • 7. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 7 12/03/2022 Dividir y Conquistar (2) • Las piezas – Están relacionadas. Juntas forman el sistema – Entonces, existe comunicación y cooperación entre las mismas – Esto agrega complejidad, que surge de la propia partición – Cuando el costo de particionar sumado la complejidad agregada supera los ahorros logrados por particionar se debe detener el proceso
  • 8. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 8 12/03/2022 Modularización • Módulo: un componente bien definido de un sistema de software que provee recursos y servicios – Están bien definidos: • Recursos y Servicios • La forma de suministrarlos (Interfaces) – Un módulo puede ser un programa o varios, una subrutina o varias • Principio de Separación de Intereses – cada módulo se ocupa de aspectos específicos (cohesión)
  • 9. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 9 12/03/2022 Modularizar • Dividir sucesivamente, obteniendo niveles – Se formará una jerarquía de módulos – Los de mas bajo nivel • Resuelven problemas más pequeños y • Contienen mas detalle • Hasta que los módulos de nivel inferior – Sean sumamente simples – Y solo contengan funciones y procedimientos – Que resuelven problemas independientes y pequeños
  • 10. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 10 12/03/2022 Cuando modularizar • Si un conjunto de sentencias realiza una tarea – Recurrente, repetitiva, identificable • Debe ser un módulo • Sin embargo, – Una tarea no necesita ser recurrente para hacerla un módulo Modularidad Función F1 Función F2 Procedimiento P1 Programa Principal
  • 11. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 11 12/03/2022 Cohesión • Se focaliza en conocer el por qué los elementos de un módulo están juntos en ese módulo • El objetivo es tener en un mismo módulo elementos que están fuertemente vinculados – Entonces, módulos más fáciles de entender – y más fáciles de modificar
  • 12. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 12 12/03/2022 Descomposición Deben hacerse módulos, pero con cuidado para permanecer en la cercanía de M. Debe evitarse hacer pocos o muchos módulos. Región de costo mínimo M Costo del esfuerzo Costo de integración Costo total del software Costo por módulo Número de módulos
  • 13. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 13 12/03/2022 Funciones propias del lenguaje de programación # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 1 abs(i) int stdlib.h int abs(int i); Devuelve el valor absoluto de i x = abs(-7) // x es 7 2 acos(d) double math.h double acos(double d); Devuelve el arco coseno de d angulo = acos(0.5); // angulo devuelto es phi/3 3 asin(d) double math.h double asin(double d); Devuelve el arco seno de d angulo = asin(0.707); // aproximadamente phi/4 4 atan(d) double math.h double atan(double d); long double tanl(long double d); Devuelve la arco tangente de d. Calcula el arco tangente del argumento x. Requiere el llamado de la biblioteca complex.h angulo atan(1.0); // angulo es phi/4 5 atan(d1, d2) double math.h double atan(double d1, double d2); Devuelve el arco tangente de d1/d2 angulo = atan(y, x) 6 atof(s) Double stdlib.h double atof(const char *cadena) Convierte la cadena s a una cantidad de doble precisión. Requiere el llamdo de la biblioteca math.h double x; char *cad_dbl = "200.85"; ... x=atof(cad_dbl); // convierte la cadena "200.85" a valor real
  • 14. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 14 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 7 atoi(s) int stdlib.h int atoi(const char *cadena) Convierte la cadena s a un entero. La cadena debe tener el siguiente formato: [espacio en blanco][signo][ddd] (siendo obligatorio los digitos decimales). int i; char *cad_ent="123"; ... i=atoi(cad_ent); //convierte la cadena "123" al entero 123 8 atol(s) long stdlib.h long atol(const char *cadena); Convierte la cadena s a un entero largo. La cadena debe tener el siguiente formato: [espacio en blanco][signo][ddd] (siendo obligatorio los digitos decimales). long int i; char cad_ent="9876543"; ... i=atol(cad_ent); //convierte la cadena "9876543" al entero largo 9 calloc(n, s) void(punt ero) malloc.h y stdlib.h o bien alloc.h y stdlib.h void *calloc(size_t n, size_t s); Reserva memoria para una formación de n elementos , cada uno de s bytes. Devuelve un puntero al principio del espacio reservado. Si no existente bastante espacio para el nuevo bloque o bien n o s es 0, calloc devuelve nulo. long *buffer buffer=(long *) calloc(40, sizeof(long));
  • 15. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 15 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 10 ceil(d) double math.h double ceil(double d); Devuelve un valor redondeado por exceso al siguiente entero mayor redondeo=ceil(5.1); //redondeo es 6 11 cos(d) double math.h double cos(double d); complex cos(complex d); Devuelve el coseno de d coseno_x=cos(1.6543) 12 cosh(d) double math.h double cos(double d); complex cos(complex d); Devuelve el coseno hiperbólico de d d=1.00; printf("d=%f.nn,d); 13 difftime(11, 12) double time.h double difftime(time_t hora2, time_t hora1) Devuelve la diferencia de tiempo 11(hora2) - 12(hora1) , donde 11 y 12 representan el tiempo transcurrido despues de un tiempo base (ver función time) time_t inicio, fin; clrscrl(); inicio=time(NULL); delay(5000) fin=time(NULL) print("Diferencia en segundos: %fn", difftime(inicio,fin));
  • 16. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 16 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 14 exit(u) void stdlib.h void exit(int estado) Cierra todos los archivos y buffers y termina el programa. El valor de u es asignado por la funcion para indicar el estado de terminación. exit(0); 15 exp(d) double math.h double exp(double d); complex exp(complex d) Eleve e a la potencia d (e=2,7182818... es la base del sistema de logaritmos naturales (neperianos)) d=100.00; y=exp(d); printf("El exponencial de x=%f.nn",y); 16 fabs(d) double math.h double fabs(double d); Devuelve el valor absoluto de d y=fabs(-7.25); // y vale 7.25 17 fclose(f) int stdio.h int fclose(FILE *f); Cierra el archivo f. Devuelve el valor 0 si el archivo se ha cerrado con exito. int fclose(FILE "archivo"); 18 feof(f) int stdio.h int feof(FILE *f); Determina si se ha encontrado un fin de archivo. si es asi, devuelve un valor distinto de cero, en otro caso devuelve 0 feof(fichen);
  • 17. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 17 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 19 fgetc(f) int stdio.h int fgetc(FILE f); Lee un caracter del archivo f c+fgetc(fp) 20 fegts(s, i, f) char(pun tero) stdio.h char *fgets(char s, int s, FILE *f); Lee una cadena s, con i caracteres, del archivo f fgets(caddemo, 80, fp); 22 fmod(d1, d2) double math.h double fmod(double d1, double d2); Devuelve el resto de d1/d2 (con el mismo signo que d1) resto=fmod(5.0,2.0); // resto igual a 1.0 23 fprintf(f, ...) int stdio.h int fprintf(FILE *f, const char *formato [,arg,...]); Escribe datos en el archivo f (el resto de los argumentos fprintf(f1, "El resultado es %fn",result); 24 fputc(c, f) int stdio.h int fputc(int c, FILE *f); Escribe un caracter en el archivo f fputc(*(p++), stdout); 25 fputs(s, f) int stdio.h int fputs(const char *cad, FILE *f) Escribe una cadena de caracteres en el archivo f fputs("esto es una prueba", f1); 26 fread(s, i1, i2, f) int stdio.h size_t fread(void *b, size_t t, size_t n, FILE *f); Lee i2 elementos, cada uno de tamano i1 bytes, desde el archivo f hasta la cadena s fread(buf, strlen(msg)+1, 1, flujo);
  • 18. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 18 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 27 fopen(s1, s2) file(p unter o) stdio.h FILE *fopen(const char *s1, const char *s2) Abre un archivo llamado s1, del tipo s2. Devuelve un puntero al archivo. * if ((corriente2=f open("datos"," W+"))==NULL printf("El archivo...no se ha abierto n"); Modo Acción "r" Abre para lectura "w" Abre un archivo vacío para escritura "a" Abre para escritura al final del archivo "r+" Abre para lectura/escritura "w+" Abre un archivo vacio para lectura/escritura "a+" Abre para lectura y anadir "rb" Abre un archivo binario para lectura. "wb" Abre un archivo binario para escritura "ab" Abre un archivo binario para anadir "rb+" Abre un archivo binario para lectura/escritura. "wb+" Abre un archivo binario para lectura/escritura "ab+" Abre o crea un archivo binario para lectura/escritura
  • 19. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 19 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 28 free(p) void malloc.h o stdlib.h void free(void *dir_memoria); Libera un bloque de memoria reservada cuyo principio esta indicado por p. char *cad; // asignar memoria a la cadena cad=(char *)malloc(50); ... free(cad); // liberar memoria 29 fscanf(f, ...) int math.h int fscanf(FILE *f, const char *formato, [, direccion,... ]); Lee datos del archivo f ( el resto de los argumentos fscanf(flujo, %s%f, cad, &f); 30 fseek(f, l, i) int stdio.h int fseek(FILE *f, long desplaza, int origen); Mueve el puntero al archivo f una distancia de 1 bytes desde la posición i (i puede representar el principio del archivo, la posición actual del puntero o el fin del archivo. Notas fseek(f1,OL,SEEK_SET); // ir al principio Origen Significado SEEK_SET Principio de archivo SEEK_CUR Posicion actual puntero SEEK_END Final del archivo
  • 20. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 20 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 31 ftell(f) long int stdio.h long int ftell(FILE *f); Devuelve la posicion actual del puntero dentro del archivo f ftell(fichen) 32 fwrite(s, i1, i2, f) int stdio.h size_t fwrite(const void *p, size_t i1, size_t i2, FILE *f); Escribe i2 elementos, cada uno de tamano 1 bytes, desde la cadena s hasta el archivo f num=fwrite(lista,sizeof(char),25, flujo); 33 getc(f) int stdio.h int getc(FILE *f); Lee un caracter del archivo f while(c=getc(fx) !=EOF { print ("%c",c); } 34 getchar( ) int stdio.h int getchar(void); Lee un caracter desde el dispostivo de entrada estandar int c; while((*c=getchar()) != 'n') print ("%c",c); 35 gets(s) char(pun tero) stdio.h char *gets(char *cad); Lee una cadena de caracteres desde el dispositivo de entrada estandar gets(nombre); 36 isalnum(c) int ctype.h int isalnum(int c); Determina si el argumento es alfanumerico. Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0 carac=getch(); if (isalnum(carac)) print("%c letra|digito n",carac); else printf("%c no letra|digito n", carac);
  • 21. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 21 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 37 isalpha(c) int ctype.h int isalpha(int c); Determina si el argumento es alfabetico. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0. int c; if (isalpha(c)) printf("%c es letran",c); 38 isascii(c) int ctype.h int isascii(int c); Determina si el argumento es un caracter ASCII. Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0 int c; if (isascii(c)) printf('%c es un asciin",c) 39 iscntrl(c) int ctype.h int isacntrl(int c); Determina si el argumento es un caracter ASCII de control. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(iscntrl(c)) printf"%c es un caracter de controln",c); 40 isdigit(c) int ctype.h int isdigit(int c); Determina si el numero es un digito decimal. Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0 if(isdigit(c)) printf"%c es un digiton",c); 41 isgraph(c) int ctype.h int isgraph(int c); Determina si el argumento es un caracter ASCII grafico (hex 0x21 -0x7e; octal 041 - 176). Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(isgraph(c)) printf"%c es un caracter imprimible(no espacio)n",c);
  • 22. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 22 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 42 islower(c) int ctype.h int islower(int c); Determina si el argumento es ua minuscula. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(islower(c)) printf"%c es una letra minusculan",c); 43 isodigit(c) int ctype.h int isodigit(int c); Determina si el argumento es un digito octal. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(isodigit(c)) printf"%c es un digito octaln",c); 44 isprint(c) int ctype.h int isprintint c); Determina si el el argumento es un caracter ASCII imprimible (hex 0x20 -0x7e; octal 040 -176). Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(isprint(c)) printf("n"c imprimiblen",c); 45 ispunct(c) int ctype.h int ispunct(int c); Determina si el argumento es un caracter de puntuacion. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(ispunct(c)) printf"%c es un caracter de puntuacionn",c); 46 isspace(c) int ctype.h int isspace(int c); Determina si el argumento es un espacio en blanco. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(isspace(c)) printf"%c es un espacion",c);
  • 23. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 23 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 47 isupper(c) int ctype.h int isupper(int c); Determina si el argumento es una mayuscula. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 if(isupper(c)) printf"%c es una mayusculan",c); 48 isxdigit(c) int ctype.h int isxdigit(int c); Determina si el argumento es un digito hexadecimal. Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0 ifisxdigit(c)) print"%c es un digito hexadecimaln",c) 49 labs(l) long int math.h long int labs(long int l); Devuelve el calor absoluto de 1 long lx=-51654,ly; ly=labs(lx); 50 log(d) double math.h double log(double d); Devuelve el logaritmo natural de d hdouble x,y; x=10; y=log(x); 51 log10(d) double math.h double log10(double d); Devuelve el logaritmno (en base 10) de d hdouble x,y; x=10; y=log10(x); 52 malloc(u) void(pun tero) stdlib.h void *malloc(size_t u); Reserva u bytes de memoria. devuelve un puntero al principio del espacio reservado cadena=malloc(MAX_CHR); 53 pow(d1, d2) double math.h double pow(double d1, double d2); Devuelve d1 elevado a la potencia d2 double x=2.0, y=4.0, z; z=pow(x,y); //z sera 1.60
  • 24. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 24 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 54 printf(...) int stdio.h int printf(const char *formato[,argu mento,...]); Escribe datos en dispositivo de salida estándar. print("producto %d y %d es %dn",x,y,x*y); 55 putc(c, f) int stdio.h int putc(int c, FILE *f); Escribe un caracter en el archivo f putc('*',demo); 56 putchar(c) int stdio.h int putchar(int c); Escribe un caracter en el dispositivo de salida estandar putchar('B'); 57 puts(s) int stdio.h int puts(const char *cad) Escribe una cadena de caracteres en el dispositivo de salida estandar puts("Desea continuar (s/n); 58 rand( ) int stdlib.h int rand(void); Devuelve un entero positivo aleatorio // visualizar 10 numeros aleatoriosfor (i=0;i<10;i++) printf("%6d",rand()); Código Formato %c Caracter %d Entero Decimal %e Real (double o float), notacion cientifica. %f Coma flotante %s Cadena de caracteres %x Hexadecimal sin signo
  • 25. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 25 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 59 rewind(f) void stdio.h void rewind(FILE *f); Mueve el puntero al principio del archivo f rewind(fx); 60 scanf(...) int stdio.h int scanf(const char *formato {,direccion,...]); Lee datos en dispositivo de entrada estándar scanf('%d %f %c %s, &i, &fp, &c, s); 61 sin(d) double math.h double sin(double d); Devuelve el seno de d double x, y; x=0.52; printf('x =%f radianesn",x); y=cos(x); printf("el coseno de x =%fn",y); 62 sinh(d) double math.h double sinh(double d); Devuelve el seno hiperbolico de d y=sinh(x); 63 sqrt(d) double math.h double sqrt(double d); Devuelve la raiz cuadrada de d printf("%lf",sqrt(25.0); //se visualiza 5 Codigo Formato %c Caracter %d Enetero Decimal %x Hexadecimal %i Entero Decimal %f Numero Real %o Octal %p Puntero %s Cadena
  • 26. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 26 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 64 srand(u) void stdlib.h void srand(unsigne d u); Inicializa el generador de numeros aleatorios srand(semilla); 65 strcmp(s1, s2) int string.h int strcmp(const char*s1, const char *s2); Compara dos cadenas de caracteres lexicograficamente. Devuelve un valor negativo si s1 < s2; 0 si s1 y s2 son identicas; y un valor positivo si s1 > s2 i=strcmp("MNP", "mnp"); // resultado < 0 i=strcmp("abc", "abc"); // resultado = 0 i=strcmp("xy", "abc"); // resultado > 0char s1[80]="Mayo"; char s2[80]="Octubre"; int j; j=strcmp(s1,s2); 66 strcmpi(s1, s2) int string.h int strcmpi(const char*s1, const char *s2); Compara dos cadenas de caracteres lexicograficamente, sin diferenciar mayusculas de minusculas. Devuelve un valor negativo si s1 < s2; 0 si s1 y s2 son identicas; y un valor positivo si s1 > s2 v=strcmpi(s1,s2); 67 strcpy(s1, s2) char string.h char *strcpy(char s1, const char s2); Copia la cadena de caracteres s2 en la cadena s1 char *s1="Pepe Luis"; char b[12]; strcpy(s2,s1); cout <<s2<< 'n';
  • 27. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 27 12/03/2022 # Función Tipo Biblioteca Sintaxis Descripción Ejemplo 68 strlen(s) int string.h size_t strlen(const char *s); Devuelve el numero de caracteres de una cadena longitud=strlen(nombre); char s[81]="Cadena demo'; printf("La longitud de s es: %dn" strlen(s)); 69 strset(c, s) char(pun tero) string.h char *strset(char *cad, int c); Pone todos los caracteres de s a c (excluyendo el caracter nulo del final 0) char *cad="----"; strset (cad,'x'); // cad es ahora xxxx 70 system(s) int string.h system(comd) ; Pasa la orden al sistema operativo. Devuelve cero si la orden se ejecuta correctamente; en otro caso devuelve un valor distinto de cero, tipicamente -1. system(dir); 71 tan(d) double math.h double tan(double d); Devuelve la tangente de d y=tan(x); 72 tanh(d) double math.h double tanh(double d); Devuelve la tangente hiperbolica de d a=tanh(x); 73 time(p) long int time.h time_t time(time_t *h); Devuelve el numero de segundos transcurridos despues de un tiempo base designado time(&hora); 74 toascii int ctype.h int toascii(int c); Convierte el valor del argumento a ASCII c=toascii(entero); 75 tolower int ctype.h o stdlib.h int tolower(int c); Convierte una letra a minuscula c=tolower('s'); //c se convierte en 's' 76 toupper int ctype.h o stdlib.h int toupper(int c); Convierte una letra a mayuscula c=toupper('s'); //c se convierte en 'S'
  • 28. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 28 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas, Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 29. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 29 12/03/2022 Estructura de los programas que hemos visto hasta el momento • Se tiene un solo archivo fuente. • Todo lo que hace el programa se implementa dentro de la función main. #include <archivo_cabecera> declaracion_variables_globales; int main() { declaracion_variables_locales; instruccion_1; instruccion_2; . . . instruccion_N; return 0; }
  • 30. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 30 12/03/2022 Problemas de esta metodologia #include <stdio.h> int a[3],b[3],c[3]; int main() { int i; printf(" Ingrese el primer vector: "); for(i=0;i<3;i++) { scanf("%d",&a[i]); } printf(" vec1 = [%d %d %d]nn",a[0],a[1],a[2]); printf(" Ingrese el segundo vector: "); for(i=0;i<3;i++) { scanf("%d",&b[i]); } printf(" vec2 = [%d %d %d]nn",b[0],b[1],b[2]); for(i=0;i<3;i++) { c[i]=a[i]+b[i]; } printf(" vec3 = vec1 + vec2 = [%d %d %d]nn",c[0],c[1],c[2]); return 0; } Repetición de código Código chorizudo
  • 31. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 31 12/03/2022 Problemas de esta metodologia • Programación repetida. • A medida que el problema se hace mas complejo el main tiende a crecer mucho y hacerse mas difícil de entender. • Dificultad para programar. • Poca reutilización de código
  • 32. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 32 12/03/2022 Ejemplo ... ! 7 ! 5 ! 3 ) ( 7 5 3 + − + − = x x x x x sen Realizar un programa que calcule el valor de la función seno usando la serie equivalente para ello. Los valores de entrada son x y el numero de términos. A continuación se muestra la serie equivalente:
  • 33. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 33 12/03/2022 Solución sin hacer uso de funciones ... ! 7 ! 5 ! 3 ) ( 7 5 3 + − + − = x x x x x sen resul term Ciclo para generar el numero de términos que tendrá la serie Ciclo anidado para calcular el factorial(que se usara en el denominador) y la potencia (que se usara en el numerador). Parte que sumara o restara el termino (term) al acumulador (resul) usado para almacenar la solución.
  • 34. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 34 12/03/2022 Solución al problema: funciones #include <archivo_cabecera> declaracion_variables_globales; int main() { declaracion_variables_locales; instruccion_1; instruccion_2; . . . instruccion_N; return 0; } #include <archivo_cabecera> protipo_funciones; declaracion_variables_globales; int main() { declaracion_variables_locales; funcion_1(); funcion_2(); . . . funcion_N(); return 0; } funcion_1() { codigo_funcion_1; } . . . funcion_N() { codigo_funcion_N; }
  • 35. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 35 12/03/2022 Solución haciendo uso de funciones Ciclo para generar el numero de términos que tendrá la serie Calculo del factorial y la potencia usando funciones. Parte que sumara o restara el termino (term) al acumulador (resul) usado para almacenar la solución.
  • 36. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 36 12/03/2022 Solución haciendo uso de funciones
  • 37. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 37 12/03/2022 Solución haciendo uso de funciones
  • 38. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 38 12/03/2022 Solución haciendo uso de funciones #include <stdio.h> int a[3],b[3],c[3]; void ingresar_vector(int []); void imprimir_vector(int []); void sumar_vectores(int [],int [],int ); int main() { int i; printf(" Ingrese el primer vector: "); ingresar_vector(a); printf(“vec1 = ”); imprimir_vector(a); printf(“nn”); . . . return 0; } void ingresar_vector(int v[]) { for(i=0;i<3;i++) { scanf("%d",&v[i]); } } void imprimir_vector(int v[]) { printf(“[%d %d %d]”,v[0],v[1],v[2]); } void sumar_vectores(int v1[],int v2[],int res) { for(i=0;i<3;i++) { res[i]=v1[i]+v2[i]; } } Prototipos de las funciones Función principal Definición de las funciones
  • 39. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 39 12/03/2022 Implementación de Programas Utilizando Funciones • Usualmente los problemas que se resuelven con un computador son mas grandes y complejos que los revisados aquí. • En estos casos, se busca siempre dividir el problema grande en subproblemas. • Las funciones son grupos de sentencias bajo un mismo nombre que nos ayudan en esta técnica de divide y conquista. • Son los subproblemas, cada función se encarga de resolver un problema mas pequeño.
  • 40. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 40 12/03/2022 Implementación de Programas Utilizando Funciones • Hemos utilizado funciones que ya han sido escritas, e incluidas en librerías. • Una de las funciones que más hemos utilizado ha sido printf, de la librería stdio, para mostrar información en pantalla. • printf nos ayuda a resolver un problema, tal como lo hace un programa • De hecho, todos los programas principales se escriben como una función: main()
  • 41. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 41 12/03/2022 Implementación de Programas Utilizando Funciones • Las funciones y los programas se parecen mucho, pero difieren: – Los programas son usados por un usuario externo – Las funciones son utilizadas por un programador – El usuario del programa “Hola Mundo” no conoce que es la función printf – El programador que usa printf no siempre conocerá explícitamente como ésta hace para mostrar información en pantalla. – El programador que escribió printf conoce exactamente su funcionamiento interno
  • 42. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 42 12/03/2022 tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N) { intruccion_1; . . . instrucción_N; return expresion; } Estructura de una función en C float suma(float num1, float num2) { float res; res = num1 + num2; return res; } Cuerpo de la función Cabecera de la función Cuerpo de la función Tipo de dato retornado por la función Nombre de la función Argumentos de la función. Variable retornada por la función
  • 43. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 43 12/03/2022 Estructura de una función en C float suma(float num1, float num2) { float res; res = num1 + num2; return res; } Tipo de dato retornado por la función Nombre de la función Argumentos de la función. Variable retornada por la función Puede ser cualquier tipo de dato ordinario (int, char, float, double, etc), un puntero a cualquier tipo de dato, o un dato tipo struct. Una funcion puede o no retornar un valor. Puede empezar por una letra o el carácter _. Después de este puede contener tantas letras como números o _ se deseen. Si embargo el compilador ignora a partir de cierta cantidad Cada parámetro es separado por coma, los tipos de datos manejados para cada argumento pueden ser de cualquier tipo de datos simples o compuestos.
  • 44. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 44 12/03/2022 Conceptos Importantes • Función – Grupo de sentencias bajo el mismo nombre • Llamar a una función – Ejecutar el grupo de sentencias de una función. Para lograrlo solo se escribe el nombre de la función, seguida por una lista de expresiones, separadas por coma y encerradas entre paréntesis. Ejemplo • printf(“%d”, a); • e = abs(x-y)/ abs(x);
  • 45. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 45 12/03/2022 Conceptos Importantes • Argumentos – Se refiere a la lista de expresiones encerradas entre paréntesis. Permiten pasar la información a la función. Ejemplo • printf sabe que imprimir porque se lo indicamos en los argumentos – Existen funciones que no necesitan argumentos • n = GetInteger(); • Retornar – Una vez “llamada” la función, esta hace su trabajo, y regresa al mismo punto donde fue llamada. La función ha “retornado” al punto de llamada, y en la mayoría de los casos, las funciones envían un valor de retorno.
  • 46. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 46 12/03/2022 Analogía • Si una función resuelve un determinado problema, se puede decir que necesita los datos de entrada (argumentos) y genera una salida (valor que retorna). • Es similar a cuando un jefe llama a un trabajador para que efectúe una tarea. Le da las especificaciones (argumentos) y espera. • El trabajador a su vez, recibe esta información, efectúa su trabajo, en la que puede ser que necesite de la ayuda de otros trabajadores y los “llame”. • Cuando termina el trabajo, regresa hacia donde su jefe, y le muestra (retorna) un reporte. • El jefe nunca supo como el trabajador efectuó su trabajo o si uso ayuda.
  • 47. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 47 12/03/2022 Argumentos y Retorno: Aclaraciones • Los datos otorgados a una función, como argumentos, pudieron ser ingresados, por un usuario externo, mucho antes de la llamada a la función. • El resultado que retorna una función, la retorna al programa, para que se pueda usar en este, cuando se desee. No es impresa en pantalla, a menos que el programa así lo indique. void main() { double x, y; printf(“Ingrese un real:”); x = GetReal(); y = sin(x); printf(“El seno de x es: %.2f”, y); } E/S de datos permiten a un programa comunicarse con su usuario externo Argumentos y retorno permiten a una función comunicarse con el programa que la llama
  • 48. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 48 12/03/2022 #include <stdio.h> int main ( ) { printf (“Hello World!n”) ; return 0 ; } Llamada a funciones printf es el nombre de una función predefinida en la librería stdio esta cadena de caracteres la estamos pasando como un argumento (parametro) a la función printf. Esto sería la llamada a la función (function call).
  • 49. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 49 12/03/2022 Librería MATH • La librería math.h permite al programador efectuar cálculos matemáticos comunes Numero Descripcion Ejemplo ceil(x) redondea x al entero mas pequeño no menor que x ceil(9.2) es 10.0 ceil(-9.8) es –9.0 floor(x) redondea x al entero mas grande no mayor que x floor(9.2) es 9.0 floor(-9.8) es –10.0 fabs(x) valor absoluto de x fabs(-9.5) es 9.5 fmod(x,y) residuo de x/y como numero de punto flotante fmod(13.657, 2.333) es 1.992 sqrt(x) raiz cuadrada de x sqrt(9.0) es 3.0 pow(x,y) x elevado a la potencia y pow(2,7) es 128 log(x) logaritmo natural de x(base e) log10(x) log10(x) logaritmo de x(base 10) log(2.718282) es 1 exp(x) funcion exponencial exp(0.1) es 2.71828 sin(x) seno trigonometrico de x(en radianes) sin(0.0) es 0.0 cos(x) coseno trigonometrico de x(en radianes) cos(0.0) es 1 tan(x) tangente trigonometrico de x(en radianes) tan(0.0) es 0
  • 50. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 50 12/03/2022 Ejercicio en Clase • Expresar lo siguiente como una expresión en C 2 2 y x distancia + = Muestre el valor de x tras la ejecución de las siguientes sentencias. Asuma x un real x = fabs(7.5); x = floor(7.5); x = ceil(0.0); x = ceil(-6.4); x = ceil(-fabs(-8 + floor(-5.5)));    cos sin tan =
  • 51. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 51 12/03/2022 Ejercicio • Una aplicación de la función floor es redondear un valor a su entero más próximo. La instrucción: – y = floor(x+0.5); redondeará el número x al entero más próximo, y asignará el resultado a y. Escriba un programa que a 5 números los redondee al número más próximo. Por cada número, imprima tanto el original como la cifra redondeada.
  • 52. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 52 12/03/2022 Declaración de una función en C float suma(float num1, float num2); int max(int x,int y); void imprimir_saludo(void); void imprimir_vector(int v[],int long); int comparar_vectores(int v1[],int v2[]); • La declaración de una función se denomina prototipo. Básicamente, la declaración describe la interfaz de la función. Al declarar una función, básicamente lo que se esta haciendo es especificar la cabecera. • La forma general de la declaración de una función es: • Los nombres de los parámetros se suelen omitir. float suma(float,float); int max(int,int); void imprimir_saludo(void); void imprimir_vector(int [],int); int comparar_vectores(int [],int []); tipo_retorno nombre_funcion(tipo_1,. . ., tipo_N);
  • 53. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 53 12/03/2022 Declaración de Funciones • En C declaramos las variables que vamos a usar • Así mismo, cuando se escribe una nueva función, esta debe ser “declarada”. • Las declaraciones de las funciones de librerías que usamos, están en su respectivo archivo de cabecera(.h) • La declaración de una librería es un poco más elaborada que la de una variable. En una variable solo se indica el tipo y el identificador. En una función, se debe indicar: – El nombre de la función – El tipo de dato de cada argumento, y en muchos casos, un identificador para cada uno. Aquí los argumentos van separados con comas. – El tipo de dato del valor que va a retornar.
  • 54. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 54 12/03/2022 Declaraciones en math.h
  • 55. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 55 12/03/2022 Prototipos de Funciones • La declaración de una función se conoce como el prototipo de esa función. Ejemplo: – double sqrt(double x); • En un prototipo, es opcional especificar un identificador para cada argumento. • Son muy útiles, pues aquel que lo ve, ya puede intentar usar la función, pues conoce sus argumentos y el retorno. • También pueden existir funciones que no tomen argumentos, en estos casos, en el prototipo se incluye la palabra void, y por supuesto, sin identificador: – int GetInteger(void);
  • 56. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 56 12/03/2022 Definición de una función en C • La definición de la función consiste de la cabecera de la función (declarador) y un bloque de función. La cabecera de la función especifica el nombre de la función, el tipo el valor de retorno, y los tipos y nombres de sus parámetros. Las sentencias del bloque de la función específica lo que hace la función. • Declarar una función dentro de otra es algo prohibido • La forma general de la declaración de una función es: tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N) { intruccion_1; . . . instrucción_N; return expresion; } float suma(float num1, float num2) { float res; res = num1 + num2; return res; }
  • 57. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 57 12/03/2022 Creando Funciones • Ya sabemos usar funciones de librerías, pero llega un punto en la vida de un programador que deseará escribir sus propias funciones. • Vamos a escribir una función: – Se nos ha asignado escribir un programa que convierta una temperatura en Celsius a Fahrenheit. Esto se logra con la fórmula. • Seria ideal escribir una función que se encargue de eso, y luego poder usarla cuando deseemos. 32 5 9 + = C F
  • 58. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 58 12/03/2022 Creando Funciones • Para crear una nueva función se debe seguir los pasos: – Especificar el prototipo de la función: Declararla. Esto se hace normalmente luego de las líneas de #include, antes del programa principal. – Especificar los pasos de la función, como esta llevara a cabo su tarea: Implementarla • En nuestro caso, para declarar el prototipo debemos pensar – Que necesitamos que la función genere: • La temperatura en Fahrenheit(real) – Que necesita la función para generar esa información: • La temperatura en Celsius(real) double CelsiusAFahrenheit (double c);
  • 59. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 59 12/03/2022 Implementación • Se puede decir que la implementación se compone de dos partes: – La cabecera, que luce igual que el prototipo, siempre con identificadores para cada argumento, y sin el ; al final – El cuerpo, que es un bloque de sentencias, por lo tanto encerrado entre llaves. Si se van a necesitar variables, se declaran en el bloque. double CelciusAFahrenheit(double c) { /*Cuerpo*/ }
  • 60. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 60 12/03/2022 • Si la función debe generar un valor, esta lo retornará usando la sentencia return dentro del cuerpo de la función. • La forma de usarla es: return (expresión que se debe retornar); • Esto especifica que la función debe terminar, retornando el valor calculado. • Hay funciones que no retornan datos, en este caso, se puede usar return, pero sin mencionar una expresión. return; ¿Cómo Retornar?
  • 61. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 61 12/03/2022 Implementación y Uso • La función ya esta implementada, lista para ser usada (llamada) desde cualquier parte. • Usemos esta función para escribir una tabla de conversión de temperatura desde los 0°C a los 100°C, de 5 en 5. double CelsiusToFahrenheit(double c) { return (9.0 / 5.0 * c + 32); }
  • 62. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 62 12/03/2022 Uso de funciones en C • Una función debe ser declarada antes de ser usada, por ello suele ser común colocar las declaraciones antes de la función main. #include <archivo_cabecera> protipo_funciones; declaracion_variables_globales; int main() { declaracion_variables_locales; funcion_1(); funcion_2(); . . . funcion_N(); return 0; } funcion_1() { codigo_funcion_1; } . . . funcion_N() { codigo_funcion_N; } #include <archivo_cabecera> float suma(float,float); int main() { . . . return 0; } float suma(float num1, float num2) { float res; res = num1 + num2; return res; }
  • 63. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 63 12/03/2022 Invocación (llamada) de funciones en C • Una vez que se han implementado las funciones el siguiente paso consiste en usarlas (es decir invocarlas). • Cuando se ejecuta un programa la primera función que se ejecuta es la función main, por ello su importancia. • Una función puede invocar otra función. #include <stdio.h> float suma(float,float); int main() { f1(); f2(); return 0; } f1(){ . . . } f2() { f3() . . . } main() f1() f2() f3() 1 0 2 3 4 5 6 7
  • 64. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 64 12/03/2022 Invocación (llamada) de funciones en C #include <stdio.h> float suma(float,float); int main() { int a = 3, b = 2, c = 0, d = 3; int e, f, g, h, i, k; d = suma(2,-4); c = suma(a,b); f = suma(2,c++); g = suma(++c,d++); h = suma(suma(1,a),d); suma(2,3); return 0; } float suma(float num1, float num2) { float res; res = num1 + num2; return res; } Una función se puede invocar las veces que se desee. Cuando se invoca un función que retorna un valor se es libre de llevar el valor retornado a una variable.
  • 65. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 65 12/03/2022 #include <stdio.h> #define LIMITEINF 0 #define LIMITESUP 100 #define PASO 5 // Prototipos de Funciones double CelsiusAFahrenheit(double c); /* Programa Principal */ void main() { int c; printf(“Tabla de conversion de Celsius a Fahrenheit.n”); printf(“C Fn”); for(c = LIMITEINF; c <= LIMITESUP; c = c + PASO) printf(“%3d %3gn”,c, CelsiusAFahrenheit(c)); } /* * Funcion CelsiusAFahrenheit * Uso: f=CelsiusAFahrenheit(c); * Esta función retorna el equivalente en Fahrenheit del valor c en Celsius */ double CelsiusAFahrenheit(double c) { return (9.0 / 5.0 * c + 32); } Uso de una Función
  • 66. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 66 12/03/2022 Funciones más Complejas • Nuestra nueva función resuelve un problema sencillo. • Las funciones usualmente son mas complejas, y en su código incluyen las sentencias de control. • Además, las funciones no sólo retornan valores enteros, también pueden retornar cadenas o valores lógicos. • EJERCICIO – Escribir una función MinR en C que indique el menor valor entre dos valores reales.
  • 67. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 67 12/03/2022 Ejercicio en Clase • Escribir la función Factorial en C que permita calcular el factorial de un numero dado. – El factorial de 0 es 1 – El factorial de 1 es 1(1x1) – El factorial de 2 es 2(1x2) – El factorial de 3 es 6(1x2x3) – El factorial de 4 es 24(1x2x3x4) – El factorial de un número dado es la multiplicación de todos los números desde el 1 hasta el mismo.
  • 68. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 68 12/03/2022 Solución int Factorial(int n) { int fact, i; fact = 1; if (n==0) return 1; for(i = 1; i <=n; i++) fact = fact * i; return (fact); } Inicio Fin Recibir n i >=n fact = fact * i; Retornar fact i = i +1; Fact = 1; i = 1;
  • 69. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 69 12/03/2022 Retornando Cadenas • Escribir una función en C que dado un mes (6, 7, 12 ..) retorne su respectivo nombre (Junio, Julio, Diciembre..) – Debe generar la cadena del nombre del mes – Debe recibir el número del mes, un entero. • El prototipo sería: string NombreDeMes(int mes); string NombreDeMes(int mes) { switch(mes) { case 1: return(“Enero”); break; case 2: return(“Febrero”); break; case 3: return(“Marzo”); break; case 4: return(“Abril”); break; case 5: return(“Mayo”); break; case 6: return(“Junio”); break; case 7: return(“Julio”); break; case 8: return(“Agosto”); break; case 9: return(“Septiembre”); break; case 10: return(“Octubre”); break; case 11: return(“Noviembre”); break; case 12: return(“Diciembre”); break; default: return(“Mes no v%clido”,160); } }
  • 70. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 70 12/03/2022 Utilizando la nueva función #include <stdio.h> #include <simpio.h> // Declaración de Funciones string NombreMes(int mes); void main() { int mes,dia,anio; printf(“Ingrese el dia actual:”); dia = GetInteger(); printf(“Ingrese el mes actual:”); mes = GetInteger(); printf(“Ingrese el anio actual:”); anio = GetInteger(); printf(“La fecha ingresada es: %s %d de %d”, NombreMes(mes), dia, anio); }
  • 71. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 71 12/03/2022 Retornando Bool • Si las funciones pueden retornar enteros, y cadenas, porque no van a poder retornar valores lógicos (bool). • Las funciones que retornan valores lógicos se conocen como funciones de predicado. • Llamar a una función de predicado es equivalente a hacer una pregunta donde la respuesta puede ser Verdadera (TRUE) o Falsa (FALSE).
  • 72. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 72 12/03/2022 Ejercicios en Clase • Escribir una función en C que permita determinar si un número es par. • Escribir una función en C que permita determinar si un año es bisiesto. • Escribir un programa imprima los números pares hasta el 10. • Escribir un programa que imprima los años bisiestos desde 1960 hasta el año actual.
  • 73. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 73 12/03/2022 Solución bool EsPar(int n) { return (n%2==0); } bool EsBisiesto(int anio) { return (((anio%4==0)&&(anio % 100!=0) ) || ((anio%400)==0)); } main() { int i; for(i = 1; i <=10; i++) { if(EsPar(i)) printf(“%dn”,i); } } main() { int i; for(i = 1960; i <=2004; i++) { if(EsBisiesto(i)) printf(“%dn”, i); } }
  • 74. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 74 12/03/2022 Comparando Cadenas • Ahora que ya sabemos más de las funciones, estamos listos para conocer algo más de las cadenas. • Los operadores relacionales, sólo pueden aplicarse sobre tipos de datos atómicos, y eso dejaba de lado a las cadenas. • La única forma, por ejemplo, de determinar la equivalencia de dos cadenas, seria a través de una función. • StringEqual es la función de la librería genlib, que permite este tipo de comparaciones. – Compara dos cadenas, que debe recibir como argumentos – Decide si son o no iguales (VERDADERO O FALSO) – Es una función predicado bool StringEqual(string s1, string s2);
  • 75. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 75 12/03/2022 Ejercicio en Clase • Escriba un programa que sume un grupo de números enteros ingresados por teclado. El programa deber permitir el ingreso del número, y luego preguntarle al usuario si desea seguir ingresando. Si la respuesta es no, el programa debe terminar.
  • 76. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 76 12/03/2022 Solución void main() { int suma, n; string respuesta; suma = 0; while(TRUE) { printf(“?”); n = GetInteger(); suma = suma + n; printf(“Desea seguir ingresando:”); respuesta = GetLine(); if(StringEqual(respuesta,”no”)) break; } printf(“La suma es:%d”,suma); } inicio Escribi r(“?”) Suma = 0 Leer(n) ; suma = suma + n Escribir(“De- sea seguir?”) Respuesta == “no” Escribi r(sum a) fin Leer(res -puesta)
  • 77. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 77 12/03/2022 • Hay una mayor complejidad de la mostrada, en el uso de funciones • Tomemos como ejemplo el siguiente programa: #include <stdio.h> #include <simpio.h> //Declaración de funciones int Factorial(int n); void main() { int i; for (i = 0; i < 10; i ++) printf(“%dn”, Factorial(i)); } int Factorial (int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) fact = fact * i; return (fact); } Si vemos sólo la función, tiene sentido, pues se encarga de calcular el factorial de la variable n Si vemos sólo el programa principal, tiene sentido, pues se imprime el factorial de todos los números hasta el 10 Si vemos el programa principal y la función como un todo, puede resultar un tanto confuso: • Hay dos variables con nombre i • En el programa se usa la variable i como el número al que se le calcula el factorial. • En la función la variable a la que se le calcula el factorial se llama n La Verdad detrás de las Funciones
  • 78. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 78 12/03/2022 Paso de Argumentos a Funciones #include <stdio.h> #include <simpio.h> //Declaración de funciones int Factorial (int n); void main() { int i; for (i = 0; i < 10; i ++) printf(“%dn”, Factorial(i)); } int Factorial (int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) fact = fact * i; return (fact); } En el programa principal, se calcula el factorial de i. En la función se calcula el factorial de n ¿Cómo es que hay diferentes identificadores para el mismo valor? La respuesta esta muy relacionada con el concepto de argumento: - En el programa principal, i representa el argumento enviado a la función Factorial. - En la función Factorial, alguna variable debe recibir el enviado, para representar dicho valor. Esta variable puede tener cualquier nombre, en este caso se le dio el nombre n. - Una variable definida en la cabecera de una función, que sirve para recibir el valor de un argumento, se conoce como parámetro.
  • 79. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 79 12/03/2022 #include <stdio.h> #include <genlib.h> int Factorial(int n); main() { int i; for (i = 0; i < 10; i ++) { printf(“%dn”, Factorial(i)); } } int Factorial(int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) { fact = fact * i; } return (fact); } Factorial(0) n 0 n 1 n 2 Factorial(1) Factorial(2) expr 1 expr 1 expr 2 Factorial(3) n 3 expr 6 1 1 2 6 Pasos para llamar a una Función • Se evalúan las expresiones enviadas como argumentos. • El valor de cada argumento es copiado en orden en cada parámetro correspondiente de la función llamada. • Se ejecutan una a una las sentencias del cuerpo de la función hasta que aparece la sentencia return. • Se evalúa la expresión de la sentencia return. • El programa que llamó a la función continúa, reemplazando en el lugar de la llamada, el valor retornado
  • 80. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 80 12/03/2022 Manejo de Variables Dentro de las Funciones (Variables Locales) • En la función Factorial se usa una variable i, y en el programa principal se usa otra variable i, pero no parece que se usaran para lo mismo, ¿son diferentes?. • De hecho, si son diferentes. – Cada función puede usar sus propias variables, y estas sólo serán válidas dentro de la función, se conocen como variables locales. main i 0 Al llamar a la función Factorial, se crean 3 variables locales a Factorial, pueden tener cualquier nombre, en este caso: n, fact e i. Las variables locales del main aun existen, pero, no se pueden ver mientras Factorial este activa. Cuando todo Factorial termina, retorna el valor, y las variables locales al main permanecen iguales como antes de la llamada. La variable i es local a la funcion main Factorial n fact i 0 1 1 main i 0 La variable i es local a la funcion main
  • 81. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 81 12/03/2022 Ejercicio en Clase • Suponga que tienen un grupo de 5 monedas americanas: penny(1 centavo), nickel(5 centavos), dime(10 centavos), quarter(25 centavos). Se desea conocer de cuantas formas diferentes, estas se pueden combinar, para formar un par. Se pueden tomar penny y nickel, o penny y dime, etc • En este ejemplo n es 5 y k es 2. La solución de cuántas combinaciones se puede expresar usando: • Escriba una función en C que permita calcular cuántas combinaciones de k miembros se pueden generar teniendo n objetos. )! ( ! ! ) , ( k n k n k n C −  =
  • 82. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 82 12/03/2022 Llamando Funciones desde otras Funciones • Hasta ahora solo hemos hecho llamadas a funciones desde el programa principal • Pero las funciones se pueden llamar desde cualquier parte del programa, incluso desde otras funciones. • En este ejemplo, la función necesita recibir el número de objetos (n) y el número de miembros (k) de cada combinación, para poder retornar el número de combinaciones posibles. El prototipo: int Combinaciones (int n, int k) { return(Factorial(n)/(Factorial(k)*Factorial(n-k)); } int Combinaciones (int n, int k); La implementación se podría lograr, usando la función Factorial que ya fue implementada:
  • 83. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 83 12/03/2022 Un Programa Completo • A continuación la implementación completa de un programa que hace uso de la función Combinaciones: • Nota: – A este programa le faltan las validaciones de las respectivas entradas.
  • 84. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 84 12/03/2022 #include <stdio.h> #include <genlib.h> #include <simpio.h> /* Prototipos de Funciones */ int Combinaciones(int n, int k); int Factorial(int n); /* Programa Principal */ void main() { int n, k; printf(“Ingrese el numero de objetos(n) ?”); n = GetInteger(); printf(“Ingrese el numero de miembros de la combinacion(k) ?”); k = GetInteger(); printf(“C(%d,%d) = %dn”,n,k,Combinaciones(n,k)); } /* * Funcion Combinaciones * Uso: c = Combianciones(n,k); * Calcula el numero de combinaciones distintas, para elegir k objetos de un grupo de n */ int Combinaciones(int n, int k) { return(Factorial(n)/(Factorial(k)*Factorial(n-k)); } /* * Funcion Factorial * Uso: f = Factorial(n); * Retorna el factorial del argumento n */ int Factorial(int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) { fact = fact * i; } return (fact); }
  • 85. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 85 12/03/2022 Procedimientos • Hemos visto que existen funciones que no retornan ningún valor, como printf: – printf (“Hola Mundon”); • A este tipo de funciones que no retornan nada, y que se llaman únicamente para que ejecuten su código, se les llama procedimientos. • Muchos lenguajes de programación separan totalmente el concepto de funciones, con el de procedimientos, pero C las trata de igual forma. • Un procedimiento en C, es una función sin valor de retorno. – void DarInstrucciones(void); • Los procedimientos pueden recibir tantos argumentos necesite.
  • 86. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 86 12/03/2022 void ImprimirMenu (void) { printf (“1. Tabla de Sumarn”); printf (“2. Tabla de Restarn”); printf (“3. Tabla de Multiplicarn”); printf (“4. Tabla de Dividirn”); printf (“5. Salirn”); } Implementación de Procedimientos
  • 87. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 87 12/03/2022 Refinamiento • Cuando un problema es muy grande, se busca separarlo, para resolver todo por partes. Esto es ventajoso – Las partes más pequeñas son mas fáciles de entender – Si algo falla, el error es mas fácil de encontrar • Esto se conoce como descomposición de un problema • Al escribir un programa, usualmente se piensa en el programa principal (main),y se piensa en las tareas más importantes • Se piensa en dividir el programa en componentes individuales, los cuales pueden ser a su vez, divididos en piezas más pequeñas. • Esto se conoce como diseño top-down, o refinamiento paso a paso.
  • 88. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 88 12/03/2022 • Se requiere escribir un programa que muestre el calendario completo de un año dado, que no puede ser menor a 1900. Dar Instrucciones Ingreso y Validacion de Año Imprimir Mes Mostrar Nombre del Mes Determinar que dia de la semana fue el primer dia del mes Dar el respectivo marqen para el primer dia del mes Un Problema más Grande
  • 89. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 89 12/03/2022 Calendario Dar Instrucciones Pedir Año Imprimir Calendario Imprimir Nombre del Mes Determinar cuantos días trae el mes Determinar el dia de la semana donde cayo el primer dia Imprimir el Margen para el primer dia del mes Imprimir Calendario de c/ Mes Imprimir el resto de días Dependiendo del mes y de si es bisiesto, elegir total de días Calcular el dia de la semana del primer dia del año, contando el total de días desde 1900 hasta el año actual, considerando los años bisiestos Calcular el dia de la semana del primer dia del mes, sumándole al primer dia del año, el total de días hasta el mes actual, considerando el total de días de cada mes
  • 90. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 90 12/03/2022 Conclusiones del Refinamiento • Del refinamiento podemos sacar las funciones que necesitaremos: – Dar instrucciones: • void DarInstrucciones(void) – Pedir año(y validarlo): • int PedirAnio(void); – Imprimir todo el Calendario de un año – void ImprimirCalendario(int anio); • Imprimir el Calendario de un mes, de un año dado – void ImprimirCalendario(int mes, int anio); • Conseguir el nombre de un numero de mes dado – string NombreDeMes(int mes); • Determinar el numero de la semana donde cayo el primer día – int PrimerDiaDelMes(int mes, int anio); • Imprimir margen para primer día – void ImprimirMargen(int dia_semana); – FUNCIONES QUE AYUDAN • Determinar si un año es bisiesto – bool EsBisiesto(int anio); • Determinar el numero de días de un mes, de un año dado – int DiasDeMes(int mes, int anio);
  • 91. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 91 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas, Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 92. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 92 12/03/2022 Recursión • La estrategia a seguir es la delegación de tareas. • Es decir que un problema grande se subdivide en pequeñas tareas, y éstas se delegan. • Implica llamar al mismo procedimiento varias veces.
  • 93. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 93 12/03/2022 La Función Factorial • Esta función fue implementada anteriormente con un lazo for. • La propiedad primordial del factorial es que está relacionada a su anterior valor n!=n*(n-1)! • La función factorial se define como: n! = 1 si n=0 n*(n-1)! En otro caso
  • 94. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 94 12/03/2022 La Función Factorial • Dicha definición es recursiva, porque n! está en términos de (n-1)!, lo cual tiene la misma forma del original. • La implementación de la función en C usando recursión sería: int Factorial(int n) { if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } }
  • 95. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 95 12/03/2022 Manejo Interno de la Recursión • En el proceso de encontrar la respuesta, el computador va hacia los procesos internos, que son las llamadas al mismo procedimiento una y otra vez. • Supongamos que se quiere evaluar fact= Factorial(4); • En el programa principal se hace la primera llamada a la función.
  • 96. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 96 12/03/2022 Primera llamada main Factorial 4 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } ? La función llama a Factorial(n-1), y tan pronto ésta regrese, se ejecuta la operación indicada
  • 97. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 97 12/03/2022 Segunda llamada main Factorial 3 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } ? Factorial Igualmente al anterior caso, aquí se hace otro llamado interno a la función, y la operación no se realiza hasta que se retorne dicho valor
  • 98. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 98 12/03/2022 Tercera llamada main Factorial 2 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } ? Factorial Siguiendo la lógica, se llama a Factorial(1), y éste a su vez llama a Factorial(0), realizándose dos llamadas más a la función Factorial
  • 99. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 99 12/03/2022 Última llamada Factorial 0 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } Factorial Factorial main Factorial Factorial En este punto, la situación varía, como n es 0, la función retorna su resultado inmediatamente return(1);
  • 100. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 100 12/03/2022 Retorno Factorial 1 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } Factorial Factorial Factorial main 1 Desde este punto, se devuelve el retorno a cada llamada recursiva return(1*1);
  • 101. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 101 12/03/2022 Retorno main Factorial 2 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } 1 Factorial Factorial return(2*1);
  • 102. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 102 12/03/2022 Retorno Factorial 3 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } 2 Factorial main return(3*2);
  • 103. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 103 12/03/2022 Retorno main Factorial 4 n if(n==0){ return(1); } else{ return(n*Factorial(n-1)); } 6 return(4*6);
  • 104. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 104 12/03/2022 El Paradigma Recursivo • Toda función recursiva tiene la siguiente estructura: if(Prueba para el caso simple){ return(solución simple sin usar recursión); } else{ return(solución recursiva llamando a la misma función); }
  • 105. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 105 12/03/2022 Otro Ejemplo de Recursión • Otro ejemplo recursivo es el de elevar un número entero a una potencia k. • Su definición es: nk= 1 si K=0 nxnk-1 en otro caso La solución recursiva de este problema es como sigue...
  • 106. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 106 12/03/2022 Otro Ejemplo de Recursión static int ElevarEnteroPotencia(int n, int k) { if(k==0){ return(1); } else{ return(n* ElevarEnteroPotencia(n, k-1)) } }
  • 107. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 107 12/03/2022 Consideraciones • Los problemas vistos, de factorial y número elevado a una potencia, tienen soluciones recursivas naturales, porque: • Se puede identificar el caso más simple. • Se puede aplicar recursividad para descomponer el problema en más simples del mismo tipo. • Existen otros problemas en los que la recursión es un poco más difícil de ver, para tales caso permutaciones son usadas.
  • 108. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 108 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas, Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 109. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 109 12/03/2022 Paso de Parámetros • Hasta ahora vimos y hemos usado una forma sencilla de pasar parámetros a las funciones • Cada parámetro de una función espera y recibe una copia del valor de cada argumento enviado. • Ejemplo: Cree una función que reciba dos valores y los intercambie. • Podríamos decir que el prototipo seria: – void Intercambiar(int a, int b); • Al retornar la función no efectuaría el cambio, como lo deseamos. Recordemos que, al pasar parámetros, se efectúa una copia de los valores. Este tipo de paso de parámetros se conoce como PASO DE PARAMETROS POR VALOR x main y 3 4 Intercambiar a b tmp 3 4 3 3 4 x main y 3 4 main() { int x, y; printf(“Ingrese x:”); x = GetInteger(); printf(“Ingrese y:”); y = GetInteger(); printf(“x = %d, y= %d”, x, y); Intercambiar(x,y); printf(“x = %d, y= %d”, x, y); } void Intercambiar(int a, int b) { int tmp; tmp = a; a = b; b = tmp; }
  • 110. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 110 12/03/2022 Otra Forma de pasar Parámetros • El intercambio en la función anterior no se realiza porque jamás se trabajó con los argumentos. • En el paso de parámetros por valor, la función trabaja con una copia de los argumentos. • Si deseamos que una función manipule sus parámetros, y esto se refleje en los argumentos, se usa PASO DE PARÁMETROS POR REFERENCIA. En este caso: – La función no trabaja con copias – Trabaja directamente con los argumentos – La función no recibe valores, sino que recibe direcciones de memoria… es decir: punteros
  • 111. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 111 12/03/2022 El Intercambio x main y • Para este tipo de problemas, en los cuales necesitamos modificar directamente los datos que se reciben como parámetros, se usa la PASO DE PARÁMETROS POR REFERENCIA • Si la función no va a recibir valores, si no direcciones, el prototipo seria: void Intercambiar(int *a, int *b); 3 4 • Los parámetros a y b son ahora punteros, que representan a los argumentos directamente • Cualquier cambio que se haga sobre a y b se esta haciendo realmente a las variables a las que estos apuntan Intercambiar *a *b tmp 4 3 3 4 3 3 4 x 3 4 3 main y 4 3 main() { int x, y; printf(“Ingrese x:”); scanf(“%d”,x); printf(“Ingrese y:”); scanf(“%d”,y); printf(“x = %d, y= %d”, x, y); Intercambiar(&x,&y); printf(“x = %d, y= %d”, x, y); } void Intercambiar(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } En este caso: a apunta a x, b apunta a y a = &x, b = &y No se envían valores, se envían direcciones
  • 112. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 112 12/03/2022 Un Uso Mas Interesante • El paso de parámetros por referencia es útil: – Cuando deseamos intercambiar valores – Cuando deseamos que una función retorne mas de un valor • Como todos sabemos las funciones solo pueden retornar un valor • Si necesitamos que una función retorne mas de un valor, aquellos valores que necesitamos retornar, deben ser parámetros por referencia. • EJERCICIO EN CLASE – Crear una función que calcule el menor, el mayor y el promedio de un arreglo • Esta función debe retornar 3 valores, usemos parámetros por referencia • Si la función retorna mas de 1 valor, podemos declararla como void…convirtiéndose en un procedimiento. • void CalcularValores(int arreglo[], int n, int *mayor, int *menor, int *promedio); Los datos que vamos a retornar, se declaran como parámetros por referencia
  • 113. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 113 12/03/2022 Solución • Los cálculos hechos se almacenaran en los parámetros por referencia: void CalcValores(int arr[], int n, int *menor, int *mayor, float *promedio){ int i, total; *menor = arr[0]; *mayor = arr[0]; total = 0; for(i = 0; i < n; i++){ if(arr[i] < *menor) *menor = arr[i]; if(arr[i] > *mayor) *mayor = arr[i]; total = total + arr[i]; } *promedio = total/ n; } La función no tiene explícitamente una sentencia return. Se trabaja directamente con los parámetros recibidos. Estos son direcciones, para trabajar con ellas, usamos el operador *
  • 114. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 114 12/03/2022 Advertencia • El paso de parámetros por referencia no debe reemplazar al paso de parámetros por valor. • Solo se usan parámetros por referencia cuando sea imperiosamente necesario. • Las funciones, aquellas que retornan valores son: – Fáciles de entender y seguir por cualquier programador. – El valor que retornan se puede asignar a una variable. – No así con los procedimientos.
  • 115. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 115 12/03/2022 Contenido • Diseño descendente • Módulos, cohesión – Modularidad: Funciones propias del lenguaje de programación. • Sub-programas Funciones y Procedimientos. Declaración y definición. • Recursividad • Paso de parámetros por valor y referencia. • Construcción de Librerías (Bibliotecas)
  • 116. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 116 12/03/2022 Diseño De Una Interfase • Las funciones y los procedimientos nos ayudan a reducir la complejidad de los programas. • Una interfase le da a un programador cliente, acceso a un grupo de funciones. • Para añadir una función a una interfase, debemos hacerlo con un cierto criterio.
  • 117. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 117 12/03/2022 Criterios Para Diseñar una Interfase • Una interfase bien diseñada, debe cumplir los siguientes requisitos: – Unificación – Simplicidad – Suficiencia – Generalidad – Estabilidad
  • 118. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 118 12/03/2022 Unificación • Las funciones (herramientas) dentro de una librería, deben ser escogidas, de acuerdo a un cierto tema. • La unificación también se refiere al enfoque que se le da a un problema dentro de la misma librería. • Por ejemplo: – Todas las funciones de la librería grafica consideran que las coordenadas están especificadas en píxeles, y que la coord. 0,0 esta ubicada en la esquina superior izq. de un objeto. – Una función que trabaje con coordenadas en pulgadas, no conservaría la unificación.
  • 119. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 119 12/03/2022 Simplicidad • Al diseñar una interfase, el objetivo principal es reducir la complejidad, a través del uso de ciertas funciones. • Se trata de proteger al cliente de los detalles complicados. • La complejidad de la implementación se queda en el lado del creador de la librería. • Se “esconde” información del cliente, no se mencionan detalles en la interfase, ni siquiera a través de comentarios. • Las funciones también deben ser diseñadas lo más simples posibles: – Reduciendo el número de parámetros al mínimo. – Limitando el total de funciones de la interfase, para no abrumar al cliente y confundirlo.
  • 120. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 120 12/03/2022 Suficiencia • Que exista simplicidad, no implica que se debe sacrificar la suficiencia. • Al cliente se lo debe proveer de la mayor cantidad de posibilidades de trabajo. • Negarle a un cliente una posibilidad de trabajo es fracasar en el diseño de una interfase. • Además de que las posibilidades estén disponibles, estas deben funcionar eficientemente. • El cliente debe poder confiar en que los resultados dados por una librería, siempre serán correctos, y que llegaran a el a tiempo. • Estos detalles tienen más que ver con la implantación que con la interfase, pero son estrategias que no debemos pasar por alto.
  • 121. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 121 12/03/2022 Generalidad • Una interfase que solo se adapta a las necesidades de un cliente en particular, puede que no sirva para otros. • Una interfase debe ser lo suficientemente general, para resolver un buen grupo de posibilidades. • Al crear una interfase debemos olvidarnos de nuestro punto de vista y ponernos en el lugar de todos los posibles clientes.
  • 122. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 122 12/03/2022 Estabilidad • Si la interfase no cambia, los clientes no tienen porque cambiar sus programas. • Un creador puede perfectamente hacer cambios a su librería, y si diseño correctamente su interfase, estos cambios no afectarán a los clientes. • Los cambios que haga el creador se harán en la implementación de la librería. • Cuando se haga un cambio en la interfase, todos los clientes deberán cambiar sus programas. • Usualmente estos cambios son profundos y no se hacen frecuentemente.
  • 123. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 123 12/03/2022 Al Azar • Todos hemos usado juegos de computadoras. • El buscaminas, por ejemplo: – Nunca se repiten las localidades de las minas. – Estas fueron ubicadas al azar. • Lograr que la computadora simule un comportamiento “al azar” o “aleatorio” es muy útil para ciertas aplicaciones. • Sin embargo, esto encierra un cierto nivel de complejidad. • Deseamos esconder esa complejidad, usando una interfase.
  • 124. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 124 12/03/2022 Números Pseudo-Aleatorios • Un comportamiento determinístico es aquel, en que las acciones son completamente predecibles. • Las computadoras tienen un comportamiento determinístico, no pueden generar resultados impredeciblemente. • Pero pueden simularlo, partiendo de un procedimiento determinístico. Los números generados, parecerán ser aleatorios.
  • 125. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 125 12/03/2022 Generación de Números Aleatorios • La librería en stdlib, incluye en su interfase la función: – int rand(void); • El entero que retorna es un número pseudo aleatorio no negativo, ni mayor a una constante RAND_MAX #include <stdio.h> #include <stdlib.h> #include <genlib.h> void main() { int i, r; printf("En esta computadora RAND_MAX: %d", RAND_MAX); for(i = 0; i < 10; i++) { r = rand(); printf("%dn",r); } }
  • 126. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 126 12/03/2022 Ejercicio En Clase • Escribir un programa que simule el lanzamiento de una moneda. El programa deber “lanzar” 10 veces una moneda e indicar si cayo “Cara” o “Cruz”. • Para resolver este problema debemos recordar que rand() nos da un numero entre 0 y RAND_MAX, es decir, RAND_MAX + 1 posibilidades. • Nosotros, no deseamos RAND_MAX + 1, deseamos, 2 posibilidades: RAND_MAX 0 RAND_MAX/2 CARA CRUZ Podríamos decir, que todos los números menores o iguales que RAND_MAX/2 representarían la opción 1(Cara) y Todos los números mayores que RAND_MAX/ 2 representarían la opción 2(Cruz).
  • 127. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 127 12/03/2022 Solución #include <genlib.h> #include <stdio.h> #include <simpio.h> #include <stdlib.h> void main() { int i, r; printf("Simulacion del lanzamiento de Monedasn"); for(i=1; i <= 10; i++){ printf("Lanzamiento No. %dn",i); r = rand(); if(r<=RAND_MAX/2){ printf("CARAn"); } else { printf("CRUZn"); } } }
  • 128. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 128 12/03/2022 Ejercicio En Clase • Estuvo bien, y acertada nuestra decisión de dividir para 2, pues las posibilidades casi se repartieron por la mitad. • Escribir un programa que simule el lanzamiento de un dado, e indique el número de lado en que cayo. • Recordemos, ahora si tenemos 6 posibilidades, deberíamos dividir nuestro rango, para 6 El tamaño de cada division td = RAND_MAX/6 td 2*td 3*td 4*td 5*td 0 RAND_MAX 1 2 3 4 5 6
  • 129. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 129 12/03/2022 Solución #include <stdio.h> #include <stdlib.h> void main() { int r,td; td = RAND_MAX/6; printf("Simulacion del lanzamiento de un Dadon"); r = rand(); if(r<=td){ printf("Lado 1n"); }else if(r<=td*2){ printf("Lado 2n"); }else if(r<=td*3) { printf("Lado 3n"); }else if(r<=td*4) { printf("Lado 4n"); }else if(r<=td*5) { printf("Lado 5n"); }else { printf("Lado 6n"); } }
  • 130. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 130 12/03/2022 El Problema y su Generalización • Ahora pensemos en otro tipo de aplicación. Se nos pide escribir un programa que “escoja” una carta de un mazo: – En ese caso, la computadora debería generar un número entre 1 y 52. – Seguir el mismo proceso anterior, con 52 posibilidades significaría escribir muchas líneas de código. • Se necesita ahora, escribir un programa que simule el modelo de la ruleta Europea, donde el rango es de 0 a 36: – Aunque el procedimiento es parecido, el programa anterior es completamente inútil. • Debe existir una forma de generalizar el proceso de limitar el rango de un número generado aleatoriamente: – La forma más correcta de generalizar algo para su uso continuo, es a través de una función. – Cualquier aplicación que necesite generar un número aleatorio en un rango dado, podrá usar nuestra nueva función.
  • 131. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 131 12/03/2022 d Una Nueva Herramienta • Nuestra función generará un número entero, en un rango dado por un limite inferior y uno superior: – int RandomInteger(int v_inf, int v_sup); • El proceso a seguir es el siguiente: – Generar un entero entre 0 y RAND_MAX(r) – Normalizar r, para convertirlo en un número real d entre 0 y 1( 0 <= d < 1) – Escalar el valor d, multiplicándolo por el tamaño del rango deseado, esto ubicará a d en el rango de 0 a v_sup-v_inf – Truncar el valor generado, pues deseamos generar un entero(k) – Trasladar el entero(k) al rango correcto, de v_inf a v_sup 0 RAND_MAX r 1 v_sup-v_inf d v_sup v_inf k
  • 132. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 132 12/03/2022 Implementación int RandomInteger(int v_inf, int v_sup) { int r,k; double d; r = rand(); d = (double) r / (double) (RAND_MAX +1); d = d * (v_sup-v_inf+1); k = (int) d + v_inf; return k; }
  • 133. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 133 12/03/2022 Usando La función • Simulación del lanzamiento de 10 monedas int RandomInteger(int v_inf, int v_sup); main(){ int i, r; printf("Simulacion del lanzamiento de Dadosn"); for(i = 1; i <=10; i++){ printf("Lanzamiento No. %d:", i); r = RandomInteger(1,6); printf("Lado %dn",r); } }
  • 134. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 134 12/03/2022 Otro Problema sobre el mismo Tema • Que esperamos que suceda cuando volvamos a correr el programa cliente?. • Lo normal, es esperar que el computador genere otra tanda de números en un orden completamente diferente. • Recordemos, que el computador solo puede simular que genera números al azar. • Con cada “corrida” del programa, el computador generará el mismo grupo de números.
  • 135. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 135 12/03/2022 La Semilla de la Generación • El proceso básico con el cual el computador “genera” números “al azar”, es partiendo de un número inicial. • Usando ese número, la computadora efectúa sus cálculos, y nos muestra un número que no esperábamos. • Su nuevo número “inicial” es ahora el último valor calculado. • Este número “inicial” que la computadora usa para sus cálculos, se conoce como “semilla”. • A menos que se indique la computadora siempre usará la misma semilla en cada “corrida” de un programa. Proceso de Calculo SEMILLA VALOR “AL AZAR” No. 1 Proceso de Calculo VALOR “AL AZAR” No. 1 VALOR “AL AZAR” No. 2
  • 136. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 136 12/03/2022 Como Cambiar La Semilla • La librería stdlib provee una función con la que podemos cambiar la semilla: – void srand(int); • La semilla debe ser un entero. • La idea es que con cada corrida de un programa, la semilla cambie. • Lo único que sabemos que siempre esta cambiando, es el tiempo, podemos usarlo en este caso. • La librería time contiene funciones para conocer y modificar la fecha, y la hora local: – La función time devuelve el numero de segundos transcurridos desde las 00:00:00 del primero de Enero de 1970. • La expresión que permitirá cambiar la semilla de acuerdo al tiempo: – srand((int) time(NULL));
  • 137. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 137 12/03/2022 Otra Herramienta • Todo programa que use números aleatorios, debería modificar la semilla. • Para usar la expresión srand, se debe conocer: – El proceso de generación de números aleatorios. – La existencia de la función time, de la librería time. • En conclusión, existe una cierta complejidad en este proceso, que se puede esconder usando un procedimiento: – void Randomize(void); void Randomize(void){ srand((int) time(NULL)); }
  • 138. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 138 12/03/2022 Construcción de una Librería Propia • Ahora poseemos dos herramientas para trabajar con números aleatorios. • Lo ideal aquí es crear nuestra propia librería. • Las librerías que crearemos, son archivos de extensión .lib • Para lograrlo se deben seguir ciertos pasos: – Crear un proyecto, de tipo Librería estática – Añadir al proyecto un archivo de cabecera (para la interfase). Aquí se añadirán: • Prototipos • Declaraciones de constantes • Nuevos tipos de datos – Añadir al proyecto un archivo .c que contendrá la implementación de las herramientas declaradas en la interfase. – Al terminar, se creará un archivo de extensión .lib, que será nuestra nueva librería.
  • 139. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 139 12/03/2022 Crear El Proyecto Vamos a crear una librería estática
  • 140. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 140 12/03/2022 Añadir Los Archivos Añadimos el archivo de cabecera(la interfase) de ext. *.h Falta añadir el archivo *.c, para la implementacion El archivo *.c Ahora ya estan incluidos todos los archivos de nuestro paquete y podemos continuar Continuar, el resto de pasos, son los mismos para crear un proyecto normal Aquí ya aparecerá elegida la opción de librería estática, no se debe cambiar Nuestra librería se llamará random.lib y aquí se indica el directorio donde se creará
  • 141. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 141 12/03/2022 ¿Cómo Crear La Interfase? • La interfase, es, como ya sabemos, la cara que una librería, da a un cliente. • En una interfase se pueden incluir: – Prototipos de funciones – Declaraciones de constantes (usando #define) – Declaraciones de nuevos tipos de datos (veremos como más adelante) • Esto quiere decir que jamás se incluirá implementación en una interfase. • El formato general de una interfase es: #ifndef _nombre_h #define _nombre_h /*Líneas de #include para librerías que se vaya a usar*/ /*prototipos de funciones*/ /*definición de constantes*/ /*declaraciones de nuevos tipos de datos*/ #endif El nombre de la librería En programas complejos, una interfase puede ser incluida en varios archivos .c, para evitar “confusiones” se pregunta si la intefase no ha sido usada aun (ifndef: if not defined) Si no ha sido usada, se define, caso contrario, se ignoran todas las declaraciones de la misma
  • 142. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 142 12/03/2022 Nuestra Nueva Interfase
  • 143. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 143 12/03/2022 La Implementación Se debe incluir la interfase, random.h Al incluirla, asegúrese de encerrarla entre “”, y no entre <> Si al compilar(Compile- Make), todo tuvo éxito, estamos listos para usar nuestra librería
  • 144. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 144 12/03/2022 Un Programa Cliente • Ahora podemos ponernos del lado del cliente, como hace para usar esta nueva librería? • Nuestro nuevo programa usara la librería para simular el lanzamiento de 10 dados. Al crear el nuevo proyecto, como cliente, se añade la nueva librería, con su ruta completa. Para evitar esto, la solucion es copiar random.lib en el directorio lib del compilador Al incluir la interfase, también debe indicarse la ruta completa. Esto siempre y cuando el archivo .h se encuentre en un directorio diferente del directorio de trabajo o del directorio include del compilador
  • 145. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 145 12/03/2022 Evaluación de una Interfase • Ahora podemos evaluar nuestra interfase, usando los criterios mencionados al comienzo: – Unificada: las herramientas de la interfase comparten un tema en común: los números aleatorios, por lo tanto, si es unificada. – Simple: no le hemos usado mucho, pero con el programa cliente podemos darnos una idea de que en realidad esconde la complejidad correctamente y las herramientas son muy fáciles de usar. – Suficiente: realmente las herramientas no cubren todo lo que un cliente pueda desear hacer con los números aleatorios. Aun le falta por desarrollar. – General: las herramientas disponibles son bastante generales, en el sentido de que no están limitadas a un solo tipo de cliente. • Este seria el caso, si la interfase solo incluyera funciones para simular que un dado es lanzado, o para simular que una carta es escogida. • En cambio la interfase provee las herramientas para desarrollar cualquiera de esas funciones – Estable: si la interfase satisface los requerimientos anteriores, probablemente podrá permanecer estable por un buen tiempo
  • 146. Algoritmos y Lógica de Programación Carrera de Software Ph.D. Franklin Parrales 146 12/03/2022 Programación modular Unidad 4 Final de la unidad Y del curso…. !Muchas gracias a todos!