You are on page 1of 42

LOGO UNIVERSIDAD ESTATAL

PENNSULA DE SANTA ELENA


UPSE

ogramacin Avanzada (Lenguaje


Docente:
Ing. Alexis Rocha Haro, MGTI
Ingeniero en Sistemas Computacionales
Magster en Gerencia de Tecnologas de la Informacin
Email: arocha@upse.edu.ec
alefroch22@hotmail.com
La Libertad,
Santa
Elena, Ecuador
Lenguaje
Estructurado
C y C++

Evaluacin de la Materia
Evaluacin:
Exmenes

Lecciones

Deberes

50%

20%

10%

Participacin
en Clase

Bibliografa Bsica:
Joyanes Aguilar Luis (2008). Fundamentos de
Programacin: Algoritmos, Estructuras de Datos y
Objetos (4ta. Edicin) Madrid. Editorial: McGraw Hill.
Pginas: 201 243, 285 306, 519 549.
Bibliografa Recomendada:
Corona Nakamura Mara Adriana, Ancona Valdez Mara
de los ngeles (2011). Diseo de algoritmos y su
codificacin en lenguaje C (1era. Edicin) Mxico.
Editorial: McGraw Hill. Pginas: 27 127, 171 237.
Cair Battistutti Osvaldo (2006). Fundamentos de
Programacin: Piensa en C (1era. Edicin) Mxico.
Editorial: PEARSON Educacin. Pginas: 137 168, 253
281.

Proyecto

Talleres

10%

10%

Qu se quiere aprender al finalizar el Captulo 1?


Comprender el rol de las funciones en un programa de C.
Comprender parmetros y mbitos de variables.
Establecer el cdigo de funciones para reutilizar en su
programa.
Emplear la recursividad resolviendo problemas de
matemtica bsica.

LOGO

Captulo 1
Funciones y Recursividad

Unidad 1 Funciones y Recursividad


CONTENIDOS
1.1. Introduccin a Funciones.
1.2. Estructura y Parmetros de una Funcin.
1.3. mbito de una Variable.
1.4. Funciones de Caracter y Cadenas.
1.5. Recursividad.
1.6. Ejercicios de Aplicacin.
1.7. Evaluacin de la Unidad.

Introduccin a Funciones
Una de las mejores maneras de redactar un programa, es comenzar con el
objetivo general y luego dividirlas en tareas ms pequeas.
Una Funcin es un mdulo de cdigo aislado que se ejecuta y controla
desde la funcin Main(), en lugar de codificar un programa muy largo,
deber escribir varias subrutinas ms pequeas denominadas Funciones.
PROGRAMA
Objetivo General
Mdulos
Mdulo Estructurado
Mdulo Principal
main()
Ingresar
datos
1.1. Introduccin a Funciones

Validar

Decisiones

Imprimir
totales

Conceptos Bsicos sobre Funciones


Prototipo de Funciones:
Es definir las funciones con las que se va a trabajar, se las declara antes de la
Funcin Principal Main().
En general, las funciones de C obedecen a las siguientes reglas:
Cada funcin debe tener un nombre que las identifique.
Los nombres son elegidos o designados por el programador, de acuerdo con
las mismas reglas que rigen para la asignacin del nombre de variables.
Todos los nombres de funciones llevan un juego de parntesis, como se
indica a continuacin:
Funciones();
Esto le ayudar a diferenciarlos de las variables.
El cuerpo de cada funcin debe estar encerrado entre llaves, por lo tanto,
es un bloque que contiene dentro suyo, una o ms funciones.
Una Funcin es un mdulo de un programa separado del cuerpo principal,
que realiza una tarea especfica y que puede regresar un valor a la parte
principal del programa u otra funcin o procedimiento que la invoque.

Alcance de una Variable


Es el rea donde una variable puede utilizarse, si una funcin reconoce a
una variable, se dice que esa variable resulta visible para la funcin, el
alcance protege a las variables que se encuentran presentes en una funcin,
de que otras funciones puedan sobrescribirlas, existen 4 tipos:
1) Variables Globales, son variables reconocibles desde cualquier sentencia
de un programa, son accesibles y compartidas por todas las funciones
definidas dentro de un archivo.
2) Variables Locales (Automticas), pueden ser vistas y modificadas, slo
desde la funcin en la cual se encuentran definidas, se utilizan dentro del
contexto de un bloque de cdigo, se inicializan y destruyen cuando termina
el cdigo de ese bloque, es el tpico ejemplo de variables dentro de una
funcin.
3) Variables Externas, son llamadas desde otro archivo, si se quiere utilizar
una variable global definida en un archivo externo, es necesario declararla
usando extern.
4) Variables Estticas, Hace que una variable global limite su alcance al
archivo en el que est declarada. Por otro lado usada, dentro de una
funcin, mantiene su valor en las diferentes llamadas a la funcin. El
ejemplo tpico es una funcin recursiva.

Ejemplo de Variables Globales

Ejemplo de Variables Locales o Automticas

En este ejemplo, la variable i de la funcin my_function es independiente de la


i de la funcin Main.

Ejemplo de Variables Externas

Ejemplo de Variables Estticas

Transferir Variables entre Funciones


Para transferir una variable local de una funcin a otra, se debe ubicar la
variable local entre parntesis, tanto en la Funcin Emisora como en la
Funcin Receptora.
Ejemplo 1:
El siguiente programa contiene 2 definiciones de funciones (Main e Imprimir)
#include <stdio.h>
#include <conio.h>
void main(void);
Imprimir(int i);
void main()
{
int i=5;
clrscr();

Imprimir(i);
printf("\n\n\t El nuevo valor de i es: %d , i);
getch();
return;

Estructura de una Funcin


La estructura general de una funcin es:
Tipodato Nombfun(parametros)
{
Instrucciones;
return [dato, var, expresion];
}
Tipodato especifica el tipo de dato que regresar la funcin.
La instruccin RETURN es quien regresa un y solo un dato a la parte del
programa que la est llamando o invocando, sin embargo es de considerar que
return puede regresar un dato, una variable o una expresin algebraica (no
ecuacin o frmula), como los siguientes ejemplos:
a) return 3.141516;
b) return rea;
c) return x + 15/2;

1.2. Estructura y Parmetros de una Funcin

Parmetros de una Funcin


La lista de parmetros formales es una lista de variables separadas por
comas (,) que almacenarn los valores que reciba la funcin, estas variables
actan como locales dentro del cuerpo de la funcin.
Aunque no se ocupen los parmetros, los parntesis son requeridos.
Ejemplo 1 Funcin sin Parmetros
Imprimir();
void Imprimir();
int Imprimir();
float Imprimir();
Ejemplo 2 Funcin con Parmetros
float fun1(float b, float a);
INSTRUCCIN RETURN
Dentro del cuerpo de la funcin debe haber una instruccin return cuando
menos para regresar un valor, esta instruccin permite regresar datos.
Cuando se llame a una funcin deber haber una variable que reciba el valor
que regresar la funcin, es decir generalmente se llama una funcin
mediante una sentencia de asignacin, por ejemplo resultado=funcin(5,
3.141516);

Ejemplo de Funciones con Parmetros


#include <stdio.h>
#include <conio.h>
//Todos los procedimientos y funciones deben declararse antes del main
float fun1(float b, float a);
void main()
{
//Variables
int base, altura;
float area;
clrscr();
printf(Dame base: ); scanf(%d,&base);
printf(Dame altura: ); scanf(%d,&altura);

//Llamando o Invocando la funcin


area = fun1(base, altura);
printf(Area = %.2f , area);
getchar(); getchar();

float fun1(float b, float a)


{
return b * a / 2;
}

Usar de preferencia solo ints, floats y doubles como parmetros.


Es permitido poner ms de un return en el cuerpo de instrucciones, sobre
todo en condiciones, pero solo un return se ejecutar, por ejemplo:
if (suma >=10)
{
return 10;
}
else
{
return 20;
}

Clases Usuales de Funciones


1er. Tipo
Son de tipo computacional, son diseadas para realizar operaciones con los
argumentos y regresan un valor basado en el resultado de esa operacin.
2do. Tipo
Son aquellas que manipulan informacin y regresan un valor que indican la
terminacin o la falla de esa manipulacin.
3er. Tipo
Son aquellas que no regresan ningn valor, es decir, son estrictamente
procedurales o procedimentales.
Esto quiere decir, que en general, toda operacin o clculo en un programa
deber convertirse a una o muchas funciones y el resto debern ser
procedimientos.

mbito de una Variable


El mbito es el contexto que tiene un nombre dentro de un programa, el
mbito determina en qu partes del programa una entidad puede ser usada.
Esto sirve para que se pueda volver a definir una Variable con un mismo
nombre en diferentes partes del programa sin que hayan conflictos entre
ellos.
Si
una
variable
es
declarada
dentro
de
un
bloque
(mtodo/funcin/procedimiento), sta ser vlida solo dentro de ese
bloque y se destruir al terminar el bloque. Adicionalmente, la variable no
podr verse ni usarse fuera del bloque (en el exterior del bloque). La
variable dentro del bloque es unaVariable Localy solo tiene alcance
dentro del bloque que se cre y sus bloques hijos, pero no en bloques
hermanos ni padres, una variable definida fuera de cualquier bloque es
unaVariable Global y cualquier bloque puede acceder a ella y modificarla.
Las reglas de mbitos dicen cuando es vlida una variable, dnde se crea y
cundo se destruye (es decir, sale de mbito). El mbito de una variable se
extiende desde el punto donde se define hasta la primera llave que
empareja con la llave de apertura antes de que la variable fuese definida.
Eso quiere decir que un mbito se define por su juego de llaves ms
cercanas. Para ilustrarlo:
1.3. mbito de una Variable

Funciones de Caracter y Cadenas


Caracteres

Valor entero representado como caracter entre


comillas simples. Por ejemplo: 'z' representa al valor
entero de z
Internamente se representa como un tipo de dato
enumerado usando el cdigo ASCII (cdigo estndar
americano para el intercambio de informacin).

Cadenas

Es un arreglo de caracteres que:


Puede incluir letras, dgitos y caracteres especiales
(*, /, $)
Tiene un puntero al primer caracter
Cuyo valor de la cadena es la direccin de memoria
del primer elemento.

1.4. Funciones de Caracter y Cadenas

Propiedades Importantes del Cdigo ASCII


1) Los cdigos para los caracteres que representan
dgitos del 0 al 9 son consecutivos.
2) Las letras en el alfabeto estn divididos en dos
rangos: uno para las maysculas (A-Z) y otro para las
minsculas (a-z). Sin embargo dentro de cada rango
los valores ASCII son consecutivos.

Constantes de Tipo Caracter


Es un estndar para referirse a un caracter
especfico en C.
Para referirse al cdigo ASCII de la letra A, se
especifica A, el cual es el 65.
Para referirse al cdigo del caracter 9, de forma
similar, 9.
NOTA: El referirse al caracter, no es lo mismo que
referirse al valor entero, el 9 es diferente del 9.

Operaciones con Caracteres


Se puede:
Sumar un entero a un caracter.
Restar un entero a un caracter.
Restar un caracter de otro.
Comparar dos caracteres entre s.
NOTA: Al sumar o restar, el resultado no debe salirse
del rango de representacin ASCII.

Manejo de Cadenas
Definicin
Como un arreglo de caracteres o una variable de tipo char *
char color[] = "blue";
char *colorPtr = "blue";
Recuerde que una cadena se representa como un arreglo de
caracteres y termina con '\0'
color tiene 5 elementos
Lectura
Utilizando scanf

scanf("%s", cadena);

Copia la entrada en el arreglo cadena[]


No se necesita el & (porque una cadena es un puntero)
Recuerde dejar espacio en el arreglo para el fin de cadena'\0
Otra manera es utilizando gets
gets(cadena);
Escritura
Utilizando printf
printf(%s,cadena);

Ejemplos

char RandomLetra(void)
{
return (RandomInteger (A,
Z));
}

bool esMayuscula (char ch)


{
return (ch >= A && ch <=Z);
}

bool esDigito (char ch)


{
return (ch >= 0 && ch <=9);
}

bool esMinuscula (char ch)


{
return (ch >= a && ch <=z);
}

Interfaces tiles
La interfaz ctype.h
Contiene un gran nmero de funciones para determinar el tipo
de carcter, entre las principales tenemos:
islower(ch) retorna TRUE si el carcter ch es minscula
isupper(ch) retorna TRUE si el carcter ch es mayscula
isalpha(ch) retorna TRUE si ch es un valor alfabtico
isdigit(ch) retorna TRUE si ch es un dgito
isalnum(ch) retorna TRUE si ch es un valor alfanumrico
ispunct(ch) retorna TRUE si ch es un smbolo de puntuacin
isspace(ch) retorna TRUE si ch es un carcter en blanco

ctype.h: Librera de manejo de caracteres


Prototype

Description

int isdigit( int c );

Returns true if c is a digit and false otherwise.

int isalpha( int c );

Returns true if c is a letter and false otherwise.

int isalnum( int c );

Returns true if c is a digit or a letter and false otherwise.

int isxdigit( int c );

Returns true if c is a hexadecimal digit character and false otherwise.

int islower( int c );

Returns true if c is a lowercase letter and false otherwise.

int isupper( int c );

Returns true if c is an uppercase letter; false otherwise.

int tolower( int c );

If c is an uppercase letter, tolower returns c as a lowercase letter. Otherwise, tolower


returns the argument unchanged.

int toupper( int c );

If c is a lowercase letter, toupper returns c as an uppercase letter. Otherwise, toupper


returns the argument unchanged.

int isspace( int c );

Returns true if c is a white-space characternewline ('\n'), space (' '), form feed
('\f'), carriage return ('\r'), horizontal tab ('\t'), or vertical tab ('\v')and false
otherwise

int iscntrl( int c );

Returns true if c is a control character and false otherwise.

int ispunct( int c );

Returns true if c is a printing character other than a space, a digit, or a letter and false
otherwise.

int isprint( int c );

Returns true value if c is a printing character including space (' ') and false otherwise.

int isgraph( int c );

Returns true if c is a printing character other than space ( ' ') and false otherwise.

stdlib.h: Librera de funciones de conversin


Convierte cadenas de dgitos a enteros y valores de punto
flotante.

Function prototype

Function description

double atof( const char *nPtr );

Converts the string nPtr to double.

int atoi( const char *nPtr );


long atol( const char *nPtr );
double strtod( const char *nPtr, char
**endPtr );
long strtol( const char *nPtr, char
**endPtr, int base );
unsigned long strtoul( const char
*nPtr, char **endPtr, int base );

Converts the string nPtr to int.


Converts the string nPtr to long int.
Converts the string nPtr to double.
Converts the string nPtr to long.
Converts the string nPtr to unsigned long.

stdio.h: Librera de ingreso y salida de datos

Function prototype

Function description

int getchar( void );

Inputs the next character from the standard input and returns it as an integer.

char *gets( char *s );

int putchar( int c );


int puts( const char *s );
int sprintf( char *s, const
char *format, ... );
int sscanf( char *s, const
char *format, ... );

Inputs characters from the standard input into the array s


until a newline or end-of-file character is encountered. A
terminating null character is appended to the array.
Prints the character stored in c.
Prints the string s followed by a newline character.
Equivalent to printf, except the output is stored in the
array s instead of printing it on the screen.
Equivalent to scanf, except the input is read from the array
s instead of reading it from the keyboard.

string.h: Librera de manipulacin de cadenas


Incluye funciones para:
Manipular cadenas.
Bsqueda en cadenas.
Manejo de tokens.
Determinar la longitud de cadenas.
Function prototype

Function description

char *strcpy( char


*s1, const char *s2 )
char *strncpy( char
*s1, const char *s2,
size_t n )
char *strcat( char
*s1, const char *s2 )

Copies string s2 into array s1. The value of s1 is returned.

char *strncat( char


*s1, const char *s2,
size_t n )

Copies at most n characters of string s2 into array s1. The value of s1


is returned.
Appends string s2 to array s1. The first character of s2 overwrites the
terminating null character of s1. The value of s1 is returned.
Appends at most n characters of string s2 to array s1. The first
character of s2 overwrites the terminating null character of s1. The
value of s1 is returned.

Funciones de comparacin de cadenas


int strcmp( const char *s1, const char *s2 );
Compara string s1 con s2
Retorna:
Un nmero negativo si s1 < s2
Cero,si s1 == s2
Un nmero positivo si s1 > s2
int strncmp(const char *s1,const char *s2,size_t n);
Compara n caracteres de s1 en s2
Retorna valores como los anteriores

Funciones de bsqueda
Function prototype

Function description

char *strchr( const char *s,


int c );

Locates the first occurrence of character c in string s. If c is found, a


pointer to c in s is returned. Otherwise, a NULL pointer is returned.

size_t strcspn( const char


*s1, const char *s2 );

Determines and returns the length of the initial segment of string s1


consisting of characters not contained in string s2.

size_t strspn( const char


*s1, const char *s2 );

Determines and returns the length of the initial segment of string s1


consisting only of characters contained in string s2.

char *strpbrk( const char


*s1, const char *s2 );

Locates the first occurrence in string s1 of any character in string s2.


If a character from string s2 is found, a pointer to the character in
string s1 is returned. Otherwise, a NULL pointer is returned.

char *strrchr( const char *s,


int c );

Locates the last occurrence of c in string s. If c is found, a pointer to c


in string s is returned. Otherwise, a NULL pointer is returned.

char *strstr( const char *s1,


const char *s2 );

Locates the first occurrence in string s1 of string s2. If the string is


found, a pointer to the string in s1 is returned. Otherwise, a NULL
pointer is returned.

char *strtok( char *s1, const


char *s2 );

A sequence of calls to strtok breaks string s1 into tokenslogical


pieces such as words in a line of textseparated by characters
contained in string s2. The first call contains s1 as the first argument,
and subsequent calls to continue tokenizing the same string contain
NULL as the first argument. A pointer to the current token is returned
by each call. If there are no more tokens when the function is called,
NULL is returned.

Funciones Numricas
FUNCIONES MATEMTICAS Y TRIGONOMTRICAS
El archivo de cabecera <math.h> define un grupo de funciones para el manejo
numrico.

FUNCIONES LOGARTMICAS Y EXPONENCIALES

Recursividad
Las funciones recursivas son aquellas que se invocan a si mismas en algn
momento de su ejecucin.
Para poder resolver un problema de forma recursiva es necesario saber
alguna solucin no recursiva para alguno de los casos mas sencillos. "Usamos
la solucin ms simple para resolver un problema ms complejo".
As, todo mtodo recursivo debe tener al menos una sentencia que devuelva
un resultado (la solucin del caso ms sencillo) y las sentencias necesarias
para acercarse en cada invocacin a ese caso.
La recursin permite programar algoritmos aparentemente complicados con
un cdigo simple y claro, ahorrando trabajo,pero no recursosal
programador. A simple vista parece la solucin perfecta para muchos
problemas, pero hay que tener en cuenta que en ocasiones ralentizar el
programa en exceso. Por ejemplo, la funcin factorial en forma recursiva:

1.5. Recursividad

Ejercicios de Aplicacin
Ejercicio 1:
Capturar un nombre y 3 calificaciones en un procedimiento, calcular promedio
en una funcin, desplegar la respuesta en otro procedimiento.
Ejercicio 2:
Crear una tabla de multiplicar (ingresar nmero), captura y control de ciclo en
el principal, operaciones en una funcin, despliegue de resultados en el
principal.
Ejercicios varios:
3) Sacar races cuadradas aproximadas
19) Bsqueda Binaria
4) Da vuelta una palabra
20) Quicksort
5) Factorial en C
21) Torre de Hanoi
6) Nmero de dgitos de un nmero recursivo
22) Cadenas equivalentes
7) Suma de dgitos de un nmero recursivo
23) Subcadena en una cadena
8) Mximo comn divisor de 2 nmeros
9) Decimal a binario recursivo
10) Divisin entera por restas sucesivas
11) Suma recursiva con elementos de un vector
12) Suma elementos de una matriz
13) Encontrar el elemento mayor de un vector
14) Invertir un nmero
15) Potencia de varios nmeros usando recursividad (CMD)
16) Producto de dos nmeros enteros
17) Largo de una cadena de caracteres
18) Repeticin de un caracter en una cadena

1.6. Ejercicios de Aplicacin

Informacin en la Web 1
http://www.slideshare.net/javi2401/funciones-en-c-presentation#
http://www.slideshare.net/charlsrma/ejemplos-c
http://www.slideshare.net/solucionescip/ejercicios-resueltos-en-c-presentation
http://www.slideshare.net/serlob/ejercicios-generales-4667468
http://www.slideshare.net/ecasteloc/ejercicios-basicosi
http://www.slideshare.net/misaelcarreoncelestino/pseudocodigo-16976061
http://www.programacionfacil.com/cpp/funciones
http://www.slideshare.net/PetterBriones/captulo-6-funciones-y-procedimiento
http://www.slideshare.net/IngEsquivel/descomposicion-funcional-parte-ii-2013-2
http://www.data-2013.cl/DOCS/INFORMATICA/PROGRC/cap-c9.html
http://inodos.com/c/programando_en_c_capitulo_cinco.html
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/vol1/ch03s05.html
http://www.metonymie.com/apuntes/2008/09/20/alcance-de-variables-en-c.html
http://es.wikipedia.org/wiki/%C3%81mbito_(programaci%C3%B3n)
http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html (Compilar varios)
http://wiki.decom-uv.cl/index.php/Funciones_Recursivas_en_C
http://iie.fing.edu.uy/ense/asign/str/curso-c/ejemplos.htm
http://ejercicioscpp.blogspot.com/2012/09/tipos-de-datos-en-c.html

Informacin en la Web 2
http://www.slideshare.net/javi2401/caracteres-y-cadenas-en-c-presentation
http://www.nebrija.es/~abustind/Informatica/MetodologiaI/Funciones_cadena.pdf
http://www.fismat.umich.mx/mn1/manual/node1.html
http://www.fismat.umich.mx/mn1/manual/node18.html
http://
www.alciro.org/alciro/Programacion-cpp-Builder_12/funciones-cadenas-caracteres-string.h_
448.htm
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Cadenas_de_caracteres
http://c.conclase.net/curso/?cap=008
http://c.conclase.net/curso/?cap=024
http://c.conclase.net/curso/?cap=902f
http://maxus.fis.usal.es/FICHAS_C.WEB/01xx_PAGS/0103.html
http://cfp401.freeservers.com/cursos/c1/manc8.htm
http://
pestructurada-uai.blogspot.com/2011/10/funciones-numericas-y-matematicas-en-el.html
http://es.wikipedia.org/wiki/Biblioteca_est%C3%A1ndar_de_C%2B%2B
http://www.zator.com/Cpp/E4_4_7.htm
http://www.zator.com/Cpp/E5_5_1a.htm
http://artemisa.unicauca.edu.co/~wpantoja/web/lab_int_inf/funciones.html

Taller de Funciones
Realizar un programa que permita calcular la
suma y el promedio de los nmeros
comprendidos entre X y Y, incluidos los
nmeros dados. Estos nmeros deben ser
ingresados por teclado (X, Y). Al finalizar el
programa deber preguntar al usuario si desea
continuar y deber salir con el dgito 777.
El ingreso, el clculo y los resultados deben
ser ejecutados en 3 funciones distintas:
Ingresar(), Calcular() y Presentar(). Las 3
funciones llevan parmetros.

LOGO

Programacin Avanzada

Preguntas?