Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytanie pliku i obliczenie ile jest liczb parzystych

Ostatnio zmodyfikowano 2013-05-22 16:48
Autor Wiadomość
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ść:

C/C++
#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
C/C++
if( DanaZmiennaKtorejJeszczeNieZnamBoNieWiemJakJaNapisac % 2 == 0 )
//parzyste
else
//nieparzyste

Dobrze myślę, że muszę napisać to używając for?
P-83485
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:
C/C++
cout << linia << endl;
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)
P-83488
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ć?
P-83527
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 >>.
P-83531
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

C/C++
#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;
    }
}
P-83547
pekfos
» 2013-05-21 20:36:49
Zamykasz plik w pętli i wychodzisz z programu w pętli.
P-83548
turson
Temat założony przez niniejszego użytkownika
» 2013-05-21 20:43:58
Jakiej pętli mam użyć?
P-83549
pekfos
» 2013-05-21 20:46:56
Mówię co robisz, a nie co masz zrobić:
C/C++
/// uwaga, to fragment twojego kodu.. (jest niepoprawny)
while( !plik.eof() ) { //tu sie pętla zaczyna
   
    plik >> tekst;
    liczba = atoi( tekst.c_str() );
   
    if( liczba % 2 == 0 ) parzystych++;
    else nieparzystych++;
   
    cout << "Liczb parzystych: " << parzystych << endl << "Liczb nieparzystych: " << nieparzystych;
   
    plik.close(); //zamykasz plik
   
   
    return EXIT_SUCCESS; //konczysz program
} //tu sie petla konczy

P-83550
« 1 » 2 3
  Strona 1 z 3 Następna strona