2013-05-21 13 views
7

Chcę przechodzić przez tablicę, która ma wartość max 1000. Wypełniam tablicę wartościami z pliku tekstowego. Próbuję przechodzić przez tę tablicę, ale w pętli for, nie znam długości tablicy, więc nie wiem, co umieścić w drugiej części instrukcji pętli for. Na przykład: Mam tablicę o nazwie: int scores[1000]; i próbuję iterować w tej tablicy i umieszczanie wyników w kategorii klasy. A więc = 90-100, B = 80-89, C = 70-79, D = 60-69, F = 0-59.Pętla przez tablicę w języku C++

więc nie wiem, co mój pętli wyglądałby następująco:

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

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

//Do stuff... 

} 

Chyba ja też mylić, w jaki sposób dostać się na koniec za łączną liczbę każdej kategorii. Ale w większości przypadków jest to sposób na iterację w tej tablicy. Wiem, sizeof (score []) nie będzie działać, ponieważ da mi rozmiar int, a nie długość samej tablicy. Dziękujemy jednak z góry!

Odpowiedz

6

Jeśli zamiast tego używasz std::vector (link), możesz dodawać elementy i zmieniać dynamicznie rozmiar wektora. Ten rozmiar można łatwo sprawdzić za pomocą metody size(). Jeśli używasz takich tablic, musisz samodzielnie śledzić liczbę elementów.

Jeśli masz wektor Filles z elementami pętla mogłaby wyglądać następująco:

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

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

Jeśli trzeba użyć tablic i rzeczywiście mają zmienną scoreCount z liczbą rzeczywistych wartości umieszczone tam, wystarczy użyć że w pętli:

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

trzecia opcja, jak wspomniano w komentarzach, byłoby inicjowanie całą tablicę wartości, która nigdy nie używasz (zwykle -1), a następnie użyć jej jako markera dla wypełnionych i pustych pozycji w tablicy, jak na przykład:

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

Niestety, muszę trzymać się tablic, jestem już zaznajomiony z wektorami iz łatwością wybierać je z powodu ich elastyczności, ale jako wyzwanie tworzę dla tego tablice. – user12074577

+0

W porządku, musisz po prostu zachować licznik na ile wartości umieściłeś w tablicy. Innym (prawdopodobnie gorszym) pomysłem byłoby zainicjowanie wszystkich 1000 wartości do pewnej wartości, której nigdy nie używasz (może -1), a następnie do następnej pętli, dopóki nie trafisz jednego z tych -1. Zatrzymałbym kontuar. –

+0

Mam licznik o nazwie scoreCount, który to robi, czy mógłbyś mi pokazać, używając tego przykładu, jak mogłaby wyglądać moja pętla? – user12074577

2

Po wypełnieniu tablicy scores należy liczyć liczbę elementów, które się w niej umieszcza. Potem zapamiętasz tę liczbę i użyjesz jej do iteracji później. Na przykład, można przeczytać swoje wyniki tak:

// 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++) { 
    ... 
} 

Istnieje kilka innych opcji do rozważenia:

  • użyć wartości wskaźnikowych do reprezentowania koniec danych, takich jak wynik - 1.
  • zamiast tego użyj std::vector.

Nawiasem mówiąc, logiczna instrukcja w pętli zawsze będzie prawdziwa. Czy na pewno nie chcesz użyć && zamiast ||?

+0

Tak, chcę lub nie i ponieważ jeśli wynik wynosi od 90 do 100, to jest to A i chcę umieścić to w liczniku A. Tak więc na końcu iteracji przez tablicę, Ill mają liczbę A's B's, C's ect. – user12074577

+0

@ user12074577 co oznacza, że ​​chcesz "i". Czy 50 jest wyższe niż 90 * lub * niższe niż 100? –

7

Właściwie sizeof() należy zrobić tak:

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

A to daje ogólną liczbę element tablicy.

2

Jeśli naprawdę chcesz użyć pojemnik o stałym rozmiarze, należy std::array dla nowoczesnych C++ zamiast C tablicy:

#include <array> 

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

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

Inaczej użyć std::vector:

#include <vector> 

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

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

Jeśli są w stanie używać C++ 11 Zalecam również stosowanie stałych typów całkowitych szerokości.