kolejnosc wykonywania linii i wyliczania wyrazen

Odpowiedz Nowy wątek
Yedrek
2010-02-09 12:02
Yedrek
0

cześć znowu przychodzę z żałosnym problemem zainteresowało mnie jak sprawdzić czy liczba jest parzysta ok szukam na googlach znajduje koniunkcja logiczna wszystko wygląda ładnie ale nie działa tak jak należy

#include<iostream>
using namespace std;
main()
{
      int a, b;
      int wynik = a+b;
      cout<<"podaj pierwsza liczbe: ";
      cin>>a;
      cout<<"\npodaj druga liczbe: ";
      cin>>b;
      if(wynik & 1)
      cout<<"to sie wyswietla jesli liczba jest nieparzysta";
      else
      cout<<"to sie wyswietla jak parzysta";
      getchar();
      getchar();
      return 0;
}

no i niby liczba parzysta powinna się wyświetlać jeśli suma liczb a i b będzie parzysta ale tak nie jest zawsze wykonuje się else może mnie ktoś oświecić i powiedzieć jak działa koniunkcja logiczna

Pozostało 580 znaków

2010-02-09 12:08
Moderator

Rejestracja: 12 lat temu

Ostatnio: 6 godzin temu

0

użyj modulo zamiast bitand


Pozostało 580 znaków

Yedrek
2010-02-09 12:14
Yedrek
0

nie do końca rozumiem ale chyba chodzi Ci o takie cudo

if(wynik % 2 == 0)
cout<<"\nLiczba jest parzysta"; 

próbowałem też nie działa.

Pozostało 580 znaków

2010-02-09 13:11

Rejestracja: 10 lat temu

Ostatnio: 7 lat temu

0

Heh, to nie to jest problemem, panowie. Parzystość można też sprawdzić tak, jak robi to Yedrek -- za pomocą bitowej koniunkcji. Sprawdza, gdy zrobi koniunkcję na wyniku i liczbie 1, to czy dostanie zero (warunek będzie fałszywy), czy inną liczbę (będzie prawdziwy). Koniunkcja zwróci inną liczbę, konkretnie 1, wtedy i tylko wtedy gdy ostatni (najmniej znaczący) bit wyniku będzie równy 1. Czyli gdy wynik będzie nieparzysty. Prosty i elegancki test.

Zobaczcie jednak na pierwsze linijki programu:

#include<iostream>
using namespace std;
main()
{
      int a, b;                        // a i b nie są zainicjalizowane
      int wynik = a+b;                 // ustawia wynik na a+b, ale a i b nie mają jeszcze przypisanych wartości!
                                       // w wyniku jest wartość będąca jakimś losowym śmieciem, może u niego często 0
      cout<<"podaj pierwsza liczbe: "; 
      cin>>a;                          // dopiero tu wczytuje a
      cout<<"\npodaj druga liczbe: ";
      cin>>b;                          // dopiero tu wczytuje b
      if(wynik & 1)                    // w wyniku nadal jest śmieć; wynik nie ma nic wspólnego
                                       // z obecną zawartością zmiennych a i b
      ... 
}

Innymi słowy ustawiasz wynik na sumę a+b zanim jeszcze wczytasz a + b. To tak jakbym Ci powiedział: zapisz na papierze wynik działania operacji a+b. Zmienne typu int to konkretne liczby, więc musiałbyś wpisać konkretną wartość tak jak kompilator C++. Zapytałbyś mnie: no dobra, ale jaką wartość ma a, a jaką b? A ja bym Ci powiedział: nic Ci więcej nie powiem, zapisuj wynik na kartce i daj mi tę kartkę! Napisałbyś więc cokolwiek, np. 666. Natychmiast po otrzymaniu od Ciebie kartki oznajmiłbym, że a = 1, a b = 6. Więc wynik powinien być 7. Ale już nie proszę Cię o przeprowadzenie obliczeń (gdy wartości a i b są znane). Biorę Twój wzięty z sufitu wynik i mówię: cholera, tam jest liczba parzysta! (bo napisałeś 666). A powinna być nieparzysta! (1+6=7)! Ale ten Yedrek [kompilator] jest guuuupi, skoro czegoś tak prostego nie potrafi policzyć! ;)

Bądź więc sprawiedliwy i przemieść z łaski swojej linijkę int wynik = a + b tak, by była wykonywana już PO tym, jak wartości a i b są znane, dobra? Czyli za cinami, bo wartości a i b wczytujesz przez cin.

Radzę Ci też zmienić ustawienia kompilatora. Mój ostrzegł mnie, że podstawiasz do zmiennej wynik obliczeń a + b podczas gdy a i b nie są zainicjalizowane. Dodatkowo, funkcję main deklaruje się na jeden z poniższych sposobów (pomijając nieistotne tutaj rozszerzenia specyficzne dla danej platformy):

int main()
{
  ...
}

int main(int argc, char* argv[]) // ew. char** argv zamiast char* argv[]
{
  ..
}

Ty ominąłeś typ zwracanej wartości, co KIEDYŚ można było robić, bo w C (zwykłym!) defaultowało się to do inta.

PS. Użyta przez Ciebie to nie koniunkcja logiczna (operator &&), tylko koniunkcja bitowa (operator &). Jest różnica i proponuję poszperać o tym w necie, bo tak samo masz jeszcze np. alternatywę logiczną (||) i bitową (|).

Pozostało 580 znaków

2010-02-09 13:23

Rejestracja: 13 lat temu

Ostatnio: 1 rok temu

0

Z & to bylo dosc oczywiste ze bylo poprawne.. Powiedzialbym, ze problem Yedrka byl raczej hm.. klasyczny dla matematykow ktorzy stawiaja pierwsze kroki w programowaniu: pamietaj autorze wątku, ze w programach, dopoki nie wchodzimy w lambdy, delegacje, eventy, opoznienia wykonania i takie inne dziwy, kazde wyrazenie jest wykonywane kolejno i natychmiast i potem juz same automatycznie sie nie odwiezaja i sie nie przeliczaja na nowo gdy ktoras skladowa im sie zmieni. Musisz jakos samemu recznie to przeliczenie wymusic poprzez wlasciwa kolejnosc, i/lub skoki/wywolania, i/lub petle.

A jesli to bylo niedopatrzene i 'literowka/liniówka' no to sorry, nie ma co wiecej gadac


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał

Pozostało 580 znaków

Yedrek
2010-02-09 13:30
Yedrek
0

ahh o taką głupotę chodziło byłem przekonany że a+b dodadzą się dopiero podaczas if'a bo wtedy dopiero czegoś chcę od zmiennej wynik. w każdym razie dzięki za szybką odpowiedź.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0