Sunteți pe pagina 1din 42

Introduccin a C

Unidad 4

Autor
Isabel Ponce
Unidad 4

Contenido

Programacin Modular:

Crear funciones en C (UDF)


Declarar y usar variables globales y
locales
Pasar parmetros por valor y por
referencia
Comprender el uso de la funcin
main.
Escribir funciones recursivas
Conocer algunas funciones internas
de C
Crear bibliotecas de funciones
Funciones

Las funciones son bloques de


cdigo utilizados para dividir un
programa en partes ms pequeas,
cada una de las cules tendr una
tarea determinada.
Las funciones son los bloques
constructores de C, es el lugar donde
se produce toda la actividad del
programa.
Son una de las caractersticas ms
importantes de C.
Las funciones pueden o no devolver
y recibir valores del programa.
El mecanismo para crear funciones
en C consiste en:
Declarar el prototipo de la funcin,
Invocar la funcin desde alguna otra
funcin, y
Definir el cdigo de la funcin.
Funciones

El cdigo de una funcin es privado


a esa funcin, el cdigo que
comprende el cuerpo de esa funcin
est oculto al resto del programa a
menos que se invoque.
Las funciones pueden ser
invocadas desde la funcin main o
desde otras funciones.
Nunca se debe llamar a la funcin
main desde otro lugar del programa.
Todas las variables que se definen
dentro de una funcin son locales a
excepcin de las variables
estticas.
Los argumentos de la funcin y sus
variables locales se destruyen al
finalizar su ejecucin.
Prototipos de Funciones

Al igual que las variables, las


funciones tambin se declaran.
Esto es lo que se conoce como
prototipo de una funcin.
Para que un programa en C sea
compatible entre distintos
compiladores es imprescindible
escribir los prototipos de las funciones.
Los prototipos de las funciones
pueden escribirse antes de la funcin
main o en otro archivo (biblioteca)
En este caso, se indica al compilador
mediante la directiva #include.
Sintaxis:
<prototipo> ::=
<tipoRetorno> <nombreFunc> ([<parmetro>*]);
Prototipos

Cuando se declara una funcin se


debe informar al compilador el tipo de
los valores que se le enviarn y el tipo
del valor que retorna.
Si no se indica valor de retorno, por
omisin retornar valor int.
Cuando una funcin no retorna algo,
se debe especificar con valor de
retorno void.
Aunque la funcin no reciba
parmetros, deben indicarse los
parntesis.
Los prototipos permiten al compilador
comprobar los tipos de datos pasados,
recibidos y retornados.
Permitiendo hacer conversiones
automticas de tipos.
El prototipo no exige que se ponga
nombre a los parmetros, ya que slo
requiere el tipo de dato.
Invocacin de Funciones

Para invocar una funcin desde otra,


basta con indicar su nombre y los
argumentos que necesita.
Sintaxis:
<invocacinFuncin> ::=
<nombreFunc> ([<argmento>*]);
Los argumentos deben coincidir en
nmero, orden y tipo con el
prototipo previamente indicado.
Cuando se invoca una funcin, nunca
se especifica el tipo del argumento,
slo se indica el valor literal o nombre
de variable o constante.
Las funciones que retornan un valor
pueden invocarse dentro de
expresiones, en este caso actan
como una variable cuyo valor
retornado se substituye en el lugar
donde se invoca.
Definicin de Funciones

La definicin de las funciones se


realizan indicando el encabezado
similar al prototipo y enseguida se
especifica el bloque de cdigo.
Sintaxis:
<definicinFuncin> ::=
<tipoRetorno><nombreFunc> ([<parmetro>*]){
<instruccin>*
[return [<expresin>]]
}
Si una funcin especifica valor de
retorno, debe tener entre sus
instrucciones un return.
El valor retornado puede ser una
literal, el valor de una variable o
constante, o el resultado de una
expresin, incluyendo el valor que
retorne otra funcin.
Parmetros

Los parmetros se declaran igual


que las funciones.
Primero se indica el tipo y luego el
nombre del parmetro.
Si el parmetro se pasa por
referencia, se deber preceder el
nombre del parmetro con un
asterisco (indicando que es un
apuntador).
Sintaxis:
<invocacinFuncin> ::=
<tipo> <nombreParam>*
Cada parmetro se debe declarar
por separado an si hay varios del
mismo tipo.
Los parmetros deben tener
nombres diferentes a las variables
locales.
Paso de parmetros

Los argumentos que se pasan a


una funcin en forma de variables,
pueden pasarse por valor o por
referencia.
En el caso del paso de parmetros
por valor, se copia el contenido
del argumento al parmetro de la
funcin, es decir, si se producen
cambios en el parmetro no afecta
a los argumentos.
C utiliza esta llamada por omisin.
Cuando se utiliza la llamada por
referencia lo que se pasa a la
funcin es la direccin de
memoria del argumento, por tanto
si se producen cambios estos
afectan tambin al argumento.
Ejemplo

#include <stdio.h>
#include <conio.h>
#include <dos.h>

void mostrar(void);

void main(void) {
clrscr();
printf(\nEstoy en la principal\n);
mostrar();
printf(\nDe vuelta en la principal);
getch();
}

void mostrar(void) {
printf(\nAhora estoy en la funcin\n);
delay(2000);
}
Ejemplo

#include<stdio.h>
#include<conio.h>

int suma(void);

void main(void) {
int eTotal;
clrscr();
printf(Suma valores\n);
eTotal = suma();
printf(\n%d, eTotal);
getch();
}

int suma(void) {
int eValor1, eValor2, eTotalDev;
printf(Primer valor: );
scanf(%d, &eValor1);
printf(Segundo valor: );
scanf(%d, &eValor2);
eTotalDev = eValor1 + eValor2;
return eTotalDev;
}
Ejemplo

#include<stdio.h>
#include<conio.h>

int suma(void);

void main(void) {
clrscr();
printf(Suma valores\n);
pritnf(\n%d, suma());
getch();
}

int suma(void) {
int eValor1, eValor2;
printf(Primer valor: );
scanf(%d, &eValor1);
printf(Segundo valor: );
scanf(%d, &eValor2);
return eValor1 + eValor2;
}
Ejemplo

#include<stdio.h>
#include<conio.h>

void suma(int x, int y, char *cad);

void main(void) {
int eValor1, eValor2;
char cCadena[20];
clrscr();
printf(\nSuma de Valores\n);
printf(\nPrimer valor: );
scanf(%d, &eValor1);
printf(\nSegundo valor: );
scanf(%d, &eValor2);
printf(\nCadena: );
fflush(stdin);
gets(cCadena);
suma(eValor1, eValor2, cCadena);
getch();
}

void suma(int x, int y, char *cCad) {


printf(\n\nTotal = %d, x + y);
printf(\nLa cadena es: %s, cCad);
}
Ejemplo

#include<stdio.h>
#include<conio.h>

void funcion();

int eNumero = 5; //variable global

void main() {

int eNumero = 10; //variable local


printf(%d\n, eNumero);

funcion();
}

void funcion() {
printf(%d, eNumero);
}
Ejemplo

#include<stdio.h>
#include<conio.h>

void suma(int eNum1, int eNum2, int


*eResultado);

void main(void) {
int eValor1, eValor2, eTotal;
clrscr();
printf(\nSuma de Valores\n);
printf(\nPrimer valor: );
scanf(%d, &eValor1);
printf(\nSegundo valor: );
scanf(%d, &eValor2);
suma(eValor1, eValor2, &eTotal);
printf(\n%d + %d = %d, eValor1, eValor2,
eTotal);
getch();
}

void suma(int eNum1, int eNum2, int


*eResultado) {
*eResultado = eNum1 + eNum2;
}
Funcin main

main() es una funcin, por tanto


debe tener un tipo de retorno.
Algunos compiladores exigen que el
tipo de retorno de main sea int.
Otros, permiten omitir el tipo de
retorno de las funciones, asignando
por omisin el tipo int. El estndar no
lo permite.
Cuando se indica el tipo int, se
retorna valor de 0 para indicar una
terminacin normal del programa,
cualquier otro valor indicar una
terminacin anormal.
Otra forma de salir del programa sin
regresar a main es con la funcin
exit(<entero>) (en stdlib).
Argumentos de la
Lnea de Comandos

main() puede tomar dos


argumentos comnmente llamados
argc y argv.
argc es un entero que contiene el
nmero de argumentos en la lnea
de comandos, incluyendo el
nombre del programa como primer
argumento; por tanto, argc siempre
es >= 1.
argv es un arreglo de cadenas que
contiene los argumentos pasados.
Los argumentos se pasan
separndolos con un espacio.
Para indicar parmetros en Dev-C,
se debe seleccionar la opcin
Ejecutar Parmetros.
Argumentos de la
Lnea de Comandos

void main (int argc, char *argv[ ]) {

int eCont = 1;

printf("\nTotal de parmetros: %d",


argc);
printf("\nNombre del programa: %s",
argv[0]);

while (eCont < argc) {


printf("\nargv[%d] = '%s'",
eCont, argv[eCont]);
eCont++;
}

getchar();
}
Recursividad

La recursividad es el proceso de
definir algo en trminos de si mismo,
es decir que las funciones pueden
llamarse a si mismas, esto se
consigue cuando en el cuerpo de la
funcin hay una llamada a la propia
funcin.
Una funcin que se llama a s misma
se llama recursiva.
Una funcin recursiva no hace una
nueva copia de la funcin, solo crea
nuevos los argumentos.
La principal ventaja de las funciones
recursivas es que se pueden usar
para crear versiones de algoritmos
ms claras y sencillas.
Cuando se escriben funciones
recursivas, se debe tener una
sentencia if para forzar a la funcin a
volver sin que se ejecute la llamada
recursiva.
Ejemplo Recursividad

La siguiente funcin obtiene


factorial de un nmero de forma
recursiva.

int factorial(int eNumero) {


int eRes;
if (eNumero == 1) {
return 1;
} else {
eRes = factorial(eNumero - 1) *
eNumero;
return eRes;
}
}
Funciones internas

La biblioteca estndar de C tiene


un rico y variado conjunto de
funciones.
Muchas funciones de la biblioteca
estndar trabajan con sus propios
tipos de datos y variables a las que
necesita acceder, estas variables y
tipos se definen en los archivos de
cabecera (headers)
proporcionados con el compilador
y deben incluirse (usando
#include) en cualquier archivo que
use esas funciones.
Uno de los ejemplos ms comunes
es STDIO.H que proporciona
soporte de Entrada y Salida.
Funciones internas

Algunas de los archivos de


cabecera que se usan
continuamente son:

Archivo Objetivo
ctype.h Manejo de caracteres
math.h Funciones matemticas
stdio.h Soporte de E/S
stdlib.h Conversin de datos
string.h Funciones de cadena
conio.h Funciones de consola
(No estndar, Borland)
A continuacin se muestran algunas
funciones tiles de estas
bibliotecas.
CTYPE.H

isalpha

Funcin : Devuelve un entero diferente


de cero si la variable es una letra del
alfabeto, en caso contrario devuelve cero.

Sintaxis : isalpha(varCaracter);
isdigit

Funcin : Devuelve un entero diferente


de cero si la variable es una nmero (0..9),
en caso contrario devuelve cero.

Sintaxis : isdigit(varCaracter);
tolower

Funcin : Devuelve el carcter


equivalente al de la variable en minsculas.

Sintaxis : var = tolower(varCaracter);


toupper

Funcin : Devuelve el carcter


equivalente al de la variable en maysculas.

Sintaxis : var = toupper(varCaracter);


CTYPE.H

Otras funciones de CTYPE.H

isalnum alfanumrico
iscntrl carcter de control
Islower minscula
Ispunct carcter de puntuacin
Isspace espacio en blanco
isupper - mayscula
MATH.H

acos

Funcin : Muestra el arcocoseno de la


variable.

Sintaxis : double acos(variable_double);


asin

Funcin : Muestra el arcoseno de la


variable .

Sintaxis : double asin(variable_double) ;


cos

Funcin : Muestra el coseno de la


variable .

Sintaxis: double cos(varDoubleRadianes);


sin

Funcin : Muestra el seno de la variable.

Sintaxis: double sin(varDoubleRadianes);


MATH.H

pow

Funcin : Realiza la potencia de un nmero


base, elevado al exponente indicado.

Sintaxis:
varFloat=pow(baseDouble,expDouble);
sqrt

Funcin : Obtiene la raz cuadrada de la


variable.

Sintaxis : varDouble=sqrt(variable_double);
log

Funcin : Obtiene el logaritmo natural de la


variable.

Sintaxis: double log(varDouble);


MATH.H

Otras funciones de MATH.H

exp - exponencial
ceil redondea hacia arriba
floor redondea hacia abajo
fmod residuo de la divisin
STDIO.H

printf

Funcin : Escribe en la salida estndar


con formato.

Sintaxis : printf(formato , arg1 , ...);


scanf

Funcin : Lee de la salida estndar con


formato.

Sintaxis : scanf(formato , arg1 , ...);


puts

Funcin : Escribe una cadena y salta


una linea.

Sintaxis : puts(cadena);
gets

Funcin : Lee y guarda una cadena


introducida por teclado.

Sintaxis : gets(cadena);
STDIO.H

fopen
Funcin : Abre un archivo en el modo
indicado.
Sintaxis : pf=fopen(archivo , modo);
fclose
Funcin : Cierra un archivo cuyo puntero
le indicamos.
Sintaxis : fclose(pf);
fprintf
Funcin : Escribe con formato en un
archivo.
Sintaxis : fprintf(pf , formato , arg1 , ...);
fgets
Funcin : Lee una cadena de un archivo.
Sintaxis : fgets(cadena , longitud , pf);
feof
Funcin: Retorna 1 si se ha llegado al final
del archivo, de lo contrario retorna 0.
Sintaxis: eof(apuntadorArchivo)
STDIO.H

Otras funciones de STDIO.H

fflush- limpiar buffer


fseek reposiciona el apuntador del
archivo
remove borrar archivo
rename renombrar archivo
rewind colocar apuntador del archivo
al inicio
STDLIB.H

atof

Funcin : Convierte una cadena de


texto en un valor de tipo float.

Sintaxis : numflo=atof(cadena);
atoi

Funcin : Convierte una cadena de


texto en un valor de tipo entero.

Sintaxis : nument=atoi(cadena);
itoa

Funcin : Convierte un valor numrico


entero en una cadena de texto. La base
generalmente ser 10, aunque se puede
indicar otra distinta.

Sintaxis : itoa(nmero , cadena , base);


STDLIB.H

exit

Funcin : Termina la ejecucin y


abandona el programa.

Sintaxis : exit(estado); /* Normalmente el


estado ser 0 */

rand

Funcin : Retorna un valor aleatorio


entre 0 y num-1.

Sintaxis : valor=rand() % 10 + 1;
/* Tambin se necesita la funcin srand */

abs

Funcin : Devuelve el valor absoluto de


una variable int.

Sintaxis : varEntera = abs(variable_float)


STDLIB.H

Otras funciones de STDLIB.H

atol- convierte a long int


malloc reservar memoria
free liberar memoria
abort abortar proceso
system ejecutar comando de SO
STRING.H

strlen
Funcin : Calcula la longitud de una
cadena.
Sintaxis : longitud = strlen(cadena);
strcpy
Funcin : Copia el contenido de una
cadena sobre otra.
Sintaxis : strcpy(copia , original);
strcat
Funcin : Concatena dos cadenas.
Sintaxis : strcat(cadena1 , cadena2);
strcmp
Funcin : Compara el contenido de dos
cadenas. Si cadena1 < cadena2 retorna un
nmero negativo. Si cadena1 > cadena2, un
nmero positivo, y si cadena1 es igual que
cadena2 retorna 0 ( o NULL ).
Sintaxis : valor = strcmp(cadena1,
cadena2);
STRING.H

Otras funciones de STRING.H

strchr localizar caracter


strstr localizar subcadena
CONIO.H

clrscr

Funcin : Borra la pantalla.

Sintaxis : clrscr( );
clreol

Funcin : Borra desde la posicin del cursor


hasta el final de la linea.

Sintaxis : clreol( );
gotoxy

Funcin : Cambia la posicin del cursor a las


coordenadas indicadas.

Sintaxis : gotoxy(columna , fila);


textcolor

Funcin : Selecciona el color de texto (0 - 15).

Sintaxis : textcolor(color);
textbackground

Funcin : Selecciona el color de fondo (0 - 7).

Sintaxis : textbackground(color);
CONIO.H

wherex
Funcin : Retorna la columna en la que se
encuentra el cursor.
Sintaxis : col=wherex( );
wherey
Funcin : Retorna la fila en la que se
encuentra el cursor.
Sintaxis : fila=wherey( );
getch

Funcin : Lee y retorna un nico caracter


introducido mediante el teclado por el usuario.
No muestra el caracter por la pantalla.

Sintaxis : letra=getch( );
getche
Funcin : Lee y retorna un nico caracter
introducido mediante el teclado por el usuario.
Muestra el caracter por la pantalla.
Sintaxis : letra=getche( );
Bibliotecas

Una vez que se ha escrito una


funcin, se puede hacer una de tres
cosas con ella:
Se puede dejar en el mismo archivo que la
funcin main.
Se puede poner en un archivo aparte con
otras funciones que se hayan escrito.
Se puede poner en una biblioteca.
Para no tener que buscar por todos
los archivos una funcin, se pueden
organizar las funciones en
bibliotecas.
Se deben agrupar todas las
funciones que estn relacionadas
conceptualmente en un archivo.
Se deben poner juntas todas las
funciones de propsito general.
Se deben poner juntas todas las
funciones del nivel ms alto
(mens y submens).
Bibliotecas

La ventaja de las bibliotecas, es que


permiten disminuir el tamao del
ejecutable, ya que slo las funciones
que se requieren sern cargadas y
enlazadas.
Las funciones de una biblioteca que
no se invocan, no se cargan y
enlazan en el ejecutable.
Para crear una biblioteca, basta con
escribir el cdigo en un archivo aparte
del programa principal, con extensin
.c, y guardarlo con extensin .h.
Cuando se requiera alguna funcin de
ese archivo, bastar con incluirlo
igual que cualquier otra biblioteca.
Se debern cambiar los parntesis
angulares (<>) por comillas en caso
de que el compilador no encuentre el
archivo.
Macros

Adems de definir constantes, la


directiva #define sirve para definir
macros, las cuales son bsicamente
substituciones de texto.
Las sustituciones pueden tener
parmetros y por tanto pueden
comportarse como pseudo-funciones.
Cada macro con parmetros se
expande y reemplaza al identificador
y la lista de argumentos.
El nombre de la macro no debe llevar
espacios.
Ejemplo:

#define PI 3.1416
#define AREA_CIRCULO(x) PI * (x) * (x)
Ejercicios

1. Crear un programa que realice las


cuatro operaciones aritmticas
bsicas, usando funciones.
2. Modificar las funciones de las
operaciones bsicas para hacerlas
recursivas.
3. Crear una biblioteca con las
funciones anteriores e incluirla en
otro archivo.
4. Crear macros para las cuatro
operaciones aritmticas.

S-ar putea să vă placă și