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

Dziwny problem z funktorem

Ostatnio zmodyfikowano 2012-01-26 21:43
Autor Wiadomość
jsc
Temat założony przez niniejszego użytkownika
Dziwny problem z funktorem
» 2012-01-25 19:58:53
Na zadanie SPOJa pod tytułem "Sumy wielokrotne" napisałem w odpowiedzi taki o to program z funktorami:

C/C++
#include <iostream>

using namespace std;

typedef int liczba;

class sumaWielokrotna
{
private:
    liczba czynnik;
    liczba suma;
   
public:
    sumaWielokrotna()
        : suma( 0 )
    {
    }
   
    void operator ()( liczba nowyCzynnik )
    {
        if( nowyCzynnik != 0 )
        {
            suma = suma + nowyCzynnik;
        }
       
        else
        {
            cout << suma;
            suma = 0;
        }
    }
   
    void wyswietl( void )
    {
        cout << suma << endl;
    }
   
    liczba podaj( void )
    {
        return suma;
    }
};

int main()
{
    liczba biezacyCzynnik;
   
    sumaWielokrotna sumaCzastkowa;
   
    sumaWielokrotna sumaKoncowa;
   
    if( cin.eof() == false )
    {
        while( cin.eof() == false )
        {
            do
            {
                cin >> biezacyCzynnik;
               
                if(( biezacyCzynnik == 0 ) &&( sumaCzastkowa.podaj() != 0 ) )
                {
                    sumaKoncowa( sumaCzastkowa.podaj() );
                }
               
                sumaCzastkowa( biezacyCzynnik );
               
            } while( biezacyCzynnik != 0 );
           
        }
    }
   
    cout << sumaKoncowa.podaj();
   
    return 0;
}

Problem polega na tym, że na wejście:

11 8 2 -1 0
6 33 -9 10 0
0

dostaję wyjście:

20
40
0
060

Moja prośba polega na tym, aby ktoś się dopatrzył dlaczego przed 60 stoi 0.
P-49449
ison
» 2012-01-25 20:06:23
taka rada, jak chcesz prosić kogoś o zdebugowanie kodu to lepiej jakbyś pisał 'standardowo', takie typedefy z polskimi nazwami nie są zbyt fajne ;D co jak będziesz musiał zadeklarować kilka zmiennych o różnych typach?
liczba a; duza_liczba b; mala_liczba c; mala_liczba_zmiennoprzecinkowa d; duza_liczba_zmiennoprzecinkowa e; ciag_znakow f;
? :)

co do czytelności kodu, moim zdaniem:

if( cin.eof() == false )
zamiast tego możesz pisać
if( !cin.eof() )


jak już tak bardzo stawiasz na czytelność kodu to
using namespace std;
 w większości przypadków nie jest zbyt dobrym pomysłem


if( nowyCzynnik != 0 )
 zamiast tego możesz pisać
if( nowyCzynnik )


suma = suma + nowyCzynnik;
 zamiast tego możesz pisać
suma += nowyCzynnik;


C/C++
if( cin.eof() == false )
{
    while( cin.eof() == false )
    {
po co? wystarczy sam while

if(( biezacyCzynnik == 0 ) &&( sumaCzastkowa.podaj() != 0 ) )
 nie musisz pisać nawiasów między operatorem &&, wystarczy samo
if( !biezacyCzynnik && sumaCzastkowa.podaj() )



rozwiązanie tego samego zadania trochę krócej:
C/C++
#include <cstdio>

int main()
{
    int l, suma = 0, suma2 = 0;
    while( scanf( "%d", & l ) != EOF ) {
        suma += l, suma2 += l;
        if( l == 0 ) {
            printf( "%d\n", suma );
            suma = 0;
        }
    }
    printf( "%d\n", suma2 );
}

;)
jeśli chcesz pisać zadania na olimpiady algorytmiczne to uwierz mi, że lepiej kierować się zasadą KISS, znacznie łatwiej wtedy taki kod debugować

jak zgłaszasz jakieś zadanie to staraj się nie używać cin ani cout, są znacznie wolniejsze i niekiedy możesz na tym stracić punkty

@down trololo :D dzięki za poprawke
P-49450
DejaVu
» 2012-01-25 20:56:11
CTRL+F => cout => ENTER.
P-49457
SeaMonster131
» 2012-01-25 21:16:48
jak zgłaszasz jakieś zadanie to staraj się nie używać cin ani count, są znacznie wolniejsze
Można walnąć na początku
ios_base::sync_with_stdio( 0 );
 :)
P-49460
ison
» 2012-01-25 21:49:52
@up trochę pomoże ale i tak będzie wolniej ;)
P-49466
jsc
Temat założony przez niniejszego użytkownika
» 2012-01-25 22:12:38
Jeśli wam to pomoże to poprawiłem kod wg. wskazówek Isona:
C/C++
#include <iostream>

using namespace std;

class sumaWielokrotna
{
private:
    int czynnik;
    int suma;
   
public:
    sumaWielokrotna()
        : suma( 0 )
    {
    }
   
    void operator ()( int nowyCzynnik )
    {
        if( nowyCzynnik != 0 )
        {
            suma += nowyCzynnik;
        }
       
        else
        {
            cout << suma << endl; //Tu dodałem << endl
            suma = 0;
        }
    }
   
    int podaj( void )
    {
        return suma;
    }
};

int main()
{
    int biezacyCzynnik;
   
    sumaWielokrotna sumaCzastkowa;
   
    sumaWielokrotna sumaKoncowa;
   
    if( !cin.eof() ) //Skoro nie znam ilosci zestawow testowych to musze zalozyc, ze moze byc ona zerowa
    {
        while( !cin.eof() )
        {
            do
            {
                cin >> biezacyCzynnik;
               
                if( biezacyCzynnik == 0 && sumaCzastkowa.podaj() != 0 )
                {
                    sumaKoncowa( sumaCzastkowa.podaj() );
                }
               
                sumaCzastkowa( biezacyCzynnik );
               
            } while( biezacyCzynnik != 0 );
           
        }
    }
   
    cout << sumaKoncowa.podaj();
   
    return 0;
}
P-49471
jsc
Temat założony przez niniejszego użytkownika
» 2012-01-25 22:26:28
CTRL+F => cout => ENTER.

Skorzystałem, ale błędu nie znalazłem. Chyba będzie jak w swoich słowach opiszę działanie programu:
Dopóki jest wprowadzana nowa linijka liczba wykonuj następującą pętle. Dopóki nie napotka ona ma sukcesywnie dodawać wartość zmiennej biezacyCzynnik do wartości pola suma obiektu sumaCzastkowa. Jak już ją napotka to po kolei:
- dodać wartość pola suma obiektu sumaCzaskowa do wartości pola suma obiektu sumaKoncowa
- wyświetlić wartość pola suma obiektu sumaCzastkowa i znak nowej linii
- wyzerować pola suma obiektu sumaKontrolna
Po zakończeniu pętli głównej program ma wyświetlić wartość pola suma obiekt sumaKontrolna.
P-49474
ison
» 2012-01-25 22:27:22
C/C++
if( !cin.eof() ) //Skoro nie znam ilosci zestawow testowych to musze zalozyc, ze moze byc ona zerowa
{
    while( !cin.eof() )
    {
nie rozumiem ;)
while(!cin.eof()) zrobi dokładnie to samo co powyższy if
zadziała jak
if( !cin.eof() ) wykonaj...
P-49475
« 1 » 2
  Strona 1 z 2 Następna strona