C++ offre diversi contenitori per memorizzare elementi dello stesso tipo in modo ordinato.
C'è std::array per contenitori di dimensione fissa e std::vector, che offre capacità di ridimensionamento dinamico.
Quando dichiari un array o un vettore devi specificare il tipo di elementi che il contenitore conterrà. Anche gli array richiedono una dimensione. Guarda questi esempi per vedere l'inizializzazione dei due tipi di contenitore:
#include <array>
#include <string>
// std::array<element_type, size> variable_name {list of elements}
std::array<std::string, 3> indie_rock {"yeah", "yeah", "yeah"};
// indie_rock contains the elements "yeah" three times
I vettori di solito hanno bisogno di più spazio, perché allocano memoria per crescere ulteriormente. Non devi specificare una dimensione:
#include <vector>
// std::vector<element_type> variable_name {list of elements}
std::vector<int> countdown {3, 2, 1};
// countdown contains the elements 3, 2 and 1
Nota: non hai ancora bisogno di conoscere l'esatta meccanica dietro il concetto di template, avrà il suo concetto più avanti nell'albero del percorso.
I vettori e gli array condividono le stesse funzioni per accedere ai loro elementi.
Puoi usare le funzioni membro front e back per ottenere il primo e l'ultimo elemento del contenitore.
Ci sono anche at e l'operatore [] per accedere a elementi specifici.
countdown[0];
// => 3
countdown.at(2);
// => 1
countdown[1] = 4;
// countdown now contains 3, 4 and 1
indie_rock.back() = "yeahs";
// indie_rock is now "yeah", "yeah", "yeahs"
Nota: se scegli una posizione che non è nell'intervallo del tuo contenitore,
[]potrebbe portare a un comportamento indefinito. La funzioneatsolleverebbe un'eccezione, il che potrebbe renderti la vita più facile a lungo termine.
Dato che un vector non ha dimensione fissa, è possibile aggiungere o rimuovere elementi.
Due funzioni comuni per questo scopo sono emplace_back e pop_back.
std::vector<std::string> witches {"Holly", "Alyssa", "Shannen"};
witches.pop_back();
// Shannen is no longer with the witches
witches.emplace_back("Rose");
// Rose has joined the team
Puoi controllare se i contenitori sono vuoti con la funzione membro empty.
Se vuoi conoscere il numero di elementi, puoi usare size.
Sei un assistente didattico che corregge gli esami degli studenti. Tenere traccia dei risultati a mano sta diventando noioso e fonte di errori. Decidi di rendere le cose un po' più interessanti mettendo insieme alcune funzioni per contare e calcolare i risultati della classe.
Anche se puoi dare un «credito parziale» sulle domande d'esame, i punteggi complessivi dell'esame devono essere int.
Quindi, prima di poter fare qualsiasi altra cosa con i punteggi della classe, devi passare in rassegna i voti e trasformare tutti i punteggi double in int.
Crea la funzione round_down_scores() che prende un vector di student_scores.
L'arrotondamento richiesto dalle scuole è un troncamento.
Per fortuna, C++ può convertire un tipo in un altro con static_cast.
La conversione static_cast da double a int taglia via ogni cifra dopo la virgola.
Questa funzione dovrebbe prendere il vector di input e fare return di un nuovo vector con tutti i punteggi convertiti in int.
std::vector<double> student_scores {90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3};
round_down_scores(student_scores)
// => {90, 40, 55, 70, 30, 25, 80, 95, 38, 40}
Esistono altri metodi che ottengono lo stesso risultato, ma un cast è una cosa che si vede spesso.
int new_PI{static_cast<int>(3.14) + static_cast<int>(0.001592653589)};
// new_PI is 3.
Mentre correggevi gli esami, hai notato che alcuni studenti non andavano bene come speravi. Ma ti sei distratto e hai dimenticato di annotare esattamente quanti studenti.
Crea la funzione count_failed_students() che prende un vector di student_scores.
Questa funzione dovrebbe contare il numero di studenti che non hanno ottenuto un punteggio sufficiente e restituire quel conteggio come numero intero.
Per superare l'esame, uno studente deve ottenere un punteggio maggiore di 40.
count_failed_students({90,40,55,70,30,25,80,95,38,40});
// => 5
All'insegnante che assisti piace assegnare voti in lettere oltre che punteggi numerici. Dato che gli studenti raramente ottengono 100 a un esame, le soglie inferiori dei «voti in lettere» si calcolano in base al punteggio più alto ottenuto e aumentano in modo uniforme tra il punteggio più alto e la soglia di insufficienza di <= 40.
Crea la funzione letter_grades() che prende come parametro il punteggio «più alto» dell'esame e restituisce un array (non un vector) di soglie inferiori, una per ogni intervallo di voto «all'americana»: ["D", "C", "B", "A"].
/*Where the highest score is 100, and failing is <= 40.
"F" <= 40
41 <= "D" <= 55
56 <= "C" <= 70
71 <= "B" <= 85
86 <= "A" <= 100
*/
letter_grades(100);
// => {41, 56, 71, 86}
/*Where the highest score is 88, and failing is <= 40.
"F" <= 40
41 <= "D" <= 52
53 <= "C" <= 64
65 <= "B" <= 76
77 <= "A" <= 88
*/
letter_grades(88);
// => {41, 53, 65, 77}
Hai i punteggi d'esame in ordine decrescente e i rispettivi nomi degli studenti (ordinati secondo l'ordine dei loro punteggi d'esame). Vuoi abbinare il nome di ogni studente al suo punteggio d'esame e stampare una classifica generale della classe.
Crea la funzione student_ranking() con i parametri student_scores e student_names.
Abbina ogni nome dello vector student_names al suo punteggio dello vector student_scores.
Puoi presumere che ogni vector argomento sia ordinato dal punteggio più alto a quello più basso.
La funzione dovrebbe restituire un vector di stringhe con il formato <rank>. <student name>: <student score>.
std::vector<int> student_scores {100, 99, 90, 84, 66, 53, 47};
std::vector<std::string> student_names {"Joci", "Sara","Kora","Jan","Indra","Bern", "Fred"};
student_ranking(student_scores, student_names)
// =>
// {"1. Joci: 100", "2. Sara: 99", "3. Kora: 90", "4. Jan: 84", "5. Indra: 66", "6. Bern: 53", "7. Fred: 47"}
Anche se un punteggio «perfetto» di 100 è raro a un esame, è interessante sapere se almeno uno studente lo ha ottenuto.
Crea la funzione perfect_score() con i parametri student_scores e student_names.
Le liste sono le stesse del compito 4.
La funzione dovrebbe fare return del primo <name> (come stringa) dello studente che ha ottenuto 100 all'esame.
Se non si trova nessun punteggio pari a 100, va restituita una stringa vuota "".
perfect_score({"Nur", "Tony", "Fatima"}, {90, 80, 100});
// => "Fatima"
perfect_score({"Nur", "Tony"}, {90, 80});
// => ""
Iscriviti a Exercism per imparare e padroneggiare C++ con 19 concetti100 esercizi e il mentoring di persone reali, tutto gratis.