Programacion en C++ para Ciencia e Ingeniería

361
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))

Transcript of Programacion en C++ para Ciencia e Ingeniería

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Programacion en C++ para Ciencia eIngeniera

    Mario Storti, Lisandro Dalcn, Rodrigo Pazhttp://www.cimec.org.ar/prog

    Facultad de Ingeniera y Ciencias HdricasUniversidad Nacional del Litoral http://www.unl.edu.ar

    Centro de Investigacion de Metodos Computacionales - CIMECINTEC, (CONICET-UNL), http://www.cimec.org.ar

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Autores

    Mario Storti Lisandro Dalcn, Rodrigo Paz,

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Contents

    slide 11.....Elementos basicos de programacion. slide 13.....Compilacion vs. interpretes. slide 14.....El proceso de compilacion. slide 16.....El preprocesador CPP. slide 19.....Chequeo de tipos. slide 20.....Compilacion por separado. slide 22.....Declaraciones y definiciones. slide 24.....Definiciones y declaraciones de variables. slide 26.....Incluyendo headers. slide 29.....Usando libreras. 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.....Concatenacion de arreglos de caracters. slide 39.....Entrada de datos. slide 40.....Llamando a otros programas

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 librera estandar de C. slide 55.....Control de ejecucion. 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 estaticas

    . slide 111.....Constantes

    . slide 112.....Operadores. Asignacion

    . slide 113.....Operadores matematicos

    . slide 114.....Operadores relacionales

    . slide 115.....Operadores logicos

    . 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 operatorFacultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    . slide 126.....Enums

    . slide 129.....Arreglos de estructuras

    . slide 130.....Punteros y arreglos

    . slide 132.....Arreglos de punteros

    . slide 136.....Aritmetica de punteros

    . slide 138.....Tamanos de estructuras slide 139.....Programacion Orientada a Objetos. slide 140.....Abstraccion de datos. slide 150.....POO basica. slide 160.....Inclusion de headers. slide 164.....Estructuras enlazadas. slide 172.....Mas sobre scoping. slide 173.....Tipos Abstractos de Datos (ADT). slide 174.....Ocultando la implementacion. 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 implementacion. slide 191.....Inicializacion y cleanup

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    . slide 193.....El constructor

    . slide 194.....El destructor

    . slide 197.....Eliminacion del bloque de definicion

    . slide 199.....Clase stash con ctor/dtor

    . slide 203.....Stack con ctor/dtor

    . slide 206.....Initializacion de agregados

    . slide 207.....Inicializacion 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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.....Creacion dinamica de objetos. slide 276.....Uso de la memoria dinamica en C. slide 277.....Uso de la memoria dinamica en C++. slide 279.....Porque usar new y no arreglos. slide 280.....Memory exhaust. slide 281.....Composicion. slide 283.....Composicion y la cadena de inicializacion. slide 284.....Herencia. slide 287.....Redefinicion de metodos. 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. Version cruda. slide 315.....Integral 2D. Version mejorada

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 librera STL. slide 328.....La librera 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.....Programacion funcional

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Dictado

    Docentes de la catedra:. Mario Storti . Lisandro Dalcn, . Rodrigo Paz,

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Elementos basicos de

    programacion

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    I KNOW C++!

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Compilacion vs. interpretes

    Algunos lenguajes de programacion tienen un interprete, por ejemploMatlab/Octave, Python, Perl, Lisp/Scheme. En un interprete el usuario vaemitiendo comandos que son interpretados por el interprete y vadevolviendo un resultado.

    Por contraposicion, los lenguajes compilados el usuario escribe unarchivo con lneas de codigo, el cual es procesado por un compilador, quegenera codigo de maquina, el cual es ejecutado directamente por elprocesador.

    Ventajas de la compilacion: el codigo suele ser mas rapido, y mascompacto.

    Desventajas: el paso de codigo a ejecutarlo es inmediato, no hay pasosintermedios. Usualmente los interpretes permiten escribir tareas que serepiten comunmente en archivos de texto (scripts). El usuario puedeademas mezclar estas funciones con comandos directamente en elinterprete. Tambien con los interprete es mas facil debuggear.

    C++ es un lenguaje compilado.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El proceso de compilacion

    El caso mas simple es cuando todo el codigo del programa esta en unsolo 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

    caso1 $$ g++ -o prog prog1.cpp prog2.cpp

    Esto requiere recompilar cada vez todos los *.cpp, si son muchosconviene hacer

    1 $$ g++ -o prog1.o -c prog1.cpp2 $$ g++ -o prog2.o -c prog2.cpp3 $$ g++ -o prog prog1.o prog2.o

    Los archivos .o son objeto, contienen codigo de maquina. (No tienerelacion con la Programacion Orientada a Objetos).

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El proceso de compilacion (cont.)

    Si solo se modifica uno de los archivos (prog1.cpp), entonces solo hacefalta recompilar ese.

    1 $$ g++ -o prog1.o -c prog1.cpp2 $$ g++ -o prog prog1.o prog2.o

    Para mejor organizacion, si hay muchos *.o conviene ponerlos en unalibrera

    1 $$ g++ -o prog1.o -c prog1.cpp2 $$ g++ -o prog2.o -c prog2.cpp3 $$ g++ -o prog3.o -c prog3.cpp4 $$ ar r libprog.a prog1.o prog2.o prog3.o5 $$ g++ -o prog main.cpp libprog.a

    A veces la librera puede ser que haya sido desarrollada por un tercero:libpetsc.a, libmkl.a.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El preprocesador CPP

    Muchas veces hay texto que se repite muchas veces en el codigo. En esecaso se pueden usar macros

    1 int v[100000];2 if (n

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El preprocesador CPP (cont.)

    CPP solo realiza manipulaciones a nivel de texto, no conoce nadaespecfico del lenguaje C/C++, incluso puede usarse (y se usa) para otroslenguajes como Fortran.

    Las directivas mas usuales son1 // Incluye todo el texto del archivo library.h2 #include 3

    4 #define CHECK(a,n) if (a>n) error()

    Para #include el preprocesador simplemente incluye todo el archivomencionado en el punto donde se invoca el include.

    #define define un macro, despues se puede llamar al macro en otroslugares del codigo y es reemplazado por su expansion. Los macrospueden tener argumentos. Por convencion se suele dar a los macrosnombres en mayusculas.

    Se puede conocer cual es el resultado del CPP llamando a g++ con laopcion -E

    1 $$ g++ -o tempo.cpp -E prog.cpp

    El CPP es un programa separado que se puede llamar por s mismoFacultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    (/usr/bin/cpp).

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Chequeo de tipos

    C++ es un lenguaje tipado (aka tipeo estatico, en ingles typed language),es decir las variables tienen tipos definidos. El compilador chequea quelos resultados de las expresiones que se asignan a las variablescorrespondan al tipo con el cual fueron definidas, caso contrario seproduce un error en tiempo de compilacion. Esto es bueno porquepermite detectar tempranamente errores. (Es equivalente al chequeo deunidades en Fsica).

    1 // error: asigna un string a una variable entera2 int a;3 a = "Hello";

    Otros lenguajes (sobre todos los interpretados) hacen chequeo dinamicode tipo, esto implica una perdida de eficiencia.

    El chequeo se hace tambien para los argumentos de una funcion1 void fun(int a,string s);2 . . .3 fun(23,45); // ERROR (45 no es un string!)

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Compilacion por separado

    En C++ se favorece que un programa grande se pueda dividir enfracciones mas pequenas. El mecanismo fundamental para dividir unprograma en partes mas pequenas es usar funciones que realizan tareasbien definidas. Por ejemplo podemos pensar en una funcion intgcd(int,int); que toma dos enteros y retorna el maximo comun divisorde los mismos.

    Las funciones tienen argumentos, una vez que la funcion termina sutarea, retorna un valor. Tambien puede ser que las funciones tenganefectos colaterales (side effects) es decir que modifiquen susargumentos u otros objetos.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Compilacion por separado (cont.)

    Para crear un programa que este dividido en varios archivos, el codigo deun archivo debe poder usar las funciones del otro. Supongamos que unarchivo prog1.cpp contiene a la funcion gcd(). Si queremos usar a gcd()en el codigo de otro archivo prog2.cpp entonces el compilador debe estarseguro que el tipo de los argumentos que se le van a pasar son loscorrectos. Para eso hay que declarar a la funcion en prog2.cpp antes depoder llamarla

    1 int gcd(int,int); // declara gcd()2 . . .3 r = gcd(m,n); // la puede usar porque ya4 // fue declarada

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Declaraciones y definiciones

    Una declaracion le dice al compilador que esa funcion existe y suprototipo o signatura, es decir el tipo de argumentos de entrada y desalida. Por ejemplo

    1 int gcd(int,int);

    La definicion por otra parte dice especficamente como la funcion realizasu 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Declaraciones y definiciones (cont.)

    Cada funcion puede estar declarada varias veces en un archivo (mientrasla signatura de la funcion 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 funcion solo puede estar definida una sola vez en todoslos archivos del programa, ya que si no el compilador no sabra cual usar.

    1 // archivo prog1.cpp2 int f(int x) { return 2*x; }3

    4 // archivo prog2.cpp5 int f(int x) { return 3*x; }6 // -> ERROR: multiplemente definida

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Definiciones y declaraciones de variables

    Si declaramos una variable, por ejemplo

    1 int m;

    si bien parace una declaracion, en realidad ya tiene toda la informacion paraconstruir al objeto (un entero de 4 bytes) por lo tanto el compilador lo tomaademas como una definicion. Por eso no podemos incluir dos veces estadeclaracion/definicion, aunque sea del mismo tipo.

    1 int m;2 . . .3 int m; // ERROR

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Definiciones y declaraciones de variables (cont.)

    Si queremos forzar a que sea una declaracion y no una definicionentonces debemos usar el keyword extern

    1 extern int m;2 . . .3 extern int m; // OK4 . . .5 int m; // OK

    extern se puede usar tambien con las funciones, para hacer hincapie enque es una declaracion, por ejemplo

    1 extern int f(int x);

    pero no es necesario.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Incluyendo headers

    Es usual que en nuestros programas escribamos una serie de funcionesque despues utilizaremos en otras partes del programa.

    1 // utils.cpp2 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.cppprimero tenemos que declararlas

    1 // prog.cpp2 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    uno de los archivos prog1.cpp, prog2.cpp... y utils.cpp tiene cientos defunciones. Entonces para resolver esto incluimos todas las declaracionesen un archivo header (cabecera) utils.h:

    1 // utils.h2 int gcd(int m,int n);3 double cos(double alpha);4 double sin(double alpha);

    Entonces despues en prog1.cpp hay que solo incluir el header:1 // prog1.cpp2 #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 encargade buscar el archivo header y crear un archivo temporario donde la lineadel include es reemplazada por los contenidos del archivo.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Incluyendo headers (cont.)

    Hay dos versiones de include,

    Una que especifica archivos en forma relativa o absoluta1 #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 usuariodefine en el comando de compilacion

    1 $$ g++ -I/home/mstorti/utils -c -o prog.o prog.cpp

    1 // lo encuentra en /home/mstorti/utils2 #include 3 // lo encuentra en /home/mstorti/utils/src4 #include 5 . . .

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Usando libreras

    Entonces si tengo que usar una librera matrix que esta compuesta devarios archivos fuente matrix2.cpp, matrix1.cpp, matrix3.cpp... en realidadno hace falta que compile todos estos archivos, mientras que eldesarrollador de esa librera provea. Un archivo libmatrix.a con todos los matrix.cpp compilados.. Un archivo header con las declaraciones de las funciones matrix.h.

    Entonces para usar la librera basta con incluir el header1 // myprog.cpp2 #include 3 . . .

    y al linkeditar incluir la librera

    1 $$ g++ myprog.cpp /usr/lib/libmatrix.a -o myprog

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Formato de include para C++

    La extension que se usa para los archivos fuente puede ser .cpp, .cxx.Para los headers se utiliza .h, .hpp, .hxx.

    Para evitar confusiones y ambiguedad con las extensiones, C++ introdujoel concepto de include sin extension. El traductor se encarga de convertirel nombre y buscar la extension.

    1 #include

    Existe una librera con muchas funciones muy utiles que es estandar de Cy se llama justamente libc.a. Entre otras incluye funciones. Matematicas 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 // C2 #include // C++

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Un primer programa en C++

    Para imprimir por terminal hay que usar el operador

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Namespaces

    A medida que una librera o programa crecen cada vez hay mas funcionesy es muy posible que se produzca la colision de nombres. Por ejemplo, siescribo una librera para manipular matrices, puedo querer implementaruna funcion rand() que llena la matriz con numeros aleatorios.Lamentablemente la libc ya usa el nombre rand() para generar un uniconumero aleatorio.

    Una solucion que se usaba en C era prependizar un prefijo identificadorde la librera a todas las funciones de la misma matrix_rand(),matrix_sum(), matrix_prod(). Esto se vuelve muy engorroso.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Namespaces (cont.)

    C++ provee un mecanismo para evitar colisiones llamado namespaces.Todos los archivos de la librera se incluyen en un namespace de lasiguiente forma

    1 // matrix.cpp2 namespace matrix {3 void rand(. . .) { /* . . . */ }4 double sum(. . .) { /* . . . */ }5 void prod(. . .) { /* . . . */ }6 }

    Entonces despues las funciones se deben llamar con el operador descope ::: por ejemplo matrix::rand().

    Si en un archivo fuente se va a utilizar mucho una librera entonces puedeincluir todo el namespace, de manera que no hay que hacer el scope

    1 // prog.cpp2 using namespace matrix;3

    4 rand(A);5 double m = max(A);

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Namespaces (cont.)

    Muchas utilidades y variables estandar de C++, por ejemplo cout, estan enel namespace std de manera que o bien hay que hacer

    1 std::cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Estructura de un programa

    Un programa en C/C++ esta compuesto de una coleccion de funciones yvariables. Cuando uno lanza el programa hay que determinar donde seempieza a ejecutar el codigo, o sea el punto de entrada. En C/C++ el puntode entrada es la funcion main().

    La definicion de una funcion consiste en un valor de retorno, el nombrede la funcion y su lista de argumentos. El cuerpo de la funcion (lasinstrucciones que la componen) van entre llaves.

    1 int function() {2 // Function code here (this is a comment)3 }

    Puede haber mas pares de llaves balanceadas ({}) adentro de la funcionpero debe haber uno mas externo que define el cuerpo de la funcion.

    Como main() es una funcion, debe respetar estos requisitos. main() notiene argumentos y retorna un int.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Estructura de un programa (cont.)

    C/C++ es un lenguaje de formato libre (free form), la indentacion o laposicion de las variables en la lnea son irrelevantes.

    Tampoco es relevante la cantidad espacio en blanco (espacios, tabs, finde lnea). Cualquier cantidad de estos caracteres juntos es equivalente aun solo espacio. De hecho un programa en C++ podra escribirse ne unasola lnea.

    En C los comentarios van encerrados entre /* y */ (comentario multilnea).En C++ se agrego un nuevo tipo de comentario que es por lnea desde un// hasta el final de la lnea. (Esto viola un poco el concepto de free form).

    1 /* Comentario multilinea tipo C */2 int /* comentario en el medio del codigo */ x;3 // Comentario por linea tipo C++

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Hello world

    1 // Saying Hello with C++2 #include // Stream declarations3 using namespace std;4

    5 int main() {6 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Concatenacion de arreglos de caracters

    Para incluir arreglos de caracteres muy largos se puede simplementeponer uno a continuacion de otro (puede ser en diferentes lneas). El CPPse encarga de juntarlos todos en una sola lnea: "aaa" "bbbb" escompletamente equivalente a "aaabbbb".

    1 // Character array Concatenation2 #include 3 using namespace std;4

    5 int main() {6 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Entrada de datos

    cout es console output, cin es console input y permite ingresar datos.

    1 // Converts decimal to octal and hex2 #include 3 using namespace std;4

    5 int main() {6 int number;7 cout > number;9 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Llamando a otros programas

    Dentro de la librera estandar de C hay una funcion muy potente system() quepermite llamar a otros programas desde un programa en C/C++. Se le pasa unarreglo de caracteres con el comando que uno ejecutara en la lnea decomandos.

    1 // Call another program2 #include // Declare system()3 using namespace std;4

    5 int main() {6 system("date -u");7 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Strings de C

    Manipular arreglos de caracteres en C se vuelve muy engorroso.1 #include 2 #include 3 using namespace std;4

    5 int main() {6 // concatenate two character arrays s1 and s27 char s1[ ] = "Hola ";8 char s2[ ] = "mundo.";9 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Strings de C++

    Para eso C++ tiene objetos llamados strings que permiten manipularlos enforma mucho mas simple y con menor probabilidad de error.

    1 #include 2 #include 3 using namespace std;4

    5 int main() {6 // concatenate two character arrays s1 and s27 string s1 = "Hola ";8 string s2 = "mundo.";9 string s = s1 + s2;

    10 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Strings de C++ (cont.)

    1 //: C02:HelloStrings.cpp2 // The basics of the Standard C++ string class3 #include 4 #include 5 using namespace std;6

    7 int main() {8 string s1, s2; // Empty strings9 string s3 = "Hello, World."; // Initialized

    10 string s4("I am"); // Also initialized11 s2 = "Today"; // Assigning to a string12 s1 = s3 + " " + s4; // Combining strings13 s1 += " 8 "; // Appending to a string14 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Escribir y leer de archivos

    Las funciones estan declaradas en el header . 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 funcion getline(stream,s) lee una lnea de stream y la guarda en el

    string s

    1 // Copy one file to another, a line at a time2 #include 3 #include 4 using namespace std;5 int main() {6 ifstream in("Scopy.cpp"); // Open for reading7 ofstream out("Scopy2.cpp"); // Open for writing8 string s;9 while(getline(in, s)) // Discards newline char

    10 out

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Escribir y leer de archivos (cont.)

    Otro ejemplo es guardar todo el archivo en un solo string:

    1 // Read an entire file into a single string2 #include 3 #include 4 #include 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

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    La clase vector

    Un vector es un contenedor que permite guardar un numero indefinido deelementos en forma contigua e indexada.

    Se puede agrandar o achicar en forma dinamica, sin perder los elementospreexistentes.

    Esta templatizado o sea que se pueden definir vectores de diferentestipos: vector, vector, vector,...

    La funcion push_back() permite agregar un nuevo objeto al final del vector.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    La clase vector (cont.)

    1 // Copy an entire file into a vector of string2 #include 3 #include 4 #include 5 #include 6 using namespace std;7

    8 int main() {9 vector v;

    10 ifstream in("Fillvector.cpp");11 string line;12 while(getline(in, line))13 v.push-back(line); // Add the line to the end14 // Add line numbers:15 for(int i = 0; i < v.size(); i++)16 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    La clase vector (cont.)

    vector tambien puede guardar cualquier otro tipo, por ejemplo enteros:1 // Creating a vector that holds integers2 #include 3 #include 4 using namespace std;5

    6 int main() {7 vector 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

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Ejercicios

    1. Crear un programa que abre un archivo y cuenta las palabras (separadaspor whitespace). Ayuda: el operador >> lee de a palabras de un ifstream.

    2. Crear un programa que cuenta la cantidad de caracteres que tiene unarchivo.

    3. Crear un programa que cuenta la cantidad de ocurrencias de una palabraespecfica en un archivo. Ayuda: usar == para comparar strings.

    4. Escribir un programa que imprime las lneas de un archivo de texto enorden inverso.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El C en C++

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Funciones

    Para evitar errores, C/C++ usa el concepto de prototipo o signatura defunciones.

    Antes de usar una funcion hay que declararla. Al usar la funcion 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 algun lugar la funcion tiene que estar definida, aqu los nombres de losargumentos tienen que aparecer para poder ser usados en la funcion

    1 int translate(float x, float y, float z) {2 x = y = z;3 // . . .4 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Valores de retorno

    La declaracion de la funcion debe indicar el valor de retorno. Si la funcionno retorna nada usar void:

    1 int f1(void); // Returns an int, takes no arguments2 int f2(); // Like f1() in C++ but not in Standard C3 float f3(float, int, char, double); // Returns a float4 void f4(void); // Takes no arguments, returns nothing

    Para retornar el valor usar la sentencia return. Si la funcion retorna void entonces no se debe llamar a return. Se puede tener mas de un return en la funcion. Son puntos de salida. El valor de retorno debe ser compatible con el indicado en la declaracion.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Valores de retorno (cont.)

    1 // Use of return2 #include 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 > val;19 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Usando la librera estandar de C

    C incluye una librera de funciones estandar (tambien llamada libc). Todoslos compiladores que satisfacen la norma deben incluir estas funcionesen su libc. Esto permite la portabilidad de los programas entre diferentescompiladores.

    Muchos compiladores incluyen funciones adicionales que NO estan en lanorma. Por lo tanto hay que prever que si se lleva el proyecto a otraplataforma puede ser que estas funciones no existan en esa plataforma.

    La documentacion de las libreras usualmente incluye la declaracion de lafuncion y en que header (archivo .h) esta.

    En caso que la librera no este documentada hay que directamente ver losheaders para encontrarel prototipo de la funcion.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Control de ejecucion. True and False

    Todas los condicionales (por ejemplo if o while) usan expresiones logicascomo por ejemplo el resultado del operador de comparacion A==B. Estaexpresion retorna directamente un valor logico true o false. No confundiircon el operador de asignacion A=B.

    Lo mismo ocurre con otros operadores de comparacion1 A==B; //Its equal?2 A!=B; //Its distinct?3 A=B; //Its greater or equal?

    Si la expresion no retorna un valor booleano, entonces C trata de convertirlo.Para todos los valores numericos (enteros, float, double, char, punteros) elvalor es falso si es cero, y en cualquier otra caso es verdadero. Entonces porejemplo el valor logico de las siguientes expresiones es equivalente

    1 if (n) { . . . }2 if (n!=0) { . . . . }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    3 if (!(n==0)) { . . . . } // ! is negation

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    If-else

    El if puede existir de dos formas, con o sin else

    1 if (expression)2 statement3

    4 // o5

    6 if (expression)7 statement8 else9 statement

    En ambos casos statement puede ser una sentencia simple, terminada en unacoma, o compuesta, es decir un bloque de instrucciones encerrado en {}.

    1 if (n>0) x=23; // sentencia simple2

    3 if (n>0) { // sentencia compuesta4 x=23;5 s="haha";6 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    If-else (cont.)

    1 int i;2 cout i;4 if(i > 5)5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    If-else (cont.)

    Notar que todo el if actua como una sola instruccion, por eso no hace faltaencerrarlo con un {}.

    1 if(i > 5)2 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    legibilidad.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    while

    while, do-while y for controlan lazos (loops) de ejecucion.1 while(expression)2 statement

    Como antes statement puede ser simple o compuesto. La expresion se evaluahasta que la condicion de falso. Para que el lazo termine en algun momentoes necesario que statement tenga algun efecto que haga que eventualmenteexpression de falso

    1 int x=0;2 while (x

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    while (cont.)

    1 // Guess a number (demonstrates while)2 #include 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;12 }13 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    while (cont.)

    En C la condicion dentro del condicional puede ser tan elaborada como sequiera, la unica restriccion es que debe retornar un valor logico (o convertiblea logico), incluso puede ser que el cuerpo del lazo este vaco

    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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    do-while

    1 do2 statement3 while(expression);

    Es similar al while pero ahora statement es ejecutado antes de verificar lacondicion.

    1 n=0;2 while (n>0) /* body. . .*/ ; // body is not executed3

    4 n=0;5 do6 /* body. . .*/ ; // body is executed once7 while (n>0);

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Lazo for

    La forma del for es1 for(initialization; conditional; step)2 statement

    Se utiliza mucho cuando simplemente se quiere ejecutar un bloque una seriede veces bien definida

    1 for (int i=0; i

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Break and continue

    Adentro de cualquiera de los bloques while, do-while o for se puede usarbreak para salir del lazo inmediatamente.

    1 while (true) { // Infinite loop2 cout > n;4 if (is-prime(n)) break;5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Break and continue (cont.)

    continue es similar a break pero hace que se ejecute la siguiente iteracion dellazo

    1 for (int j=0; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    La sentencia switch

    Va comparando la variable selector hasta que coincide con uno de los case1 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 ejemplo1 char c;2 //. . .3 switch (c) {4 case a: cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Si no se incluyen los break entonces la ejecucion sigue al siguiente case.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    goto

    La sentencia goto permite saltar a otro punto del programa. Se lo consideramuchas veces como una mala practica de programacion, aunque a vecespuede ser util, por ejemplo para saltar de varios lazos anidados cuando seencuentra una condicion.

    1 // The infamous goto is supported in C++2 #include 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 for13 }14 }15 bottom: // A label16 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    17 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Recursion

    Muchos problemas son intrnsecamente recursivos, es decir la solucion de unproblema esta dada por la solucion de uno menor con el mismo algoritmo,por ejemplo la definicion de factorial se puede hacer en forma recursiva

    n! = n (n 1)! (1)en realidad esto es cierto si n > 1, la definicion correcta es

    n! =

    1; si n = 1;n (n 1)! ; si n > 1 (2)decimos que el caso n = 1 corta la recursion.

    Usando llamadas recursivas a funciones podemos implementar la funcionfactorial

    1 int factorial(int n) {2 if (n==1) return 1;3 else return n*factorial(n-1);4 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Recursion (cont.)

    La recursion es muy elegante para resolver problemas, pero puede serdemandante en terminos de recursos. Es mas simple si calculamos elfactorial con un lazo

    1 int factorial(int n) {2 int fac=1;3 for (int j=2; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores

    Los operadores no son mas que funciones, con una sintaxis especial. Unoperador toma una o mas series de valores y devuelve un resultado.

    1 a = b + c;

    podemos pensar que es traducido por el compilador en1 a = sum(b,c);

    Una cuestion importante con los operadores es la precedencia de losmismos. Para los operadores matematicos es similar a las reglas queaprendemos en la escuela

    1 a = b * c + d;

    es equivalente a1 a = (b * c) + d;

    porque * tiene mayor precedencia que +. Ante la duda, se pueden introducirparentesis para forzar el orden en que se evaluan las expresiones.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores de auto incremento

    El operador ++ es un atajo para una operacion muy comun en programacion:incrementar una variable de tipo entero en una unidad. Hay dos variantes,prefija y postfija, ambos tienen el mismo efecto colateral (incrementar lavariable) pero en el prefijo retorna el valor de la variable incrementada, y elpostfijo sin incrementar

    1 int m,n=5;2 m = n++; // n=6, m=53

    4 int m,n=5;5 m = ++n; // n=6, m=6

    Por ejemplo la siguiente funcion retorna el primer primo siguiente (mayor oigual) a n.

    1 int next-prime(int n) {2 while (!is-prime(n++)) { }3 return n;4 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores de auto incremento (cont.)

    Tambien hay autodecremento -- prefijo y postfijo.

    1 int n=10;2 while (n >= 0) cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Tipos de datos

    Dijimos que C/C++ es un lenguaje de tipeo estatico, es decir en el momentode crear las variables hay que decir de que tipo son. Hay tipos de datosbuilt-in como enteros, floats, strings, que ya estan definidos en el compilador,y tambien el programador puede crear sus propios tipos, muchas veces porcomposicion. Por ejemplo si estamos creando la base de datos de unaempresa podemos querer tener un tipo de dato employee que contenga unstring (el nombre), un entero (el numero de empleado) y un float (el sueldo).

    Los tipos built-in son

    char un entero de al menos 8 bits, usualmente se usa para almacenarcaracteres.

    int un entero de al menos 16 bits (2 bytes) float un numero de punto flotante con al menos 4 bytes (simple precision) double un numero de punto flotante con al menos 8 bytes (doble

    precision).

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Tipos de datos (cont.)

    1 // Defining the four basic data2 // 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Tipos de datos (cont.)

    Como los tipos basicos tienen una cantidad de bits fija pueden representar untamano maximo. Por ejemplo los enteros de 16 bits solo pueden estar entre-32768 y +32768. Ademas el tamano del tipo (la cantidad de bits) puededepender de la maquina y del compilador, entonce los valores maximos ymnimos (los lmites) estan definidos en headers float.h y limits.h,

    1 #include 2

    3 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Especificadores

    Para representar enteros se utiliza un bit de los 32 disponibles pararepresentar el signo.

    Si solo se van a utilizar enteros positivos entonces podemos usar ese bitpara 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Especificadores (cont.)

    1 //: C03:Specify.cpp2 // Demonstrates the use of specifiers3 #include 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 int13 unsigned short int isu;14 unsigned short iisu;15 long int il;16 long iil; // Same as long int17 unsigned long int ilu;18 unsigned long iilu;19 float f;20 double d;21 long double ld;

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    22 cout23

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Especificadores (cont.)

    1 [mstorti@galileo garage]$$ ./sizes.bin2

    3 char= 14 unsigned char = 15 int = 46 unsigned int = 47 short = 28 unsigned short = 29 long = 8

    10 unsigned long = 811 float = 412 double = 813 long double = 1614 [mstorti@galileo garage]$$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros

    Al declarar variables lo que estamos haciendo es dar un nombre a un pedazode la memoria. Cuando decimos int n lo que estamos diciendo al compiladores: reserveme 4 bytes de la memoria y a partir de ahora lo voy a llamar n. Eloperador & nos muestra en que posicion de la memoria fue alocada la variable

    1 int n;2 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    1 #include 2 using namespace std;3

    4 int dog, cat, bird, fish;5

    6 void f(int pet) {7 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    El resultado es1 [mstorti@galileo garage]$$ ./pointers.bin2 f(): 41966303 dog: 62959564 cat: 62959605 bird: 62959646 fish: 62959687 i: 1407366311585728 j: 1407366311585689 k: 140736631158564

    10 [mstorti@galileo garage]$$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    La direccion en memoria de un variable puede cambiar de una corrida aotra.

    Funciones, variables y globales parecen estar en sectores de la memoriadiferentes.

    Enteros parecen ocupar 4 bytes. Las posiciones en la memoria se pueden guardar en una variable de tipo

    especial llamada puntero1 int number;2 int *number-p = &number;

    El sufijo _p o simplemente p indica que es un puntero (es solo unaconvencion).

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 direccion de unavariable, lo cual nos permite modificarla a traves de ese proxy

    1 int number=100;2 int *number-p = &number;3 *number-p = 25; // Ahora number contiene 25!!

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    OJO: el hecho de declarar una variable de tipo puntero no significa queeste apuntando a un objeto valido, es deber del programador asignarle alpuntero una posicion valida, si no puede dar error en tiempo de ejecucional querer usar el puntero.

    1 int *p;2 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    Los punteros tienen un monton de usos, el primero que veremos es el decausar que una funcion modifique un objeto. El mecanismo de paso devariables en C/C++ es por copia.

    1 #include 2 using namespace std;3

    4 void f(int a) {5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    Imprime:

    1 [mstorti@galileo sources]$$ ./try40.bin2 &x = 0x7ffe99dd33ec3 x = 474 &a = 0x7ffe99dd33bc5 a = 476 a = 57 x = 478 [mstorti@galileo sources]$$ x = 47

    Como la variable a en f() es una copia, resulta que la modificacion que sehace en f() no persiste, de manera que queda el mismo valor.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    En esta version en cambio, pasamos la direccion donde esta x:

    1 #include 2 using namespace std;3

    4 void f(int* p) {5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros (cont.)

    Imprime:

    1 [mstorti@galileo sources]$ ./try41.bin2 x = 473 &x = 0x7ffcf3047dcc4 p = 0x7ffcf3047dcc5 *p = 476 p = 0x7ffcf3047dcc7 x = 58 [mstorti@galileo sources]$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Referencias

    Los punteros son muy utiles pero engorrosos porque hay que estardereferenciando al puntero cada vez. C++ introdujo las referencias que soncompletamente equivalentes a los punteros pero evitan la dereferenciacion.

    1 #include 2 using namespace std;3

    4 void f(int& r) {5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Referencias (cont.)

    Imprime:

    1 [mstorti@galileo sources]$ ./try42.bin2 x = 473 &x = 0x7ffd244d1aac4 r = 475 &r = 0x7ffd244d1aac6 r = 57 x = 58 [mstorti@galileo sources]$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros a void

    El compilador solo acepta que asignemos a una variable de tipo int* ladireccion de una variable de tipo int, en otro caso da un error

    1 int *p;2 int n;3 p = &n; // OK4 double a;5 p = &a; // Error

    El tipo void* permite almacenar un puntero a cualquier tipo de variable1 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 Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros a void (cont.)

    Una vez que una direccion es asignada a un void* el compilador no puedesaber de que tipo es el objeto al cual apunta, y por lo tanto no se puededereferenciar

    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 esaforma 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 puedeproducir un error en tiempo de ejecucion

    1 int i = 99;2 void* vp = &i;3 // Compila OK, posible error en tiempo de ejecucion4 *((string*)vp) = "Hello world";

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Scope de las variables

    Una variable existe desde su definicion hasta la siguiente llave que cierra (}).Eso se llama el scope de la variable.

    1 // How variables are scoped2 int main() {3 int scp1;4 // scp1 visible here5 {6 // scp1 still visible here7 //. . . . .8 int scp2;9 // scp2 visible here

    10 //. . . . .11 {12 // scp1 & scp2 still visible here13 //. .14 int scp3;15 // scp1, scp2 & scp3 visible here16 // . . .17 } // scp3 destroyed here18 // scp3 not available here

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    19 // scp1 & scp2 still visible here20 // . . .21 } // scp2 destroyed here22 // scp3 & scp2 not available here23 // scp1 still visible here24 //. .25 } // scp1 destroyed here

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 definitions2 #include 3 using namespace std;4

    5 int main() {6 //. .7 { // Begin a new scope8 int q = 0; // C requires definitions here9 //. .

    10 // Define at point of use:11 for(int i = 0; i < 100; i++) {12 q++; // q comes from a larger scope13 // Definition at the end of the scope:14 int p = 12;15 }16 int p = 1; // A different p17 } // End scope containing q & outer p18 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    19 while(char c = cin.get() != q) {20 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Definiendo variables on-the-fly (cont.)

    Las variables que estan fuera de todas las funciones son globales, su scopees todo el programa, includo dentro de las funciones.

    1 // == file1.cpp ==2 // Demonstration of global variables3 #include 4 using namespace std;5

    6 int globe;7 void func();8 int main() {9 globe = 12;

    10 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    19 globe = 47;20 }

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Variables locales

    Las variables que existen dentro de un scope son locales, tambien se lesllama automaticas 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 lotanto la variable no retiene el valor que le fue asignado antes.

    1 void f(int x) {2 int a;3 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    18 int a;19 f(435);20 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Variables locales (cont.)

    El resultado es:1 [mstorti@galileo garage]$$ ./try2.bin2 a en f(): 03 &a en f(): 0x7fff6df56d1c4 a en f() despues de asignar: 235 a en g(): 236 &a en g(): 0x7fff6df56d1c7 a en g() despues de asignar: 458 a en f(): 459 &a en f(): 0x7fff6df56d1c

    10 a en f() despues de asignar: 2311 a en g(): 2312 &a en g(): 0x7fff6df56d1c13 a en g() despues de asignar: 4514 a en f(): 5915 &a en f(): 0x7fff6df56cdc16 a en f() despues de asignar: 43517 a en h(): 4518 &a en h(): 0x7fff6df56d1c

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    19 a en h() despues de asignar: 23420 [mstorti@galileo garage]$$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros a variables locales

    Si una variable sale de scope, es un error tratar de utilizar punteros queapuntaban a esa variable.

    1 int *p;2 for (int j=0; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Variables estaticas

    Si queremos que el area asignada a una variable local sea siempre el mismo,entonces le agregamos el keyword static. Un ejemplo clasico es una funcionque cuenta cuantas veces fue llamada:

    1 void f() {2 static int count=0;3 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Variables estaticas (cont.)

    El resultado es:1 [mstorti@galileo garage]$ ./try14.bin2 f() fue llamada 0 veces3 f() fue llamada 1 veces4 f() fue llamada 2 veces5 f() fue llamada 3 veces6 f() fue llamada 4 veces7 f() fue llamada 5 veces8 f() fue llamada 6 veces9 f() fue llamada 7 veces

    10 f() fue llamada 8 veces11 f() fue llamada 9 veces12 [mstorti@galileo garage]$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Constantes

    Si se utilizara muchas veces un valor que es constante se pueden hacer atraves de un macro

    1 #define PI 3.141459

    o bien a traves de una variable de tipo const

    1 const double pi = 3.141459;

    Es mas prolijo esto ultimo (le permite al compilador hacer chequeo de tipo).

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores. Asignacion

    El caracter = se utiliza como el operador de asignacion:1 A=4;

    Lo que esta a la izquierda de = es el lvalue y lo que esta a la derecha el rvalue.El rvalue puede ser cualquier expresion. El compilador la evalua y asigna elresultado a lo que esta en el lvalue. Ahora bien lo que esta en el lvalue nopuede ser cualquier cosa, debe ser una variable o cualquier otra cosa a lacual se le pueda asignar un valor. Por ejemplo no puede ser una constante, esdecir no podemos hacer

    1 4=A;

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores matematicos

    Los operadores matematicos binarios usuales son +-*/. Cada uno de ellos sepuede usar en forma de acumulacion +=, -=, *=, /=. Por ejemplo

    1 x += 5;

    es equivalente a1 x = x + 5;

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores relacionales

    Son1 >, =,

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores logicos

    Son && (and) y || (or). Recordar que en C/C++ muchos tipos se casteanautomaticamente a bool, siendo 0 el valor falso y cualquier otro valorverdadero. Cuando se imprimen los valores booleanos dan 0 o 1. ! es lanegacion.

    Son operadores cortocircuitados es decir si hacemos1 expr1 && expr2

    entonces primero se evalua expr1 y si da falso, entonces expr2 NO se evalua,ya que no es necesario porque la expresion logica resultara en falso de todasformas. Eso puede ser importante, por ejemplo

    1 if (n>0 && m/n!=3) . . .

    esta garantizado que no dara error si n==0 ya que si es as directamente ladivision por n no se hara. Lo mismo ocurre en

    1 expr1 | | expr2

    si la primera da verdadero.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    El operador hook

    Es una forma muy compacta de escribir un if-else. Por ejemplo esta expresioncalcula el mnimo de dos valores

    1 x = (m

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Errores comunes con los operadores

    Las reglas de precedencia a veces son simples, pero si se escribenexpresiones complejas ya no. Ante la duda utilizar parentesis.

    No confundir = con ==.

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operadores de cast

    Si el compilador ve que estamos mezclando tipos en una asignacion,insertara una operacion de cast (conversion de tipo) automaticamente

    1 int x=5;2 double z=x; // OK3 z=23.3;4 x=z; // se pierde la mantisa (truncamiento)5 x = (int) z; // cast explicito6 x = int(z); // otra forma del cast explicito7

    8 int ixp = &x; // error, no puede convertir ptr a int9 long int ixp2 = (long int)&x; // OK!

    10 long int ixp3 = static-cast(&x); // OK!

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Operador sizeof

    Retorna el tamano de una variable o tipo en bytes1 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    typedef: Aliases de tipos

    Permite hacer un alias de un tipo a un nuevo tipo1 typedef unsigned long int ulong;2 . . .3 ulong x;

    Simple para tipos basicos, mas complicado para punteros1 typedef int *int-p;

    La regla es que se escribe una lnea como la declaracion de una variablecon typedef al principio y reemplazando la variable por el tipo.

    Esto permite hacer expresiones mas cortas pero ademas tiene un uso muyimportante. 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 precision:

    1 typedef double scalar;

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Estructuras

    Se pueden definir nuevos tipos agrupando varios miembros en unaestructura. 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

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Estructuras (cont.)

    Se pueden tomar punteros a estructuras y enlazarlas1 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

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, 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 nextc1

    c='b' x=2 nextc2

    c='c' x=3 nextc3

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Estructuras (cont.)

    El resultado es1 [mstorti@galileo garage]$$ ./try8.bin2 cp 0x7fff571b2d20, c a, x 13 cp 0x7fff571b2d00, c b, x 24 cp 0x7fff571b2ce0, c c, x 35 cp 0x7fff571b2d20, c a, x 16 . . .7 cp 0x7fff571b2d20, c a, x 18 cp 0x7fff571b2d00, c b, x 29 [mstorti@galileo garage]$$

    Facultad de Ingeniera y Ciencias Hdricas 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))

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arrow operator

    Como en el ejemplo anterior es muy comun la compinacion (*cp).x es decirtener un puntero a una estructura cp y querer tomar un miembro x de laestructura apuntada. Como es tan comun hay un atajo sintactico 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

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Enums

    Supongamos que queremos definir una estructura shape que contiene unaforma geometrica, digamos las coordenadas x,y de su centro y un enteroque indica su forma. Para ello incluimos un entero gtype (por geometrictype) que define que tipo de forma es. Podemos por ejemplo asignararbitrariamente gtype=0 para crculos, 1=cuadrados, 2=rectangulos.

    1 struct shape {2 double x,y;3 int gtype;4 };

    Entonces una funcion que imprime la forma sera algo as como1 void draw(shape s) {2 if (s.gtype==0) //. . . imprime un circulo3 else if (s.gtype==1) //. . . imprime un cuadrado4 else if (s.gtype==2) //. . . imprime un rect5 . . .6 }

    El problema con esto es que tenemos que guardar mentalmente una tablapara saber que entero corresponda a cada forma.

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 126((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Enums (cont.)

    Una posibilidad es usar macros

    1 #define CIRCLE 02 #define SQUARE 13 #define RECTANGLE 24

    5 void draw(shape s) {6 if (s.gtype==CIRCLE) //. . . imprime un circulo7 else if (s.gtype==SQUARE) //. . . imprime un cuadrado8 else if (s.gtype==RECTANGLE) //. . . imprime un rect9 . . .

    10 }

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 127((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Enums (cont.)

    Pero, como ya dijimos, es preferible no usar macros, para esto esta el enum:1 enum GeoType { circle, square, rectangle};2

    3 struct shape {4 double x,y;5 GeoType gtype;6 };7

    8 void draw(shape s) {9 if (s.gtype==circle) //. . . imprime un circulo

    10 else if (s.gtype==square) //. . . imprime un cuadrado11 else if (s.gtype==rectangle) //. . . imprime un rect12 . . .13 }

    Internamente los enums son enteros, pero esto es transparente paranosotros.

    El compilador traduce cada identificador de la lista a un enteroconsecutivo.

    Se puede forzar a que tomen un valor especfico1 enum GeoType { circle=5, square=10, rectangle=15};

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 128((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arreglos de estructuras

    Vimos que podemos definir arreglos como int v[100]. Tambien lo podemos hacer con estructuras cell cellv[100] Los elementos son guardados en forma consecutiva

    1 struct cell {2 double x;3 cell *next;4 };5

    6 for (int j=0; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros y arreglos

    Si imprimimos un arreglo, el compilador lo imprime como hexadecimal, o seacomo si fuera un puntero

    1 int v[100];2 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Punteros y arreglos (cont.)

    Si tomamos un puntero al primer elemento podemos manipular al vector atraves de ese puntero

    1 int v[100];2 int *p= &v[0];3 for (int j=0; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arreglos de punteros

    Tambien se pueden tener arreglos de punteros1 int *v[100]; // arreglo de 100 punteros a enteros

    Los arreglos de caracteres, son de tipo char* entonces si queremos tenerun arreglo de strings de C, tenemos un arreglo de arreglos de char, o loque es equivalente a arreglos de punteros a char

    1 char *as[ ];2 char **as; // equivalente

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 132((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arreglos de punteros (cont.)

    Un caso frecuente de esto es la segunda forma de llamada a main(). Sillamamos a nuestro programa con argumentos

    1 int main(int argc,char **argv) {2 for (int j=0; j

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arreglos de punteros (cont.)

    El acceso a elementos de un arreglo de C es extremadamente rapido. Sin embargo si se accede a posiciones mas alla de la ultima posicion del

    vector se puede producir un error

    1 int v[100];2 . . .3 v[100] = x; // Muy probablemente SIGSEGV o SEGFAULT

    Se debe conocer el tamano del vector en tiempo de compilacion (hay unaforma de hacerlo dinamico, con new[]/delete[] o malloc()/free().

    La clase vector es mucho mas versatil y mas segura.

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 134((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Arreglos de punteros (cont.)

    Podemos verificar que los elementos de un vector estan en posicionescontiguas.

    1 int a[10];2 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Aritmetica de punteros

    Se pueden hacer cuentas con punteros de tipo ptr = ptr + int y todas lasderivadas, por ejemplo

    1 ptr = ptr + int2 int = ptr - ptr3 ptr += int4 ptr++5 ptr--

    En todas estas operaciones el entero indica posiciones en el vector, no bytes.

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 136((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Aritmetica de punteros (cont.)

    1 int i[10];2 double d[10];3 int* ip = i;4 double* dp = d;5 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Tamanos de estructuras

    Cuando se usan estructuras con tipos mezclados puede ser que el tamano deltipo combinado no sea igual a la suma de los tamanos de los tipos (peroseguro es mayor o igual) porque el compilador tiene que alinear los tipos.

    1 struct A {2 char c;3 double d;4 };

    da sizeof(A) -> 16, y

    1 struct B { char c; double d; char c2; };2 struct C { char c; char c2; double d; };

    da1 sizeof(B) -> 242 sizeof(C) -> 16

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 138((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Programacion Orientada

    a Objetos

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 139((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Abstraccion de datos

    Un contenedor de elementos de longitud arbitraria1 #ifndef CSTASH-H2 #define CSTASH-H3

    4 struct CStash {5 int size; // Size of each space6 int quantity; // Number of storage spaces7 int next; // Next empty space8 // Dynamically allocated array of bytes:9 unsigned char* storage;

    10 };11

    12 void initialize(CStash* s, int size);13 void cleanup(CStash* s);14 int add(CStash* s, const void* element);15 void* fetch(CStash* s, int index);16 int count(CStash* s);17 void inflate(CStash* s, int increase);18

    19 #endif

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 140((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Abstraccion de datos (cont.)

    1 struct CStash {2 int size; // Size of each space3 int quantity; // Number of storage spaces4 int next; // Next empty space5 // Dynamically allocated array of bytes:6 unsigned char* storage;7 };

    store

    quantitynext

    size

    used free

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 141((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Abstraccion de datos (cont.)

    1 // Implementation of example C-like library2 // Declare structure and functions:3 #include "./cstash.h"4 #include 5 #include 6

    7 using namespace std;8 // Quantity of elements to add9 // when increasing storage:

    10 const int increment = 100;11

    12 void initialize(CStash* s, int sz) {13 s->size = sz;14 s->quantity = 0;15 s->storage = 0;16 s->next = 0;17 }18

    19 int add(CStash* s, const void* element) {20 if(s->next >= s->quantity) //Enough space left?21 inflate(s, increment);22 // Copy element into storage,

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 142((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    23 // starting at next empty space:24 int startBytes = s->next * s->size;25 unsigned char* e = (unsigned char*)element;26 for(int i = 0; i < s->size; i++)27 s->storage[startBytes + i] = e[i];28 s->next++;29 return(s->next - 1); // Index number30 }31

    32 void* fetch(CStash* s, int index) {33 // Check index boundaries:34 assert(0 = s->next)36 return 0; // To indicate the end37 // Produce pointer to desired element:38 return &(s->storage[index * s->size]);39 }40

    41 int count(CStash* s) {42 return s->next; // Elements in CStash43 }44

    45 void inflate(CStash* s, int increase) {46 assert(increase > 0);47 int newQuantity = s->quantity + increase;

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 143((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 Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    48 int newBytes = newQuantity * s->size;49 int oldBytes = s->quantity * s->size;50 unsigned char* b = new unsigned char[newBytes];51 for(int i = 0; i < oldBytes; i++)52 b[i] = s->storage[i]; // Copy old to new53 delete [ ](s->storage); // Old storage54 s->storage = b; // Point to new memory55 s->quantity = newQuantity;56 }57

    58 void cleanup(CStash* s) {59 if(s->storage != 0) {60 cout

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    Abstraccion de datos (cont.)

    CStash es un tipo que permite almacenar una cantidad ilimitada deelementos de tamano size.

    Tiene un area de almacenamiento interno unsigned char *storage. Se pueden agregar elementos con add(), si el tamano del almacenamiento

    interno no es suficiente entences se incrementa en una dada cantidad(por default 100).

    initialize() realiza la inicializacion de la estructura, poniendo a cero losdiferentes contadores y el tamano de los elementos al valor entrado por elusuario (int sz).

    add() agrega un elemento copiandolo byte por byte a storage. Si el tamanono es suficiente llama a inflate() para alocar una nueva area recopiandotodo el area previa y agregando el nuevo elemento.

    quantity es el numero de lugares disponiblesnext es la cantidad de lugares realmente ocupados.

    fetch() retorna el puntero al lugar donde comienza el elemento en laposicion index. Primero chequea que efectivamente el ndice este en elrango de valores apropiados (0

  • Programacion en C++ para Ciencia e Ingeniera, por M.Storti, L. Dalcn, Rodrigo Paz

    lado de la memoria. count() retorna la cantidad de elementos que hay en el contenedor.

    Simplemente retorna next. Alocacion dinamica de memoria: Como no sabemos en principio que

    tamano va a tomar el area de memoria vamos alocando dinamicamentecon el operador new

    1 new unsigned char[newBytes];

    En general se puede hacer1 t = new Type; // aloca un solo objeto2 tp = new Type[count]; // aloca un arreglo de count objetos

    El area utilizada debe ser liberada. Si no (y si la alocacion se hacerepetidamente) se produce un memory leak.

    1 delete t;2 delete[ ] tp;

    Las areas de memoria reservadas con new se alocan en el heap. Si el heapse acaba la alocacion da un error (OJO que no necesariamente retorna unpuntero nulo).

    Los pedazos de memoria alocados con new pueden crear fragmentacionde la memoria. (No hay un defragmentador).

    Facultad de Ingeniera y Ciencias Hdricas FICH - UNL slide 146((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))