Vous êtes sur la page 1sur 47

MASTER EN MATERIALES AVANZADOS

SIMULACIN Y MTODOS NUMRICOS EN MATERIALES Y


NANOESTRUCTURAS

CURSO 2011-2012

1. Fundamentos de programacin. Conceptos bsicos de programacin
en C++:
Descarga compilador c++: http://www.bloodshed.net/devcpp.html

http://www.bloodshed.net/dev/

Direcciones electrnicas de inters:
http://www.cplusplus.com/

Libros de programacin
-Programacin en C++. Serie Schaum
Luis Joyanes Aguilar (Cdigos fuente en www.mh.es/joyanes)

Libros de consulta de la asignatura
- Anlisis Numrico. R.L. BURDEN, J. DOUGLAS FAIRES. Editorial
International Thomson Editores.
Clculo Numrico. B. CARNAHAN, H.A. LUTHER y J.O. WILKES. Editorial
Rueda.
-Elementary Numerical Analysis. KENDALL ATKINSON. John Wiley and Sons.


Fundamentos de programacin. Conceptos bsicos de
programacin en C++: sintaxis bsica y estructuras
INTRODUCCIN: Los idiomas ms utilizados en la computacin
cientfica (especialmente en la fsica) son FORTRAN y C / C + +.
Tradicionalmente FORTRAN fue el idioma de eleccin, y todava
hoy hay una gran cantidad de programas disponibles en las
bibliotecas FORTRAN.

Sin embargo, durante la ltima dcada, C / C + + se ha hecho cada
vez ms importante en la fsica, por lo que este curso se centra en
C + + y se aleja del FORTRAN.

Seguimos convencidos de que el lenguaje FORTRAN es mejor para
la fsica, pero para obtener un compilador FORTRAN 90/95, uno
tiene que comprar un paquete comercial, mientras que el
compilador C + + est disponible sin costo alguno tanto para Linux
como para Windows.
Algoritmos y programas

Los programas son conjuntos de instrucciones escritas en un
lenguaje de programacin (cdigo fuente) que ser interpretado
por un ordenador y traducido a lenguaje mquina (cdigo objeto)
para poder ser ejecutado (programa ejecutable).

El lenguaje de programacin permite especificar a la
computadora las acciones que debe ejecutar, escritas en un
lenguaje relativamente prximo al lenguaje humano.

El algoritmo es un procedimiento que se puede implementar en
un ordenador. Consiste en una secuencia ordenada de pasos
que conduce a la resolucin de un problema determinado en un
nmero finito de pasos.
Estructura de un programa en C++


lnea de comentario
el signo #es una instruccin
para el compilador: incorpora
una librera de entrada-salida
namespace: lugar donde se
ubicarn las sentencias.
punto de comienzo de la ejecucin
seguido de ( ) ya que es una funcin
cuerpo de la funcin encerrado
entre llaves ( {})
// mi primer programa en C++
#include <iostream>
using namespace std;
int main ()
{
cout << "Hola!";
return 0;
}


cout representa la salida standard
en C++
la sentencia return hace que la
funcin main acabe (cdigo 0).


El programa anterior ha sido estructurado en diferentes lneas con
objeto de ser mas comprensible, pero en C++ no existen reglas
estrictas sobre como separar instrucciones en diferentes lneas. Por
ejemplo, en lugar de:
int main ()
{
cout << " Hola!";
return 0;
}
podramos haber escrito:
int main () {cout << "Hola!"; return 0; }
Todo en una sola lnea y tendra el mismo significado que el cdigo
previo.
INTRODUCCIN AL C++
1.- Variables. Tipos de datos
2.- Operadores
3.- Operaciones bsicas de Entrada/Salida: operadores cout y cin
4.- Operadores de control:
a) estructura condicional: if; if else
b) bucles: while; do while; for;
5.- Arrays
6.- Funciones. Parmetros de una funcin. Argumentos pasados como
referencia. Recursividad.
7.- Punteros. Reserva dinmica de memoria.
1.- Variables

Un identificador vlido es una secuencia de una o mas letras, dgitos o
guion bajo (_).

Ejemplos:

a=5;
lambda=0.300;

OJO CON PALABRAS RESERVADAS!!!

Muy importante: El C++ es un lenguaje que distingue entre
minsculas y maysculas.

Tipos de datos
Resumen de los fundamentales tipos bsicos en C++
Nombre Descripcin Tamao Rango
char Tipo carcter 1 byte
int Enteros (con signo o sin signo) 4 bytes

-2147483648 a
2147483647
float Nmeros reales en coma flotante 4 bytes

+/- 3.4 e
+/- 38
double Nmeros reales en doble precisin
en coma flotante

8 bytes

+/- 1.7 e
+/- 308

// Ejemplo:
#include <iostream>
using namespace std;
int main ()
{
// declaramos variables:
int a, b;
int result;
a = 5;
b = 2;
a = a + 1;
result = a - b;
// mostramos el resultado por pantalla:
cout << result;
// terminamos el programa:
return 0;
}

Todas las variables que queramos usar en el programa deben haber
sido declaradas con su tipo al principio del programa
Una variable puede ser global o local. Una variable global es aquella que se
declara en el cuerpo principal del programa fuente, fuera de las funciones,
mientras que una variable local es la que se declara en el cuerpo de una
funcin o en un bloque.
//Ejemplo:
#include <iostream>
using namespace std;




int main ()
{
Int edad;
Float A;
Cout << Teclea tu edad:
Cin>> edad;
.
}
int Numero_entero;
char nombre;
char apellido [20];
Variables globales
Variables locales
Constantes definidas por el usuario: #define
Se puede usar un nombre elegido por nosotros para referirnos a una constante
que se vaya a usar frecuentemente, simplemente usando la instruccin #define

// defined constants: calculate circumference
#include <iostream>
using namespace std;
#define PI 3.14159
#define NEWLINE '\n'
int main ()
{
double r=5.0; // radius
double circle;
circle = 2 * PI * r;
cout << circle;
cout << NEWLINE;
return 0;
}

RESULTADO: 31.4159

Constantes declaradas (const)

Con el prefijo const podemos declarar constantes con un tipo
Especfico, de la misma forma que hacemos con una variable:


const int ancho = 100;
const char tabulador = '\t';


Aqu, ancho y tabulador son dos constantes. Son tratadas como variables
normales, salvo que sus valores no pueden ser modificados despus de su
definicin.





Modulo es la operacin que da el resto de
una divisin de dos valores. Por ejemplo,
si escribimos:

a = 11 % 3;

la variable a contendr el valor 2, puesto
que 2 es el resto de dividir 11 entre 3.

2.1 Operadores aritmticos
Las cinco operaciones aritmticas implementadas en C++ son:
+ Suma ( addition )
- Resta ( subtraction )
* Multiplicacin ( multiplication )
/ Divisin ( division )
% Mdulo ( module )
2.- Operadores

cout << "a:";
cout << a;
cout << " b:";
cout << b;
return 0;
}
// assignment operator
#include <iostream>
using namespace std;
int main ()
{
int a, b; // a:?, b:?
a = 10; // a:10, b:?
b = 4; // a:10, b:4
a = b; // a:4, b:4
b = 7; // a:4, b:7
Resultados:

a:4; b:7
2.2 Operador asignacin (=)

2.3 Operadores de asignacin

expresin es equivalente a
a += b; a = a + b;
a -= 5; a = a - 5;
a /= b; a = a / b;
a *= b; a = a * b;
Los operadores incremento (++) y decremento (--) incrementan o
reducen en uno el valor almacenado en una variable. Son equivalentes
a +=1 y a -=1, respectivemente.
Ojo:
x=y++;
el resultado es:
x=y; y=y+1;

en cambio, si:
x=++y;
el resultado es:
y=y+1; x=y;
Operador Incremento y decremento (++, --)

Por tanto:
a++;
a+=1;
a=a+1;
son todas ellas formas equivalentes: las tres incrementan en
una unidad el valor de a.
3- Operadores de Entrada/Salida

cout: operador de salida por pantalla:
cout<<"Output sentence"; //prints Output sentence on screen
cout<<120; //prints number 120 on screen
cout<<x; //prints the contents of x on screen

Con objeto de introducir una nueva lnea, debemos insertar explcitamente un
carcter especfico:

cout << Primera sentencia.\n;

cout << Segunda sentencia.\n;

Una forma alternativa consiste en usar el manipulador endl:

cout << Primera sentencia.<<endl;

cout << Segunda sentencia.<<endl;

cin: operador de entrada por teclado (cin>> <valor>;).

El dispositivo standard de entrada es el teclado. Para ello
aplicaremos el operador extraccin (>>) seguido de la variable que
almacena el dato que quiere ser extrado.

Por ejemplo:

int main()
{
int i;
cout<<introduce un valor entero: ;
cin >>i;
return 0;
}

4.1 Estructura condicional: if

La estructura if se usa para ejecutar una sentencia o un bloque de sentencias
solamente si se cumple una determinada condicin. Por ejemplo:

if (x == 100)
cout << "x is 100";

sacar por pantalla x is 100 solamente si el valor almacenado en la
variable x es 100.
Si quisiramos que se ejecutase mas de una sentencia en el caso de que se
cumpla la condicin, podemos especificar un bloque mediante el usos de
llaves {}:

if (x == 100)
{
cout << "x is ";
cout << x;
}
4. Operadores de Control
4.2 Estructura condicional: if else

Podemos especificar adicionalmente lo que queremos que ocurra si no se
cumple la condicin usando la instruccin if..else. Por ejemplo:


if (x > 0)
cout << "x is positive";
else if (x < 0)
cout << "x is negative";
else
cout << "x is 0";

while (n>0) {
cout << n << ", ";
- - n;
}
cout << Terminado!\n";
return 0;
}
a) Instruccin while
4.3 Estructuras iterativas (bucles o loops )
#include <iostream>
using namespace std;
int main ()
{
int n;
cout << Introduce el valor de partida > ";
cin >> n;

RESULTADO:

Introduce el valor de partida > 8
8, 7, 6, 5, 4, 3, 2, 1, Terminado!

b) Instruccin do-while
do {
cout << "Enter your number: ";
cin >> n;
cout << "You entered: " << n << "\n";
}while (n != 0);
#include <iostream>
using namespace std;
int main ()
{
int n;
cout<<By by<<endl;
return 0;
}
Enter number: 12345
You entered: 12345
Enter number: 160277
You entered: 160277
Enter number: 0
You entered: 0
By by

Resultado:

10, 9, 8, 7, 6, 5, 4, 3, 2, 1, Terminado!

c) Instruccin for
#include <iostream>
using namespace std;
int main ()
{
for (int n=10; n>0; n--) {
cout << n << ", ";
}
cout << Terminado!\n";
return 0;
}





Un array es una serie de elementos del mismo tipo situados en
posiciones de memoria consecutivas.
0 1 3 2 4
a
Y para asignar valores al array, haremos, por ejemplo:
int a[5]= {1,2,3,4,5}
o bien
int a[ ]= {1,2,3,4,5}
5.- ARRAYS
Por ejemplo, un array que contiene 5 valores enteros de tipo int
llamado a se representara de la siguiente forma:

Para declarar un array como el de ms arriba, haremos:

int a[5];
// ejemplo de arrays
#include <iostream>
using namespace std;
int a[ ]={1,2,3,4,5}
int n, result=0;
int main ()
{
for (n=0; n<5; n++)
{
result +=a[n];
}
cout<<result;
return 0;
}
Resultado:
15


Sealemos que los ndices de un array comienzan en cero.

#include <iostream>
using namespace std;
#define Filas 3
#define Columnas 5
int A [Filas] [Columnas];
int n,m;
0 1 3 2 4
0
1
2
1
2
3
2 3 4 5
4 6 8 10
6 9 12 15
Resultado
Arrays multidimensionales:

Ejemplo:int A[3] [5];
int main()
{
for (n=0; n<Filas; n++)
for (m=0; m<Columnas; m++)
{
A [n] [m] = (n+1)*(m+1);
cout<<"A("<<n<<","<<m<<")="<<A [n] [m] <<endl;
}
system ("pause");
return 0;
}
// ejemplo n 1 de funciones:
#include <iostream>
using namespace std;
int suma (int a, int b){
int r; r = a+b; return (r); }
int main ( ) {
int z; z=suma(5,3); cout<<Resultado: <<z;
return 0;}
Funciones
Una funcin es un grupo de sentencias que se ejecutan cuando son llamadas
desde algn punto del programa. Su formato es el siguiente:
tipo nombre (lista de parmetros)
La llamada a una funcin se realiza desde el programa principal invocando
su nombre seguido de los argumentos separados por comas y encerrados
entre parntesis.
Las funciones se deben declarar antes de invocarlas
// ejemplo n 2 de funciones:
#include <iostream>
using namespace std;
int resta (int a, int b){
int r; r = a-b; return (r); }
int main ( ) {
int x=5, y=3, z;
z = resta (7,2);
cout << primer resultado: " << z << endl;
cout << "segundo resultado: " << resta (7,2) << endl;
cout << tercer resultado: " << resta (x,y) << endl;
z= 4 + resta (x,y);
cout << cuarto resultado: " << z << endl;
return 0;}
En el siguiente ejemplo vemos que se pueden hacer llamadas a la
funcin de distintas formas
Resultados: 5, 5, 2, 6
Funciones sin tipo: el uso de la instruccin void

En ciertas ocasiones no es necesario que la funcin devuelva un valor
al programa principal. En este caso especial usaremos el especificador
void para indicar la ausencia de tipo de la funcin:

// ejemplo n 3 de funciones:
#include <iostream>
using namespace std;
void funcionerror()
{
cout<<"He terminado el contador"<<endl;
}
int main ( )
{
int i,n=10;
for (i=0; i<n; i++)
{if (i==n-1)
funcionerror();
}
system("pause");
return 0;
}





Arrays como parmetros de una funcin
En ciertas ocasiones, podemos necesitar pasar un array a una
funcin como parmetro. Para ello, cuando se declare la funcin,
especificaremos en sus argumentos un identificador y un par de
corchetes vacos [ ]. Por ejemplo:

// ejemplo n 4 de funciones: arrays como parmetros
#include <iostream>
using namespace std;
void print_vector (int x [ ], int dim)
{
for (int n=0; n<dim; n++)
{cout<<x[n]<<" ";}
}
int main ( ) {
int x[ ]= {5, 10, 15};
int y[ ]= {2,4,6,8,10};
print_vector (x, 3);
cout<<endl;
print_vector (y, 5);
cout<<endl;
system("pause");
return 0; }
Argumentos de una funcin pasados por referencia

En la llamada a una funcin normalmente se pasan copias de los valores de las
variables del programa principal y stos quedan inalterados despus de la
llamada a la funcin. Sin embargo, a veces es necesario que dichos valores
cambien, como en el ejemplo siguiente, donde se pasan los valores por
referencia.
//function swap
#include <iostream>
using namespace std;
int swap(int *a, int *b){
cout<<endl<<"estoy en la funcion"<<endl;
cout<<"dir a= "<<a<<", "<<"dir b= "<<b<<endl;
cout<<"*a= "<<*a<<", "<<"*b= "<<*b<<endl;
cout<<"hago el swap!"<<endl;
int temp; temp=*a;*a=*b;*b=temp;
cout<<"*a= "<<*a<<", "<<"*b= "<<*b<<endl;
cout<<"me voy de la funcion"<<endl<<endl;
}
int main ( ){

int a=5,b=3;
cout<<"a= "<<a<<", "<<"b= "<<b<<endl;
swap(&a,&b);
cout<<"a= "<<a<<", "<<"b= "<<b<<endl;
cout<<"& a= "<<&a<<", "<<"& b= "<<&b<<endl;
cout << "Programa terminado" << endl;
system ("PAUSE") ;
return 0;}
a= 5, b= 3

estoy en la funcion
dir a= 0x22ff74, dir b= 0x22ff70
*a= 5, *b= 3
hago el swap!
*a= 3, *b= 5
me voy de la funcion

a= 3, b= 5
& a= 0x22ff74, & b= 0x22ff70
Programa terminado
Presione una tecla para continuar . . .
Es decir:

&= operador direccin, permite hallar la direccin de la variable
a la que se aplica.

*= operador indireccin, permite acceder al valor almacenado
en la zona de memoria donde resida la variable a la que se
aplica el operador.
5 7
a
b
0x22ff74 0x22ff70
direcciones
valores
nombre de las variables
Recursividad: una funcin se puede llamar a s misma. Por ejemplo,
puede ser til en el caso del clculo del factorial de un nmero:
Please type a number: 9
9! = 362880
Presione una tecla para continuar
. . .
//ejemplo n 6 de funciones: recursividad
#include <iostream>
using namespace std;
// factorial calculator
#include <iostream>
using namespace std;
long factorial (long a){
if (a > 1) return (a * factorial (a-1));
else return (1); }
int main () {
long number;
cout << "Please type a number: ";
cin >> number;
cout << number << "! = " << factorial
(number)<<endl;
system ("PAUSE");
return 0; }
Declaracin de funciones.
Hasta ahora, hemos definido todas las funciones antes de que se realice la
primera llamada desde el programa principal. Si no fuese as, dara error al
compilar.
Sin embargo, hay una alternativa para escribir el cdigo fuente de las
funciones despus del programa principal. Se puede hacer mediante la
declaracin de un prototipo de funcin antes de ser usada, en lugar de la
funcin completa. Esta declaracin es mas corta que la definicin completa,
pero suficiente como para que el compilador conozca su tipo y el tipo de sus
argumentos.
//ejemplo n 7 de funciones: declaracin de funciones
#include <iostream>
using namespace std;
void odd (int a);
void even (int a);
int main (){
int i;
do {cout << "Tecle un numero (0 para salir): ";
cin >> i;
odd (i);}while (i!=0);
system ("PAUSE");
return 0;}
void odd (int a)
{
if ((a%2)!=0) cout << "Numero impar"<<endl;
else even (a);
}
void even (int a)
{
if ((a%2)==0) cout << "Numbero par"<<endl;
else odd (a);
}
El tipo void es un tipo especial que indica la ausencia de
tipo. Se usa para indicar el tipo del valor de retorno en
funciones que no devuelven ningn valor, y tambin para
indicar la ausencia de parmetros en funciones que no los
requieren.
Punteros


Ya vimos que podemos acceder a la direccin de memoria que ocupa una
variable mediante el operador ampersand (&). Por ejemplo,

int a= 5, &a= 0x22ff74

Podemos adems usar una variable para que almacene la direccin de
memoria donde se encuentra el dato al cual hace referencia. Dicha variable
se llama puntero. Se puede declarar, por ejemplo, de la siguiente forma:

int * mipuntero; // variable tipo puntero

con la propiedad de que puede modificar el contenido de la variable hacia la
que apunta. Por ejemplo:

mipuntero=&a; *mipuntero=10; =>a=10

En este ltimo caso hemos hecho uso del operador indirecin (*)

//puntero 1
#include <iostream>
using namespace std;
int main ( )
{
int primervalor=5, segundovalor=7;
int * mipuntero; // variable tipo puntero
mipuntero=&primervalor; //el puntero apunta a la variable primervalor
*mipuntero=10;
cout<<"primervalor es " << primervalor<<endl;
mipuntero=&segundovalor;//el puntero apunta a la variable
segundovalor
*mipuntero=20;
cout<<"segundovalor es " << segundovalor<<endl;
cout << endl<< "Programa terminado" << endl;
system ("PAUSE") ;
return 0;
}
Ejemplo 1:
//punteros2
#include <iostream>
using namespace std;
int main (){
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
p1 = &firstvalue; // p1 = address of firstvalue
p2 = &secondvalue; // p2 = address of secondvalue
*p1 = 10; // value pointed by p1 = 10
*p2 = *p1; // value pointed by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer is copied)
*p1 = 20; // value pointed by p1 = 20
cout << "firstvalue is " << firstvalue << endl;
cout << "secondvalue is " << secondvalue << endl;
cout << endl<< "Programa terminado" << endl; system ("PAUSE") ;
return 0;}
//firstvalue is 10
//secondvalue is 20
//Programa terminado
//Presione una tecla para continuar . . .
Ejemplo 2:
Punteros y arrays

El concepto de array est muy vinculado al de puntero.
De hecho, el identificador de un array es equivalente a la
direccin de su primer elemento, es decir, es un puntero
constante.

Supongamos las dos declaraciones siguientes:

int A [20];
int *p;

Si ahora hacemos la asignacin:

p= A;

A partir de ese momento p y A son equivalentes.

//punteros3: punteros y arrays
#include <iostream>
using namespace std;
int main ( ){
int A[5];
int * p; // variable tipo puntero
for (int n=0;n<5;n++) {
p=&A[n]; // el puntero apunta a la variable A (array)
*p=(n+1)*10;
cout<<A[n] << ", ";}
cout << endl<< "Programa terminado" << endl;
system ("PAUSE") ;
return 0;}

// 10, 20, 30, 40, 50,
//Programa terminado
//Presione una tecla para continuar . . .
Ejemplo 3:
Punteros a funciones
Se usa para pasar una funcin como argumento a otra funcin.
Veamos el siguiente ejemplo:
// pointer to functions
#include <iostream>
using namespace std;
int addition (int a, int b)
{return (a+b); }
int subtraction (int a, int b)
{return (a-b); }
int operation (int x, int y, int
(*functocall)(int,int)){int g; g = (*functocall)(x,y); return (g);}
int main (){
int m,n;
int (*minus)(int,int) = subtraction;
m = operation (7, 5, addition);
cout <<m<<endl;
n = operation (20, m, minus);
cout <<n<<endl;
cout << endl<< "Programa terminado" << endl;
system ("PAUSE") ; return 0;}
Memoria Dinmica
Hasta ahora, slo hemos tenido la memoria disponible de acuerdo con la
declaracin de nuestras variables, antes de la ejecucin del programa.
Pero, y si necesitamos una cantidad variable de memoria que slo se
puede determinar en tiempo de ejecucin? La respuesta es la memoria
dinmica.

Ejemplo:
int * vector;
vector = new int [5];

Operadores delete y delete[ ]
Puesto que la necesidad de memoria dinmica suele limitarse a
momentos especficos dentro de un programa, una vez que ya no es
necesario debe ser liberada de manera que la memoria vuelve a estar
disponible para otras solicitudes de memoria dinmica. Este es el
propsito de la eliminacin del operador, cuyo formato es:
delete pointer;
delete [ ] pointer;
La primera expresin debe ser utilizada para eliminar la memoria
asignada por un elemento sencillo, mientras que la segunda para la
memoria asignada para matrices de elementos.

// reserva de memoria dinmica
#include <iostream>
#include <new>
using namespace std;
int main (){
int i,n; int * p;
cout << "How many numbers would you like to type? ";
cin >> i;
p= new (nothrow) int[i];
if (p == 0)
cout << "Error: memory could not be allocated";
else
{
for (n=0; n<i; n++)
{cout << "Enter number: "; cin >> p[n]; }
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << p[n] << ", ";
delete[ ] p;
}
return 0;
}

Vous aimerez peut-être aussi