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
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_;
};
#endifEste 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) | Sí |
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í.