Documente Academic
Documente Profesional
Documente Cultură
#include <stdio.h>
long int fibonacci(void);
int main()
{
int n,i;
printf("\nCuantos numeros de fibonacci ?: ");
scanf("%d",&n);
printf("\nSecuencia de fibonacci: 0,1");
for (i = 2; i < n; i++)
printf(",%ld",fibonacci());
return 0;
}
long int fibonacci(void)
{
static int x = 0;
static int y = 1;
y = y + x;
x = y - x;
return y;
}
Ejecución:
Cuantos numeros de fibonacci ?: 14
Secuencia de fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,144,233
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm265
Se pueden incluir tantos archivos de cabecera como sean necesarios en sus archivos de programa, inclu-
yendo sus propios archivos de cabecera que definen sus propias funciones.
En este capítulo se estudian las funciones más sobresalientes y más utilizadas en programación.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
266mmProgramación en C: Metodología, algoritmos y estructura de datos
• isalpha(c)
Devuelve verdadero (distinto de cero) si c es una letra mayúscula o minúscula. Devuelve un valor fal-
so (cero) si se pasa un carácter distinto de letra a esta función.
• islower(c)
Devuelve verdadero (distinto de cero) si c es una letra minúscula. Devuelve un valor falso (cero), si se
pasa un carácter distinto de una minúscula.
• isupper(c)
Devuelve verdadero (distinto de cero) si c es una letra mayúscula, falso con cualquier otro carácter.
• isdigit(c)
Comprueba si c es un dígito de 0 a 9, devolviendo verdadero (distinto de cero) en ese caso, y falso en
caso contrario.
• isxdigit(c)
Devuelve verdadero si c es cualquier dígito hexadecimal (0 a 9, A a F, o bien a a f) y falso en cualquier
otro caso.
• isalnum(c)
Devuelve un valor verdadero, si c es un dígito de 0 a 9 o un carácter alfabético (bien mayúscula o minús-
cula) y falso en cualquier otro caso.
Ejemplo 7.4.
Leer un carácter del teclado y comprobar si es una letra.
El programa solicita, y comprueba, que se teclee una letra.
Copyright © 2005. McGraw-Hill España. All rights reserved.
#include <stdio.h>
#include <ctype.h>
int main()
{
char inicial;
printf("¿Cuál es su primer carácter inicial?: ");
scanf("%c%*c",&inicial);
while (!isalpha(inicial))
{
puts("Carácter no alfabético ");
printf("¿Cuál es su siguiente inicial?: ");
scanf("%c%*c",&inicial);
}
puts("¡Terminado!");
return 0;
}
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm267
• iscntrl(c)
Devuelve verdadero si c es un carácter de control (códigos ASCII 0 a 31) y falso en caso contrario.
• isgraph(c)
Devuelve verdadero si c es un carácter imprimible (no de control) excepto espacio; en caso contrario,
devuelve falso.
• isprint(c)
Devuelve verdadero si c es un carácter imprimible, código ASCII 21 a 127, incluyendo el espacio; en
caso contrario, devuelve falso.
• ispunct(c)
Devuelve verdadero si c es cualquier carácter de puntuación (un carácter imprimible distinto de espacio,
letra o dígito); falso, en caso contrario.
• isspace(c)
Devuelve verdadero si el carácter c es un espacio, nueva línea (\n), retorno de carro (\r), tabulación
(\t) o tabulación vertical (\v).
• tolower(c)
Convierte el carácter c a minúscula, si ya no lo es.
• toupper(c)
Convierte el carácter c a mayúscula, si ya no lo es.
Ejemplo 7.5.
Copyright © 2005. McGraw-Hill España. All rights reserved.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
268mmProgramación en C: Metodología, algoritmos y estructura de datos
case 'H':
puts("Es una maestra");
break;
default:
puts("No es ni enfermero ni maestra");
break;
}
return 0;
}
La mayoría de las funciones numéricas están en el archivo de cabecera math.h; las funciones de valor
absoluto fabs y labs están definidas en stdlib.h, y las funciones de división entera div y ldiv tam-
bién están en stdlib.h.
• ceil(x)
Copyright © 2005. McGraw-Hill España. All rights reserved.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm269
• modf(x, y)
Descompone el número real x, en su parte decimal f, y en su parte entera i, ambos con el mismo signo
que x; de modo que devuelve f y asigna i a *y.
Prototipo de la función: double modf(double x, double *y).
• pow(x, y)
Calcula x elevado a la potencia y, (xy). Si x es menor que o igual a cero, y debe ser un entero. Si x es
igual a cero, y no puede ser negativo.
Prototipo de la función: double pow(double x, double y).
• sqrt(x)
Devuelve la raíz cuadrada de x; x debe ser mayor o igual a cero.
Prototipo de la función: double sqrt(double x).
Ejemplo 7.6.
El programa muestra los diversos resultados que devuelven las funciones matemáticas del apartado 7.10.1.
#include <stdio.h>
#include <math.h>
int main()
{
int exponente;
double d, y;
printf("\n ceil(3.7) = %lf \t\t ceil(3.4) = %lf",
ceil(3.7),ceil(3.4));
printf("\n ceil(-3.7) = %lf \t\t ceil(-3.4) = %lf ",
ceil(-3.7),ceil(-3.4));
printf("\n floor(3.7) = %lf \t\t floor(3.4) = %lf",
floor(3.7),floor(3.4));
printf("\n floor(-3.7) = %lf \t\t floor(-3.4) = %lf",
floor(-3.7),floor(-3.4));
printf("\n fmod(5.6,2.5) = %lf \t\t fmod(-5.6,2.5) = %lf",
fmod(5.6,2.5),fmod(-5.6,2.5));
d = frexp(16.0, &exponente);
printf("\n Mantisa de 16.0, m = %lf \t\t exponente = %d",
d,exponente);
Copyright © 2005. McGraw-Hill España. All rights reserved.
d = modf(-17.365, &y);
printf("\n Parte decimal de -17.365 = %lf ",d);
printf("\n Parte entera de -17.365 = %lf ",y);
return 0;
}
Ejecución
ceil(3.7) = 4.000000 ceil(3.4) = 3.000000
ceil(-3.7) = -3.000000 ceil(-3.4) = -2.000000
floor(3.7) = 3.000000 floor(3.4) = 3.000000
floor(-3.7) = -4.000000 floor(-3.4) = -4.000000
fmod(5.6,2.5) = 0.600000 fmod(-5.6,2.5) = -0.600000
Mantisa de 16.0, m = 1.000000 exponente = 4
Parte decimal de -17.365 = -0.365000
Parte entera de -17.365 = -17.000000
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
270mmProgramación en C: Metodología, algoritmos y estructura de datos
• acos(x)
Calcula el arco coseno del argumento x. El argumento x debe estar entre -1 y 1.
Prototipo de la función: double acos(double x).
• asin(x)
Calcula el arco seno del argumento x. El argumento x debe estar entre -1 y 1.
Prototipo de la función: double asin(double x).
• atan(x)
Calcula el arco tangente del argumento x.
Prototipo de la función: double atan(double x).
• atan2(x,y)
Calcula el arco tangente de x dividido por y.
Prototipo de la función: double atan2(double x, double y).
• cos(x)
Calcula el coseno del ángulo x; x se expresa en radianes.
Prototipo de la función: double cos(double x).
• sin(x)
Calcula el seno del ángulo x; x se expresa en radianes.
Prototipo de la función: double sin(double x).
• tan(x)
Devuelve la tangente del ángulo x; x se expresa en radianes.
Prototipo de la función: double tan(double x).
• cosh(x)
Calcula el coseno hiperbólico de x.
Prototipo de la función: double cosh(double x).
• sinh(x)
Calcula el seno hiperbólico de x.
Prototipo de la función: double sinh(double x).
Copyright © 2005. McGraw-Hill España. All rights reserved.
• tanh(x)
Calcula la tangente hiperbólica de x.
Prototipo de la función: double tanh(double x).
Regla de programación
Si necesita pasar un ángulo expresado en grados a radianes, para poder utilizarlo con las funcio-
nes trigonométricas, multiplique los grados por pi/180, donde pi = 3.14159.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm271
• exp(x)
Calcula el exponencial ex, donde e es la base de logaritmos naturales de valor 2.718282.
Prototipo de la función: double exp(double x).
• log(x)
La función calcula el logaritmo natural (logaritom en base e ) del argumento x; x ha de ser positivo.
Prototipo de la función: double log(double x).
• log10(x)
Calcula el logaritmo decimal del argumento x; x ha de ser positivo.
Prototipo de la función: double log10(double x).
Ejemplo 7.7.
El programa genera 10 números aleatorios. Cada vez que se ejecute el programa la secuencia de núme-
ros generada será la misma.
#include <stdio.h>
#include <stdlib.h>
Copyright © 2005. McGraw-Hill España. All rights reserved.
int main(void)
{
int i;
for (i = 1; i <= 10; i++)
printf("%d ",rand());
return 0;
}
• srand(semilla)
La función srand inicializa el generador de números aleatorios. Se utiliza para fijar el punto de comien-
zo para la generación de series de números aleatorios; este valor se denomina semilla. Si el valor de semi-
lla es 1, se reinicializa el generador de números aleatorios. Cuando se llama a la función rand antes de
hacer una llamada a la función srand, se genera la misma secuencia que si se hubiese llamado a la fun-
ción srand con el argumento semilla tomando el valor 1.
Prototipo de la función: void srand(unsigned int semilla).
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
272mmProgramación en C: Metodología, algoritmos y estructura de datos
• randomize
Los compiladores de C, generalmenete incorporan la macro randomize para inicializar el generador de
números aleatorios con una semilla obtenida a partir de una llamada a la función time. Dado que esta
macro llama a la función time, el archivo de cabecera time.h se incluirá en el programa. No devuelve
ningún valor.
El programador de C puede incorporar su propia macro randomize. A continuación se escribe una
posible definición que llama a srand() con la semilla que devuelve la función time():
#include <stdlib.h>
#include <time.h>
#define randomize (srand(time(NULL)))
• random(num)
Al igual que randomize, la macro random generalmente viene incorporada en los compiladores de C.
Genera un número aleatorio dentro de un rango especificado (0 y el límite superior especificado por el
argumento num). Devuelve un número entero entre 0 y num-1. Una definición de random que puede incor-
porar a sus programas es la siguiente:
#define random(num) (rand()%(num))
En el ejemplo 7.8. se define esta macro y se utiliza para generar números aleatorios en el rango [0,1000).
Ejemplo 7.8.
Programa para encontrar el mayor de 10 números aleatorios entre 0 y 1000
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int mx,i;
randomize;
mx = random (TOPE);
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm273
• clock(void)
La función clock determina el tiempo de procesador transcurrido desde el principio de la ejecución del
programa. Para determinar el número de segundos transcurridos debe dividirse el valor que devuelve
clock () por la constante (macro) CLOCKS_PER_SEC. Si la función no puede devolver el tiempo de pro-
cesador retorna -1.
Prototipo de la función: clock_t clock(void).
El tipo clock_t está definido como tipo long en time.h
• time(hora)
La función time obtiene el tiempo actual medido en el número de segundos transcurridos desde la media-
noche (00:00:00) del 1 de enero de 1970. Este valor de tiempo se almacena en la posición apuntada por
Copyright © 2005. McGraw-Hill España. All rights reserved.
Ejemplo 7.9.
En este ejercicio se solicita el año, mes y día; escribe el día de la semana y los días transcurridos desde el
1 de enero del año leído. Se utiliza un array de cadenas de caracteres.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
274mmProgramación en C: Metodología, algoritmos y estructura de datos
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
char *dias[] = { " ","Lunes", "Martes", "Miercoles",
"Jueves", "Viernes", "Sabado","Domingo"};
int main(void)
{
struct tm fecha;
int anyo, mes, dia;
/* Entrada: año, mes y dia */
printf("Año: "); scanf("%d", &anyo);
printf("Mes: "); scanf("%d", &mes);
printf("Dia: "); scanf("%d", &dia);
/* Asigna fecha a la estructura fecha, en formato establecido */
fecha.tm_year = anyo - 1900;
fecha.tm_mon = mes - 1;
fecha.tm_mday = dia;
fecha.tm_hour = 0;
fecha.tm_min = 0;
fecha.tm_sec = 1;
fecha.tm_isdst = -1;
/*
mktime encuentra el día de la semana y el día del año.
Devuelve -1 si hay error.
*/
if (mktime(&fecha) == -1)
{
puts(" Error en la fecha.");
exit(-1);
}
/* El domingo, la función mktime le considera dia 0 */
Copyright © 2005. McGraw-Hill España. All rights reserved.
if (fecha.tm_wday == 0)
fecha.tm_wday = 7;
printf("\nDia de la semana: %d; dia del año: %d",
fecha.tm_wday,fecha.tm_yd ay+1);
/* Escribe el dia de la semana */
printf("\nEs el dia de la semana, %s\n", dias[fecha.tm_wday]);
return 0;
}
Ejercicio 7.4.
Se utiliza la función clock() para determinar el tiempo de proceso de un programa que calcula el facto-
rial de un número leído desde el teclado, arbitrariamente, entre 3 y 15.
El factorial de n! = n*(n-1)*(n-2) ...*1 . La variable que vaya a calcular el factorial, se define de
tipo long para poder contener un valor elevado. El número, arbitrariamente, va a estar comprendido entre
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm275
3 y 15. El tiempo de proceso va a incluir el tiempo de entrada de datos. La función clock() devuelve el
tiempo en unidades de click, para obtener los segundos se divide por CLOCKS_PER_SEC. El programa escri-
be el tiempo en ambas unidades.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n, x;
long inicio, fin, fact;
inicio = clock();
do {
printf(" Factorial de (3 <x< 15): ");
scanf("%d",&x);
}while (x <= 3 || x >= 15);
for (n = x,fact = 1; x; x--)
fact *= x;
fin = clock();
printf("\n Factorial de %d! = %ld",n,fact);
printf("\n Unidades tiempo de proceso: %ld,\t en segundos: %f",
(fin-inicio), (fin-inicio)/(float)CLOCKS_PER_SEC);
return 0;
}
Ejecución
Para entrada: 4
Factorial de 4! = 24
Unidades tiempo de proceso: 2153, en segundos: 2.153000
Para entrada: 14
Copyright © 2005. McGraw-Hill España. All rights reserved.
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
276mmProgramación en C: Metodología, algoritmos y estructura de datos
• atoi(cad), atol(cad)
Convierte los dígitos de la cadena cad (ignora espacios iniciales) a número entero y entero largo res-
pectivamente. Por ejemplo, atoi("580") devuelve el número entero 580.
• div(num, denom)
Calcula el cociente y el resto de num, dividido por denom y almacena el resultado en quot y rem, miem-
bros int de la estructura div_t. La definición de la estructura es:
typedef struct
{
int quot; /* cociente */
int rem; /* resto */
} div_t;
Ejemplo 7.10
El siguiente ejemplo calcula y visualiza el cociente y el resto de la división de dos enteros.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
div_t resultado;
resultado = div(19, 4);
printf("Cociente %d", resultado.quot);
Copyright © 2005. McGraw-Hill España. All rights reserved.
• ldiv(num,denom)
Calcula el cociente y resto de num dividido por denom, y almacena los resultados de quot y rem, miem-
bros de tipo long de la estructura ldiv_t. La definición de la estructura es:
typedef struct
{
long int quot; /* cociente */
long int rem; /* resto */
} ldiv_t;
Por ejemplo:
resultado = ldiv(1600L, 40L);
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.
Funcionesmm277
• Las variables globales tienen duración estática por defecto. El almacenamiento se realiza en tiem-
po de compilación y nunca desaparece. Por definición, una variable global no puede ser una varia-
ble auto.
• Las variables globales son visibles globalmente en el archivo fuente. Se pueden referenciar desde
cualquier función, a continuación del punto de definición.
• Las variables globales están disponibles, por defecto, a otros archivos fuente. Esta operación se deno-
mina enlace externo.
prog_demo.c
Ámbito
Function_a() global
Joyanes, Aguilar, Luis, and Martínez, Ignacio Zahonero. Programación en C: metodología, algortimos y estructura de datos (2a. ed.), McGraw-Hill España, 2005.
ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3195036.
Created from unadsp on 2018-04-26 15:54:26.