Sei sulla pagina 1di 29

Fundamentos de informtica

Sintaxis bsica de C/C++


1 de Grado en Ingenieras

Departamento de Lenguajes y Ciencias de la Computacin


Escuela Politcnica Superior
Universidad de Mlaga

30 de noviembre de 2012
Esta obra est bajo una licencia Reconocimiento-NoComercial-CompartirIgual 3.0 Un-
ported de Creative Commons: No se permite un uso comercial de la obra original ni
de las posibles obras derivadas, la distribucin de las cuales se debe hacer con una li-
cencia igual a la que regula la obra original. Para ver una copia de esta licencia, visi-
te http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es_ES o envie una carta a
Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. a. inclu-
ye

Usted es libre de:

Copiar, distribuir y comunicar pblicamente la obra.


Hacer obras derivadas.
Bajo las siguientes condiciones:
Reconocimiento (Attribution) Debe reconocer los crditos de la obra de la manera
especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene
su apoyo o apoyan el uso que hace de su obra).
No comercial (Non commercial) No puede utilizar esta obra para fines comerciales.
Compartir bajo la misma licencia (Share alike) Si altera o transforma esta obra,
o genera una obra derivada, slo puede distribuir la obra generada bajo una licencia
idntica a sta.
Entendiendo que:
Renuncia Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del
titular de los derechos de autor
Dominio Pblico Cuando la obra o alguno de sus elementos se halle en el dominio
pblico segn la ley vigente aplicable, esta situacin no quedar afectada por la licencia.
Otros derechos Los derechos siguientes no quedan afectados por la licencia de ninguna
manera:
Los derechos derivados de usos legtimos u otras limitaciones reconocidas por ley
no se ven afectados por lo anterior.
Los derechos morales del autor
Derechos que pueden ostentar otras personas sobre la propia obra o su uso, como
por ejemplo derechos de imagen o de privacidad.
Aviso Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la
licencia de esta obra.
Contenidos

II Introduccin a C/C++ 3
1. Sintaxis bsica 4
1. El preprocesador de C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Palabras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4. Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6. Tipos predefinidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
7. Definicin de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
8. La asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
9. Bloque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
10. Sentencias de seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
11. Sentencias de repeticin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
12. Subprogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
12.1. Procedimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
12.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
12.3. Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
13. Tipos definidos por el programador . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
13.1. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
13.2. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
13.3. Anidamientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

A. Bibliotecas estndares de C++ 24


1. Entrada/salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2. Ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3. Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

B. Bibliotecas estndares de C 27
1. Entrada/salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2. Clasificacin de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3. Matemtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4. Utilidades estndares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2
Parte II

Introduccin a C/C++

3
Captulo 1

Sintaxis bsica

1. El preprocesador de C/C++
El preprocesador de C/C++ examina el cdigo fuente y lo modifica antes de ser compilado.
Busca lneas o directivas que empiezan con el carcter # en la primera columna. La mayora de
estas directivas sirve para compilar (o no) selectivamente trozos del cdigo fuente.
Una de las ms utilizadas es la directiva de inclusin de ficheros, include y se utiliza para
incluir ficheros, bien ubicados en directorios estndares poniendo entre <> el nombre del fichero:
#include <fichero>

o bien ubicados en directorios no estndares, poniendo entre comillas dobles el nombre de fichero
y empezando el camino en el directorio actual:
#include "fichero"

Otra de las directivas del preprocesador ms utilizadas es define, la cual sustituye todas las
ocurrencias de una cadena abreviada en el cdigo fuente por otra ms compleja de escribir.
#define cadena_abreviada cadena_compilada

El uso de define es ms general y admite incluso argumentos en la cadena abreviada para


utilizarla a modo de funcin o macro.

2. Palabras reservadas
Son las palabras clave que permiten construir la estructura sintctica de C y C++ y no
necesitan definirse porque el compilador ya conoce su significado:

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Posteriormente se aadieron las palabras reservadas que se incorporaron a la sintaxis de C++:

4
Captulo 1. Sintaxis bsica 5

asm false protected try


bool friend public typeid
catch inline reinterpret_cast typename
class mutable static_cast using
const_cast namespace template virtual
delete new this wchar_t
dynamic_cast operator throw
explicit private true

3. Literales
Son las constantes sin nombre, tanto numricas como textuales, que no necesitan ser definidas.
Los caracteres van entre comillas y los nmeros no. Adems, los nmeros pueden llevar sufijos
para indicar el tipo de dato que es:
Nmeros naturales: 1452, 12345u, 123456789ul.
Nmeros enteros: 1452, -325, 123456789l.
Nmeros en base octal: 0166, 0777.
Nmeros en base hexadecimal: 0x1a, 0X1A.
Nmeros reales en coma fija de doble precisin: 1.4.
Nmeros reales en coma fija de simple precisin: 1.4f.
Nmeros reales en coma fija de gran precisin: -4.2L.
Nmeros reales en coma flotante: -4e2, 3e-5, 12e-9L.
Caracteres simples imprimibles: 'a', '+', '&'.
Caracteres ascii especificados con su cdigo en octal: '\017'.
Caracteres ascii especificados con su cdigo en hexadecimal: '\x2c'.
Cadenas de caracteres: "Si es una cadena, las comillas son dobles.".
Cadena de caracteres vaca: "".
La tabla 1 muestra algunos caracteres no imprimibles que en C/C++ se pueden escribir como
secuencias de escape.

Secuencia de escape Nombre del carcter


'\a' campana (alarm)
'\b' retroceso (backspace)
'\f' avance de pgina (form feed)
'\n' avance de lnea (new line)
'\r' retorno de carro (carriage return)
'\t' tabulador (tabulator)
'\v' tabulador vertical (vertical tabulator)
'\\' diagonal invertida (backslash)
'\?' interrogacin (question mark)
'\' ' apstrofe (apostrophe)
'\"' comillas (quotation mark)

Tabla 1: Secuencias de escape de C/C++.

5
Captulo 1. Sintaxis bsica 6

4. Identificadores
Un identificador es una palabra que no es reservada, tiene un mximo de 32 caracteres, comien-
za por una letra y va seguida de letras, dgitos o el carcter subguin _. As son identificadores:
dato, dato1, dato2000, Pi_Al_Cuadrado, Pi_doble,
pero no son identificadores:
50_Al_Cuadrado, 5por15, variable.entera, constante K (con el espacio en
blanco), while.

5. Expresiones
C y C++ admiten distintos tipos de expresiones combinadas con distintos tipos de operadores.
Pueden ser textuales, numricas y lgicas. En general, las expresiones de distinto tipo no pueden
mezclarse para no violar las llamadas reglas de compatibilidad de tipos, las cuales, por ejemplo, no
permiten mezclar caracteres con nmeros o nmeros con expresiones lgicas.

Expresiones de caracteres
Los operandos bsicos son literales, constantes simblicas o variables de tipo carcter. Las
llamadas a funciones que devuelven caracteres tambin son expresiones de caracteres. Con los
caracteres simples en general no se opera, pero en C++ (no en C) podemos comparar las cadenas
de caracteres con los operadores relacionales <, >, <=, >=, == y !=, y tambin podemos unirlas con
el operador de concatenacin +, es decir, la expresin "Hola, " + "que tal!" nos produce
"Hola, que tal!".

Expresiones numricas
Los operandos bsicos son literales, constantes simblicas o variables de tipo numrico. Estas
expresiones se forman combinando operandos numricos con los operadores aritmticos +, -, *, /, %
y los parntesis (). Pueden contener llamadas a funciones que devuelvan valores numricos como
sqrt(), sin(), floor()... definidas en la biblioteca matemtica estndar (vase el apndice B).

Expresiones lgicas
Son expresiones que devuelven true o false, llamadas de tipo lgico. Pueden ser variables,
constantes simblicas o llamadas a funciones que devuelvan valores de tipo lgico. Las compara-
ciones formadas con los operadores relacionales <, >, <=, >=, == y != tambin son expresiones de
tipo lgico, aunque sus operandos pueden ser de cualquier tipo cuyos dominios estn ordenados,
como los nmeros o los caracteres.
Las expresiones lgicas pueden agrupar subexpresiones lgicas con los operadores lgicos de
conjuncin, &&, disyuncin, ||, o negacin, !, y los parntesis.

Precedencia de operadores
Siempre que no se violen las reglas de compatibilidad de tipos, en una expresin pueden aparecer
distintos tipos de operadores, los cuales se operan en el orden que indiquen los parntesis escritos
en la expresin y segn el orden que les corresponda por su precedencia. La tabla 2 muestra
la precedencia de operadores de mayor a menor prioridad. En general, los aritmticos son ms
prioritarios que los comparativos, y stos a su vez son ms prioritarios que los lgicos. Ntese, no
obstante, la alta prioridad del operador lgico de negacin !.

6
Captulo 1. Sintaxis bsica 7

Tipo Operadores Asociatividad


De agrupacin () izquierda a derecha
De acceso . [] -> izquierda a derecha
Unarios ++ -- + - ! derecha a izquierda
Multiplicativos * /% izquierda a derecha
Aditivos + - izquierda a derecha
Entrada/salida << >> izquierda a derecha
Relacional < > <= >= izquierda a derecha
Igualdad == != izquierda a derecha
AND lgico && izquierda a derecha
OR lgico || izquierda a derecha
Condicional ?: derecha a izquierda
Asignacin = += -= *= /= %= derecha a izquierda
Secuencia , izquierda a derecha

Tabla 2: Precedencia de operadores por orden descendente de prioridad.

Conversiones de tipos
C/C++ realiza las siguientes conversiones de tipos implcitas:
Cuando se mezclan operandos numricos enteros y/o reales en una expresin, el tipo de la
expresin se promociona al ms preciso y/o al de mayor tamao.
Cuando una expresin de tipo numrico se asigna a una variable del mismo tipo pero de
menor precisin, la expresin se convierte al tipo de la variable destino, perdindose la
precisin.
Los caracteres en realidad se almacenan con su cdigo ascii, por lo que C/C++ los admiten
en expresiones de tipo entero, pero no es recomendable mezclar caracteres con nmeros.
Aunque las expresiones enteras utilizadas como expresiones lgicas es un concepto herededa-
do de C, tanto en C como en C++ pueden emplearse expresiones enteras en las condiciones,
considerndose falso el valor 0, y verdadero cualquier valor distinto de 0.
Por otro lado, son posibles las conversiones de tipo explcitas que tengan sentido. Para ello, en
las expresiones se puede utilizar el llamado cast con el nombre de tipo destino entre parntesis al
estilo C:
(tipo) expresion

o bien al estilo C++, llamando al tipo como si fuera una funcin:


tipo (expresion)

6. Tipos predefinidos
Los tipos predefinidos son los tipos carcter o numricos simples, tambin llamados escalares.
Aunque no se considera escalar, en C++ se puede utilizar tambin como predefinido el tipo cadena,
string. Sus dominios estn ordenados, por lo que puede utilizarse los operadores relacionales con
cualquiera de ellos. Por otro lado, el tipo lgico es un tipo simple y predefinido en C++, pero no
existe en C.
Todos los tipos predefinidos, a excepcin de los numricos de tipo real, son ordinales porque
cada valor tiene un sucesor y un predecesor nicos (excepto el primer y ltimo valor, lgicamente).
Las cadenas, al no ser escalares, tampoco se consideran ordinales.

7
Captulo 1. Sintaxis bsica 8

La tabla 3 muestra los tipos predefinidos indicando si almacenan signo y sus variantes segn
su tamao. La funcin predefinida sizeof(tipo) puede utilizarse para determinar el tamao
en bytes de un determinado tipo.

Caracteres char
(ordinales) unsigned char
Cadenas de caracteres string
(no escalares) (Slo en C++)
Nmeros naturales unsigned short [int]
(ordinales) unsigned int
unsigned long [int]
unsigned long long [int]
Nmeros enteros short [int]
(ordinales) int
long [int]
long long [int]
Nmeros reales: float
(no ordinales) double
long double
Valores lgicos: bool
(ordinales: false<true) (Slo en C++)

Tabla 3: Tipos predefinidos en C/C++ (los corchetes no se escriben, indican lo que es opcional).

7. Definicin de datos
Variables
Todas las variables deben definirse antes de ser usadas. Tienen alcance de bloque (block scope),
por lo que slo pueden utilizarse dentro del bloque donde se definen (vase seccin 9 ms adelante).
Pueden definirse sin inicializar:
tipo identificador;

o con un valor inicial:


tipo identificador = expr_constante;

La expr_constante puede ser un literal, una constante simblica o una expresin constante
previamente definida que sea compatible con el tipo de la variable.

Constantes simblicas
Las constantes simblicas son constantes con un nombre. En C++ se definen con la palabra
reservada const seguida del tipo:
const tipo identificador = expr_constante;

donde la expr_constante puede ser un literal o bien otra constante simblica previamente
definida que sea de tipo compatible. En C se suele utilizar la directiva define del preprocesador,
la cual no asigna ningn tipo a la constante ni tampoco le reserva memoria porque es una simple
sustitucin que realiza el preprocesador previa a la compilacin:
#define identificador constante

8
Captulo 1. Sintaxis bsica 9

8. La asignacin
Es la sentencia de transferencia de datos por excelencia en C/C++. Su sintaxis es la siguiente:
valorL = valorR;

Esta sentencia simplemente transfiere el resultado obtenido despus de evaluar valorR a la


posicin de memoria indicada por valorL 1 . Ntese que el sentido de la transferencia es de derecha
a izquierda y que el operador = no tiene nada que ver con la comparacin de igualdad.
El valorR puede ser cualquier expresin tipo compatible con el valorL, pero el valorL debe ser
una variable o cualquier otra referencia vlida a una posicin de memoria, tal como muestran los
siguientes ejemplos:
float a, b, c;
// ejemplos validos
a = 4.0;
a = c;
a = b + c;
b = 2*sin(a) + c;

// en los ejemplos siguientes el valorL no es valido


a + b = 3.0; // 3.0 se guarda en a o en b?
sin(a) = a; // sin(a) no es una posicion de memoria
4 = a; // 4 tampoco es una posicion de memoria

Cuando el valorL es una expresin que no referencia una posicin de memoria, es tpico el
siguiente mensaje o alguno similar con el que responden los compiladores o alguno similar:
error: lvalue required as left operand of assignment

E/S bsica
En C++ se utiliza la biblioteca estndar moderna <iostream>:
#include <iostream>
using namespace std;
...
cout << expresion << expresion << ...; // salida
cin >> variable >> variable >> ...; // entrada

Los tipos de las expresiones y variables pueden ser cualesquiera de los predefinidos, incluyendo
cadenas de caracteres. En el caso de la lectura de cadenas, slo se lee hasta el primer blanco
(espacio, tabulador o carcter de fin de lnea).2
En C slo podemos utilizar la biblioteca tradicional <stdio.h>: 3
#include <stdio.h>
...
printf("formato", expresion, expresion, ...); // salida
scanf("formato", & variable, & variable, ...); // entrada

Ntese en ambos casos que la entrada debe producirse siempre sobre variables o valoresL que
hagan referencia a una posicin de memoria donde se pueda guardar el valor que entra. El valor
de salida en cambio puede ser cualquier expresin o valorR.
1 La L y la R vienen del ingls, left y right, por estar a la izquierda y a la derecha del operador = respectivamente.
2 Para leer una lnea completa, utilcese la funcin getline de la biblioteca (ver seccin A).
3 Vase algn libro de programacin en C para ms informacin.

9
Captulo 1. Sintaxis bsica 10

9. Bloque
Agrupacin de sentencias entre llaves {} que pueden incluso anidar otros bloques. Suelen
formar parte de las sentencias de control de flujo.
{
sentencias
{ // bloque anidado

sentencias

}
sentencias

{ // otro bloque anidado

{ // aun mas anidado


sentencias
}

}
}

10. Sentencias de seleccin


Son sentencias de control de flujo que permiten seleccionar qu sentencias se ejecutan a conti-
nuacin en funcin del valor verdadero o falso que toma una condicin. Todas las condiciones son
expresiones de tipo lgico.

Seleccin genrica mltiple

if (condicion) {

sentencias

}
else if (condicion) { // opcional

sentencias

}
else if (condicion) { // opcional

sentencias

}
...
else { // opcional

sentencias

10
Captulo 1. Sintaxis bsica 11

Seleccin basada en una expresin comn


Las condiciones de la sentencia if-else son independientes unas de otras, pero a veces
todas las condiciones dependen de una sola expresin y resulta incmodo y propenso a errores
tener que repetirla varias veces. La sentencia switch permite seleccionar sentencias en funcin
del valor que toma una expresin escribindola una sola vez. Se ejecutan las sentencias del caso
coincidente con el valor que toma la expresin. La expresin debe ser de tipo ordinal, es decir,
escalar pero no de tipo real.
switch (expresion) {
case valor11: case valor12: ...

sentencias;

break;

case valor21: case valor22: ...

sentencias;

break;
...

default:

sentencias;

Aunque la sentencia break es opcional, su ausencia provoca la ejecucin de las sentencias de


todos los casos por debajo del caso coincidente hasta el siguiente break o hasta el final de la
sentencia switch.

11. Sentencias de repeticin


Son sentencias de control de flujo que permiten ejecutar un bloque de sentencias mientras sea
verdadero la condicin de control del bucle. Esta condicin se evala despus o antes de cada
repeticin o iteracin. Los bucles pre-test evalan la condicin antes de cada iteracin, mientras
que los post-test la evalan despus de cada iteracin.

Bucles pre-test

while (condicion) {

sentencias

for (expresion; condicion; expresion) {

sentencias

11
Captulo 1. Sintaxis bsica 12

La primera expresion del for slo se ejecuta una vez antes de empezar el bucle. La condicin
se evala justo antes de cada iteracin. Y la ltima expresin se ejecuta despus de cada iteracin
completa, justo antes de la siguiente evaluacin de la condicin de control.
El bucle for es ms adecuado cuando existe una variable de control clara de la que depende
la terminacin.

Bucle post-test
En los bucles post-test la condicin se evala despus de cada iteracin, por lo que al menos
siempre se ejecuta el cuerpo del bucle una vez.
do {

sentencias

} while (condicion);

La sentencias continue y break dentro de un bucle terminan prematuramente la iteracin


actual y todo el bucle respectivamente. Pero son sentencias que no se deben utilizar porque tienden
a desestructurar el cdigo.

12. Subprogramas
Los subprogramas permiten ejecutar bloques de sentencias que se definen una sola vez en
el programa, pero que pueden llamarse mltiples veces con diferentes datos o parmetros. Es-
tos parmetros pueden ser de entrada, cuando suministran informacin al subprograma llamado
para realizar sus clculos, o pueden ser de salida si devuelven informacin que ha calculado el
subprograma. Tambin pueden ser de entrada-salida.
Los parmetros que aparecen dentro del subprograma se llaman formales, o fictceos 4 , mientras
que los que aparecen en las llamadas son los parmetros reales. Esto es as porque los parmetros
de los subprogramas no estn en memoria hasta que cobran vida cuando son llamados y sustituidos
por los reales, que ya existen en memoria. Al terminar el subprograma, los parmetros fictceos
desaparecen de la memoria del proceso.
Cada parmetro formal definido en la cabecera del subprograma especifica el tipo del corres-
pondiente parmetro real que debe aparecer en la llamada en el mismo orden, de tal manera que
el tipo del parmetro real debe ser compatible con el que indica el parmetro formal.
En general, en los lenguajes de programacin existen dos tipos de subprogramas: los procedi-
mientos, cuyas llamadas representan una accin; y las funciones, cuyas llamadas representan un
valor y tratan de simular el comportamiento de una funcin matemtica.

12.1. Procedimientos
Los procedimientos no devuelven nada como valor de funcin por lo que no actan como las
tpicas funciones matemticas, y la informacin de salida la devuelven siempre en parmetros de
salida o por algn dispositivo de salida como la pantalla. Antes de realizarse llamadas, hay que
definir el procedimiento como se muestra a continuacin:
4 En ingls dummy arguments.

12
Captulo 1. Sintaxis bsica 13

void Identificador(definicion param_formal1,


definicion param_formal2, ...)
{

sentencias

La llamada a un procedimiento es una sentencia por s sola:


Identificador(param_real1, param_real2, ...);

12.2. Funciones
Las funciones son subprogramas que pueden simular las llamadas a las tpicas funciones mate-
mticas, ya que devuelven el valor que toma la propia funcin a travs de la sentencia return, la
cual debe aparecer al menos una vez dentro del subprograma, y preferentemente una sola vez al
final. En la definicin debe especificarse el tipo del valor devuelto, tal como se indica a continuacin:
tipo Identificador(definicion param_formal1,
definicion param_formal2, ...)
{

sentencias

return expresion; // del tipo de la funcion


}

La llamada a una funcin en realidad no es una sentencia, sino un valor de un determinado


tipo, y como tal, normalmente estar dentro de una expresin que sea compatible con el tipo del
valor que toma la funcin.
... Identificador(param_real1, param_real2, ... ) ...

Antes de evaluar la funcin se evalan sus argumentos, y la funcin se evala antes que la
expresin donde aparece la llamada.

12.3. Parmetros
Ya hemos dicho que los parmetros puede ser de entrada o salida segn la direccin hacia donde
fluya la informacin. Los parmetros de entrada deben estar inicializados antes de la llamada, ya
que es informacin de entrada al subprograma. Los parmetros de salida deben modificarse al
menos una vez dentro del cuerpo del subprograma, ya que es la informacin que generar el
subprograma. Los parmetros de salida no necesitan ser inicializados antes de realizar la llamada,
pero los de entrada-salida s.
Puesto que los parmetros de salida y de entrada-salida van a contener la informacin generada
por el subprograma despus de la llamada, el parmetro real de la llamada debe ser una variable
o valorL que haga referencia a una posicin de memoria donde se guardar el resultado. Se dice
que se pasan por referencia. La definicin del parmetro formal utiliza el carcter & detrs del
tipo:
tipo Subprograma( ..., tipo & param_formal, ...)

Sin embargo, los parmetros reales de entrada pueden ser cualquier expresin compatible con
el correspondiente parmetro formal. En realidad, se crea una copia nueva del parmetro real, ya
que el original no es necesario modificarlo. Se dice que se pasa por valor. Aunque no es obligatorio,
es conveniente poner el calificador const delante del tipo en la definicin del parmetro formal

13
Captulo 1. Sintaxis bsica 14

para que el compilador avise cuando se modifique un parmetro de entrada, lo que normalmente
no es necesario5 :
tipo Subprograma( ..., const tipo param_formal, ...)

Una tercera posibilidad, habitual en el paso de variables de tipo compuesto de entrada, es


pasarlos por referencia constante. Esto evita la sobrecarga de la copia innecesaria de registros que
podran ocupar mucho espacio de memoria y, aunque hagan referencia directa al parmetro real,
se protegen para que dentro del subprograma no se modifique accidentalmente. En este caso se
debe poner tanto la palabra const como el carcter & en la definicin del parmetro formal (ver
seccin 13.1).

13. Tipos definidos por el programador


Son tipos no predefinidos por el lenguaje, pero que puede definir el programador basndose
en los tipos predefinidos elementales o en otros tipos definidos anteriormente por el programador.
En general, los tipos compuestos o estructurados debe definirlos el programador para especificar
el tamao y tipo de cada uno de sus componentes.
La definicin de un tipo compuesto puede hacerse de forma explcita, dndole un nombre con
la sentencia typedef. En una sentencia posterior se utilizar ese nombre para definir las variables
de ese tipo compuesto como un tipo predefinido. Pero C/C++ admiten la definicin de arrays de
forma implcita, sin nombre, en la misma sentencia que se define la variable, como veremos en la
seccin 13.2.

13.1. Registros
Un registro es una coleccin heterognea (de tipos distintos) de variables o campos que se
acceden con el nombre comn de todo el registro y un nombre nico que identifica el campo
dentro del registro. El tipo de cada campo puede ser cualquiera.
La definicin de un tipo registro se hace con la sentencia typedef utilizando adems la palabra
reservada struct propia de los registros. A continuacin y entre llaves {} se define cada campo
con su tipo como si fueran variables locales al registro.
// definicion del tipo registro
typedef struct {
int dni;
string nombre;
string domicilio;
float estatura;
float peso;
} TPersona; // nombre del tipo nuevo

Una vez definido el tipo registro, la definicin de variables registro es similar a la habitual,
pudindose inicializar incluyendo entre { } los valores de cada campo separados por comas:
5 Siempre se puede definir y copiar su valor en una variable local del mismo tipo.

14
Captulo 1. Sintaxis bsica 15

// definicion de 3 registros
TPersona empleado, directivo, becario;

// los campos se pueden inicializar por orden de definicion


TPersona maquinista = {
12345678,
"Pepito Grillo",
"C/La que sea, 3, Villarriba de Abajo",
1.83, // metros
95.3 // kilos
};

Y la definicin de registros constantes es muy parecida a la de los registros variables, pero con
la palabra reservada const, que evita su posterior modificacin:
const TPersona DomenicoEscarlati = {
31283130,
"Domenico Escarlati Perolo",
"C/ Brieva del Verano, 31, Messina",
1.70,
72.2,
};

Los campos de los registros se pueden utilizar exactamente igual que las variables del mismo
tipo. Se acceden con el nombre comn del registro, el operador de acceso . y el nombre del campo
sin dejar espacios en blanco entre ellos:
maquinista.dni = 87654321;
maquinista.nombre = "Juanito Cigarra";
if (empleado.peso < 100) ...
return maquinista.estatura;

La alternativa tradicional de C para definir registros no utiliza la palabra reservada typedef


y el nombre del tipo registro cambia de posicin:
// definicion del tipo registro
struct DatosPersona { // nombre del tipo nuevo
int dni;
string nombre;
string domicilio;
float estatura;
float peso;
};

// definicion de 3 registros
DatosPersona empleado, directivo, becario;

Los registros completos se pueden:

Inicializar total o parcialmente en la definicin.


Pasar como parmetros a subprogramas.
Asignar con una sola sentencia =.
Devolver como valor de una funcin con la sentencia return.

Pero no se puede:

Enviarlos al flujo cout. Hay que hacerlo campo a campo.

15
Captulo 1. Sintaxis bsica 16

Aceptarlos del flujo cin. Hay que leerlos campo a campo.

Registros como parmetros a subprogramas


La definicin de un registro como parmetro formal de un subprograma es similar a las de tipo
predefinido. La nica salvedad es cuando los registros son parmetros de entrada de gran tamao.
Entonces se utiliza el paso por referencia constante para evitar la copia de muchos datos:
// registros como parametros de entrada
void Subprograma(const TPersona persona) // por valor
void Subprograma(TPersona persona) // por valor
void Subprograma(DatosPersona persona) // por valor
void Subprograma(const TPersona & persona) // por ref. cte.

// registros como parametros de salida o entrada/salida


void Subprograma(TPersona & persona) // por ref.
void Subprograma(DatosPersona & persona) // por ref.

13.2. Arrays
Un array es una coleccin homognea de datos o componentes de un mismo tipo base con un
nombre comn, y colocadas consecutivamente en memoria ordenadas por un ndice, de tal forma
que cada valor del array se identifica de forma nica con el nombre del array y por su ndice. En
C/C++ la primera posicin es siempre la 0.
El siguiente esquema muestra el contenido en memoria de un array de 10 enteros con el ndice
de cada posicin debajo.
-12 1 55 0 -54 72 -6 -88 523 32
0 1 2 3 4 5 6 7 8 9
Al igual que con los registros, para utilizar arrays primero hay que definir el tipo array. Despus
se definirn todos los arrays que se vayan a utilizar como variables, ya que el tipo no especifica ni
reserva ninguna posicin de memoria, sino slo la estructura de una variable de tipo array. En la
definicin del tipo array, adems de indicar el tipo base, hay que indicar la longitud mxima en
tiempo de compilacin, es decir, esta longitud debe ser una expresin constante, por lo que son
estructuras estticas 6 .
En estas notas vamos a trabajar con los nuevos arrays que incorpora el estndar de C++ 20117 .
La diferencia fundamental con los arrays tradicionales es que los nuevos permiten la asignacin
completa de dos arrays, mientras que esto no era posible con los arrays tradicionales de C/C++.

Definicin de arrays
Los tipos array se definen con la sentencia typedef, normalmente como una definicin global.
A continuacin se definen los arrays que se necesiten, que ya s son datos reales en memoria, y
suelen definirse como variables locales o constantes simblicas.
El tamao mximo de un array ya definido puede obtenerse con la funcin size() en nmero
de elementos, o con la funcin sizeof en nmero de bytes, tal como se muestra en el siguiente
ejemplo. Ntese la diferencia en la notacin entre ambas funciones, ya que la primera es una
funcin de biblioteca, y la segunda es propia de C/C++.
6 Existen tambin en C++ arrays dinmicos que permiten indicar la longitud en tiempo de ejecucin usando el

operador new.
7 Es posible que se necesite activar la correspondiente opcin al compilar, -std=c++0x.

16
Captulo 1. Sintaxis bsica 17

#include <array> // necesaria en el estandar C++ 2011.


using namespace std;

const unsigned MaxZs=1000; // longitud maxima


typedef array <int,MaxZs> TZs; // el nuevo tipo array es TZs

int main()
{
TZs array1; // variable array sin inicializar
TZs array2 = {0,1,2}; // inicializadas solo 3 primeras posiciones
...
cout <<"Numero de elementos: " <<array1.size() <<endl;
cout <<"Numero de bytes: " <<sizeof(array1) <<endl;
...

Acceso a componentes individuales


Para acceder a una determinada posicon se escribe el nombre del array (la variable, no el tipo)
seguido por el ndice entre corchetes: a[0], a[1], a[2]...

El ndice puede ser cualquier expresin entera, pero ojo! el resultado debe estar
dentro del rango de valores que admita la longitud del array.

Una alternativa para acceder a elementos de un array chequeando el rango de errores es con el
operador at: a.at(0), a.at(1), a.at(2)... Esta alternativa s chequea los errores de rango.
Con una componente individual se puede realizar todas las operaciones que admita el tipo
base, por ejemplo, si el tipo base es int, los componentes se pueden sumar, comparar, asignar,
pasar como parmetros, leer de teclado, etc.

Acceso a componentes individuales


Adems del acceso individual, tambin se pueden hacer las siguientes operaciones con un arrays
completos independientemente del tipo base de sus componentes:
Asignacin de arrays. Cada componente del array fuente (valor-R) se asignan al correspon-
diente componente del array destino (valor-L). Por ejemplo, la sentencia
array_destino = array_fuente;
producira las asignaciones de todas las componentes individuales:
... array_destino

-12 1 55 0 -54 72 -6 -88 523 ... array_fuente

Paso como parmetro a un subprograma, ya sea de entrada, salida o entrada/salida. Los


arrays de salida y entrada/salida se deben pasar por referencia; pero los arrays de entrada
se pueden pasar por valor, sin evitar la copia completa del array, o por referencia constante,
si se desea evitar la copia8 .
Valor devuelto por una funcin con la correspondiente sentencia return9 .
8 Los arrays tradicionales de C/C++ siempre se pasaban por referencia, en cambio, la asignacin de arrays C++

2011 permite tambin el paso por valor para crear la copia del parmetro real en el parmetro formal. No obstante,
es ms eficiente pasar un array de entrada por referencia constante.
9 La asignacin es la que tambin posibilita la devolucin completa de un array como valor de una funcin.

17
Captulo 1. Sintaxis bsica 18

La entrada/salida de arrays completos mediante cin y cout de la biblioteca <iostream>


no es posible, por lo que hay que hacerlo componente a componente.
Los siguientes ejemplos ilustran estas operaciones.
/*
* Paso de un array (por referencia) como parametro de salida.
* Lectura de enteros por teclado hasta introducir un 0.
*/
int LeerZs(TZs &a)
{
int nleidos=0;
int numero;

cin >>numero;
while (nleidos<MaxZs && numero!=0) {
// 0 es el centinela, no se almacena
a[nleidos] = numero;
cin >>numero;
nleidos++;
}
return nleidos;
}

/*
* Paso de un array (por ref. cte.) como parametro de entrada.
* Escritura en pantalla de los n primeros elementos de un array.
*/
void EscribirZs(const TZs &a, const int n)
{
int i;
// n debe ser menor que MaxTZs
for (i=0; i<n; i++) {
cout<< a[i]<< ;
}
cout <<endl;
}

/*
* Devolucion de un array como valor de una funcion.
* Suma de dos arrays componente a componente.
*/
TZs SumarZs(const TZs &a1, const TZs &a2, const int n)
{
TZs suma; // para devolver en el return
int i;
// n debe ser menor que MaxTZs
for (i=0; i<n; i++) {
suma[i] = a1[i] + a2[i];
}
return suma;
}

18
Captulo 1. Sintaxis bsica 19

/*
* Paso de un array (por referencia) como parametro de e/s.
* Invertir los n primeros elementos de un array.
*/
void VoltearZs(TZs &a, const int n)
{
int i=0, temp;
// n debe ser menor que MaxTZs
// si n es impar, el elemento central no hace falta moverlo
for (i=0; i<n/2; i++) {
temp = a[i];
a[i] = a[n-i-1];
a[n-i-1] = temp;
}
}

/*
* Suma 3 series de numeros enteros.
* Despues se invierten los componentes de las 2 primeras.
*/
int main()
{
TZs serie1, serie2, suma;
int long1, long2, long_menor;
// una de las series es un array constante
const TZs serie3 = { 1, 1, 1, 1, 1};
const int long3 = 5;

// lectura de numeros enteros


cout<< "Primera serie de enteros (fin-> 0): ";
long1 = LeerZs(serie1);
cout<< "Segunda serie de enteros (fin-> 0): ";
long2 = LeerZs(serie2);

// solo se suma hasta la longitud menor


long_menor = long1<long2 ? long1 : long2;
suma = SumarZs(serie1, serie2, long_menor);
// sumamos tambien el array constante
long_menor = long_menor<long3 ? long_menor : long3;
suma = SumarZs(suma, serie3, long_menor);
cout << "La suma total es: ";
EscribirZs(suma, long_menor);

// voltear las series leidas por teclado


VoltearZs(serie1, long1);
VoltearZs(serie2, long2);
cout << "Serie primera volteada: ";
EscribirZs(serie1, long1);
cout << "Serie segunda volteada: ";
EscribirZs(serie2, long2);
}

19
Captulo 1. Sintaxis bsica 20

Arrays multidimensionales
Puesto que el tipo base de un array puede ser cualquiera, cada componente puede ser a su vez
otro array, con lo que tendramos un array bidimensional. Las definiciones siguientes definen un
tipo para matrices no necesariamente cuadradas. Observa que el tipo base del tipo TMatriz es
un array vector fila.
// dimensiones de la matriz
const unsigned NE = 2; // numero de columnas
const unsigned NF = 3; // numero de filas
typedef array <float,NE> TFila;
typedef array <TFila,NF> TMatriz;

Los siguientes subprogramas ilustran un manejo bsico de suma de matrices. Por supuesto,
para acceder ahora a una posicin individual se necesita especificar un ndice por cada una de las
2 dimensiones.
/*
* Lectura de una matriz completa por teclado.
* Se pasa la matriz como parametro de salida.
*/
void LeerMatriz(TMatriz &m)
{
int j, k;
for (j=0; j<NF; j++) {
for (k=0; k<NE; k++) {
cin >>m[j][k];
}
}
}

/*
* Escritura en pantalla de una matriz completa.
* Se pasa la matriz como parametro de entrada.
*/
void EscribirMatriz(const TMatriz &m)
{
for (int j=0; j<NF; j++) {
for (int k=0; k<NE; k++) {
cout <<m[j][k] << ;
}
cout <<endl;
}
}

20
Captulo 1. Sintaxis bsica 21

/*
* Suma de 2 matrices elemento a elemento.
* Se pasan las matrices como parametro de entrada y el resultado
* se devuelve como valor de la funcion.
*/
TMatriz SumarMatrices(const TMatriz &m1, const TMatriz &m2)
{
TMatriz suma;
int j, k;
for (j=0; j<NF; j++) {
for (k=0; k<NE; k++) {
suma[j][k] = m1[j][k] + m2[j][k];
}
} return suma;
}

/*
* Suma de 2 matrices elemento a elemento.
* El primer parametro es de entrada/salida: la matriz original.
* El segundo parametro es de entrada y se suma a la original.
*/
void AcumularMatriz(TMatriz &original, const TMatriz &m)
{
for (int j=0; j<NF; j++) {
for (int k=0; k<NE; k++) {
original[j][k] += m[j][k];
}
}
}

/*
* Suma de 3 matrices elemento a elemento.
* Las 2 primeras se suman con SumarMatrices(), y
* la 3ra. se suma con AcumularMatriz().
*/
int main()
{
TMatriz msuma, m1, m2;
const TMatriz m3 = {10, 10, 10, 10, 10, 10}; // esta no se lee.

cout <<"Introduce primera matriz de " <<NF<<"x"<<NE<<": ";


LeerMatriz(m1);
cout <<"Introduce segunda matriz de " <<NF<<"x"<<NE<<": ";
LeerMatriz(m2);
msuma = SumarMatrices(m1, m2);
AcumularMatriz(msuma, m3);
EscribirMatriz(msuma);
}

21
Captulo 1. Sintaxis bsica 22

El siguiente ejemplo ilustra la suma de tensores, los cuales pueden representarse con arrays
tridimensionales, donde el tipo base de cada componente es una matriz. Ntese que se puede
reutilizar algunos de los subprogramas de matrices definidos en el ejemplo anterior.
// dimensiones del tensor
const unsigned NE = 2; // numero de columnas
const unsigned NF = 3; // numero de filas
const unsigned NC = 2; // numero de capas
typedef array <float,NE> TFila;
typedef array <TFila,NF> TMatriz;
typedef array <TMatriz,NC> TTensor;

void LeerTensor(TTensor &t)


{
for (int i=0; i<NC; i++) {
// lee una matriz completa del tensor
LeerMatriz(t[i]);
}
}

void EscribirTensor(const TTensor &t)


{
for (int i=0; i<NC; i++) {
EscribirMatriz(t[i]);
cout <<endl;
}
}

TTensor SumarTensores(const TTensor &t1, const TTensor &t2)


{
TTensor suma;
for (int i=0; i<NC; i++) {
// suma de matrices
suma[i] = SumarMatrices(t1[i], t2[i]);
}
return suma;
}

int main()
{
TTensor t1, t2, tsuma;
const TTensor t3 = {1,1, 2,2, 3,3, 4,4, 5,5, 6,6};

cout <<"Introduce primer tensor de " <<NC<<x<<NF<<x<<NE<<": ";


LeerTensor(t1);
cout <<"Introduce otro tensor de " <<NC<<x<<NF<<x<<NE<<": ";
LeerTensor(t2);
tsuma = SumarTensores(t1, t2);
tsuma = SumarTensores(tsuma, t3);
EscribirTensor(tsuma);
}

22
Captulo 1. Sintaxis bsica 23

Cadenas
En C++ existe la clase string que se puede utilizar como tipo de datos para almacenar
cadenas de caracteres. Est definida en la biblioteca estndar <string> que adems dispone de
muchas funciones para realizar operaciones con cadenas sin tener que programarlas. Las cadenas
de tipo string pueden asignarse, pasarse como parmetros por valor y por referencia, y pueden
devolverse como valor de una funcin.
En la seccin 3 del anexo puede consultarse algunas de las funciones habituales que ofrece esta
clase. En este caso las cadenas son objetos y la sintaxis para las llamadas utilizan el operador .
como si el objeto (la cadena) fuese un registro.

13.3. Anidamientos
Tanto el tipo base de un array, como el de los campos de un registro pueden ser de tipo com-
puesto, posibilitando la definicin y uso de muchos tipos de estructuras de datos. A continuacin
se muestran dos posibilidades habituales.
Anidamientos dentro de registros. En estos casos el tipo de uno de los campos es otro tipo
compuesto previamente definido.

typedef struct {
dia, mes, anio;
} TFecha; // definicion del tipo TFecha

typedef struct {
int dni;
string nombre;
string domicilio;
TFecha f_nacim;
float estatura;
float peso;
} TJugador; // definicion del tipo TJugador

TJugador delantero; // definicion del registro delantero

// accesos posibles
... delantero.nombre ... // nombre del delantero
... delantero.f_nacim ... // registro con fecha de nacimiento
... delantero.f_nacim.dia ... // dia de nacimiento del delantero
... delantero.f_nacim.mes ... // mes de nacimiento del delantero

Anidamientos dentro de arrays. Aqu simplemente se pone como tipo base del array otro
tipo compuesto previamente definido.

// definicion del tipo array para un maximo de 20 jugadores


typedef array <TJugador,20> TEquipo;

// definicion de 2 arrays de 20 jugadores como maximo


TEquipo visitante, locales;

// accesos posibles
... visitante[0].nombre ... // nombre primer jugador visitante
... visitante[0].f_nacim ... // fecha de nacimiento completa
... visitante[i].f_nacim.anio ... // nacimiento del jugador i
...

23
Apndice A

Bibliotecas estndares de C++

1. Entrada/salida
En C++ la escritura en pantalla y lectura de teclado se manejan con los flujos estndares
de entrada/salida, que son objetos, y como tales, las llamadas a sus operaciones (o mtodos) se
realizan con el operador de acceso ..
El flujo estndar de entrada es cin y, por defecto es el teclado, aunque desde el sistema
operativo (sin modificar el programa) puede redirigirse a un fichero o a otro dispositivo. Los flujos
de salida son cout, que es la salida estndar, y cerr, que es la salida de errores. Al igual que el
flujo de entrada, ambos pueden redirigirse desde el sistema operativo de forma separada.
#include <iostream>
Entrada de nmeros o caracteres saltando espacios precedentes:
cin >> variable >> variable >> ...
Salto de los espacios pendientes de leer:
cin >> ws
Lectura de un carcter sin saltar espacios:
char c = cin.get()
Lectura de una lnea completa en un array de un mximo de max caracteres:
getline(cin, cad)
cin.getline(cad)
cin.getline(cad, max)
Salida de nmeros o caracteres:
cout << expresion << expresion << ...
cerr << expresion << expresion << ...
Vaciado de la salida pendiente:
cout << flush
cerr << flush
Envo a la salida de un salto de lnea:
cout << endl
cerr << endl

2. Ficheros
En C++ los ficheros se consideran flujos (stream) como los flujos estndares cin y cout, por
lo que su manejo es muy similar a stos.

24
Apndice A. Bibliotecas estndares de C++ 25

#include <fstream>

Definicin de flujos
ifstream fi fichero de entrada
ofstream fo fichero de salida
fstream f fichero de entrada/salida
Apertura y cierre de flujos
fi.open("nombre.dat") modo de entrada
fo.open("nombre.dat") modo de salida
f.open("nombre.dat", ios::in) modo de entrada
f.open("nombre.dat", ios::out) modo de salida
f.open("nombre.dat", ios::binary) modo binario
fo.open("nombre.dat", ios::app) modo salida para aadir al final
f.open("nombre.dat", ios::in|ios::out) modo de entrada/salida
f.close() cierre del flujo f
Lectura y escritura en flujos
f >> variable >> variable >> ... lectura del flujo f
f.get(c) lectura de un carcter
f.getline(cadena, tam) lectura de una lnea f
(mximo tam caracteres)
f << expresion << expresion << ... escritura en el flujo f

25
Apndice A. Bibliotecas estndares de C++ 26

3. Cadenas
En C++ las cadenas pueden manejarse como arrays de caracteres al estilo de C, o como objetos
de la clase string. En particular, los siguientes ejemplos dan una idea de la potencia de la clase
string de C++.
#include <string>

Definicin
string s, s1, s2 Define las cadenas s, s1 y s2.
string s2="vinicial" Define la cadena s2 y la inicializa.
string s(s2) Define la cadena s y la inicializa con s2.
Entrada/salida
cin >> s Lee una cadena de teclado en s saltando los espacios.
getline(cin,s) Lee una lnea de teclado en s.
cout << s Imprime en pantalla s.
Longitud y acceso individual
s.length() Devuelve la longitud efectiva (tipo int) de s.
c = s[0] Pone en la variable c (char) el primer carcter de s.
c = s[s.length()-1] Pone en c el ltimo carcter de s.
Asignacin
s = "valor" Asigna la cadena valor a s.
s[i] = c Pone en s[i] el carcter c.
s = s2 Asigna la cadena s2 a s.
s += s2 Concatena la cadena s2 al final de s.
s = s1 + s2 Asigna a s la concatenacin de s1 y s2.
s.append(s1+s2) Aade a s la concatenacin de s1 y s2.
Comparaciones
s == s2 Devuelve true si s y s2 son iguales.
s < s2 Devuelve true si s es menor que s2 por orden ascii.
r = s.compare(5,3,s2) Pone en r (int) el valor 0 si s==s2, -1 si s<s2, y +1 si s>s2.
Bsqueda y sustitucin
pos = s.find(s2) Devuelve la posicin (int) donde empieza la subcadena s2 dentro
de s.
s2 = s.substr(5,3) Devuelve en s2 la subcadena de 3 caracteres de s que empieza en
la posicin 5.
s.replace(5,3,s2) Reemplaza los 3 caracteres de s que empiezan en la posicin 5
por la cadena s2.
s.insert(5,s2) Inserta en s a partir de la posicin 5 la cadena s2.
La clase string tambin tiene mtodos (subprogramas) para convertir y trabajar con arrays
de caracteres equivalentes al estilo de C.

26
Apndice B

Bibliotecas estndares de C

En C++ se pueden declarar sus cabeceras (headers) bien al estilo C:


#include <biblioteca.h>
o bien al estilo propio de C++, formando parte del espacio de nombres estndar:
#include <cbiblioteca>
using namespace std;

1. Entrada/salida

#include <cstdio>

scanf(formato, &arg1, &arg2, ...) Entrada de teclado.


printf(formato, arg1, arg2, ...) Salida en pantalla.

2. Clasificacin de caracteres
#include <cctype>

isalnum(caracter) Devuelve verdadero si es alfanumrico.


isalpha(caracter) Devuelve verdadero si es alfabtico.
iscntrl(caracter) Devuelve verdadero si es dgito de control.
isdigit(caracter) Devuelve verdadero si es dgito.
isgraph(caracter) Devuelve verdadero si es carcter.
islower(caracter) Devuelve verdadero si es minscula.
isupper(caracter) Devuelve verdadero si es mayscula.
isspace(caracter) Devuelve verdadero si es , \f, \n, \r, \t o \v.
isprint(caracter) Devuelve verdadero si es imprimible.
ispunct(caracter) Devuelve verdadero si es especial.
isxdigit(caracter) Devuelve verdadero si es dgito hexadecimal.
tolower(caracter) Devuelve el carcter en minsculas.
toupper(caracter) Devuelve el carcter en maysculas.

27
Apndice B. Bibliotecas estndares de C 28

3. Matemtica
#include <cmath>

sqrt(x) Devuelve x.
exp(x) Devuelve ex .
log(x) Devuelve loge (x).
log10(x) Devuelve log10 (x).
pow(base, expo) Devuelve baseexpo .
fabs(x) Devuelve |x| R.
floor(x) Devuelve bxc.
ceil(x) Devuelve dxe.
sin(alfa) Devuelve sin(alpha).
cos(alfa) Devuelve cos(alpha).
tan(alfa) Devuelve tan(alpha).
asin(x) Devuelve sin1 (x) en el rango [/2, /2].
acos(x) Devuelve cos1 (x) en el rango [0, ].
atan(x) Devuelve tan1 (x) en el rango [/2, /2].
atan(y,x) Devuelve tan1 (y/x) en el rango [, ].
Todas devuelven un nmero real de tipo double. Y las trigonomtricas trabajan con ngulos
en radianes.

4. Utilidades estndares
#include <cstdlib>

atoi(cadena) Convierte la cadena a un nmero entero.


atof(cadena) Convierte la cadena a un nmero real.
rand() Devuelve un nmero aleatorio entre 0 y RAND_MAX.
srand(semilla) Inicializa la secuencia de nmeros aleatorios (semilla de tipo int).
exit(status) Termina el programa devolviendo status de tipo int.
system(cadena) Ejecuta cadena en la lnea de comandos del sistema.
abs(x) Devuelve |x| Z.

28

Potrebbero piacerti anche