SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
1.00 Clase 37

             Breve estudio de C++:
        Guía para leer programas de C++




  Programas de C(++) sin clases
 // Archivo main_temp.C: programa main
 #include <iostream.h>        // Archivo de encabez. estándar (C)
 #include “celsius.h”       // Archivo de encabezado de usuario

 int main( ) {                      // Puede ignorar args main
    for (double temp= 10.0; temp <= 30.1; temp+=10.0)
        cout << celsius(temp) << endl;    // System.out.println
    cout << “ Fin de la lista” << endl;    // C usa printf()
    return 0;}                             // Java System.exit(0)

 // Archivo celsius.C: archivo con código con función
 double celsius(double fahrenheit)       // Llamado por valor
 {return (5.0/9.0*(fahrenheit – 32.0));}

 // Archivo celsius.h: archivo de encabezado con función
 prototype double celsius(double fahrenheit);

// Sin relación entre nombres de archivos, métodos o clases en C++
// Distribuye archivos .h y .o pero no archivos .C a usuarios




                                                                     1
Llamada con ejemplo de referencia
 #include <iostream.h>
 void triple( int& base);              // & signif. enviar referencia
                                    // Normalmente arriba en archivo .h
 int main() {
    int value;
    cout << “Escriba un entero: “;
    cin >> value;
    triple( value);
    cout << “ El valor triplicado es: “ << value << endl;
    return 0;}

 void triple(int& base) {              // Debe coincidir con prototipo
    base *= 3;}

//   En C++ puede elegir la llamada por referencia o por valor para
//   casi todos los primitivos y objetos, al contrario que en Java
//   donde primitivos son “por valor” y objetos “referencia por valor”
//   La llamada por valor ocurre si no se utilizan &, como en Java




 Llamada con ejemplo de puntero
 #include <iostream.h>
 void triple( int* base);             // * significa puntero (dirección)
                                         // La referencia es constante
 ptr int main() {                           // Ptr es una ref variable
 can
    int value;                      // apunta a tipo
    cout << “Escriba un entero: “;
    cin >> value;
    triple( &value);               // Debe enviar dirección (ptr)
    cout << “ El valor triplicado es: “ << value << endl;
    return 0;}

 void triple(int* base) {          // Debe coincidir con prototipo
    *base *= 3;}                    // * significa dereferencia o
                                     // usa el valor, no la
                                      // dirección
 // Está anticuado (C no admite llamada por referencia)
 // Tecnicamente, el puntero es pasado por el valor (“ref falsa”)




                                                                           2
Aritmética de puntero
#include <iostream.h>
double average1(double b[], int n);        // Prototipos de función
double average2(double b[], int n);

int main() {
   double values[]= {5.0, 2.3, 8.4, 4.1, 11.9};
   int size= 5;         // Los arrays de C++ no conocen su tamaño
   double avg1= average1(values, size);
   double avg2= average2(values, size);
   cout << "Las medias son: " << avg1 << " y " << avg2 << endl;
   return 0;}




      Aritmética de puntero, p.2
    double average1(double b[], int n) {
       double sum= 0;
       for (int i= 0; i < n; i++)
           sum += b[i];
       return sum/n; }         // Debería comprobar n> 0

    double average2(double b[], int n) {    // double* b también ok
       double sum= 0;
       for (int i= 0; i < n; i++)
           sum += *(b + i);
       return sum/n; }

                        b     5.0
                              2.3
                              8.4
                              4.1
                              11.9




                                                                      3
Programa bracket (C, C++)
#include <math.h>    // Obsoleto, usa #include <cmath>
#define FACTOR 1.6   // Obsoleto, usea const double FACTOR=1.6;
#define NTRY 50      // Usa const int NTRY= 50;

int zbrac(float (*func)(float), float *x1, float *x2) {
   void nrerror(char error_text[]);       // Función prototipo
   int j;            // Puede definir vars encima o espontáneas
   float f1, f2;
   if (*x1 == *x2) nrerror(“Rango inicial incorrecto”);
   f1= (*func)(*x1);
   f2= (*func)(*x2);
   for (j=1; j <=NTRY; j++) {
       if (f1*f2 < 0.0) return 1;     // false/true son 0, no 0
       if (fabs(f1) < fabs(f2))
              f1= (*func)(*x1 += FACTOR*(*x1-*x2));
       else
              f2= (*func)(*x2 += FACTOR*(*x2-*x1));
   }
   return 0;
}




               Main() para bracket
#include <math.h>          // Obsoleto, usa #include <cmath>
#include <iostream.h>      // Obsoleto, usa #include <iostream>
using namespace std;

// Cualquier lugar aquí o en archivo .h que es #included
aquí: int zbrac(float (*func)(float), float *x1, float *x2);
float f(float x);

int main() {
   float n1= 7.0;
   float n2= 8.0;
   int bracketFound= zbrac(f, &n1, &n2);
   cout << "Lower " << n1 << " upper " << n2 << endl;
   return 0;   }

void nrerror(char error_test[]) { cout << error_test << endl; }

float f(float x) {   return x*x -2.0;}




                                                                  4
Pasar argumentos: value, reference

                              w          x         y[2]                 variable
        main:                                                             (dobles)
                             15.0     -8.0         4.5        6.7

                             1200    1208        1210        1218        address
                                                                           (base 16)
 llamada desde main:
           fun(w, x);                                fun(w, x, y);

void fun(double ww, double xx){…}    void fun(double& ww, double& xx, double yy[]){…}


por valor ww            xx          por referencia &ww           &xx       yy[ ]
           15.0       -8.0

          1220       1228                          1200       1208       1210




                             Clase Point
 // Archivo Point.h
 #include <iostream>
 using namespace std;

 class Point{
    public:
        Point (double a=0, double b=0);            // Constructor predet.
        ~Point(){};                                 // Destructor
        double getX();                              // Sólo prototipo
        double getY();
        void print();
        Point addPoint (Point& g);                  // Elige valor o ref
    private:
        double x, y;
 } ;




                                                                                        5
Clase Point, cont.
// Archivo Point.C
#include “Point.h”
Point::Point(double a, double b) {x=a; y=b;}
double Point::getX() {return x;}
double Point::getY() {return y;}
void Point::print(){cout << ‘(‘ << x << ‘,’ << y <<‘)’<< endl;}
Point Point::addPoint(Point& g)          // Pasa por ref
{
       Point h;                    // No usa nuevo si no dinámico
       h.x= x + g.x;               // x,y son la x de este punto
       h.y= y + g.y;               // x,y de g se añaden
       us return h;
}
// Operador de resolución de alcance :: indica que la función es
// miembro de la clase Point . Sin él, no acceso a datos privados




      Ejemplo de programa Point
  // Archivo pointDemo.C
  #include <iostream>    //   Nuevo encabezado de estilo (podría usar antiguo)
  using namespace std;
  #include “Point.h”

  int main(){
     double a;
     Point p1(3,4), p2(2), p3;       // Constructor (no requiere ‘new’)
     p3= p1.addPoint(p2);              // Agrega point1 y point2
     p3.print();
     a= p3.getX();
     cout << “x: “ << a << endl;
     return 0;}




                                                                                 6
Clase Point exquisita
    // Archivo Point.h
    #include <iostream>
    #include <cmath>
    using namespace std;

    class Point{
       friend double distance1(const Point& p, const Point& q);
       friend ostream& operator<<(ostream& os, const Point& p);
    public:
       Point(double a=0.0, double b=0.0);    // Constructor
       Point(const Point& p);                 // Copia constructor
       Point operator+(const Point& p) const; // Añade 2 Point
       Point operator-() const;       // Unario menos
       Point& operator=(const Point& p);     // Asignación
       ~Point() {};                           // Destructor
    private:
       double x, y;
    };




       Clase Point exquisita, p.2
// Archivo Point.C con cuerpos de función (necesita cmath e iostream)
  #include “Point.h”
  Point::Point(double a, double b)          // Constructor
     { x=a; y=b;}
  Point::Point(const Point& p)              // Copia constructor
     {x=p.x; y=p.y;}
  Point Point::operator+(const Point& p2) const // Añade 2 Point
     { return Point(x+p2.x, y+p2.y);}
  Point Point::operator-() const            // Unario menos
     { return Point(-x, -y);}
  Point& Point::operator=(const Point& p2) // Asignación
     { if (this != &p2) {                    // Comprueba si p2=p2
         x= p2.x;
         y= p2.y;}
     return *this;}




                                                                        7
Clase Point exquisita, p.3
// Archivo Point.C con cuerpos de función, continuación
// Funciones admitidas: distance and output (cout)
double distance1(const Point& p, const Point& q)
   { double dx= p.x - q.x;
     double dy= p.y - q.y;
     return sqrt(dx*dx + dy*dy);}

ostream& operator<<(ostream& os, const Point& p)
   { os << ‘(‘ << p.x << ‘,’ << p.y << ‘)’;
     return os; }




          Uso de la clase Point
#include <iostream>
using namespace std;
#include “Point.h”

int main(){
   Point p1(3,4), p2(2);   // Usa constructor, args predet.
   Point p3(p2);            // Usa copiar constructor
   Point p4= Point(1,2);   // Operador asig.(copia miembros)
   p3= p1 + p2;             // Igual que p3= p1.operator+(p2)
   p4= p1 + p2 + p3;        // Encadenamiento
   p3= -p1;                 // Unario menos
   p2= p4 + p1;             // Podríamos implementar resta
   double a;
   a= distance1(p1, p2);
   cout << “La distancia de p1 a p2 es: “ << a << endl;
   cout << “p1= “ << p1 << “ and p2= “ << p2 << endl; return
   0; }
   // Nuestros métodos de matrices de Java funcionarían mejor ante
      sobrecarga de operaciones




                                                                     8
Constructores y
                  destructores
                Asignación de memoria dinámica


                Class Student
                 public:
                 Student(…)
                   { pc= new courselist[ncourses];
                     pg= new gpalist[nterm];}
                  ~Student()
                   { delete[] pc;
                     delete[] pg; }




                Constructores y
                destructores, p.2
                                         Programa main
       Juan                    int main() {
pc         pg
                                 {     //Func o bloquea alcance
                                  Student Joe;
                                  …
     100        20    X           }   // Fin alcance
                               …
                                  {   // Otro alcance
                                  Student Mary;
       María
pc         pg                     …


                        X      …
                                   }   // Fin alcance

                               }
     100         20




                                                                  9
Constructores y destructores, p.3
• No hay gestión de memoria en el programa o
  las funciones main: objetivo de C++
  – En C, la memoria se gestionaba para cada variable
     • Era preciso recordar asignarla y liberarla al terminar,
       ocurriesen o no estos eventos.
     • Los errores de memoria dinámica superan el 50% de los
       errores de programa de C
  – En C++, construimos la gestión de memoria en clases
     • ‘New’ sólo en constructores; ‘delete’ sólo en destructores
     • El desarrollador de la aplicación ve casi automáticamente la
       recolección de basura. “Nunca” utiliza new; crea objetos
       new sólo definiéndolos: estudiante Joe, igual que int i
     • El desarrollador de las clases tiene el control del
       recolector de basura cuando lo necesita
  – La recolección de basura en C++ es difícil en listas,
    árboles, etc.




 Errores de gestión de memoria
• Eliminar la misma memoria dos veces es un error
    – ¡Difícil de encontrar!
    – Truco: comente todas las eliminaciones si se
      presenta un error extraño en un programa con
      memoria dinámica
        • Si el error desaparece, significa que había eliminado
          memoria dos veces
• No eliminar memoria cuando hay que hacerlo
  supone una pérdida
    – Perder 100 bytes por llamada en un servidor web
      con un millón de llamadas al día supone comprar
      gigabytes de memoria y obtener errores
      periódicamente de todos modos




                                                                      10
template <class TYPE>
class stack {                     Clase de plantilla Stack
 public:
  explicit stack(int size): max_len(size), top(EMPTY)
     {s= new TYPE[size];}
  ~stack()
     { delete [] s;}
  void reset()
     { top= EMPTY;}
  void push(TYPE c)
     { assert(top != max_len -1) ; s[++top]= c;}
  TYPE pop()
     { assert (top != EMPTY); return s[top--];}
  TYPE top_of() const
     { assert (top != EMPTY); return s[top];}
  bool empty()
     { return ( top == EMPTY);}
  bool full()
     { return ( top == max_len -1);}
private:
  enum {EMPTY = -1};
  TYPE* s;
  int max_len;
  int top;};




Programa main, plantilla Stack
int main(){                         // Debe #include iostream
  int size;
  char book;
  cout << "Enter size of stack: ";
  cin >> size;
   stack<char> library(size);
  if (!library.full())
    library.push(’a’);
  if (!library.full())
     library.push(’x’);
  if (!library.empty()){
       book= library.pop();
       cout << ”Primero guardado: " << book << endl;}
  if (!library.empty()){
       book= library.pop();
       cout << "Libro anterior, guardado después: " << book << endl;}
  if (!library.full())
     library.push(’g’);
  book= library.top_of();
  cout << "Siguiente libro devuelto: " << book << endl;}




                                                                        11
Herencia: especificadores de acceso
class Base : {
public: …
protected: …
private: …};

class Derived : AccessSpecifier Base {
public:…
protected:…
private:… };

Tipo de miembro base                  Especificador de acceso
                       Publico         Protegido         Privado

Publico                Publico          Protected         Privado
Protegido              Protegido       Protected         Privado
Privado                Inaccesible     Inaccesible      Inaccesible

Se conserva el especificador más restrictivo. Casi siempre utiliza herencia
pública. La accesibilidad no se hereda y no es transitiva.




          ResearchProject revisado
  class Student {
  public:
    // Array de estudiantes de RProject requiere constructor predet.
     Student() {firstName= " "; lastName= " ";} Student(
     const string fName, const string lName):
         firstName(fName), lastName(lName) {}

     // Función GetData es virtual: interfaz obligatoria,
     // implementación predet. Para clases derivadas
     virtual void GetData() const
     { cout << firstName << " " << lastName << " ";}
     virtual ~Student {}             // Destructor
  private:
     string firstName, lastName;
  };

  //   Si agregamos:    virtual double GetPay() = 0;
  //   Student se convierte en abstracto; requiere que cada clase
  //   derivada implemente GetPay(). También podemos definir
  //   métodos const , como métodos finales de Java




                                                                              12
Undergrad
    class Undergrad : public Student {
    public:
       Undergrad(string fName, string lName, double hours,
       double rate);            // Cuerpo en archivo distinto
       double GetPay() const
           { return UnderWage * UnderHours;}
       virtual void GetData() const
       {
           Student::GetData(); // Instead of super.GetData()
           cout << "weekly pay: $" << GetPay() << endl;
       }
    private:
       double UnderWage;
       double UnderHours;
    };
    // Mismo modelo para grad, clases grad especiales




         Clase ResearchProject
class RProject {
public:
   explicit RProject(int Size);          // Constructor
   void addStudent(Student* RMember);    // Agrega puntero
   void listPay();          // Enumera estudiantes, refleja proyecto
private:
   Student** StaffList;    // Array de punteros a Student
   int StaffSize;           // Tamaño máximo de staff
   int count;               // Tamaño real de staff
};

// No puede almacenar el objeto Student directamente; no tendría
// datos adicionales de las clases derivadas

// Debería tener un destructor, etc. si fuese para uso real
// Rproject ‘tiene un’ array Student




                                                                       13
Clase ResearchProject, p.2
  RProject::RProject(int Size) {
     StaffSize= Size;
     StaffList= new Student*[StaffSize];
     count= 0;}

  void RProject::addStudent(Student* RMember){
     StaffList[count++]= RMember;
     return; }

  void RProject::listPay() {
     cout << "Project staff " << endl;
     for (int i= 0; i < count ; i++)
       StaffList[i]->GetData();    // (*StaffList[i]).GetData()
     return; }

  // La salida es la misma que antes:
  // Lista de estudiantes con aportación específica al proyecto




             Clase ResearchProject
                            Student
          StaffList
                                      Horas      Tasa        Undergrad
     0
     1                                Salario                Grad
     2                                                       SpecialGrad
                                      Salario   estipendio
     3
     4
    ...                    Nombre, tipo
          Student*

C++ define dinámicamente los punteros de Student en
Undergrad, Grad, SpecGrad para obtener la aportación de
cada uno
Si almacenásemos los objetos Student en StaffList y no
como punteros, sólo tendríamos los datos básicos de la
clase Student




                                                                           14
Programa main
int main( ) {
// Define 3 estudiantes (sin cambios desde la
   última vez) Undergrad Ferd("Ferd", "Smith",
   8.0, 12.00); Ferd.GetData();
   Grad Ann(”Ann", "Brown", 1500.00);
   Ann.GetData();
   SpecGrad Mary("Mary", "Barrett", 2000.00);
   Mary.GetData();
   cout << endl;

// Agrega 3 estudiantes al proyecto y muestra su aportación
   RProject CEE1(5);
   CEE1.addStudent(&Ferd);
   CEE1.addStudent(&Ann);
   CEE1.addStudent(&Mary);
   CEE1.listPay();
   return 0;}        // La salida es la lista de estudiantes y
                        su aportación




              Otros elementos
• Las excepciones son casi las mismas que en Java
    – Intentar, arrojar, detectar
• Biblioteca estándar de plantilla (STL) con
  vectores, listas, pilas, Parecido a Java
    – No puede heredar de clases STL
• Múltiple herencia admitida
• C tiene dos tipos de cadenas (con conversiones)
    – Arrays terminados en null (antiguos)
    – Clase String
• Arrays: sólo una ubicación de memoria (ref.)
    – El tamaño del array se pasa como argumento indep.
    – Muy problemático (“sobrecarga en búfer”)
• Recursión admitida, como en Java




                                                                 15

Contenu connexe

Tendances (19)

Interpolaion c++
Interpolaion c++Interpolaion c++
Interpolaion c++
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenas
 
Practica
PracticaPractica
Practica
 
Tema 1.1
Tema 1.1Tema 1.1
Tema 1.1
 
Profesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTBProfesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTB
 
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenas
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenasTap u2-componentes y librerias-programa para cifrar y descifrar cadenas
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenas
 
Introducción a C SHARP
Introducción a C SHARPIntroducción a C SHARP
Introducción a C SHARP
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Algorimos básicos para cifrar y descifrar en C# (encriptar y desencriptar)
Algorimos básicos para cifrar y descifrar en C# (encriptar y desencriptar)Algorimos básicos para cifrar y descifrar en C# (encriptar y desencriptar)
Algorimos básicos para cifrar y descifrar en C# (encriptar y desencriptar)
 
Teoria punteros
Teoria punterosTeoria punteros
Teoria punteros
 
Herencia y polimorfismo
Herencia y polimorfismoHerencia y polimorfismo
Herencia y polimorfismo
 
Clase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacionClase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacion
 
Lab
LabLab
Lab
 
Curso C Ii
Curso C IiCurso C Ii
Curso C Ii
 
Curso c ii
Curso c iiCurso c ii
Curso c ii
 
Arreglos
ArreglosArreglos
Arreglos
 
Arreglos. lidia
Arreglos. lidiaArreglos. lidia
Arreglos. lidia
 
ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
 

En vedette

The Players, the Assumptions and the Tensions in Community-Based Natural Reso...
The Players, the Assumptions and the Tensions in Community-Based Natural Reso...The Players, the Assumptions and the Tensions in Community-Based Natural Reso...
The Players, the Assumptions and the Tensions in Community-Based Natural Reso...Aberdeen CES
 
Cosa chiediamo a monti
Cosa chiediamo a monti Cosa chiediamo a monti
Cosa chiediamo a monti DANZADELLEORE
 
Sobral - Resumo Executivo
Sobral - Resumo ExecutivoSobral - Resumo Executivo
Sobral - Resumo ExecutivoIasmin Marinho
 
Resumo executivo-sobral
Resumo executivo-sobralResumo executivo-sobral
Resumo executivo-sobralIasmin Marinho
 
студия құрамы
студия құрамыстудия құрамы
студия құрамыvendn
 
Catunda - Resumo Executivo
Catunda - Resumo ExecutivoCatunda - Resumo Executivo
Catunda - Resumo ExecutivoIasmin Marinho
 
Efectos fisiologicos de la corriente en el ser humano
Efectos fisiologicos de la corriente en el ser humanoEfectos fisiologicos de la corriente en el ser humano
Efectos fisiologicos de la corriente en el ser humanojarmendipg
 

En vedette (9)

The Players, the Assumptions and the Tensions in Community-Based Natural Reso...
The Players, the Assumptions and the Tensions in Community-Based Natural Reso...The Players, the Assumptions and the Tensions in Community-Based Natural Reso...
The Players, the Assumptions and the Tensions in Community-Based Natural Reso...
 
Cosa chiediamo a monti
Cosa chiediamo a monti Cosa chiediamo a monti
Cosa chiediamo a monti
 
Sobral - Resumo Executivo
Sobral - Resumo ExecutivoSobral - Resumo Executivo
Sobral - Resumo Executivo
 
Modelado eólico
Modelado eólicoModelado eólico
Modelado eólico
 
Resumo executivo-sobral
Resumo executivo-sobralResumo executivo-sobral
Resumo executivo-sobral
 
студия құрамы
студия құрамыстудия құрамы
студия құрамы
 
Catunda - Resumo Executivo
Catunda - Resumo ExecutivoCatunda - Resumo Executivo
Catunda - Resumo Executivo
 
Actividad 3 148445
Actividad 3 148445Actividad 3 148445
Actividad 3 148445
 
Efectos fisiologicos de la corriente en el ser humano
Efectos fisiologicos de la corriente en el ser humanoEfectos fisiologicos de la corriente en el ser humano
Efectos fisiologicos de la corriente en el ser humano
 

Similaire à Lecture 37 (20)

Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Funciones en C++
Funciones en C++Funciones en C++
Funciones en C++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Punteros2
Punteros2Punteros2
Punteros2
 
Cpp
CppCpp
Cpp
 
Cpp
CppCpp
Cpp
 
Creacion de proyecto_en_netbeans
Creacion de proyecto_en_netbeansCreacion de proyecto_en_netbeans
Creacion de proyecto_en_netbeans
 
Programa suma y multiplica
Programa suma y multiplicaPrograma suma y multiplica
Programa suma y multiplica
 
Programa suma y multiplica
Programa suma y multiplicaPrograma suma y multiplica
Programa suma y multiplica
 
Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01
 
Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01
 
Ejercicios propuestos
Ejercicios propuestosEjercicios propuestos
Ejercicios propuestos
 
Ejercicios propuestosc++
Ejercicios propuestosc++Ejercicios propuestosc++
Ejercicios propuestosc++
 
S1-EDD-1.1 Punteros a estructuras
S1-EDD-1.1 Punteros a estructurasS1-EDD-1.1 Punteros a estructuras
S1-EDD-1.1 Punteros a estructuras
 
Informe técnico 1
Informe técnico 1Informe técnico 1
Informe técnico 1
 
Funciones en C.docx
Funciones en C.docxFunciones en C.docx
Funciones en C.docx
 
C sharp intro0
C sharp intro0C sharp intro0
C sharp intro0
 
Jorge informe tecnico
Jorge informe tecnicoJorge informe tecnico
Jorge informe tecnico
 

Plus de Aldo Hernán Zanabria Gálvez

“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...
“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...
“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...Aldo Hernán Zanabria Gálvez
 
Organizadores visuales sobre las corrientes contemporaneas aldo zanabria ga...
Organizadores visuales sobre las corrientes contemporaneas   aldo zanabria ga...Organizadores visuales sobre las corrientes contemporaneas   aldo zanabria ga...
Organizadores visuales sobre las corrientes contemporaneas aldo zanabria ga...Aldo Hernán Zanabria Gálvez
 
Resumen final - Seminario Taller TIC Emprede Turismo
Resumen final - Seminario Taller TIC Emprede TurismoResumen final - Seminario Taller TIC Emprede Turismo
Resumen final - Seminario Taller TIC Emprede TurismoAldo Hernán Zanabria Gálvez
 
Clase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesClase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesAldo Hernán Zanabria Gálvez
 

Plus de Aldo Hernán Zanabria Gálvez (20)

“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...
“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...
“PERSPECTIVAS DEL DESARROLLO ECONÓMICO REGIONAL EN EL CONTEXTO DEL CAMBIO CLI...
 
mejorando la web guia de html 5
mejorando la web guia de html 5mejorando la web guia de html 5
mejorando la web guia de html 5
 
Guía de Prácticas word beta.pdf
Guía de Prácticas word beta.pdfGuía de Prácticas word beta.pdf
Guía de Prácticas word beta.pdf
 
emprendimiento en la era del conocimiento.pptx
emprendimiento en la era del conocimiento.pptxemprendimiento en la era del conocimiento.pptx
emprendimiento en la era del conocimiento.pptx
 
Fundamentos de Programación
Fundamentos de ProgramaciónFundamentos de Programación
Fundamentos de Programación
 
Organizadores visuales sobre las corrientes contemporaneas aldo zanabria ga...
Organizadores visuales sobre las corrientes contemporaneas   aldo zanabria ga...Organizadores visuales sobre las corrientes contemporaneas   aldo zanabria ga...
Organizadores visuales sobre las corrientes contemporaneas aldo zanabria ga...
 
didactica
didacticadidactica
didactica
 
Tarea1 aldo zanabria
Tarea1 aldo zanabriaTarea1 aldo zanabria
Tarea1 aldo zanabria
 
Tarea 2 aldo zanabria
Tarea 2 aldo zanabriaTarea 2 aldo zanabria
Tarea 2 aldo zanabria
 
Carolinos del milenio pasado - Puno
Carolinos del milenio pasado - PunoCarolinos del milenio pasado - Puno
Carolinos del milenio pasado - Puno
 
ingenieria de sistemas
ingenieria de sistemasingenieria de sistemas
ingenieria de sistemas
 
Electricidad con recursos renovables
Electricidad con recursos renovablesElectricidad con recursos renovables
Electricidad con recursos renovables
 
Variables
VariablesVariables
Variables
 
Estructura y modelo organizacional estatal
Estructura y modelo organizacional estatal Estructura y modelo organizacional estatal
Estructura y modelo organizacional estatal
 
Calidad de Agua
Calidad de AguaCalidad de Agua
Calidad de Agua
 
Resumen final - Seminario Taller TIC Emprede Turismo
Resumen final - Seminario Taller TIC Emprede TurismoResumen final - Seminario Taller TIC Emprede Turismo
Resumen final - Seminario Taller TIC Emprede Turismo
 
Clase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesClase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y Comunicaciones
 
Plan de Trabajo Integración de la Mujer
Plan de Trabajo Integración de la MujerPlan de Trabajo Integración de la Mujer
Plan de Trabajo Integración de la Mujer
 
peritaciones y tasación puno
peritaciones y tasación punoperitaciones y tasación puno
peritaciones y tasación puno
 
producción en la empresa turística
producción en la empresa turísticaproducción en la empresa turística
producción en la empresa turística
 

Lecture 37

  • 1. 1.00 Clase 37 Breve estudio de C++: Guía para leer programas de C++ Programas de C(++) sin clases // Archivo main_temp.C: programa main #include <iostream.h> // Archivo de encabez. estándar (C) #include “celsius.h” // Archivo de encabezado de usuario int main( ) { // Puede ignorar args main for (double temp= 10.0; temp <= 30.1; temp+=10.0) cout << celsius(temp) << endl; // System.out.println cout << “ Fin de la lista” << endl; // C usa printf() return 0;} // Java System.exit(0) // Archivo celsius.C: archivo con código con función double celsius(double fahrenheit) // Llamado por valor {return (5.0/9.0*(fahrenheit – 32.0));} // Archivo celsius.h: archivo de encabezado con función prototype double celsius(double fahrenheit); // Sin relación entre nombres de archivos, métodos o clases en C++ // Distribuye archivos .h y .o pero no archivos .C a usuarios 1
  • 2. Llamada con ejemplo de referencia #include <iostream.h> void triple( int& base); // & signif. enviar referencia // Normalmente arriba en archivo .h int main() { int value; cout << “Escriba un entero: “; cin >> value; triple( value); cout << “ El valor triplicado es: “ << value << endl; return 0;} void triple(int& base) { // Debe coincidir con prototipo base *= 3;} // En C++ puede elegir la llamada por referencia o por valor para // casi todos los primitivos y objetos, al contrario que en Java // donde primitivos son “por valor” y objetos “referencia por valor” // La llamada por valor ocurre si no se utilizan &, como en Java Llamada con ejemplo de puntero #include <iostream.h> void triple( int* base); // * significa puntero (dirección) // La referencia es constante ptr int main() { // Ptr es una ref variable can int value; // apunta a tipo cout << “Escriba un entero: “; cin >> value; triple( &value); // Debe enviar dirección (ptr) cout << “ El valor triplicado es: “ << value << endl; return 0;} void triple(int* base) { // Debe coincidir con prototipo *base *= 3;} // * significa dereferencia o // usa el valor, no la // dirección // Está anticuado (C no admite llamada por referencia) // Tecnicamente, el puntero es pasado por el valor (“ref falsa”) 2
  • 3. Aritmética de puntero #include <iostream.h> double average1(double b[], int n); // Prototipos de función double average2(double b[], int n); int main() { double values[]= {5.0, 2.3, 8.4, 4.1, 11.9}; int size= 5; // Los arrays de C++ no conocen su tamaño double avg1= average1(values, size); double avg2= average2(values, size); cout << "Las medias son: " << avg1 << " y " << avg2 << endl; return 0;} Aritmética de puntero, p.2 double average1(double b[], int n) { double sum= 0; for (int i= 0; i < n; i++) sum += b[i]; return sum/n; } // Debería comprobar n> 0 double average2(double b[], int n) { // double* b también ok double sum= 0; for (int i= 0; i < n; i++) sum += *(b + i); return sum/n; } b 5.0 2.3 8.4 4.1 11.9 3
  • 4. Programa bracket (C, C++) #include <math.h> // Obsoleto, usa #include <cmath> #define FACTOR 1.6 // Obsoleto, usea const double FACTOR=1.6; #define NTRY 50 // Usa const int NTRY= 50; int zbrac(float (*func)(float), float *x1, float *x2) { void nrerror(char error_text[]); // Función prototipo int j; // Puede definir vars encima o espontáneas float f1, f2; if (*x1 == *x2) nrerror(“Rango inicial incorrecto”); f1= (*func)(*x1); f2= (*func)(*x2); for (j=1; j <=NTRY; j++) { if (f1*f2 < 0.0) return 1; // false/true son 0, no 0 if (fabs(f1) < fabs(f2)) f1= (*func)(*x1 += FACTOR*(*x1-*x2)); else f2= (*func)(*x2 += FACTOR*(*x2-*x1)); } return 0; } Main() para bracket #include <math.h> // Obsoleto, usa #include <cmath> #include <iostream.h> // Obsoleto, usa #include <iostream> using namespace std; // Cualquier lugar aquí o en archivo .h que es #included aquí: int zbrac(float (*func)(float), float *x1, float *x2); float f(float x); int main() { float n1= 7.0; float n2= 8.0; int bracketFound= zbrac(f, &n1, &n2); cout << "Lower " << n1 << " upper " << n2 << endl; return 0; } void nrerror(char error_test[]) { cout << error_test << endl; } float f(float x) { return x*x -2.0;} 4
  • 5. Pasar argumentos: value, reference w x y[2] variable main: (dobles) 15.0 -8.0 4.5 6.7 1200 1208 1210 1218 address (base 16) llamada desde main: fun(w, x); fun(w, x, y); void fun(double ww, double xx){…} void fun(double& ww, double& xx, double yy[]){…} por valor ww xx por referencia &ww &xx yy[ ] 15.0 -8.0 1220 1228 1200 1208 1210 Clase Point // Archivo Point.h #include <iostream> using namespace std; class Point{ public: Point (double a=0, double b=0); // Constructor predet. ~Point(){}; // Destructor double getX(); // Sólo prototipo double getY(); void print(); Point addPoint (Point& g); // Elige valor o ref private: double x, y; } ; 5
  • 6. Clase Point, cont. // Archivo Point.C #include “Point.h” Point::Point(double a, double b) {x=a; y=b;} double Point::getX() {return x;} double Point::getY() {return y;} void Point::print(){cout << ‘(‘ << x << ‘,’ << y <<‘)’<< endl;} Point Point::addPoint(Point& g) // Pasa por ref { Point h; // No usa nuevo si no dinámico h.x= x + g.x; // x,y son la x de este punto h.y= y + g.y; // x,y de g se añaden us return h; } // Operador de resolución de alcance :: indica que la función es // miembro de la clase Point . Sin él, no acceso a datos privados Ejemplo de programa Point // Archivo pointDemo.C #include <iostream> // Nuevo encabezado de estilo (podría usar antiguo) using namespace std; #include “Point.h” int main(){ double a; Point p1(3,4), p2(2), p3; // Constructor (no requiere ‘new’) p3= p1.addPoint(p2); // Agrega point1 y point2 p3.print(); a= p3.getX(); cout << “x: “ << a << endl; return 0;} 6
  • 7. Clase Point exquisita // Archivo Point.h #include <iostream> #include <cmath> using namespace std; class Point{ friend double distance1(const Point& p, const Point& q); friend ostream& operator<<(ostream& os, const Point& p); public: Point(double a=0.0, double b=0.0); // Constructor Point(const Point& p); // Copia constructor Point operator+(const Point& p) const; // Añade 2 Point Point operator-() const; // Unario menos Point& operator=(const Point& p); // Asignación ~Point() {}; // Destructor private: double x, y; }; Clase Point exquisita, p.2 // Archivo Point.C con cuerpos de función (necesita cmath e iostream) #include “Point.h” Point::Point(double a, double b) // Constructor { x=a; y=b;} Point::Point(const Point& p) // Copia constructor {x=p.x; y=p.y;} Point Point::operator+(const Point& p2) const // Añade 2 Point { return Point(x+p2.x, y+p2.y);} Point Point::operator-() const // Unario menos { return Point(-x, -y);} Point& Point::operator=(const Point& p2) // Asignación { if (this != &p2) { // Comprueba si p2=p2 x= p2.x; y= p2.y;} return *this;} 7
  • 8. Clase Point exquisita, p.3 // Archivo Point.C con cuerpos de función, continuación // Funciones admitidas: distance and output (cout) double distance1(const Point& p, const Point& q) { double dx= p.x - q.x; double dy= p.y - q.y; return sqrt(dx*dx + dy*dy);} ostream& operator<<(ostream& os, const Point& p) { os << ‘(‘ << p.x << ‘,’ << p.y << ‘)’; return os; } Uso de la clase Point #include <iostream> using namespace std; #include “Point.h” int main(){ Point p1(3,4), p2(2); // Usa constructor, args predet. Point p3(p2); // Usa copiar constructor Point p4= Point(1,2); // Operador asig.(copia miembros) p3= p1 + p2; // Igual que p3= p1.operator+(p2) p4= p1 + p2 + p3; // Encadenamiento p3= -p1; // Unario menos p2= p4 + p1; // Podríamos implementar resta double a; a= distance1(p1, p2); cout << “La distancia de p1 a p2 es: “ << a << endl; cout << “p1= “ << p1 << “ and p2= “ << p2 << endl; return 0; } // Nuestros métodos de matrices de Java funcionarían mejor ante sobrecarga de operaciones 8
  • 9. Constructores y destructores Asignación de memoria dinámica Class Student public: Student(…) { pc= new courselist[ncourses]; pg= new gpalist[nterm];} ~Student() { delete[] pc; delete[] pg; } Constructores y destructores, p.2 Programa main Juan int main() { pc pg { //Func o bloquea alcance Student Joe; … 100 20 X } // Fin alcance … { // Otro alcance Student Mary; María pc pg … X … } // Fin alcance } 100 20 9
  • 10. Constructores y destructores, p.3 • No hay gestión de memoria en el programa o las funciones main: objetivo de C++ – En C, la memoria se gestionaba para cada variable • Era preciso recordar asignarla y liberarla al terminar, ocurriesen o no estos eventos. • Los errores de memoria dinámica superan el 50% de los errores de programa de C – En C++, construimos la gestión de memoria en clases • ‘New’ sólo en constructores; ‘delete’ sólo en destructores • El desarrollador de la aplicación ve casi automáticamente la recolección de basura. “Nunca” utiliza new; crea objetos new sólo definiéndolos: estudiante Joe, igual que int i • El desarrollador de las clases tiene el control del recolector de basura cuando lo necesita – La recolección de basura en C++ es difícil en listas, árboles, etc. Errores de gestión de memoria • Eliminar la misma memoria dos veces es un error – ¡Difícil de encontrar! – Truco: comente todas las eliminaciones si se presenta un error extraño en un programa con memoria dinámica • Si el error desaparece, significa que había eliminado memoria dos veces • No eliminar memoria cuando hay que hacerlo supone una pérdida – Perder 100 bytes por llamada en un servidor web con un millón de llamadas al día supone comprar gigabytes de memoria y obtener errores periódicamente de todos modos 10
  • 11. template <class TYPE> class stack { Clase de plantilla Stack public: explicit stack(int size): max_len(size), top(EMPTY) {s= new TYPE[size];} ~stack() { delete [] s;} void reset() { top= EMPTY;} void push(TYPE c) { assert(top != max_len -1) ; s[++top]= c;} TYPE pop() { assert (top != EMPTY); return s[top--];} TYPE top_of() const { assert (top != EMPTY); return s[top];} bool empty() { return ( top == EMPTY);} bool full() { return ( top == max_len -1);} private: enum {EMPTY = -1}; TYPE* s; int max_len; int top;}; Programa main, plantilla Stack int main(){ // Debe #include iostream int size; char book; cout << "Enter size of stack: "; cin >> size; stack<char> library(size); if (!library.full()) library.push(’a’); if (!library.full()) library.push(’x’); if (!library.empty()){ book= library.pop(); cout << ”Primero guardado: " << book << endl;} if (!library.empty()){ book= library.pop(); cout << "Libro anterior, guardado después: " << book << endl;} if (!library.full()) library.push(’g’); book= library.top_of(); cout << "Siguiente libro devuelto: " << book << endl;} 11
  • 12. Herencia: especificadores de acceso class Base : { public: … protected: … private: …}; class Derived : AccessSpecifier Base { public:… protected:… private:… }; Tipo de miembro base Especificador de acceso Publico Protegido Privado Publico Publico Protected Privado Protegido Protegido Protected Privado Privado Inaccesible Inaccesible Inaccesible Se conserva el especificador más restrictivo. Casi siempre utiliza herencia pública. La accesibilidad no se hereda y no es transitiva. ResearchProject revisado class Student { public: // Array de estudiantes de RProject requiere constructor predet. Student() {firstName= " "; lastName= " ";} Student( const string fName, const string lName): firstName(fName), lastName(lName) {} // Función GetData es virtual: interfaz obligatoria, // implementación predet. Para clases derivadas virtual void GetData() const { cout << firstName << " " << lastName << " ";} virtual ~Student {} // Destructor private: string firstName, lastName; }; // Si agregamos: virtual double GetPay() = 0; // Student se convierte en abstracto; requiere que cada clase // derivada implemente GetPay(). También podemos definir // métodos const , como métodos finales de Java 12
  • 13. Undergrad class Undergrad : public Student { public: Undergrad(string fName, string lName, double hours, double rate); // Cuerpo en archivo distinto double GetPay() const { return UnderWage * UnderHours;} virtual void GetData() const { Student::GetData(); // Instead of super.GetData() cout << "weekly pay: $" << GetPay() << endl; } private: double UnderWage; double UnderHours; }; // Mismo modelo para grad, clases grad especiales Clase ResearchProject class RProject { public: explicit RProject(int Size); // Constructor void addStudent(Student* RMember); // Agrega puntero void listPay(); // Enumera estudiantes, refleja proyecto private: Student** StaffList; // Array de punteros a Student int StaffSize; // Tamaño máximo de staff int count; // Tamaño real de staff }; // No puede almacenar el objeto Student directamente; no tendría // datos adicionales de las clases derivadas // Debería tener un destructor, etc. si fuese para uso real // Rproject ‘tiene un’ array Student 13
  • 14. Clase ResearchProject, p.2 RProject::RProject(int Size) { StaffSize= Size; StaffList= new Student*[StaffSize]; count= 0;} void RProject::addStudent(Student* RMember){ StaffList[count++]= RMember; return; } void RProject::listPay() { cout << "Project staff " << endl; for (int i= 0; i < count ; i++) StaffList[i]->GetData(); // (*StaffList[i]).GetData() return; } // La salida es la misma que antes: // Lista de estudiantes con aportación específica al proyecto Clase ResearchProject Student StaffList Horas Tasa Undergrad 0 1 Salario Grad 2 SpecialGrad Salario estipendio 3 4 ... Nombre, tipo Student* C++ define dinámicamente los punteros de Student en Undergrad, Grad, SpecGrad para obtener la aportación de cada uno Si almacenásemos los objetos Student en StaffList y no como punteros, sólo tendríamos los datos básicos de la clase Student 14
  • 15. Programa main int main( ) { // Define 3 estudiantes (sin cambios desde la última vez) Undergrad Ferd("Ferd", "Smith", 8.0, 12.00); Ferd.GetData(); Grad Ann(”Ann", "Brown", 1500.00); Ann.GetData(); SpecGrad Mary("Mary", "Barrett", 2000.00); Mary.GetData(); cout << endl; // Agrega 3 estudiantes al proyecto y muestra su aportación RProject CEE1(5); CEE1.addStudent(&Ferd); CEE1.addStudent(&Ann); CEE1.addStudent(&Mary); CEE1.listPay(); return 0;} // La salida es la lista de estudiantes y su aportación Otros elementos • Las excepciones son casi las mismas que en Java – Intentar, arrojar, detectar • Biblioteca estándar de plantilla (STL) con vectores, listas, pilas, Parecido a Java – No puede heredar de clases STL • Múltiple herencia admitida • C tiene dos tipos de cadenas (con conversiones) – Arrays terminados en null (antiguos) – Clase String • Arrays: sólo una ubicación de memoria (ref.) – El tamaño del array se pasa como argumento indep. – Muy problemático (“sobrecarga en búfer”) • Recursión admitida, como en Java 15