29
Objetiv os: Dominar C++ al nivel necesario para poder armar programas que simulen en base a Geant4. 1 5. Técnicas de Simulación 2. Programando C++ www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09 Dr. Willy H. Gerber Instituto de Fisica Universidad Austral Valdivia, Chile

5. Técnicas de Simulación 2. Programando C++

  • Upload
    serena

  • View
    68

  • Download
    1

Embed Size (px)

DESCRIPTION

5. Técnicas de Simulación 2. Programando C++. Dr. Willy H. Gerber Instituto de Fisica Universidad Austral Valdivia, Chile. Dominar C++ al nivel necesario para poder armar programas que simulen en base a Geant4. Objetivos:. - PowerPoint PPT Presentation

Citation preview

Page 1: 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

Page 2: 5. Técnicas de Simulación 2. Programando C++

Programa para armar programas

2www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09

Trabajaremos con Visual Studio 2008

Page 3: 5. Técnicas de Simulación 2. Programando C++

Programa para armar programas

3www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09

Creemos un proyecto…

Page 4: 5. Técnicas de Simulación 2. Programando C++

Programa para armar programas

4www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09

… en C++ :

Page 5: 5. Técnicas de Simulación 2. Programando C++

Programa para armar programas

5www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09

Estructura creada:

Page 6: 5. Técnicas de Simulación 2. Programando C++

Programa para armar programas

6www.gphysics.net – UFRO-Master-Fisica-Medica-5-2-Programando C++-05.09

Ejecutar:

Page 7: 5. Técnicas de Simulación 2. Programando C++

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)

Page 8: 5. Técnicas de Simulación 2. Programando C++

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; }

Page 9: 5. Técnicas de Simulación 2. Programando C++

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

Page 10: 5. Técnicas de Simulación 2. Programando C++

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.

Page 11: 5. Técnicas de Simulación 2. Programando C++

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

Page 12: 5. Técnicas de Simulación 2. Programando C++

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

Page 13: 5. Técnicas de Simulación 2. Programando C++

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.

Page 14: 5. Técnicas de Simulación 2. Programando C++

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.

Page 15: 5. Técnicas de Simulación 2. Programando C++

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();}

Page 16: 5. Técnicas de Simulación 2. Programando C++

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

Page 17: 5. Técnicas de Simulación 2. Programando C++

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); }}

Page 18: 5. Técnicas de Simulación 2. Programando C++

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

Page 19: 5. Técnicas de Simulación 2. Programando C++

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;}

Page 20: 5. Técnicas de Simulación 2. Programando C++

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++) { }

Page 21: 5. Técnicas de Simulación 2. Programando C++

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;

Page 22: 5. Técnicas de Simulación 2. Programando C++

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)

Page 23: 5. Técnicas de Simulación 2. Programando C++

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, …)

Page 24: 5. Técnicas de Simulación 2. Programando C++

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

Page 25: 5. Técnicas de Simulación 2. Programando C++

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

Page 26: 5. Técnicas de Simulación 2. Programando C++

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;

Page 27: 5. Técnicas de Simulación 2. Programando C++

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; }

Page 28: 5. Técnicas de Simulación 2. Programando C++

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

Page 29: 5. Técnicas de Simulación 2. Programando C++

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); };