• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kontruktor nie dodaje punktów c++

Object Storage Arubacloud
0 głosów
157 wizyt
pytanie zadane 1 października 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam program ma za zadanie wpisać 10 cyfr dodatnich i ujemnych a na koniec pokazać po wyborze ile ich było, kod jest obiektowy(zamieniam z proceduralnego).

Oto kod:

  1 #include <iostream>
  2 
  3 class Digits
  4 {
  5         private:
  6                 int digit, positive_digits = 0, negative_digits = 0;
  7         public:
  8                 Digits() { };
  9                 Digits(int);
 10                 friend void check_digit(char);
 11 };
 12 
 13 Digits::Digits(int value)
 14 {
 15         std::cout << "Podaj 10cyfr\n";
 16         for(int i=0; i<=10; i++)
 17         {
 18                 std::cin >> digit;
 19                 if(digit > 0) positive_digits++;
 20                 if(digit < 0) negative_digits++;
 21         }
 22 }
 23 
 24 void check_digit(char si)
 25 {
 26         Digits obiekt;
 27         std::cin >> si;
 28         if(si == 'p') std::cout << "Liczba wartości dodatnich wynosi: " << obiekt.positive_digits << std::endl;
 29         if(si == 'n') std::cout << "Liczba wartości ujemnych wynosi: " << obiekt.negative_digits << std::endl;
 30 }
 31 
 32 int main()
 33 {
 34         char sign;
 35         int digit_value;
 36         Digits pn_digits(digit_value);
 37         std::cout << "Wybierz wartości, które chcesz zobaczyć (p)dodatnie, (n)ujemne: ";
 38         check_digit(sign);
 39 
 40 }

 

komentarz 1 października 2018 przez Szahid Pasjonat (20,930 p.)
I w czym problem ?
komentarz 1 października 2018 przez Sic Dyskutant (8,510 p.)
if(digit > 0) positive_digits++;
 if(digit < 0) negative_digits++;

Nie dodaje mi wartości. Na wyjściu program cały czas pokazuję 0.

2 odpowiedzi

+1 głos
odpowiedź 1 października 2018 przez gakowalski Gaduła (3,080 p.)
wybrane 2 października 2018 przez Sic
 
Najlepsza

Program słusznie pokazuje na końcu zawsze 0 ponieważ obiekt obiekt używany w check_digit(char) jest inicjalizowany publicznym konstruktorem Digits(), który w żaden sposób nie zmienia startowej wartości zmiennych positive_digits oraz negative_digits. A ta startowa wartość to 0.

Aby poprawić program, musisz przekazać do check_digit obiekt pn_digits (w którym zmienne positive_digits oraz negative_digits są zmieniane w pętli) i na nim pracować a nie na obiekt.

komentarz 1 października 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję zaraz postaram się to zmienić.
+1 głos
odpowiedź 2 października 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

w programie dalej jest kilka niepotrzebnych konstrukcji ale już powinien działać prawidłowo. PS Sprawdzaj jak wklejasz kod. Zauważ że wkleiłeś razem z kodem linijki odpowiadające wierszom programu. Może to odstraszyć potencjalnych pomagających.

#include <iostream>

 class Digits
 {
         private:
                 int digit, positive_digits = 0, negative_digits = 0;
         public:
                 Digits() { };
                 Digits(int);
                 friend void check_digit(char, int);
 };

 Digits::Digits(int value)
 {
         std::cout << "Podaj 10cyfr\n";
         for(int i=0; i<10; i++) // incrementujesz od 0 więc jako warunek użyj znaku '<' aby bylo 10 wywołań
         {
                 std::cin >> digit;
                 if(digit > 0) positive_digits++;
                 if(digit < 0) negative_digits++;
         }
 }

 void check_digit(char si, int type)
 {
     //unikaj stosowania polskich znaków jak ł/ó/ą/ę w stringach
         Digits obiekt(type);
         std::cout << "Wybierz wartosci, ktore chcesz zobaczyc (p)dodatnie, (n)ujemne: ";
         std::cin >> si;

         if(si == 'p') std::cout << "Liczba wartosci dodatnich wynosi: " << obiekt.positive_digits << std::endl;
         if(si == 'n') std::cout << "Liczba wartosci ujemnych wynosi: " << obiekt.negative_digits << std::endl;
 }

int main()
{
         char sign = 'p'; //przykładowa wartość i tak się zmieni w funkcji check_digit
         int digit_value = 5; // przykładowa wartość i tak się zmieni w funkcji check_digit



         check_digit(sign, digit_value);

 }

 

komentarz 2 października 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję działa prawidłowo.

Dobrze następnym razem będę uważał co wklejam. Co uważasz za nie potrzebne w tym programie ?
komentarz 3 października 2018 przez Bondrusiek Maniak (61,370 p.)

Po pierwsze postaraj się unikać tworzenie przyjaźni jeśli nie jest to konieczne a staraj się zrobić to poprzez użycie klasy czyli np. funkcji składowych.

Co do programu to możesz jeszcze wprowadzić coś dla zera bo program go nie obejmuje:

                 std::cin >> digit;
                 if(digit > 0) positive_digits++;
                 else if(digit < 0) negative_digits++;
                 else{
                     //cos dla 0 np neutral_digits++;
                 }

Cały kod z poprawieniami:

#include <iostream>

 class Digits
 {
         private:
                 int digit, positive_digits = 0, negative_digits = 0;
         public:
                 Digits();
                 void check_digit();
 };

 Digits::Digits()
 {
         std::cout << "Podaj 10cyfr\n";
         for(int i=0; i<10; i++) // incrementujesz od 0 więc jako warunek użyj znaku '<' aby bylo 10 wywołań
         {
                 std::cin >> digit;
                 if(digit > 0) positive_digits++;
                 else if(digit < 0) negative_digits++;
                 else{
                     //cos dla 0 np neutral_digits++;
                 }
         }
 }

void Digits::check_digit()
 {
     //unikaj stosowania polskich znaków jak ł/ó/ą/ę w stringach
        char si;
         std::cout << "Wybierz wartosci, ktore chcesz zobaczyc (p)dodatnie, (n)ujemne: ";
         std::cin >> si;

         if(si == 'p') std::cout << "Liczba wartosci dodatnich wynosi: " << positive_digits << std::endl;
         if(si == 'n') std::cout << "Liczba wartosci ujemnych wynosi: " << negative_digits << std::endl;
 }

int main()
{
    Digits digits = Digits();
    digits.check_digit();

//program zwraca zero gdy wszystko pójdzie z planem
    return 0;
}

 

Podobne pytania

+1 głos
0 odpowiedzi 290 wizyt
pytanie zadane 10 października 2018 w Java przez hans001 Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 83 wizyt
pytanie zadane 4 stycznia 2023 w C# przez chrystian Gaduła (4,780 p.)
0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 8 stycznia 2022 w JavaScript przez castor_fiber Użytkownik (800 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...