insieme di problemi 1
Studia il seguente programma e rispondi alle domande seguenti. Vorremmo che rispondessi alle domande osservando solo il codice sorgente, ovvero non copiarlo in un file, compilarlo e rispondere alle domande in base alla sua esecuzione. Così non sarà più divertente!
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);
}
Domanda 1. Qual è l'output di questo programma?
| 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) | Non restituisce alcun risultato; sono presenti errori di sintassi. |
Domanda 2: cosa succede se rimuoviamo l'inizializzazione di "counter" prima del loop do-while?
| A) | Un ciclo infinito: il ciclo do-while restituirà una serie di 1 |
| B) | L'output del programma non cambierà |
| C) | Il loop do-while genera 2 e 4. |
| D) | Il ciclo do-while non restituirà nulla |
| E) | Il ciclo do-what produce i valori 3 e 9. |
Domanda 3: dato il programma originale all'inizio di questa pagina, supponiamo di avere è stata rimossa la riga che inizializza la variabile contatore prima del ciclo what. Cosa accadrebbe se rimuoviamo anche la riga contatore++ all'interno del loop "what", come in i seguenti?
| A) | Il ciclo mentre non restituisce alcun risultato. |
| B) | Il ciclo mentre produce gli output 1 e 1; il ciclo do-while non restituisce nulla. |
| C) | L'output del ciclo mentre è lo stesso di quando entrambe le righe vengono inclusi. |
| D) | Il sistema restituirà dei numeri casuali fino a quando non sposteremo il computer disattivata. |
| E) | Il ciclo "Mentre" è un ciclo infinito |
Domanda 4: dato il programma originale all'inizio di questa pagina, che cosa accadrebbe se il ciclo "Mentre" fosse così?
counter = first;
while (counter <= last) {
cout << "\n" << counter;
if (first % 2 == 0)
next = counter * counter;
cout << " " << next;
counter++;
}| A) | L'output del ciclo mentre è uguale a quello del programma originale. |
| B) | Il ciclo Mentre non genera alcun output |
| C) | L'output del ciclo mentre è 1 1 e 1 4. |
| D) | L'output del ciclo mentre è 1 2 e 2 4. |
| E) | L'output del ciclo mentre è 1 4 e 2 4. |
| F). | L'output del ciclo mentre è 2 4 e 2 4. |
Domanda 5. Che cosa succede se la prima variabile è maggiore dell'ultima?
| A) | Il ciclo mentre produrrà qualcosa, mentre nient'altro. |
| B) | Il comando <ph type="x-smartling-void-element"><br /></ph> produrrà qualcosa, mentre nient'altro. |
| C) | Non ci sarà alcun output. |
| D) | Il programma segnalerà errori o arresti anomali |
| E) | Il ciclo for restituirà qualcosa, ma nient'altro. |
Domanda 6: quale sarà l'output del programma se la prima variabile viene inizializzata sia uguale all'ultima variabile?
| A) | Il comando <ph type="x-smartling-void-element"><br /></ph> produrrà qualcosa, mentre nient'altro. |
| B) | Il ciclo mentre produrrà qualcosa, mentre nient'altro. |
| C) | Per ogni loop viene restituita una riga. |
| D) | Il ciclo do if restituirà 2 righe, mentre l'altro trasmette in loop una riga. |
| E) | Non restituirà alcun output |
| F). | Il ciclo for restituirà qualcosa, ma nient'altro. |
insieme di problemi 2
Come per la serie di problemi precedente, ecco un programma che dovrai prendere in considerazione. Rispondi alle domande che seguono osservando solo il codice sorgente.
#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;
}Domanda 1. Qual è l'output della variabile Boys sulle linee marcate?
| A) |
N. 1: 6 N. 2: 3 N. 3: 11 N. 4: 11 |
| B) |
N. 1: 6 N. 2: 3 N. 3: 11 N. 4: 3 |
| C) |
N. 1: 6 N. 2: 6 N. 3: 11 N. 4: 11 |
| D) | Non restituisce nulla perché non esegue né la compilazione né l'esecuzione. |
Domanda 2: scegli tutte le risposte pertinenti alle seguenti righe del programma:
void F1(int males, int females); void F2(int &m, int &f);
| A) | Le regole C++ indicano che è possibile rimuovere queste due righe purché vengono definiti prima dell'uso. |
| B) | Le regole C++ indicano che i nomi degli argomenti devono essere uguali tra la dichiarazione e la definizione. |
| C) | Se rimuoviamo queste due righe, il programma si arresta in modo anomalo. |
| D) | È più comune che le dichiarazioni vengano dichiarate nei globali l'ambito di attività. |
| E) | In questo caso si parla di dichiarazioni inoltrate. |
Domanda 3: se spostiamo la riga seguente da main() e la collochiamo nella che cosa accadrà?
int Boys = 3, Girls = 5;
| A) | L'output sarà lo stesso. |
| B) | i ragazzi = 3 e le ragazze = 5 in tutto l'output |
| C) | i ragazzi = 3 e le ragazze = 5 solo nell'output di main() |
Domanda 4. Cosa succederebbe se cambiassimo l'inizio del programma in questo modo:
// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;
void main() {
//int Boys = 3, Girls = 5;| A) | Il programma esegue la compilazione ma si arresta in modo anomalo quando tentiamo di eseguirlo. |
| B) | Non ci sarebbero modifiche nell'output |
| C) | L'output sarebbe Ragazzi = 3 ragazze = 5 per tutto il programma |
| D) | L'output sarebbe Boys = 3 Girls = 5 solo nell'output di main() |
| E) | È probabile che il programma non venga compilato (a seconda del compilatore). |
Domanda 5: i dati vengono trasmessi in base al valore in F2.
| A) | Vero |
| B) | Falso. |
insieme di problemi 3
Come per la serie di problemi precedente, ecco un programma che dovrai prendere in considerazione. Non dimenticare di apporre e rispondere alle domande successive esaminando solo il codice sorgente.Questa è più interessante rispetto ai due precedenti: traccia il codice con attenzione.
#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;
}
}Domanda 1: Che cosa restituisce questo programma con input di 3 per le righe e 4 per colonne?
| 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 |
| H) | Non restituisce nulla: la logica è difettosa. |
| I) | Non restituisce alcun risultato; sono presenti errori di sintassi. |
| J) | Non restituisce nulla, non dovrebbe. |
| K) | Visualizza i primi 12 numeri che ti vengono in mente mentre attendi l'esecuzione del programma. |
Domanda 2. Cosa succede se aggiungiamo la riga seguente alla funzione main()?
MAX_SIZE = 10;
| A) | Questa operazione non è consentita in C++. |
| B) | Ciò è consentito; il programma viene eseguito con MAX_SIZE impostato su 20 |
| C) | Ciò è consentito; il programma viene eseguito con MAX_SIZE impostato su 10. |
Domanda 3. Considera le seguenti quattro righe del programma sopra:
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) È possibile utilizzare un const in un typedef?
2) È possibile utilizzare un typedef in una dichiarazione prima che una variabile sia stata dichiarata di quel tipo?
| A) | 1) Sì 2) Sì |
| B) | 1) No 2) No |
| C) | 1) No 2) Sì |
| D) | 1) Sì 2) No |
Domanda 4: Possiamo usare quanto segue?
#define MAX_SIZE 20
const int MAX_SIZE = 20;
| A) | Sì, funzionerà ed è possibile usare l'hashtag #define per le costanti in C++ |
| B) | Sì, funzionerà, ma in genere non utilizziamo l'hashtag #define per le costanti in C++ |
| C) | #define non è disponibile in C++ |
| D) | Non puoi eseguire nessuna di queste operazioni in C |
Domanda 5: typedef viene utilizzato per creare un alias per un nome di tipo.
| A) | Vero |
| B) | Falso. |
Domanda 6: Cosa succederebbe se non inizializzassimo l'array su 0 nella Funzione Fill()?
| A) | Verrà eseguita, ma l'output sarà |
| B) | Funziona bene e genera lo stesso output, come se l'array fosse inizializzato su 0 |
| C) | Il programma non viene eseguito o si arresta in modo anomalo |
| D) | Verrà eseguito ma l'output sarà composto da 0 |
| E) | Verrà eseguito, ma potrebbe non generare alcun output |
Domanda 7: seleziona tutte le risposte pertinenti. Perché in questo programma utilizziamo const per MAX_SIZE? Non è più facile digitare "20" anziché MAX_SIZE ovunque si trovi necessario?
| A) | MAX_SIZE è un valore C++ integrato che chiunque può utilizzare. Appena impostato e utilizzarlo. |
| B) | I const globali devono essere evitati proprio come le variabili globali |
| C) | L'utilizzo di un const rende il nostro programma più facile da capire |
| D) | I numeri magici in un programma sono generalmente considerati una buona prassi. |
| E) | Se vogliamo modificare MAX_SIZE, dobbiamo cambiarlo solo in una luogo |
Domanda 8: l'istruzione switch nella funzione Fill() deve avere un valore predefinito perché è considerato un buon stile includerne uno.
| A) | Vero |
| B) | Falso. |
Domanda 9: Nota che nella funzione Fill() dichiariamo variabili tra le istruzioni. Ad esempio, cNum e cRow vengono dichiarate e inizializzate dopo l'esecuzione di un ciclo for. Questo funzionerà in C++ o tutte le variabili devono essere dichiarate all'inizio di la funzione?
| A) | Può farlo. |
| B) | Tutte le variabili devono essere dichiarate nella parte superiore della funzione. |
| C) | Entrambi i modi sono errati: C++ non consente l'uso di variabili in . |
| D) | Tutte le variabili devono essere dichiarate nell'ambito globale. |
insieme di problemi 4
Ecco un insieme di file che definiscono e testare una classe semplice. Come sempre, rispondi alle domande che seguono facendo riferimento solo al codice sorgente.
Ecco il file di intestazione (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_;
};
#endifEcco il file .cc associato (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;
}Ed ecco un programma client per questa lezione (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();
}Domanda 1. Quali sono i risultati di questo programma?
| A) | Bice dice: "MOO". Betsy pesa 400, è 0 e dice MOO. |
| B) | Bice dice: "MOO". Betsy pesa 400 persone, è nera e dice "MOO". |
| C) | Bice dice: "MOO". Betsy pesa 400, è |
Domanda 2: non dovremmo mai inserire il codice per i metodi di accesso e mutatore in un file di intestazione. Tieni presente che una funzione di accesso è un metodo che restituisce un valore, mentre un mutatore è un metodo che modifica un valore).
| A) | Vero |
| B) | Falso. |
Domanda 3: Abbiamo bisogno della "Mucca::" prima di ciascuna delle definizioni delle funzioni in cow.cc?
| A) | No, perché cow.h è incluso |
| B) | Sì |
Domanda 4. A cosa servono le seguenti operazioni:
#ifndef COW_H #define COW_H ... #endif
vengono riprodotti nel file di intestazione?
Seleziona tutte le risposte pertinenti:
| A) | Non servono a nulla perché il nome del file è cow.h non COW_H. |
| B) | Se non lo facessimo, riceveremmo un errore di runtime |
| C) | Se non lo facessimo, potremmo includere il file più di una volta |
| D) | Non apportano alcuna azione perché una o più parole chiave presentano errori di ortografia. |
| E) | Non fanno nulla perché la classe Cow ha un solo file di intestazione. |
Domanda 5. Che cosa succederebbe se aggiungessimo la seguente riga a cowmain.cc?
cow1.weight_ = 24;
| A) | Viene eseguito il programma e la variabile di peso modificata per questa riga. |
| B) | Il programma viene compilato ed eseguito, ma su quella riga si arresta in modo anomalo. |
| C) | Questa operazione non è consentita in C++. |
| D) | Il programma viene compilato ed eseguito, ma la variabile di peso non è modificato da questa riga. |
Domanda 6: quando si esegue la seguente riga, viene chiamato il costruttore della classe Cow:
Cow cow1;
Quali sono alcune caratteristiche importanti dei costruttori?
Seleziona tutte le risposte pertinenti
| A) | Di solito non restituiscono alcun valore |
| B) | Se non forniamo un costruttore nella nostra classe, non compilare |
| C) | Il costruttore nella classe Cow è atipico poiché non inizializza le variabili private. |
| D) | Hanno sempre lo stesso nome del corso |
| E) | Possiamo avere diversi costruttori in una classe purché gli argomenti differenziare |
| F). | Quando una classe viene installata, viene richiamato un costruttore. |
Domanda 7: quali sono alcune importanti caratteristiche di un distruttore?
| A) | Viene chiamato un distruttore quando un oggetto esce dall'ambito |
| B) | Un distruttore ha lo stesso nome della classe ma è preceduto da "~" |
| C) | C'è qualcosa che non va nel distruttore in cow.cc perché non fa nulla. |
| D) | Se non creiamo un distruttore per la nostra classe, compilare |
Domanda 8. Dato il modo in cui il programma client utilizza la classe, considera la seguenti:
La divisione dei membri in pubblico e privato nella classe Mucca non è appropriata. Ciò significa che qualcosa di privato deve essere pubblico o qualcosa di pubblico deve essere privato.
| A) | Vero |
| B) | Falso. |
Domanda 9: cosa succede se aggiungiamo un altro costruttore oltre a quello dobbiamo cow.cc. Il nuovo costruttore si presenta così
Cow::Cow(string inName, double inWeight, Color inColor) {
set_name(inName);
set_weight(inWeight);
set_color(inColor);
}E aggiungiamo le seguenti righe a main():
Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();Possiamo farlo?
Seleziona tutte le risposte pertinenti
| A) | La riga in main() in cui inizializziamo cow2 si arresta in modo anomalo. |
| B) | Possiamo avere un solo costruttore. |
| C) | Questo è comune in C++ |
| D) | Sì, ma non si tratta di un utilizzo tipico di C++ |
| E) | Questa operazione verrà eseguita correttamente, ma non restituirà alcun output perché i dati privati non vengono inizializzati. |
| F). | Non è possibile chiamare setName(), setColor() e setWeight() dall'interno di un metodo della stessa classe. |
Domande bonus
Domanda 1) Qual è l'output della seguente?
#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;
}
Domanda 2) Considera la seguente istruzione, supponendo che esista e che sia stata inizializzata una classe Apple. La classe Apple ha una variabile color_ instance:
Apple* granny_smith = new Apple;
Scegli tutte le affermazioni seguenti che sono vere:
| A) | Apple* granny_smith = NULL; if (granny_smith == NULL)... NON è un problema: NULL non è un valore che può essere controllato in questo modo. |
| B) | Apple* granny_smith, fuji; Dichiara due puntatori agli oggetti Apple |
| C) | La variabile granny_smith contiene i valori della variabile di istanza associati a un oggetto Apple |
| D) | Apple* granny_smith = NULL; Va bene, |
| E) | La variabile granny_smith contiene l'indirizzo di un oggetto Apple |
| F). | string gs_color = *(granny_smith.get_color(); Questa istruzione restituisce il colore dell'oggetto granny_smith, supponendo che sia stato inizializzato. |
| G | Lo spazio di archiviazione per il nuovo oggetto Apple è allocato nell'heap |
| H | Lo spazio di archiviazione per il nuovo oggetto Apple è allocato nello stack di runtime |
| I) | int* a = &b; In questo modo l'indirizzo di b viene inserito in a. |
Domanda 3) Qual è l'output del seguente programma?
#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;
}
Risposte al quiz
Dovresti provare a rispondere a tutte le domande precedenti senza guardare le risposte. È meglio chiedere aiuto a qualcuno che passare direttamente al foglio delle risposte per chiedere aiuto.
Puoi visualizzare le risposte ai problemi precedenti qui.