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

[Rozdział 34] Sumowanie liczb

Ostatnio zmodyfikowano 2015-02-09 21:18
Autor Wiadomość
luuuzik
Temat założony przez niniejszego użytkownika
[Rozdział 34] Sumowanie liczb
» 2015-01-23 17:05:52
Mam mały problem z sumowaniem liczb, otóż w moim pliku "r34a.txt" mam zapisane: "a 1 2 321b9 ac.de ef#@g 5 #3". Program poprawnie podlicza wszystkie liczby poza drugą liczbą tj. "2". Wynik, zamiast 341 mam 339. Ktoś może widzi gdzie popełniłem błąd?
Oto kod:
C/C++
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

bool wczytajLiczbe( std::ifstream & plik, int & iLiczba )
{
    int suma;
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> iLiczba;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac liczby!" << std::endl;
        return false;
    } else
   
    {
        std::cout << "Liczba = " << iLiczba << std::endl;
        suma = suma + iLiczba;
        cout << "Suma wynosi: " << suma << endl;
    }
   
   
    return true;
}

bool wczytajZnak( std::ifstream & plik, char & cZnak )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> cZnak;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac znaku!" << std::endl;
        return false;
    } //if
    return true;
}

bool odczytajPlik( string sNazwaPliku )
{
    std::ifstream plik;
    plik.open( sNazwaPliku.c_str() );
    if( !plik.good() )
    {
        std::cout << "Nie udalo sie otworzyc pliku." << std::endl;
        return false;
    } //if
    while( !plik.eof() )
    {
        int iLiczba;
        char cZnak;
       
        if( !wczytajLiczbe( plik, iLiczba ) && plik.bad() )
             return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
        else
        if( !wczytajZnak( plik, cZnak ) )
        {
            if( plik.bad() )
                 return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
            else
                 break; //nie ma więcej danych w strumieniu (bo jeden znak zawsze powinno się dać odczytać)
           
        } //if
       
    } //while
    plik.close();
    return true;
}

int main()
{
    if( odczytajPlik( "r34a.txt" ) )
         std::cout << "Plik zostal wczytany!" << std::endl;
   
    return 0;
}
P-125434
bnk120
» 2015-01-24 23:33:05
Każdą liczbę Ci wczytuje ? Nie wyrzuca Ci żadnym napisem w konsoli ?
P-125506
luuuzik
Temat założony przez niniejszego użytkownika
» 2015-01-27 16:17:59
P-125614
pekfos
» 2015-01-29 22:54:42
W pierwszej funkcji suma jest niezainicjalizowana.

C/C++
if( !wczytajLiczbe( plik, iLiczba ) && plik.bad() )
     return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
else
if( !wczytajZnak( plik, cZnak ) )
Jeśli uda się wczytać liczbę, to odczytujesz znak, który wcina ci liczbę 2.
P-125784
Rashmistrz
» 2015-02-07 00:09:38
1.Zjada Ci dokładnie w tym miejscu: :F

C/C++
bool wczytajZnak( std::ifstream & plik, char & cZnak )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> cZnak;
    if( plik.bad() )
    { // dalszy kod...



2.Nie zwracasz liczby z funkcji wczytajLiczbe.
Zliczać je powinieneś w funkcji odczytajPlik,
a to że Ci działa to zliczanie to przypadek,
bo
int suma;
 dostaje to samo miejsce co wcześniej.
Jak ją zainicjalizujesz (
int suma = 0;
) to zobaczysz o czym mówię.

3.luuuzik... To czysty przypadek że nie wczytało Ci tylko "2".
Na poprawnym ciągu "12 23 321 94 55 36" zjada 
pierwszą cyfrę każdej liczby oprócz pierwszej.


Opracuj ten program jeszcze raz,
bo on cały jest przekombinowany.
P-126108
luuuzik
Temat założony przez niniejszego użytkownika
» 2015-02-08 12:46:32
Teraz lepiej?
C/C++
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int wczytajLiczbe( std::ifstream & plik, int & iLiczba )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> iLiczba;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        //std::cout << "Nie udalo sie wczytac liczby!" << std::endl;
        return false;
    } else
         std::cout << "Liczba = " << iLiczba << std::endl;
   
    return iLiczba;
}

bool wczytajZnak( std::ifstream & plik, char & cZnak )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> cZnak;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac znaku!" << std::endl;
        plik.close();
        return false;
    } //if
    std::cout << "Napotkany znak = '" << cZnak << "'" << std::endl;
   
    return true;
}

bool odczytajPlik( std::string pliczek )
{
    int suma = 0;
    std::ifstream plik;
    plik.open( pliczek.c_str() );
    if( !plik.good() )
    {
        std::cout << "Nie udalo sie otworzyc pliku." << std::endl;
        return false;
    } //if
    while( !plik.eof() )
    {
        int iLiczba;
        char cZnak;
       
        if( !wczytajLiczbe( plik, iLiczba ) )
        {
            if( plik.bad() )
            {
                return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
            }
        } else
        if( !wczytajZnak( plik, cZnak ) )
        {
            if( plik.bad() )
            {
                return false; //wczytanie znaku nie powiodło się z powodu błędu sprzętowego
            } //if
        }
       
        suma = suma + iLiczba;
        cout << "Suma wynosi: " << suma << endl;
    } //while
    plik.close();
    return true;
}

int main()
{
    if( odczytajPlik( "r34a.txt" ) )
         std::cout << "Plik zostal wczytany!" << std::endl;
   
    return 0;
}
P-126183
Smncru5
» 2015-02-09 19:37:31
A ja nie rozumiem kompletnie tego zadania. Kod który napisałem spełnia swoje zadanie, ale jest zbyt prosty i zapewne mija się z celem. Nie mogę też się domyślić jaki sens ma to zadanie, z takim kodem:

C/C++
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    //Napisz program, który wczyta z pliku liczby całkowite i wypisze je na ekranie.
    //Wszelkie nieprawidłowe znaki mają zostać pominięte.
    //Program ma wypisać również sumę wszystkich wczytanych liczb.
    //IN: a 1 2 321b9 ac.de ef#@g 5 #3
   
    //OUT:  1 2 321 9 5 3
    //      Suma liczb wynosi: 341
   
    ifstream plik;
    int L1, L2, L3, L4, L5, L6 = 0;
    char C1, C2, C3;
    string S1, S2;
   
    plik.open( "zadanie3.txt" );
    if( !plik.good() )
    {
        cout << "Nie udalo sie wczytac pliku.";
        return 0;
    }
    plik >> C1 >> L1 >> L2 >> L3 >> C2 >> L4 >> S1 >> S2 >> L5 >> C3 >> L6;
    cout << L1 << " " << L2 << " " << L3 << " " << L4 << " " << L5 << " " << L6 << endl;
    cout << "Suma liczb wynosi: " << L1 + L2 + L3 + L4 + L5 + L6 << endl;
    return 0;
}

Ktoś naprowadzi mnie na dobrą drogę? :P
P-126264
Rashmistrz
» 2015-02-09 21:18:53
@luuuzik
Problem jest tu:
C/C++
if( !wczytajLiczbe( plik, iLiczba ) )
{
    if( plik.bad() )
    {
        return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
    }
}
else if( !wczytajZnak( plik, cZnak ) )

Jak wczyta Ci poprawnie liczbę, warunek nie jest spełniony,
więc przechodzi do else, w którym jest if  wywołujący
wczytanie znaku.

Powinieneś jeszcze poprawić system sprawdzania błędu,
bo nie powinien się on opierać na zwrócony zerze...

@Smncru5
To ma działać dla dowolnego pliku, a nie tylko tego... :F
P-126275
« 1 »
  Strona 1 z 1