Modelado y simulación de técnicas de conformación de haz para ...
5. Técnicas de Simulación 2. Programando C++
description
Transcript of 5. Técnicas de Simulación 2. Programando C++
Objetivos: Dominar C++ al nivel necesario para poder armar programas que simulen en base a Geant4.
1
5. Técnicas de Simulación2. Programando C++
www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Dr. Willy H. GerberInstituto de Fisica
Universidad AustralValdivia, Chile
Programa para armar programas
2www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Trabajaremos con Visual Studio 2008
Programa para armar programas
3www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Creemos un proyecto…
Programa para armar programas
4www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
… en C++ :
Programa para armar programas
5www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Estructura creada:
Programa para armar programas
6www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Ejecutar:
Ejemplo simple
7www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
// UFROTest.cpp : main project file.
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args){ Console::WriteLine(L"Hello World"); Console::ReadLine(); return 0;}
Comencemos con un ejemplo simple:
Comentario (línea que comienza con //)
Inicio programa principal (main)
Otro ejemplo
8www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Otro ejemplo, con dos línea:
Los espacios no son considerados en la compilación. O sea también se podría escribir:
int main(array<System::String ^> ^args){ Console::Write(“Adios "); Console::WriteLine(“mundo cruel"); Console::ReadLine(); return 0;}
int main(array<System::String^> ^args) { Console::Write(“Adios"); Console::WriteLine(“mundo cruel"); Console::ReadLine(); return 0; }
Variables
9www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
string^ s=“Hola”;
En el ejemplo se introdujo el concepto de texto (string) que seescribe entre “:
Existen además por ejemplo:
int n=2;char c=‘h’;float x=5.67;double y=2.345;bool decision=true;
números enteroscaracteresnúmeros reales (baja precisión)números reales (alta precisión)valor lógico
Nota, es muy distinto 2, ‘2’, “2” y 2.0 (porque?)
int n;n=2;
Ejemplo de definición y asignación
int n;n=‘2’;
Ejemplo de error
Operadores sobre int y float
10www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Los operadores básicos son:+ suma - resta* multiplicación/ división% modulo++ incrementa en 1
Los operadores pueden ser empleados para asignar valores y/o para entregar valores:
float a, b, x, y;
a=1.2;b=0.2;x=5.1;
y=a*x+b/x;Console::WriteLine(2*(x/a)+b);
Nota: En el calculo primero se aplican * y /, luego + y -. Las operaciones se hacen de izquierda a derecha.
Operadores sobre char , conversión y char de string
11www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
char letra; letra = 'a' + 1; Console::WriteLine(letra);
El carácter se asocia al código ASCII:
Entrega como resultado ‘b’
int numero; numero = 'a'; Console::WriteLine(numero);
Entrega como resultado 97
Conversión de tipos (typecast)
double x=2.6;int n=(int)x;
Asocia a n el valor 2 (cuidado, trunca, no redondea)
Cada string es una colección o arreglo de char’s, por ello
String^ nombre (“test”);char primera_letra=nombre[0];char segunda_letra=nombre[1];
Asigna la ‘t’ a primera_letraAsigna la ‘e’ a segunda_letra
Funciones matemáticas
12www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Si se agrega al inicio la referencia a las funciones matemáticas:
#include <math.h>
se pueden usar las funciones matemáticas que incluye el C++, calculando y asignandovalores como por ejemplo
y=cos(x)
Las funciones que incluye el C++ son: absacosasinatanatan2ceilcoscoshexp
fabsfloorfmod frexp ldexplog log10
modf powsinsinhsqrt tan tanh
Generadores random
13www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
En la librería:
#include <stdlib.h>
Esta definida el generador de números al azar
rand ();
Genera números enteros entre 0 y RAND_MAX
int x = rand (); double y = (double)x/RAND_MAX;
Para generar un numero real entre 0 y 1:
Cuidado, el seed (semilla, valor inicial de la secuencia) es siempre el mismo, o sea la secuencia es siempre la misma. Si se desea cambiar esto se debe variar el seed.
Funciones propias
14www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Los programas permiten la definición de funciones o subrutinas propias.
Un ejemplo podría ser una función “writeMessage” que se “encargue” de enviar un mensaje a la pantalla.
Se definen “en paralelo” al programa principal que lo llama:#include <iostream.h>
void writeMessage (String^ txt){ Console::WriteLine(“Mensaje: ”+txt); Console::ReadLine();}
void main () { writeMessage("Hola.“); }
Existen también librerías que traen funciones que pueden ser llamadas, Geant4 es unamuy completa para cálculos de dinámica de partículas.
Funciones propias
15www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Las subrutinas pueden:
- Tener múltiples argumentos (Nota: cada argumento tiene que llevar su tipo, ejemplo: int n, int m, float x … es ilegal tratar de resumir: int n, m, float x
- Pueden devolver un valor, el que se especifica en la definición de la subrutina y en el valor que entrega:
double poly(double x){ double u=1+2*x+3*pow(x,2); return u;}
void main () { Console::WriteLine(“P(2.5)=”+poly(2.5)); Console::ReadLine();}
Condicionamientos
16www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
En el desarrollo del programa se pueden condicionar la ejecución de unaserie de instrucciones:
if (condicion1) { instrucciones1} else if(condicion2){ instrucciones2} else{ instrucciones3}
Las condiciones se definen como
x==yx!=yx >yx >=yx <yx <=y
x es idéntico de yx es diferente a yx mayor que yx mayor o igual que yx menor que yx menor o igual que y
Si se da la condicion1…… realiza instrucciones1… si no se dio condicion1 pero si condicion2… realiza instrucciones2… y si no se dio ni condicion1 ni condicion2… realiza instrucciones3
Nota: pueden existir el numero que se quiera de else if (incluido ninguno) y existir o no el else final. Las instrucciones pueden también contener condiciones if
Abortar y recurrencia
17www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Si se desea abortar una subrutina basta con incluir el comando:
return;
Y el sistema volverá al punto donde se llamo la subrutina (en el main o en la subrutina que sea).
C y C++ tienen además la posibilidad de realizar llamadas recurrentes, o sea la subrutina se llama a si misma:
void ConteoRegresivo(int cnt){ if(cnt==0) {return;} else{ Console::WriteLine(cnt); Console::ReadLine(); ConteoRegresivo(cnt-1); }}
Variables lógicas
18www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Alternativas
bool flag;flag = true;flag = false;
true=verdaderofalse=falso
Determinar variable lógica, ejemplos:
flag=(x!=0);flag=(n>0);
Si x es distinto de cero, flag es verdadero, si no falso.Si n es mayor que cero, flag es verdadero, si no falso.
Operadores lógicos:
&&||!
AndIrNota
flag12=flag1 && flag2flag12=flag1 || flag2flag2=!flag1
Loops - while
19www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
El loop while(){}
El loop (circulo cerrado) mas simple es el while simple:
while(condición){ instrucciones}
Que se repite mientras que la condición se cumpla. Por ello las instrucciones deben contener algún cambio que lleve finalmente a que la condición no se cumpla y pueda salir del loop (error en la ejecución, el compilador no descubre estos problemas).
n=10while(n>0){ n=n-1;}
Loops - for
20www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
El loop for(){}
Otro loop (circulo cerrado) es el for:
for(int i=inicio;limite;i++ o i--){ instrucciones}
Ejemplo:
for (int i = 0; i < 4; i++) { }
Operaciones sobre strings
21www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Largo de un string
String^ txt (“text”);int len=txt.length(); Asigna a león el valor 4
Posición de char en string
String^ txt (“text”);int idx=txt.find(‘x’); Asigna a idx el valor 3
String^ txt (“text”);int idx=txt.find(‘ex’); Asigna a idx el valor 2
Concatenar strings
String^ txt1 (“te”);String^ txt2 (“xt”);String^ txt (“”);txt=txt1+txt2;
Estructuras
22www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Estructuras
struct nombre { double fvariable1, fvariable2; int nvariable1; …};
struct Point { double x, y; };
Ejemplo
Elementos de la estructura:
nombre.fvariable1
Asignación de valores a estructura (solo al crear!):
nombre ejemplo = {1.0, 2.3, 2, …}
Asignación de estructura:
nombre ejemplo2 = ejemplo1;
(también se pueden hacer asignaciones de estructuras)
Estructuras
23www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Las estructuras se pueden usar igual que los otros tipos de variables. En particular se pueden pasar como argumentos:
void subrutina(nombre p, …)
Lo que significa que una copia (no la misma estructura) es creada en la subrutina.
Si se desea hacer referencia a la estructura original se debe pasar la dirección a la memoria:
void subrutina(nombre& p, …)
Las estructuras pueden ser retronadas por las subrutinas
nombre subrutina(…){ nombre p; … return p;}
Si se quiere evitar que modificaciones en la subrutina repercutan en la rutina que hace la llamada se puede “bloquear” la modificación agregando const:
void subrutina(const nombre& p, …)
Estructuras
24www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Funciones a ser llamadas en estructuras
void Tiempo::imprimir () { Tiempo hoy = *this; instrucciones }
en que se llama vía el puntero this la estructura. En todo caso se pueden citar en la función directamente las variables como serian hora, minutos y segundos.
struct Tiempo { int hora, minutos; double segundos;
void Tiempo::imprimir (); };
La función en si seria
Punteros y Referencias
25www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Punteros
int* x o int *x
Referencia
int& x o int &x
*px = &x;
&rx = x;
x = 1;lvalue = rvalue;
add*px&rx
x valadd
El puntero *px contiene la direcciónde donde esta el valor x
La referencia &rx retorna el valor x
Alocución de memoria dinámica y arreglos
26www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
int *pint;pint = new int; delate pint;
Definir punteroReservar memoriaLiberar memoria
int n = 10; int *parray;
parray = new int[n]; delte parray;
Puntero y referencia en subrutinas
27www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
tipo *funcion(tipo *p) { ... ... return p; }
tipo &funcion(tipo &r) { ... ... return r; }
Estructuras generales y Archivos “Headers”
28www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Una estructura general tiene la forma:struct nombre { // instance variables variables (ej. double x, y; int n;)
// constructors funciones que asignan valores (ej set(int n, double x, double y); set(int n); )
// modifiers funciones de modificación (ej. void change (double x, double y); )
// functions funciones “de trabajo” (ej. void print (int n) const; )};
#include “nombre.h”
La definición se graba en un archivo .h que se cita en el programa main como:
Las funciones se escriben en el archivo
nombre.cpp
Clases
29www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09
Las class son estructuras en que las variables son de uso exclusivamenteInternas y no pueden ser modificadas externamente (privadas)
Ejemplo
class Complex { private: double real, imag; double mag, theta; bool cartesian, polar;
void calculateCartesian (); void calculatePolar ();
public: Complex () { cartesian = false; polar = false; }
Complex (double r, double i) { real = r; imag = i; cartesian = true; polar = false; }
void printCartesian (); void printPolar ();
double getReal (); double getImag (); double getMag (); double getTheta ();
void setCartesian (double r, double i); void setPolar (double m, double t); };