Академический Документы
Профессиональный Документы
Культура Документы
Este directorio contiene todos los archivos del usuario en el cual estamos. Mas atr as del directorio
, se sit uan varios otros que contienen archivos necesarios para el sistema operativo. Un mapa de
directorios de Linux se observa a continuaci on; los directorios jane, will y zeb son los usuarios y work
y play son las carpetas que a creado el usuario will.
5
6
Siguiendo este mapa, la direcci on de la carpeta personal del usuario jane sera:
/home/jane
Cabe destacar que el usuario administrador (algo as como el usuario padre, quien puede modi-
car varias caractersticas que un usuario normal no puede) se denomina root y para poder acceder a
operar como el, debemos escribir en la terminal el comando sudo (super user do) seguido de la accion
a realizar (como instalar programas por ejemplo).
Esto nos pedir a el password del usuario en el que
estamos y podremos trabajar como asministrador
Una vez situados en el sistema de archivos del computador, podemos navegar por las distintas carpe-
tas, ejecutar programas, mover archivos, borrar archivos, etc. A continuaci on veamos algunos coman-
dos basicos sucientes para poder desenvolverse con tranquilidad por Linux. Si queremos manipular
un archivo en el directorio en el que estemos, solo escribiremos su numbre; si no estamos en el direc-
torio, debemos escribir la ruta completa.
Comando Funcion
cd [directorio] Abre un directorio
cd .. Retrocede un directorio
cd . Permanece en el mismo directorio (observemos que ene sta caso el punto representa el directorio actual)
cd Nos sit ua en el directorio home
ls Muestra el contenido del directorio en el cual estamos situados
la Muestra el contenido del directorio con los archivos ocultos incluidos en el cual estamos situados
cat [archivo/ruta del archivo] Muestra el contenido del archivo
mkdir [directorio nuevo] Creamos un nuevo directorio en el directorio donde estamos situados
cp [archivo/ruta del archivo] [directorio objetivo] Copia el archivo que hemos descrito al directorio objetivo
mv [archivo/ruta del archivo] [directorio objetivo] Mueve el archivo que hemos descrito al directorio objetivo
rm [Directorio/archivo/ruta del archivo] Elimina el directorio o el archivo especicado
man [comando] Muestra una descripci on del comando
[nombre-programa] [archivo/ruta del archivo] Ejecuta el archivo con el programa indicado
7
Instalaci on y desinstalaci on de programas y paquetes desde
la consola
Instalaci on con APT
APT (Advanced Packaging Tool) es el gestor de paquetes (paquetes de programas, los progra-
mas pueden ser empaquetados) usado por Linux Debian. Para ejecutar APT, usaremos la interfaz (o
comando) aptitude o apt-get. Para otros usos de APT relacionados con la memoria cache, usaremos
apt-cache, pero en este curso no interesa. Si lo ejecutamos, veremos una interfaz donde podemos
revisar el estado de distintos paquetes en nuestro sistema. Aptitude obtiene la lista de paquetes dis-
ponibles del repositorio de Linux, que es un conjunto de direcciones de Internet o locales donde estan,
tanto los listados de paquetes disponibles, como los propios paquetes. El programa aptitude se usa en
modo lnea de comando desde un terminal, en el que debe tener la condicin de superusuario (root).
Con aptitude podemos realizar varias acciones desde la terminal:
1. aptitude update: Actualiza la lista de paquetes (Es lo primero que debemos hacer antes de usar
aptitude).
2. aptitude install [paquete]: Instala el paquete determinado.
3. aptitude reinstall [paquete]: Actualiza o reinstala un paquete (que puede estar daado).
4. aptitude -d install [paquete] Descarga un paquete determinado pero no lo instala.
5. aptitude upgrade: Actualiza todos los paquetes de una sola vez (tratar de no usar)
6. aptitude remove [paquete]: Desinstala un paquete.
7. aptitude purge [paquete]: Desinstala un paquete con sus archivos de conguraci on.
Instalaci on desde las fuentes
Hay veces que para instalar un programa, debemos descargar los cheros fuentes de este que est an
comprimidos en archivos .tgz (o tar.gz) y .bz2 . Si es que no encontramos en las fuentes alg un archivo
readme o install, el proceso de instalacion se reduce a 4 pasos:
1. Descomprimir las fuentes mediante el comando tar:
tar zxvf nombre_archivo.tgz
tar zxvf nombre_archivo.tar.gz
tar jxvf nombre_archivo.bz2
Ahora debemos posicionarnos en la carpeta donde hemos descomprimido las fuentes:
cd /ruta
8
2. Tecleamos:
./configure
Aca se chequean los programas necesarios para la compilacion. Si no hay problema, podemos
pasar al siguiente paso. Si necesitamos algunos paquetes, debemos obtenerlos con APT.
3. Tecleamos:
make
Compila las fuentes y crea otros archivos necesarios.
4. Tecleamos:
make install
Instalamos el programa.
Con esto, ahora usted puede instalar el programa Root del cern, descargando los cheros
fuentes desde la p agina http://root.cern.ch.
Algoritmos
Un algoritmo es un metodo paso a paso para resolver un problema.
Un ejemplo es un algoritmo para saber si un n umero es primo o no primo como el que sigue:
Cualquier n umero es primo si solo es divisible entre si mismo y la unidad.
Por lo tanto, para saber si un n umero N es primo o no, bastara con dividirlo por todos los nmeros
entre 2 y N-1, y si ninguna divisin es exacta, entonces el nmero N es primo.
Pero hay algunas mejoras que podemos aplicar:
La primera es que no es necesario probar con todos los n umeros entre 2 y N-1, ya que podemos dar
por supuesto que si N no es divisible entre 2, tampoco lo sera para ning un otro n umero par: 4, 6, 8...,
por lo tanto, despus de probar con 2 pasaremos al 3, y despues podemos probar slo con los impares.
La segunda es que tampoco es necesario llegar hasta N-1, en realidad, solo necesitamos llegar hasta
el valor entero mas cercano a la raz cuadrada de N.
Esto es as porque estamos probando con todos los n umeros menores que N uno a uno. Supongamos
que vamos a probar con un n umero M mayor que la raz cuadrada de N. Para que M pudiera ser un
divisor de N debera existir un nmero X que multiplicado por M fuese igual a N.
N = MxX
El caso extremo, es aquel en el que M fuese exactamente la raz cuadrada de N. En ese caso, el valor
de X sera exactamente M, ya que ese es el valor de la raz cuadrada de N:
N = M
2
= MxM
Pero en el caso de que M fuese mayor que la raz cuadrada de N, entonces el valor de X debera ser
menor que la raz cuadrada de N. Y el caso es que ya hemos probado con todos los nmeros menores
que la raz cuadrada de N, y ninguno es un divisor de N.
Por lo tanto, ning un n umero M mayor que la raz cuadrada de N puede ser divisor de N si no existen
n umeros menores que la raz cuadrada de N que lo sean.
Los cientcos en computaci on denen s olo tres pasos necesarios en la construccion de un algorit-
mo. Estos son Secuencia, Desicion y Repeticion.
En la Secuencia, se da una seguidera de instrucciones de la forma:
9
10
do action 1
do action 2
...
do action n
En la Desici on, se prueba una concidicion y dependiendo de su veracidad, se realizan acciones de
forma:
if this condition is true:
Do a series of actions
else:
Do another series of actions
En la Repeticion, muchas veces deben repetirse las series de acciones. Esto se logra con los loops o
los bucles de la forma:
While a condition is true:
Do a series of actions
Debemos comprender estos tres pasos y podremos dise nar cualquier tipo de algoritmo
Pseudocodigos
El pseudoc odigo es un lenguaje creado para expresar algoritmos formalmente y de manera clara.
No es en si mismo un lenguaje de programacion, sino m as bien, un lenguaje formal (con reglas muy
extrictas), pero humano, que intenta evitar ambig uedades.
Un pseudocodigo para el algoritmo anterior podra ser:
Es N=1? -> N es primo, salir
Es N=2? -> N es primo, salir
Asignar a M el valor 2
mientras M <= raz cuadrada(N) hacer:
Es N divisible entre M? -> N no es primo, salir
Si M=2 entondes Asignar a M el valor 3
Si M distinto de 2 entonces Asignar a M el valor M+2
Fin del mientras
N es primo ->salir
Algoritmo de la burbuja
Para adentrarnos un poco mas en los algoritmos, veremos el que es mas sencillo probablemen-
te. El algoritmo de la burbuja es un algoritmo que permite ordenar una lista de valores seg un un
orden determinado. Consiste en ciclar repetidamente a traves de la lista, comparando elementos adya-
centes de dos en dos. Si un elemento es mayor que el que est a en la siguiente posicion se intercambian.
11
Vamos a ver un ejemplo. Esta es nuestra lista:
4 - 3 - 5 - 2 - 1
Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con
el segundo elemento. 4 es mayor que 3, as que intercambiamos. Ahora tenemos:
3 - 4 - 5 - 2 - 1
Ahora comparamos el segundo con el tercero: 4 es menor que 5, as que no hacemos nada. Con-
tinuamos con el tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:
3 - 4 - 2 - 5 - 1
Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:
3 - 4 - 2 - 1 - 5
Repitiendo este proceso vamos obteniendo los siguientes resultados:
3 - 2 - 1 - 4 - 5
2 - 1 - 3 - 4 - 5
1 - 2 - 3 - 4 - 5
Practica: Escriba un pseudocodigo del algoritmo de la burbuja
Algoritmo de Euclides
El algoritmo de Euclides sirve para calcular el MCD (maximo com un divisor) de dos n umeros.
Aunque existen otros metodos mas sencillos de calcular el MCD de dos o mas n umeros, este metodo
tiene la caracterstica de ser muy f acil de programar.
El algoritmo de Euclides es el siguiente (en pseudo-cdigo):
Si a es igual a b entonces el MCD es a (o b)
(*)Sino:
Si a es mayor que b entonces a toma el valor de (a - b)
Sino b toma el valor de (b - a)
Verificar si a es igual a b:
12
Si es igual entonces el MCD es a ( b)
Sino regresar a (*)
Estos pseudocodigos son muy utiles para que los entendamos nosotros, pero el ordenador no los
entender a. En el captulo siguiente veremos como pasar nuestros pensamientos al lenguaje de maquina
mediante el uso de un lenguaje de programaci on.
Programaci on en C++
Es tiempo de adentrarnos en C++. C++ tiene un mont on de ventajas sobre otros lenguajes; uno
de los principales es que es un lenguaje orietado a objetos (POO). Veremos que signica esto mas
adelante. Aprenderemos primero a poder traspasar nuestro ordenamiento mental a un modo que sea
entendible para la m aquina y as lograr el procesamiento y an alisis de datos experimentales deseados.
Para programar en C++ , necesitamos principalmente 3 cosas:
1. Sistema Operativo (Linux para nuestro caso)
2. Editor de Texto (gedit, vim, emacs, anjuta, bluesh, etc)
3. Compilador de C++(en nuestro caso usaremos g++ que viene por defecto en nuestro SO)
Otros, como los enlazadores vienen contenidos en nuestro compilador g++ y los debuggers no son
necesarios. Veremos esto con mayor atenci on en lo que sigue el curso.
Analicemos algunos conceptos de programaci on necesarios para comprender mejor.
Obtencion de un programa ejecutable
El programa ejecutable, es el programa en s listo para realizar la accion para la cual fue creado. El
ordenador, de alguna forma u otra, llamara a este programa ejecutable para que este act ue. Antes de
empezar, deniremos algunos conceptos importantes de programaci on que nos ser an de gran utilidad
para comprender como producir un programa listo para ser ejecutado en C++ de manera correcta:
Ficheros fuente
Los programas en C++ se escriben en un editor de textos del mismo modo que cualquier texto
corriente. Los cheros que contiene programas en C++ en forma de texto se conocen como cheros
fuente, y el texto del programa que contiene se conoce como programa fuente. Podemos usar variados
editores de textos entre otros como gedit, vim, emacs, anjuta o geany.
Interpretes y compiladores
C++ es un lenguaje compilado, y no interpretado. Esta diferencia es muy importante, ya que
afecta mucho a muchos aspectos relacionados con la ejecucin del programa.
En un lenguaje interpretado, el programa est a escrito en forma de texto; es el propio programa fuente.
Este programa fuente es procesado por un programa externo, el interprete, que traduce el programa,
13
14
instrucci on a instrucci on, al tiempo que lo ejecuta. En los lenguajes interpretados no existen progra-
mas ejecutables directamente por el ordenador. El intrprete traduce, en tiempo real, cada lnea del
programa fuente, cada vez que se quiere ejecutar el programa.
El los lenguajes compilados el proceso de traducci on solo se hace una vez. El programa compila-
dor toma como entrada el cdigo fuente del programa, y da como salida un chero que puede ser
ejecutado por el ordenador directamente. Una vez compilado, el programa ejecutable es aut onomo, y
ya no es necesario disponer del programa original ni del compilador para ejecutarlo.
Los lenguajes interpretados son f acilmente modicables, ya que necesitamos tener el el c odigo fuente
disponible en el ordenador. En los compilados, estos cheros no son necesarios, una vez compilados.
Los lenguajes interpretados necesitan un programa externo, llamado interprete o a veces maquina
virtual, o framework. Este programa actua como intermediario entre el fuente y el sistema operativo.
En los compilados ese papel lo desempea el compilador, pero al contrario que con el interprete, una
vez ha hecho su trabajo, no es necesario que este presente para ejecutar el programa.
Estas dos caractersticas, l ogicamente, hacen que los programas compilados requieran menos espacio
de memoria que los interpretados (si contamos el espacio usado por el interprete), y en general, los
compilados son mas rapidos, ya que s olo se compilan una vez, y el tiempo dedicado a esa tarea no se
suma al de ejecucin.
Entre los lenguajes interpretados estan: BASIC (Cdigo de instrucciones de propsito general para
principiantes), Java, PHP, muchos lenguajes de script, etc. Entre los lenguajes compilados est an: C,
C++, Pascal.
Ficheros objeto y compiladores
En los lenguajes compilados, los programas fuente no pueden ejecutarse. Son cheros de texto,
pensados para que los comprendan los seres humanos, pero incomprensibles para los ordenadores.
Para conseguir un programa ejecutable hay que seguir algunos pasos. El primero es compilar o traducir
el programa fuente a su cdigo objeto equivalente. Este es el trabajo que hacen los compiladores de C
y C++. Consiste en obtener un chero equivalente a nuestro programa fuente comprensible para el
ordenador, este chero se conoce como chero objeto, y su contenido como cdigo objeto.
El cdigo objeto no suele tener ningn signicado para los seres humanos. Adems es diferente para cada
ordenador y para cada sistema operativo. Por lo tanto existen diferentes compiladores para diferentes
sistemas operativos y para cada tipo de ordenador.
Libreras o bibliotecas
Junto con los compiladores de C++, se incluyen ciertos cheros llamados bibliotecas. Las bibliote-
cas contienen el c odigo objeto de muchos programas que permiten hacer cosas comunes, como leer el
teclado, escribir en la pantalla, manejar n umeros, realizar funciones matematicas, etc. Las bibliotecas
est an clasicadas por el tipo de trabajos que hacen, hay bibliotecas de entrada y salida, matem aticas,
de manejo de memoria, de manejo de textos, etc.
15
Hay un conjunto de bibliotecas muy especiales, que se incluyen con todos los compiladores de
C++. Son las libreras ANSI o est andar.
Ficheros ejecutables y enlazadores
Cuando obtenemos el chero objeto, a un no hemos terminado el proceso. El chero objeto, a pesar
de ser comprensible para el ordenador, no puede ser ejecutado. Hay varias razones para eso:
1. Nuestros programas usar an, en general, funciones que estar an incluidas en bibliotecas externas,
ya sean ANSI o no. Es necesario combinar nuestro chero objeto con esas bibliotecas para
obtener un ejecutable.
2. Muy a menudo, nuestros programas estaran compuestos por varios cheros fuente, y de cada
uno de ellos se obtendr a un chero objeto. Es necesario unir todos los cheros objeto, m as las
bibliotecas en un unico chero ejecutable.
3. No siempre obtendremos un chero ejecutable para el c odigo que escribimos, a veces querremos
crear cheros de biblioteca, y en ese caso el proceso ser a diferente.
Existe un programa que hace todas estas cosas, se trata del linker, o enlazador. El enlazador toma
todos los cheros objeto que componen nuestro programa, los combina con los cheros de biblioteca
que sean necesarios y crea un chero ejecutable. Sin embargo, en nuestro caso no debemos preocu-
parnos pues el compilador que usaremos g++ tiene el enlazador contenido en el y lo ignoraremos.
Errores
Por supuesto, somos humanos, y por lo tanto nos equivocamos. Los errores de programacion pue-
den clasicarse en varios tipos, dependiendo de la fase en que se presenten.
Errores de sintaxis: son errores en el programa fuente. Pueden deberse a palabras reservadas mal
escritas, expresiones err oneas o incompletas, variables que no existen, etc. Los errores de sintaxis se
detectan en la fase de compilaci on. El compilador, adem as de generar el c odigo objeto, nos dara una
lista de errores de sintaxis. De hecho nos dara slo una cosa o la otra, ya que si hay errores no es
posible generar un c odigo objeto.
Avisos: adem as de errores, el compilador puede dar tambien avisos (warnings). Los avisos son errores,
pero no lo sucientemente graves como para impedir la generaci on del codigo objeto. No obstante,
es importante corregir estos errores, ya que ante un aviso el compilador tiene que tomar decisiones,
y estas no tienen por que coincidir con lo que nosotros pretendemos hacer, ya que se basan en las
directivas que los creadores del compilador decidieron durante la creacin del compilador.
Errores de enlazado: el programa enlazador tambien puede encontrar errores. Normalmente se re-
eren a funciones que no estan denidas en ninguno de los cheros objetos ni en las bibliotecas.
Puede que hayamos olvidado incluir alguna biblioteca, o alg un chero objeto, o puede que hayamos
olvidado denir alguna funcin o variable, o lo hayamos hecho mal.
16
Errores de ejecucion: incluso despues de obtener un chero ejecutable, es posible que se produz-
can errores. En el caso de los errores de ejecuci on normalmente no obtendremos mensajes de error,
sino que simplemente el programa terminar a bruscamente. Estos errores son mas difciles de detec-
tar y corregir. Existen programas auxiliares para buscar estos errores, son los llamados depuradores
(debuggers). Estos programas permiten detener la ejecucion de nuestros programas, inspeccionar va-
riables y ejecutar nuestro programa paso a paso (instrucci on a instruccion). Esto resulta util para
detectar excepciones, errores sutiles, y fallos que se presentan dependiendo de circunstancias distintas.
Errores de dise no: nalmente los errores mas difciles de corregir y prevenir. Si nos hemos equi-
vocado al dise nar nuestro algoritmo, no habra ning un programa que nos pueda ayudar a corregir los
nuestros. Contra estos errores s olo cabe practicar y pensar.
Primera practica
Para poder ver cada uno de estos conceptos denidos en accion, y empezar a comprender ciertas
caractersticas de programaci on en c++, escribiremos en nuestro editor de texto un programa simple,
que simplemente devuelve por pantalla la frase El electron cumple el principio de exclusion de Pauli.
#include <iostream>
int main(){
std::cout<<"El electron cumple el principio de exclusion de Pauli"<<std::endl;
}
El chero fuente debe ser guardado con la extensi on .c, por ejemplo programa.c. Luego de guar-
darlo, procederemos a efectuar el proceso de compilacion y luego el de ejecucion.
Haciendo un analisis r apido de nuestro programa, podemos ver que en la primera lnea aparece
el comando #include.
Este comando incluye en nuestro programa una librera con el nombre especi-
cado, que en este caso es iostream. Dicha librera contiene los comandos necesarios para mostrar y
recibir informaci on en pantalla (cout, cin, endl, etc.).
Luego nos damos cuenta que aparece la lnea int main().
Este c odigo aparece en todos los progra-
mas de C++ y es la funcion de entrada para que el compilador pueda reconocer que el programa
ha iniciado.
Estos comandos desde luego, seran analizados en mayor profundidad al avanzar este curso.
Para compilarlo debemos ir a una terminal en Linux. Debemos luego situarnos en la carpeta en
donde este nuestro chero fuente, y ahi efectuar el siguiente comando:
g++ [nombre del fichero fuente] -o [nombre del fichero ejecutable]
En este proceso el ordenador toma el archivo con el nombre del chero fuente especicado, lo com-
pila y lo enlaza al mismo tiempo (esto es una caracterstica que posee el compilador) y produce un
chero ejecutable con el nombre que nosotros queramos. Si no especicamos el nombre, producira por
defecto el archivo a.out, sin embargo, se recomienda siempre especicar un nombre propio. Si existen
errores, el compilador los arrojara en la terminal y no producira el archivo.
17
Luego, para ver en acci on nuestro programa debemos escribir en la terminal:
./[nombre del fichero ejecutable]
Esto hace que los bucles for no sean totalmente necesarios, pero simplican bastante la programaci on.
Seleccion
Si, si no
Permite la ejecucion condicional de una sentencia solo si la condici on es verdadera,de la forma:
if (<condicion>) <sentencia1>
[else <sentencia2>]
Si la condicin es verdadera se ejecutara la sentencia1, si es falsa, (y si existe la parte del else), se
ejecutar a la sentencia2.
La cla usula else es opcional, y si se usa, no pueden insertarse sentencias entre la sentencia1 y el else.
26
Switch
Esta sentencia es una generalizaci on de las sentencias if...else. En el caso de las sentencias if,
la expresi on que se eval ua como condicin es booleana, lo que quiere decir que solo hay dos valores
posibles, y por lo tanto, s olo se puede elegir entre dos sentencias a ejecutar.
En el caso de la sentencia switch, la expresi on a evaluar ser a entera, por lo tanto, el n umero de
opciones es mucho mayor, y en consecuencia, tambien es mayor el n umero de diferentes sentencias
que se pueden ejecutar.
switch (<expresin entera>)
{
[case <expresin_constante1>: [<sentencias1>]]
[case <expresin_constante2>: [<sentencias2>]]
...
[case <expresin_constanten>: [<sentenciasn>]]
[default : [<sentencia>]]
}
Si la expresion entera no es igual a ninguna de las expresiones constantes que denimos, entonces se
har a lo que diga default. Veamos un ejemplo:
bool EsVocal;
char letra;
...
switch(letra)
{
case a:
case e:
case i:
case o:
case u:
EsVocal = true;
break;
default:
EsVocal = false;
}
En este caso, dependiendo del valor de letra, se tomaran diferentes acciones. La etiqueta break la
veremos m as adelante.
Salto
Los programas C++ se ejecutan secuencialmente, pero existen formas de romper este orden se-
cuencial, mediante el uso de sentencias de salto, que veremos a continuaci on.
27
Ruptura
En general, una sentencia break transere la ejecuci on secuencial a la siguiente sentencia, aban-
donando aquella en que se ejecuta.
y = 0;
x = 0;
while(x < 1000)
{
if(y == 1000) break;
y++;
}
x = 1;
En este ejemplo el bucle no terminara nunca si no fuera por la lnea del break, ya que x no cambia.
Despues del break el programa continuara en la lnea x = 1.
Continue
El uso de esta sentencia dentro de un bucle ignora el resto del codigo de la iteracion actual, y
comienza con la siguiente, es decir, se transere la ejecucion a la evaluaci on de la condicion del bucle:
y = 0;
x = 0;
while(x < 1000)
{
x++;
if(y >= 100) continue;
y++;
}
En este ejemplo la lnea y++ slo se ejecutara mientras y sea menor que 100, en cualquier otro caso
el control pasa a la siguiente iteracion, con lo que la condicion del bucle volvera a evaluarse.
Retorno
Esta es la sentencia de salida de una funci on, cuando se ejecuta, se devuelve el control a la rutina
que llamo a la funci on. Ademas, se usa para especicar el valor de retorno de la funci on:
return <sentencia>
Por ejemplo:
int Paridad(int x)
{
if(x % 2) return 1;
return 0;
}
Devolvera 1 si x es par, si no lo es retornar a 0.
28
Ambitos
Llamamos ambito a la zona desde que cierto objeto es accesible. En C++ solemos referirnos a dos
tipos de ambitos: temporal y de acceso. As, el ambito temporal indica el intervalo de tiempo en el
que un objeto existe o es accesible. El ambito de acceso nos dice desde donde es accesible.
Las variables declaradas dentro de un bucle, ser an accesibles s olo desde el propio bucle, esto es,
tendr an un ambito local para el bucle. Esto es porque las variables se crean al inciar el bucle y se
destruyen cuando termina. Evidentemente, una variable que ha sido destruida no puede ser accedida,
por lo tanto, el ambito de acceso esta limitado por el ambito temporal.
Las variables declaradas dentro de una funcion, y recuerda que main tambin es una funci on, s olo
ser an accesibles para esa funcion, desde el punto en que se declaran hasta el nal. Esas variables son
variables locales o de ambito local de esa funci on.
Enmascaramiento
Generalmente no es posible, y no suele ser necesario, declarar dos variables con el mismo nombre,
pero hay condiciones bajo las cuales es posible hacerlo.
Por ejemplo, podemos declarar una variable global con un nombre determinado, y declarar otra
variable (del mismo tipo o de otro diferente) de forma local en una funci
on, usando el mismo nombre.
En ese caso decimos que la segunda declaracion (la local), enmascara a la primera (la global). Con
eso queremos decir que el acceso a la variable global est a bloqueado o enmascarado por la local, que
es a la unica que podemos acceder directamente. Por ejemplo:
int x;
int main() {
int x;
x = 10;
return 0;
}
En este programa, cuando asignamos 10 a x estamos accediendo a la version local de la variable x.
En la funci on main, la variable global x est a enmascarada, y no puede accederse a ella directamente.
Existe un metodo para acceder a una variable global enmascarada por una variable local. Se trata del
operador de ambito, que consiste en dos caracteres de dos puntos seguidos (::). Si hubieramos escrito:
int x;
int main() {
int x;
29
::x = 10;
return 0;
}
La variable denida afuera de main hubiese tomado el valor 10.
Elementos de comunicacion: cout y cin
Se trata de la salida estandar, cout y de la entrada est andar cin. Estos objetos nos permiten enviar
a la pantalla o leer desde el teclado cualquier variable o constante, incluidos literales. El uso es muy
simple:
#include <iostream>
using namespace std;
cout << <variable|constante> << <variable|constante>...;
cin >> <variable> >> <variable>...;
Las 2 primeras lneas son necesarias porque las declaraciones que permiten el uso de cout y cin est an
en una biblioteca externa. Con estos elementos ya podemos realizar algunos programas.
Primeros programas
1. Fermion y Boson: Un fermion es una partcula con spin fraccionario y un bos on una partcula
con spin entero. Escriba un programa que reciba desde el usuario el valor del spin y retorne si
la partcula con dicho spin es un fermion o un bos on.
2. Levi-Civita: En matem aticas, y en particular en c alculo tensorial, se dene el smbolo de
Levi-Civita, tambien llamado el smbolo de permutaci on o tensor de Levi-Civita, como sigue:
Escriba una funcion LeviCivita(int i, int j, int k) que reciba tres par ametros de entrada corres-
pondientes a i, j y k y retorne el valor correspondiente del tensor de acuerdo a los valores de
ellos (recuerde que los ndices no pueden tomar valores diferentes de 1,2 o 3).
3. Conguraci on electr onica: Escriba una funcion cong(int Z, int c) que reciba los par ametros
del n umero at omico y la carga de un i on o atomo, y retorne la conguracion electr onica, sin
tomar en cuenta las anomalas que se presentan en algunos casos. El formato de salida debe
ser, de tal forma que si la conguracion es:
1s
2
2s
2
2p
5
30
Arroje:
1s(2)2s(2)2p(5)
El programa debe aguantar hasta un elemento que contenga 35 electrones.
Castings
En determinadas ocaciones, necesitamos convertir un tipo de variable a otra explcitamente. Esto
se logra con los Castings. Un casting tiene la forma:
(<nombre de tipo>)<expresion>
<nombre de tipo>(<expresion>)
Por ejemplo supongamos que tenemos las variables oat a, int b y oat c. Por reglas del compilador,
la variable d=a+b+c ser a de tipo oat, pero si queremos que esta sea de tipo int, podemos hacer:
d=int(a+b+c);
O bien:
d=(int)(a+b+c);
Arreglos o Arrays
Los arrays permiten agrupar datos usando un unico identicador. Todos los elementos de un array
son del mismo tipo, y para acceder a cada elemento se usan ndices;
<tipo> <identificador>[<num_elemen>][<num_elemen>]...;
Desde el punto de vista del programador, un array es un conjunto de datos del mismo tipo a los que
se puede acceder individualmente mediante un ndice. Por ejemplo:
int vector[10];
El compilador obtendr a espacio de memoria suciente para almacenar 10 objetos de tipo int, y el
programa podr a acceder a cada uno de esos valores para leerlos o modicarlos. Para acceder a cada
uno de los valores se usa un ndice, que en este caso podr a tomar valores entre 0 y 9. Usando el valor
del ndice entre corchetes, por ejemplo: vector[0] o vector[4].
Cuando slo se usa un ndice se suele hablar de vectores, cuando se usan dos, de tablas (o matrices).
Los arrays de tres o m as dimensiones no suelen tener nombres propios, pero podemos generalizarlos
matem aticamente como tensores.
31
Inicializaci on
float R[10] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
float S[] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
int N[] = {1, 2, 3, 6};
int M[][3] = { 213, 32, 32, 32, 43, 32, 3, 43, 21};
char Mensaje[] = "Error de lectura";
char Saludo[] = {H, o, l, a, 0};
Estos son diferentes tipos de inicializar un array. Cuando se inicializan los arrays en la declaracion
no es obligatorio especicar el tamao para la primera dimensi on, como ocurre en los ejemplos de las
lneas 2, 3, 4, 5 y 6. En estos casos la dimensi on que queda indenida se calcula a partir del n umero
de elementos en la lista de valores iniciales. El compilador sabe contar y puede calcular el tama no
necesario de la dimensi on para contener el n umero de elementos especicados. En el caso 2, el n umero
de elementos es 10, ya que hay diez valores en la lista. En el caso 3, sera 4. En el caso 4, ser a 3, ya
que hay 9 valores, y la segunda dimension es 3: 9/3=3. Y en el caso 5, el n umero de elementos es 17,
16 caracteres m as el cero de n de cadena.
Cadenas de caracteres
Analizaremos un caso particular de arrays, las cuales son las cadenas de caracteres.U na cadena
en C++ es un conjunto de caracteres, o valores de tipo char, terminados con el caracter nulo, es
decir el valor numerico 0. Internamente, en el ordenador, se almacenan en posiciones consecutivas de
memoria. Este tipo de estructuras recibe un tratamiento muy especial, ya que es de gran utilidad y
su uso es continuo.
La manera de denir una cadena es la siguiente:
char <identificador> [<longitud mxima>];
Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar una posicion
para almacenar el car acter nulo terminador, de modo que si queremos almacenar la cadena HOLA,
tendremos que declarar la cadena como:
char Saludo[5];
La asignacion directa solo est a permitida cuando se hace junto con la declaraci on.
El siguiente ejemplo producir a un error en el compilador, ya que una cadena denida de este modo
se considera una constante.
char Saludo[5];
Saludo = "HOLA"
La manera correcta de asignar una cadena es:
32
char Saludo[5];
Saludo[0] = H;
Saludo[1] = O;
Saludo[2] = L;
Saludo[3] = A;
Saludo[4] = 0;
O bien:
char Saludo[5] = "HOLA";
Practica:
Vectores: Escribir una funci on oat dot(oat vector[3]) que calcule el producto punto de un vector
pasado como array. Escriba otra funci on oat norm(oat vector[3]) que calcule su norma y una fun-
ci on distance(oat vector1[3], oat vector2[3]) que calcule la distancia entre dos vectores.
Transformacion de Lorentz: En relatividad especial, una transformaci on de Lorentz es la rela-
ci on entres las coordenadas espacio-temporales de un sistema de referencia S y las coordenadas de
otro S
S( x, y, z,
t)
Si un sistema se mueve con velocidad V en direcci on del eje x respecto a otro, entonces la relaci on
entre las coordenadas, si asumimos que en el instante inicial t = t
dn
dt
= n
El error aleatorio viene del hecho de que hay un error estadstico inherente en el conteo de los
eventos. Es decir, el error aleatorio se produce por la inhabilidad nstural de tener presici on innita.
Los errores sistem aticos pueden deberse a que los contadores no son totalmente ecientes, no son lo
sucientemente sensibles o bien que el material radioactivo no es puro. Es decir, los errores sistematicos
se producen por errores en ls conguraci on del proceso de medici on.
Estadstica descriptiva
Debido los errores, es necesario tomar mediciones de una magnitud variadas veces, observar los
distintos valores que estos toma y en base al an alisis de estos datos determinar el mejor valor de la
cantidad. Para ello, tenemos herramientas utiles de estadstica descriptiva que nos pueden ayudar.
Este an alisis tambien sirve para estudiar determinadas caractersticas cualitativas o cuantitativas de
un sistema en su conjunto (por ejemplo temperatura de una zona, densidades promedio de suelos,
etc.)
53
Histogramas
Un histograma es una representacion graca de una variable en forma de barras, donde la super-
cie de cada barra es proporcional a la frecuencia de los valores representados. Sirven para obtener
un panorama de la distribuci on de la poblacion, o la muestra, respecto a una caracterstica, cuanti-
tativa y continua, de la misma. As pues, podemos evidenciar comportamientos, observar el grado de
homogeneidad, acuerdo o concision entre los valores de todas las partes que componen la poblacion
o la muestra, o, en contraposicion, poder observar el grado de variabilidad, y por ende, la dispersion
de todos los valores que toman las partes.
Ac a por ejemplo, podemos ver un histograma de una distribuci on de momentum generada por Root
Para poder comprender como se generan y se dibujan los histogramas en Root, primero estudia-
remos algunas clases fundamentales:
Clase TCanvas
Esta clase es una especie de area (Canvas quiere decir Lienzo) sobre la cual dibujaremos todo.
El TCanvas permanece abierto como una plataforma de manejo gr aco y f acil al usuario. Adem as,
podemos tener variados TCanvas abiertos con distintos dibujos en el. Para generar un TCanvas
recurrimos al constructor principal (para otros constructores de TCanvas y cualquier clase, vease el
Class Index de Root):
TCanvas * c1 = new TCanvas("nombre", "titulo", ancho, alto);
Si lo escribimos en la terminal con Root activo, veremos como nos arroja inmediantamente el lienzo
sobre el cual trabajaremos. El TCanvas tambien se divide en sub- areas de trabajo llamados Pads.
Un metodo de TCanvas que permite dividirlo en Pads es Divide. Por ejemplo:
c1->Divide(2,3)
54
Dividir a el TCanvas en 6 mini-lienzos distribuidos en forma 2 3. Para situarnos en un determinado
Pad, debemos aplicar el metodo cd el cual funciona as:
c1->cd(numero de Pad)
Ac a, nos situaremos en el Pad del n umero se nalado.
Clase TF1, TF2, TF3
Estas clases son funciones. Denen funciones en 1D, 2D y 3D respectivamente. Las funciones se
generan de las formas:
TF1*f1=new TF1("nombre","formula", xmin, xmax);
TF2*f2=new TF2("nombre","formula", xmin, xmax, ymin, ymax);
TF3*f3=new TF3("nombre","formula", xmin, xmax, ymin, ymax, zmin, zmax)
Y para dibujarlas en el TCanvas debemos usar el metodo Draw:
f1->Draw()
Este metodo no solo sirve para dibujar funciones, si no que cualquier cosa que se pueda dibujar en
Root. Esto incluye tambien a los histogramas.
El metodo Draw() tiene variadas opciones que permiten modicar como se dibujara el objeto (revisar
documentaci on). Otros metodos de TF(1-2-3) son Eval, Derivative, Integral, entre otros.
Clase Histogramas
Estas clases tienen los nombres TH(1-2-3)(S-D-F-I-C). Dependiendo de las dimensiones y de el
tipo de variable de los datos. Por ejemplo TH2F es un histograma de dos dimensiones en variables
tipo oat. Un mapa con la herencia de la clase histograma se encuentra a continuaci on:
Para crear Histogramas podemos recurrir al constructor:
TH1*h1=new TH1F("nombre","titulo",numero de bins en x, xmin, xmax);
Los bins son los subintervalos en los cuales se divide el eje de valores que puede tomar la magnitud.
Para mayores dimensiones, se escriben a continuacion los numeros de bins de y y z y sus respectivos
m aximos y mnimos.:
TH3*h3=new TH3F("nombre","titulo",numero de bins en x, xmin, xmax,
numero de bins en y, ymin, ymax, numero de bins en z, zmin, zmax);
Los histogramas contienen tres objetos TAxis: los ejes x, y, z. Por medio de metodos podemos
llamarlos y guardarlos en variables:
TAxis*xAxis=h1->GetXaxis();
As mismo podemos obtener lmites y centros de los bins por medio de metodos a los TAxis:
55
xAxis->GetBinLowEdge(numero del bin);
xAxis->GetBinCenter(numero del bin);
xAxis->GetBinUpEdge(numero del bin);
Tambien podemos guardar un bin como variable:
Int_t bin=h3->GetBin(binx,biny,binz)
Para llenar histogramas usamos el metodo Fill de la forma:
h->Fill(binx);
h->Fill(binx,weight);
h->Fill(binx, biny);
h->Fill(binx, biny, binz, weight)
El metodo llena el respectivo bin con el peso denotado. Si no se denota, se incrementa en uno
el contenido del bin. Podemos incrementar el contenido del bin directamente con AddBinContent,
cambiarlo con SetBinContent y acceder al contenido por medio de GetBinContent:
Double_t contentbin=h->GetBinContent(numero del bin);
Otros metodos de llenado son por medio de generadores aleatorios. El metodo FillRandom sirve
para llenar un histograma aleatoriamente con la distribuci on de alguna funci on o alg un otro histo-
grama. Por ejemplo:
h1->FillRandom("gaus",10000)
Llena el histograma con 10000 entradas de una distribuci on Normal(0,1). Podemos tambien llenarlo
aleatoriamente con alguna funcion que denamos:
TF1*f=new TF1("funcion","Sin(x)",0,100);
h1->FillRandom("funcion",10000)
O bien con algun histograma anterior:
h2->FillRandom(&h1,10000)
El estilo del histograma lo podemos modicar con variadas opciones y metodos que se encuentran
tambien en la documentaci on.
Recomendamos ver los ejemplos que se encuentran en los tutoriales de Root, entenderlos y preguntar
en clases.
56
Promedio y varianza de una muestra
Para cualquier muestra de tama no N con datos x
i
cada uno con frecuencia n
i
, podemos obtener
el promedio ( x) y la varianza (s
2
) de ella de acuerdo a las formulas:
x =
1
N
x
i
n
i
s
2
=
1
N 1
n
i
(x
i
x)
2
Estas magnitudes son muestrales, es decir, presentan solo una aproximaci on de los verdaderos pro-
medios y varianzas de la poblacion total y son obtenidos mediante estimacion de par ametros. Si
conocemos el promedio real , entonces la varianza real ser a:
2
=
1
N
n
i
(x
i
)
2
Y la desviaci on:
=
1
N
n
i
(x
i
)
2
Asimetra
El promedio nos indica una especie de valor representativo de todos los valores obtenidos en la
muestra y la varianza nos indica la dispersi on de los datos.
Como estas, la medida de asimetra nos permite identicar si los datos se distribuyen de forma
uniforme alrededor del punto central (promedio). La asimetra presenta tres estados diferentes , cada
uno de los cuales dene de forma concisa como estan distribuidos los datos respecto al eje de asimetra:
El coeciente de asimetra de Fisher entrega una medida cuantitativa de esta propiedad. Antes
de conocerlo, primero revisaremos el concepto de momento central de orden n de una distribuci on
estadstica discreta. Se calcula como:
n
=
1
N
n
i
(x
i
x)
n
Luego el coeciente de Fisher es:
1
=
3
3
57
Si
1
= 0, se acepta una distribucion simetrica; si
1
> 0, hay asimetra positiva y si
1
< 0, existe
asimetra negativa.
Practica: Escriba un programa en C++ que permita calcular el coeciente de asimetra de Fisher
de un conjunto de datos entregados como arreglo (de un maximo de 10000) y que nos entregue
textualmente la forma de la distribuci on respecto a su asimetra. Con ayuda de esta funci on, escriba
un programa en Root que genere un histograma con 5000 entradas una distribucion que usted escoja.
Extraiga los datos y verique gr acamente que la asimetra es coincidente con lo que entrega el
programa. Hint: Escriba funciones para el promedio y la varianza.
Curtosis
Esta medida determina el grado de concentraci on que presentan los valores en la region central de
la distribuci on. Por medio del Coeciente de Curtosis, podemos identicar si existe una gran concen-
tracin de valores (Leptoc urtica), una concentraci on normal (Mesoc urtica) o una baja concentracion
(Platic urtica).
El coeciente de Curtosis de calcula como:
2
=
4
4
3
Si
2
es cercana a 0, la distribuci on es mesoc urtica, si
2
> 0, es Leptoc urtica y si
2
< 0 es planic urtica.
Practica: Haga lo mismo que en la seccion anterior, pero esta vez con el coeciente de curtosis.
Variables aleatorias y probabilidad
Una caracterstica es aleatoria si no se sabe o no puede ser predecida con completa certeza. El
grado de aleatoriedad de una variable es cuanticada por el concepto de probabilidad. Consideremos
un espacio S de un cierto n umero de elementos o sucesos. Para cada subconjunto A de S podemos
asignar un n umero P(A) llamado probabilidad que satisface:
1. Para cada A en S; P(A) 0.
2. Para dos conjuntos A y B disjuntos, la probabilidad de la union entre A y B es la suma de las
probabilidades: P(A B) = P(A) + P(B).
3. La probabilidad del espacio entero es 1: P(S) = 1.
58
Practica: Demuestre con estos axiomas:
P(A
c
) = 1 P(A); (A
c
es el complemento de A)
P(A A
c
) = 1
0 P(A) 1
P() = 0
P(A B) = P(A) + P(B) P(A B)
Probabilidad condicional
Consideremos un prot on y un electr on. Supongamos que introducimos el prot on en una caja
aislada.Seg un la mecanica cuantica el prot on tiene cierta probabilidad de estar en un lugar A de
la caja. Llamemos a esta probabilidad P
(
A
+
). Si ahora introducimos otro electron, sabemos que la
probabilidad de que este electr on este en un espacio B se ve condicionada dependiendo de donde
este el proton en este momento. Luego, si consideramos que P
(
B
/A
+
) y se calcula:
P(B
|A
+
) =
P(B
A
+
)
P(A
+
)
En general la probabilidad de que ocurra un suceso X dado que ocurri o uno Y se calcula como:
P(X|Y ) =
P(X Y )
P(Y )
Ahora, los sucesos A y B son independientes si:
P(A|B) = P(A) P(A B) = P(A)P(B)
Adem as, podemos deducir una relaci on entre probabilidades condicionales llamado teorema de Bayes:
P(A|B) =
P(B|A)P(A)
P(B)
La probabilidad se puede interpretar como una frecuencia relativa de sucesos determinados. Sin
embargo, otros enfoques los interpretan como el grado de verdad de que el suceso sea verdadero.
Funcion densidad de probabilidad
Consideremos un experimento caracterizado por una variable continua x que puede asumir deter-
minados valores. La probabilidad de que la cantidad se situe en un intervalo [x, x+dx] esta dada por
la funcion de densidad de probabilidad f(x):
probabilidad de observar x en el intervalo [x, x + dx] = f(x)dx
59
En el caso de una variable discreta, la funcion de densidad se denomina funcion de cuanta y entrega
la probabilidad de que la variable aleatoria tome el valor x:
Probabilidad de que X sea igual a x = P(x)
La f.d.p se normaliza requiriendo que la probabilidad total por todo el espacio de sucesos sea 1:
S
f(x)dx = 1
Podemos asemejar la f.d.p con el histograma de datos. En el caso de un histograma, los diferenciales
dx se vuelven discretos como pequeos subintervalos o bins de ancho x
i
el area total bajo la curva
corresponde a la sumatoria de todas las frecuencias multiplicada por el ancho del intervalo respectivo:
A =
n
i
x
i
La f.d.p corresponde a la misma forma del histograma, pero tomando valores de tal forma que el
area total sea 1. La funcion de probabilidad acumulada, se reere a la probabilidad de que la variable
aleatoria pueda tomar cualquier valor hasta un x. En general se calcula, continua y discretamente
como:
F(x) =
x
i
x
P(x
i
)
F(x) =
f(x
)dx
f(x, y)dy
Lo mismo para y:
f
y
(y) =
f(x, y)dx
Estas corresponden a las proyecciones del histograma normalizado sobre los ejes x e y.
Practica:Encuentre expresiones para calcular probabilidades condicionadas, es decir, dado que y
toma cierto valor, la probabilidad de que x tome otro.
60
Valores esperados
Propagaci on de error
Ejemplos de distribuciones de probabilidad y aplicaciones a
la fsica
Distribuci on binomial
Distribuci on de Poisson
Distribuci on uniforme
Distribuci on exponencial
Distribuci on Normal
Distribuci on Chi-cuadrado
Distribuci on Cauchy
Distribuci on Landau
Metodo de Montecarlo
Estimaci on de parametros y test de hip otesis
Metodo de maxima verosimilitud
Metodo de mnimos cuadrados
Metodo de momentos
Intervalos y lmites de conanza
Analisis de radiacion de partculas a
traves de la materia
61
62
Geant4
63