Professional Documents
Culture Documents
INDUSTRIAL
LENGUAJE C
VISUAL C
NOCIONES BÁSICAS
1.1.- Introducción.
1.4.- Ejercicios.
1.1.- Introducción.
El lenguaje C fue inventado por Dennis Ritchie en 1972 en el proceso de diseño del
sistema operativo UNIX. Deriva del lenguaje B de Ken Thompson quien cooperó
también en el diseño de la primera versión (UNIX v.5). Más tarde surgieron gran
cantidad de nuevas implementaciones y se hizo necesario un estándar, el ANSI C. La
implementación que usaremos es la de Visual C ++ 2010 Express.
Todos los programas deben incluir las librerías, la función principal, abrir llave y cerrar
llave.
Programa 001
5ª línea {
7ª línea }
2ª línea Hace lo mismo que la primera línea (pero solo puedo escribir una línea).
6ª línea Realiza una llamada a una función denominada printf, con el argumento
“Mi primer programa en C”; printf es una función de biblioteca que
realiza una escritura en la salida estándar (normalmente la salida estándar
es el monitor). La función printf escribe una cadena de caracteres
(string). Cada instrucción en C acaba con punto y coma ( ; ).
Programa 002
5ª línea {
8ª línea getchar( );
9ª línea }
Código Significado
\b Retroceso, lo mismo que la tecla borrar
\f Salto de página
\n Nueva línea
\r Retorno de carro, el curso al principio de la línea actual
\t Tabulación horizontal
%% Tanto por ciento %
\” Comillas “
\´ Apóstrofe ‘
\0 Carácter nulo, suele delimitar las cadenas de caracteres
\\ Barra invertida \
\v Tabulación vertical
\a Alerta (bell, campanilla)
\ddd Constante octal (ddd son tres dígitos como máximo)
\xddd Constante hexadecimal (ddd son tres dígitos como
máximo)
Es una función que espera que se pulse la tecla RETURN por parte del
usuario. Esta función no necesita argumentos pero los paréntesis son
necesarios ya que se trata de una función. Se encuentra en la librería
stdio.h.
Los programas funcionan con datos que contienen información. Estos datos se pueden
dividir en constantes (valores fijos no alterables) y variables (valores que pueden
cambiar).
Ejemplos:
Numero Válido
2Numero No válido, comienza por dígito
Numero2 Válido
_Numero Válido
_Numero! No válido. Contiene un carácter no válido
#Numero No válido. Comieza # y contiene un carácter no válido
/* Programa 003 */
#include <stdio.h>
void main()
int horas,minutos;
horas=3;
minutos=60*horas;
printf("Hay %d minutos en %d horas.\n",minutos,horas);
}
1.4.- Ejercicios
Ejercicio 02.- Escribe un programa que convierta tu edad de años a días (No tenemos en
cuenta las fracciones y los bisiestos)
NOTA.-
www.conclase.net/c/librerias/index.php
www.zator.com/Cpp/E5.htm
2.1.- Introducción.
Las declaraciones indican las variables que se van a utilizar y establecen su tipo
y, a veces, su valor inicial.
2.2.- Datos
Los programas funcionan con datos que contienen la información que manipularán.
Estos datos se pueden dividir en constantes (valores fijos no alterables) y variables
(valores que pueden cambiar).
Para utilizar un dato este debe ser antes declarado dándole un nombre que utilizaremos
después para referenciarlo. En la declaración avisamos al compilador de la existencia de
una variable y del nombre de la misma.
Las variables se pueden conjugar con operadores mediante expresiones para dar lugar a
nuevos valores.
Ejemplo: b=a+3;
Hay veces que interesa convertir un char en un int. Se puede hacer de varias formas.
Una de ellas es escribiendo ‘0’ (cero) a continuación del elemento char.
Ejemplo 1: 6 -‘0’
Ejemplo 2: char frase[a]=3;
frase[a] -‘0’ frase[a] es un entero que vale 3
Programa 004
#include<stdio.h>
char c ='c';
float f = 1.0;
double d = 1e-1;
2.2.1- Char.
2.2.2.- Int.
Los ENTEROS indican un número con signo sin parte decimal. Se pueden
escribir:
Los tipos FLOAT y DOUBLE tienen parte real y parte decimal. El tipo double
tiene el doble de precisión que el tipo float. Por lo demás son iguales. El número
no puede empezar por e o E ya que el compilador lo interpretaría como un
identificador y no como un número. Ejemplos:
2.2.4.- Void.
El tipo VOID significa sin valor, sin tipo. Tiene varios usos:
Analizaremos ahora las funciones de entrada y salida básica que nos proporciona el
lenguaje C para poseer, al menos, unos elementos con los que podamos dar nuestros
primeros pasos. Para ello observamos el siguiente programa:
Programa 005
#include<stdio.h>
int num1;
printf("Introduzca un numero:");
scanf("%d",&num1);
printf("es %x en hexadecimal",num1);
La cuarta sentencia, scanf, es una llamada a una función de entrada. Esta función recoge
información del dispositivo de entrada estándar, en este caso el teclado. La función
recibe dos parámetros: el primero es una cadena de formato (va entre comillas) y el
segundo es un puntero a una variable donde se va almacenar ese dato. El primero indica
el tipo de dato que se va almacenar en el segundo.
En Visual 2010 scanf , al depurar, nos da un warnig, y nos aconseja que usemos scanf-s.
por
2.4.- Modificadores.
A excepción del tipo void, los tipos de datos básicos pueden tener varios modificadores
precediéndoles. Pueden ser modificadores de tipo o modificadores de acceso.
Un modificador de tipo se usa para alterar el significado del tipo base para que
se ajuste más precisamente a las necesidades de cada momento
const int i = 8 ;
int i = 7 ;
Los del tipo volatil (volatile) indica al compilador que esa variable puede ser
modificada por algo externo al programa (por el sistema operativo, por un driver
de dispositivo).
Las cadenas de caracteres (string) es un tipo derivado. Esto significa que se forman a
partir de los tipos básicos. Se forman delimitando los caracteres entre comillas. Las
comillas no forman parte de la secuencia.
a b C \0
Vemos que tiene 4 caracteres. ¡Atención! El carácter nulo ‘\0' no es la cifra 0 (cuyo
código ASCII es 48), sino un carácter no imprimible, cuyo código ASCII es 0.
Para dividir una cadena de caracteres en varias líneas usamos el código %s que indica a
la función printf que escriba una cadena en su lugar. Ejemplo:
2.6.- Operadores.
Un operador es un signo que realiza una determinada acción sobre unos operandos. El
operando es el valor manipulado por el operador, puede ser un dato o el valor devuelto
por la función. Se dice que el operador es binario si opera con dos operandos y es
monario cuando opera con uno solo.
Ejemplo
Salida x = 3 y = 3 Salida x = 3 y = 2
Modifica y devuelve Devuelve y modifica
Los operadores relacionales realizan una comparación entre los dos operandos
situados a sus lados. Esta comparación da lugar a un valor verdadero o falso. En
C cualquier valor distinto de 0 es verdadero, cualquier valor igual a 0 es falso (
Cuando no se puede definir un valor determinado, para indicar verdadero se
utiliza el 1 ).
p q p&&q p||q !p !q
0 0 0 0 1 1
0 1 0 1 1 0
1 0 0 1 0 1
1 1 1 1 0 0
* operador OR |
Si x=1 0 0 0 0 0 0 0 1
z=3 0 0 0 0 0 0 1 1
entonces x | z 0 0 0 0 0 0 1 1
* operador XOR ^
Si y = 15 0 0 0 0 1 1 1 1
z=3 0 0 0 0 0 0 1 1
entonces y ^ z = 12 0 0 0 0 1 1 0 0
Si y = 15 0 0 0 0 1 1 1 1
z=3 0 0 0 0 0 0 1 1
entonces y & z = 3 0 0 0 0 0 0 1 1
Si x=1
0 0 0 0 0 0 0 1
x >> 1
0 0 0 0 0 0 0 0
x=0
Si y = 15
0 0 0 0 1 1 1 1
y >> 2 (dos veces)
0 0 0 0 0 0 1 1
y=3
Si x=1
0 0 0 0 0 0 0 1
x << 1
0 0 0 0 0 0 1 0
x=2
Si y = 15
0 0 0 0 1 1 1 1
y << 2
0 0 1 1 0 0 0 0
y = 60
Si z=3 z << 1 z=6
en general indica multiplicar por la n-esima potencia de dos.
Si y = 15 0 0 0 0 1 1 1 1
Entonces “ y = 240 1 1 1 1 0 0 0 0
Tiene dos usos, uno para representar una lista de elementos y otro para
encadenar varias expresiones (en este último uso se evalúa de izquierda a
derecha y el valor final es el de la expresión más a la derecha).
= x=5
*= x * = 10 x = x * 10
/= x / = 10 x = x / 10
%= x%=2 x=x%2
+= x+=5 x=x+5
-= x-=5 x=x-5
<< = x << = 4 x = x << 4
>> = x >> = 12 x = x >> 12
&= x&=1 x=x&1
|= x|=4 x=x|4
^= x^=6 x=x^6
Categoría Operador
Más alta () [] → .
Unarios ! “ + - ++ - - & * sizeof
Multiplicadore * / %
s
Aditivos + - (binarios)
Desplazamient << >>
o
Relacionales < <= > >=
Igualdad == !=
AND de bits &
XOR de bits ^
OR de bits |
AND lógico &&
OR lógico ||
Condicional ?
Asignamiénto = *= /= += -= &= ^= |= << = >>
=
Coma ,
Ejercicio 03.- Dada la función diseñar un programa que para el valor de abcisa 4.4 de el
correspondiente a la ordenada.
Ejercicio 04.- La Tierra no es una esfera, está ligeramente aplanada y por lo tanto es más
bien un esferoide plano. La fórmula del volumen es . Calcúlese el volumen de la Tierra
para los siguientes datos , a = 1245.5 km y b = 12711.1 km.
Ejercicio 05.- La relación entre temperaturas Celsius y Farenhai está dada por Diseñar
un programa que convierta los grados Farenhai en Celsius.
3.1.- Introducción.
3.2.- Sentencia condicional if.
3.3.- Sentencia condicional switch.
3.4.- Sentencia iterativa while.
3.5.- Sentencia iterativa do-while.
3.6.- Sentencia iterativa for.
3.7.- Sentencia de salto break.
3.8.- Sentencia de salto continue.
3.9.- Sentencia de salto goto.
3.10.- Sentencia de salida return.
3.11. Algunas utilidades de Visual C 2010
3.12.- Ejercicios.
3.1.- Introducción.
Las sentencias pueden ser simples, separadas por el punto y la coma, y compuestas,
varias sentencias simples agrupadas entre llaves.
Tendremos en cuenta que para escribir un código fuente mucha más legible iremos
colocando las sentencias en niveles de forma que podamos diferenciar con facilidad
cada grupo de sentencias.
Las sentencias pueden ser condicionales ( if, switch ), iterativas ( while, for, do ),
incondicionales (break, continue, goto,return ).
if ( expresion1 ) sentencia1
if (expresion1) sentencia1
else if (expresion2) sentencia2
................................
else sentenciaN.
Ejemplos:
#include<stdio.h>
Las expresiones a evaluar solo pueden ser de tipo entero o de tipo carácter. La sintaxis
es:
switch (expresion)
case expresion1:
sentencia1
break;
case expresion2:
sentencia2
break;
....................................
default:
sentenciadefault
#include<stdio.h>
Nota.- En el ejemplo anterior si op es entero (int) se debe poner case 1, case 2 (sin '').
El bloque delimitado por las llaves puede reducirse a una sentencia, y en este caso se
pueden suprimir las llaves.
Cuando el programa llega a una sentencia while, sigue los siguientes pasos:
#include<stdio.h>
{
int num1,num2,num3,suma, resta,multi,resto;
printf("Introduzca la primera cifra entre 0 y 9: ");
scanf("%d",&num1);
printf("Introduzca la segunda cifra entre 0 y 9: ");
scanf("%d",&num2);
printf("Introduzca la tercera cifra entre 0 y 9: ");
scanf("%d",&num3);
while(num1>5)
{
suma=num1+num2;
multi=num1*num2;
printf("La suma de %d y %d es %d ",num1,num2,suma);
printf("\nLa multiplicacion de %d y %d es
%d",num1,num2,multi);
num1=2; /* para romper el while */
}
resta=num3-num2;
resto=num3%num2;
printf("\n\nLa resta de %d y %d es %d ",num3,num2,resta);
printf("\nEl resto de dividir %d y %d es %d ",num3,num2,resto);
}
#include<stdio.h>
void main (void)
{
int i;
i=1;
do
{
printf("\n%d",i++);
}while(i<=10);
}
#include<stdio.h>
Nota.-
Esta sentencia provoca la salida inmediata de las sentencias swich, while, for o do-
while. Por lo tanto su uso solo es correcto dentro de un bloque de una de estas
sentencias.
#include<stdio.h>
{
int num1,num2,suma, resta,multi,resto;
printf("Introduzca la primera cifra entre 0 y 9: ");
scanf("%d",&num1);
printf("Introduzca la segunda cifra entre 0 y 9: ");
scanf("%d",&num2);
while(num1>5)
{
suma=num1+num2;
multi=num1*num2;
printf("La suma de %d y %d es %d ",num1,num2,suma);
printf("\nLa multiplicacion de %d y %d es
%d",num1,num2,multi);
break;
}
resta=num1-num2;
resto=num1%num2;
printf("\n\nLa resta de %d y %d es %d ",num1,num2,resta);
printf("\nEl resto de dividir %d y %d es %d
",num1,num2,resto);
}
Funciona algo similar a break. Solo puede ser empleada en el interior de una sentencia
de repetición. Es un salto incondicional al final del bucle. No es un salto al exterior del
bucle, sino al final de su bloque de sentencias. En vez de forzar la terminación, continue
fuerza una nueva iteración del bucle y salta cualquier código que exista entre medias.
#include<stdio.h>
Es un salto incondicional al final del cuerpo de una función, a la llave de fin de bloque.
Es de uso obligado en las funciones que devuelven un valor. Hablaremos de esta
sentencia cuando veamos el tema de las funciones.
Si la línea contiene una llamada a una función, Paso a paso por instrucciones o
F11 solo ejecuta la llamada en sí, y a continuación, se detiene en la primera línea
de código incluida la función. Paso a paso por procedimientos o F10 ejecuta toda
la función y después se detiene en la primer línea que está fuera de la misma.
Situado el cursor en el lugar que nos interesa, pulsamos el botón derecho del
ratón apareciendo el siguiente menú.
Ejercicio 06.- Hacer un programa que genere la lista de los 100 primeros números pares
con la sentencia iterativa for.
Ejercicio 07.- Hacer un programa que genere la lista de los 100 primeros números pares
con la sentencia iterativa while
Ejercicio 08.- Hacer un programa que genere la lista de los 100 primeros números pares
con la sentencia iterativa do.
Ejercicio 09.- Haz un programa que escriba todos los números menores que 50 y que
además no sean divisibles por 3.
*
Ejercicio 10.- Realizar un programa que me pida un **
número por pantalla y saque su tabla de multiplicar. ***
****
Ejercicio 11.- Realizar un programa que calcule el factorial *****
de un número menor que 100. ******
*******
Ejercicio 12.- Diseña un programa que escriba el siguiente ********
gráfico, utilizando la sentencia iterativa for. *********
**********
Ejercicio 13.- Realizar un programa que me pida que *********
introduzca tres números y los saca clasificados en orden de ********
mayor a menor. *******
******
Ejercicio 14.- Hacer un programa que pida al usuario que *****
introduzca un número y a continuación presenta en pantalla ****
el número de cifras que componen dicho número. ***
**
Ejercicio 15.- Encontrar todos los números primos *
comprendidos entre un número entero, dado por el teclado,
y el 1. Sacarlo por pantalla (si el número introducido es primo: indicarlo).
Ejercicio 16.- Calcular la media de una serie de números que finaliza al introducir 999
(el número 999 no debe ser tenido en cuenta para la media).
4.1.- Introducción.
4.2.- Función de salida exit.
4.3.- Función de salida _exit.
4.4.- Función de salida abort.
4.5.- Función de salida assert.
4.6.- Funciones de entrada/salida.
4.7.- Función de entrada salida estándar printf, scanf.
4.8.- Función de entrada salida putchar, getchar.
4.9.- Función de entrada salida puts, gets.
4.10.- Funciones de consola.
4.11.- Funciones rand, randomize y srand.
4.12.- Función clrscr.
4.13.- Ejercicios.
4.1.- Introducción.
El objetivo de este tema es describir algunas funciones del lenguaje C. Una función es
una porción de código aislado que efectúa una acción determinada según una serie de
parámetros separados por comas (puede no tenerlos) y que devuelve un valor
dependiente de estas acciones (puede también no devolver valor alguno). Estos
parámetros son valores que damos a la función para que trabaje con ellos.
Cuando ejecutamos una función decimos que la llamamos. La sintaxis de una llamada
de función en C es:
nombre_de_funcion ( lista_de_parametros )
La función exit no devuelve nada pero necesita un argumento que es recogido por el
programa llamador (normalmente el sistema operativo). Por convención el valor 0
indica terminación normal; valores distintos de 0 indican situaciones anormales.
En la librería stdlib.h existen dos constantes definidas para pasarlas como argumento a
la función exit:
En las operaciones de entrada/salida, los datos utilizados suelen pasar por buffers. Un
buffer es una cantidad de memoria utilizada para meter y sacar datos.
El C trata varios dispositivos como si fuesen archivos. Haya unos cuantos predefinidos
que se abren al iniciar el programa dandole unos descriptores:
Las órdenes de formato pueden tener modificadores. Estos modificadores van entre % y
la letra identificadora del código.
# include <stdio.h>
#include<stdio.h>
La función puts escribe una cadena de caracteres y un carácter de nueva línea al final de
la cadena de la salida estándar (monitor). Acepta como argumento una cadena (sin
formato). Si tiene éxito devuelve el último carácter escrito (siempre es ‘\n’). En otro
caso, devuelve EOF. Esta función es lo mismo que:
¡Atención! Con las funciones de lectura y escritura hay que tener la precaución de
reservar memoria para que entren todos los caracteres que introducimos (si reservamos
para 100 no podemos introducir más de 99 caracteres).
cprintf printf
cscanf scanf
cputs puts
cgets gets
putch putchar
getch getchar
getche
Estándar Consola
Se escribe en la salida estándar Se escribe en pantalla
Se lee en la salida estándar Se lee en el teclado
Se escribe y lee a través buffers No utiliza buffers
Para pasar a la línea siguiente es Para pasar a la línea siguiente hay
suficiente escribir el carácter de línea que escribir los caracteres de nueva
nueva ‘\n’ línea ‘\n’ y el de retorno de carro ‘\r’
Vamos a introducir una frase , por ejemplo: “hola, que tal estas”, para ello
reservamos 80 espacios mediante char frase[80].
Con cgets reserva los dos primeros elementos de memoria para: en frase[0]
escribe el número de caracteres reservados, en este caso 80, en frase[1] escribe el
número de caracteres realmente introducidos, en esta caso 19. A continuación
escribe la frase: en el lugar de memoria frase[2] escribe “h”, en el lugar de
memoria frase[3] escribe ”o” ….
# include <stdio.h>
# include <stdio.h>
# include <stdio.h>
# include <stdio.h>
# include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
Para que realmente los números sean aleatorios, C y en C++, tenemos que usar la
función randomize(), además, si queremos que los números estén en un intervalo por
ejemplo, del 1 al 99, hemos de operar a rand () con % 100.
#include<stdio.h>
#include<stdlib.h>
Visual C no reconoce la función randomize (). Para hacer algo similar a dicha función
usaremos la función srand(time(NULL)) que se encuentra en la librería time.h y debe
estar en la función principal (main). Esta función genera una “semilla” que tiene como
base el reloj del ordenador.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main (void)
{
int vector [100];
int i;
srand(time(NULL));
for(i=0;i<=99;i++)
vector[i]=rand()%100;
printf("El vector desordenado es: \n");
for(i=0;i<100;i++)
printf("%d\t",vector[i]);
}
Vemos el vector desordenado (es conveniente ver lo que pasa si en los for ponemos
i<99)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
1º Incluimos stdlib.h
2º Dentro de main ejecutamos system(“cls”);
y = x2 + 5 cuando x<0
y=3x+1 cuando 0<=x<2
y = x2 - 4 x + 5 cuando x>2
Ejercicio 20.- Programa que obtenga el producto de dos números enteros positivos
mediante sumas sucesivas.
Ejemplo: 3 x 4 = 3 + 3 + 3 + 3 = 12 5 x 2 = 5 + 5 = 10
Ejercicio 21.- Programa que lee una frase en una línea y cuente su número de vocales.
Ejercicio 22.- Cálculo del producto de dos números mediante el alogaritmo ruso.
El alogaritmo ruso consiste en duplicar el primer factor y dividir (cociente entero) por 2
el segundo, obteniendo un producto equivalente, salvo si el segundo factor es impar, en
cuyo caso es necesario acumular previamente el primero en donde se va a obtener el
resultado. el proceso se termina cuando el segundo factor es 0. Ejemplo: 25 x 6 = 150.
Ejercicio 23.- Programa que lee 20 datos, compuesto cada uno de ellos por un nombre
de persona y su sueldo neto mensual, y obtenga e imprima el nombre del sueldo de la
persona que más cobra y de la que menos. Si hay varias se imprime la primera que
aparezca en la secuencia de entrada.
5.1.- Funciones.
5.2.- Variables.
5.3.- Especificadores de clase de almacenamiento.
5.4.- El preprocesador. Directivas.
5.5.- Ejercicios.
5.1.- Funciones.
Los programas en C, al menos que sean muy simples, en cuyo caso estarían compuestos
sólo por la función main ( ), están formados por varias funciones. Una función se
declara mediante tres apartados:
Donde
1.- Nos indica el tipo de valor que devuelve la función.
Ejemplo: void = no devuelve ningún tipo
3.- Son las declaraciones. Están separadas por comas. Consta de tipo y
nombre de parámetro.
Antes de usar una función debemos declararlas (decir que las vamos a usar). Se
declaran, normalmente, después de las librerías. Todas las funciones devuelven un valor
(en las de tipo void se ignora). Para especificar este valor se utiliza la sentencia return.
#include<stdio.h>
int maximo(int,int);
long potencia(int,int);
#include<stdio.h>
Existen tres lugares básicos donde se pueden declarara las variables: dentro de las
funciones (variables locales), en la definición de parámetros de funciones (parámetros
formales) y fuera de las funciones (variables globales).
Variables locales: Son aquellas que se declaran dentro del cuerpo de una función
y solo se conocen (están definidas) dentro de esa función. Cualquier intento de
utilizarla fuera de la función donde fue declarada provoca un error de
compilación. Son creadas al entrar en la función y destruidas al salir de ella.
Parámetros formales: Son las variables que se le pasa a una función. Tienen
ámbito de variables locales.
o Estática local que tiene el mismo ámbito que las variables locales pero
existen durante todo el programa, no son destruidas al salir de una
función y solo son inicializadas la primera vez que llamamos a la
función. conservan el valor entre llamadas a la función.
o Estática global tiene el mismo ámbito que una variable global pero solo
conocida en el fichero donde se declara. Para poder compartir una
variable de este tipo en diferentes módulos debemos declararla en ambos
módulos.
auto define una variable local que tiene un tiempo de vida local. Es raramente
utilizada.
# define
# undef
# error
Ejercicio 25.- Escribir una función recursiva que calcule la raíz cuadrada de un número.
Se deben leer tres números N, A y E donde N es el número del cual quiere hallarse la
raíz cuadrada, A es un valor aproximado de la raíz cuadrada y E es el error de tolerancia
del resultado. Utilizamos la función definida por:
A si | A * A - N | < E
Raíz(N,A,E)
Raíz(N,A,E) con A =((A*A + N)/(2 * A)
Ejercicio 28.- Crear una calculadora que me realice las siguientes funciones: suma,
resta, multiplicación, división, factorial, raíz cuadrada y potencia. (Mediante funciones)
6.1.- Concepto.
nombre [índice]
Devuelve el elemento en la posición indicada por índice. Hay que tener en cuenta que
empezamos por 0 (El C no comprueba los límites de los índices, así que si nos pasamos
en un array podemos corromper zonas de memoria y producir resultados inesperados).
Recordamos que en el Tema 2 dijimos que hay veces que interesa convertir un char en
un int. Se puede hacer de varias formas. Una de ellas es escribiendo -‘0’ a continuación
del elemento char. Ejemplo
Ejemplo 1: 6 -‘0’
Ejemplo 2: char frase[a]=3;
frase[a] -‘0’ frase[a] es un entero que vale 3
Tenemos tres formas de pasar un array unidimensional como parámetro a una función
#include <stdio.h>
void forma2(int a[ ])
{
printf("\n");
register int i;
for(i=0;i<10;i++)
printf(" %d",a[i]);
}
Un uso muy común de los arrays unidimensionales son las cadenas de caracteres que
son vectores de caracteres terminados por un carácter nulo, en este caso el límite del
índice debe tener una unidad más para incluir el carácter nulo (por ejemplo si queremos
declarar un array de caracteres que puede contener una cadena de 9 caracteres, como
máximo, debemos declarar 10).
Hay varias funciones que trabajan con las cadenas de caracteres. Están incluidas en la
librería string.h y algunas de ellas son:
Programa 19 Ejemplo
#include <stdio.h>
#include <string.h>
void main(void)
{
char c1[82],c2[82];
printf("\nEscribe la cadena c1: ");
gets(c1);
printf("\nEscribe la cadena c2: ");
gets(c2);
printf("\nLas longitudes de las cadenas son %d
y %d",strlen(c1),strlen(c2));
if(!strcmp(c1,c2))
printf("\nLas cadenas son iguales");
strcat(c1,c2);
printf("\n%s\n",c1);
strcpy(c1,"esta es una prueba");
printf(c1);
if(strchr("hola",'o'))
printf("\no esta en hola");
if(strstr("hola que tal","hola"))
printf("\nhola encontrado");
}
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
int contrasena ( )
{
char s[80];
printf("Introduce la clave para pasar");
gets(s);
if(strcmp(s,"pasar"))
{
return 0;
}
return 1;
}
Programa 20 Ejemplo
#include <stdio.h>
void main(void)
{
int i,j,matriz[4][7];
for(i=0;i<4;i++)
for(j=0;j<7;j++)
matriz[i][j]=i+j;
for(i=0;i<4;i++)
{
for(j=0;j<7;j++)
printf("%2d",matriz[i][j]);
putchar('\n');
}
}
#include <stdio.h>
#define numfilas 4
#define numcolumnas 7
void main(void)
{
int i,j,matriz[numfilas][numcolumnas];
for(i=0;i<numfilas;i++)
for(j=0;j<numcolumnas;j++)
matriz[i][j]=i+j;
for(i=0;i<numfilas;i++)
{
for(j=0;j<numcolumnas;j++)
printf("%2d",matriz[i][j]);
putchar('\n');
}
}
#include <stdio.h>
#define filas 4
#define columnas 7
Se pueden crear arrays de tantas dimensiones como se quiera dependiendo del límite
impuesto por cada compilador. La forma general es:
Programa 22 Ejemplo
#include <stdio.h>
#define numerocadenas 3
#define longitudcadena 81
void main(void)
{
register int i;
char cadenas[numerocadenas][longitudcadena];
puts("\nIntroduccion de cadenas:\n");
for(i=0;i<numerocadenas;i++)
{
printf("Cadena %d: ",i);
gets(cadenas[i]);
}
puts("\n\n\nListado de las cadenas introducidas: \n");
for(i=0;i<numerocadenas;i++)
printf("\nCadena %d: %s",i,cadenas[i]);
}
Ejercicio 30.- Programa que lee 20 números enteros sobre un vector, calculando e
imprimiendo la suma de los componentes de indice par, por un lado, y la suma de los
componentes de indice impar, por otro.
Ejercicio 33.- Programa que genera e imprime una matriz unitaria de orden n.
Ejercicio 35.- Programa que lee dos matrices de orden n x n y las suma, las resta y las
multiplica.
7.1.- Concepto.
7.2.- Aritmética de punteros.
7.3.- Asignación dinámica de memoria.
7.4.- Punteros y arrays.
7.5.- Punteros especiales.
7.6.- Ejercicios.
7.1.- Concepto.
Un puntero contiene una dirección de memoria donde se encuentra otro dato de un tipo
determinado. Un puntero es por tanto una dirección de memoria.
tipo * nombre
tipo * nombre
Existen dos operadores especiales de punteros: &, *. Estos dos operadores son
monarios y no tienen nada que ver con los operadores binarios de multiplicación (*) y
and a nivel de bits (&).
Ejemplo: si m = &cont;
si la variable cont utiliza la posición de memoria 2000
para guardar su valor, y este (su valor) es 100 ......... m =
2000
Programa 23 Ejemplo
#include<stdio.h>
Ejemplo: si m = &cont;
q = *m;
entonces q = 100 ya que 100 es lo guardado en la
dirección 2000, que es la dirección de memoria que
indica m.
Programa 24 Ejemplo
#include<stdio.h>
void main (void)
{
int x=10;
printf("x=%d\n",x);
printf("*&x=%d",*&x);
}
#include<stdio.h>
#include<stdio.h>
void main (void)
{
int u =3;
int v;
int *pu; /* puntero a un entero */
int *pv; /* puntero a un entero */
pu = &u; /* asigna direccion de u a pu */
v = *pu; /* asigna valor de u a v */
pv = &v; /* asigna direccion de v a pv */
printf("\nu=%d &u=%x pu=%x *pu=%d",u, &u, pu,*pu);
printf("\n\nv=%d &v=%x pv=%x *pv=%d",v, &v, pv, *pv);
}
Existen 4 operadores que realizan operaciones aritméticas que pueden realizarse con
punteros. Estos son + , - , + + , - - .
Cada vez que se incrementa un puntero, apunta a la posición de memoria del siguiente
elemento de su tipo base. Cada vez que se decrementa, apunta a la posición del
elemento anterior. Cuando se aplica a punteros a caracteres, esto hace que parezca una
aritmética “normal”, ya que los caracteres siempre ocupan un byte.. Sin embargo, el
resto de los punteros aumentan o decrecen en la longitud del tipo de datos a los que
apunta.
#include<stdio.h>
{
int u =3;
int *pu; /* puntero a un entero */
pu = &u; /* asigna direccion de u a pu */
printf("El numero es u = %d \n",u);
printf("La direccion del numero es &u = %x \n",&u);
u++;
printf("El numero incrementado es u + 1 = u++ = %d \n",u);
printf("La direccion de u++ es &u = %x \n",&u);
pu++;
printf("La direccion de u++ incrementada es pu = %x \n",pu);
getchar();
}
El numero es u = 3
La direccion del numero es &u = 2ffd28
El numero incrementado es u +1 = u++ = 4
La direccion de u++ es &u = 2ffd28
La direccion de u++ incrementada en pu +1 = pu++ = 2ffd2c
#include<stdio.h>
{
char u = 'c';
char *pu; /* puntero a un caracter */
pu = &u; /* asigna direccion de u a pu */
printf("El caracter es u = %c \n",u);
printf("La direccion del caracter es &u = %x \n",&u);
printf("La direccion de u++ es &u = %x \n",&u);
pu++;
printf("La direccion de u++ incrementada es pu = %x \n",pu);
getchar();
}
Supongamos que queremos hacer un programa que lea n valores enteros (máximo 100)
introducidos por teclado por el usuario, los almacene en un vector y los imprima en
orden inverso. Sería un programa como:
#include<stdio.h>
void main (void)
{
#define NMAX 100
int v[NMAX];
int n=0;
int varaux;
register int i;
do
{
printf("\nIntroduce el numero de valores a leer (1 - %d):
",NMAX);
scanf("%d",&n);
}while(n<1||n>NMAX);
for(i=0;i<=n-1;i++)
{
printf("\nIntroduce el valor %d: ",i);
scanf("%d",&varaux);
v[i]=varaux;
}
printf("\nLos valores en orden inverso : \n");
for(i=n-1;i>=0;i--)
printf("%d ",v[i]);
}
Si el usuario introduce como valor de n, el valor 10, estaremos desperdiciando (si un int
ocupa 4 bytes) 90*4 bytes de memoria. Además, no podemos introducir más de NMAX
valores. Estas restricciones vienen impuestas porque el tamaño de un array en la
declaración ha de ser una expresión constante. La asignación de memoria en este caso
se dice que es estática porque se determina en el momento de la compilación.
#include<stdio.h>
#include<malloc.h>
La función malloc ( ) reserva memoria; acepta como argumento los bytes de memoria a
reservar y devuelve un puntero al primer byte de la zona de memoria reservada, los
bytes de memoria solicitados los reserva en un espacio de memoria contiguo. Si no hay
suficiente memoria, devuelve NULL. Un puntero que tiene el valor NULL es un
puntero que no apunta a ningún sitio. La función malloc ( ) se encuentra en la librería
malloc.h.
La memoria asignada a malloc que no se usa se libera con la función free ( ) que
también se encuentra en la librería malloc.h (free = liberar).
Existe una estrecha relación entre los punteros y los arrays. Ya hemos dicho en varias
ocasiones que el nombre de un array es un puntero al primer elemento del array. A
cualquier elemento de un array podemos acceder mediante la aritmética de punteros y
viceversa, cualquier puntero lo podemos indexar con los arrays.
int * x [ 10 ]
Para asignar la dirección de una variable entera llamada var al tercer elemento del array
de punteros, se escribe
x [ 2 ] = & var
*x[2]
Punteros a punteros
Punteros a estructuras
Igual que a cualquier tipo de datos, se pueden crear punteros a estructuras, pero
el operador de acceso a miembros es diferente.
Punteros a funciones:
Una función tiene una posición física en memoria que puede asignarse a un
puntero aunque la función no es una variable. La dirección de la función es el
punto de entrada de la función, por tanto, un puntero a función puede utilizarse
para llamar a la función.
7.6.- Ejercicios.
Ejercicio 36.- Programa que acepte como entrada una cadena de texto y sustituya todos
los conjuntos de dos o más espacios seguidos por espacios únicos.
8.1.- Estructura.
8.2.- Ficheros.
8.1.- Estructura.
Al definir una estructura, a diferencia de las matrices, hemos de identificar uno a uno
todos sus miembros e identificar la propia estructura. Las estructuras están definidas
con la palabra clave struct.
#include<stdio.h>
printf("Nombre: ");
gets(registro.nombre);
printf("Direccion: ");
gets(registro.direccion);
printf("Telefono: ");
gets(registro.telefono);
}
#include<stdio.h>
struct{
char nombre[20];
char direccion[50];
char telefono[10];
}registro[10];
void entrada(void);
void salida(void);
Con lo visto hasta ahora podemos trabajar con gran cantidad de datos de formatos
distintos y podemos, de una manera sencilla, almacenarlos en una variable tipo matriz o
estructura, pero al terminar la ejecución del programa perdemos todos los valores
almacenados.
Vamos a estudiar los ficheros FILE o archivos, en los que vamos a poder almacenar,
leer, modificar, añadir o eliminar datos. Para ello vamos a declarar ficheros, abrirlos,
cerrarlos, vamos a grabar datos, modificarlos, borrarlos, consultar registros.
Para declarar un fichero hemos de definir una variable de tipo puntero a fichero,
que utilizaremos para poder identificarlo. El formato de esta declaración es:
FILE * nombre_identificador
fichero=fopen(nombre_fichero,modo_acceso);
MODO DESCRIPCIÓN
“w” Crea un fichero y lo deja abierto para escritura. Si el fichero
existe lo borra y crea uno nuevo
“a” Añade datos al final de un fichero ya existente. Si no existe
el fichero creará uno nuevo
“r” Abre un fichero para lectura
“rb” Abre un archivo binario para lectura
“wb” Crea un archivo binario para escritura
“ab” Abre una archivo binario para añadir información
“w+” Crea un fichero nuevo para escritura y permite la lectura de
datos. Si el fichero existe lo borra y crea uno nuevo
“r+” Abre un fichero ya existente para lectura y escritura
“a+” Añade datos al final de un fichero ya existente y permite la
lectura de datos.
#include<stdio.h>
struct{
char nombre[20];
char direccion[25];
char telefono[15];
char poblacion[20];
}datos;
void main(void)
{
for(;;)
{
gotoxy(38,5);printf("MENU");
gotoxy(29,8);printf("1.- Introducir registros");
gotoxy(29,10);printf("2.- Modificar registros");
gotoxy(29,12);printf("3.- Borrar registros");
gotoxy(29,14);printf("4.- Consultar registros");
gotoxy(29,16);printf("5.- Finalizar");
gotoxy(19,19);printf("Introduce el numero de la opcion
deseada");
}
}
Pero en Visual C esta función no existe. Hemos de incluir una función que realice esta
tarea. La llamaremos, también gotoxy. Dicha función necesita la librería windows.h y la
añadimos al programa 32A
#include<stdio.h>
#include<windows.h>
struct{
char nombre[20];
char direccion[25];
char telefono[15];
char poblacion[20];
}datos;
void main(void)
{
for(;;)
{
gotoxy(38,5);printf("MENU");
gotoxy(29,8);printf("1.- Introducir registros");
gotoxy(29,10);printf("2.- Modificar registros");
gotoxy(29,12);printf("3.- Borrar registros");
gotoxy(29,14);printf("4.- Consultar registros");
gotoxy(29,16);printf("5.- Finalizar");
gotoxy(19,19);printf("Introduce el numero de la opcion
deseada");
}
}
#include<conio.h>
#include<stdio.h>
#include<process.h> /* para exit() En Visual C no hace falta incluir*/
#include<windows.h>
struct{
char nombre[20];
char direccion[25];
char telefono[15];
char poblacion[20];
}datos;
void main(void)
{
for(;;)
{
gotoxy(38,5);printf("MENU");
gotoxy(29,8);printf("1.- Introducir registros");
gotoxy(29,10);printf("2.- Modificar registros");
gotoxy(29,12);printf("3.- Borrar registros");
gotoxy(29,14);printf("4.- Consultar registros");
gotoxy(29,16);printf("5.- Finalizar");
gotoxy(19,19);printf("Introduce el numero de la opcion
deseada");
opc=getch();
switch(opc)
{
case'5':exit(0);
default:break;
}
}
}
Declaramos un fichero mediante FILE *fichero y hacemos un switch con el caso 1 para
grabar datos mediante la función intro
#include<stdio.h>
#include<conio.h>
#include<string.h> /* strlen */
#include<ctype.h> /* toupper (mayúsculas - minúsculas */
#include<process.h> /* para exit() En Visual C no hace falta incluir*/
#include<windows.h>
struct{
char nombre[30];
char direccion[25];
char telefono[12];
char poblacion[20];
}datos;
donde:
1. identificador_estructura es el nombre con que hemos identificado la
estructura.
En nuestro caso: datos.
tamaño_estructura es el tamaño en bytes de la estructura, aquí se
puede utilizar la función sizeof() que automáticamente nos dará ese
resultado.
nº registros es la cantidad de registros que queremos grabar
En nuestro caso: 1.
fichero es la variable de tipo FILE con que hemos definido el fichero.
Para modificar un registro tenemos que escoger un campo de la estructura, que será el
que compararemos con los registros leídos secuencialmente. Antes de comenzar la
lectura del fichero utilizaremos una variable temporal donde se almacenará el dato que
compararemos posteriormente con uno de los miembros de la estructura. Aquí hemos
escogido el campo datos.nombre y la variable nom. Las dos variables elegidas han de
ser del mismo tipo.
Mediante la función strcmp() comparamos las dos cadenas. Su valor será 0 cuando las
cadenas son iguales.
El bucle de búsqueda comienza con una función while() y utiliza la condición feof(),
que comprueba el final del fichero. La lectura de los registros del fichero se realiza con
la función fread() que es similar a la función fwrite().
Cada vez que seleccionemos un campo el cursor se irá al primer carácter de ese campo.
Borrará todo lo que hay desde la posición que se encuentra hasta el final de la línea con
la función clreol() y nos pedirá que introduzcamos un nuevo valor para ese campo. Una
vez finalizadas las modificaciones, los cambios realizados han de quedar reflejados en
le fichero de disco, ya que hasta ahora sólo se ha modificado la estructura de memoria.
DESPLAZAMIENTO DESCRIPCIÓN
SEEK-SET Principio de fichero
SEEK-CUR Posición actual
SEEK-END Fin de fichero
void modif(void);
void clreol(); /* Borra lo que hay en la linea a partir del cursor */
char opc,nom[30];
int aux;
void main(void)
{
switch(opc)
{
case'1':intro(); break;
case'2':modif(); break;
case'5':exit(0);
default:break;
}
void modif(void)
{
system("cls");
aux=sizeof(datos);
if((fichero=fopen("agenda.txt","r+b"))==NULL) error();
gotoxy(15,12);printf("Introduce Nombre a modificar: ");
gets(nom);
system("cls");
{
gotoxy(18,19);printf("Campo a modificar: ");
opc=getch();
gotoxy(18,19);clreol();
switch(opc)
{
case'1':gotoxy(37,9);clreol();
gets(datos.nombre);break;
case'2':gotoxy(37,11);clreol();
gets(datos.direccion);break;
case'3':gotoxy(37,13);clreol();
gets(datos.telefono);break;
case'4':gotoxy(37,15);clreol();
gets(datos.poblacion);break;
case'5':fseek(fichero,-aux,SEEK_CUR);
fwrite(&datos,sizeof(datos),1,fichero);break;
default:break;
}
}
break;
}
}
fclose(fichero);
}
void clreol()
{
COORD coord;
DWORD written;
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE),&info);
coord.X=info.dwCursorPosition.X;
coord.Y=info.dwCursorPosition.Y;
FillConsoleOutputCharacter (GetStdHandle
(STD_OUTPUT_HANDLE),'',info.dwSize.X-
info.dwCursorPosition.X,coord,&written);
gotoxy(coord.X+1,coord.Y+1);
}
Para borrar un registro usamos la función borra() aunque realmente no elimina los
registros. En C no existe ninguna función que realice esto, lo que se hace es marcar el
registro con el signo *, así no tendrá ninguna validez cuando queramos hacer una
consulta.
void borra(void);
void main(void)
{
case'3':borra();break;
}
void borra(void)
{
system(“clr”);
aux=sizeof(datos);
if((fichero=fopen("a:agenda.txt","r+b"))==NULL) error();
gotoxy(15,12);printf("Introduce Nombre a borrar: ");
gets(nom);
system(“clr”);
while(!feof(fichero))
{
fread(&datos,sizeof(datos),1,fichero);
if(strcmp(datos.nombre,nom)==0)
{
gotoxy(22,9);printf("Nombre : %s",datos.nombre);
gotoxy(22,11);printf("Direccion: %s",datos.direccion);
gotoxy(22,13);printf("Telefono: %s",datos.telefono);
gotoxy(22,15);printf("Poblacion: %s",datos.poblacion);
gotoxy(22,21);printf("Estas seguro de borrar el archivo
(S/N)");
opc=toupper(getch());
system(“clr”);
if(opc='S')
{
strcpy(datos.nombre,"*");
fseek(fichero,-aux,SEEK_CUR);
fwrite(&datos,sizeof(datos),1,fichero);
break;
}
}
}
fclose(fichero);
}
Para eliminar definitivamente un registro marcado deberíamos definir una función que
abriera otro fichero, por ejemplo, copia.txt, fuéramos leyendo todos los registros de
agenda.txt y escribiendo en copia.txt los que no estuvieran marcados, al finalizar
borraríamos el fichero agenda.txt y renombraríamos el fichero copia.txt como
agenda.txt
Para consultar un registro realizamos una función similar a las anteriores pero una vez
localizado el registro lo imprime en pantalla.
void consultar(void);
void main(void)
{
case'4':consultar();break;
}
void consultar(void)
{
system(“cls”);
if((fichero=fopen("a:agenda.txt","r+b"))==NULL) error();
gotoxy(15,12);printf("Introduce Nombre a consultar: ");
gets(nom);
system(“cls”);
while(!feof(fichero))
{
fread(&datos,sizeof(datos),1,fichero);
if(strcmp(datos.nombre,nom)==0)
{
gotoxy(22,9);printf("Nombre : %s",datos.nombre);
gotoxy(22,11);printf("Direccion: %s",datos.direccion);
gotoxy(22,13);printf("Telefono: %s",datos.telefono);
gotoxy(22,15);printf("Poblacion: %s",datos.poblacion);
getch();
break;
}
}
fclose(fichero);
}
isalnum
int isalnum (int c);
Devuelve un valor distinto de cero si "c" es una letra minúscula "a-z" o mayúscula "A-
Z", uno de los dígitos decimales "0-9" o cualquier otro carácter alfabético local.
isalpha
int isalpha (int c);
Devuelve un valor distinto de cero si "c" es una letra minúscula "a-z" o mayúscula "A-
Z", o cualquier otro carácter alfabético local.
iscntrl
int iscntrl (int c);
Devuelve un valor distinto de cero si "c" es cualquier carácter de control (como FF, HT,
NL).
isdigit
int isdigit (int c);
Devuelve un valor distinto de cero si "c" es cualquiera de los dígitos decimales (0-9).
isgraph
int isgraph (int c);
Devuelve un valor distinto de cero si "c" es cualquier carácter de impresión excepto
"espacio".
islower
int islower (int c);
Devuelve un valor distinto de cero si "c" es cualquiera de las letras minúsculas "a-z" u
otra minúscula local.
isprint
int isprint (int c);
Devuelve un valor distinto de cero si "c" es cualquier carácter imprimible, incluyendo el
"espacio".
ispunct
int ispunct (int c);
Devuelve un valor distinto de cero si "c" es cualquier carácter imprimible excepto
"espacio", o si "isalnum(c)" es distinto de cero.
isupper
int isupper (int c);
Devuelve un valor distinto de cero si "c" es una de las letras mayúsculas "A-Z" u otra
mayúscula local.
isxdigit
isxdigit (int c);
Devuelve un valor distinto de cero si "c" es cualquier dígito hexadecimal "0-9", "A-F",
"a-f".
tolower
tolower (int c);
Devuelve la correspondiente letra minúscula si existe y si "isupper(c)" es distinto de
cero; en caso contrario, devuelve "c".
toupper
int toupper (int c);
Devuelve la correspondiente letra mayúscula si existe y si "islower(c)" es distinto de
cero; en caso contrario, devuelve "c".
<errno.h>
Permite comprobar el valor almacenado en "errno" por algunas funciones de librería.
Al arrancar el programa, el valor almacenado en "errno" es cero. Las funciones de
librería almacenan sólo valores mayores que 0 en "errno". Para comprobar si una
función almacena un valor en "errno", el programa debería almacenar un 0 en "errno"
antes de llamar a la función.
EDOM
#define EDOM <expresion #if>
Almacena un valor en "errno" según exista o no un error de dominio.
ERANGE
#define ERANGE <expresion #if>
Almacena un valor en "errno" según exista o no un error de rango.
errno
#define errno <valor modificable int>
Designa un objeto de datos al que se asigna un valor mayor que cero dependiendo de
ciertos errores.
DBL_DIG
#define DBL_DIG <valor_entero 10>
Número de dígitos de precisión para el tipo "double".
DBL_EPSILON
#define DBL_EPSILON <valor_double 10-9>
Produce el menor valor "x" de tipo "double", tal que 1.0 + x ? 1.0.
DBL_MANT_DIG
#define DBL_MANT_DIG <valor_int>
Produce el número de dígitos de mantisa, base "FLT_RADIX", para el tipo "double".
DBL_MAX
#define DBL_MAX <valor_double 1037>
Valor representable finito más grande de tipo "double".
DBL_MAX_10_EXP
#define DBL_MAX_10_EXP <valor_int 37>
Máximo entero "x" tal que 10 elevado a "x" sea un valor representable finito de tipo
"double".
DBL_MAX_EXP
#define DBL_MAX_EXP <valor_int>
Máximo entero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable de tipo "double".
DBL_MIN
#define DBL_MIN <valor_double 10-37>
Valor finito más pequeño representable normalizado de tipo "double".
DBL_MIN_10_EXP
#define DBL_MIN_10_EXP <valor_int -37>
Mínimo entero "x" tal que 10 elevado a "x" es un valor finito representable y
normalizado de tipo "double".
DBL_MIN_EXP
#define DBL_MIN_EXP <valor_int>
Mínimo entero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable y normalizado de tipo "double".
FLT_DIG
#define FLT_DIG <valor_int 6>
Número de dígitos decimales de precisión para el tipo "float".
FLT_MANT_DIG
#define FLT_MANT_DIG <valor_int>
Número de dígitos de mantisa, en base "FLT_RADIX", para el tipo "float".
FLT_MAX
#define FLT_MAX <valor_float 1037>
Valor finito representable más grande de tipo "float".
FLT_MAX_10_EXP
#define FLT_MAX_10_EXP <valor_int 37>
Máximo entero "x" tal que 10 elevado a "x" es un valor finito representable de tipo
"float".
FLT_MAX_EXP
#define FLT_MAX_EXP <valor_int>
Máximo entero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable de tipo "float".
FLT_MIN
#define FLT_MIN <valor_float 10-37>
Menor valor finito representable y normalizado de tipo "float".
FLT_MIN_10_EXP
#define FLT_MIN_10_EXP <valor_int -37>
Mínimo entero "x" tal que 10 elevado a "x" es un valor finito representable y
normalizado de tipo "float".
FLT_MIN_EXP
#define FLT_MIN_EXP <valor_int>
Mínimo ntero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable y normalizado de tipo "float".
FLT_RADIX
#define FLT_RADIX <expresion #if 2>
Produce la base de numeración de todas las representaciones reales.
FLT_ROUNDS
#define FLT_ROUNDS <valor_int>
Describe el modo de redondeo para las operaciones con reales. El valor es "-1" si el
modo está indeterminado, es "0" si el redondeo es hacia "0", es "1" si el redondeo es
hacia el valor representable más cercano, es "2" si el redondeo es hacia +8 y es "3" si el
redondeo es hacia -8.
LDBL_DIG
#define LDBL_DIG <valor_int 10>
Número de dígitos decimales de precisión para el tipo "long double".
LDBL_MANT_DIG
#define LDBL_MANT_DIG <valor_int>
Número de dígitos de mantisa, en base "FLT_RADIX", para el tipo "long double".
LDBL_MAX
#define LDBL_MAX <valor_long_double 1037>
Valor finito representable más grande de tipo "long double".
LDBL_MAX_10_EXP
#define LDBL_MAX_10_EXP <valor_int 37>
Máximo entero "x" tal que 10 elevado a "x" es un valor finito representable de tipo
"long double".
LDBL_MAX_EXP
#define LDBL_MAX_EXP <valor_int>
Máximo entero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable de tipo "long double".
LDBL_MIN
#define LDBL_MIN <valor_long_double 10-37>
Menor valor finito representable y normalizado de tipo "long double".
LDBL_MIN_10_EXP
#define LDBL_MIN_10_EXP <valor_int -37>
Mínimo entero "x" tal que 10 elevado a "x" es unvalor finito representable y
normalizado de tipo "long double".
LDBL_MIN_EXP
#define LDBL_MIN_EXP <valor_int>
Mínimo entero "x" tal que "FLT_RADIX" elevado a "x-1" es un valor finito
representable y normalizado de tipo "long double".
<limits.h>
Contiene macros que determinan varias propiedades de las representaciones de tipos
enteros.
CHAR_BIT
#define CHAR_BIT <expresion #if 8>
Número de bits usados en la representación de un objeto de datos de tipo "char".
CHAR_MAX
#define CHAR_MAX <expresion #if 127>
Máximo valor para el tipo "char", que es el mismo que "SCHAR_MAX" si "char"
representa valores negativos; en caso contrario, el valor es el mismo que
"UCHAR_MAX".
INT_MAX
#define INT_MAX <expresion #if 32767>
Máximo valor para el tipo "int".
INT_MIN
#define INT_MIN <expresion #if -32767>
Mínimo valor para el tipo "int".
LONG_MAX
#define LONG_MAX <expresion #if 2147483647>
Máximo valor para el tipo "long".
LONG_MIN
#define LONG_MIN <expresion #if -2147483647>
Mínimo valor para el tipo "long".
MB_LEN_MAX
#define MB_LEN_MAX <expresion #if 1>
Máximo número de caracteres que constituyen un carácter multibyte en un conjunto de
caracteres local.
SCHAR_MAX
#define SCHAR_MAX <expresion #if 127>
Máximo valor para el tipo "signed char".
SCHAR_MIN
#define SCHAR_MIN <expresion #if -127>
Mínimo valor para el tipo "signed char".
SHRT_MAX
#define SHRT_MAX <expresion #if 32767>
Máximo valor para el tipo "short".
SHRT_MIN
#define SHRT_MIN <expresion #if -32767>
Mínimo valor para el tipo "short".
UCHAR_MAX
#define UCHAR_MAX <expresion #if 255>
Máximo valor para el tipo "unsigned char".
UINT_MAX
#define UINT_MAX <expresion #if 65535>
Máximo valor para el tipo "unsigned int".
USHRT_MAX
#define USHRT_MAX <expresion #if 65535>
Máximo valor para el tipo "unsigned short".
Una excepción por error de rango ocurre cuando el valor de la función está definido
pero no puede ser representado por un valor de tipo "double". La función informa
almacenando el valor "ERANGE" en "errno" y devolviendo uno de los siguientes
valores: "HUGE_VAL" si el valor es positivo y demasiado grande, "0" si el valor es
demasiado pequeño para ser representado, "-HUGE_VAL" si el valor es negativo y con
valor absoluto demasiado grande.
HUGE_VAL
#define HUGE_VAL <valor_double>
Valor devuelto por algunas funciones debido a un error de rango, que puede ser una
representación de infinitud.
acos
double acos (double x);
Angulo cuyo coseno es "x", en el rango [0,p] radianes.
asin
double asin (double x);
Angulo cuyo seno es "x", en el rango [-p/2, +p/2] radianes.
atan
double atan (double x);
Angulo cuya tangente es "x", en el rango [-p/2, +p/2] radianes.
atan2
double atan2 (double y, double x);
Angulo cuya tangente es "y/x", en el rango [-p, +p] radianes.
ceil
double ceil (double x);
Valor entero más pequeño no menor que "x".
cos
double cos (double x);
Coseno de "x" (en radianes).
cosh
double cosh (double x);
Coseno hiperbólico de "x".
fabs
double fabs (double x);
Valor absoluto de "x", "|x|".
floor
double floor (double x);
Mayor valor entero menor que "x".
fmod
double fmod (double x, double y);
Resto de "x/y", el cual es "x-i*y" para algún entero "i", tal que "i*y<x<(i+1)*y". Si "y"
es cero, la función o informa de un error de dominio o simplemente devuelve el valor 0.
frexp
double frexp (double x, int *pexp);
Determina una fracción "f" y un entero "i" en base 2 que representa el valor de "x".
Devuelve el valor "f" y almacena el entero "i" en "*pexp" tal que "f" está en el intervalo
[1/2, 1) o tiene el valor 0, y "x" se iguala a "f*(2i)". Si "x" es 0, "*pexp" es también 0.
ldexp
double ldexp (double x, int exponente);
Devuelve "x*2exponente".
log
double log (double x);
Devuelve el logaritmo natural de "x".
log10
double log10 (double x);
Devuelve el logaritmo en base 10 de "x".
modf
double modf (double x, double *pint);
Determina un entero "i" más una fracción "f" que representan el valor de "x". Devuelve
el valor "f" y almacena el entero "i" en "*pint", tal que "f+i" se iguala a "x", "|f|" está en
el intervalo [0,1), y tanto "f" como "i" tienen el mismo signo que "x".
pow
double pow (double x, double y);
Devuelve "x" elevado a la potencia "y".
sin
double sin (double x);
Devuelve el seno de "x" (en radianes).
sqrt
double sqrt (double x);
Devuelve la raíz cuadrada de "x".
tan
double tan (double x);
Devuelve la tangente de "x" (en radianes).
tanh
double tanh (double x);
Devuelve la tangente hiperbólica de "x".
<stdarg.h>
Contiene declaraciones que permiten acceder a los argumentos adicionales sin nombre
en una función que acepta un número variable de argumentos. Para acceder a los
argumentos adicionales, el programa debe ejecutar primero el macro "va_start" dentro
del cuerpo de la función para inicializar un objeto de datos con información de contexto.
Ejecutando sucesivamente el macro "va_arg", indicando esa información de contexto, se
pueden ir obteniendo los valores de los argumentos adicionales en orden, empezando
por el primer argumento sin nombre. Se puede ejecutar "va_arg" desde cualquier
función que pueda acceder a la información de contexto grabada por "va_start". Si se ha
ejecutado "va_start" en una función, se debe ejecutar el macro "va_end" en la misma
función, indicando la misma información de contexto, antes del retorno de la función.
Para almacenar la información de contexto, se declara un objeto de datos "va_list", que
puede ser un tipo "array" que afecta a cómo comparte información el programa con las
funciones.
va_arg
#define va_arg (va_list ap, T) <valor_de_tipo_T>
Produce el valor del siguiente argumento en orden, según la información de contexto
indicada por "ap". El argumento adicional debe ser de tipo "T" depués de aplicar las
reglas para la promoción de argumentos en la ausencia de prototipo de función.
va_end
#define va_end (va_list ap) <expresion_void>
Realiza la limpieza necesaria para que la función pueda retornar.
va_list
typedef do-tipo va_list;
Es el tipo de datos "do_tipo" que se declara para contener la información de contexto
inicializada
por "va_start" y utilizada por "va_arg".
va_start
#define va_start (va_list ap, ultimo_arg) <expresion_void>
Almacena la información de contexto inicial en "ap". "ultimo_arg" es el nombre del
último argumento declarado.
_IOFBF
#define _IOFBF <expresion constante entera>
Valor del argumento "modo" para "setvbuf" para indicar "buffer" completo.
_IOLBF
#define _IOLBF <expresion constante entera>
Valor del argumento "modo" para "setvbuf" para indicar el "buffer" de línea.
_IONBF
#define _IONBF <expresion constante entera>
Valor del argumento "modo" para "setvbuf" para indicar que no se usa "buffer".
BUFSIZ
#define BUFSIZ <expresion constante entera 256>
Tamaño del "buffer" de flujo de datos utilizado por "setbuf".
EOF
#define EOF <expresion constante entera 0>
Valor de retorno utilizado para señalar el fin de fichero.
FILE
typedef d-tipo FILE;
Es el tipo de datos que almacena toda la información de control para un flujo de datos.
FILENAME_MAX
#define FILENAME_MAX <expresion constante entera>
Máximo tamaño de un "array" de caracteres para almacenar el nombre de un fichero.
FOPEN_MAX
#define FOPEN_MAX <expresion constante entera 8>
Máximo número de ficheros que el entorno operativo permite que estén abiertos
simultáneamente (incluyendo "stderr", "stdin", "stdout").
L_tmpnam
#define L_tmpnam <expresion constante entera>
Número de caracteres que requiere el entorno operativo para representar nombres de
ficheros temporales creados por "tmpnam".
NULL
#define NULL <0, 0L, o (void *)0>
Constante de puntero nulo que es utilizable como una expresión de direccionamiento
constante.
SEEK_END
#define SEEK_END <expresion constante entera>
Valor del argumento "modo" para "fseek" para indicar la búsqueda relativa al final del
fichero.
SEEK_SET
#define SEEK_SET <expresion constante entera>
Valor del argumento "modo" para "fseek" para indicar la búsqueda relativa al comienzo
del fichero.
TMP_MAX
#define TMP_MAX <expresion constante entera 25>
Número máximo de nombres de ficheros diferentes creados por la función "tmpnam".
clearerr
void clearerr (FILE *flujo);
Limpia los indicadores de error y de fin de fichero para el flujo de datos "flujo".
fclose
int fclose (FILE *flujo);
Cierra el fichero asociado con "flujo". Previamente, escribe lo que queda en el "buffer",
descarta cualquier entrada por "buffer" incompleta y libera cualquier "buffer". Devuelve
0 en caso de éxito y EOF en caso contrario.
feof
int feof (FILE *flujo);
Devuelve un valor distinto de 0 si el indicador de final de fichero está a 1.
ferror
int ferror (FILE *flujo);
Devuelve un valor distinto de 0 si el indicador de error está puesto a 1.
fflush
int fflush (FILE *flujo);
Se escibe cualquier salida por "buffer" que esté pendiente. Devuelve 0 si tiene éxito; en
caso contrario, devuelve EOF;
fgetc
int fgetc (FILE *flujo);
Lee el siguiente carácter por "flujo", avanza el indicador de posición y devuelve "(int)
(unsigned char)". Devuelve EOF si pone a 1 el indicador de fin de fichero o el de error.
fgets
char *fgets (char *s, int n, FILE *flujo);
Lee caracteres por "flujo" y los almacena en elementos sucesivos del "array" que
comienza en "s", continuando hasta que almacene "n-1" caracteres, almacene un
carácter "NL" o ponga a 1 los indicadores de error o fin de fichero. Si almacena un
carácter, concluye almacenando un carácter nulo en el siguiente elemento del "array".
Devuelve "s" si almacena algún carácter y no ha puesto a 1 el indicador de error; en
caso contrario, devuelve un puntero nulo.
fopen
fpos_t
typedef do-tipo fpos_t;
Tipo de datos para contener el valor del indicador de posición del fichero almacenado
por "fsetpos" y accedido por "fgetpos".
fprintf
int fprintf (FILE *flujo, const char *formato, ...);
Genera texto formateado, bajo el control del formato "formato" y escribe los caracteres
generados por "flujo". Devuelve el número de caracteres generados o un valor negativo
en caso de error.
fputc
int fputc (int c, FILE *flujo);
Escribe el carácter "(unsigned char) c" por "flujo", avanza el indicador de posición del
fichero y devuelve "(int)(unsigned char) c". En caso de error, devuelve "EOF".
fputs
int fputs (const char *s, FILE *flujo);
Escribe los caracteres de la cadena "s" por "flujo". No escribe el carácter nulo de
terminación. En caso de éxito, devuelve un valor no negativo; en caso de error,
devuelve "EOF".
freopen
FILE *freopen (const char *nombre_fichero, const char *modo, FILE *flujo);
Cierra el fichero asociado con "flujo" y abre el fichero "nombre_fichero" y lo asocia a
"flujo". Devuelve "flujo" si la apertura tiene éxito; en caso contrario, devuelve un
puntero nulo.
fscanf
int fscanf (FILE *flujo, const char *formato, ...);
Lee texto y convierte a la representación interna según el formato especificado en
"formato". Devuelve el número de entradas emparejadas y asignadas, o "EOF" si no se
almacenan valores antes de que se active el indicador de error o de fin de fichero.
fseek
int fseek (FILE *flujo, long desp, int origen);
Activa el indicador de posición de "flujo" según los valores de "desp" y "origen", limpia
el indicador de fin de fichero y devuelve 0 si hay éxito.
Valores de "origen": "SEEK_SET" indica el principio de fichero, "SEEK_CUR" indica
la posición actual, "SEEK_END" indica el final de fichero.
Para un fichero binario, "desp" es un desplazamiento con signo expresado en número de
"bytes", que se añade al indicador de posición indicado por "origen".
Para un fichero de texto, el valor de "desp" puede ser 0 o el valor devuelto por "ftell".
fsetpos
int fsetpos (FILE *flujo, const fpos_t *pos);
Asigna el valor de "pos" al indicador de posición de "flujo", limpia el indicador de fin
de fichero y devuelve 0 si ha tenido éxito.
ftell
long ftell (FILE *flujo);
Devuelve una forma codificada del indicador de posición. Para un fichero binario,
devuelve elnúmero de "bytes" desde el principio de fichero. Para un fichero de texto, le
efecto depende del entorno operativo. En caso de error, devuelve -1.
fwrite
size_t fwrite(const void *p, size_t longitud, size_t nelem, FILE *flujo);
Escribe caracteres por "flujo", tomandolos a partir de la dirección "p", hasta que se
hayan escrito "longitud*nelem" caracteres o se produzca error. Devuelve "n/longitud",
siendo "n" el número de caracteres escritos.
getc
int getc (FILE *flujo);
Tiene el mismo efecto que "fgetc".
gets
char *gets (char *s);
Lee caracteres por el flujo estándar de entrada ("stdin") y los almacena en el "array" que
comienza en "s" hasta que se almacena un carácter "NL" o se active el indicador de
error o el de fin de fichero. Si almacena algún elemento, termina almacenando un
carácter nulo. Devuelve "s" si almacena algún carácter. Sustituye el carácter NL por
‘\0’.
perror
void perror (const char *s);
Escribe una línea de texto por "stderr". Escribe la cadena "s", seguida por dos puntos
(":") y un espacio. Después escribe la misma cadena que devuelve "strerror(errno)"
seguida por "NL".
printf
int printf (const char *formato, ...);
Escribe texto formateado por el flujo "stdout", según las especificaciones de "formato" y
la lista de expresiones. Devuelve el número de caracteres escritos o un valor negativo en
caso de error.
putc
int putc (int c; FILE *flujo);
Tiene el mismo efecto que "fputc".
putchar
int puchar (int c);
Tiene el mismo efecto que "fputc(c, stdout)".
puts
int puts (const char *s);
Escribe los caracteres de la cadena "s" por el flujo "stdout". Escribe un carácter "NL" en
lugar del nulo de terminación. Devuelve un valor no negativo. En caso de error,
devuelve EOF.
remove
int remove <9const char *nombre_fichero);
Elimina el fichero "nombre_fichero".
rename
int rename (const char *viejo, const char *nuevo);
Renombra al fichero de nombre "viejo", poniendole el nombre "nuevo".
rewind
void rewind (FILE *flujo)
La función llama a "fseek(flujo, 0L, SEEK_SET)" y limpia el indicador de error para
"flujo".
setbuf
void setbuf (FILE *flujo, char *buf);
Si "buf" es un puntero nulo, se desactiva el uso de "buffer", en caso contrario llama a
"setvbuf(flujo, buf_IOFBF, BUFSIZ)".
setvbuf
int setvbuf (FILE *flujo, char *buf, int modo, size_t longitud);
Establece el uso de "buffer" para "flujo". Debe invocarse después de abrir el fichero y
antes de realizar cualquier operación sobre él.
EL "modo" "_IOFBF" es para uso completo de "buffer".
El "modo" "_IOLBF" es para usar "buffer" de linea con ficheros de texto.
EL "modo" "_IONBF" es para no usar "buffer".
Si "buf" no es un puntero nulo , se tomará como la dirección base de un "array" que se
usará como "buffer". Si "buf" es nulo, se asigna otro "buffer" que será liberado al cerrar
el fichero.
size_t
typedef ui-tipo size_t;
Tipo entero sin signo que se declara para contener el resultado de "sizeof".
sprintf
int sprintf (char *s, const char *format, ...);
Genera texto formateado y lo almacena en un "array" que comienza en "s", poniendo un
carácter nulo al final.
sscanf
int sscanf (const char *s, const char *format, ...);
Lee texto formateado tomandolo del "array" que comienza en "s".
stderr
#define stderr <puntero a FILE>
Produce un puntero al flujo de salida estándar para mensajes de error.
stdin
#define stdin <puntero a FILE>
Produce un puntero al flujo de entrada estándar.
stdout
#define stdout <puntero a FILE>
Produce un puntero al flujo de salida estándar.
tmpnam
char *tmpnam (char s[L_tmpnam]);
"tmpnam(NULL)" crea una cadena que sirve como nombre de fichero único y devuelve
un puntero a un "array" interno estático. Invocando "tmpnam(s)", la cadena se almacena
en "s" y se devuelve su dirección como valor de la función. Se genera un nombre
distinto cada vez que se invoca. Se garantiza un número "TMP_MAX" de nombres
distintos durante la ejecución del programa.
ungetc
int ungetc (int c, FILE *flujo);
Devuelve "c" (convertido en "unsigned char") al flujo de datos, donde podrá recuperarse
en la siguiente lectura.
<stdlib.h>
Contiene las declaraciones de una colección de funciones útiles y la definición de tipos
y macros
para usarlas.
EXIT_FAILURE
#define EXIT_FAILURE <expresion entera>
Produce el valor del argumento "estado" para "exit" que informa de una terminación sin
éxito.
EXIT_SUCCES
#define EXIT_SUCCES <expresion entera>
Produce el valor del argumento "estado" para "exit" que informa de una terminación con
éxito.
MB_CUR_MAX
#define MB_CUR_MAX <expresion entera 1>
Produce el máximo número de caracteres que comprende un carácter multibyte local. Su
valor es menor o igual que MB_LEN_MAX.
RAND_MAX
#define RAND_MAX <expresion constante entera 32767>
Produce el máximo valor devuelto por "rand".
abort
void abort (void);
LLama a "raise(SIGABRT)" que produce la señal de abortar, lo que causa la
terminación anormal del programa informando al entorno operativo.
abs
int abs (int i);
Devuelve el valor absoluto de "i".
atexit
int atexit (void (*func) (void) );
Registra la función cuya dirección es "func" para ser llamada por "exit". Se pueden
registrar al menos 32 funciones. La función "exit" llama a las funciones en orden
inverso de registro.
atof
double atof (const char *s);
Convierte los caracteres de la cadena "s" a la representación interna de tipo "double" y
devuelve ese valor. Es semejante a "strtod(s,NULL)", pero no almacena necesariamente
código de error en "errno" si ocurre error de conversión.
atoi
int atoi (const char *s);
Convierte los caracteres de la cadena "s" a la representación interna de tipo "int" y
devuelve ese valor. Es semejante a "(int)strtol(s,NULL,10)", pero no se almacena
código de error en "errno".
atol
long atol (const char *s);
Convierte los caracteres de la cadena "s" a la representación interna de tipo "long" y
devuelve ese valor. Es semejante a "strtol(s,NULL,10)", pero no almacena código de
error en "errno".
calloc
void *calloc (size_t nelem, size_t longitud);
Asigna una localización en memoria a un objeto de datos "array" que contiene "nelem"
elementos de tamaño "longitud", asigna ceros a todos los "bytes" del "array" y devuelve
la dirección del primer elemento en caso de éxito; en caso contrario, devuelve un
puntero nulo.
div
div_t div (int numer, int denom);
Divide "numer" entre "denom" y devuelve el cociente y el resto en una estructura de
tipo "div_t". El miembro "coc" es el cociente truncado hacia cero, el miembro "res" es
el resto.
div_t
typedef struct {
int coc; /* cociente */
int res; /* resto */
} div_t;
Es un tipo que se declara para contener el valor devuelto por la función "div". La
estructura contiene miembros que representan el cociente y el resto de una división
entera con signo entre operandos de tipo "int".
exit
void exit (int status);
LLama a todas las funciones registradas por "atexit", cierra todos los ficheros y
devuelve el control al entorno operativo.
free
void free (void *p);
Si "p" no es un puntero nulo, la función libera la memoria asignada al objeto de datos
cuya dirección es "p"; en caso contrario, no hace nada. Se puede liberar la memoria
asignada con "calloc", "malloc", "realloc".
getenv
char *getenv (const char *nombre);
Devuelve el valor de la variable de entorno identificada por "nombre".
ldiv
ldiv_t ldiv (long numer, long denom);
Es semejante a "div", pero aplicada a valores de tipo "long".
ldiv_t
typedef struct {
long coc; /* cociente */
long res; /* resto */
} ldiv_t;
malloc
void *malloc (size_t longitud);
Asigna una dirección de memoria para un objeto de datos de tamaño "longitud" y
devuelve esa dirección.
mblen
int mblen (const char *s, size_t n);
Si "s" no es un puntero nulo, devuelve el número de caracteres en la cadena multibyte
"s" que constituyen el siguiente carácter multibyte, o devuelve -1 si los siguientes n (o
los restantes caracteres) no comprenden un carácter multibyte válido.
mbstowcs
size_t mbstowcs (wchar_t *wcs, const char *s, size_t n);
Almacena una cadena de caractes amplios en elementos del "array" que empieza en
"wcs", convirtiendo, en orden, cada uno de los caracteres multibyte de la cadena
multibyte "s".
mbtowc
int mbtowc (wchar_t *pwc, const char *s, size_t n);
Si "s" no es un puntero nulo, la función determina el número de caracteres en la cadena
multibyte "s" que constituyen el siguiente carácter multibyte. Si "pwc" no es un puntero
nulo, la función convierte el siguiente carácter multibyte en su valor correspondiente de
carácter amplio y almacena este valor en "*pwc".
qsort
void qsort (void *base, size_t nelem, size_t longitud, int (*cmp) (const void *e1, const
void *e2));
Ordena un "array" que comienza en "base", compuesto por "nelem" elementos, cada
uno de los cuales tiene un tamaño de "longitud" expresado en "bytes". LLama a la
función de comparación cuya dirección es "cmp", que debe devolver un valor negativo
si "e1" es menor que "e2", 0 si son iguales y positivo si "e1" es mayor que "e2".
realloc
void *realloc (void *p, size_t longitud);
Cambia el tamaño de la memoria apuntada por "p" al que se indica con "longitud".
Asigna una dirección de memoria para un objeto de datos de tamaño "longitud",
copiando los valores almacenados en "p". Devuelve la nueva dirección de memoria
asignada.
size_t
typedef ui-tipo size_t;
Es el tipo entero sin signo que se declara para contener el resultado del operador
"sizeof".
srand
void srand (unsigned semilla);
Utiliza "semilla", en un objeto de datos de duración estática, para generar una secuencia
de números pseudoaleatorios con "rand".
strtod
double strtod (const char *s, char **finptr);
Convierte los caracteres iniciales de una cadena "s" en la correspondiente
representación interna de tipo "double" y devuelve ese valor. Si "finptr" no es un
puntero nulo, la función almacena en él un puntero al resto de la cadena que no se ha
convertido.
strtol
long strtol (const char *s, char **finptr, int base);
Convierte los caracteres iniciales de una caena "s" en la correspondiente representación
interna de tipo "long" y devuelve ese valor. SI "finptr" no es un puntero nulo, la función
almacena en él un puntero al resto de la cadena que no se ha convertido.
strtoul
unsigned strtoul (const char *s, char **finptr, int base);
Es semejante a "strtol", pero aplicada al tipo "unsigned long".
system
int system (const char *s);
Si "s" no es un puntero nulo, se pasa la cadena "s" para que sea ejecutada por el
intérprete de comandos del entorno operativo, y devuelve la información de estado
proporcionada por el intérprete. Si "s" es un puntero nulo, la función devuelve un valor
distinto de cero si existe intérprete de comandos en el entorno operativo.
wchar_t
typedef i-tipo wchar_t;
Es el tipo entero de la constante de caracteres amplios L'X'. Se declara un objeto de
datos de tipo "wchar_t" para almacenar un carácter amplio.
wctomb
int wctomb (char *s, wchar_t wchar);
Si "s" no es un puntero nulo, la función determina y devuelve el número de caracteres
que se necesitan para representar el carácter multibyte correspondiente al carácter
amplio "wchar". La función convierte "wchar" en su correspondiente carácter multibyte
almacenándolo en el "array s".
NULL
#define NULL <0, 0L, o (void *)0>
Produce una constante de puntero nulo que es utilizable como una expresión de
direccionamiento constante.
memchr
void *memchr (const void *s, int c, size_t n);
Busca el primer elemento de un "array de unsigned char" que es igual a "(unsigned
char) c". El "array" comienza en "s" y tiene "n" elementos. En caso de éxito, devuelve la
dirección de elemento buscado; en caso contrario, devuelve un puntero nulo.
memcmp
int memcmp (const void *s1, const void *s2, size_t n);
Compara los elementos de dos "arrays de unsined char", con direcciones base "s1" y
"s2", y "n" elementos, hasta que encuentra elementos diferentes. Si todos los elementos
son iguales, devuelve 0. Si el elemento diferente de "s1" es mayor que el de "s2",
devuelve un valor positivo; en caso contrario, devuelve un valor negativo.
memcpy
void *memcpy (void *s1, const void *s2, size_t n);
Copia el "array de char" que empieza en "s2" en el "array de char" que empieza en "s1".
Devuelve "s1".
memmove
void *memmove (void *s1, const void *s2, size_t n);
Tiene el mismo efecto que "memcpy", pero actúa incluso si los "arrays" se solapan. En
este caso, se accede a cada valor de "s2" antes de almacenar un nuevo valor en ese
elemento.
memset
void *memset (void *s, int c, size_t n);
Almacena "(unsigned char) c" en cada uno de los elementos del "array de unsigned
char" que empieza en "s" y tiene "n" elementos. Devuelve "s".
size_t
typedef ui-tipo size_t;
Es el tipo entero sin signo de un objeto de datos declarado para contener el resultado del
operador "sizeof".
strcat
char *strcat (char *s1, const char *s2);
Copia la cadena "s2", incluyendo el nulo de terminación, en elementos sucesivos del
"array de char" que almacena la cadena "s1", empezando en el elemento que almacena
el nulo de terminación de "s1". Devuelve "s1".
strcmp
int strcmp (const char *s1, const char *s2);
Compara los elementos de dos cadenas "s1" y "s2" hasta que encuentra elementos
diferentes. Si todos son iguales, devuelve 0. Si el elemento diferente de "s1" es mayor
que el de "s2", devuelve un valor mayor que cero; en caso contrario, devuelve un valor
menor que cero.
strcoll
int strcoll (const char *s1, const char *s2);
Compara dos cadenas "s1" y "s2" utilizando una secuencia de ordenación especial
diferente de la ASCII.
strcpy
char *strcpy (char *s1, const char *s2);
Copia la cadena "s2", incluyendo el nulo, en el "array de char" que comienza en "s1".
Devuelve "s1".
strcspn
size_t strcspn (const char *s1, const char *s2);
Busca el primer elemento "s1[i]" de la cadena "s1" que sea igual a cualquiera de los
elementos de la cadena "s2" y devuelve "i".
strerror
char *strerror (int codigo_error);
Devuelve un puntero a un objeto de datos interno de duración estática que contiene el
mensaje correspondiente al código de error "codigo_error".
strlen
size_t strlen (const char *s);
Devuelve el número de caracteres de la cadena "s", sin incluir el nulo de terminación.
strncat
char *strncat (char *s1, const char *s2, size_t n);
Copia "n" elementos de la cadena "s2" en la cadena "s1" a partir de su nulo de
terminación. Al final pone el nulo de terminación y devuelve "s1".
strncmp
int strncmp (const char *s1, const char *s2, size_t n);
Compara los elementos de las cadenas "s1" y "s2" hasta que encuentra alguno diferente
o hasta que se han comparado "n" elementos. Si todos los elementos son iguales,
devuelve 0. Si el elemento diferente de "s1" es mayor que el de "s2" (tomados como
"unsigned char"), devuelve un número positivo. En caso contrario, devuelve un número
negativo.
strpbrk
char *strpbrk (const char *s1, const char *s2);
Busca el primer elemento "s1[i]" en la cadena "s1" que sea igual a cualquiera de los
elementos de "s2". Si "s1[i]" no es el nulo de terminación, devuelve "&s1[i]"; en caso
contrario, devuelve un puntero nulo.
strrchr
char *strrchr (const char *s, int c);
Busca el último elemento de la cadena "s" que es igual a "(char)c". En caso de éxito,
devuelve la dirección de tal elemento; en caso contrario, devuelve un puntero nulo.
strspn
size_t strspn (const char *s1, const char *s2);
Busca el primer elemento "s1[i]" en la cadena "s1" que no sea igual a ninguno de los
elementos de "s2" y devuelve "i".
strstr
char *strstr (const char *s1, const char *s2);
Busca la primera secuencia de elementos en la cadena "s1" que se empareje con los
elementos de la cadena "s2", sin incluir su nulo. En caso de éxito, devuelve la dirección
del primer elemento emparejado; en caso contrario, devuelve un puntero nulo.
strtok
char *strtok (char *s1, const char *s2);
Permite separar una cadena "s1" en partes usando como delimitadores los caractes de
otra "s2". Cada vez que se invoca, devuelve un puntero a la siguiente palabra de la
cadena "s1".
Devuelve un puntero nulo cuando no existe ninguna palabra que devolver.
La primera vez que se llama a "strtok", se utiliza realmente "s1" en la llamada. Las
llamadas posteriores utilizan un puntero nulo como primer argumento. Se puede usar un
conjunto diferente de delimitadores en cada llamada.
Esta función modifica la cadena "s1". Cada vez que se encuentra una palabra, se pone
un carácter nulo donde estaba el delimitador.
strxfrm
size_t strxfrm (char *s1, const char *s2, size_t n);
Se usa en entornos de lenguajes extranjeros que no utilicen el secuenciamiento ASCII.
Transforma los "n" primeros elementos de la cadena "s2" para que pueda usarse con la
función "strcmp". La función "strxfrm" coloca entonces el resultado en la cadena "s1".
Después de la transformación, el resultado de "strcmp" con "s1" y de "strcoll" con la
cadena original "s2" será el mismo. La función devuelve la longitud de la cadena
transformada.
CLOCKS_PER_SECOND
#define CLOCKS_PER_SECOND <valor_aritmetico>
Produce el número de pulsos de reloj, devuelto por "clock" en un segundo.
NULL
#define NULL <0, 0L, o (void *)0>
Produce una constante de puntero nulo que se puede utilizar como una expresión
constante de direccionamiento.
asctime
char *asctime (const struct tm *tp);
Convierte la información almacenada en la estructura apuntada por "tp" en una cadena
de caracteres que expresa la fecha y hora en lengua inglesa con la forma: Mon Apr 12
09:12:05 1993\n\0. Devuelve la dirección de la cadena.
El puntero que se pasa, "tp", puede obtenerse con "localtime" o con "gmtime".
clock
clock_t clock (void);
Devuelve el número de pulsaciones de reloj de un lapso de tiempo del procesador,
contando desde el momento de arranque del programa. Devuelve "-1" si el entorno
operativo no puede hacer esa medida.
clock_t
typedef a-tipo clock_t;
Es el tipo aritmético "a-tipo" de un objeto de datos que se declara para contener el valor
que devuelve "clock". El valor representa el lapso de tiempo del procesdor.
ctime
char *ctime (const time_t *cal);
Convierte el tiempo de calendario que está en "*cal" a una representación de texto de la
hora local. Es equivalente a "asctime(localtime(cal))". La hora de calendario se obtiene
normalmente con una llamada a "time".
difftime
double difftime (time_t t1, time_t t0);
Devuelve la diferencia, en segundos, entre los tiempos de calendario "t0" y "t1".
gmtime
struct tm *gmtime (const time_t *tod);
Almacena en la estructura de tiempo una codificación del tiempo de calendario
apuntado palmacenado en "*tod", expresado en Tiempo Universal Coordinado (UTC,
antes GMT). Devuelve la dirección a la estructura de tiempo.
El valor de "*tod" se obtiene normalmente llamando a "time".
mktime
time_t mktime (struct tm *tp);
Devuelve la hora de calendario,con la representación propia de "time", correspondiente
a la hora local almacenada en la estructura apuntada por "tp". Devuelve "-1" si la
información no corresponde a una hora de calendario válida.
size_t
typedef ui-tipo size_t;
Es el tipo entero sin signo de un objeto de datos que se declara para contener el
resultado del operador "sizeof".
strftime
size_t strftime (char *s, size_t n, const char *formato, const struct tm *tp);
Toma los valores de la estructura de tiempo apuntada por "tp" y genera texto
formateado, según las especificaciones de "formato", almacenandolo en la cadena "s" de
tamaño "n". Hay 22 especificaciones de formato.
time
time_t time (time_t *tod);
Devuelve la hora actual de calendario del sistema. Si el entorno operativo no puede
determinarla, devuelve "-1". Si "tod" no es un puntero nulo, la hora también queda
asignada a "*tod".
time_t
typedef a-tipo time_t;
Es el tipo aritmético de un objeto de datos que se declara para almacenar el valor
devuelto por "time". El valor representa la hora de calendario.
tm
struct tm {
int tm_sec; /* segundos después del minuto, 0-59 */
int tm_min; /* minutos después de la hora, 0-59 */
int tm_hour; /* hora del día, 0-23 */
int tm_mday; /* día del mes, 1-31 */
int tm_mon; /* mes del año, 0-11 */
int tm_year; /* años desde 1900 */
int tm_wday; /* días desde el domingo, 0-6 */
int tm_yday; /* día del año, 0-365 */
int tm_isdst; /* indicador de ajuste horario */
};
Se utiliza para mantener la fecha y hora separadas en sus compoentes.
El miembro "tm_isdst" tiene un valor positivo si el ejuste horario es efectivo, tiene el
valor "0" si no es efectivo o un valor negativo si el entorno operativo no puede
determinar su estado.