Per iniziare

Impara con l'esempio

Uno dei modi migliori per imparare a programmare in una nuova lingua è osservare tantissimi programmi di esempio. La cosa migliore da fare è copiare e incollare ciascun programma di seguito in un file di testo e compilarlo. Poi, prova gli esperimenti. Estendendo questi programmi di esempio, acquisirai familiarità con diversi aspetti di C++ e ti sentirai più sicuro quando dovrai scrivere programmi da zero.

Esempio 1: fai lavorare il compilatore!

Se non lo hai già fatto, copia e incolla il seguente programma classico in un file di testo e compilalo. Le istruzioni sulla compilazione sono disponibili qui.

Probabilmente hai esaminato i dettagli di questo programma nel tutorial, quindi non forniremo una descrizione riga per riga qui. Tuttavia, ci sono alcune cose da notare riguardo alla leggibilità. Si riferisce ai commenti e alla formattazione che aiutano a rendere i programmi facili da leggere, comprendere e gestire.

  • Ogni programma che scriviamo inizia con un commento all'intestazione, in cui vengono indicati il nome dell'autore, i dati di contatto, una breve descrizione e l'utilizzo (se pertinente). Ogni funzione inizia con un commento sul funzionamento e sull'utilizzo.
  • Aggiungiamo commenti esplicativi utilizzando frasi complete ogni volta che il codice non si documenta, ad esempio se l'elaborazione è complessa, non chiara, interessante o importante.
  • Utilizza sempre nomi descrittivi: le variabili sono parole minuscole separate da _, come in my_variable. I nomi delle funzioni utilizzano lettere maiuscole per contrassegnare le parole, come in MyExcitingFunction(). Le costanti iniziano con "k" e utilizzano le lettere maiuscole per contrassegnare le parole, ad esempio in kDaysInWeek.
  • Il rientro è in multipli di due. Il primo livello è di due spazi; se è necessario un ulteriore rientro, utilizziamo quattro spazi, sei spazi e così via.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

Alcuni esperimenti da provare:

  • La cosa più importante è assicurarsi di poter compilare ed eseguire questo programma.
  • Modifica il programma sopra per stampare "Hello World!" 4 volte su una riga per 6 righe, ciascuna stampata in un campo di 17 spazi. A questo scopo, usa lo strumento for-loop. Fai clic qui per scoprire di più sulla formattazione dell'output con cout. Fai clic qui per vedere la soluzione.
  • Utilizzando il programma appena completato, scopri come stampare "Hello World!" allineato a sinistra nei campi di 17 spazi (l'impostazione predefinita è solitamente allineato a destra). Fai clic qui per vedere la soluzione.

Esempio 2: ricevere un input

È facile ottenere input dalla tastiera in C++ usando cin. Ecco un esempio:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

Un esperimento:

  • Quando viene commesso un errore di input, il flusso si "interrompe", cin restituisce false e il programma si interrompe. È molto importante proteggersi da questi errori come nel programma precedente. E se volessimo ripristinare l'errore anziché interrompere il programma? Per ripristinare un errore sono previsti due passaggi:
    1. Cancella l'errore con cin.clear().
    2. Rimuovi i personaggi errati dallo stream. Un modo per farlo è utilizzare cin.ignore().

Scrivi un programma in grado di recuperare da input errati utilizzando questi due passaggi. Utilizza Google per cercare come funzionano questi metodi. La nostra soluzione è disponibile qui.

Esempio 3: cosa produce questo programma?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

Esempio 4: la scomposizione rende tutto più facile...

È ora di iniziare a scrivere giochi per computer! La prima è un po' semplice, ma è un inizio. Il nostro compito è scrivere un programma che implementi un gioco di ipotesi. Il nostro programma genera un numero casuale compreso tra 0 e 100. Il player deve indovinare il numero segreto. Il programma fornisce suggerimenti come "troppo alto" o "troppo basso" finché il giocatore non indovina finalmente il numero segreto.

Lavoreremo su questo gioco in tre passaggi. 

  1. Capire come generare un numero casuale all'interno di un determinato intervallo di valori.
  2. Crea una funzione principale che elabori un'ipotesi dal player e fornisca suggerimenti.
  3. Aggiungi ciò che è necessario consentire per più ipotesi finché il player non indovina il numero.

Questo processo di sviluppo è chiamato scomposizione, suddividendo un'attività in attività secondarie, ognuna delle quali è facile da eseguire.

A partire dal passaggio 1, esegui una ricerca su Google per scoprire come generare un numero casuale utilizzando C++. Prova a cercare "rand C++". Qui è la nostra soluzione. 

Per il passaggio 2, dobbiamo ricevere un input di un numero intero dal player (con un controllo degli errori appropriato su cin) e confrontarlo con il numero secret. Prova a scrivere questa parte del gioco prima di controllare la nostra soluzione.

Infine, dobbiamo aggiungere un ciclo che continui a raccogliere supposizioni dal player finché non indovina il numero segreto. Dopo aver completato questa parte del programma, puoi controllare la nostra soluzione.

La decomposizione è una delle competenze più importanti per un programmatore. Essere in grado di suddividere un'attività in più parti gestibili e completarne una alla volta è fondamentale, indipendentemente dalle dimensioni del progetto. Ecco altre opportunità per esercitarti con la decomposizione.

  • Molte attività quotidiane offrono l'opportunità di sviluppare competenze in decomposizione. Potrebbe sorprenderti scoprire che la tua mente funziona in questo modo.

    Ad esempio, se devo pulire una cucina disordinata (ad esempio alcune bambine hanno appena fatto una torta), scomponiamo le attività per fornirmi un piano e mi assicuro di non dover lavorare di nuovo in seguito. Non voglio lavare il pavimento prima se ci sono oggetti di ogni tipo da pulire. Probabilmente dovrò farlo più tardi. Quindi, magari ho messo via tutti gli ingredienti per primi, sposto tutti i piatti nel lavandino, pulisco i piani di lavoro, lavo i piatti e, infine, pulisco il pavimento. Esistono altri modi per eseguire questa attività, ma pensarci bene all'inizio mi aiuta a definire un piano che non richiede una rielaborazione.

    Utilizza le attività quotidiane come esempio per sviluppare le tue capacità di decomposizione. Chissà, potrebbe persino renderti più efficiente in casa!

  • Il massimo comun divisore tra due numeri interi è il più grande che li divide in modo uniforme. Ad esempio, gcd(12, 18) = 6, gcd(−4, 14) = 2. Il modo più efficiente per calcolare il gcd è mediante l'algoritmo euclideo. Scrivi un programma con una funzione per calcolare il valore gcd per due numeri interi. Prova prima a eseguire la funzione senza ricorsione, ti aiuterà a capire come funziona l'algoritmo.

    Definisci in modo esplicito le attività secondarie, ad esempio trova il codice per l'algoritmo euclidea, crea una funzione non ricorsiva per l'algoritmo e così via. Qui è la nostra soluzione.

Esempio 5: puzzle matematici

Una delle potenze dell'informatica è la capacità di cercare una soluzione a un problema con la forza bruta. Le prove e gli errori funzionano bene per alcuni problemi. In effetti, i computer possono essere particolarmente bravi a risolvere questi problemi. Considera questo aspetto:

I cavalli costano 10 $, i maiali 3 $e i conigli solo 0, 50 $. Un contadino compra 100 animali a 100 $. Di ciascun animale, quanti ne ha acquistati? 

Esiste una soluzione estremamente semplice a questo problema. Prova a trovarlo prima di dare un'occhiata al nostro.

Eccone un'altra da provare:
In quanti modi si possono sistemare 6 libri diversi, da sinistra a destra, su uno scaffale?

Questa volta ti forniremo solo la soluzione e ti consentiremo di scrivere il programma: 720.

Esempio 6: stringhe da prendere in considerazione

Cosa produce il seguente output del programma?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

Fai clic qui per ricevere assistenza.

Esempio 7: Passaggi successivi con la decomposizione - Il tuo primo giorno del lavoro

Hai appena acquisito una posizione come venditore per l'azienda ExerShoe, specializzata in scarpe sportive di fascia alta che costano circa 225 $al paio. Il tuo capo ti ha dato tre opzioni di risarcimento, che devi scegliere prima di iniziare il primo giorno:

  1. Stipendio diretto di 600 $a settimana;
  2. Uno stipendio di 7,00 dollari all'ora più una commissione del 10% sulle vendite;
  3. Nessuno stipendio, ma commissioni del 20% e 20 $per ogni paio di scarpe venduto

In qualità di programmatore esperto in C++, pensi di poter scrivere un programma per decidere quale sia il compenso migliore.

Un approccio comune nella scomposizione di un programma più ampio consiste nel creare una funzione principale che assomiglia a uno schema per risolvere il problema. Poi, scriviamo le funzioni per eseguire ogni attività.

Ecco un primo passaggio per il programma principale:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

Prova a implementare ciascuna di queste funzioni prima di esaminare la nostra soluzione.

Esempio 8. Che cosa è disponibile, dove?

Qual è l'output del seguente programma?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

Una volta trovata la risposta, consulta la nostra versione commentata del codice qui.

Esempio 9: elaborazione dei file

L'elaborazione dei file in C++ viene eseguita utilizzando fstream. Per salvare in un file, dichiariamo un flusso di dati e lo apriamo in modalità "out". Vediamolo nel seguente esempio.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • Prova a capire come aprire il file appena creato e a visualizzare i dati.Questa è la nostra soluzione.
  • Ora prova a modificare questo programma per consentire all'utente di inserire molti record di dati utilizzando un loop. Vogliamo anche leggere di nuovo tutti i dati, un record alla volta.Questa è la nostra soluzione.

Ora sei pronto a provare alcuni esercizi e progetti in autonomia.

Cosa significa essere un software engineer per Google

Scopri cosa significa lavorare per Google su questo sito web.

Esercizi e progetti

I seguenti esercizi ti consentiranno di esercitarti ulteriormente con il C++ di base. Non forniamo soluzioni per questi esercizi e progetti perché vorremmo che collaborassi con altri studenti di questo corso.

  1. Il suono del cricket dei campi più comuni è direttamente proporzionale alla temperatura attuale. Sommando 40 al numero di volte in cui un cricket suona in un minuto, dividi questo valore per 4 per ottenere la temperatura. Scrivi un programma che prenda come input il numero di segnali acustici in un minuto e mostri la temperatura corrente. Ad esempio,
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. Scrivi un programma che calcolerà il voto finale di un corso di programmazione che stai seguendo. Ecco lo schema di valutazione:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    Il programma deve chiedere all'utente i quattro punteggi dei compiti, la valutazione intermedia, il voto finale e la sezione. Successivamente, viene calcolato e stampato il punteggio finale. Per eseguire i calcoli, devi calcolare la media dei quattro punteggi di assegnazione e moltiplicarla per 0,4 (40%). Si moltiplica quindi il punteggio di metà semestre per 0,15, il punteggio finale per 0,35 e il voto di partecipazione per 0,1. Quindi somma tutti i risultati di queste moltiplicazioni.

    Utilizza le funzioni ovunque ti sia possibile in questo programma. Puoi creare una funzione per ottenere l'input trasmettendo come parametro la stringa da visualizzare in un riquadro esplicativo. Ecco un esempio di esecuzione:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. Man mano che i cronometri elettronici diventano più economici e precisi, senza dubbio ci soffermeremo su misurazioni del tempo incredibilmente accurate. Scrivi un programma che prenda come input un periodo di tempo specificato in secondi e restituisca il numero di ore, minuti e secondi che rappresenta. Ad esempio:
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. Nella sezione che segue, esegui la decomposizione prima di scrivere il programma. Utilizza le funzioni ove possibile per creare programmi ben strutturati.

  5. Supponiamo di voler stampare un banner per quanto segue:

    "LA BREVE CONGELATA FERIE IL CONgelamento di 3 ALBERI"

    Vogliamo che le lettere siano molto grandi poiché questo è un banner:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    e così via.

    Essendo un buon decompositore per problemi, probabilmente avrai notato che invece di inserire tutti i cout nella funzione principale, sarebbe molto più efficiente inserirli nelle funzioni. Potremmo avere una funzione "printE" e una funzione "printZ" e così via.

    Scrivi un programma con funzioni che creino un banner di una parola o una frase con tante lettere ripetute. Alcune possibilità:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. Ecco un problema di "numero magico": chiedi a un utente di inserire un numero di tre cifre la cui prima cifra è maggiore dell'ultima. Il programma invertirà il numero e sottrarrà l'annullamento dal numero originale. Infine, inverti il numero risultante e aggiungilo alla forma non inversa. Restituisce come output il risultato finale. Il numero originale inserito dall'utente deve essere di tipo intero (non tre caratteri). Pensa a come scrivere una funzione che prenda un numero intero come input e restituisca il contrario di quel numero. Esempio:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. La legge impone ai produttori di prodotti alimentari di inserire date di scadenza sui loro prodotti, ma esiste una scappatoia: non è necessario che la data di scadenza sia in una forma particolare. Quindi, può essere scritto in swahili ed essere comunque legale.

    Nadine, cugina di terzo grado di Ralph Nader, è una spia della qualità alimentare autonominata. Ha scoperto che molti produttori di prodotti alimentari hanno iniziato a codificare le date di scadenza dei prodotti per impedire ai clienti di sapere da quanto tempo sono i prodotti.

    Tuttavia, la codifica consente ai negozi di alimentari di calcolare le date di scadenza se, per qualche motivo, lo desiderano.

    Un metodo di codifica molto diffuso:

    • codifica i mesi da gennaio a dicembre come da "A" a "L"
    • codifica ogni cifra della data da "Q" a "Z"
    • codificano l'anno da "A" a "Z", con un numero da 1 a 26 che viene poi aggiunto al 1995.

    Nadia ha trovato una pagnotta particolarmente discutibile con questa data: ARZM. Scrivi un programma per determinare la data.

  8. Questa è un'analogia numerica con un famoso trucco di carte. Chiedi all'utente di inserire un numero a tre cifre. Considera il numero come l'ABC (dove A, B, C sono le tre cifre del numero). Ora, trova i resti dei numeri formati da ABC, BCA e CAB dividendo per 11. Chiameremo questi rimanenti X, Y, Z. Somma i due gruppi: X+Y, Y+Z, Z+X. Se una delle somme è dispari, aumentala o diminuiscila di 11 (a seconda di quale operazione genera un numero positivo inferiore a 20; tieni presente che se la somma è 9, segnalalo e interrompi il processo). Infine, dividi ciascuna delle somme a metà. Le cifre risultanti sono A, B e C. Scrivi un programma che implementi questo algoritmo.

Applicazione: visualizzare la musica con l'animazione

Gli ingegneri del software creano un'ampia varietà di applicazioni spesso interessanti e innovative. In ogni modulo di questo corso, presentiamo un'applicazione diversa progettata e implementata dagli ingegneri, per aiutarti a comprendere tutte le diverse aree in cui lavorano gli ingegneri.

Qui trovi un'applicazione interessante per visualizzare la musica.