Quiz

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
anziché:
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)

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.