SlideShare una empresa de Scribd logo
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Programaci´on en C++ para Ciencia e
Ingenier´ıa
Mario Storti, Lisandro Dalc´ın, Rodrigo Paz
http://www.cimec.org.ar/prog
Facultad de Ingenier´ıa y Ciencias H´ıdricas
Universidad Nacional del Litoral http://www.unl.edu.ar
Centro de Investigaci´on de M´etodos Computacionales - CIMEC
INTEC, (CONICET-UNL), http://www.cimec.org.ar
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 1
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Autores
• Mario Storti <mario.storti@gmail.>
• Lisandro Dalc´ın, <dalcinl@gmail.com>
• Rodrigo Paz, <rodrigo.r.paz@gmail.com>
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 2
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Contents
• slide 11.....Elementos b´asicos de programaci´on
slide 13.....Compilaci´on vs. int´erpretes
slide 14.....El proceso de compilaci´on
slide 16.....El preprocesador CPP
slide 19.....Chequeo de tipos
slide 20.....Compilaci´on por separado
slide 22.....Declaraciones y definiciones
slide 24.....Definiciones y declaraciones de variables
slide 26.....Incluyendo headers
slide 29.....Usando librer´ıas
slide 30.....Formato de include para C++
slide 31.....Un primer programa en C++
slide 32.....Namespaces
slide 35.....Estructura de un programa
slide 37.....Hello world
slide 38.....Concatenaci´on de arreglos de caracters
slide 39.....Entrada de datos
slide 40.....Llamando a otros programas
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 3
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 41.....Strings de C
slide 42.....Strings de C++
slide 44.....Escribir y leer de archivos
slide 46.....La clase vector
slide 49.....Ejercicios
• slide 50.....El C en C++
slide 51.....Funciones
slide 52.....Valores de retorno
slide 54.....Usando la librer´ıa est´andar de C
slide 55.....Control de ejecuci´on. True and False
slide 57.....If-else
slide 61.....while
slide 64.....do-while
slide 65.....Lazo for
slide 66.....Break and continue
slide 68.....La sentencia switch
slide 70.....goto
slide 72.....Recursion
slide 74.....Operadores
slide 75.....Operadores de auto incremento
slide 77.....Tipos de datos
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 4
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 80.....Especificadores
slide 84.....Punteros
slide 94.....Referencias
slide 96.....Punteros a void
slide 98.....Scope de las variables
slide 100.....Definiendo variables on-the-fly
slide 104.....Variables locales
slide 108.....Punteros a variables locales
slide 109.....Variables est´aticas
slide 111.....Constantes
slide 112.....Operadores. Asignaci´on
slide 113.....Operadores matem´aticos
slide 114.....Operadores relacionales
slide 115.....Operadores l´ogicos
slide 116.....El operador hook
slide 117.....Errores comunes con los operadores
slide 118.....Operadores de cast
slide 119.....Operador sizeof
slide 120.....typedef: Aliases de tipos
slide 121.....Estructuras
slide 125.....Arrow operator
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 5
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 126.....Enum’s
slide 129.....Arreglos de estructuras
slide 130.....Punteros y arreglos
slide 132.....Arreglos de punteros
slide 136.....Aritm´etica de punteros
slide 138.....Tama˜nos de estructuras
• slide 139.....Programaci´on Orientada a Objetos
slide 140.....Abstracci´on de datos
slide 150.....POO b´asica
slide 160.....Inclusion de headers
slide 164.....Estructuras enlazadas
slide 172.....M´as sobre scoping
slide 173.....Tipos Abstractos de Datos (ADT)
slide 174.....Ocultando la implementaci´on
slide 176.....Control de acceso a los miembros
slide 180.....Amistad (Friendship)
slide 183.....Anidamiento (nesting) y amistad
slide 184.....Object layout
slide 185.....Clases
slide 189.....Ocultando totalmente la implementaci´on
slide 191.....Inicializaci´on y cleanup
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 6
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 193.....El constructor
slide 194.....El destructor
slide 197.....Eliminaci´on del bloque de definici´on
slide 199.....Clase stash con ctor/dtor
slide 203.....Stack con ctor/dtor
slide 206.....Initializaci´on de agregados
slide 207.....Inicializaci´on de estructuras
slide 208.....Sobrecarga de funciones
slide 212.....Argumentos por default
slide 213.....Constantes
slide 216.....Punteros a arreglos constantes de caracteres
slide 217.....Const en argumentos de funciones
slide 218.....Const en clases
slide 219.....Objetos const y funciones de la clase
• slide 221.....Chapter 5
slide 222.....Funciones inline
slide 226.....Especificaciones de linkedicion
slide 228.....Referencias en C++
slide 234.....Reglas para las referencias
slide 236.....Paso por referencia y por copia
slide 237.....El constructor por copia
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 7
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 238.....Sobrecarga de operadores
slide 243.....Sobrecarga de operadores unarios
slide 251.....Sobrecarga de operadores binarios
• slide 273.....Chapter
slide 274.....Otros operadores que se pueden sobrecargar
slide 275.....Creaci´on din´amica de objetos
slide 276.....Uso de la memoria din´amica en C
slide 277.....Uso de la memoria din´amica en C++
slide 279.....Porqu´e usar new y no arreglos
slide 280.....Memory exhaust
slide 281.....Composici´on
slide 283.....Composici´on y la cadena de inicializaci´on
slide 284.....Herencia
slide 287.....Redefinici´on de m´etodos
slide 289.....Herencia protegida
slide 291.....Upcasting
slide 292.....Polimorfismo
slide 294.....Ejemplo polimorfismo. Integral 1D/2D/3D
slide 298.....Clase que calcula integral 1D
slide 300.....Integral 2D. Versi´on cruda
slide 315.....Integral 2D. Versi´on mejorada
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 8
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
slide 318.....Integral 3D
slide 321.....Integral 1D/2D/3D. User code
slide 323.....Polimorfismo: ej. suma de los elementos de un vector
slide ??.....Ejemplo clase vector sparse
• slide 326.....Contenedores de la librer´ıa STL
slide 328.....La librer´ıa STL
slide 328.....La clase vector
slide 333.....Algoritmos in-place
slide 335.....La clase list
slide 338.....La clase set
slide 342.....La clase map
slide 345.....Algoritmos
slide 347.....Programaci´on funcional
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 9
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Dictado
• Docentes de la c´atedra:
Mario Storti <mario.storti@gmail.>
Lisandro Dalc´ın, <dalcinl@gmail.com>
Rodrigo Paz, <rodrigo.r.paz@gmail.com>
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 10
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Elementos b´asicos de
programaci´on
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 11
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
I KNOW C++!
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 12
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Compilaci´on vs. int´erpretes
• Algunos lenguajes de programaci´on tienen un int´erprete, por ejemplo
Matlab/Octave, Python, Perl, Lisp/Scheme. En un int´erprete el usuario va
emitiendo comandos que son interpretados por el int´erprete y va
devolviendo un resultado.
• Por contraposici´on, los lenguajes compilados el usuario escribe un
archivo con l´ıneas de c´odigo, el cu´al es procesado por un compilador, que
genera c´odigo de m´aquina, el cual es ejecutado directamente por el
procesador.
• Ventajas de la compilaci´on: el c´odigo suele ser m´as r´apido, y m´as
compacto.
• Desventajas: el paso de c´odigo a ejecutarlo es inmediato, no hay pasos
intermedios. Usualmente los int´erpretes permiten escribir tareas que se
repiten com´unmente en archivos de texto (scripts). El usuario puede
adem´as mezclar estas funciones con comandos directamente en el
int´erprete. Tambi´en con los int´erprete es m´as f´acil debuggear.
• C++ es un lenguaje compilado.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 13
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El proceso de compilaci´on
• El caso m´as simple es cuando todo el c´odigo del programa est´a en un
s´olo archivo fuente:
1 $$ g++ -o prog prog.cpp
Genera un archivo ejecutable prog.
• Si el programa es muy grande conviene dividirlo en varias partes, en ese
caso
1 $$ g++ -o prog prog1.cpp prog2.cpp
• Esto requiere recompilar cada vez todos los *.cpp, si son muchos
conviene hacer
1 $$ g++ -o prog1.o -c prog1.cpp
2 $$ g++ -o prog2.o -c prog2.cpp
3 $$ g++ -o prog prog1.o prog2.o
Los archivos .o son objeto, contienen c´odigo de m´aquina. (No tiene
relaci´on con la Programaci´on Orientada a Objetos).
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 14
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El proceso de compilaci´on (cont.)
• Si solo se modifica uno de los archivos (prog1.cpp), entonces s´olo hace
falta recompilar ese.
1 $$ g++ -o prog1.o -c prog1.cpp
2 $$ g++ -o prog prog1.o prog2.o
• Para mejor organizaci´on, si hay muchos *.o conviene ponerlos en una
librer´ıa
1 $$ g++ -o prog1.o -c prog1.cpp
2 $$ g++ -o prog2.o -c prog2.cpp
3 $$ g++ -o prog3.o -c prog3.cpp
4 $$ ar r libprog.a prog1.o prog2.o prog3.o
5 $$ g++ -o prog main.cpp libprog.a
• A veces la librer´ıa puede ser que haya sido desarrollada por un tercero:
libpetsc.a, libmkl.a.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 15
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El preprocesador CPP
• Muchas veces hay texto que se repite muchas veces en el c´odigo. En ese
caso se pueden usar macros
1 int v[100000];
2 if (n<100000) {
3 . . . .
4 }
Se puede simplificar de la siguiente forma
1 #define MAX 100000
2 int v[MAX];
3 if (n<MAX) {
4 . . . .
5 }
Estos macros son manejados por el preprocesador, el cual se llama
normalmente cpp (por C preprocesor). Podemos pensar que el CPP
genera un paso intermedio en el cual toma el archivo prog.cpp y genera
un archivo intermedio tempo.cpp que es el que finalmente es compilado.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 16
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El preprocesador CPP (cont.)
• CPP s´olo realiza manipulaciones a nivel de texto, no conoce nada
espec´ıfico del lenguaje C/C++, incluso puede usarse (y se usa) para otros
lenguajes como Fortran.
• Las directivas m´as usuales son
1 // Incluye todo el texto del archivo library.h
2 #include <library.h>
3
4 #define CHECK(a,n) if (a>n) error()
• Para #include el preprocesador simplemente incluye todo el archivo
mencionado en el punto donde se invoca el include.
• #define define un macro, despu´es se puede llamar al macro en otros
lugares del c´odigo y es reemplazado por su expansi´on. Los macros
pueden tener argumentos. Por convenci´on se suele dar a los macros
nombres en may´usculas.
• Se puede conocer cual es el resultado del CPP llamando a g++ con la
opci´on -E
1 $$ g++ -o tempo.cpp -E prog.cpp
• El CPP es un programa separado que se puede llamar por s´ı mismo
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 17
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
(/usr/bin/cpp).
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 18
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Chequeo de tipos
• C++ es un lenguaje tipado (aka tipeo est´atico, en ingl´es typed language),
es decir las variables tienen tipos definidos. El compilador chequea que
los resultados de las expresiones que se asignan a las variables
correspondan al tipo con el cual fueron definidas, caso contrario se
produce un error en tiempo de compilaci´on. Esto es bueno porque
permite detectar tempranamente errores. (Es equivalente al chequeo de
unidades en F´ısica).
1 // error: asigna un string a una variable entera
2 int a;
3 a = "Hello";
• Otros lenguajes (sobre todos los interpretados) hacen chequeo din´amico
de tipo, esto implica una p´erdida de eficiencia.
• El chequeo se hace tambi´en para los argumentos de una funci´on
1 void fun(int a,string s);
2 . . .
3 fun(23,45); // ERROR (45 no es un string!)
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 19
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Compilaci´on por separado
• En C++ se favorece que un programa grande se pueda dividir en
fracciones m´as peque˜nas. El mecanismo fundamental para dividir un
programa en partes m´as peque˜nas es usar funciones que realizan tareas
bien definidas. Por ejemplo podemos pensar en una funci´on int
gcd(int,int); que toma dos enteros y retorna el m´aximo com´un divisor
de los mismos.
• Las funciones tienen argumentos, una vez que la funci´on termina su
tarea, retorna un valor. Tambi´en puede ser que las funciones tengan
efectos colaterales (side effects) es decir que modifiquen sus
argumentos u otros objetos.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 20
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Compilaci´on por separado (cont.)
• Para crear un programa que est´e dividido en varios archivos, el c´odigo de
un archivo debe poder usar las funciones del otro. Supongamos que un
archivo prog1.cpp contiene a la funci´on gcd(). Si queremos usar a gcd()
en el c´odigo de otro archivo prog2.cpp entonces el compilador debe estar
seguro que el tipo de los argumentos que se le van a pasar son los
correctos. Para eso hay que declarar a la funci´on en prog2.cpp antes de
poder llamarla
1 int gcd(int,int); // declara gcd()
2 . . .
3 r = gcd(m,n); // la puede usar porque ya
4 // fue declarada
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 21
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Declaraciones y definiciones
• Una declaraci´on le dice al compilador que esa funci´on existe y su
prototipo o signatura, es decir el tipo de argumentos de entrada y de
salida. Por ejemplo
1 int gcd(int,int);
• La definici´on por otra parte dice espec´ıficamente como la funci´on realiza
su tarea
1 int gcd(int x, int y) {
2 int a = x, b = y;
3 if (b>a) {
4 a = y; b = x;
5 }
6 while (true) {
7 int c = a % b;
8 if (c==0) return b;
9 a = b; b = c;
10 }
11 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 22
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Declaraciones y definiciones (cont.)
• Cada funci´on puede estar declarada varias veces en un archivo (mientras
la signatura de la funci´on sea la misma en cada una de las declaraciones).
1 int f(int x);
2 . . .
3 int f(int); // OK, misma signatura
• Por el contrario, la funci´on s´olo puede estar definida una sola vez en todos
los archivos del programa, ya que si no el compilador no sabr´ıa cual usar.
1 // archivo prog1.cpp
2 int f(int x) { return 2*x; }
3
4 // archivo prog2.cpp
5 int f(int x) { return 3*x; }
6 // -> ERROR: m´ultiplemente definida
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 23
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Definiciones y declaraciones de variables
Si declaramos una variable, por ejemplo
1 int m;
si bien parace una declaraci´on, en realidad ya tiene toda la informaci´on para
construir al objeto (un entero de 4 bytes) por lo tanto el compilador lo toma
adem´as como una definici´on. Por eso no podemos incluir dos veces esta
declaraci´on/definici´on, aunque sea del mismo tipo.
1 int m;
2 . . .
3 int m; // ERROR
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 24
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Definiciones y declaraciones de variables (cont.)
• Si queremos forzar a que sea una declaraci´on y no una definici´on
entonces debemos usar el keyword extern
1 extern int m;
2 . . .
3 extern int m; // OK
4 . . .
5 int m; // OK
• extern se puede usar tambi´en con las funciones, para hacer hincapi´e en
que es una declaraci´on, por ejemplo
1 extern int f(int x);
pero no es necesario.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 25
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Incluyendo headers
• Es usual que en nuestros programas escribamos una serie de funciones
que despu´es utilizaremos en otras partes del programa.
1 // utils.cpp
2 int gcd(int m,int n) { /* . . . */ }
3 double cos(double alpha) { /* . . . */ }
4 double sin(double alpha) { /* . . . */ }
5 . . .
• Cuando queremos usar estas funciones en otro archivo fuente prog.cpp
primero tenemos que declararlas
1 // prog.cpp
2 int gcd(int m,int n);
3 double cos(double alpha);
4 double sin(double alpha);
5 . . .
6 int x = gcd(m,n);
7 double c = cos(alpha);
8 double s = sin(theta);
9 . . .
Esto se vuelve muy engorroso si hay que incluir las declaraciones en cada
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 26
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
uno de los archivos prog1.cpp, prog2.cpp... y utils.cpp tiene cientos de
funciones. Entonces para resolver esto incluimos todas las declaraciones
en un archivo header (cabecera) utils.h:
1 // utils.h
2 int gcd(int m,int n);
3 double cos(double alpha);
4 double sin(double alpha);
Entonces despu´es en prog1.cpp hay que solo incluir el header:
1 // prog1.cpp
2 #include "utils.h"
3 . . .
4 int x = gcd(m,n);
5 double c = cos(alpha);
6 double s = sin(theta);
7 . . .
Recordemos que lo que ocurre es que el preprocesador CPP se encarga
de buscar el archivo header y crear un archivo temporario donde la linea
del include es reemplazada por los contenidos del archivo.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 27
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Incluyendo headers (cont.)
Hay dos versiones de include,
• Una que especifica archivos en forma relativa o absoluta
1 #include ". ./utils.h"
2 #include "utils2.h"
3 #include "/usr/include/utils3.h"
4 . . .
• Otra que busca los headers en una serie de directorios que el usuario
define en el comando de compilaci´on
1 $$ g++ -I/home/mstorti/utils -c -o prog.o prog.cpp
1 // lo encuentra en /home/mstorti/utils
2 #include <utils4.h>
3 // lo encuentra en /home/mstorti/utils/src
4 #include <src/utils5.h>
5 . . .
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 28
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Usando librer´ıas
• Entonces si tengo que usar una librer´ıa matrix que est´a compuesta de
varios archivos fuente matrix2.cpp, matrix1.cpp, matrix3.cpp... en realidad
no hace falta que compile todos estos archivos, mientras que el
desarrollador de esa librer´ıa provea
Un archivo libmatrix.a con todos los matrix<n>.cpp compilados.
Un archivo header con las declaraciones de las funciones matrix.h.
• Entonces para usar la librer´ıa basta con incluir el header
1 // myprog.cpp
2 #include <matrix.h>
3 . . .
y al linkeditar incluir la librer´ıa
1 $$ g++ myprog.cpp /usr/lib/libmatrix.a -o myprog
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 29
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Formato de include para C++
• La extensi´on que se usa para los archivos fuente puede ser .cpp, .cxx.
Para los headers se utiliza .h, .hpp, .hxx.
• Para evitar confusiones y ambig¨uedad con las extensiones, C++ introdujo
el concepto de include sin extensi´on. El traductor se encarga de convertir
el nombre y buscar la extensi´on.
1 #include <matrix>
• Existe una librer´ıa con muchas funciones muy ´utiles que es est´andar de C
y se llama justamente libc.a. Entre otras incluye funciones
Matem´aticas math.h: round, cos, sin, floor, ceil, ...
Input/output stdio.h: printf, scanf, read, write,
stdlib.h: rand, system, ...
En C++ estos headers es mejor incluirlos sin el .h y con una c:
1 #include <stdio.h> // C
2 #include <cstdio> // C++
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 30
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Un primer programa en C++
• Para imprimir por terminal hay que usar el operador << de la clase
iostream:
1 #include <iostream>
2 . . .
3 cout << "Hola";
El operador << en C quiere decir en realidad otra cosa: es para desplazar
los bits en un n´umero entero. Pero C++ permite redefinir los operadores
(lo que se llama sobrecarga de operadores) de manera que en este
contexto << quiere decir “enviar a”.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 31
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Namespaces
• A medida que una librer´ıa o programa crecen cada vez hay m´as funciones
y es muy posible que se produzca la colisi´on de nombres. Por ejemplo, si
escribo una librer´ıa para manipular matrices, puedo querer implementar
una funci´on rand() que llena la matriz con n´umeros aleatorios.
Lamentablemente la libc ya usa el nombre rand() para generar un ´unico
numero aleatorio.
• Una soluci´on que se usaba en C era prependizar un prefijo identificador
de la librer´ıa a todas las funciones de la misma matrix_rand(),
matrix_sum(), matrix_prod(). Esto se vuelve muy engorroso.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 32
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Namespaces (cont.)
• C++ provee un mecanismo para evitar colisiones llamado namespaces.
Todos los archivos de la librer´ıa se incluyen en un namespace de la
siguiente forma
1 // matrix.cpp
2 namespace matrix {
3 void rand(. . .) { /* . . . */ }
4 double sum(. . .) { /* . . . */ }
5 void prod(. . .) { /* . . . */ }
6 }
• Entonces despu´es las funciones se deben llamar con el operador de
scope ::: por ejemplo matrix::rand().
• Si en un archivo fuente se va a utilizar mucho una librer´ıa entonces puede
incluir todo el namespace, de manera que no hay que hacer el scope
1 // prog.cpp
2 using namespace matrix;
3
4 rand(A);
5 double m = max(A);
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 33
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Namespaces (cont.)
• Muchas utilidades y variables est´andar de C++, por ejemplo cout, est´an en
el namespace std de manera que o bien hay que hacer
1 std::cout << "Hola";
o si no
1 using namespace std;
2 . . .
3 cout << "Hola";
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 34
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructura de un programa
• Un programa en C/C++ est´a compuesto de una colecci´on de funciones y
variables. Cuando uno lanza el programa hay que determinar d´onde se
empieza a ejecutar el c´odigo, o sea el punto de entrada. En C/C++ el punto
de entrada es la funci´on main().
• La definici´on de una funci´on consiste en un valor de retorno, el nombre
de la funci´on y su lista de argumentos. El cuerpo de la funci´on (las
instrucciones que la componen) van entre llaves.
1 int function() {
2 // Function code here (this is a comment)
3 }
• Puede haber m´as pares de llaves balanceadas ({}) adentro de la funci´on
pero debe haber uno m´as externo que define el cuerpo de la funci´on.
• Como main() es una funci´on, debe respetar estos requisitos. main() no
tiene argumentos y retorna un int.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 35
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructura de un programa (cont.)
• C/C++ es un lenguaje de formato libre (free form), la indentaci´on o la
posici´on de las variables en la l´ınea son irrelevantes.
• Tampoco es relevante la cantidad espacio en blanco (espacios, tabs, fin
de l´ınea). Cualquier cantidad de estos caracteres juntos es equivalente a
un solo espacio. De hecho un programa en C++ podr´ıa escribirse ne una
sola l´ınea.
• En C los comentarios van encerrados entre /* y */ (comentario multil´ınea).
En C++ se agreg´o un nuevo tipo de comentario que es por l´ınea desde un
// hasta el final de la l´ınea. (Esto viola un poco el concepto de free form).
1 /* Comentario multilinea tipo C */
2 int /* comentario en el medio del c´odigo */ x;
3 // Comentario por linea tipo C++
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 36
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Hello world
1 // Saying Hello with C++
2 #include <iostream> // Stream declarations
3 using namespace std;
4
5 int main() {
6 cout << "Hello, World. I am "
7 << 8 << " Today" << endl;
8 }
• Le pasamos a cout una serie de elementos de diferentes tipos: enteros,
arreglos de caracteres.
• endl es un final de l´ınea.
• En C se llama string a un pedazo de texto entre comillas. No confundir
con la clase string de C++ que cumple funciones similares pero es mucho
m´as potente. A los strings de C se los debe llamar m´as correctamente
arreglos de caracteres.
• Dentro del texto entre comillas se pueden incluir secuencias de escape
que permiten incluir caracteres especiales con precedidos de una barra
invertida: n es un caracter de fin de l´ınea, t un TAB, 0 un NULL,  una
barra invertida.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 37
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Concatenaci´on de arreglos de caracters
• Para incluir arreglos de caracteres muy largos se puede simplemente
poner uno a continuaci´on de otro (puede ser en diferentes l´ıneas). El CPP
se encarga de juntarlos todos en una sola l´ınea: "aaa" "bbbb" es
completamente equivalente a "aaabbbb".
1 // Character array Concatenation
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 cout << "This is far too long to put on a "
7 "single line but it can be broken up with "
8 "no ill effectsnas long as there is no "
9 "punctuation separating adjacent character "
10 "arrays.n";
11 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 38
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Entrada de datos
cout es console output, cin es console input y permite ingresar datos.
1 // Converts decimal to octal and hex
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 int number;
7 cout << "Enter a decimal number: ";
8 cin >> number;
9 cout << "value in octal = 0"
10 << oct << number << endl;
11 cout << "value in hex = 0x"
12 << hex << number << endl;
13 }
oct y hex son manipulators, cambian el estado de cout.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 39
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Llamando a otros programas
Dentro de la librer´ıa est´andar de C hay una funci´on muy potente system() que
permite llamar a otros programas desde un programa en C/C++. Se le pasa un
arreglo de caracteres con el comando que uno ejecutar´ıa en la l´ınea de
comandos.
1 // Call another program
2 #include <cstdlib> // Declare ‘‘system()’’
3 using namespace std;
4
5 int main() {
6 system("date -u");
7 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 40
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Strings de C
Manipular arreglos de caracteres en C se vuelve muy engorroso.
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 int main() {
6 // concatenate two character arrays s1 and s2
7 char s1[ ] = "Hola ";
8 char s2[ ] = "mundo.";
9 cout << strlen(s1) << endl;
10 int n1 = strlen(s1);
11 int n2 = strlen(s2);
12 char *s = new char[n1+n2+1];
13 strncpy(s,s1,n1);
14 strncpy(s+n1,s2,n2);
15 s[n1+n2] = ’0’;
16 cout << s << endl;
17 delete[ ] s;
18 return 0;
19 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 41
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Strings de C++
Para eso C++ tiene objetos llamados strings que permiten manipularlos en
forma mucho m´as simple y con menor probabilidad de error.
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main() {
6 // concatenate two character arrays s1 and s2
7 string s1 = "Hola ";
8 string s2 = "mundo.";
9 string s = s1 + s2;
10 cout << s << endl;
11 return 0;
12 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 42
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Strings de C++ (cont.)
1 //: C02:HelloStrings.cpp
2 // The basics of the Standard C++ string class
3 #include <string>
4 #include <iostream>
5 using namespace std;
6
7 int main() {
8 string s1, s2; // Empty strings
9 string s3 = "Hello, World."; // Initialized
10 string s4("I am"); // Also initialized
11 s2 = "Today"; // Assigning to a string
12 s1 = s3 + " " + s4; // Combining strings
13 s1 += " 8 "; // Appending to a string
14 cout << s1 + s2 + "." << endl;
15 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 43
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Escribir y leer de archivos
• Las funciones est´an declaradas en el header <fstream>.
• Para escritura hay que crear un objeto de tipo ofstream (como cout).
• Para lectura hay que crear un objeto de tipo ifstream (como cin).
• La funci´on getline(stream,s) lee una l´ınea de stream y la guarda en el
string s
1 // Copy one file to another, a line at a time
2 #include <string>
3 #include <fstream>
4 using namespace std;
5 int main() {
6 ifstream in("Scopy.cpp"); // Open for reading
7 ofstream out("Scopy2.cpp"); // Open for writing
8 string s;
9 while(getline(in, s)) // Discards newline char
10 out << s << "n"; // . . . must add it back
11 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 44
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Escribir y leer de archivos (cont.)
Otro ejemplo es guardar todo el archivo en un s´olo string:
1 // Read an entire file into a single string
2 #include <string>
3 #include <iostream>
4 #include <fstream>
5 using namespace std;
6
7 int main() {
8 ifstream in("FillString.cpp");
9 string s, line;
10 while(getline(in, line))
11 s += line + "n";
12 cout << s;
13 }
¿Que pasa si queremos guardar cada l´ınea en un string separado?
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 45
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
La clase vector
• Un vector es un contenedor que permite guardar un n´umero indefinido de
elementos en forma contigua e indexada.
• Se puede agrandar o achicar en forma din´amica, sin perder los elementos
preexistentes.
• Est´a templatizado o sea que se pueden definir vectores de diferentes
tipos: vector<int>, vector<double>, vector<string>,...
• La funci´on push_back() permite agregar un nuevo objeto al final del vector.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 46
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
La clase vector (cont.)
1 // Copy an entire file into a vector of string
2 #include <string>
3 #include <iostream>
4 #include <fstream>
5 #include <vector>
6 using namespace std;
7
8 int main() {
9 vector<string> v;
10 ifstream in("Fillvector.cpp");
11 string line;
12 while(getline(in, line))
13 v.push-back(line); // Add the line to the end
14 // Add line numbers:
15 for(int i = 0; i < v.size(); i++)
16 cout << i << ": " << v[i] << endl;
17 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 47
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
La clase vector (cont.)
vector tambi´en puede guardar cualquier otro tipo, por ejemplo enteros:
1 // Creating a vector that holds integers
2 #include <iostream>
3 #include <vector>
4 using namespace std;
5
6 int main() {
7 vector<int> v;
8 for(int i = 0; i < 10; i++)
9 v.push-back(i);
10 for(int i = 0; i < v.size(); i++)
11 cout << v[i] << ", ";
12 cout << endl;
13 for(int i = 0; i < v.size(); i++)
14 v[i] = v[i] * 10; // Assignment
15 for(int i = 0; i < v.size(); i++)
16 cout << v[i] << ", ";
17 cout << endl;
18 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 48
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Ejercicios
1. Crear un programa que abre un archivo y cuenta las palabras (separadas
por whitespace). Ayuda: el operador >> lee de a palabras de un ifstream.
2. Crear un programa que cuenta la cantidad de caracteres que tiene un
archivo.
3. Crear un programa que cuenta la cantidad de ocurrencias de una palabra
espec´ıfica en un archivo. Ayuda: usar == para comparar strings.
4. Escribir un programa que imprime las l´ıneas de un archivo de texto en
orden inverso.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 49
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El C en C++
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 50
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Funciones
• Para evitar errores, C/C++ usa el concepto de prototipo o signatura de
funciones.
• Antes de usar una funci´on hay que declararla.
• Al usar la funci´on los argumentos con que es llamada deben coincidir con
el el tipo que fueron declarados.
1 int translate(float x, float y, float z);
2 int translate(float, float, float);
• En alg´un lugar la funci´on tiene que estar definida, aqu´ı los nombres de los
argumentos tienen que aparecer para poder ser usados en la funci´on
1 int translate(float x, float y, float z) {
2 x = y = z;
3 // . . .
4 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 51
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Valores de retorno
• La declaraci´on de la funci´on debe indicar el valor de retorno. Si la funci´on
no retorna nada usar void:
1 int f1(void); // Returns an int, takes no arguments
2 int f2(); // Like f1() in C++ but not in Standard C
3 float f3(float, int, char, double); // Returns a float
4 void f4(void); // Takes no arguments, returns nothing
• Para retornar el valor usar la sentencia return.
• Si la funci´on retorna void entonces no se debe llamar a return.
• Se puede tener m´as de un return en la funci´on. Son puntos de salida.
• El valor de retorno debe ser compatible con el indicado en la declaraci´on.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 52
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Valores de retorno (cont.)
1 // Use of ‘‘return’’
2 #include <iostream>
3 using namespace std;
4
5 char cfunc(int i) {
6 if(i == 0)
7 return ’a’;
8 if(i == 1)
9 return ’g’;
10 if(i == 5)
11 return ’z’;
12 return ’c’;
13 }
14
15 int main() {
16 cout << "type an integer: ";
17 int val;
18 cin >> val;
19 cout << cfunc(val) << endl;
20 } ///:˜
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 53
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Usando la librer´ıa est´andar de C
• C incluye una librer´ıa de funciones est´andar (tambi´en llamada libc). Todos
los compiladores que satisfacen la norma deben incluir estas funciones
en su libc. Esto permite la portabilidad de los programas entre diferentes
compiladores.
• Muchos compiladores incluyen funciones adicionales que NO est´an en la
norma. Por lo tanto hay que prever que si se lleva el proyecto a otra
plataforma puede ser que estas funciones no existan en esa plataforma.
• La documentaci´on de las librer´ıas usualmente incluye la declaraci´on de la
funci´on y en que header (archivo .h) est´a.
• En caso que la librer´ıa no est´e documentada hay que directamente ver los
headers para encontrarel prototipo de la funci´on.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 54
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Control de ejecuci´on. True and False
• Todas los condicionales (por ejemplo if o while) usan expresiones l´ogicas
como por ejemplo el resultado del operador de comparaci´on A==B. Esta
expresi´on retorna directamente un valor l´ogico true o false. No confundiir
con el operador de asignaci´on A=B.
• Lo mismo ocurre con otros operadores de comparaci´on
1 A==B; //It’s equal?
2 A!=B; //It’s distinct?
3 A<B; //It’s smaller?
4 A<=B; //It’s smaller or equal?
5 A>B; //It’s greater?
6 A>=B; //It’s greater or equal?
Si la expresi´on no retorna un valor booleano, entonces C trata de convertirlo.
Para todos los valores num´ericos (enteros, float, double, char, punteros) el
valor es falso si es cero, y en cualquier otra caso es verdadero. Entonces por
ejemplo el valor l´ogico de las siguientes expresiones es equivalente
1 if (n) { . . . }
2 if (n!=0) { . . . . }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 55
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
3 if (!(n==0)) { . . . . } // ! is negation
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 56
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
If-else
El if puede existir de dos formas, con o sin else
1 if (expression)
2 statement
3
4 // o
5
6 if (expression)
7 statement
8 else
9 statement
En ambos casos statement puede ser una sentencia simple, terminada en una
coma, o compuesta, es decir un bloque de instrucciones encerrado en {}.
1 if (n>0) x=23; // sentencia simple
2
3 if (n>0) { // sentencia compuesta
4 x=23;
5 s="haha";
6 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 57
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
If-else (cont.)
1 int i;
2 cout << "type a number and ’Enter’" << endl;
3 cin >> i;
4 if(i > 5)
5 cout << "It’s greater than 5" << endl;
6 else
7 if(i < 5)
8 cout << "It’s less than 5 " << endl;
9 else
10 cout << "It’s equal to 5 " << endl;
11
12 cout << "type a number and ’Enter’" << endl;
13 cin >> i;
14 if(i < 10)
15 if(i > 5) // ‘‘if’’ is just another statement
16 cout << "5 < i < 10" << endl;
17 else
18 cout << "i <= 5" << endl;
19 else // Matches ‘‘if(i < 10)’’
20 cout << "i >= 10" << endl;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 58
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
If-else (cont.)
Notar que todo el if act´ua como una sola instrucci´on, por eso no hace falta
encerrarlo con un {}.
1 if(i > 5)
2 cout << "It’s greater than 5" << endl;
3 else
4 if(i < 5)
5 cout << "It’s less than 5 " << endl;
6 else
7 cout << "It’s equal to 5 " << endl;
8
9 // es equivalente a
10
11 if(i > 5) { cout << "It’s greater than 5" << endl; }
12 else {
13 if(i < 5)
14 cout << "It’s less than 5 " << endl;
15 else
16 cout << "It’s equal to 5 " << endl;
17 }
Es una convenci´on mut ´util indentar ambos bloques del if para mejorar la
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 59
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
legibilidad.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 60
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
while
while, do-while y for controlan lazos (loops) de ejecuci´on.
1 while(expression)
2 statement
Como antes statement puede ser simple o compuesto. La expresi´on se eval´ua
hasta que la condici´on de falso. Para que el lazo termine en alg´un momento
es necesario que statement tenga alg´un efecto que haga que eventualmente
expression de falso
1 int x=0;
2 while (x<5) x=34; // ejecuta una vez el lazo
3 x=0;
4 while (x<5) x=2; // ejecuta indefinidamente
5
6 x=0;
7 while (x<5) x++; // ejecuta el bloque 5 veces
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 61
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
while (cont.)
1 // Guess a number (demonstrates ‘‘while’’)
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 int secret = 15;
7 int guess = 0;
8 // != is the not-equal conditional:
9 while(guess != secret) { // Compound statement
10 cout << "guess the number: ";
11 cin >> guess;
12 }
13 cout << "You guessed it!" << endl;
14 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 62
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
while (cont.)
En C la condici´on dentro del condicional puede ser tan elaborada como se
quiera, la ´unica restricci´on es que debe retornar un valor l´ogico (o convertible
a l´ogico), incluso puede ser que el cuerpo del lazo este vac´ıo
1 while(do-a-lot-of-work()) ;
2 while(do-a-lot-of-work()) { }
por ejemplo
1 while(is-prime(n)) n++; // busca el primer n no primo
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 63
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
do-while
1 do
2 statement
3 while(expression);
Es similar al while pero ahora statement es ejecutado antes de verificar la
condici´on.
1 n=0;
2 while (n>0) /* body. . .*/ ; // body is not executed
3
4 n=0;
5 do
6 /* body. . .*/ ; // body is executed once
7 while (n>0);
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 64
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Lazo for
La forma del for es
1 for(initialization; conditional; step)
2 statement
Se utiliza mucho cuando simplemente se quiere ejecutar un bloque una serie
de veces bien definida
1 for (int i=0; i<n; i++) {
2 // This block is executed n times
3 }
Esto es completamente equivalente a
1 int i=0;
2 while(i<n) {
3 // This block is executed n times
4 i++;
5 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 65
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Break and continue
Adentro de cualquiera de los bloques while, do-while o for se puede usar
break para salir del lazo inmediatamente.
1 while (true) { // Infinite loop
2 cout << "Enter a number: ";
3 cin >> n;
4 if (is-prime(n)) break;
5 cout << n << " es un n´umero compuesto" << endl;
6 }
Si hay m´as de un lazo anidado entonces break sale del lazo m´as interno
1 for (int i=0; i<n; i++) {
2 for (int j=0; j<n; j++) {
3 if (j>i*i) break;
4 //. . .
5 }
6 // break transfers execution here
7 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 66
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Break and continue (cont.)
continue es similar a break pero hace que se ejecute la siguiente iteraci´on del
lazo
1 for (int j=0; j<n; j++) {
2 //. . . .
3 if (!is-prime(j)) continue;
4 // do this only for primes. . .
5 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 67
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
La sentencia switch
Va comparando la variable selector hasta que coincide con uno de los case
1 switch(selector) {
2 case integral-value1 : statement; break;
3 case integral-value2 : statement; break;
4 case integral-value3 : statement; break;
5 case integral-value4 : statement; break;
6 case integral-value5 : statement; break;
7 (. . .)
8 default: statement;
9 }
por ejemplo
1 char c;
2 //. . .
3 switch (c) {
4 case ’a’: cout << "It’s an a" << endl; break;
5 case ’b’: cout << "It’s a b" << endl; break;
6 default: cout << "Neither a or b" << endl;
7 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 68
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Si no se incluyen los break entonces la ejecuci´on sigue al siguiente case.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 69
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
goto
La sentencia goto permite saltar a otro punto del programa. Se lo considera
muchas veces como una mala pr´actica de programaci´on, aunque a veces
puede ser ´util, por ejemplo para saltar de varios lazos anidados cuando se
encuentra una condici´on.
1 // The infamous goto is supported in C++
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 long val = 0;
7 for(int i = 1; i < 1000; i++) {
8 for(int j = 1; j < 100; j += 10) {
9 val = i * j;
10 if(val > 47000)
11 goto bottom;
12 // Break would only go to the outer ’for’
13 }
14 }
15 bottom: // A label
16 cout << val << endl;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 70
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
17 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 71
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Recursion
Muchos problemas son intr´ınsecamente recursivos, es decir la soluci´on de un
problema est´a dada por la soluci´on de uno menor con el mismo algoritmo,
por ejemplo la definici´on de factorial se puede hacer en forma recursiva
n! = n · (n − 1)! (1)
en realidad esto es cierto si n > 1, la definici´on correcta es
n! =



1; si n = 1;
n · (n − 1)! ; si n > 1
(2)
decimos que el caso n = 1 corta la recursi´on.
Usando llamadas recursivas a funciones podemos implementar la funci´on
factorial
1 int factorial(int n) {
2 if (n==1) return 1;
3 else return n*factorial(n-1);
4 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 72
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Recursion (cont.)
La recursi´on es muy elegante para resolver problemas, pero puede ser
demandante en t´erminos de recursos. Es m´as simple si calculamos el
factorial con un lazo
1 int factorial(int n) {
2 int fac=1;
3 for (int j=2; j<=n; j++) fac *= j;
4 return fac;
5 }
El operador *= quiere decir aqu´ı
1 fac = fac*j;
Se puede aplicar a otros operadores binarios como +*-/, operadores l´ogicos
||&&, concatenaci´on de strings...
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 73
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores
Los operadores no son m´as que funciones, con una sintaxis especial. Un
operador toma una o m´as series de valores y devuelve un resultado.
1 a = b + c;
podemos pensar que es traducido por el compilador en
1 a = sum(b,c);
Una cuesti´on importante con los operadores es la precedencia de los
mismos. Para los operadores matem´aticos es similar a las reglas que
aprendemos en la escuela
1 a = b * c + d;
es equivalente a
1 a = (b * c) + d;
porque * tiene mayor precedencia que +. Ante la duda, se pueden introducir
par´entesis para forzar el orden en que se eval´uan las expresiones.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 74
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores de auto incremento
El operador ++ es un atajo para una operaci´on muy com´un en programaci´on:
incrementar una variable de tipo entero en una unidad. Hay dos variantes,
prefija y postfija, ambos tienen el mismo efecto colateral (incrementar la
variable) pero en el prefijo retorna el valor de la variable incrementada, y el
postfijo sin incrementar
1 int m,n=5;
2 m = n++; // n=6, m=5
3
4 int m,n=5;
5 m = ++n; // n=6, m=6
Por ejemplo la siguiente funci´on retorna el primer primo siguiente (mayor o
igual) a n.
1 int next-prime(int n) {
2 while (!is-prime(n++)) { }
3 return n;
4 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 75
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores de auto incremento (cont.)
Tambi´en hay autodecremento -- prefijo y postfijo.
1 int n=10;
2 while (n >= 0) cout << n-- << ", ";
3 cout << "Boom!!" << endl;
1 [mstorti@galileo garage]$$ ./boom.bin
2 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, Boom!!
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 76
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Tipos de datos
Dijimos que C/C++ es un lenguaje de tipeo est´atico, es decir en el momento
de crear las variables hay que decir de que tipo son. Hay tipos de datos
built-in como enteros, floats, strings, que ya est´an definidos en el compilador,
y tambi´en el programador puede crear sus propios tipos, muchas veces por
composici´on. Por ejemplo si estamos creando la base de datos de una
empresa podemos querer tener un tipo de dato employee que contenga un
string (el nombre), un entero (el n´umero de empleado) y un float (el sueldo).
Los tipos built-in son
• char un entero de al menos 8 bits, usualmente se usa para almacenar
caracteres.
• int un entero de al menos 16 bits (2 bytes)
• float un n´umero de punto flotante con al menos 4 bytes (simple precisi´on)
• double un n´umero de punto flotante con al menos 8 bytes (doble
precisi´on).
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 77
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Tipos de datos (cont.)
1 // Defining the four basic data
2 // types in C and C++
3
4 int main() {
5 // Definition without initialization:
6 char protein;
7 int carbohydrates;
8 float fiber;
9 double fat;
10 // Simultaneous definition & initialization:
11 char pizza = ’A’, pop = ’Z’;
12 int dongdings = 100, twinkles = 150,
13 heehos = 200;
14 float chocolate = 3.14159;
15 // Exponential notation:
16 double fudge-ripple = 6e-4;
17 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 78
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Tipos de datos (cont.)
Como los tipos b´asicos tienen una cantidad de bits fija pueden representar un
tama˜no m´aximo. Por ejemplo los enteros de 16 bits s´olo pueden estar entre
-32768 y +32768. Adem´as el tama˜no del tipo (la cantidad de bits) puede
depender de la m´aquina y del compilador, entonce los valores m´aximos y
m´ınimos (los l´ımites) est´an definidos en headers float.h y limits.h,
1 #include <climits>
2
3 cout << "Minimum and maximum integers are "
4 << endl << INT-MIN << " and " << INT-MAX
5 << endl;
6 }
1 [mstorti@galileo garage]$$ ./intmax.bin
2 Minimum and maximum integers are
3 -2147483648 and 2147483647
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 79
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Especificadores
• Para representar enteros se utiliza un bit de los 32 disponibles para
representar el signo.
• Si s´olo se van a utilizar enteros positivos entonces podemos usar ese bit
para extender un factor 2 el rango.
• int en el rango [-2147483648,2147483647]
• unsigned int en el rango [0,4294967295]
unsigned es un specifier, otros son: signed, unsigned, short, long.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 80
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Especificadores (cont.)
1 //: C03:Specify.cpp
2 // Demonstrates the use of specifiers
3 #include <iostream>
4 using namespace std;
5
6 int main() {
7 char c;
8 unsigned char cu;
9 int i;
10 unsigned int iu;
11 short int is;
12 short iis; // Same as short int
13 unsigned short int isu;
14 unsigned short iisu;
15 long int il;
16 long iil; // Same as long int
17 unsigned long int ilu;
18 unsigned long iilu;
19 float f;
20 double d;
21 long double ld;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 81
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
22 cout
23 << "n char= " << sizeof(c)
24 << "n unsigned char = " << sizeof(cu)
25 << "n int = " << sizeof(i)
26 << "n unsigned int = " << sizeof(iu)
27 << "n short = " << sizeof(is)
28 << "n unsigned short = " << sizeof(isu)
29 << "n long = " << sizeof(il)
30 << "n unsigned long = " << sizeof(ilu)
31 << "n float = " << sizeof(f)
32 << "n double = " << sizeof(d)
33 << "n long double = " << sizeof(ld)
34 << endl;
35 } ///:˜
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 82
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Especificadores (cont.)
1 [mstorti@galileo garage]$$ ./sizes.bin
2
3 char= 1
4 unsigned char = 1
5 int = 4
6 unsigned int = 4
7 short = 2
8 unsigned short = 2
9 long = 8
10 unsigned long = 8
11 float = 4
12 double = 8
13 long double = 16
14 [mstorti@galileo garage]$$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 83
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros
Al declarar variables lo que estamos haciendo es dar un nombre a un pedazo
de la memoria. Cuando decimos int n lo que estamos diciendo al compilador
es: res´erveme 4 bytes de la memoria y a partir de ahora lo voy a llamar n. El
operador & nos muestra en que posici´on de la memoria fue alocada la variable
1 int n;
2 cout << "variable n is in position " << &n << endl;
1 [mstorti@galileo garage]$$ ./ptr.bin
2 variable n is in position 0x7fff1c46d92c
Los punteros son impresos normalmente en formato de hexadecimales, si
quisi´eramos verlo en formato decimal podemos castear (convertir) el puntero
a un entero
1 int n;
2 cout << "variable n is in position " << (long)&n << endl;
1 [mstorti@galileo garage]$$ ./ptr.bin
2 variable n is in position 140737075615260
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 84
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
1 #include <iostream>
2 using namespace std;
3
4 int dog, cat, bird, fish;
5
6 void f(int pet) {
7 cout << "pet id number: " << pet << endl;
8 }
9
10 int main() {
11 int i, j, k;
12 cout << "f(): " << (long)&f << endl;
13 cout << "dog: " << (long)&dog << endl;
14 cout << "cat: " << (long)&cat << endl;
15 cout << "bird: " << (long)&bird << endl;
16 cout << "fish: " << (long)&fish << endl;
17 cout << "i: " << (long)&i << endl;
18 cout << "j: " << (long)&j << endl;
19 cout << "k: " << (long)&k << endl;
20 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 85
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
El resultado es
1 [mstorti@galileo garage]$$ ./pointers.bin
2 f(): 4196630
3 dog: 6295956
4 cat: 6295960
5 bird: 6295964
6 fish: 6295968
7 i: 140736631158572
8 j: 140736631158568
9 k: 140736631158564
10 [mstorti@galileo garage]$$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 86
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
• La direcci´on en memoria de un variable puede cambiar de una corrida a
otra.
• Funciones, variables y globales parecen estar en sectores de la memoria
diferentes.
• Enteros parecen ocupar 4 bytes.
• Las posiciones en la memoria se pueden guardar en una variable de tipo
especial llamada puntero
1 int number;
2 int *number-p = &number;
• El sufijo _p o simplemente p indica que es un puntero (es s´olo una
convenci´on).
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 87
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
• Algunos programadores ponen el * junto al tipo.
1 int* number-p;
Es totalmente equivalente, pero confuso,
1 int* number-p,n-p,m-p;
Declara a number_p, pero n_p y m_p son declarados enteros. Lo correcto es
1 int *number-p,*n-p,*m-p;
• Podemos asignar a una variable de tipo puntero la direcci´on de una
variable, lo cual nos permite modificarla a trav´es de ese proxy
1 int number=100;
2 int *number-p = &number;
3 *number-p = 25; // Ahora number contiene 25!!
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 88
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
• OJO: el hecho de declarar una variable de tipo puntero no significa que
est´e apuntando a un objeto v´alido, es deber del programador asignarle al
puntero una posici´on v´alida, si no puede dar error en tiempo de ejecuci´on
al querer usar el puntero.
1 int *p;
2 cout << "contenido de *p " << *p << endl; // ERROR
3 int x;
4 p = &x;
5 cout << "contenido de *p " << *p << endl; // OK
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 89
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
Los punteros tienen un mont´on de usos, el primero que veremos es el de
causar que una funci´on modifique un objeto. El mecanismo de paso de
variables en C/C++ es por copia.
1 #include <iostream>
2 using namespace std;
3
4 void f(int a) {
5 cout << "&a = " << &a << endl;
6 cout << "a = " << a << endl;
7 a = 5;
8 cout << "a = " << a << endl;
9 }
10
11 int main() {
12 int x = 47;
13 cout << "&x = " << &x << endl;
14 cout << "x = " << x << endl;
15 f(x);
16 cout << "x = " << x << endl;
17 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 90
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
Imprime:
1 [mstorti@galileo sources]$$ ./try40.bin
2 &x = 0x7ffe99dd33ec
3 x = 47
4 &a = 0x7ffe99dd33bc
5 a = 47
6 a = 5
7 x = 47
8 [mstorti@galileo sources]$$ x = 47
Como la variable a en f() es una copia, resulta que la modificaci´on que se
hace en f() no persiste, de manera que queda el mismo valor.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 91
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
En esta versi´on en cambio, pasamos la direcci´on donde est´a x:
1 #include <iostream>
2 using namespace std;
3
4 void f(int* p) {
5 cout << "p = " << p << endl;
6 cout << "*p = " << *p << endl;
7 *p = 5;
8 cout << "p = " << p << endl;
9 }
10
11 int main() {
12 int x = 47;
13 cout << "x = " << x << endl;
14 cout << "&x = " << &x << endl;
15 f(&x);
16 cout << "x = " << x << endl;
17 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 92
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros (cont.)
Imprime:
1 [mstorti@galileo sources]$ ./try41.bin
2 x = 47
3 &x = 0x7ffcf3047dcc
4 p = 0x7ffcf3047dcc
5 *p = 47
6 p = 0x7ffcf3047dcc
7 x = 5
8 [mstorti@galileo sources]$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 93
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Referencias
Los punteros son muy ´utiles pero engorrosos porque hay que estar
dereferenciando al puntero cada vez. C++ introdujo las referencias que son
completamente equivalentes a los punteros pero evitan la dereferenciaci´on.
1 #include <iostream>
2 using namespace std;
3
4 void f(int& r) {
5 cout << "r = " << r << endl;
6 cout << "&r = " << &r << endl;
7 r = 5;
8 cout << "r = " << r << endl;
9 }
10
11 int main() {
12 int x = 47;
13 cout << "x = " << x << endl;
14 cout << "&x = " << &x << endl;
15 f(x); // Looks like pass-by-value,
16 // is actually pass by reference
17 cout << "x = " << x << endl;
18 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 94
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Referencias (cont.)
Imprime:
1 [mstorti@galileo sources]$ ./try42.bin
2 x = 47
3 &x = 0x7ffd244d1aac
4 r = 47
5 &r = 0x7ffd244d1aac
6 r = 5
7 x = 5
8 [mstorti@galileo sources]$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 95
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros a void
• El compilador s´olo acepta que asignemos a una variable de tipo int* la
direcci´on de una variable de tipo int, en otro caso da un error
1 int *p;
2 int n;
3 p = &n; // OK
4 double a;
5 p = &a; // Error
• El tipo void* permite almacenar un puntero a cualquier tipo de variable
1 void* vp;
2 char c;
3 int i;
4 float f;
5 double d;
6 vp = &c;
7 vp = &i;
8 vp = &f;
9 vp = &d;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 96
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros a void (cont.)
• Una vez que una direcci´on es asignada a un void* el compilador no puede
saber de que tipo es el objeto al cual apunta, y por lo tanto no se puede
dereferenciar
1 int i = 99;
2 void* vp = &i;
3 *vp = 3; // Error de compilacion
• Para poder recuperar el objeto tenemos que castear el puntero, de esa
forma le estamos diciendo al compilador que es del tipo indicado
1 int i = 99;
2 void* vp = &i;
3 *((int*)vp) = 3; // OK!
• Si casteamos al tipo incorrecto el compilador no protesta, pero se puede
producir un error en tiempo de ejecuci´on
1 int i = 99;
2 void* vp = &i;
3 // Compila OK, posible error en tiempo de ejecuci´on
4 *((string*)vp) = "Hello world";
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 97
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Scope de las variables
Una variable existe desde su definici´on hasta la siguiente llave que cierra (}).
Eso se llama el scope de la variable.
1 // How variables are scoped
2 int main() {
3 int scp1;
4 // scp1 visible here
5 {
6 // scp1 still visible here
7 //. . . . .
8 int scp2;
9 // scp2 visible here
10 //. . . . .
11 {
12 // scp1 & scp2 still visible here
13 //. .
14 int scp3;
15 // scp1, scp2 & scp3 visible here
16 // . . .
17 } // scp3 destroyed here
18 // scp3 not available here
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 98
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
19 // scp1 & scp2 still visible here
20 // . . .
21 } // scp2 destroyed here
22 // scp3 & scp2 not available here
23 // scp1 still visible here
24 //. .
25 } // scp1 destroyed here
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 99
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Definiendo variables on-the-fly
En C todas las variables deben ser definidas al comienzo del scope. En C++
se pueden definir en cualquier lugar.
1 // On-the-fly variable definitions
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 //. .
7 { // Begin a new scope
8 int q = 0; // C requires definitions here
9 //. .
10 // Define at point of use:
11 for(int i = 0; i < 100; i++) {
12 q++; // q comes from a larger scope
13 // Definition at the end of the scope:
14 int p = 12;
15 }
16 int p = 1; // A different p
17 } // End scope containing q & outer p
18 cout << "Type characters:" << endl;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 100
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
19 while(char c = cin.get() != ’q’) {
20 cout << c << " wasn’t it" << endl;
21 if(char x = c == ’a’ | | c == ’b’)
22 cout << "You typed a or b" << endl;
23 else
24 cout << "You typed " << x << endl;
25 }
26 cout << "Type A, B, or C" << endl;
27 switch(int i = cin.get()) {
28 case ’A’: cout << "Snap" << endl; break;
29 case ’B’: cout << "Crackle" << endl; break;
30 case ’C’: cout << "Pop" << endl; break;
31 default: cout << "Not A, B or C!" << endl;
32 }
33 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 101
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Definiendo variables on-the-fly (cont.)
Las variables que est´an fuera de todas las funciones son globales, su scope
es todo el programa, inclu´ıdo dentro de las funciones.
1 // == file1.cpp ==
2 // Demonstration of global variables
3 #include <iostream>
4 using namespace std;
5
6 int globe;
7 void func();
8 int main() {
9 globe = 12;
10 cout << globe << endl;
11 func(); // Modifies globe
12 cout << globe << endl;
13 }
14 // == file2.cpp ==
15 // Accessing external global variables
16 extern int globe;
17 // (The linker resolves the reference)
18 void func() {
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 102
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
19 globe = 47;
20 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 103
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Variables locales
Las variables que existen dentro de un scope son locales, tambi´en se les
llama autom´aticas ya que son creadas en el momento de llegar a ese bloque.
La memoria que le es asignada no tiene porque ser siempre la misma, por lo
tanto la variable no retiene el valor que le fue asignado antes.
1 void f(int x) {
2 int a;
3 cout << "a en f(): " << a << endl;
4 cout << "&a en f(): " << &a << endl;
5 a=x;
6 cout << "a en f() despues de asignar: " << a << endl;
7 }
8
9 void g(int x) {
10 int a;
11 cout << "a en g(): " << a << endl;
12 cout << "&a en g(): " << &a << endl;
13 a=x;
14 cout << "a en g() despues de asignar: " << a << endl;
15 }
16
17 void h(int x) {
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 104
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
18 int a;
19 f(435);
20 cout << "a en h(): " << a << endl;
21 cout << "&a en h(): " << &a << endl;
22 a=x;
23 cout << "a en h() despues de asignar: " << a << endl;
24 }
25
26 int main() {
27 f(23);
28 g(45);
29 f(23);
30 g(45);
31 h(234);
32 return 0;
33 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 105
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Variables locales (cont.)
El resultado es:
1 [mstorti@galileo garage]$$ ./try2.bin
2 a en f(): 0
3 &a en f(): 0x7fff6df56d1c
4 a en f() despues de asignar: 23
5 a en g(): 23
6 &a en g(): 0x7fff6df56d1c
7 a en g() despues de asignar: 45
8 a en f(): 45
9 &a en f(): 0x7fff6df56d1c
10 a en f() despues de asignar: 23
11 a en g(): 23
12 &a en g(): 0x7fff6df56d1c
13 a en g() despues de asignar: 45
14 a en f(): 59
15 &a en f(): 0x7fff6df56cdc
16 a en f() despues de asignar: 435
17 a en h(): 45
18 &a en h(): 0x7fff6df56d1c
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 106
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
19 a en h() despues de asignar: 234
20 [mstorti@galileo garage]$$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 107
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Punteros a variables locales
Si una variable sale de scope, es un error tratar de utilizar punteros que
apuntaban a esa variable.
1 int *p;
2 for (int j=0; j<N; j++) {
3 int z;
4 p = &z;
5 . . .
6 }
7 // ERROR (z no existe mas)
8 cout << "contenido de *p " << *p << endl;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 108
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Variables est´aticas
Si queremos que el ´area asignada a una variable local sea siempre el mismo,
entonces le agregamos el keyword static. Un ejemplo cl´asico es una funci´on
que cuenta cuantas veces fue llamada:
1 void f() {
2 static int count=0;
3 cout << "f() fue llamada " << count << " veces" << endl;
4 cout++;
5 }
6
7 int main() {
8 for (int j=0; j<10; j++)
9 f();
10 return 0;
11 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 109
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Variables est´aticas (cont.)
El resultado es:
1 [mstorti@galileo garage]$ ./try14.bin
2 f() fue llamada 0 veces
3 f() fue llamada 1 veces
4 f() fue llamada 2 veces
5 f() fue llamada 3 veces
6 f() fue llamada 4 veces
7 f() fue llamada 5 veces
8 f() fue llamada 6 veces
9 f() fue llamada 7 veces
10 f() fue llamada 8 veces
11 f() fue llamada 9 veces
12 [mstorti@galileo garage]$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 110
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Constantes
Si se utilizar´a muchas veces un valor que es constante se pueden hacer a
trav´es de un macro
1 #define PI 3.141459
o bien a trav´es de una variable de tipo const
1 const double pi = 3.141459;
Es m´as prolijo esto ´ultimo (le permite al compilador hacer chequeo de tipo).
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 111
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores. Asignaci´on
El caracter = se utiliza como el operador de asignaci´on:
1 A=4;
Lo que est´a a la izquierda de = es el lvalue y lo que est´a a la derecha el rvalue.
El rvalue puede ser cualquier expresi´on. El compilador la evalua y asigna el
resultado a lo que est´a en el lvalue. Ahora bien lo que est´a en el lvalue no
puede ser cualquier cosa, debe ser una variable o cualquier otra cosa a la
cual se le pueda asignar un valor. Por ejemplo no puede ser una constante, es
decir no podemos hacer
1 4=A;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 112
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores matem´aticos
Los operadores matem´aticos binarios usuales son +-*/. Cada uno de ellos se
puede usar en forma de acumulaci´on +=, -=, *=, /=. Por ejemplo
1 x += 5;
es equivalente a
1 x = x + 5;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 113
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores relacionales
Son
1 >, <, >=, <=, ==, !=
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 114
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores l´ogicos
Son && (and) y || (or). Recordar que en C/C++ muchos tipos se castean
autom´aticamente a bool, siendo 0 el valor falso y cualquier otro valor
verdadero. Cuando se imprimen los valores booleanos dan 0 o 1. ! es la
negaci´on.
Son operadores cortocircuitados es decir si hacemos
1 expr1 && expr2
entonces primero se evalua expr1 y si da falso, entonces expr2 NO se eval´ua,
ya que no es necesario porque la expresi´on l´ogica resultar´a en falso de todas
formas. Eso puede ser importante, por ejemplo
1 if (n>0 && m/n!=3) . . .
est´a garantizado que no dar´a error si n==0 ya que si es as´ı directamente la
divisi´on por n no se har´a. Lo mismo ocurre en
1 expr1 | | expr2
si la primera da verdadero.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 115
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
El operador hook
Es una forma muy compacta de escribir un if-else. Por ejemplo esta expresi´on
calcula el m´ınimo de dos valores
1 x = (m<n ? m : n);
Se puede usar tambi´en en un lvalue. La siguiente expresi´on asigna al menor
de m,n el valor 23.
1 (m<n ? m : n) = 23;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 116
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Errores comunes con los operadores
• Las reglas de precedencia a veces son simples, pero si se escriben
expresiones complejas ya no. Ante la duda utilizar par´entesis.
• No confundir = con ==.
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 117
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operadores de cast
• Si el compilador ve que estamos mezclando tipos en una asignaci´on,
insertar´a una operaci´on de cast (conversi´on de tipo) autom´aticamente
1 int x=5;
2 double z=x; // OK
3 z=23.3;
4 x=z; // se pierde la mantisa (truncamiento)
5 x = (int) z; // cast explicito
6 x = int(z); // otra forma del cast explicito
7
8 int ixp = &x; // error, no puede convertir ptr a int
9 long int ixp2 = (long int)&x; // OK!
10 long int ixp3 = static-cast<long int>(&x); // OK!
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 118
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Operador sizeof
• Retorna el tama˜no de una variable o tipo en bytes
1 cout << "sizeof(char) " << sizeof(char) << endl; // ->1
2 cout << "sizeof(int) " << sizeof(int) << endl; // ->4
3 cout << "sizeof(float) " << sizeof(float) << endl; // ->4
4 cout << "sizeof(double) " << sizeof(double) << endl; // ->8
5
6 double a;
7 cout << "sizeof(a) " << sizeof(a) << endl; // ->8
8 cout << "sizeof(&a) " << sizeof(&a) << endl; // ->8 (in x86-64)
9 int x;
10 cout << "sizeof(&x) " << sizeof(&x) << endl; // ->8 (in x86-64)
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 119
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
typedef: Aliases de tipos
• Permite hacer un alias de un tipo a un nuevo tipo
1 typedef unsigned long int ulong;
2 . . .
3 ulong x;
• Simple para tipos b´asicos, m´as complicado para punteros
1 typedef int *int-p;
• La regla es que se escribe una l´ınea como la declaraci´on de una variable
con typedef al principio y reemplazando la variable por el tipo.
• Esto permite hacer expresiones m´as cortas pero adem´as tiene un uso muy
importante. Permitir cambiar de tipo todas las variables de un programa
1 typedef float scalar;
2 scalar i,j,k;
Para cambiar todo el programa a doble precisi´on:
1 typedef double scalar;
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 120
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructuras
• Se pueden definir nuevos tipos agrupando varios miembros en una
estructura. Los miembros de la estructura se toman con el operador .:
1 struct A {
2 char c;
3 int m;
4 float f;
5 double b;
6 };
7
8 void printa(A a) {
9 cout << "structure is (" << a.c << "," << a.m << ","
10 << a.f << "," << a.b << ")" << endl;
11 }
12 . . .
13
14 A a1, a2;
15 a1.c = ’h’;
16 a2.m = 23;
17 printa(a1);
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 121
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructuras (cont.)
Se pueden tomar punteros a estructuras y enlazarlas
1 struct cell {
2 char c;
3 double x;
4 cell *next;
5 };
6
7 int main() {
8 cell c1,c2,c3;
9 c1.c = ’a’; c1.x = 1; c1.next = &c2;
10 c2.c = ’b’; c2.x = 2; c2.next = &c3;
11 c3.c = ’c’; c3.x = 3; c3.next = &c1;
12
13 cell *cp = &c1;
14 for (int k=0; k<20; k++) {
15 cout << "cp " << cp << ", c "
16 << (*cp).c << ", x " << (*cp).x << endl;
17 cp = (*cp).next;
18 }
19 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 122
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructuras (cont.)
1 cell c1,c2,c3;
2 c1.c = ’a’; c1.x = 1; c1.next = &c2;
3 c2.c = ’b’; c2.x = 2; c2.next = &c3;
4 c3.c = ’c’; c3.x = 3; c3.next = &c1;
c='a' x=1
next
c1
c='b' x=2
next
c2
c='c' x=3
next
c3
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 123
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Estructuras (cont.)
El resultado es
1 [mstorti@galileo garage]$$ ./try8.bin
2 cp 0x7fff571b2d20, c a, x 1
3 cp 0x7fff571b2d00, c b, x 2
4 cp 0x7fff571b2ce0, c c, x 3
5 cp 0x7fff571b2d20, c a, x 1
6 . . .
7 cp 0x7fff571b2d20, c a, x 1
8 cp 0x7fff571b2d00, c b, x 2
9 [mstorti@galileo garage]$$
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 124
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz
Arrow operator
Como en el ejemplo anterior es muy com´un la compinaci´on (*cp).x es decir
tener un puntero a una estructura cp y querer tomar un miembro x de la
estructura apuntada. Como es tan com´un hay un atajo sint´actico para eso
1 (*cp).x es equivalente a cp->x
Entonces el lazo del programa anterior pasa a ser
1 for (int k=0; k<20; k++) {
2 cout << "cp " << cp << ", c " << cp->c
3 << ", x " << cp->x << endl;
4 cp = cp->next;
5 }
Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 125
((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300)
(processed-date Wed May 27 12:45:10 2015 -0300))
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería
Programacion en C++ para Ciencia e Ingeniería

Más contenido relacionado

Destacado

The fundemental of electronics ebook
The fundemental of electronics ebookThe fundemental of electronics ebook
The fundemental of electronics ebook
Le Thanh Nhan
 
6.2 Damped and forced oscillations
6.2 Damped and forced oscillations6.2 Damped and forced oscillations
6.2 Damped and forced oscillations
Paul Burgess
 
Vibration and damping
Vibration and dampingVibration and damping
Vibration and damping
Divya Lattoo
 
Mechanics of metal cutting
Mechanics of metal cuttingMechanics of metal cutting
Mechanics of metal cutting
manoj18biet
 
Mechanical Vibrations all slides
Mechanical Vibrations all slidesMechanical Vibrations all slides
Mechanical Vibrations all slides
Ebrahim Hanash
 

Destacado (20)

Vibration Energy Harvesting - Between theory and reality
Vibration Energy Harvesting - Between theory and realityVibration Energy Harvesting - Between theory and reality
Vibration Energy Harvesting - Between theory and reality
 
Vibration and frequency measuring instruments
Vibration and frequency measuring instrumentsVibration and frequency measuring instruments
Vibration and frequency measuring instruments
 
The fundemental of electronics ebook
The fundemental of electronics ebookThe fundemental of electronics ebook
The fundemental of electronics ebook
 
4.2 damped harmonic motion
4.2 damped harmonic motion4.2 damped harmonic motion
4.2 damped harmonic motion
 
Topic 3 forced oscillator
Topic 3 forced oscillatorTopic 3 forced oscillator
Topic 3 forced oscillator
 
Vibration measuring instrument - Vibrometer
Vibration measuring instrument - VibrometerVibration measuring instrument - Vibrometer
Vibration measuring instrument - Vibrometer
 
6.2 Damped and forced oscillations
6.2 Damped and forced oscillations6.2 Damped and forced oscillations
6.2 Damped and forced oscillations
 
Tuned mass damper
Tuned mass damperTuned mass damper
Tuned mass damper
 
Air pulse fruit harvester
Air pulse fruit harvesterAir pulse fruit harvester
Air pulse fruit harvester
 
Merchant's circle
Merchant's circleMerchant's circle
Merchant's circle
 
Vibration and damping
Vibration and dampingVibration and damping
Vibration and damping
 
Theory of-metal-cutting
Theory of-metal-cuttingTheory of-metal-cutting
Theory of-metal-cutting
 
Theory of metal cutting-module II
Theory of metal cutting-module IITheory of metal cutting-module II
Theory of metal cutting-module II
 
Mechanics of metal cutting
Mechanics of metal cuttingMechanics of metal cutting
Mechanics of metal cutting
 
Speed,velocity,acceleration
Speed,velocity,accelerationSpeed,velocity,acceleration
Speed,velocity,acceleration
 
Vibration measuring instruments
Vibration measuring instrumentsVibration measuring instruments
Vibration measuring instruments
 
Speed, Velocity And Acceleration
Speed, Velocity And AccelerationSpeed, Velocity And Acceleration
Speed, Velocity And Acceleration
 
Mechanical Vibrations all slides
Mechanical Vibrations all slidesMechanical Vibrations all slides
Mechanical Vibrations all slides
 
Mechanical Vibration- An introduction
Mechanical Vibration- An introductionMechanical Vibration- An introduction
Mechanical Vibration- An introduction
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 

Similar a Programacion en C++ para Ciencia e Ingeniería

Introducci n al_dise_o_en_ing._mec_nica
Introducci n al_dise_o_en_ing._mec_nicaIntroducci n al_dise_o_en_ing._mec_nica
Introducci n al_dise_o_en_ing._mec_nica
cahuana pari
 
Arquitectura de computadoras ii
Arquitectura de computadoras iiArquitectura de computadoras ii
Arquitectura de computadoras ii
silvestron
 
Sesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en PythonSesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en Python
maluacsa
 
Practica 2 problemas de programacion
Practica 2 problemas de programacionPractica 2 problemas de programacion
Practica 2 problemas de programacion
Jesus Salas Castro
 
Aprendizaje Estadístico con Python - 4to Encuentro Software libre 2013
Aprendizaje Estadístico con Python -  4to Encuentro Software libre 2013Aprendizaje Estadístico con Python -  4to Encuentro Software libre 2013
Aprendizaje Estadístico con Python - 4to Encuentro Software libre 2013
Sergio Hernandez
 
Complementación de la exposición sobre “seminario”
Complementación de la exposición sobre “seminario”Complementación de la exposición sobre “seminario”
Complementación de la exposición sobre “seminario”
chuquilinsalazar
 

Similar a Programacion en C++ para Ciencia e Ingeniería (20)

Software Libre como pilar en el Grid Computing
Software Libre como pilar en el Grid ComputingSoftware Libre como pilar en el Grid Computing
Software Libre como pilar en el Grid Computing
 
Ingeniando el software en tiempos de crisis
Ingeniando el software en tiempos de crisisIngeniando el software en tiempos de crisis
Ingeniando el software en tiempos de crisis
 
Introducción Análisis y Diseño
Introducción Análisis y DiseñoIntroducción Análisis y Diseño
Introducción Análisis y Diseño
 
Aterrizando la Inteligencia Artificial
Aterrizando la Inteligencia ArtificialAterrizando la Inteligencia Artificial
Aterrizando la Inteligencia Artificial
 
2015 16 09 arq requisitos para presentar proyecto
2015 16 09 arq requisitos para presentar proyecto2015 16 09 arq requisitos para presentar proyecto
2015 16 09 arq requisitos para presentar proyecto
 
Mda Para Dummies
Mda Para DummiesMda Para Dummies
Mda Para Dummies
 
6. dibujo industrial avanzado
6. dibujo industrial avanzado6. dibujo industrial avanzado
6. dibujo industrial avanzado
 
IMPLEMENTCIÓN DE SOFTWARE DE MATRÍCULA "ISM" (PMBOK)
IMPLEMENTCIÓN DE SOFTWARE DE MATRÍCULA "ISM" (PMBOK)IMPLEMENTCIÓN DE SOFTWARE DE MATRÍCULA "ISM" (PMBOK)
IMPLEMENTCIÓN DE SOFTWARE DE MATRÍCULA "ISM" (PMBOK)
 
Prog mats20142
Prog mats20142Prog mats20142
Prog mats20142
 
Rackio framework
Rackio frameworkRackio framework
Rackio framework
 
Introducci n al_dise_o_en_ing._mec_nica
Introducci n al_dise_o_en_ing._mec_nicaIntroducci n al_dise_o_en_ing._mec_nica
Introducci n al_dise_o_en_ing._mec_nica
 
Practica 2
Practica 2Practica 2
Practica 2
 
Arquitectura de computadoras ii
Arquitectura de computadoras iiArquitectura de computadoras ii
Arquitectura de computadoras ii
 
Sesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en PythonSesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en Python
 
Practica 2 problemas de programacion
Practica 2 problemas de programacionPractica 2 problemas de programacion
Practica 2 problemas de programacion
 
Aprendizaje Estadístico con Python - 4to Encuentro Software libre 2013
Aprendizaje Estadístico con Python -  4to Encuentro Software libre 2013Aprendizaje Estadístico con Python -  4to Encuentro Software libre 2013
Aprendizaje Estadístico con Python - 4to Encuentro Software libre 2013
 
C++ Como Programar - Deitel 6edi.pdf
C++ Como Programar - Deitel 6edi.pdfC++ Como Programar - Deitel 6edi.pdf
C++ Como Programar - Deitel 6edi.pdf
 
Concepto Básicos Algoritmia
Concepto Básicos Algoritmia Concepto Básicos Algoritmia
Concepto Básicos Algoritmia
 
Complementación de la exposición sobre “seminario”
Complementación de la exposición sobre “seminario”Complementación de la exposición sobre “seminario”
Complementación de la exposición sobre “seminario”
 
Grado de Ingeniería Informática
Grado de Ingeniería InformáticaGrado de Ingeniería Informática
Grado de Ingeniería Informática
 

Más de Storti Mario

Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
Storti Mario
 
Automatic high order absorption layers for advective-diffusive systems of equ...
Automatic high order absorption layers for advective-diffusive systems of equ...Automatic high order absorption layers for advective-diffusive systems of equ...
Automatic high order absorption layers for advective-diffusive systems of equ...
Storti Mario
 
El Método Científico
El Método CientíficoEl Método Científico
El Método Científico
Storti Mario
 
Gpuslides
GpuslidesGpuslides
Gpuslides
Storti Mario
 
Cosechadora Innovar
Cosechadora InnovarCosechadora Innovar
Cosechadora Innovar
Storti Mario
 
Actividades de Transferencia en CIMEC
Actividades de Transferencia en CIMECActividades de Transferencia en CIMEC
Actividades de Transferencia en CIMEC
Storti Mario
 

Más de Storti Mario (12)

Avances en la modelización computacional de problemas de interacción Fluido-E...
Avances en la modelización computacional de problemas de interacción Fluido-E...Avances en la modelización computacional de problemas de interacción Fluido-E...
Avances en la modelización computacional de problemas de interacción Fluido-E...
 
Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
Advances in the Solution of NS Eqs. in GPGPU Hardware. Second order scheme an...
 
Advances in the Solution of Navier-Stokes Eqs. in GPGPU Hardware. Modelling F...
Advances in the Solution of Navier-Stokes Eqs. in GPGPU Hardware. Modelling F...Advances in the Solution of Navier-Stokes Eqs. in GPGPU Hardware. Modelling F...
Advances in the Solution of Navier-Stokes Eqs. in GPGPU Hardware. Modelling F...
 
Automatic high order absorption layers for advective-diffusive systems of equ...
Automatic high order absorption layers for advective-diffusive systems of equ...Automatic high order absorption layers for advective-diffusive systems of equ...
Automatic high order absorption layers for advective-diffusive systems of equ...
 
El Método Científico
El Método CientíficoEl Método Científico
El Método Científico
 
Gpuslides
GpuslidesGpuslides
Gpuslides
 
Supercomputadoras en carrera
Supercomputadoras en carreraSupercomputadoras en carrera
Supercomputadoras en carrera
 
Cosechadora Innovar
Cosechadora InnovarCosechadora Innovar
Cosechadora Innovar
 
HPC course on MPI, PETSC, and OpenMP
HPC course on MPI, PETSC, and OpenMPHPC course on MPI, PETSC, and OpenMP
HPC course on MPI, PETSC, and OpenMP
 
Dynamic Absorbing Boundary Conditions
Dynamic Absorbing Boundary ConditionsDynamic Absorbing Boundary Conditions
Dynamic Absorbing Boundary Conditions
 
Actividades de Transferencia en CIMEC
Actividades de Transferencia en CIMECActividades de Transferencia en CIMEC
Actividades de Transferencia en CIMEC
 
Algoritmos y Estructuras de Datos
Algoritmos y Estructuras de DatosAlgoritmos y Estructuras de Datos
Algoritmos y Estructuras de Datos
 

Último

Último (11)

MODULO BASICO DE WORD - I CICLO.DOC.DOC.
MODULO BASICO DE WORD - I CICLO.DOC.DOC.MODULO BASICO DE WORD - I CICLO.DOC.DOC.
MODULO BASICO DE WORD - I CICLO.DOC.DOC.
 
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA  DE TRABAJO DE CREACION DE TABLAS EN WORDFICHA  DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
 
Virus informático (tipos y opciones para prevenir)
Virus informático (tipos y opciones para prevenir)Virus informático (tipos y opciones para prevenir)
Virus informático (tipos y opciones para prevenir)
 
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
 
Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
 
Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
 
Los desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMsLos desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMs
 
infografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de softwareinfografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de software
 
trabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docxtrabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docx
 

Programacion en C++ para Ciencia e Ingeniería

  • 1. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Programaci´on en C++ para Ciencia e Ingenier´ıa Mario Storti, Lisandro Dalc´ın, Rodrigo Paz http://www.cimec.org.ar/prog Facultad de Ingenier´ıa y Ciencias H´ıdricas Universidad Nacional del Litoral http://www.unl.edu.ar Centro de Investigaci´on de M´etodos Computacionales - CIMEC INTEC, (CONICET-UNL), http://www.cimec.org.ar Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 1 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 2. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Autores • Mario Storti <mario.storti@gmail.> • Lisandro Dalc´ın, <dalcinl@gmail.com> • Rodrigo Paz, <rodrigo.r.paz@gmail.com> Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 2 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 3. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Contents • slide 11.....Elementos b´asicos de programaci´on slide 13.....Compilaci´on vs. int´erpretes slide 14.....El proceso de compilaci´on slide 16.....El preprocesador CPP slide 19.....Chequeo de tipos slide 20.....Compilaci´on por separado slide 22.....Declaraciones y definiciones slide 24.....Definiciones y declaraciones de variables slide 26.....Incluyendo headers slide 29.....Usando librer´ıas slide 30.....Formato de include para C++ slide 31.....Un primer programa en C++ slide 32.....Namespaces slide 35.....Estructura de un programa slide 37.....Hello world slide 38.....Concatenaci´on de arreglos de caracters slide 39.....Entrada de datos slide 40.....Llamando a otros programas Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 3 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 4. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 41.....Strings de C slide 42.....Strings de C++ slide 44.....Escribir y leer de archivos slide 46.....La clase vector slide 49.....Ejercicios • slide 50.....El C en C++ slide 51.....Funciones slide 52.....Valores de retorno slide 54.....Usando la librer´ıa est´andar de C slide 55.....Control de ejecuci´on. True and False slide 57.....If-else slide 61.....while slide 64.....do-while slide 65.....Lazo for slide 66.....Break and continue slide 68.....La sentencia switch slide 70.....goto slide 72.....Recursion slide 74.....Operadores slide 75.....Operadores de auto incremento slide 77.....Tipos de datos Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 4 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 5. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 80.....Especificadores slide 84.....Punteros slide 94.....Referencias slide 96.....Punteros a void slide 98.....Scope de las variables slide 100.....Definiendo variables on-the-fly slide 104.....Variables locales slide 108.....Punteros a variables locales slide 109.....Variables est´aticas slide 111.....Constantes slide 112.....Operadores. Asignaci´on slide 113.....Operadores matem´aticos slide 114.....Operadores relacionales slide 115.....Operadores l´ogicos slide 116.....El operador hook slide 117.....Errores comunes con los operadores slide 118.....Operadores de cast slide 119.....Operador sizeof slide 120.....typedef: Aliases de tipos slide 121.....Estructuras slide 125.....Arrow operator Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 5 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 6. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 126.....Enum’s slide 129.....Arreglos de estructuras slide 130.....Punteros y arreglos slide 132.....Arreglos de punteros slide 136.....Aritm´etica de punteros slide 138.....Tama˜nos de estructuras • slide 139.....Programaci´on Orientada a Objetos slide 140.....Abstracci´on de datos slide 150.....POO b´asica slide 160.....Inclusion de headers slide 164.....Estructuras enlazadas slide 172.....M´as sobre scoping slide 173.....Tipos Abstractos de Datos (ADT) slide 174.....Ocultando la implementaci´on slide 176.....Control de acceso a los miembros slide 180.....Amistad (Friendship) slide 183.....Anidamiento (nesting) y amistad slide 184.....Object layout slide 185.....Clases slide 189.....Ocultando totalmente la implementaci´on slide 191.....Inicializaci´on y cleanup Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 6 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 7. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 193.....El constructor slide 194.....El destructor slide 197.....Eliminaci´on del bloque de definici´on slide 199.....Clase stash con ctor/dtor slide 203.....Stack con ctor/dtor slide 206.....Initializaci´on de agregados slide 207.....Inicializaci´on de estructuras slide 208.....Sobrecarga de funciones slide 212.....Argumentos por default slide 213.....Constantes slide 216.....Punteros a arreglos constantes de caracteres slide 217.....Const en argumentos de funciones slide 218.....Const en clases slide 219.....Objetos const y funciones de la clase • slide 221.....Chapter 5 slide 222.....Funciones inline slide 226.....Especificaciones de linkedicion slide 228.....Referencias en C++ slide 234.....Reglas para las referencias slide 236.....Paso por referencia y por copia slide 237.....El constructor por copia Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 7 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 8. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 238.....Sobrecarga de operadores slide 243.....Sobrecarga de operadores unarios slide 251.....Sobrecarga de operadores binarios • slide 273.....Chapter slide 274.....Otros operadores que se pueden sobrecargar slide 275.....Creaci´on din´amica de objetos slide 276.....Uso de la memoria din´amica en C slide 277.....Uso de la memoria din´amica en C++ slide 279.....Porqu´e usar new y no arreglos slide 280.....Memory exhaust slide 281.....Composici´on slide 283.....Composici´on y la cadena de inicializaci´on slide 284.....Herencia slide 287.....Redefinici´on de m´etodos slide 289.....Herencia protegida slide 291.....Upcasting slide 292.....Polimorfismo slide 294.....Ejemplo polimorfismo. Integral 1D/2D/3D slide 298.....Clase que calcula integral 1D slide 300.....Integral 2D. Versi´on cruda slide 315.....Integral 2D. Versi´on mejorada Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 8 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 9. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz slide 318.....Integral 3D slide 321.....Integral 1D/2D/3D. User code slide 323.....Polimorfismo: ej. suma de los elementos de un vector slide ??.....Ejemplo clase vector sparse • slide 326.....Contenedores de la librer´ıa STL slide 328.....La librer´ıa STL slide 328.....La clase vector slide 333.....Algoritmos in-place slide 335.....La clase list slide 338.....La clase set slide 342.....La clase map slide 345.....Algoritmos slide 347.....Programaci´on funcional Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 9 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 10. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Dictado • Docentes de la c´atedra: Mario Storti <mario.storti@gmail.> Lisandro Dalc´ın, <dalcinl@gmail.com> Rodrigo Paz, <rodrigo.r.paz@gmail.com> Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 10 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 11. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Elementos b´asicos de programaci´on Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 11 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 12. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz I KNOW C++! Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 12 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 13. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Compilaci´on vs. int´erpretes • Algunos lenguajes de programaci´on tienen un int´erprete, por ejemplo Matlab/Octave, Python, Perl, Lisp/Scheme. En un int´erprete el usuario va emitiendo comandos que son interpretados por el int´erprete y va devolviendo un resultado. • Por contraposici´on, los lenguajes compilados el usuario escribe un archivo con l´ıneas de c´odigo, el cu´al es procesado por un compilador, que genera c´odigo de m´aquina, el cual es ejecutado directamente por el procesador. • Ventajas de la compilaci´on: el c´odigo suele ser m´as r´apido, y m´as compacto. • Desventajas: el paso de c´odigo a ejecutarlo es inmediato, no hay pasos intermedios. Usualmente los int´erpretes permiten escribir tareas que se repiten com´unmente en archivos de texto (scripts). El usuario puede adem´as mezclar estas funciones con comandos directamente en el int´erprete. Tambi´en con los int´erprete es m´as f´acil debuggear. • C++ es un lenguaje compilado. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 13 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 14. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El proceso de compilaci´on • El caso m´as simple es cuando todo el c´odigo del programa est´a en un s´olo archivo fuente: 1 $$ g++ -o prog prog.cpp Genera un archivo ejecutable prog. • Si el programa es muy grande conviene dividirlo en varias partes, en ese caso 1 $$ g++ -o prog prog1.cpp prog2.cpp • Esto requiere recompilar cada vez todos los *.cpp, si son muchos conviene hacer 1 $$ g++ -o prog1.o -c prog1.cpp 2 $$ g++ -o prog2.o -c prog2.cpp 3 $$ g++ -o prog prog1.o prog2.o Los archivos .o son objeto, contienen c´odigo de m´aquina. (No tiene relaci´on con la Programaci´on Orientada a Objetos). Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 14 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 15. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El proceso de compilaci´on (cont.) • Si solo se modifica uno de los archivos (prog1.cpp), entonces s´olo hace falta recompilar ese. 1 $$ g++ -o prog1.o -c prog1.cpp 2 $$ g++ -o prog prog1.o prog2.o • Para mejor organizaci´on, si hay muchos *.o conviene ponerlos en una librer´ıa 1 $$ g++ -o prog1.o -c prog1.cpp 2 $$ g++ -o prog2.o -c prog2.cpp 3 $$ g++ -o prog3.o -c prog3.cpp 4 $$ ar r libprog.a prog1.o prog2.o prog3.o 5 $$ g++ -o prog main.cpp libprog.a • A veces la librer´ıa puede ser que haya sido desarrollada por un tercero: libpetsc.a, libmkl.a. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 15 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 16. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El preprocesador CPP • Muchas veces hay texto que se repite muchas veces en el c´odigo. En ese caso se pueden usar macros 1 int v[100000]; 2 if (n<100000) { 3 . . . . 4 } Se puede simplificar de la siguiente forma 1 #define MAX 100000 2 int v[MAX]; 3 if (n<MAX) { 4 . . . . 5 } Estos macros son manejados por el preprocesador, el cual se llama normalmente cpp (por C preprocesor). Podemos pensar que el CPP genera un paso intermedio en el cual toma el archivo prog.cpp y genera un archivo intermedio tempo.cpp que es el que finalmente es compilado. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 16 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 17. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El preprocesador CPP (cont.) • CPP s´olo realiza manipulaciones a nivel de texto, no conoce nada espec´ıfico del lenguaje C/C++, incluso puede usarse (y se usa) para otros lenguajes como Fortran. • Las directivas m´as usuales son 1 // Incluye todo el texto del archivo library.h 2 #include <library.h> 3 4 #define CHECK(a,n) if (a>n) error() • Para #include el preprocesador simplemente incluye todo el archivo mencionado en el punto donde se invoca el include. • #define define un macro, despu´es se puede llamar al macro en otros lugares del c´odigo y es reemplazado por su expansi´on. Los macros pueden tener argumentos. Por convenci´on se suele dar a los macros nombres en may´usculas. • Se puede conocer cual es el resultado del CPP llamando a g++ con la opci´on -E 1 $$ g++ -o tempo.cpp -E prog.cpp • El CPP es un programa separado que se puede llamar por s´ı mismo Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 17 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 18. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz (/usr/bin/cpp). Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 18 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 19. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Chequeo de tipos • C++ es un lenguaje tipado (aka tipeo est´atico, en ingl´es typed language), es decir las variables tienen tipos definidos. El compilador chequea que los resultados de las expresiones que se asignan a las variables correspondan al tipo con el cual fueron definidas, caso contrario se produce un error en tiempo de compilaci´on. Esto es bueno porque permite detectar tempranamente errores. (Es equivalente al chequeo de unidades en F´ısica). 1 // error: asigna un string a una variable entera 2 int a; 3 a = "Hello"; • Otros lenguajes (sobre todos los interpretados) hacen chequeo din´amico de tipo, esto implica una p´erdida de eficiencia. • El chequeo se hace tambi´en para los argumentos de una funci´on 1 void fun(int a,string s); 2 . . . 3 fun(23,45); // ERROR (45 no es un string!) Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 19 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 20. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Compilaci´on por separado • En C++ se favorece que un programa grande se pueda dividir en fracciones m´as peque˜nas. El mecanismo fundamental para dividir un programa en partes m´as peque˜nas es usar funciones que realizan tareas bien definidas. Por ejemplo podemos pensar en una funci´on int gcd(int,int); que toma dos enteros y retorna el m´aximo com´un divisor de los mismos. • Las funciones tienen argumentos, una vez que la funci´on termina su tarea, retorna un valor. Tambi´en puede ser que las funciones tengan efectos colaterales (side effects) es decir que modifiquen sus argumentos u otros objetos. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 20 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 21. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Compilaci´on por separado (cont.) • Para crear un programa que est´e dividido en varios archivos, el c´odigo de un archivo debe poder usar las funciones del otro. Supongamos que un archivo prog1.cpp contiene a la funci´on gcd(). Si queremos usar a gcd() en el c´odigo de otro archivo prog2.cpp entonces el compilador debe estar seguro que el tipo de los argumentos que se le van a pasar son los correctos. Para eso hay que declarar a la funci´on en prog2.cpp antes de poder llamarla 1 int gcd(int,int); // declara gcd() 2 . . . 3 r = gcd(m,n); // la puede usar porque ya 4 // fue declarada Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 21 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 22. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Declaraciones y definiciones • Una declaraci´on le dice al compilador que esa funci´on existe y su prototipo o signatura, es decir el tipo de argumentos de entrada y de salida. Por ejemplo 1 int gcd(int,int); • La definici´on por otra parte dice espec´ıficamente como la funci´on realiza su tarea 1 int gcd(int x, int y) { 2 int a = x, b = y; 3 if (b>a) { 4 a = y; b = x; 5 } 6 while (true) { 7 int c = a % b; 8 if (c==0) return b; 9 a = b; b = c; 10 } 11 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 22 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 23. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Declaraciones y definiciones (cont.) • Cada funci´on puede estar declarada varias veces en un archivo (mientras la signatura de la funci´on sea la misma en cada una de las declaraciones). 1 int f(int x); 2 . . . 3 int f(int); // OK, misma signatura • Por el contrario, la funci´on s´olo puede estar definida una sola vez en todos los archivos del programa, ya que si no el compilador no sabr´ıa cual usar. 1 // archivo prog1.cpp 2 int f(int x) { return 2*x; } 3 4 // archivo prog2.cpp 5 int f(int x) { return 3*x; } 6 // -> ERROR: m´ultiplemente definida Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 23 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 24. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Definiciones y declaraciones de variables Si declaramos una variable, por ejemplo 1 int m; si bien parace una declaraci´on, en realidad ya tiene toda la informaci´on para construir al objeto (un entero de 4 bytes) por lo tanto el compilador lo toma adem´as como una definici´on. Por eso no podemos incluir dos veces esta declaraci´on/definici´on, aunque sea del mismo tipo. 1 int m; 2 . . . 3 int m; // ERROR Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 24 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 25. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Definiciones y declaraciones de variables (cont.) • Si queremos forzar a que sea una declaraci´on y no una definici´on entonces debemos usar el keyword extern 1 extern int m; 2 . . . 3 extern int m; // OK 4 . . . 5 int m; // OK • extern se puede usar tambi´en con las funciones, para hacer hincapi´e en que es una declaraci´on, por ejemplo 1 extern int f(int x); pero no es necesario. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 25 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 26. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Incluyendo headers • Es usual que en nuestros programas escribamos una serie de funciones que despu´es utilizaremos en otras partes del programa. 1 // utils.cpp 2 int gcd(int m,int n) { /* . . . */ } 3 double cos(double alpha) { /* . . . */ } 4 double sin(double alpha) { /* . . . */ } 5 . . . • Cuando queremos usar estas funciones en otro archivo fuente prog.cpp primero tenemos que declararlas 1 // prog.cpp 2 int gcd(int m,int n); 3 double cos(double alpha); 4 double sin(double alpha); 5 . . . 6 int x = gcd(m,n); 7 double c = cos(alpha); 8 double s = sin(theta); 9 . . . Esto se vuelve muy engorroso si hay que incluir las declaraciones en cada Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 26 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 27. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz uno de los archivos prog1.cpp, prog2.cpp... y utils.cpp tiene cientos de funciones. Entonces para resolver esto incluimos todas las declaraciones en un archivo header (cabecera) utils.h: 1 // utils.h 2 int gcd(int m,int n); 3 double cos(double alpha); 4 double sin(double alpha); Entonces despu´es en prog1.cpp hay que solo incluir el header: 1 // prog1.cpp 2 #include "utils.h" 3 . . . 4 int x = gcd(m,n); 5 double c = cos(alpha); 6 double s = sin(theta); 7 . . . Recordemos que lo que ocurre es que el preprocesador CPP se encarga de buscar el archivo header y crear un archivo temporario donde la linea del include es reemplazada por los contenidos del archivo. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 27 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 28. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Incluyendo headers (cont.) Hay dos versiones de include, • Una que especifica archivos en forma relativa o absoluta 1 #include ". ./utils.h" 2 #include "utils2.h" 3 #include "/usr/include/utils3.h" 4 . . . • Otra que busca los headers en una serie de directorios que el usuario define en el comando de compilaci´on 1 $$ g++ -I/home/mstorti/utils -c -o prog.o prog.cpp 1 // lo encuentra en /home/mstorti/utils 2 #include <utils4.h> 3 // lo encuentra en /home/mstorti/utils/src 4 #include <src/utils5.h> 5 . . . Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 28 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 29. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Usando librer´ıas • Entonces si tengo que usar una librer´ıa matrix que est´a compuesta de varios archivos fuente matrix2.cpp, matrix1.cpp, matrix3.cpp... en realidad no hace falta que compile todos estos archivos, mientras que el desarrollador de esa librer´ıa provea Un archivo libmatrix.a con todos los matrix<n>.cpp compilados. Un archivo header con las declaraciones de las funciones matrix.h. • Entonces para usar la librer´ıa basta con incluir el header 1 // myprog.cpp 2 #include <matrix.h> 3 . . . y al linkeditar incluir la librer´ıa 1 $$ g++ myprog.cpp /usr/lib/libmatrix.a -o myprog Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 29 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 30. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Formato de include para C++ • La extensi´on que se usa para los archivos fuente puede ser .cpp, .cxx. Para los headers se utiliza .h, .hpp, .hxx. • Para evitar confusiones y ambig¨uedad con las extensiones, C++ introdujo el concepto de include sin extensi´on. El traductor se encarga de convertir el nombre y buscar la extensi´on. 1 #include <matrix> • Existe una librer´ıa con muchas funciones muy ´utiles que es est´andar de C y se llama justamente libc.a. Entre otras incluye funciones Matem´aticas math.h: round, cos, sin, floor, ceil, ... Input/output stdio.h: printf, scanf, read, write, stdlib.h: rand, system, ... En C++ estos headers es mejor incluirlos sin el .h y con una c: 1 #include <stdio.h> // C 2 #include <cstdio> // C++ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 30 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 31. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Un primer programa en C++ • Para imprimir por terminal hay que usar el operador << de la clase iostream: 1 #include <iostream> 2 . . . 3 cout << "Hola"; El operador << en C quiere decir en realidad otra cosa: es para desplazar los bits en un n´umero entero. Pero C++ permite redefinir los operadores (lo que se llama sobrecarga de operadores) de manera que en este contexto << quiere decir “enviar a”. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 31 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 32. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Namespaces • A medida que una librer´ıa o programa crecen cada vez hay m´as funciones y es muy posible que se produzca la colisi´on de nombres. Por ejemplo, si escribo una librer´ıa para manipular matrices, puedo querer implementar una funci´on rand() que llena la matriz con n´umeros aleatorios. Lamentablemente la libc ya usa el nombre rand() para generar un ´unico numero aleatorio. • Una soluci´on que se usaba en C era prependizar un prefijo identificador de la librer´ıa a todas las funciones de la misma matrix_rand(), matrix_sum(), matrix_prod(). Esto se vuelve muy engorroso. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 32 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 33. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Namespaces (cont.) • C++ provee un mecanismo para evitar colisiones llamado namespaces. Todos los archivos de la librer´ıa se incluyen en un namespace de la siguiente forma 1 // matrix.cpp 2 namespace matrix { 3 void rand(. . .) { /* . . . */ } 4 double sum(. . .) { /* . . . */ } 5 void prod(. . .) { /* . . . */ } 6 } • Entonces despu´es las funciones se deben llamar con el operador de scope ::: por ejemplo matrix::rand(). • Si en un archivo fuente se va a utilizar mucho una librer´ıa entonces puede incluir todo el namespace, de manera que no hay que hacer el scope 1 // prog.cpp 2 using namespace matrix; 3 4 rand(A); 5 double m = max(A); Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 33 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 34. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Namespaces (cont.) • Muchas utilidades y variables est´andar de C++, por ejemplo cout, est´an en el namespace std de manera que o bien hay que hacer 1 std::cout << "Hola"; o si no 1 using namespace std; 2 . . . 3 cout << "Hola"; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 34 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 35. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructura de un programa • Un programa en C/C++ est´a compuesto de una colecci´on de funciones y variables. Cuando uno lanza el programa hay que determinar d´onde se empieza a ejecutar el c´odigo, o sea el punto de entrada. En C/C++ el punto de entrada es la funci´on main(). • La definici´on de una funci´on consiste en un valor de retorno, el nombre de la funci´on y su lista de argumentos. El cuerpo de la funci´on (las instrucciones que la componen) van entre llaves. 1 int function() { 2 // Function code here (this is a comment) 3 } • Puede haber m´as pares de llaves balanceadas ({}) adentro de la funci´on pero debe haber uno m´as externo que define el cuerpo de la funci´on. • Como main() es una funci´on, debe respetar estos requisitos. main() no tiene argumentos y retorna un int. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 35 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 36. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructura de un programa (cont.) • C/C++ es un lenguaje de formato libre (free form), la indentaci´on o la posici´on de las variables en la l´ınea son irrelevantes. • Tampoco es relevante la cantidad espacio en blanco (espacios, tabs, fin de l´ınea). Cualquier cantidad de estos caracteres juntos es equivalente a un solo espacio. De hecho un programa en C++ podr´ıa escribirse ne una sola l´ınea. • En C los comentarios van encerrados entre /* y */ (comentario multil´ınea). En C++ se agreg´o un nuevo tipo de comentario que es por l´ınea desde un // hasta el final de la l´ınea. (Esto viola un poco el concepto de free form). 1 /* Comentario multilinea tipo C */ 2 int /* comentario en el medio del c´odigo */ x; 3 // Comentario por linea tipo C++ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 36 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 37. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Hello world 1 // Saying Hello with C++ 2 #include <iostream> // Stream declarations 3 using namespace std; 4 5 int main() { 6 cout << "Hello, World. I am " 7 << 8 << " Today" << endl; 8 } • Le pasamos a cout una serie de elementos de diferentes tipos: enteros, arreglos de caracteres. • endl es un final de l´ınea. • En C se llama string a un pedazo de texto entre comillas. No confundir con la clase string de C++ que cumple funciones similares pero es mucho m´as potente. A los strings de C se los debe llamar m´as correctamente arreglos de caracteres. • Dentro del texto entre comillas se pueden incluir secuencias de escape que permiten incluir caracteres especiales con precedidos de una barra invertida: n es un caracter de fin de l´ınea, t un TAB, 0 un NULL, una barra invertida. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 37 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 38. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Concatenaci´on de arreglos de caracters • Para incluir arreglos de caracteres muy largos se puede simplemente poner uno a continuaci´on de otro (puede ser en diferentes l´ıneas). El CPP se encarga de juntarlos todos en una sola l´ınea: "aaa" "bbbb" es completamente equivalente a "aaabbbb". 1 // Character array Concatenation 2 #include <iostream> 3 using namespace std; 4 5 int main() { 6 cout << "This is far too long to put on a " 7 "single line but it can be broken up with " 8 "no ill effectsnas long as there is no " 9 "punctuation separating adjacent character " 10 "arrays.n"; 11 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 38 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 39. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Entrada de datos cout es console output, cin es console input y permite ingresar datos. 1 // Converts decimal to octal and hex 2 #include <iostream> 3 using namespace std; 4 5 int main() { 6 int number; 7 cout << "Enter a decimal number: "; 8 cin >> number; 9 cout << "value in octal = 0" 10 << oct << number << endl; 11 cout << "value in hex = 0x" 12 << hex << number << endl; 13 } oct y hex son manipulators, cambian el estado de cout. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 39 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 40. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Llamando a otros programas Dentro de la librer´ıa est´andar de C hay una funci´on muy potente system() que permite llamar a otros programas desde un programa en C/C++. Se le pasa un arreglo de caracteres con el comando que uno ejecutar´ıa en la l´ınea de comandos. 1 // Call another program 2 #include <cstdlib> // Declare ‘‘system()’’ 3 using namespace std; 4 5 int main() { 6 system("date -u"); 7 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 40 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 41. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Strings de C Manipular arreglos de caracteres en C se vuelve muy engorroso. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main() { 6 // concatenate two character arrays s1 and s2 7 char s1[ ] = "Hola "; 8 char s2[ ] = "mundo."; 9 cout << strlen(s1) << endl; 10 int n1 = strlen(s1); 11 int n2 = strlen(s2); 12 char *s = new char[n1+n2+1]; 13 strncpy(s,s1,n1); 14 strncpy(s+n1,s2,n2); 15 s[n1+n2] = ’0’; 16 cout << s << endl; 17 delete[ ] s; 18 return 0; 19 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 41 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 42. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Strings de C++ Para eso C++ tiene objetos llamados strings que permiten manipularlos en forma mucho m´as simple y con menor probabilidad de error. 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 // concatenate two character arrays s1 and s2 7 string s1 = "Hola "; 8 string s2 = "mundo."; 9 string s = s1 + s2; 10 cout << s << endl; 11 return 0; 12 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 42 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 43. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Strings de C++ (cont.) 1 //: C02:HelloStrings.cpp 2 // The basics of the Standard C++ string class 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 int main() { 8 string s1, s2; // Empty strings 9 string s3 = "Hello, World."; // Initialized 10 string s4("I am"); // Also initialized 11 s2 = "Today"; // Assigning to a string 12 s1 = s3 + " " + s4; // Combining strings 13 s1 += " 8 "; // Appending to a string 14 cout << s1 + s2 + "." << endl; 15 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 43 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 44. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Escribir y leer de archivos • Las funciones est´an declaradas en el header <fstream>. • Para escritura hay que crear un objeto de tipo ofstream (como cout). • Para lectura hay que crear un objeto de tipo ifstream (como cin). • La funci´on getline(stream,s) lee una l´ınea de stream y la guarda en el string s 1 // Copy one file to another, a line at a time 2 #include <string> 3 #include <fstream> 4 using namespace std; 5 int main() { 6 ifstream in("Scopy.cpp"); // Open for reading 7 ofstream out("Scopy2.cpp"); // Open for writing 8 string s; 9 while(getline(in, s)) // Discards newline char 10 out << s << "n"; // . . . must add it back 11 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 44 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 45. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Escribir y leer de archivos (cont.) Otro ejemplo es guardar todo el archivo en un s´olo string: 1 // Read an entire file into a single string 2 #include <string> 3 #include <iostream> 4 #include <fstream> 5 using namespace std; 6 7 int main() { 8 ifstream in("FillString.cpp"); 9 string s, line; 10 while(getline(in, line)) 11 s += line + "n"; 12 cout << s; 13 } ¿Que pasa si queremos guardar cada l´ınea en un string separado? Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 45 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 46. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz La clase vector • Un vector es un contenedor que permite guardar un n´umero indefinido de elementos en forma contigua e indexada. • Se puede agrandar o achicar en forma din´amica, sin perder los elementos preexistentes. • Est´a templatizado o sea que se pueden definir vectores de diferentes tipos: vector<int>, vector<double>, vector<string>,... • La funci´on push_back() permite agregar un nuevo objeto al final del vector. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 46 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 47. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz La clase vector (cont.) 1 // Copy an entire file into a vector of string 2 #include <string> 3 #include <iostream> 4 #include <fstream> 5 #include <vector> 6 using namespace std; 7 8 int main() { 9 vector<string> v; 10 ifstream in("Fillvector.cpp"); 11 string line; 12 while(getline(in, line)) 13 v.push-back(line); // Add the line to the end 14 // Add line numbers: 15 for(int i = 0; i < v.size(); i++) 16 cout << i << ": " << v[i] << endl; 17 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 47 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 48. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz La clase vector (cont.) vector tambi´en puede guardar cualquier otro tipo, por ejemplo enteros: 1 // Creating a vector that holds integers 2 #include <iostream> 3 #include <vector> 4 using namespace std; 5 6 int main() { 7 vector<int> v; 8 for(int i = 0; i < 10; i++) 9 v.push-back(i); 10 for(int i = 0; i < v.size(); i++) 11 cout << v[i] << ", "; 12 cout << endl; 13 for(int i = 0; i < v.size(); i++) 14 v[i] = v[i] * 10; // Assignment 15 for(int i = 0; i < v.size(); i++) 16 cout << v[i] << ", "; 17 cout << endl; 18 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 48 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 49. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Ejercicios 1. Crear un programa que abre un archivo y cuenta las palabras (separadas por whitespace). Ayuda: el operador >> lee de a palabras de un ifstream. 2. Crear un programa que cuenta la cantidad de caracteres que tiene un archivo. 3. Crear un programa que cuenta la cantidad de ocurrencias de una palabra espec´ıfica en un archivo. Ayuda: usar == para comparar strings. 4. Escribir un programa que imprime las l´ıneas de un archivo de texto en orden inverso. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 49 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 50. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El C en C++ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 50 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 51. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Funciones • Para evitar errores, C/C++ usa el concepto de prototipo o signatura de funciones. • Antes de usar una funci´on hay que declararla. • Al usar la funci´on los argumentos con que es llamada deben coincidir con el el tipo que fueron declarados. 1 int translate(float x, float y, float z); 2 int translate(float, float, float); • En alg´un lugar la funci´on tiene que estar definida, aqu´ı los nombres de los argumentos tienen que aparecer para poder ser usados en la funci´on 1 int translate(float x, float y, float z) { 2 x = y = z; 3 // . . . 4 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 51 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 52. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Valores de retorno • La declaraci´on de la funci´on debe indicar el valor de retorno. Si la funci´on no retorna nada usar void: 1 int f1(void); // Returns an int, takes no arguments 2 int f2(); // Like f1() in C++ but not in Standard C 3 float f3(float, int, char, double); // Returns a float 4 void f4(void); // Takes no arguments, returns nothing • Para retornar el valor usar la sentencia return. • Si la funci´on retorna void entonces no se debe llamar a return. • Se puede tener m´as de un return en la funci´on. Son puntos de salida. • El valor de retorno debe ser compatible con el indicado en la declaraci´on. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 52 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 53. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Valores de retorno (cont.) 1 // Use of ‘‘return’’ 2 #include <iostream> 3 using namespace std; 4 5 char cfunc(int i) { 6 if(i == 0) 7 return ’a’; 8 if(i == 1) 9 return ’g’; 10 if(i == 5) 11 return ’z’; 12 return ’c’; 13 } 14 15 int main() { 16 cout << "type an integer: "; 17 int val; 18 cin >> val; 19 cout << cfunc(val) << endl; 20 } ///:˜ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 53 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 54. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Usando la librer´ıa est´andar de C • C incluye una librer´ıa de funciones est´andar (tambi´en llamada libc). Todos los compiladores que satisfacen la norma deben incluir estas funciones en su libc. Esto permite la portabilidad de los programas entre diferentes compiladores. • Muchos compiladores incluyen funciones adicionales que NO est´an en la norma. Por lo tanto hay que prever que si se lleva el proyecto a otra plataforma puede ser que estas funciones no existan en esa plataforma. • La documentaci´on de las librer´ıas usualmente incluye la declaraci´on de la funci´on y en que header (archivo .h) est´a. • En caso que la librer´ıa no est´e documentada hay que directamente ver los headers para encontrarel prototipo de la funci´on. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 54 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 55. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Control de ejecuci´on. True and False • Todas los condicionales (por ejemplo if o while) usan expresiones l´ogicas como por ejemplo el resultado del operador de comparaci´on A==B. Esta expresi´on retorna directamente un valor l´ogico true o false. No confundiir con el operador de asignaci´on A=B. • Lo mismo ocurre con otros operadores de comparaci´on 1 A==B; //It’s equal? 2 A!=B; //It’s distinct? 3 A<B; //It’s smaller? 4 A<=B; //It’s smaller or equal? 5 A>B; //It’s greater? 6 A>=B; //It’s greater or equal? Si la expresi´on no retorna un valor booleano, entonces C trata de convertirlo. Para todos los valores num´ericos (enteros, float, double, char, punteros) el valor es falso si es cero, y en cualquier otra caso es verdadero. Entonces por ejemplo el valor l´ogico de las siguientes expresiones es equivalente 1 if (n) { . . . } 2 if (n!=0) { . . . . } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 55 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 56. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 3 if (!(n==0)) { . . . . } // ! is negation Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 56 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 57. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz If-else El if puede existir de dos formas, con o sin else 1 if (expression) 2 statement 3 4 // o 5 6 if (expression) 7 statement 8 else 9 statement En ambos casos statement puede ser una sentencia simple, terminada en una coma, o compuesta, es decir un bloque de instrucciones encerrado en {}. 1 if (n>0) x=23; // sentencia simple 2 3 if (n>0) { // sentencia compuesta 4 x=23; 5 s="haha"; 6 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 57 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 58. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz If-else (cont.) 1 int i; 2 cout << "type a number and ’Enter’" << endl; 3 cin >> i; 4 if(i > 5) 5 cout << "It’s greater than 5" << endl; 6 else 7 if(i < 5) 8 cout << "It’s less than 5 " << endl; 9 else 10 cout << "It’s equal to 5 " << endl; 11 12 cout << "type a number and ’Enter’" << endl; 13 cin >> i; 14 if(i < 10) 15 if(i > 5) // ‘‘if’’ is just another statement 16 cout << "5 < i < 10" << endl; 17 else 18 cout << "i <= 5" << endl; 19 else // Matches ‘‘if(i < 10)’’ 20 cout << "i >= 10" << endl; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 58 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 59. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz If-else (cont.) Notar que todo el if act´ua como una sola instrucci´on, por eso no hace falta encerrarlo con un {}. 1 if(i > 5) 2 cout << "It’s greater than 5" << endl; 3 else 4 if(i < 5) 5 cout << "It’s less than 5 " << endl; 6 else 7 cout << "It’s equal to 5 " << endl; 8 9 // es equivalente a 10 11 if(i > 5) { cout << "It’s greater than 5" << endl; } 12 else { 13 if(i < 5) 14 cout << "It’s less than 5 " << endl; 15 else 16 cout << "It’s equal to 5 " << endl; 17 } Es una convenci´on mut ´util indentar ambos bloques del if para mejorar la Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 59 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 60. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz legibilidad. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 60 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 61. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz while while, do-while y for controlan lazos (loops) de ejecuci´on. 1 while(expression) 2 statement Como antes statement puede ser simple o compuesto. La expresi´on se eval´ua hasta que la condici´on de falso. Para que el lazo termine en alg´un momento es necesario que statement tenga alg´un efecto que haga que eventualmente expression de falso 1 int x=0; 2 while (x<5) x=34; // ejecuta una vez el lazo 3 x=0; 4 while (x<5) x=2; // ejecuta indefinidamente 5 6 x=0; 7 while (x<5) x++; // ejecuta el bloque 5 veces Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 61 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 62. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz while (cont.) 1 // Guess a number (demonstrates ‘‘while’’) 2 #include <iostream> 3 using namespace std; 4 5 int main() { 6 int secret = 15; 7 int guess = 0; 8 // != is the not-equal conditional: 9 while(guess != secret) { // Compound statement 10 cout << "guess the number: "; 11 cin >> guess; 12 } 13 cout << "You guessed it!" << endl; 14 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 62 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 63. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz while (cont.) En C la condici´on dentro del condicional puede ser tan elaborada como se quiera, la ´unica restricci´on es que debe retornar un valor l´ogico (o convertible a l´ogico), incluso puede ser que el cuerpo del lazo este vac´ıo 1 while(do-a-lot-of-work()) ; 2 while(do-a-lot-of-work()) { } por ejemplo 1 while(is-prime(n)) n++; // busca el primer n no primo Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 63 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 64. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz do-while 1 do 2 statement 3 while(expression); Es similar al while pero ahora statement es ejecutado antes de verificar la condici´on. 1 n=0; 2 while (n>0) /* body. . .*/ ; // body is not executed 3 4 n=0; 5 do 6 /* body. . .*/ ; // body is executed once 7 while (n>0); Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 64 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 65. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Lazo for La forma del for es 1 for(initialization; conditional; step) 2 statement Se utiliza mucho cuando simplemente se quiere ejecutar un bloque una serie de veces bien definida 1 for (int i=0; i<n; i++) { 2 // This block is executed n times 3 } Esto es completamente equivalente a 1 int i=0; 2 while(i<n) { 3 // This block is executed n times 4 i++; 5 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 65 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 66. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Break and continue Adentro de cualquiera de los bloques while, do-while o for se puede usar break para salir del lazo inmediatamente. 1 while (true) { // Infinite loop 2 cout << "Enter a number: "; 3 cin >> n; 4 if (is-prime(n)) break; 5 cout << n << " es un n´umero compuesto" << endl; 6 } Si hay m´as de un lazo anidado entonces break sale del lazo m´as interno 1 for (int i=0; i<n; i++) { 2 for (int j=0; j<n; j++) { 3 if (j>i*i) break; 4 //. . . 5 } 6 // break transfers execution here 7 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 66 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 67. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Break and continue (cont.) continue es similar a break pero hace que se ejecute la siguiente iteraci´on del lazo 1 for (int j=0; j<n; j++) { 2 //. . . . 3 if (!is-prime(j)) continue; 4 // do this only for primes. . . 5 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 67 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 68. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz La sentencia switch Va comparando la variable selector hasta que coincide con uno de los case 1 switch(selector) { 2 case integral-value1 : statement; break; 3 case integral-value2 : statement; break; 4 case integral-value3 : statement; break; 5 case integral-value4 : statement; break; 6 case integral-value5 : statement; break; 7 (. . .) 8 default: statement; 9 } por ejemplo 1 char c; 2 //. . . 3 switch (c) { 4 case ’a’: cout << "It’s an a" << endl; break; 5 case ’b’: cout << "It’s a b" << endl; break; 6 default: cout << "Neither a or b" << endl; 7 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 68 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 69. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Si no se incluyen los break entonces la ejecuci´on sigue al siguiente case. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 69 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 70. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz goto La sentencia goto permite saltar a otro punto del programa. Se lo considera muchas veces como una mala pr´actica de programaci´on, aunque a veces puede ser ´util, por ejemplo para saltar de varios lazos anidados cuando se encuentra una condici´on. 1 // The infamous goto is supported in C++ 2 #include <iostream> 3 using namespace std; 4 5 int main() { 6 long val = 0; 7 for(int i = 1; i < 1000; i++) { 8 for(int j = 1; j < 100; j += 10) { 9 val = i * j; 10 if(val > 47000) 11 goto bottom; 12 // Break would only go to the outer ’for’ 13 } 14 } 15 bottom: // A label 16 cout << val << endl; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 70 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 71. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 17 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 71 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 72. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Recursion Muchos problemas son intr´ınsecamente recursivos, es decir la soluci´on de un problema est´a dada por la soluci´on de uno menor con el mismo algoritmo, por ejemplo la definici´on de factorial se puede hacer en forma recursiva n! = n · (n − 1)! (1) en realidad esto es cierto si n > 1, la definici´on correcta es n! =    1; si n = 1; n · (n − 1)! ; si n > 1 (2) decimos que el caso n = 1 corta la recursi´on. Usando llamadas recursivas a funciones podemos implementar la funci´on factorial 1 int factorial(int n) { 2 if (n==1) return 1; 3 else return n*factorial(n-1); 4 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 72 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 73. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Recursion (cont.) La recursi´on es muy elegante para resolver problemas, pero puede ser demandante en t´erminos de recursos. Es m´as simple si calculamos el factorial con un lazo 1 int factorial(int n) { 2 int fac=1; 3 for (int j=2; j<=n; j++) fac *= j; 4 return fac; 5 } El operador *= quiere decir aqu´ı 1 fac = fac*j; Se puede aplicar a otros operadores binarios como +*-/, operadores l´ogicos ||&&, concatenaci´on de strings... Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 73 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 74. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores Los operadores no son m´as que funciones, con una sintaxis especial. Un operador toma una o m´as series de valores y devuelve un resultado. 1 a = b + c; podemos pensar que es traducido por el compilador en 1 a = sum(b,c); Una cuesti´on importante con los operadores es la precedencia de los mismos. Para los operadores matem´aticos es similar a las reglas que aprendemos en la escuela 1 a = b * c + d; es equivalente a 1 a = (b * c) + d; porque * tiene mayor precedencia que +. Ante la duda, se pueden introducir par´entesis para forzar el orden en que se eval´uan las expresiones. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 74 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 75. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores de auto incremento El operador ++ es un atajo para una operaci´on muy com´un en programaci´on: incrementar una variable de tipo entero en una unidad. Hay dos variantes, prefija y postfija, ambos tienen el mismo efecto colateral (incrementar la variable) pero en el prefijo retorna el valor de la variable incrementada, y el postfijo sin incrementar 1 int m,n=5; 2 m = n++; // n=6, m=5 3 4 int m,n=5; 5 m = ++n; // n=6, m=6 Por ejemplo la siguiente funci´on retorna el primer primo siguiente (mayor o igual) a n. 1 int next-prime(int n) { 2 while (!is-prime(n++)) { } 3 return n; 4 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 75 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 76. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores de auto incremento (cont.) Tambi´en hay autodecremento -- prefijo y postfijo. 1 int n=10; 2 while (n >= 0) cout << n-- << ", "; 3 cout << "Boom!!" << endl; 1 [mstorti@galileo garage]$$ ./boom.bin 2 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, Boom!! Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 76 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 77. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Tipos de datos Dijimos que C/C++ es un lenguaje de tipeo est´atico, es decir en el momento de crear las variables hay que decir de que tipo son. Hay tipos de datos built-in como enteros, floats, strings, que ya est´an definidos en el compilador, y tambi´en el programador puede crear sus propios tipos, muchas veces por composici´on. Por ejemplo si estamos creando la base de datos de una empresa podemos querer tener un tipo de dato employee que contenga un string (el nombre), un entero (el n´umero de empleado) y un float (el sueldo). Los tipos built-in son • char un entero de al menos 8 bits, usualmente se usa para almacenar caracteres. • int un entero de al menos 16 bits (2 bytes) • float un n´umero de punto flotante con al menos 4 bytes (simple precisi´on) • double un n´umero de punto flotante con al menos 8 bytes (doble precisi´on). Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 77 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 78. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Tipos de datos (cont.) 1 // Defining the four basic data 2 // types in C and C++ 3 4 int main() { 5 // Definition without initialization: 6 char protein; 7 int carbohydrates; 8 float fiber; 9 double fat; 10 // Simultaneous definition & initialization: 11 char pizza = ’A’, pop = ’Z’; 12 int dongdings = 100, twinkles = 150, 13 heehos = 200; 14 float chocolate = 3.14159; 15 // Exponential notation: 16 double fudge-ripple = 6e-4; 17 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 78 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 79. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Tipos de datos (cont.) Como los tipos b´asicos tienen una cantidad de bits fija pueden representar un tama˜no m´aximo. Por ejemplo los enteros de 16 bits s´olo pueden estar entre -32768 y +32768. Adem´as el tama˜no del tipo (la cantidad de bits) puede depender de la m´aquina y del compilador, entonce los valores m´aximos y m´ınimos (los l´ımites) est´an definidos en headers float.h y limits.h, 1 #include <climits> 2 3 cout << "Minimum and maximum integers are " 4 << endl << INT-MIN << " and " << INT-MAX 5 << endl; 6 } 1 [mstorti@galileo garage]$$ ./intmax.bin 2 Minimum and maximum integers are 3 -2147483648 and 2147483647 Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 79 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 80. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Especificadores • Para representar enteros se utiliza un bit de los 32 disponibles para representar el signo. • Si s´olo se van a utilizar enteros positivos entonces podemos usar ese bit para extender un factor 2 el rango. • int en el rango [-2147483648,2147483647] • unsigned int en el rango [0,4294967295] unsigned es un specifier, otros son: signed, unsigned, short, long. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 80 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 81. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Especificadores (cont.) 1 //: C03:Specify.cpp 2 // Demonstrates the use of specifiers 3 #include <iostream> 4 using namespace std; 5 6 int main() { 7 char c; 8 unsigned char cu; 9 int i; 10 unsigned int iu; 11 short int is; 12 short iis; // Same as short int 13 unsigned short int isu; 14 unsigned short iisu; 15 long int il; 16 long iil; // Same as long int 17 unsigned long int ilu; 18 unsigned long iilu; 19 float f; 20 double d; 21 long double ld; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 81 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 82. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 22 cout 23 << "n char= " << sizeof(c) 24 << "n unsigned char = " << sizeof(cu) 25 << "n int = " << sizeof(i) 26 << "n unsigned int = " << sizeof(iu) 27 << "n short = " << sizeof(is) 28 << "n unsigned short = " << sizeof(isu) 29 << "n long = " << sizeof(il) 30 << "n unsigned long = " << sizeof(ilu) 31 << "n float = " << sizeof(f) 32 << "n double = " << sizeof(d) 33 << "n long double = " << sizeof(ld) 34 << endl; 35 } ///:˜ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 82 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 83. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Especificadores (cont.) 1 [mstorti@galileo garage]$$ ./sizes.bin 2 3 char= 1 4 unsigned char = 1 5 int = 4 6 unsigned int = 4 7 short = 2 8 unsigned short = 2 9 long = 8 10 unsigned long = 8 11 float = 4 12 double = 8 13 long double = 16 14 [mstorti@galileo garage]$$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 83 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 84. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros Al declarar variables lo que estamos haciendo es dar un nombre a un pedazo de la memoria. Cuando decimos int n lo que estamos diciendo al compilador es: res´erveme 4 bytes de la memoria y a partir de ahora lo voy a llamar n. El operador & nos muestra en que posici´on de la memoria fue alocada la variable 1 int n; 2 cout << "variable n is in position " << &n << endl; 1 [mstorti@galileo garage]$$ ./ptr.bin 2 variable n is in position 0x7fff1c46d92c Los punteros son impresos normalmente en formato de hexadecimales, si quisi´eramos verlo en formato decimal podemos castear (convertir) el puntero a un entero 1 int n; 2 cout << "variable n is in position " << (long)&n << endl; 1 [mstorti@galileo garage]$$ ./ptr.bin 2 variable n is in position 140737075615260 Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 84 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 85. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) 1 #include <iostream> 2 using namespace std; 3 4 int dog, cat, bird, fish; 5 6 void f(int pet) { 7 cout << "pet id number: " << pet << endl; 8 } 9 10 int main() { 11 int i, j, k; 12 cout << "f(): " << (long)&f << endl; 13 cout << "dog: " << (long)&dog << endl; 14 cout << "cat: " << (long)&cat << endl; 15 cout << "bird: " << (long)&bird << endl; 16 cout << "fish: " << (long)&fish << endl; 17 cout << "i: " << (long)&i << endl; 18 cout << "j: " << (long)&j << endl; 19 cout << "k: " << (long)&k << endl; 20 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 85 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 86. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) El resultado es 1 [mstorti@galileo garage]$$ ./pointers.bin 2 f(): 4196630 3 dog: 6295956 4 cat: 6295960 5 bird: 6295964 6 fish: 6295968 7 i: 140736631158572 8 j: 140736631158568 9 k: 140736631158564 10 [mstorti@galileo garage]$$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 86 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 87. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) • La direcci´on en memoria de un variable puede cambiar de una corrida a otra. • Funciones, variables y globales parecen estar en sectores de la memoria diferentes. • Enteros parecen ocupar 4 bytes. • Las posiciones en la memoria se pueden guardar en una variable de tipo especial llamada puntero 1 int number; 2 int *number-p = &number; • El sufijo _p o simplemente p indica que es un puntero (es s´olo una convenci´on). Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 87 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 88. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) • Algunos programadores ponen el * junto al tipo. 1 int* number-p; Es totalmente equivalente, pero confuso, 1 int* number-p,n-p,m-p; Declara a number_p, pero n_p y m_p son declarados enteros. Lo correcto es 1 int *number-p,*n-p,*m-p; • Podemos asignar a una variable de tipo puntero la direcci´on de una variable, lo cual nos permite modificarla a trav´es de ese proxy 1 int number=100; 2 int *number-p = &number; 3 *number-p = 25; // Ahora number contiene 25!! Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 88 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 89. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) • OJO: el hecho de declarar una variable de tipo puntero no significa que est´e apuntando a un objeto v´alido, es deber del programador asignarle al puntero una posici´on v´alida, si no puede dar error en tiempo de ejecuci´on al querer usar el puntero. 1 int *p; 2 cout << "contenido de *p " << *p << endl; // ERROR 3 int x; 4 p = &x; 5 cout << "contenido de *p " << *p << endl; // OK Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 89 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 90. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) Los punteros tienen un mont´on de usos, el primero que veremos es el de causar que una funci´on modifique un objeto. El mecanismo de paso de variables en C/C++ es por copia. 1 #include <iostream> 2 using namespace std; 3 4 void f(int a) { 5 cout << "&a = " << &a << endl; 6 cout << "a = " << a << endl; 7 a = 5; 8 cout << "a = " << a << endl; 9 } 10 11 int main() { 12 int x = 47; 13 cout << "&x = " << &x << endl; 14 cout << "x = " << x << endl; 15 f(x); 16 cout << "x = " << x << endl; 17 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 90 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 91. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) Imprime: 1 [mstorti@galileo sources]$$ ./try40.bin 2 &x = 0x7ffe99dd33ec 3 x = 47 4 &a = 0x7ffe99dd33bc 5 a = 47 6 a = 5 7 x = 47 8 [mstorti@galileo sources]$$ x = 47 Como la variable a en f() es una copia, resulta que la modificaci´on que se hace en f() no persiste, de manera que queda el mismo valor. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 91 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 92. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) En esta versi´on en cambio, pasamos la direcci´on donde est´a x: 1 #include <iostream> 2 using namespace std; 3 4 void f(int* p) { 5 cout << "p = " << p << endl; 6 cout << "*p = " << *p << endl; 7 *p = 5; 8 cout << "p = " << p << endl; 9 } 10 11 int main() { 12 int x = 47; 13 cout << "x = " << x << endl; 14 cout << "&x = " << &x << endl; 15 f(&x); 16 cout << "x = " << x << endl; 17 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 92 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 93. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros (cont.) Imprime: 1 [mstorti@galileo sources]$ ./try41.bin 2 x = 47 3 &x = 0x7ffcf3047dcc 4 p = 0x7ffcf3047dcc 5 *p = 47 6 p = 0x7ffcf3047dcc 7 x = 5 8 [mstorti@galileo sources]$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 93 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 94. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Referencias Los punteros son muy ´utiles pero engorrosos porque hay que estar dereferenciando al puntero cada vez. C++ introdujo las referencias que son completamente equivalentes a los punteros pero evitan la dereferenciaci´on. 1 #include <iostream> 2 using namespace std; 3 4 void f(int& r) { 5 cout << "r = " << r << endl; 6 cout << "&r = " << &r << endl; 7 r = 5; 8 cout << "r = " << r << endl; 9 } 10 11 int main() { 12 int x = 47; 13 cout << "x = " << x << endl; 14 cout << "&x = " << &x << endl; 15 f(x); // Looks like pass-by-value, 16 // is actually pass by reference 17 cout << "x = " << x << endl; 18 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 94 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 95. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Referencias (cont.) Imprime: 1 [mstorti@galileo sources]$ ./try42.bin 2 x = 47 3 &x = 0x7ffd244d1aac 4 r = 47 5 &r = 0x7ffd244d1aac 6 r = 5 7 x = 5 8 [mstorti@galileo sources]$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 95 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 96. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros a void • El compilador s´olo acepta que asignemos a una variable de tipo int* la direcci´on de una variable de tipo int, en otro caso da un error 1 int *p; 2 int n; 3 p = &n; // OK 4 double a; 5 p = &a; // Error • El tipo void* permite almacenar un puntero a cualquier tipo de variable 1 void* vp; 2 char c; 3 int i; 4 float f; 5 double d; 6 vp = &c; 7 vp = &i; 8 vp = &f; 9 vp = &d; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 96 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 97. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros a void (cont.) • Una vez que una direcci´on es asignada a un void* el compilador no puede saber de que tipo es el objeto al cual apunta, y por lo tanto no se puede dereferenciar 1 int i = 99; 2 void* vp = &i; 3 *vp = 3; // Error de compilacion • Para poder recuperar el objeto tenemos que castear el puntero, de esa forma le estamos diciendo al compilador que es del tipo indicado 1 int i = 99; 2 void* vp = &i; 3 *((int*)vp) = 3; // OK! • Si casteamos al tipo incorrecto el compilador no protesta, pero se puede producir un error en tiempo de ejecuci´on 1 int i = 99; 2 void* vp = &i; 3 // Compila OK, posible error en tiempo de ejecuci´on 4 *((string*)vp) = "Hello world"; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 97 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 98. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Scope de las variables Una variable existe desde su definici´on hasta la siguiente llave que cierra (}). Eso se llama el scope de la variable. 1 // How variables are scoped 2 int main() { 3 int scp1; 4 // scp1 visible here 5 { 6 // scp1 still visible here 7 //. . . . . 8 int scp2; 9 // scp2 visible here 10 //. . . . . 11 { 12 // scp1 & scp2 still visible here 13 //. . 14 int scp3; 15 // scp1, scp2 & scp3 visible here 16 // . . . 17 } // scp3 destroyed here 18 // scp3 not available here Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 98 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 99. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 19 // scp1 & scp2 still visible here 20 // . . . 21 } // scp2 destroyed here 22 // scp3 & scp2 not available here 23 // scp1 still visible here 24 //. . 25 } // scp1 destroyed here Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 99 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 100. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Definiendo variables on-the-fly En C todas las variables deben ser definidas al comienzo del scope. En C++ se pueden definir en cualquier lugar. 1 // On-the-fly variable definitions 2 #include <iostream> 3 using namespace std; 4 5 int main() { 6 //. . 7 { // Begin a new scope 8 int q = 0; // C requires definitions here 9 //. . 10 // Define at point of use: 11 for(int i = 0; i < 100; i++) { 12 q++; // q comes from a larger scope 13 // Definition at the end of the scope: 14 int p = 12; 15 } 16 int p = 1; // A different p 17 } // End scope containing q & outer p 18 cout << "Type characters:" << endl; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 100 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 101. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 19 while(char c = cin.get() != ’q’) { 20 cout << c << " wasn’t it" << endl; 21 if(char x = c == ’a’ | | c == ’b’) 22 cout << "You typed a or b" << endl; 23 else 24 cout << "You typed " << x << endl; 25 } 26 cout << "Type A, B, or C" << endl; 27 switch(int i = cin.get()) { 28 case ’A’: cout << "Snap" << endl; break; 29 case ’B’: cout << "Crackle" << endl; break; 30 case ’C’: cout << "Pop" << endl; break; 31 default: cout << "Not A, B or C!" << endl; 32 } 33 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 101 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 102. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Definiendo variables on-the-fly (cont.) Las variables que est´an fuera de todas las funciones son globales, su scope es todo el programa, inclu´ıdo dentro de las funciones. 1 // == file1.cpp == 2 // Demonstration of global variables 3 #include <iostream> 4 using namespace std; 5 6 int globe; 7 void func(); 8 int main() { 9 globe = 12; 10 cout << globe << endl; 11 func(); // Modifies globe 12 cout << globe << endl; 13 } 14 // == file2.cpp == 15 // Accessing external global variables 16 extern int globe; 17 // (The linker resolves the reference) 18 void func() { Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 102 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 103. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 19 globe = 47; 20 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 103 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 104. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Variables locales Las variables que existen dentro de un scope son locales, tambi´en se les llama autom´aticas ya que son creadas en el momento de llegar a ese bloque. La memoria que le es asignada no tiene porque ser siempre la misma, por lo tanto la variable no retiene el valor que le fue asignado antes. 1 void f(int x) { 2 int a; 3 cout << "a en f(): " << a << endl; 4 cout << "&a en f(): " << &a << endl; 5 a=x; 6 cout << "a en f() despues de asignar: " << a << endl; 7 } 8 9 void g(int x) { 10 int a; 11 cout << "a en g(): " << a << endl; 12 cout << "&a en g(): " << &a << endl; 13 a=x; 14 cout << "a en g() despues de asignar: " << a << endl; 15 } 16 17 void h(int x) { Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 104 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 105. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 18 int a; 19 f(435); 20 cout << "a en h(): " << a << endl; 21 cout << "&a en h(): " << &a << endl; 22 a=x; 23 cout << "a en h() despues de asignar: " << a << endl; 24 } 25 26 int main() { 27 f(23); 28 g(45); 29 f(23); 30 g(45); 31 h(234); 32 return 0; 33 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 105 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 106. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Variables locales (cont.) El resultado es: 1 [mstorti@galileo garage]$$ ./try2.bin 2 a en f(): 0 3 &a en f(): 0x7fff6df56d1c 4 a en f() despues de asignar: 23 5 a en g(): 23 6 &a en g(): 0x7fff6df56d1c 7 a en g() despues de asignar: 45 8 a en f(): 45 9 &a en f(): 0x7fff6df56d1c 10 a en f() despues de asignar: 23 11 a en g(): 23 12 &a en g(): 0x7fff6df56d1c 13 a en g() despues de asignar: 45 14 a en f(): 59 15 &a en f(): 0x7fff6df56cdc 16 a en f() despues de asignar: 435 17 a en h(): 45 18 &a en h(): 0x7fff6df56d1c Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 106 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 107. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz 19 a en h() despues de asignar: 234 20 [mstorti@galileo garage]$$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 107 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 108. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Punteros a variables locales Si una variable sale de scope, es un error tratar de utilizar punteros que apuntaban a esa variable. 1 int *p; 2 for (int j=0; j<N; j++) { 3 int z; 4 p = &z; 5 . . . 6 } 7 // ERROR (z no existe mas) 8 cout << "contenido de *p " << *p << endl; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 108 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 109. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Variables est´aticas Si queremos que el ´area asignada a una variable local sea siempre el mismo, entonces le agregamos el keyword static. Un ejemplo cl´asico es una funci´on que cuenta cuantas veces fue llamada: 1 void f() { 2 static int count=0; 3 cout << "f() fue llamada " << count << " veces" << endl; 4 cout++; 5 } 6 7 int main() { 8 for (int j=0; j<10; j++) 9 f(); 10 return 0; 11 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 109 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 110. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Variables est´aticas (cont.) El resultado es: 1 [mstorti@galileo garage]$ ./try14.bin 2 f() fue llamada 0 veces 3 f() fue llamada 1 veces 4 f() fue llamada 2 veces 5 f() fue llamada 3 veces 6 f() fue llamada 4 veces 7 f() fue llamada 5 veces 8 f() fue llamada 6 veces 9 f() fue llamada 7 veces 10 f() fue llamada 8 veces 11 f() fue llamada 9 veces 12 [mstorti@galileo garage]$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 110 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 111. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Constantes Si se utilizar´a muchas veces un valor que es constante se pueden hacer a trav´es de un macro 1 #define PI 3.141459 o bien a trav´es de una variable de tipo const 1 const double pi = 3.141459; Es m´as prolijo esto ´ultimo (le permite al compilador hacer chequeo de tipo). Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 111 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 112. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores. Asignaci´on El caracter = se utiliza como el operador de asignaci´on: 1 A=4; Lo que est´a a la izquierda de = es el lvalue y lo que est´a a la derecha el rvalue. El rvalue puede ser cualquier expresi´on. El compilador la evalua y asigna el resultado a lo que est´a en el lvalue. Ahora bien lo que est´a en el lvalue no puede ser cualquier cosa, debe ser una variable o cualquier otra cosa a la cual se le pueda asignar un valor. Por ejemplo no puede ser una constante, es decir no podemos hacer 1 4=A; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 112 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 113. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores matem´aticos Los operadores matem´aticos binarios usuales son +-*/. Cada uno de ellos se puede usar en forma de acumulaci´on +=, -=, *=, /=. Por ejemplo 1 x += 5; es equivalente a 1 x = x + 5; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 113 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 114. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores relacionales Son 1 >, <, >=, <=, ==, != Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 114 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 115. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores l´ogicos Son && (and) y || (or). Recordar que en C/C++ muchos tipos se castean autom´aticamente a bool, siendo 0 el valor falso y cualquier otro valor verdadero. Cuando se imprimen los valores booleanos dan 0 o 1. ! es la negaci´on. Son operadores cortocircuitados es decir si hacemos 1 expr1 && expr2 entonces primero se evalua expr1 y si da falso, entonces expr2 NO se eval´ua, ya que no es necesario porque la expresi´on l´ogica resultar´a en falso de todas formas. Eso puede ser importante, por ejemplo 1 if (n>0 && m/n!=3) . . . est´a garantizado que no dar´a error si n==0 ya que si es as´ı directamente la divisi´on por n no se har´a. Lo mismo ocurre en 1 expr1 | | expr2 si la primera da verdadero. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 115 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 116. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz El operador hook Es una forma muy compacta de escribir un if-else. Por ejemplo esta expresi´on calcula el m´ınimo de dos valores 1 x = (m<n ? m : n); Se puede usar tambi´en en un lvalue. La siguiente expresi´on asigna al menor de m,n el valor 23. 1 (m<n ? m : n) = 23; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 116 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 117. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Errores comunes con los operadores • Las reglas de precedencia a veces son simples, pero si se escriben expresiones complejas ya no. Ante la duda utilizar par´entesis. • No confundir = con ==. Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 117 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 118. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operadores de cast • Si el compilador ve que estamos mezclando tipos en una asignaci´on, insertar´a una operaci´on de cast (conversi´on de tipo) autom´aticamente 1 int x=5; 2 double z=x; // OK 3 z=23.3; 4 x=z; // se pierde la mantisa (truncamiento) 5 x = (int) z; // cast explicito 6 x = int(z); // otra forma del cast explicito 7 8 int ixp = &x; // error, no puede convertir ptr a int 9 long int ixp2 = (long int)&x; // OK! 10 long int ixp3 = static-cast<long int>(&x); // OK! Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 118 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 119. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Operador sizeof • Retorna el tama˜no de una variable o tipo en bytes 1 cout << "sizeof(char) " << sizeof(char) << endl; // ->1 2 cout << "sizeof(int) " << sizeof(int) << endl; // ->4 3 cout << "sizeof(float) " << sizeof(float) << endl; // ->4 4 cout << "sizeof(double) " << sizeof(double) << endl; // ->8 5 6 double a; 7 cout << "sizeof(a) " << sizeof(a) << endl; // ->8 8 cout << "sizeof(&a) " << sizeof(&a) << endl; // ->8 (in x86-64) 9 int x; 10 cout << "sizeof(&x) " << sizeof(&x) << endl; // ->8 (in x86-64) Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 119 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 120. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz typedef: Aliases de tipos • Permite hacer un alias de un tipo a un nuevo tipo 1 typedef unsigned long int ulong; 2 . . . 3 ulong x; • Simple para tipos b´asicos, m´as complicado para punteros 1 typedef int *int-p; • La regla es que se escribe una l´ınea como la declaraci´on de una variable con typedef al principio y reemplazando la variable por el tipo. • Esto permite hacer expresiones m´as cortas pero adem´as tiene un uso muy importante. Permitir cambiar de tipo todas las variables de un programa 1 typedef float scalar; 2 scalar i,j,k; Para cambiar todo el programa a doble precisi´on: 1 typedef double scalar; Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 120 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 121. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructuras • Se pueden definir nuevos tipos agrupando varios miembros en una estructura. Los miembros de la estructura se toman con el operador .: 1 struct A { 2 char c; 3 int m; 4 float f; 5 double b; 6 }; 7 8 void printa(A a) { 9 cout << "structure is (" << a.c << "," << a.m << "," 10 << a.f << "," << a.b << ")" << endl; 11 } 12 . . . 13 14 A a1, a2; 15 a1.c = ’h’; 16 a2.m = 23; 17 printa(a1); Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 121 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 122. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructuras (cont.) Se pueden tomar punteros a estructuras y enlazarlas 1 struct cell { 2 char c; 3 double x; 4 cell *next; 5 }; 6 7 int main() { 8 cell c1,c2,c3; 9 c1.c = ’a’; c1.x = 1; c1.next = &c2; 10 c2.c = ’b’; c2.x = 2; c2.next = &c3; 11 c3.c = ’c’; c3.x = 3; c3.next = &c1; 12 13 cell *cp = &c1; 14 for (int k=0; k<20; k++) { 15 cout << "cp " << cp << ", c " 16 << (*cp).c << ", x " << (*cp).x << endl; 17 cp = (*cp).next; 18 } 19 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 122 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 123. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructuras (cont.) 1 cell c1,c2,c3; 2 c1.c = ’a’; c1.x = 1; c1.next = &c2; 3 c2.c = ’b’; c2.x = 2; c2.next = &c3; 4 c3.c = ’c’; c3.x = 3; c3.next = &c1; c='a' x=1 next c1 c='b' x=2 next c2 c='c' x=3 next c3 Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 123 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 124. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Estructuras (cont.) El resultado es 1 [mstorti@galileo garage]$$ ./try8.bin 2 cp 0x7fff571b2d20, c a, x 1 3 cp 0x7fff571b2d00, c b, x 2 4 cp 0x7fff571b2ce0, c c, x 3 5 cp 0x7fff571b2d20, c a, x 1 6 . . . 7 cp 0x7fff571b2d20, c a, x 1 8 cp 0x7fff571b2d00, c b, x 2 9 [mstorti@galileo garage]$$ Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 124 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))
  • 125. Programaci´on en C++ para Ciencia e Ingenier´ıa, por M.Storti, L. Dalc´ın, Rodrigo Paz Arrow operator Como en el ejemplo anterior es muy com´un la compinaci´on (*cp).x es decir tener un puntero a una estructura cp y querer tomar un miembro x de la estructura apuntada. Como es tan com´un hay un atajo sint´actico para eso 1 (*cp).x es equivalente a cp->x Entonces el lazo del programa anterior pasa a ser 1 for (int k=0; k<20; k++) { 2 cout << "cp " << cp << ", c " << cp->c 3 << ", x " << cp->x << endl; 4 cp = cp->next; 5 } Facultad de Ingenier´ıa y Ciencias H´ıdricas FICH - UNL slide 125 ((version texstuff-1.2.9-12-ge83ced6) (date Wed May 27 12:15:38 2015 -0300) (processed-date Wed May 27 12:45:10 2015 -0300))