Wczytanie pliku i obliczenie ile jest liczb parzystych
Ostatnio zmodyfikowano 2013-05-22 16:48
turson Temat założony przez niniejszego użytkownika |
Wczytanie pliku i obliczenie ile jest liczb parzystych » 2013-05-21 11:23:56 Męczę się z następującym zadaniem: program wczytuje plik 'sample.txt' zawierający losowe liczby wiersz pod wierszem (3 wiersze) i ma obliczyć ile z nich jest parzystych a ile nieparzystych. Dotąd udało się po mękach napisać program, który odczyta plik i wyświetli jego zawartość: #include <iostream> #include <fstream> #include <cstdlib> #include <string>
using namespace std;
int main() { string linia; fstream plik; plik.open( "sample.txt" ); if( plik.good() == true ) { while( !plik.eof() ) { getline( plik, linia ); cout << linia << endl; } plik.close(); } return( 0 ); }
Dalej nie wiem jak się za to zabrać. Problem stanowi czego mam użyć, by program sprawdził linijka po linijce każdy wiersz. Czego mam użyć by zrobić? Proszę o nakierowanie. Co do obliczenia parzystości to wiem, że muszę użyć warunku if( DanaZmiennaKtorejJeszczeNieZnamBoNieWiemJakJaNapisac % 2 == 0 )
else
Dobrze myślę, że muszę napisać to używając for? |
|
cyklopek11 |
» 2013-05-21 12:40:22 Jeśli w pliku są tylko liczby całkowite (a więc nie trzeba sprawdzać poprawności danych) W linii: wstaw wywołanie funkcji, która będzie pobierać twój std::string oraz referencję zmienna_ile_parzystych W funkcji z std::string wyłuskujesz wczytanego int-a a następnie sprawdzasz jego parzystość. Jeśli parzysta zwiększasz zmienną zmienna_ile_parzystych. Można to zrobić szybciej i lepiej ale dzięki powyższemu więcej się praktycznie nauczysz. Jak zrobisz to w ten sposób, dalej możesz dokonać optymalizacji: a.) liczba jest parzysta jeśli jej ostatnia cyfra w zapisie dziesiętnym jest parzysta. b.) nie wczytywać pliku tylko sprawdzać parzystość ostatniej cyfry (bajtu) przed bajtem końca linii (w windowsowskich txt przed sekwencją 0x0D, 0x0A) |
|
turson Temat założony przez niniejszego użytkownika |
» 2013-05-21 17:49:35 Dzięki za odpowiedź. Niestety nie rozumiem co mam zrobić. Mógłbyś konkretniej mnie naprowadzić? |
|
pekfos |
» 2013-05-21 18:37:11 Zależy, czy na jeden wiersz przypada jedna liczba i czy po liczbie jest bezpośrednio znak nowej linii (lub Windowsowe CRLF) (tylko wtedy możesz użyć "szybszego i lepszego" rozwiązania użytkownika cyklopek11). Jeżeli jesteś pewien tylko tego pierwszego, użyj atoi() i sprawdź, czy zwrócona wartość jest parzysta (modulo lub koniunkcja bitowa). http://www.cplusplus.com/reference/cstdlib/atoi/Możesz też całkiem wywalić operowanie na całych liniach i wczytywać liczby operatorem >>. |
|
turson Temat założony przez niniejszego użytkownika |
» 2013-05-21 20:33:48 Zmodyfikowałem i uzyskałem kod, który owszem działa, ale sprawdza tylko pierwszy wiersz, a chodzi mi by kazdy po kolei sprawdzil #include <cstdlib> #include <iostream> #include <fstream>
using namespace std;
int main() { string tekst; int parzystych = 0; int nieparzystych = 0; int liczba; ifstream plik( "sample.txt" ); while( !plik.eof() ) { plik >> tekst; liczba = atoi( tekst.c_str() ); if( liczba % 2 == 0 ) parzystych++; else nieparzystych++; cout << "Liczb parzystych: " << parzystych << endl << "Liczb nieparzystych: " << nieparzystych; plik.close(); return EXIT_SUCCESS; } }
|
|
pekfos |
» 2013-05-21 20:36:49 Zamykasz plik w pętli i wychodzisz z programu w pętli. |
|
turson Temat założony przez niniejszego użytkownika |
» 2013-05-21 20:43:58 Jakiej pętli mam użyć? |
|
pekfos |
» 2013-05-21 20:46:56 Mówię co robisz, a nie co masz zrobić: while( !plik.eof() ) { plik >> tekst; liczba = atoi( tekst.c_str() ); if( liczba % 2 == 0 ) parzystych++; else nieparzystych++; cout << "Liczb parzystych: " << parzystych << endl << "Liczb nieparzystych: " << nieparzystych; plik.close(); return EXIT_SUCCESS; }
|
|
« 1 » 2 3 |