resumen básico c++ vol 2

Upload: nicodoma

Post on 06-Jul-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/16/2019 Resumen Básico C++ vol 2

    1/11

     

    Ejercitario de C++Vol. 2Propiedad exclusiva de Team Compu

    A pedido del público sale el volumen 2 del resumen/ejercitario que todos aman.

    Solo voy a escribir sobre punteros y métodos de ordenación ya que creo que es

    lo único que le falto al anterior.

    Juan José Cabrera Ugarte

  • 8/16/2019 Resumen Básico C++ vol 2

    2/11

    Team Compu - C++ Vol 2

    No espere que el resumen pasado les sirviese de tanto así que vamos a intentar que

    este no se quede atrás. Para empezar con punteros vamos a imaginarnos que son como el

    índice de un libro: Dicen dónde está la información que buscamos pero en realidad ellos no

    contienen esa información.

    Punteros:

    ¿Se acuerdan que les había dicho que las funciones usan memorias separadas? Bueno, para

    entender cómo funcionan los punteros conviene imaginarnos la memoria como una planilla de

    Excel: en cada celda se puede guardar un byte de información y éstas están referidas con un

    nombre o código único. Los punteros son algo complicados así que vamos a explicar cada parte

    con lujo de detalle, perdón si a alguno de ustedes le molesta esto.

    Operador de dirección (&):

    Los punteros en la informática se llaman así porque “apuntan” a una dirección en la

    memoria, pero… ¿Cómo diferencia de cuando le damos un valor  a una dirección de

    memoria? Para eso existe el &.

    Supongamos que tenemos una variable myvar   guardada en la memoria. Ahora

    escribimos el siguiente código:

    1 foo = &myvar;

    Esto lo que hace es guardar la dirección de memoria de myvar  en la variable foo. Así es

    como la computadora interpreta el &, al poner en frente de una variable no le estamos

    diciendo que guarde en foo el valor de la otra variable sino su ubicación.

    Ahora supongamos que escribimos lo siguiente:

    1

    2

    3

    myvar = 25;

    foo = &myvar;

    bar = myvar;

    Para simplificar la comprensión de esto vamos a suponer que la dirección de memoria

    se guía por números decimales (en realidad son hexadecimales, pero eso voy a explicar

    después) y entonces el código lo que haría sería algo como esto

    Primero se guarda el 25 en myvar   en un lugar cualquiera de la memoria (en este

    ejemplo: 1776). Luego asignamos a  foo  la posición de myvar , por eso vemos que se

    guardó 1776 y no 25. Finalmente asignamos a bar  el valor de myvar .

  • 8/16/2019 Resumen Básico C++ vol 2

    3/11

    Con el ejemplo anterior creo que se debería entender bien cómo funciona el &, así que

    pasamos a lo siguiente en punteros.

    Operador de indirección (*):

    El nombre copie del material guía de Rojitas y me entero que se llama así, pero en

    punteros esto es tanto o inclusive más importante que el operador &. Ahora sabemos

    cómo guardar la dirección de memoria en una variable, pero eso no es suficiente para

    considerarlo un puntero.

    Manejar la ubicación en la memoria es interesante en muchas ocasiones, como vamos

    a ver al aplicar en matrices y vectores, pero ¿de qué nos sirve manejar la dirección si

    no podemos acceder al valor guardado en esa dirección? Para eso existe el *.

    Teniendo siempre en cuenta el ejemplo anterior, escribimos el siguiente código:

    1 baz = *foo;

    Básicamente, el * sirve para acceder al valor guardado en la posición de memoria

    ingresado. Del ejemplo anterior tenemos que  foo  = 1776, que es la ubicación en la

    memoria de myvar . Pero al colocar el * antes de  foo  lo que en realidad hacemos es

    guardar el valor que está en la posición 1776 de la memoria (o sea, la posición de

    myvar ), que es 25, en baz. Admito que es confuso, pero por suerte esta imagen se

    explica a si misma bastante bien.

    Ahí ven como foo lo que hace es decir en dónde esta guardada la información nomas,

    sin tener dicha información guardada en sí mismo.

    Con esto debería quedar claro también cómo funciona el operador * y probablemente se

    habrán dado cuenta que estos operadores se complementan entre sí: Siendo uno el que asigna

    la dirección de memoria y el otro el que accede a dicha ubicación. Ahora podemos empezar a

    declarar punteros.

    Declaración de punteros:

    Así como todas las variables, los punteros también tienen tipos (int, char, float, etc.) y

    lastimosamente, al igual que en los vectores y matrices, un puntero del tipo int solo

    puede apuntar a una variable de tipo int.

  • 8/16/2019 Resumen Básico C++ vol 2

    4/11

    Si, son muy plagas, pero su sintaxis por suerte no es muy complicada:

    1

    2

    3

    int * entero;

    char * letra;

    double * decimal;

    Creo que no hace falta explicación ya que es sólo la sintaxis de cómo se declara, así

    que pasamos a lo interesante

    1

    2

    3

    4

    5

    6

    7

    8

    9

    1011

    12

    13

    14

    15

    16

    17

    // ejemplo de punteros 

    #include  

    using namespace std;

    int main ()

    {

    int x, y;

    int * puntero;

    puntero = &x;*puntero = 10;

    puntero = &y;

    *puntero = 20;

    cout

  • 8/16/2019 Resumen Básico C++ vol 2

    5/11

    1

    2

    3

    4

    5

    6

    78

    9

    10

    11

    12

    13

    14

    15

    16

    17

    // punteros en vectores 

    #include  

    using namespace std;

    int main ()

    {

    int v[5];int * p;

    p = v; *p = 10;

    p++; *p = 20;

    p = &v[2]; *p = 30;

    p = v + 3; *p = 40;

    p = v; *(p+4) = 50;

    for (int i=0; i

  • 8/16/2019 Resumen Básico C++ vol 2

    6/11

      *p*=5: multiplica por 5 el valor de *p y lo vuelve a guardar en esa ubicación

      *(p++)/=3: aumenta la posición a la que apunta y luego divide su valor entre 3

    para después volver a almacenarlo en la ubicación a la que apunta

    Estas y muchas otras combinaciones se pueden utilizar, si bien son un poco complicadas al

    comienzo son muy útiles cuando se aplican en programas complejos.

    Notas extras:

    Para trabajar con puntero y matrices el funcionamiento es idéntico al de vectores, solo

    que el puntero no va a tomar la matriz como tal, sino como un vector alargado con

    todas las componentes una seguida de la otra.

    Se puede apuntar un puntero a otro puntero, pero esto requiere una declaración un

    tanto rara (tipo_del_puntero ** nombre_de_puntero;) y esto ni aparece en el material

    de Rojitas, perdón Solaeche por ocupar tu memoria con información innecesaria.

    Métodos de ordenación:

    Ya pasamos lo que creo que era lo más complicado de entender que eran los punteros, y el

    hecho de que me ocupo casi 5 páginas es un claro ejemplo de su complejidad. Ahora vamos a

    ver los distintos métodos de ordenación y voy a tratar de explicar cómo funcionan, aunque

    igual van a tener que memorizar al algoritmo en sí.

    Método de Burbuja: 

    El método que posiblemente sea el más conocido, también es el método más seguro

    pero el que consume más memoria y el más lento:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    1314

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    2627

    // metodo de burbuja 

    #include  

    using namespace std;

    int validar();

    int main()

    {

    cout

  • 8/16/2019 Resumen Básico C++ vol 2

    7/11

    28

    29

    30

    31

    32

    33

    3435

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    }

    cout

  • 8/16/2019 Resumen Básico C++ vol 2

    8/11

    11

    12

    13

    14

    15

    16

    1718

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    3031

    32

    33

    34

    35

    35

    36

    37

    38

    39

    40

    41

    4243

    44

    45

    46

    cout

  • 8/16/2019 Resumen Básico C++ vol 2

    9/11

    Método de Selección:

    Finalmente el tercer método y también el más inestable según muchos materiales,

    este método es muy poco recomendado aunque capaz sea uno de los más sencillos de

    entender:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    1314

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    2627

    28

    29

    30

    31

    32

    33

    34

    35

    35

    36

    37

    3839

    40

    41

    42

    43

    44

    // metodo de seleccion 

    #include  

    using namespace std;

    int validar();

    int main()

    {

    cout

  • 8/16/2019 Resumen Básico C++ vol 2

    10/11

    17

    18

    19

    20

    21

    22

    2324

    25

    26

    27

    28

    for(j=0; j

  • 8/16/2019 Resumen Básico C++ vol 2

    11/11

    Ejercicios

    1. 

    Escribir un programa que permita cargar un vector de N componentes, el usuario

    deberá cargar el valor de N y las componentes individuales usando punteros. Luego

    imprimirlo en pantalla.

    2. 

    Calcular la traza de una matriz usando punteros y luego imprimirlo en pantalla. La

    matriz podrá ser aleatoria o no, como el programador prefiera.

    3.  Usando punteros calcular el menor y mayor elemento de:

      Un vector de 12 componentes

      Una matriz de 3x4

    4.  Escribir un programa que, usando punteros, intercambie las componentes de las

    diagonales de una matriz.

    5.  Usando punteros generar una matriz aleatoria de MxN componentes y luego ordenarla

    por los 3 métodos estudiados.

    6. 

    Escribir un programa que genere un vector de 5 componentes aleatorias, luegoimprima la dirección en la memoria de cada componente. Hallar una explicación del

    porqué aumentan según un valor fijo y verificar si es o no independiente de los valores

    del vector.

    7. 

    Escribir un programa que imprima la transpuesta de una matriz cargada por el usuario,

    se deberá implementar una función para dicho proceso.

    8.  Se dispone de dos vectores, maestro y esclavo, de componentes enteras y positivas e

    igual número de elementos. Se deben imprimir en dos columnas adyacentes. Se

    ordena el vector maestro, pero siempre que un elemento de maestro se mueva, el

    elemento correspondiente de esclavo debe moverse también; es decir, cualquier

    acción hecha con maestro[i] debe hacerse a esclavo[i]. Después de realizar la

    ordenación se imprimen de nuevo los vectores. Escribir un programa que realice esta

    tarea. Observación: Utilizar como algoritmo de ordenación, el método de inserción.

    Ejercicio by Rojitas 

    Personalmente busque mucho y en los finales no suelen salir punteros así que con este nivel

    de ejercicios creo que deberían estar preparados para lo que venga.