2013-05-21 19 views
7

Voglio fare un ciclo attraverso un array che ho che ha un valore massimo di 1000. Sto riempiendo l'array con i valori di un file di testo. Sto provando a fare un ciclo attraverso quell'array ma nel mio ciclo for, non conosco la lunghezza dell'array, quindi non so cosa mettere nella seconda parte dell'istruzione for. Ad esempio: ho un array chiamato: int scores[1000]; e sto provando a ripetere questa matrice e mettere i punteggi in una categoria di grado. Quindi A = 90-100, B = 80-89, C = 70-79, D = 60-69, F = 0-59.loop attraverso un array in C++

quindi non so quello che il mio ciclo for sarebbe simile:

for(int i = 0; i < ...; i++){ 

if(scores[i] > = 90 || scores[i] <= 100){ 

//Do stuff... 

} 

Credo Sono anche confuso su come ottenere i conteggi totali di ciascuna categoria, alla fine anche. Ma per la maggior parte è come iterare attraverso questo array. So che sizeof (punteggi []) non funzionerà perché questo mi darà la dimensione int e non la lunghezza della matrice stessa. Grazie in anticipo!

risposta

6

Se si utilizza uno std::vector (link), è possibile aggiungere elementi e fare in modo che il vettore modifichi le dimensioni in modo dinamico. Quelle dimensioni possono essere interrogate facilmente usando il metodo size(). Se si utilizzano array come questo, è necessario tenere traccia del numero di elementi in esso stessi.

Se si dispone di un vettore filles con elementi il ​​ciclo potrebbe essere la seguente:

std::vector<int> scores; 
// fill vector 

for (unsigned int i=0; i<scores.size(); i++) { 
    // use value 
} 

Se è necessario utilizzare le matrici e in realtà avere una variabile scoreCount con il numero dei valori reali messi in là, è sufficiente utilizzare che nel vostro ciclo:

for (int i=0; i<scoreCount; i++) { 
    // use value 
} 

una terza opzione, come ho già detto nei commenti, sarebbe inizializzare l'intero array con un valore che non si è mai utilizzare (in genere -1) e quindi utilizzarlo come un marcatore per le posizioni di array pieni e vuoti in questo modo:

for (int i=0; i<1000; i++) { 
    scores[i] = -1; 
} 

// add real values to scores 

int i=0; 
while (scores[i] != -1 && i < 1000) { 
    // use value 
    i++; 
} 
+0

Sfortunatamente, devo stare con gli array, ho già familiarità con i vettori e li sceglierei facilmente per la loro flessibilità, ma come sfida sto facendo array per questo. – user12074577

+0

Va bene, allora devi semplicemente tenere un contatore su quanti valori hai messo nell'array. Un'altra idea (probabilmente peggiore) sarebbe l'inizializzazione di tutti i 1000 valori su un valore che non si sta usando mai (forse -1) e poi si arriverà fino a quando non si preme uno di quei -1. Terrei un contatore –

+0

Ho un contatore chiamato scoreCount che lo fa, potresti per favore mostrarmelo usando un esempio di come sarebbe il mio ciclo? – user12074577

2

Quando si popola l'array scores, è necessario contare effettivamente quanti elementi si mette in esso. Quindi ti ricordi quel numero e lo usi per l'iterazione più tardi. Ad esempio, si può aver letto i tuoi punteggi in questo modo:

// Read some scores: Stop when -1 is entered, an error occurs, or 1000 values are read. 
int num_scores = 0; 

for(; num_scores < 1000; num_scores++) 
{ 
    if(!(cin >> scores[num_scores]) || scores[num_scores] == -1) break; 
} 

// Do stuff with scores... 
for(int i = 0; i < num_scores; i++) { 
    ... 
} 

ci sono alcune altre opzioni da considerare:

  • utilizzare un valore sentinella per rappresentare la fine dei dati, come ad esempio un punteggio di - 1.
  • utilizzare invece std::vector.

A proposito, l'istruzione logica all'interno del ciclo sarà sempre vera. Sei sicuro di non voler usare && invece di ||?

+0

Sì, lo voglio o no e perché se il punteggio è tra un 90 e un 100 allora è un A e voglio metterlo in un segnalino A. Quindi alla fine di iterare attraverso l'array, Ill ha un conteggio di A's B's, C's ect. – user12074577

+0

@ user12074577 che significa che vuoi un 'e'. 50 superiore a 90 * o * inferiore a 100? –

7

In realtà il sizeof() dovrebbe essere fatto in questo modo:

sizeof(scores)/sizeof(scores[0])

E questo vi darà i numeri degli elementi totale dell'array.

2

Se davvero si vuole utilizzare un contenitore con una dimensione fissa, utilizzare std::array per la moderna C++ invece di un C-array:

#include <array> 

std::array<std::int32_t, 1000> scores; 

for (std::size_t i{0}; i < scores.size(); ++i) { 
    // Do stuff... 
} 

altrimenti utilizzare un std::vector:

#include <vector> 

std::vector<std::int32_t> scores; 

for (std::size_t i{0}; i < scores.size(); ++i) { 
    // Do stuff... 
} 

Se sono in grado di usare C++ 11, inoltre consiglio di usare i tipi interi a larghezza fissa.