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