Cuestionario

Problema 1

Estudia el siguiente programa y responde las preguntas a continuación. Nos gustaría que respondieras las preguntas observando únicamente el código fuente; es decir, no lo copies en un archivo, no lo compiles ni respondas las preguntas sobre la ejecución de este. ¡Eso le sacará 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 del programa?

A) 1 a 2
2/4
1 a 2
2/4
1 a 2
De 2 a 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 genera ningún resultado, ya que hay errores de sintaxis.

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

A) Un bucle infinito: El bucle do-while muestra una serie de 1.
B) El resultado del programa no cambiará
C) El bucle esperable muestra las salidas 2 y 4.
D) El bucle do-while no mostrará nada
E) El bucle esperable muestra los resultados 3 y 9.

Pregunta 3: Dado el programa original en la parte superior de esta página, supongamos que tenemos quita la línea que inicializa la variable de contador antes del bucle while. Qué o que pasaría si también eliminamos la línea counter++ del bucle while, como en lo siguiente?

A) El bucle while no genera nada.
B) El bucle while da como resultado 1 y 1; el bucle do-while no genera nada.
C) El resultado del bucle while es el mismo que el de ambas líneas. incluidos.
D) El sistema generará números aleatorios hasta que giremos la computadora desactivado.
E) El bucle while es infinito

Pregunta 4: ¿Qué sucedería con el programa original en la parte superior de esta página? 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 el del programa original.
B) El bucle while no generará resultados
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, 2, 4.

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

A) El bucle while mostrará un resultado, pero no habrá nada más.
B) El bucle do while mostrará un resultado, 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.

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

A) El bucle do while mostrará un resultado, pero nada más.
B) El bucle while mostrará un resultado, pero no habrá nada más.
C) Cada bucle generará una línea.
D) El bucle do while generará 2 líneas, y el otro, una línea.
E) No generará resultados
F) El bucle for generará algo, pero nada más.


Conjunto de problemas 2

Al igual que en el conjunto de problemas anterior, este es un programa para que lo tengas en cuenta. Para responder las siguientes preguntas, mire ú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 nada porque no se compila ni se ejecuta.

Question 2: Elija 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 C++ indican que podemos quitar estas dos líneas siempre que los métodos se definen antes de usarlos.
B) Las reglas C++ establecen que los nombres de los argumentos deben ser los mismos entre la declaración y la definición.
C) Este programa fallará si quitamos estas dos líneas.
D) Es más común que las declaraciones se declaren en el dominio del proyecto.
E) Estas se llaman declaraciones directas.

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

int Boys = 3, Girls = 5;
A) El resultado sería el mismo.
B) Los chicos = 3 y las Niñas = 5 en toda la salida
C) Los chicos = 3 y las Niñas = 5 solo en la salida de main()

Pregunta 4: ¿Qué sucede si cambiamos el inicio del programa para que se vea así:

// 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á cambios en la salida
C) La salida sería Niños = 3 Niñas = 5 a lo largo del programa.
D) La salida sería Boys = 3 Girls = 5 solo en la salida 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, este es un programa para que lo tengas en cuenta. Por favor, y responder las preguntas que siguen mirando solo el código fuente.Este es puede ser más interesante que los dos anteriores, sigue 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: ¿Qué genera este programa con una entrada de 3 para las filas y 4 para 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 nada; la lógica es errónea.
I) No genera ningún resultado, ya que hay errores de sintaxis.
J) No genera ningún resultado, no se supone que lo haga.
K) Da como resultado los primeros 12 números que se 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ía con MAX_SIZE establecido en 10.

Pregunta 3: Ten en cuenta 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 un 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 las siguientes opciones?

#define MAX_SIZE 20
en lugar de:
const int MAX_SIZE = 20;
A) Sí, funcionará y es posible usar #define para constantes en C++
B) Sí, funcionará, pero por lo general no se usa #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 usa para crear un alias para un nombre de tipo.

A) Verdadero
B) Falso

Pregunta 6: ¿Qué pasaría si no inicialicemos el array en 0 en la Fill()?

A) Se ejecutará, pero la salida será
B) Se ejecutará bien y generará el mismo resultado que si el array estuviera inicializado en 0
C) El programa no se ejecutará o fallará
D) Se ejecutará, pero la salida será 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? ¿Acaso no es más fácil simplemente escribir "20"? en lugar de MAX_SIZE donde esté necesario?

A) MAX_SIZE es un valor de C++ integrado que cualquiera puede usar. Recién configurado y usarla.
B) Las constantes globales deben evitarse como las variables globales
C) Usar una const hace que nuestro programa sea más fácil de entender
D) Por lo general, los números mágicos en un programa se consideran una buena práctica.
E) Si queremos cambiar MAX_SIZE, solo debemos hacerlo en uno lugar

Pregunta 8: La sentencia switch de la función Fill() debería tener un valor predeterminado porque se considera un buen estilo incluir uno.

A) Verdadero
B) Falso

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

A) Está bien hacerlo.
B) Todas las variables se deben declarar en la parte superior de la función.
C) Ambas opciones son incorrectas: C++ no permite variables en ninguna parte de una .
D) Todas las variables se deben declarar en el alcance global.

Conjunto de problemas 4

A continuación, se muestra 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;
}

Y aquí hay un programa de 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: ¿Qué genera 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.
Betsy pesa 400, es

Pregunta 2: Nunca debemos colocar el código para 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: ¿Es necesario indicar "Cow::" antes de cada una de las definiciones de función en cow.cc?

A) No, ya que se incluye vaca.
B)

Pregunta 4: ¿Qué función desempeñan?:

#ifndef COW_H
#define COW_H
...
#endif

reproducir en el archivo de encabezado?

Selecciona todas las opciones que correspondan:

A) No tienen ningún propósito porque el nombre del archivo es cow.h. no COW_H.
B) Si no lo hiciéramos, obtendríamos un error de tiempo de ejecución.
C) De lo contrario, 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 tiene solo un archivo de encabezado.

Pregunta 5: ¿Qué sucedería si agregamos la siguiente línea a cowmain.cc?

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

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 compilar
C) El constructor en la clase Cow es atípico, ya que no inicializa las variables privadas.
D) Siempre tienen el mismo nombre que la clase.
E) Podemos tener varios constructores en una clase siempre que los argumentos difieren
F) Se invoca un constructor cuando se crea una instancia de una clase.

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

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

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

No es apropiada la división de 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é sucede si agregamos otro constructor además del que tenemos a cow.cc. El nuevo constructor se ve de la siguiente manera:

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 de 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 se ejecutará bien, pero no generará resultados, ya que los objetos privados no se inicializan.
F) No podemos llamar a setName(), setColor() y setWeight() desde dentro 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) Ten en cuenta la siguiente instrucción, suponiendo que existe una clase de Apple que se inicializó. La clase Apple tiene una variable de instancia color_:

Apple* granny_smith = new Apple; 

Elige todas las siguientes afirmaciones verdaderas:

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... Esto NO está bien, NULL no es un valor que se pueda verificar de esta manera.
B) Manzana* abuela_smith, fuji; Esto declara dos punteros a los objetos de 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; Esto está bien,
E) La variable granny_smith contiene la dirección de un objeto Apple
F) string gs_color = *(granny_smith.get_color()); Esta instrucción devuelve el color del objeto granny_smith, suponiendo que se ha inicializado.
G) El almacenamiento del nuevo objeto de Apple se asigna en el montón.
A) El almacenamiento del 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

Deberías intentar responder todas las preguntas anteriores sin mirar las respuestas. Es mejor pedirle ayuda a alguien que ir directamente a la hoja de respuestas para obtener ayuda.

Puedes consultar las respuestas a los problemas anteriores aquí.