#include <iostream> using namespace std;
int main(void) {
for (int cnt = 0; cnt < 500; cnt++) cout << ″I will not throw airplanes in class.\n″;
return 0; }
© Francisco Rosales & Jose María Peña Programación C++ 3
ContenidosEl entorno UNIX¿Qué es programar?Herramientas de desarrollo ITécnicas de programaciónEstructuras de programaciónEstilo de codificaciónTipos y estructuras de datosOperadoresFunciones y parámetrosPreproceso y bibliotecasHerramientas de desarrollo II
© Francisco Rosales & Jose María Peña Programación C++ 4
El Entorno UNIX¿Qué es UNIX?¡Cómo es UNIX!¡Cómo es Linux!Usuarios y GruposSesión de trabajoProcesos y ConcurrenciaSistema de FicherosDescriptores de fichero
© Francisco Rosales & Jose María Peña Programación C++ 5
¿Qué es UNIX?Uno de los SSOO más extensos y potentes
■ Multiusuario■ Mucho usuarios simultáneos
■ Multiproceso■ Cada usuario ejecutando simultáneamente
muchos procesos■ Multiplataforma
■ Escrito 99% en C■ Portado a multitud de plataformas
© Francisco Rosales & Jose María Peña Programación C++ 6
¡Cómo es UNIX!■ Sensible al tipo de letra
unix <> Unix <> UNIX
■ Para usuarios NO torpes■ Hace lo que se le pide sin preguntar
rm –r * borraría TODO
■ Lo borrado es irrecuperable
© Francisco Rosales & Jose María Peña Programación C++ 7
¡Cómo es Linux!■ Estándar POSIX
■ Portable Operating System Interface■ Licencia GNU
■ Debe suministrarse el código fuente!■ Evoluciona
■ Programadores voluntarios de todo el mundo lo mantienen al día
■ Gratis■ Se paga la "Distribución"
© Francisco Rosales & Jose María Peña Programación C++ 8
Usuario I■ Debe tener abierta cuenta en el sistema■ Se identifica con un nombre de usuario
login name
■ Cuentas protegida por contraseñapassword
■ Internamente el sistema identifica al usuario con un número
UID User Identifier
© Francisco Rosales & Jose María Peña Programación C++ 9
Grupo II■ Los usuarios están organizados en
grupos■ Cada usuario pertenece al menos a un
grupo■ Internamente el sistema identifica al
grupo con un númeroGID Group Identifier
© Francisco Rosales & Jose María Peña Programación C++ 10
Privilegios III■ Operaciones que un usuario puede
realizar en el sistema■ Delimitadas en función de:
■ Su identidad (pareja UID y GID)■ Permisos de acceso al fichero (9 bits)
ReadWrite eXecute
OthersGroupOwner
rwxrwxrwx
© Francisco Rosales & Jose María Peña Programación C++ 11
Superusuario IV■ También denominado root■ Encargado de administrar el sistema■ Tiene UID = 0 (cero)■ No tiene restricciones de ningún tipo
■ Puede hacer y deshacer lo que quiera■ La administración de UNIX es:
■Delicada y de responsabilidad■Exige amplios conocimientos
© Francisco Rosales & Jose María Peña Programación C++ 12
Sesión de trabajo I■ Periodo de tiempo que un usuario está
utilizando el sistema■ Identificación frente al sistema
login: loginname_passwd: *******_
■ Se arranca un intérprete de mandatosprompt> _
■ Para terminar...exit ologout
© Francisco Rosales & Jose María Peña Programación C++ 13
Intérprete de mandatos II■ La interacción del usuario con el
sistema UNIX suele ser a través de un intérprete de mandatos
■ Se le denomina shell (concha)■ No hay una sino varias, a escoger.■ Para uso interactivo y programación■ Para más información, realizar el tutorial
http://laurel.datsi.fi.upm.es/~ssoo/FPSO/download/Entorno%20UNIX.ps
© Francisco Rosales & Jose María Peña Programación C++ 14
Mandatos IIImandato [opciones] [argumentos...]
■ Campos separados por espacios■ [ ] indica opcional■ ... indica uno o varios■ Las opciones comienzan por un - (menos)■ Petición de ayuda sobre un mandato
-h o--help
© Francisco Rosales & Jose María Peña Programación C++ 15
man [what] Manual Pages■ Copia online de los manuales del sistema■ Secciones:
1. Mandatos (ej. sh, man, cat)2. Llamadas al sistema (ej. open, umask)3. Funciones de librería (ej. printf, fopen)4. Dispositivos (ej. null)5. Formato de ficheros (ej. passwd)6. Juegos7. Miscelánea8. Mandatos de Administración del Sistema
© Francisco Rosales & Jose María Peña Programación C++ 16
Procesos I■ Al invocar un mandato:
■ Se ejecuta el fichero con ese nombre
■ Todo programa en ejecución es un proceso
■ Internamente el sistema identifica cada proceso con un número
PID Process Identifier
© Francisco Rosales & Jose María Peña Programación C++ 17
Concurrencia II■ Cada proceso activo de cada usuario del
sistema, compite con los demás por ejecutar■ El sistema operativo decide cuál ejecuta en
cada momento■ Todo sucede muy muy deprisa:
■ Cada proceso avanza como si fuera el único■ Todos están avanzando simultáneamente
■ ps Muestra los procesos del sistema
© Francisco Rosales & Jose María Peña Programación C++ 18
Jerarquía III■ Los procesos se organizan en una
jerarquía padre--hijo(s)■ El ancestro es el proceso init
con PID = 1■ Cada proceso está asociado a su
proceso padre por el PPID
© Francisco Rosales & Jose María Peña Programación C++ 19
Árbol de Ficheros I■ Una única estructura jerárquica de ficheros■ En UNIX los dispositivos se “montan”
■ NO existe el concepto de “unidad”■ Directorio raíz
■ Es la raíz de la jerárquica de nombres■ se denota con / (dividido) no con el \
■ Directorio HOME■ Al entrar al sistema, nos situamos en el HOME■ Pertenece al usuario
■ Por debajo de él podemos crear cuantos subdirectorios o ficheros queramos
© Francisco Rosales & Jose María Peña Programación C++ 20
Tipos de objeto II■ Directorios:
■ Contienen siempre las dos entradas:. (punto) refiere al directorio que la contiene.. (punto punto) refiere al directorio padre de este
■ Ficheros normales:■ Secuencias de bytes
■ Ficheros especiales:■ Son el interfaz de acceso a los dispositivos■ Están bajo el directorio /dev■ Se tratan exactamente igual que los ficheros
normales, de forma que son indistinguibles
© Francisco Rosales & Jose María Peña Programación C++ 21
pwd Print Working Directory■ Cuál es el directorio en que nos
encontramos en cada momento, al cuál denominamos directorio actual de trabajo
© Francisco Rosales & Jose María Peña Programación C++ 22
cd [dir] Change Directory■ Cambia del actual directorio a otrocd Invocado sin argumento
nos devuelve al HOMEcd . Realmente nos deja en el
directorio actual de trabajocd .. Cambia al directorio padre
del directorio actual
© Francisco Rosales & Jose María Peña Programación C++ 23
ls [-opt] [dirs...] List Directory■ Presenta el contenido en los directorios
indicados■ Si no se indica se asume el directorio actual■ Las opciones más usadas:
■ -l Una línea por entrada con: permisos, propietario, grupo, tamaño, fecha, etc
■ -a Muestra entradas que empiezan por . (punto), que normalmente no se ven
■ -R Recursivamente los subdirectorios
© Francisco Rosales & Jose María Peña Programación C++ 24
Descriptores de fichero I■ Los procesos manejan ficheros a través
de los denominados descriptores de fichero■ El resultado de abrir un fichero es un
descriptor■ Las operaciones de manejo (lectura,
escritura, etc.) usan el descriptor■ Para los programas, un descriptor no es
más que un número entero positivo
© Francisco Rosales & Jose María Peña Programación C++ 25
Descriptores estándar II■ Son los descriptores 0, 1 y 2■ Se considera que siempre están abiertos■ Los programas estándar los usan debidamente0 Entrada estándar
De él se leerán los datos a procesar1 Salida estándar
En él se escribirán los resultados del proceso2 Error estándar
En él se escribirán los errores del proceso
¿Qué es programar?
¿Cómo es un ordenador por dentro?¿Qué sabe hacer un ordenador?¿Para qué se usan los ordenadores?Ciclo de vida del softwareCiclo de programación
© Francisco Rosales & Jose María Peña Programación C++ 27
¿Cómo es un ordenador por dentro?
Registros
µP
ALU
RAM
MemoriaPrincipal
ROM
DATOS
TEXTO
PILA
DATOS
TEXTO
PILA
DATOS
TEXTO
PILA
Mapas dememoria deprograma
Bus de datos Bus deEntrada/Salida
ControladoraGráfica AGP
Controladorade Disco IDE
ControladoraUSB
ControladoraRS232 Modem
Controladorasde Perifericos
Arquitectura Von Newmann
© Francisco Rosales & Jose María Peña Programación C++ 28
¿Qué sabe hacer un ordenador?
Muy poco Rapidííííííííísimo■ Ejecuta un único hilo de instrucciones:
■ Aritméticas: suma, resta, multiplicación...■ Lógicas: igual, mayor, menor...■ Salto: condicional, incondicional, llamada...
■ A una increíble velocidad■ PC a 3000 MIPS y subiendo
■ Sin pausa
© Francisco Rosales & Jose María Peña Programación C++ 29
¿Para qué se usan los ordenadores?
■ Sólo hará lo que alguien le diga cómo hacer■ Problemas tengan solución “a mano”■ Programas útiles para alguien:
■Tareas complejas, de precisión, tediosas, etc
■ Es necesario desarrollar software■ No es trivial
© Francisco Rosales & Jose María Peña Programación C++ 30
1, 1.5...2
Análisis
Usuario
Especificación
A.--B.--C.--
1.--2.--3.--
Diseño
main(){}
Programación
Validación
A.OKB.OKC.OK
Implantación
Ciclo de vida del software I
© Francisco Rosales & Jose María Peña Programación C++ 31
Ciclo de vida del software II■ Especificación
■ ¿Qué quiere exactamente el usuario final?■ Contrato
■ Análisis■ ¿Cómo resolver el problema?■ Descomposición
■ Diseño■ Cada una de las partes y su interconexión
© Francisco Rosales & Jose María Peña Programación C++ 32
Ciclo de vida del software III■ Programación■ Integración
■ Calidad e integración de cada módulo
■ Validación■ Cumplimiento de las especificaciones
■ Implantación■ Correcto funcionamiento y aceptación
© Francisco Rosales & Jose María Peña Programación C++ 33
Ciclo de programación I■ Codifica
■ Implementa con precisión cada módulo
■ Comenta el código fuente■ Ayudar a su lectura y comprensión
■ Verifica■ Casos de prueba■ Herramientas de cobertura de código
© Francisco Rosales & Jose María Peña Programación C++ 34
Ciclo de programación II■ Depura
■ Localiza y corrige los errores de todo tipo
■ Documenta■ Genera documentación para utilizar
correctamente el programa
© Francisco Rosales & Jose María Peña Programación C++ 35
En resumen■ El ordenador:
■ Un tonto muy rápido, preciso e infatigable
■ El programador:■ Sabe como instruirle de forma precisa■ Labor creativa y gratificante, de precisión
■ El usuario:■ Impredecible y exigente
© Francisco Rosales & Jose María Peña Programación C++ 37
Editor¿Qué es un fichero de texto?
■ pico nano Simple Editor■ Muy sencillo de usar pero poco potente
■ vi vim Visual Editor (Improved)■ Lo encontramos en cualquier máquina UNIX
■ emacs GNU Project Editor■ Mucho más que un simple editor■ Entorno que integra múltiples aplicaciones:
correo electrónico, navegador web, news, etc.
© Francisco Rosales & Jose María Peña Programación C++ 38
El código fuente ■ Con un editor de texto, escribimos en un archivo el
código fuente del programa en el lenguaje elegido
■ “programa principal”, “función principal” o “main”:■ El punto de entrada al programa■ Imprescindible para obtener un ejecutable autónomo
■ Mínimo programa totalmente correcto
int main(void) {
return 0; }
© Francisco Rosales & Jose María Peña Programación C++ 39
Compilación■ Traducir nuestro programa (un archivo .c o .cpp con
el “código fuente”) en el correspondiente ejecutable (archivo en formato interno apto para ser arrancado)
■ La compilación realmente involucra múltiples etapas■ Preprocesado de macros■ Análisis sintáctico del código■ Traducción a ensamblador■ Traducción a lenguaje máquina con referencias externas■ Montaje contra bibliotecas para resolver esas referencias■ Producción del ejecutable
■ El compilador informa los problemas que encuentre
© Francisco Rosales & Jose María Peña Programación C++ 40
Errores y Warnings■ El compilador debe indicar:
■ Errores■ Problemas graves que evitan que la compilación
concluya■ Es imprescindible corregir estos errores
■ Warnings■ Problemas leves o alertas de posibles problemas■ La compilación puede terminar pero...■ Es muy recomendable corregir el motivo de estos
warnings, porque son fuente de futuros errores
■ El objetivo es la compilación limpia, sin ningún tipo de mensaje
© Francisco Rosales & Jose María Peña Programación C++ 41
gcc GNU C Compiler■ g++ para compilar C++■ Muy bueno, rápido y eficiente■ Admite multitud de opciones (consulte man):
■ -c file.c Sólo compilar, no montar■ -o name Nombre del fichero resultante■ -Wall Detección de todos los warnings■ -g Añade información para depuración■ -O Activa optimización■ -l library Montaje con biblioteca indicada■ -L directory Directorio de bibliotecas
© Francisco Rosales & Jose María Peña Programación C++ 42
Depurador ILa compilación limpia de un programa
no implica que sea correcto■ Ciertos errores sólo serán visibles al ejecutar■ Para eliminarlos necesitamos un depurador
■ De bajo nivel:■ Ejecución paso a paso■ De código máquina o ensamblador■ Inspección de registros y posiciones de memoria
■ De alto nivel o simbólico:■ Ejecución línea a línea■ Del código fuente que hemos escrito■ Inspeccionar de las variables de nuestro programa
© Francisco Rosales & Jose María Peña Programación C++ 43
Depurador II■ Debe haber compilado con –g■ Algunas de las funciones del depurador:
■ Establecer puntos de parada (breakpoints)■ Examinar el valor de variables■ Ejecutar el programa línea a línea
■ Usaremos el gdb, dbx o similar
© Francisco Rosales & Jose María Peña Programación C++ 44
Fichero core■ Si un proceso termina bruscamente con un
mensaje como:segmentation fault: core dumped
■ Ha realizado un acceso ilegal a memoria■ El sistema operativo lo ha matado■ Se ha generado un fichero de nombre: core
■ Es un volcado de la imagen de memoria del proceso en el instante del fallo
■ Sirve para depurar tal fallo:gdb ejecutable core
© Francisco Rosales & Jose María Peña Programación C++ 45
gdb prog [core] GNU debugger■ help Menú de ayuda■ run Ejecuta el programa■ break Establece un breakpoint■ list Muestra el código■ print Muestra el valor de una variable■ continue Continúa después de un breakpoint■ next Ejecuta línea sin entrar en función■ step Ejecuta línea entrando en función■ quit Sale del depurador
Técnicas de programación
Términos abstractosRazonamiento descendenteModularización
■ Y sobre todo... la experiencia
© Francisco Rosales & Jose María Peña Programación C++ 58
Términos abstractos■ La solución no informática de un
problema es independiente de la herramienta■ Concebir el programa en el vocabulario
natural del problema■ Identificar estos términos y las relaciones
entre ellos
© Francisco Rosales & Jose María Peña Programación C++ 59
Ejercicio
Enumere y describa
10 términos de
”cómo se juega al mus”
© Francisco Rosales & Jose María Peña Programación C++ 60
Razonamiento descendente■ Si la magnitud del problema no permite
visualizarlo en toda su extensión■ Identificar etapas o fases■ Dividir el problema subproblemas■ De lo general a lo específico■ Razonando en términos abstractos■ Ir refinando una solución
© Francisco Rosales & Jose María Peña Programación C++ 61
Ejercicio
Descomponga el problema
“desarrollo de una partida de mus”
en una jerarquía con las fases del juego
© Francisco Rosales & Jose María Peña Programación C++ 62
Modularización■ Perfilar más y más hasta delimitar cada
módulo de nuestro programa■ ¿Es suficientemente genérico?■ ¿Está suficientemente delimitado?■ ¿Merece ser una pieza independiente?■ ¿Puede ser reutilizable?
© Francisco Rosales & Jose María Peña Programación C++ 63
Ejercicio
Trate de identificar los módulos de
un programa que juegue al mus
© Francisco Rosales & Jose María Peña Programación C++ 65
Estructuras de Programación■ Se identifican un conjunto mínimo de
estructuras básicas de programación:SecuenciaSelecciónIteraciónFunción o Procedimiento
■ Los programas serán:■ Más fiables■ Más eficientes■ Adaptables
© Francisco Rosales & Jose María Peña Programación C++ 66
Secuencia I■ Un único hilo de ejecución■ Sucesivos pasos o acciones que se
ejecutan en estricto orden
© Francisco Rosales & Jose María Peña Programación C++ 67
Secuencia (ordinograma) II
Hacer después
Comentario] - - - - [Comienzo de bloque
- - [En estricta secuencia
Hacer antes
- - [Fin de bloque
© Francisco Rosales & Jose María Peña Programación C++ 68
Secuencia (pseudocódigo) III
# Esto es un comentario.
# Los comentarios no ejecutan.
PRINT "Introduzca un número "
INPUT valor
PRINT "Introdujo el ", valor, NL
© Francisco Rosales & Jose María Peña Programación C++ 70
Secuencia (código C++) IV
// Esto es un comentario de línea.
/* Esto es un comentario de bloque.
Los comentarios no ejecutan. */
cout << "Introduzca un número >= 0 ";
cin >> valor;
cout << "Introdujo el " << valor << endl;
© Francisco Rosales & Jose María Peña Programación C++ 71
Selección I■ Dirigir el flujo de ejecución a una de
entre varias alternativas■ Escoge en función de condiciones
establecidas sobre los datos■ Expresiones booleanas, valores lógicos
■ CIERTO■ FALSO
© Francisco Rosales & Jose María Peña Programación C++ 72
Selección IF-THEN IIif (num != 0)
{
num = num * 2;
}Condición
CIERTOFALSO
IF_THEN
Hacer
© Francisco Rosales & Jose María Peña Programación C++ 73
Selección IF-THEN-ELSE IIIif (num != 0)
{
num = num * 2;
}
else
{
num = num - 1;
}
CondiciónFALSO CIERTO
IF_THEN_ELSE
HacerHacer
© Francisco Rosales & Jose María Peña Programación C++ 74
Selección SWITCH IVswitch(num + 5)
{
case -1:
num = num * num;
break;
case 0:
break;
default:
num = num / 2;
}
Selección
Hacer
DEFAULT
CASO 2
BREAK
Hacer
Hacer
CASO 1
SWITCH
BREAK
© Francisco Rosales & Jose María Peña Programación C++ 75
Iteración I■ Estructuras llamadas bucles■ Ejecutar ninguna, una o varias veces cuerpo
del bucle■ La iteración está controlada por una
condición■ La condición ha de cambiar de estado en el
cuerpo del bucle para que pueda terminar■ De otro modo, bucle infinito
© Francisco Rosales & Jose María Peña Programación C++ 76
Iteración WHILE IIwhile (num < 0)
{
num = num + 1;
}
■ Mientras la condición se evalúe a CIERTO
■ Puede no ser ejecutado ni una sola vez
Mientras
CIERTO
FALSO
WHILE
Hacer
© Francisco Rosales & Jose María Peña Programación C++ 77
Iteración DO-WHILE IIIdo
{
num = num - 1;
} while (num > 0);
■ Es ejecutado al menos una vez
■ Hasta que la condición se evalúe a FALSOFALSO
MientrasCIERTO
DO_WHILE
Hacer
© Francisco Rosales & Jose María Peña Programación C++ 78
Iteración FOR IVfor (num = 0; num < MAX; num++)
{
sum = sum + num;
}
■ Básicamente un WHILE con:■ Una etapa de inicialización■ Otra de incremento
(o decremento)
Mientras
CIERTOFALSO
Paso
Desde
FOR
Hacer
© Francisco Rosales & Jose María Peña Programación C++ 80
Estilo de codificación
■ Objetivos:■ mejorar la legibilidad del código■ hacerlo más comprensible■ independizarlo del autor
■ Su uso no implica cambio en la estructura del programa
■ Pero marca la diferencia entre buena y mala programación
© Francisco Rosales & Jose María Peña Programación C++ 81
Nombrado I■ Mantener explícitos los términos
abstractos del problema■ Nombres de variable y/o función
deberán ser claros y específicos
© Francisco Rosales & Jose María Peña Programación C++ 82
Nombrado MAL IIvoid bar(m R)
{
int c = R.c;
int nc = 10;
int pc = rand() % c;
...
}
© Francisco Rosales & Jose María Peña Programación C++ 83
Nombrado BIEN IIIvoid barajar(mazo_naipes restantes)
{
int cuantos = restantes.cantidad;
int num_cortes = 10;
int primer_corte = rand() % cuantos;
...
}
© Francisco Rosales & Jose María Peña Programación C++ 84
Indentación I■ El “dibujo” del código ha de reflejar su
estructura. Ver y entender■ Usar “blancos” para encolumnar■ “Tabular” las líneas indicando su
profundidad■ Situar los delimitadores de bloque { y }
uniformemente
© Francisco Rosales & Jose María Peña Programación C++ 85
Indentación MAL IIif (n == 0)
{
n = 1;
if (n == 1) {
n = 2;
}
else {
n = 3;
}n = n + 1;}
© Francisco Rosales & Jose María Peña Programación C++ 86
Indentación BIEN IIIif (n == 0) {
n = 1;
if (n == 1) {
n = 2;
} else {
n = 3;
}
n = n + 1;
}
© Francisco Rosales & Jose María Peña Programación C++ 87
Comentarios I■ “Codificar la idea” implica pérdida de
información■ Codificar es estrictamente indicar cómo hacer algo■ El razonamiento seguido, no queda reflejado
■ Se debe comentar el código para “iluminar” al lector (y a nosotros mismos) sobre las decisiones tomadas
■ Un buen nombrado puede evitar comentarios inútiles
© Francisco Rosales & Jose María Peña Programación C++ 88
Comentarios MAL II
H = H - 1; // Resto 1
...
/* Elevo al cuadrado */
r = r * r;
/* Multiplico por PI */
s = r * 3.14159;
© Francisco Rosales & Jose María Peña Programación C++ 89
Comentarios BIEN IIIdesfase_horario = -1;
hora = hora + desfase_horario;
...
const float PI = 3.141592654;
/* Es una circunferencia */
superf = r * r * PI;
© Francisco Rosales & Jose María Peña Programación C++ 90
Restricciones I■ Muchos lenguajes tienen cláusulas que
“rompen” la estructura del programa■ Son saltos bruscos (incondicionales)
del hilo de ejecución■ Hay que restringir su uso,
evitar su abuso
© Francisco Rosales & Jose María Peña Programación C++ 91
Restricción IIgoto
■ Salto incondicional■ No usar jamás
© Francisco Rosales & Jose María Peña Programación C++ 92
Restricción IIIbreak
■ Sale fuera del bucle o switch más interno■ Usar sólo en el switch
© Francisco Rosales & Jose María Peña Programación C++ 93
Restricción IVcontinue
■ Salta a la siguiente iteración más interna■ Usar sólo como cuerpo de bucles vacíos
while (time() < limite)
continue;
© Francisco Rosales & Jose María Peña Programación C++ 96
int main(void) {
int i; for(i=0; i<100; i++) {
if (i%2==0) continue;
if (i%17==0) break;
cout << i<<endl; } return 0;
}
break y continue 1
© Francisco Rosales & Jose María Peña Programación C++ 97
int main(void) {
int i; for(i=0; i<100; i++) {
if (i%2==0) continue; // A la siguiente iteración
if (i%17==0) break; // Directamente fuera
cout << i<<endl; } return 0;
}
break y continue 2
© Francisco Rosales & Jose María Peña Programación C++ 98
Restricción Vreturn
■ Sale de la función devolviendo un valor■ Sólo debe haber uno único como última
sentencia de cada función
Tipos y estructuras de datos
Variables y constantesValor y formatoTipos básicosEstructuras dinámicas de datos
© Francisco Rosales & Jose María Peña Programación C++ 101
Variables y constantes■ Representan cantidades y/o cualidades■ Antes de usarlas debemos declararlas
para que el compilador (o intérprete) sepa:
Su nombreSu ámbito de vidaSu visibilidadEl tipo de datos asociado
© Francisco Rosales & Jose María Peña Programación C++ 102
Declaración de variables■ Simple:
char c;int i;
■ Múltiple:char c, d;int i, j, k;
■ Con asignación de valor:char c=’A’;int i=-133, j=i, k;
© Francisco Rosales & Jose María Peña Programación C++ 103
Nombrado I■ Debe ser no ambiguo y reflejar los
términos abstractos del problema■ El lenguaje puede restringir el
nombrado■ Variables cuyo nombre coincida con
palabras reservadas del lenguaje■ Otras restricciones (ej. Longitud)
© Francisco Rosales & Jose María Peña Programación C++ 105
Nombrado II■ Evitar las palabras reservadas, en C++:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while
■ Identificador correcto: {a-zA-Z_}[a-zA-Z_0-9]*
© Francisco Rosales & Jose María Peña Programación C++ 106
Ámbito de vida
■ Determina durante cuánto tiempo existe■ Variable global a módulo o programa:
■ durante todo el tiempo de ejecución (toman valor inicial 0)
■ Variable local a, o parámetro formal de, una función■ sólo durante cada llamada
(toman valor inicial basura)
© Francisco Rosales & Jose María Peña Programación C++ 107
Visibilidad■ Determina desde dónde podemos usarla■ Variable global al programa
■ desde cualquier punto
■ Variable global a un módulo■ sólo desde dicho módulo
■ Variable local o parámetro formal de función■ sólo desde dicha función
■ Una variable local oculta la global con el mismo nombre
© Francisco Rosales & Jose María Peña Programación C++ 108
Ejemplo de ámbito y visibilidadint x,y; /* Globales */void funcion(void){
/* Aquí x e y son variables enteras *//* La variable z no existe */
}int main(void){
float x,z; /* Locales *//* Aquí x y z son reales e y es entera */
}
© Francisco Rosales & Jose María Peña Programación C++ 109
Modificadores de variablesstatic
■ Si global, sólo global al módulo■ Si local, conserva valor entre invocaciones■ Valor inicial 0
register■ Se preferiría ubicar en un registro (por eficiencia)
volatile■ Podría cambiar de valor espontáneamente por efecto de
algo "externo" al programa (Ej. registro de controlador de dispositivo)
const■ Su valor no debe ser alterado
© Francisco Rosales & Jose María Peña Programación C++ 110
Tipos de datos■ Podrá ser uno de los tipos básicos o bien un
tipo derivado de aquellos (los veremos)■ Se escoge según el conjunto de valores que
queremos que la variable pueda tomar■ Los tipos numéricos básicos determinan el
rango de posibles valores■ Un entero no podrá valer 3.75 (decimal)■ Un sin-signo no podrá valer –1
© Francisco Rosales & Jose María Peña Programación C++ 111
Valor y formatoUn Kilo de oroUn Kilo de oro
tiene un determinadotiene un determinado valorvalor,, independiente de su independiente de su formatoformato::
lingote, polvo...lingote, polvo...■ Una cosa es el valor que una variable
tiene (o contiene) y otra el formato en que es almacenado o representado■ Más sobre esto en los próximos ejemplos
© Francisco Rosales & Jose María Peña Programación C++ 112
Tipos básicosSin tipoLógico: CIERTO FALSOCarácter: a A z Z 1 9 ...Entero: -1 33Real: 3.14 -5*10-15
Enumerado: lunes martes ...Puntero: NULLVectores: tablero[8][8]Estructuras: {Nombre, edad, peso}
© Francisco Rosales & Jose María Peña Programación C++ 113
Sin tipovoid barajar(...)
■ Para declarar procedimientos■ No existen variables de este tipo
© Francisco Rosales & Jose María Peña Programación C++ 114
Lógicobool salir=false;
■ Existe en muchos lenguajes para representar valores lógicos true y false
■ Es de este tipo el resultado las comparaciones y de su combinación mediante operadores lógicos AND, OR, NOT, etc
■ En C no existe como tipo básico■ Cualquier expresión sirve de expresión lógica■ Se considera FALSO el valor numérico cero■ Por negación cualquier valor numérico distinto de
cero es CIERTO
© Francisco Rosales & Jose María Peña Programación C++ 115
Carácterchar letra='a';
'\0', 'a', 'Ü', '?', '\n'■ Son valores numéricos de tamaño 1 byte...■ ...que representan (o representados por)
caracteres según una convención dada (código ASCII o Latin1)
■ Constante entre comillas simples (apóstrofo ')■ Secuencias de escape: '\r', '\t', '\b',...■ Valor en octal: '\013',...
© Francisco Rosales & Jose María Peña Programación C++ 116
Enteroint saldo_bancario=-1000; /* negros o rojos */unsigned numero_de_amarracos=30;
■ Con o sin signo■ Para contar o numerar■ Diferentes bases de representación:
Hexadecimal(16): 0x0, -0x1, 0xFFF, 0xFea0Octal(8): 00, -01, 07777, 0177240
Decimal(10): 0, -1, 4095, 65184
© Francisco Rosales & Jose María Peña Programación C++ 117
Modificadores de tipos enterosunsigned char byte; /* 8 bits: 0 a 255 */signed char desfase; /* 8 bits: -127 a 128 */short int dia_anyo; /* 16 bits (aprox) */long microsegundos; /* 32 bits (aprox) */long long n_atomos; /* 64 bits (GNU C)*/■ Pueden combinarse■ Si derivan de int puede omitirse■ El tamaño depende de compilador y arquitectura■ Normalmente se usa simplemente int
© Francisco Rosales & Jose María Peña Programación C++ 118
Realfloat angulo, distancia=42E-11;double PI=3.14159265358979323846;
■ Números positivos o negativos con o sin decimales
■ “coma flotante”■ Notación decimal o científica
42*10-11
© Francisco Rosales & Jose María Peña Programación C++ 119
Enumeradoenum {femenino, masculino} genero;genero = femenino;
■ Puede tomar cualquiera de los valores simbólicos que se enumeran
■ Internamente se representan como entero
© Francisco Rosales & Jose María Peña Programación C++ 120
Punteroint * puntero_a_entero=NULL;
■ "Vale" la dirección de otra variable del tipo indicado
■ La constante NULL vale 0 y no se puede derreferenciar, pero si comparar
■ Son la base para las estructuras dinámicas de datos
Tipo al que apunta
© Francisco Rosales & Jose María Peña Programación C++ 121
Puntero Ej.int variable = 7;puntero_a_entero = & variable;*puntero_a_entero = 8;/* Ahora variable vale 8 */
...puntero_a_entero = NULL;*puntero_a_entero = 2; /* ERROR */
Operador “dirección de”
Operador “derreferenciar”
© Francisco Rosales & Jose María Peña Programación C++ 122
Paso de referencias por valor 1■ Se recibe un puntero que apunta a la variableint reiniciar(int *p, int v) {■ Se modifica allí donde apunta el puntero
*p = 0; v = 0; }...int x=2, y=2,*ptr;■ Se pasa el valor de la dirección de la variablereiniciar(&x,y); /* x == 0, y == 2 */ reiniciar(ptr, 5);/* ERROR ¿porqué? */
© Francisco Rosales & Jose María Peña Programación C++ 123
Paso de referencias por valor 2■ Se recibe un puntero que apunta a la variableint reiniciar(int *p, int v) {■ Se modifica allí donde apunta el puntero
*p = 0; v = 0; }...int x=2, y=2,*ptr;■ Se pasa el valor de la dirección de la variablereiniciar(&x,y); /* x == 0, y == 2 */ reiniciar(ptr, 5);/* ERROR ¿porqué? */
Acceso a dirección inválidaNo inicializado
© Francisco Rosales & Jose María Peña Programación C++ 124
Vectores y matriceschar vocal[5]={'a','e','i','o','u'};float tablero[8][8];
■ Agrupaciones de información homogénea■ Se almacenan en memoria contigua■ Se indexan con enteros desde el 0
vocal[0] = 'A';tablero[8][8] = 2.1; /* ERROR FUERA */
© Francisco Rosales & Jose María Peña Programación C++ 125
Punteros y Arraysint Prim[9]={2,3,5,7,11,13,17,19,23};
■ El nombre de un vector es (equivale a) la dirección de su primer elemento
int * ptr = Prim; /* Prim == &Prim[0] */■ Los punteros se indexan e incrementan en la
cuantía del tamaño del tipo al que apuntanif (*ptr == ptr[0]) ... /* Siempre CIERTO */if (ptr[1] == Prim[1]) ... /* CIERTO */ptr++;if (*ptr == Prim[1]) ... /* CIERTO*/
© Francisco Rosales & Jose María Peña Programación C++ 126
Tiras de caracteres■ Constantes entre comillas dobles
char Hola[20] = "Hola Mundo!";■ Es la declaración de su valor inicial■ Luego NO se asignan así
Hola = "Adios"; /* ERROR */■ Son también vectores de caracteres
if (Hola[0] == 'H') ... /* CIERTO */■ El último carácter ha de ser el nulo '\0'
if (Hola[11] == '\0') ... /* CIERTO */■ Hemos reservado 20 caracteres pero sólo
estamos usando 12!! (11 + el nulo)
© Francisco Rosales & Jose María Peña Programación C++ 127
Punteros y Stringschar Hola[12] = "Hola Mundo!";char * str = Hola;
■ Para manipular tiras existen funciones de bibliotecaint strlen(char*str); /* Devuelve longitud */if (strlen(str) == 11) ... /*CIERTO, pero ocupa 12*/
■ Para recorrer tiras usamos punteros a caráctervoid strcopy(char * des, char * org) {
while ((*des++ = *org++)) /* '\0' vale 0 */continue;
}strcopy(str,"Adios");if (strlen(str) == 5) ... /* CIERTO, pero ocupa 6 */
© Francisco Rosales & Jose María Peña Programación C++ 128
Estructurasstruct Fecha {
int Anyo, Mes, Dia;} Nacimiento;
■ Agrupaciones de información heterogénea■ Se almacenan en memoria contigua■ Sus campos se indexan con el punto
Nacimiento.Mes = 1;
© Francisco Rosales & Jose María Peña Programación C++ 129
Punteros y Structs IIstruct Fecha {
int Anyo, Mes, Dia;} Nacimiento, *ptr;ptr = &Nacimiento;
■ Derreferenciamos e indexamos el campo
*ptr.Anyo = 1970;■ ó utilizamos la notación menos mayor (flecha)
ptr->Dia = 1;
© Francisco Rosales & Jose María Peña Programación C++ 130
Uniones I■ Similar a una estructura, pero sus campos
comparten la memoria (son alternativos)struct datos {
int a, x[2];char c;
} d;
union datos {int a, x[2];char c;
} d;
d.ad.x[0]d.x[1]
d.c
d.ad.x
d.c
© Francisco Rosales & Jose María Peña Programación C++ 131
Uniones II■ Varias representaciones del mismo dato
struct empleado { ... enum {en_nomina, a_destajo} tipo_contrato;
union { int sueldo_base; float euros_hora;
} sueldo; } fulano;float euros; if (fulano.tipo_contrato == a_destajo) {
euros = horas * fulano.sueldo.euros_hora; } else {
euros = fulano.sueldo.sueldo_base * 100; }
© Francisco Rosales & Jose María Peña Programación C++ 132
Conversión explícita de tipo■ Casting: mecanismo para explicitar el
cambio de tipo de expresión o variable■ Le indicamos al compilador que asumimos
la responsabilidadfloat f = 65.2;int a;char c;
a=(int) f; /* a vale 65 */c=(char) a; /* c vale 65 (Código ASCII de 'A') */
© Francisco Rosales & Jose María Peña Programación C++ 133
Definición de nuevos tipostypedef int logico; logico terminar_ya = 0;
typedef struct nodo * lista_t; typedef struct nodo {
int valor; lista_t siguiente;
} nodo_t; nodo_t nodos[400]; lista_t lista = NULL;
© Francisco Rosales & Jose María Peña Programación C++ 134
Estructuras dinámicas I■ Permiten manejar agrupaciones de
datos cuya cantidad desconocemos de antemano
■ Se construyen mediante otras estructuras con “punteros” para interconectarse
■ Los punteros con valor NULL marcan los “extremos” de la estructura
■ Se ubican en memoria dinámica
© Francisco Rosales & Jose María Peña Programación C++ 135
Memória dinámica I■ Se getiona sobre el HEAP, o parte superior del
segmento de datos, con las siguientes funciones:void *malloc(size_t);
■ Ubica espacio suficiente para los bytes indicados
void *calloc(size_t num, size_t size);■ Ubica espacio (inicializado a ceros) para num elementos de
tamaño size
void *realloc(void *, size_t);■ Reubicar. Ajustar a nuevo tamaño
void free(void *);■ Liberar espacio previamente ubicado
© Francisco Rosales & Jose María Peña Programación C++ 136
Memória dinámica IIint * ptr = malloc(sizeof(int));*ptr = 8;free(ptr);
char * str = malloc(strlen("Hola") + 1);strcpy(str, "Hola");str = realloc(str, 20);strcat(str, "y adios");str = realloc(str, strlen(str) + 1);free(str);
© Francisco Rosales & Jose María Peña Programación C++ 137
Estructuras dinámicas II■ Para usar estructuras dinámicas hay
que tener (o programar), funciones de utilidad sobre dicho tipo:■ Insertar y extraer un elemento■ Buscar por contenido■ Ordenar■ etc
© Francisco Rosales & Jose María Peña Programación C++ 138
Listas■ Estructura lineal de elementos, como
los eslabones de una cadena■ Simplemente / doblemente encadenada■ FIFO / LIFO
© Francisco Rosales & Jose María Peña Programación C++ 139
Árboles■ Estructura arborescente de nodos.■ Un nodo raíz■ Nodos hoja si no tienen descendientes
■ Binario / N-ario
© Francisco Rosales & Jose María Peña Programación C++ 140
Tablas Hash■ Estructura mixta compuesta de un de
punteros a otras estructuras dinámicas■ Utiliza una función de barajado (hash)
sobre un campo clave de cada elemento para acotar la búsqueda
© Francisco Rosales & Jose María Peña Programación C++ 142
Operadores Aritméticos= asignación+ suma- resta* multiplicación/ división% módulo (resto)++ auto-incremento (pre ó post)-- auto-decremento (pre ó post)
© Francisco Rosales & Jose María Peña Programación C++ 143
Ej. Aritméticosint a = 5 - (2 * 2); int b; float f;a++; /* a = a + 1 */a=3; b=a++; /* a=4 b=3 */a=3; b=++a; /* a=4 b=4 */a=3; b=a--; /* a=2 b=3 */f=4/3; /* == 1 Div. entera */b=4%3; /* == 1 == (4 – (4/3)*3)*/ f=4.0/3; /* == 1.333 Div. real */f=(float)4/3; /* == 1.333 Div. real */
© Francisco Rosales & Jose María Peña Programación C++ 144
Operadores de Asignacióna *= 2; /* Igual a: a = a * 2; */a /= c+3; /* Igual a: a = a / (c+3); */
■ Usar cast en asignaciones entre variables y expresiones de diferente tipo:
a=(int)(f/2.34);
© Francisco Rosales & Jose María Peña Programación C++ 145
Operadores de Comparación y Lógicos== Igual!= Distinto> Mayor>= Mayor o igual< Menor<= Menor o igual&& AND lógico|| OR lógico! NOT lógico
© Francisco Rosales & Jose María Peña Programación C++ 146
Ej. Comparación y Lógicos■ El valor resultante de evaluar operadores lógicos es
0 sii FALSO ó 1 sii CIERTOint a = (3>2 || 5==4) && !1; /* a = 0 (==FALSO) */int b = (3>2 || 5==4) && 7; /* b = 1 (==CIERTO) */
■ Toda expresión sirve de expresión lógica considerándose: FALSA si la expresión se evalúa a CERO ó CIERTA si la expresión se evalúa a cualquier otro valor
if (a) ... /* Idéntico a: if (a != 0) ... */if (!b) ... /* Idéntico a: if (b == 0) ... */
■ La evaluación de expresiones lógicas es perezosaa = (3>2 || b==4); /* b==4 no se llega a evaluar */
© Francisco Rosales & Jose María Peña Programación C++ 147
Operadores de Bit& AND| OR^ XOR~ NOT<< Desplazamiento a la izquierda>> Desplazamiento a la derecha
© Francisco Rosales & Jose María Peña Programación C++ 148
Ej. De Bitunsigned char a = 48;unsigned char b = 19;unsigned char x,y,z,w,t,s;
x = a & b;y = a | b;z = a ^ b;w = ~a;t = a>>2;s = b<<3;
00110000 a00010011 b
00010000 x = 1600110011 y = 5100100011 z = 3511001111 w = 20700001100 t = 1210011000 s = 152
© Francisco Rosales & Jose María Peña Programación C++ 149
Operador sizeof()■ Vale el número de bytes que ocupa (en
memoria) una variable o un tipo de datosint a; if (sizeof(a) == sizeof(int)) ... /*CIERTO*/
■ Se sabe durante la compilación NO es función sino operador
■ Relaciones conocidas:1 == sizeof(char) <= sizeof(short) <= sizeof(int) == sizeof(unsigned) <= sizeof(long) <= sizeof(long long)
sizeof(float) <= sizeof(double)sizeof(int*) == sizeof(char*) == sizeof(void*)
© Francisco Rosales & Jose María Peña Programación C++ 150
Operador TernarioA ? B : C
■ Sii (A) entonces vale B, si no vale C
int num; char * str;...str = (num%2 ? "par" : "impar");
Funciones y Parámetros
Programa Principal y ArgumentosFunción o Procedimiento
RecursividadPaso de parámetros
© Francisco Rosales & Jose María Peña Programación C++ 152
El programa principal I■ Es el punto de entrada al programa■ Imprescindible para conseguir un
ejecutable autónomo o “programa”■ Mínimo programa totalmente correcto
int main(void) {
return 0; }
© Francisco Rosales & Jose María Peña Programación C++ 153
Argumentos de invocación I■ Los argumentos con los que es
invocado el ejecutable son accesibles desde la función principal main
int main(int argc, char* argv[])
int argc : Número de argumentoschar* argv[] : Argumentos de invocación
© Francisco Rosales & Jose María Peña Programación C++ 154
Argumentos de invocación II$ gcc prog.c -o prog$ ./prog uno dos tres cuatro
int main(int argc, char* argv[])argc == 5
argv[0] p r o g\0
argv[1] u n o\0
argv[2] d o s\0
argv[3] t r e s\0
argv[4] c u a t \0r oNULLargv[5]
© Francisco Rosales & Jose María Peña Programación C++ 156
Argumentos de invocación III#include <iostream>using namespace std;
int main(int argc, char *argv[]){
cout <<"Ejecutable: "<< argv[0]<<endl;
for(int i=0; i< argc; i++)cout<<"Argumento["<<i<<"]: "<< argv[i]<<endl;
return 0;}
© Francisco Rosales & Jose María Peña Programación C++ 157
Función – Procedimiento I■ Semejante a función matemática■ Invocación, argumentos, valor devuelto
■ Un único punto de entrada■ Un único punto de salida
■ Procedimiento■ Si no devuelve ningún valor
© Francisco Rosales & Jose María Peña Programación C++ 158
Funcionalidades II■ Crear una función
para cada “bien delimitada” funcionalidad o método
de cada módulo del programa
■ ¡Aunque sólo se use una vez!■ Programa = conjunto de funciones
© Francisco Rosales & Jose María Peña Programación C++ 159
Función – descripción III■ Qué es lo que hace (funcionalidad)■ El nombre debe resumirlo■ Ejemplo clásico
■ factorial(n) = n * (n-1) * ... * 2 * 1■ factorial(0) = 1■ Para n natural (entero no negativo)
© Francisco Rosales & Jose María Peña Programación C++ 160
Función – declaración IV■ Dice cómo se usarla■ No dice cómo está hecha■ Se declara su prototipo
unsigned factorial(unsigned);
Qué devuelve (tipo)
Qué hace (nombre)
Qué recibe (tipo)
Punto y coma
© Francisco Rosales & Jose María Peña Programación C++ 162
Función – invocación Vint main(void){
cout <<"3! = "<<factorial(3)<<endl;cout <<"7! = "<<factorial(7)<<endl;return 0;
}
■ Varias invocaciones a la misma función son independientes
Argumento
© Francisco Rosales & Jose María Peña Programación C++ 163
Función – definición VIunsigned factorial(unsigned n)
{
unsigned result = 1;
/* Recorre de n a 2 */
for (; n > 1; n--)
result = result * n;
return result;
}
Parámetro formalVariable local
© Francisco Rosales & Jose María Peña Programación C++ 164
Ejercicio
Programe:
La función principal de un programa que
muestre el factorial de los números
del 0 al 20 inclusive
© Francisco Rosales & Jose María Peña Programación C++ 166
Solución
#include <iostream>
using namespace std;
int main(void)
{
unsigned n;
for (n = 0; n <= 20; n++)
cout <<n<<"! = "<<factorial(n)<<endl;
return 0;
}
© Francisco Rosales & Jose María Peña Programación C++ 167
Ejercicio
Programe la siguiente función definida sobre
m y n naturales
binomial(m,n) = m! / (n!*(m-n)!)
© Francisco Rosales & Jose María Peña Programación C++ 168
Solución
unsigned binomial(unsigned m, unsigned n)
{
return factorial(m) / (factorial(n)*factorial(m-n));
}
© Francisco Rosales & Jose María Peña Programación C++ 169
Función – recursividad VII■ Facultad de las funciones de invocarse
a sí mismas■ Forma natural de expresar ciertos
problemas autocontenidos■ Ejemplo clásico
■ factorial(n) = n * factorial(n-1)■ factorial(0) = 1
© Francisco Rosales & Jose María Peña Programación C++ 170
Ejercicio
Programe:
Una versión recursiva de la función:
factorial(0) = 1factorial(n) = n * factorial(n-1)
Para n natural (entero no negativo)
© Francisco Rosales & Jose María Peña Programación C++ 171
Soluciónunsigned factorial(unsigned n)
{
if (n == 0)
n = 1;
else
n = n * factorial(n - 1);
return n;
}
© Francisco Rosales & Jose María Peña Programación C++ 172
Función – recursividad VIII■ Funcionalmente equivalente iterar■ La implementación:
■ no contiene ningún bucle■ pero si una condición de terminación
■ Es mucho más difícil de seguir■ La recursión infinita es fatal
© Francisco Rosales & Jose María Peña Programación C++ 173
Paso de argumentos por valorint main(void){
unsigned num = 5, res;res = factorial(num);/* num sigue valiendo 5 */
■ Se pasa el valor de la expresión evaluada, no la variable en sí■Esto es siempre así en C■En C++ existe el paso por referencia
© Francisco Rosales & Jose María Peña Programación C++ 174
Modificadores de funciónstatic
■ Sólo visible dentro del módulo
extern■ Función (o variable) declarada, pero definida en
algún otro sítio (Ej. en biblioteca)
inline■ Expandir su código en vez llamar a la función■ Aumenta la eficiencia y el tamaño del código
© Francisco Rosales & Jose María Peña Programación C++ 197
Compilación y montajeSon etapas separadas
■ Compilación: traducir de formato fuente a formato objeto (lenguaje máquina, más lista de referencias externas no resueltas)
■ Montaje: enlazar ficheros objeto entre sí y con las bibliotecas necesarias, resolviendo todas las referencias externas
■ Se produce un ejecutable: en formato interno apto para situar el proceso en memoria para su ejecución
© Francisco Rosales & Jose María Peña Programación C++ 200
Compilación separada■ En la figura:
■ Compilación separada de los módulos■main.cpp y prim.cpp
■ Montaje de los objetos con las bibliotecas■main.o, prim.o y libstdc++ y otras (libm, libc)
■ Obtención del fichero ejecutable■primes
© Francisco Rosales & Jose María Peña Programación C++ 201
Diagrama de fases
prim.h
prim.cpp
main.cpp
cmath
iostream
g++ -c
g++ -c
main.o
prim.old primes
cstdlib
libc.a
libm.a
Módulos de
usuario
Ficheros estándar
de cabecera
Compilaciónseparada
Ficheros objeto
Bibliotecas estándar Montaje Ejecutable
Dependen
Fich Herram Producto
Auto
entre si
Leyenda
libstdc++.a
© Francisco Rosales & Jose María Peña Programación C++ 202
Extensiones■ Le indican al compilador el contenido de
fichero, y el tratamiento que debe realizar:■ .c .cpp Fuentes de C y C++
■ Deben ser preprocesados, compilados y ensamblados■ .h Fichero de cabecera de C o de C++
(/usr/include y /usr/include/c++)■ Declaraciones de tipos de datos, prototipos y clases■ Deben ser preprocesados
■ .o Fichero objeto■ Deben ser enlazados (resueltos sus símbolos)
■ .a .so Bibliotecas estática y dinámica■ Para resolver símbolos de funciones estándar usadas
© Francisco Rosales & Jose María Peña Programación C++ 203
Bibliotecas■ Utilizar código probado, no reinventar
■ Consultar el manual■ Usar fichero(s) de cabecera
#include <xx.h> /* en C */#include <xx> // en C++ del std::
■ Montar contra la biblioteca (opción –l)■ libc.a Biblioteca estándar de C
■ Tiras de caracteres, entrada y salida estándar, etc.■ El montaje contra esta biblioteca es automático
■ libm.a Biblioteca de cálculo matemático■ sqrt, pow, hypot, cos, atan, etc.■ Hay que incluir <math.h> o <cmath>■ Hay que montar con la opción -lm
© Francisco Rosales & Jose María Peña Programación C++ 204
ar Manage Archive■ Para crear nuestras propias bibliotecas
■ -d Elimina ficheros■ -r Añade (o reemplaza) ficheros■ -u Igual que -r sólo si es más nuevo■ -t Muestra el contenido■ -v Verbose■ -x Extrae ficheros
© Francisco Rosales & Jose María Peña Programación C++ 205
Constructor■ Permite automatizar el proceso de
construcción de un programa que está convenientemente descompuesto en múltiples módulos
■ Herramienta make
© Francisco Rosales & Jose María Peña Programación C++ 206
make Application Maintainer■ Determina qué partes de un programa
deben recompilarse■ Debe conocer las dependencias entre
los ficheros:■ Un fichero debe actualizarse si alguno de
los que depende es más nuevo■ Makefile
■ Contiene las reglas de dependencia y mandatos para actualizarlo
© Francisco Rosales & Jose María Peña Programación C++ 207
Makefile I# Esto es un comentario CC=gcc # Esto son macros CFLAGS=-g OBJS2=test.o prim.o
all: primes test # Esta es la primera regla
primes: main.o prim.o # Esta es otra regla gcc -g -o primes main.o prim.o -lm # Este es el mandato asociado
test: $(OBJS2) # Aquí usamos las macros ${CC} ${CFLAGS} -o $@ ${OBJS2}
main.o prim.o test.o : prim.h # Esta es una dependencia.
clean: # Esta no depende de nada, es obligatoria. rm -f main.o ${OBJS2}
© Francisco Rosales & Jose María Peña Programación C++ 208
Makefile II■ Las líneas con mandatos deben tabuladas
■ make Dispara la primera regla■ make clean Explicitando la regla a disparar
■ La regla objetivo dispara sus dependencias recursivamente
■ Macros especiales■ $@, $*, $<, etc.
■ Se pueden especificar reglas basadas en la extensión de los ficheros■ Cómo pasar de un .c a un .o
© Francisco Rosales & Jose María Peña Programación C++ 209
Otras herramientas■ Existen variedad de herramientas útiles para
el desarrollador de código■ gprof Realizar un perfil de ejecución
Indica dónde se pierde el tiempo Dice qué optimizar
■ gcov Verificación del programa Asegura que el 100% del código han sido comprobado
■ indent Indentación de ficheros fuente en C Da estilo uniforme al código Es muy parametrizable
Top Related