Cuestionario

Conjunto de problemas 1

Estudia el siguiente programa y luego responde las preguntas a continuación. Nos gustaría que respondas las preguntas observando únicamente el código fuente; es decir, no lo copies en un archivo, lo compiles y respondas las preguntas sobre la base de su ejecución. ¡Eso le quitará toda la diversión!

int main() {
  int counter, first, last, next;
  first = 1; last = 2;

  for (counter = first; counter <= last; counter++) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
  }

  counter = first;
  while (counter <= last) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  }

  counter = first;
  do {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  } while (counter < last);
}

Pregunta 1: ¿Cuál es el resultado de este programa?

A) 1 2
2 4
1 2
2 4
1 2
2 4
B) 1 1
2 4
1 1
2 4
1 1
2 4
C) 1 1
2 4
1 1
2 4
1 1
D) 1 1
2 4
1 1
1 1
2 4
E) No muestra ningún resultado, ya que hay errores en la sintaxis.

Pregunta 2: ¿Qué sucedería si eliminamos la inicialización de "contador" antes del bucle do-while?

A) Bucle infinito: el bucle do-while generará una serie de signos 1
B) El resultado del programa no cambiará
C) El bucle do-while genera 2 y 4.
D) El bucle do-while no genera salidas
E) El bucle do-while genera 3 y 9.

Pregunta 3: Dado el programa original que se encuentra en la parte superior de esta página, supongamos que quitamos la línea que inicializa la variable del contador antes del bucle while. ¿Qué sucedería si también quitemos la línea contador++ dentro del bucle while, como se muestra a continuación?

A) El bucle while no genera ningún resultado.
B) El bucle while da como resultado 1 y 1, mientras que el bucle "while" no genera ningún resultado.
C) El resultado del bucle while es el mismo que cuando se incluyen ambas líneas.
D) El sistema mostrará números aleatorios hasta que apaguemos la computadora.
E) El bucle while es un bucle infinito

Pregunta 4: Dado el programa original en la parte superior de esta página, ¿qué sucedería si el bucle while se vería así?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) El resultado del bucle while es el mismo que en el programa original.
B) El bucle while no generará ningún resultado.
C) El resultado del bucle while es 1 1 y 1 4.
D) El resultado del bucle while es 1 2 y 2 4.
E) El resultado del bucle while es 1 4 y 2 4.
F) El resultado del bucle while es 2 4 y 2 4.

Pregunta 5: ¿Qué sucedería si la primera variable es mayor que la última?

A) El bucle while generará un resultado, pero nada más.
B) Con el bucle while, se generará algo, pero nada más.
C) No habrá ningún resultado.
D) El programa fallará o fallará.
E) El bucle for generará algo, pero nada más lo hará.

Pregunta 6: ¿Cuál será el resultado del programa si inicializamos la primera variable para que sea igual a la última variable?

A) Con el bucle while, se generará algo, pero nada más.
B) El bucle while generará un resultado, pero nada más.
C) Cada bucle generará una línea.
D) El bucle while generará 2 líneas y el otro bucle en una línea.
E) No mostrará nada
F) El bucle for generará algo, pero nada más lo hará.


Conjunto de problemas 2

Al igual que en el conjunto de problemas anterior, aquí hay un programa para que lo tengas en cuenta. Responde las siguientes preguntas observando únicamente el código fuente.

#include <iostream>
using namespace std;

int main() {
  int Boys = 3, Girls = 5;
  void F1(int males, int females);
  void F2(int &m, int &f);

  F1(Boys, Girls);
  cout << "\nAfter calling F1, within main()";
  cout << "\n\tBoys = " << Boys; // #2
  cout << "\n\tGirls = " << Girls;

  F2(Boys, Girls);
  cout << "\nAfter calling F2, within main()";
  cout << "\n\tBoys = " << Boys; // #4
  cout << "\n\tGirls = " << Girls;
}

void F1(int b, int g) {
  b += 3, g += 4;
  cout << "\nF1";
  cout << "\n\tBoys = " << b; // #1
  cout << "\n\tGirls = " << g;
}

void F2(int &b, int &g) {
  b = b + 8, g = g + 5;
  cout << "\nF2";
  cout << "\n\tBoys = " << b; // #3
  cout << "\n\tGirls = " << g;
}

Pregunta 1: ¿Cuál es el resultado de la variable Boys en las líneas marcadas?

A) N.o 1: 6
N.o 2: 3
N.o 3: 11
N.o 4: 11
B) N.o 1: 6
N.o 2: 3
N.o 3: 11
N.o 4: 3
C) N.o 1: 6
N.o 2: 6
N.o 3: 11
N.o 4: 11
D) No genera ningún resultado porque no se compila ni se ejecuta.

Pregunta 2: Elige todas las opciones que correspondan en relación con las siguientes líneas del programa:

void F1(int males, int females);
void F2(int &m, int &f);
A) Las reglas de C++ establecen que podemos quitar estas dos líneas siempre que los métodos se definan antes de su uso.
B) Las reglas de C++ establecen que los nombres de los argumentos deben ser los mismos entre la declaración y la definición.
C) El programa fallará si quitamos estas dos líneas.
D) Es más común que las declaraciones se establezcan en el alcance global.
E) Estas se denominan declaraciones futuras.

Pregunta 3: Si movemos la siguiente línea desde main() y la colocamos en el alcance global, ¿qué sucederá?

int Boys = 3, Girls = 5;
A) El resultado sería el mismo.
B) Los chicos serían = 3 y las niñas, 5 en todos los resultados.
C) Niños tendría = 3 y Girls = 5 solo en el resultado de main()

Pregunta 4: ¿Qué pasa si cambiamos el inicio del programa para que se vea de la siguiente manera?

// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;

void main() {
  //int Boys = 3, Girls = 5;
A) El programa se compilará, pero fallará cuando intentemos ejecutarlo.
B) No habría cambios en el resultado
C) La salida sería Niños = 3 niñas = 5 durante todo el programa.
D) El resultado sería Boys = 3 Girls = 5 solo en el resultado de main()
E) Es probable que el programa no se compile (según el compilador).

Pregunta 5: Los datos se pasan por valor en F2.

A) Verdadero.
B) Falso


Conjunto de problemas 3

Al igual que en el conjunto de problemas anterior, aquí hay un programa para que lo tengas en cuenta. Responde las siguientes preguntas y observa solo el código fuente.Este es más interesante que los dos anteriores: rastrea el código con cuidado.

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];

void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);

int main() {
  ARR2D matrix;
  int row, col;
  do {
    cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
    cin >> row >> col;
  } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
  Fill(matrix, row, col);
  Print(matrix, row, col);
  return(0);
}

void Print(ARR2D in_array, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++)
      cout << '\t' << in_array[i][j];
    cout << endl;
  }
}

void Fill(ARR2D in_array, int rows, int cols) {
  for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      in_array[i][j] = 0;

  const int limit = rows * cols;
  int cNum = 1;
  int cRow = 0;
  int cCol = 0;
  int cDir = 0;  // 0-north, 1-east, 2-south, 3-west

  while(true) {
    // Place the number.
    in_array[cRow][cCol] = cNum;
    cNum++;
    if (cNum > limit) break;

    int fRow = cRow;
    int fCol = cCol;
    while (true) {
      fRow = cRow;
      fCol = cCol;
      switch(cDir) {
        case 0: fRow--; break;
        case 1: fCol++; break;
        case 2: fRow++; break;
        case 3: fCol--; break;
      }

      if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
        break;
      cDir = (cDir + 1) % 4;
    }
    cRow = fRow;
    cCol = fCol;
  }
}

Pregunta 1: ¿Cuál es el resultado de este programa con una entrada de 3 para las filas y 4 para las columnas?

A) 1 2 3
4 5 6
7 8 9
10 11 12
B) 1 2 3 4
5 6 7 8
9 10 11 12
C) 12 11 10 9
8 7 6 5
4 3 2 1
D) 1 3 2 4
8 6 7 5
9 11 10 12
E) 1 2 3 4
10 11 12 5
9 8 7 6
G) 9 8 7 6
10 11 12 5
1 2 3 4
A) No genera resultados; la lógica es defectuosa.
I) No muestra ningún resultado, ya que hay errores de sintaxis.
J) No genera ningún resultado. No se supone que lo haga.
K) Como resultado, se muestran los primeros 12 números que te vienen a la mente mientras esperas a que se ejecute el programa.

Pregunta 2: ¿Qué sucede si agregamos la siguiente línea a nuestra función main()?

MAX_SIZE = 10;
A) Esto no está permitido en C++.
B) Esto está permitido; el programa se ejecutará con MAX_SIZE establecido en 20
C) Esto está permitido; el programa se ejecutará con MAX_SIZE establecido en 10.

Pregunta 3: Considera las siguientes cuatro líneas del programa anterior:

const int MAX_SIZE = 20;
typedef int ARR2D [MAX_SIZE][MAX_SIZE];

void Print  (ARR2D A, int rows, int cols);
void Fill   (ARR2D A, int rows, int cols);

1) ¿Es posible usar una constante en typedef?
2) ¿Es posible usar typedef en una declaración antes de que se declare una variable de ese tipo?

A) 1) Sí 2) Sí
B) 1) No 2) No
C) 1) No 2) Sí
D) 1) Sí 2) No

Pregunta 4: ¿Podemos usar lo siguiente?

#define MAX_SIZE 20
en lugar de:
const int MAX_SIZE = 20;
A) Sí, funcionará y es correcto usar #define para constantes en C++
B) Sí, funcionará, pero generalmente no usamos #define para constantes en C++.
C) #define no está disponible en C++
D) No puedes hacer ninguna de estas acciones en C

Pregunta 5: typedef se utiliza para crear un alias para un nombre de tipo.

A) Verdadero.
B) Falso

Pregunta 6: ¿Qué sucedería si no inicializamos el array en 0 en la función Fill()?

A) Se ejecutará, pero el resultado será el número 12
B) Se ejecutará bien y generará el mismo resultado que si se inicializara el array en 0.
C) El programa no se ejecutará o fallará.
D) Se ejecutará, pero el resultado tendrá solo 0
E) Se ejecutará, pero es posible que no genere ningún resultado.

Pregunta 7: Marca todas las opciones que correspondan. ¿Por qué usamos const para MAX_SIZE en este programa? ¿No es más fácil escribir "20" en lugar de MAX_SIZE cuando sea necesario?

A) MAX_SIZE es un valor C++ integrado que cualquier persona puede usar. Solo configúralo y úsalo.
B) Las constantes globales deben evitarse al igual que las variables globales
C) El uso de una const hace que nuestro programa sea más fácil de entender
D) Por lo general, en un programa, los números mágicos se consideran una buena práctica.
E) Si queremos cambiar MAX_SIZE, solo tenemos que hacerlo en un lugar

Pregunta 8: La sentencia switch de la función Fill() debe tener mayúsculas predeterminadas, ya que incluir uno se considera un buen estilo.

A) Verdadero.
B) Falso

Pregunta 9: Observe que la función Fill() declara variables entre sentencias. Por ejemplo, cNum y cRow se declaran y se inicializan después de la ejecución de un bucle for. ¿Funcionará en C++ o todas las variables se deberán declarar en la parte superior de la función?

A) No hay problema.
B) Todas las variables se deben declarar en la parte superior de la función.
C) Ambas maneras son incorrectas: C++ no permite variables en ninguna parte de un programa.
D) Todas las variables se deben declarar en el alcance global.

Conjunto de problemas 4

Este es un conjunto de archivos que definen y prueban una clase simple. Como de costumbre, responde las siguientes preguntas refiriéndose solo al código fuente.

Este es el archivo de encabezado (cow.h):

#ifndef COW_H
#define COW_H

using namespace std;

typedef enum Color {black, brown, beige, blackandwhite, nocolor};

class Cow {
 public:
  Cow();
  ~Cow();

  // accessors
  double weight() { return weight_; };
  string name() { return name_; };
  Color color() { return color_; };

  // mutators
  void set_name(string inName) { name_ = inName; };
  void set_color(Color inColor) { color_ = inColor; };
  void set_weight(double inWeight) {weight_ = inWeight; };

  void Moo();
  void Properties();

 private:
  Color color_;
  double weight_;
  string name_;
};

#endif

Este es el archivo .cc asociado (cow.cc):

#include <iostream>
#include "cow.h"

using namespace std;

Cow::Cow() {}

Cow::~Cow() {}

void Cow::Moo() {
  cout << name() << " says MOO." << endl;
}

void Cow::Properties() {
  cout << name() << " weighs " << weight() << ", is "
       << color() << " and says MOO." << endl;
}

Este es un programa cliente para esta clase (cowmain.cc):

#include <iostream>
#include "cow.h"

using namespace std;

int main() {
  Cow cow1;
  cow1.set_name("betsy");
  cow1.set_weight(400.0);
  cow1.set_color(black);

  cow1.Moo();
  cow1.Properties();
}

Pregunta 1: ¿Cuál es el resultado de este programa?

A) Betsy dice "MOO".
betsy pesa 400, es 0 y dice MOO.
B) Betsy dice "MOO".
betsy pesa 400, es negra y dice "MOO".
C) Betsy dice "MOO".
pesa 400, es

Pregunta 2: Nunca debemos colocar el código de los métodos de acceso y mutador en un archivo de encabezado. (ten en cuenta que un descriptor de acceso es un método que muestra un valor y un mutador es un método que modifica un valor).

A) Verdadero.
B) Falso

Pregunta 3: ¿Necesitamos “Cow::” antes de cada una de las definiciones de las funciones en cow.cc?

A) No, ya que se incluye cow.h
B)

Pregunta 4: ¿Qué rol desempeñan?

#ifndef COW_H
#define COW_H
...
#endif

reproducir en el archivo de encabezado?

Selecciona todas las opciones que correspondan:

A) No cumplen ningún propósito porque el nombre del archivo es cow.h no COW_H.
B) Si no lo hacemos, obtendríamos un error de tiempo de ejecución
C) Si no lo hacemos, podríamos incluir el archivo más de una vez.
D) No hacen nada porque una o más de las palabras clave están mal escritas.
E) No hacen nada porque la clase Cow solo tiene un archivo de encabezado.

Pregunta 5: ¿Qué pasaría si añadiéramos la siguiente línea a cowmain.cc?

cow1.weight_ = 24;
A) Esta línea se ejecutaría el programa y esta línea modificaría la variable de peso.
B) El programa se compilaría y se ejecutaría, pero fallará en esa línea.
C) C++ no lo permite.
D) Se compilará y ejecutará el programa, pero esta línea no modificará la variable de peso.

Pregunta 6: Cuando se ejecuta la siguiente línea, se llama al constructor de la clase Cow:

Cow cow1;

¿Cuáles son algunas características importantes de los constructores?

Selecciona todas las opciones que correspondan.

A) Por lo general, no muestran ningún valor
B) Si no proporcionamos un constructor en nuestra clase, esta no se compilará.
C) El constructor de la clase Cow es atípico, ya que no inicializa las variables privadas.
D) Siempre tienen el mismo nombre que la clase.
E) Se pueden tener varios constructores en una clase siempre que los argumentos difieran
F) Se invoca un constructor cuando se crea una instancia para una clase.

Pregunta 7: ¿Cuáles son algunas características importantes de un destructor?

A) Se llama a un destructor cuando un objeto sale del alcance.
B) Un destructor tiene el mismo nombre que la clase, pero precedido por "~"
C) Hay algo incorrecto en el destructor de cow.cc, ya que no hace nada.
D) Si no creamos un destructor para nuestra clase, esta no se compilará.

Pregunta 8: Dada la forma en que el programa cliente usa la clase, considera lo siguiente:

No se permite la división de los miembros en públicos y privados en la clase Cow. Es decir, algo que es privado debe ser público o algo que es público debe ser privado.

A) Verdadero.
B) Falso

Pregunta 9: ¿Qué pasaría si agregamos otro constructor además del que tenemos que cow.cc. El nuevo constructor se ve así:

Cow::Cow(string inName, double inWeight, Color inColor) {
  set_name(inName);
  set_weight(inWeight);
  set_color(inColor);
}

Y agregamos las siguientes líneas a main():

Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();

¿Podemos hacer esto?

Selecciona todas las opciones que correspondan.

A) La línea en main() donde inicializamos cow2 fallará.
B) Solo podemos tener un constructor.
C) Esto es común en C++
D) Sí, pero este no es el uso típico de C++
E) Esto funcionará bien, pero no generará ningún resultado porque los elementos privados no se inicializaron.
F) No podemos llamar a setName(), setColor() y setWeight() desde un método de la misma clase.


Preguntas adicionales

Pregunta 1) ¿Cuál es el resultado de lo siguiente?

#include <iostream>
using namespace std;

void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);

void HelpMe(int *p, int *num, int *q) {
  int a;

  a = 2;
  q = &a;
  *p = *q + *num;
  num = p;
}


void WhereAmI(int *p, int *q, int a) {
  a = 6;
  *p = a + *p;
  *q = a + 3;
  HelpMe(q, &a, p);
}


int main() {
  int *p;
  int q;
  int *num;
  int a;

  a = 3;
  q = 5;
  p = &a;
  num = &q;

  HelpMe(&a, p, num);
  WhereAmI(&q, p, *num);

  cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
 

Pregunta 2: Considere la siguiente afirmación, suponiendo que existe una clase de Apple que se inicializó. La clase de Apple tiene una variable color_instance:

Apple* granny_smith = new Apple; 

A continuación, selecciona todas las afirmaciones que sean verdaderas:

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... Esto NO está bien, NULL no es un valor que se pueda comprobar de esta manera.
B) Apple* granny_smith, fuji; esto declara dos punteros a objetos Apple
C) La variable granny_smith contiene los valores de la variable de instancia asociados con un objeto de Apple.
D) Apple* granny_smith = NULL; No hay problema,
E) La variable granny_smith contiene la dirección de un objeto de Apple
F) string gs_color = *(granny_smith.get_color()); Esta sentencia muestra el color del objeto granny_smith.
G) El almacenamiento para el nuevo objeto de Apple se asigna en el montón.
A) El almacenamiento para el nuevo objeto de Apple se asigna en la pila del entorno de ejecución.
I) int* a = &b; Esto coloca la dirección de b en a.


Pregunta 3) ¿Cuál es el resultado del siguiente programa?

#include <iostream>
using namespace std;

const int kNumVeggies = 4;

void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);


void Grill(int squash, int *mushroom) {
  *mushroom = squash/4;
  cout << *mushroom + squash << endl;
}

int Saute(int onions[], int celery) {
  celery *= 2;
  onions[celery]++;
  Grill(onions[0], &onions[3]);
  cout << celery << " " << onions[3] << endl;
  return celery;
}

int main() {
  int broccoli, peppers[kNumVeggies], *zucchini;

  for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
    peppers[broccoli] = kNumVeggies - broccoli;
  zucchini = &peppers[Saute(peppers,1)];
  Grill(*zucchini, zucchini);
  zucchini--;
  cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}


Respuestas del cuestionario

Debes intentar completar todas las preguntas anteriores sin mirar las respuestas. Es mejor pedirle ayuda a alguien que ir directamente a la hoja de respuestas para pedir ayuda.

Puedes ver las respuestas a los problemas anteriores aquí.