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_; }; #endif
Ecco 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.