Strona 1 z 1
Spełnienie warunków
: czw lut 20, 2020 4:50 pm
autor: brex87
Dzień dobry.
W jaki sposób mogę zapisać funkcję, która zaokrąglałaby wynik i inkrementowała go np. o 1 lub 2 jeśli jest to liczba nieparzysta lub parzysta ?
W arkuszu w
C3 mam wpisaną funkcję, która wykonuje mnożenie wartości z poszczególnych komórek, a wygląda to tak: =$H3*$B$3*C3
Chciałbym uaktualnić wynik w zależności od wartości jaka zostanie zwrócona tzn.
Kod: Zaznacz cały
=$H3*$B$3*C3+jeżeli(C3=liczba.parzysta;"0";"+1")
Re: Spełnienie warunków
: czw lut 20, 2020 6:24 pm
autor: Jermor
=$H3*$B$3*C3+CZY.NIEPARZYSTE(C3)
Re: Spełnienie warunków
: czw lut 20, 2020 6:38 pm
autor: brex87
Jermor pisze:=$H3*$B$3*C3+CZY.NIEPARZYSTE(C3)
A w jaki sposób wkomponować tam jeżeli, żeby wykonało działanie dodawania w zależności od tego czy jest to parzysta czy nieparzysta ?
Jeśli wyjdzie parzysta to +2, jeśli nieparzysta to +3 ?
Dlatego napisałem zależność z jeżeli, gdzie pierwsza wartość prezentuje PRAWDĘ, a druga FAŁSZ.
Re: Spełnienie warunków
: czw lut 20, 2020 7:34 pm
autor: zulu144
Jermor pisze:=$H3*$B$3*C3+CZY.NIEPARZYSTE(C3)
Rozumiem to tak
daje 0 jak parzysta C3
daje 1 jak nieparzysta C3
formatem załatwia się zaokrąglenie całości jak chce się mieć dokładny wynik w komórce ale przedstawiony w sposób zaokrąglony.
Dodaj do całości dwa i będziesz miał to co chcesz.
Re: Spełnienie warunków
: czw lut 20, 2020 7:46 pm
autor: brex87
Rozwiązałem to inaczej, póki co błędy mi się nie pojawiają zobaczymy na dalszym etapie budowy arkusza.
Kod: Zaznacz cały
=$H3*$B$3*10/1,5+jeżeli(C3=CZY.NIEPARZYSTE(C3);2;3)
Wartość "10", która się pojawia to moja stała, którą później przerzucę do innej komórki.
Obecnie mam spełnione warunki, że jeśli jest PRAWDA = PARZYSTE = +2, jeżeli FAŁSZ = NIEPARZYSTE = +3.
Re: Spełnienie warunków
: czw lut 20, 2020 7:57 pm
autor: Jermor
W swoim pierwszym poście podałeś ten przykład: =$H3*$B$3*C3+jeżeli(C3=liczba.parzysta;"0";"+1")
co rozumiem tak: jeśli parzysta niczego nie dodawaj a jeśli nieparzysta dodaj 1
I ta formuła to robi.
Teraz piszesz, że jeśli parzysta to dodaj 2 a gdy nieparzysta dodaj 3.
Każda liczba jest albo parzysta albo nieparzysta. Czyli formuła może być taka:
=Wyrażenie podstawowe + 2+CZY.NIEPARZYSTE(C3)
Jest jeszcze funkcja CZY.PARZYSTE_ADD() i CZY.NIEPARZYSTE_ADD() te funkcje zwracaj wartości liczbowe 1 albo 0.
Do określenia "parzystości" brana jest część całkowita liczby.
Re: Spełnienie warunków
: czw lut 20, 2020 8:00 pm
autor: brex87
Projekt ewoluuje, bo wychodzą inne kwestie, których niestety nie przewidziałem.
Co do dodawania liczb to faktycznie mój błąd bo określiłem to po prostu jako 1 = prawda, 0 = fałsz.
Potrzebowałem dodać określoną liczbę do wyniku, który jest w komórce C3 na podstawie wyrażenia podstawowego.
Nie mniej jednak dziękuję za wskazówkę, tematu proszę nie zamykać bo możliwe, że jeszcze powrócę.
Re: Spełnienie warunków
: pt lut 21, 2020 6:13 pm
autor: brex87
Zauważyłem ułomność mojego rozwiązania, a mianowicie zastosowanie formuły, która wygląda tak:
=$H$3*$B$3*10/1,5+JEŻELI(C3=CZY.NIEPARZYSTE(C3);+2;+3)
H3 = 1,35
B3 = 2,2
10/1,5 (stała wartość)
Wynikiem jest 1,35*2,2*10/1,5 = 19,8
Liczba 19 jest nieparzysta, zatem powinno dodać do niej + 3, tymczasem po zaokrągleniu do pełnej liczby, czyli 20 i tak dodawane jest 3.
W jaki sposób "zmusić" calca, żeby porzucił liczby po przecinku i zwiększał zgodnie z wartością liczby całkowitej ?
Re: Spełnienie warunków
: pt lut 21, 2020 9:44 pm
autor: Jermor
Widzę tu dużą ułomność twojego rozwiązania. Przyglądając się opisowi tego co piszesz, dochodzę do wniosku, że podana przez ciebie formuła
Kod: Zaznacz cały
=$H$3*$B$3*10/1,5+JEŻELI(C3=CZY.NIEPARZYSTE(C3);+2;+3)
jest wpisana do komórki C3. Już to samo jest błędem, ponieważ tego typu formuła generuje błąd 522, mówiący o tym, że w obliczeniach następuje odwołanie cykliczne. Formuła napisana w komórce odwołuje się do siebie samej.
Pytanie, skoro to jest błąd, to dlaczego nie ma o nim żadnej informacji?
Otóż dlatego, że czasami taki rodzaj obliczeń, szczególnie w dziedzinie inżynierskiej jest potrzebny. Nazywa się go obliczeniami iteracyjnymi. W opcjach programu Calc jest specjalny przełącznik informujący o tym, czy obliczenia iteracyjne są dozwolone. Jeśli są, błąd się nie wyświetla, a arkusz próbuje wykonać obliczenia. To ustawienie jest w "Narzędzia -> Opcje -> LibreOffice Calc -> Oblicz -> Odwołania iteracyjne".
Teraz sama część JEŻELI(C3=CZY.NIEPARZYSTE(C3);+2;+3), ona daje wyniki dotyczące takiego oto badania: czy wartość w C3 jest równa wynikowi funkcji CZY.NIEPARZYSTE(C3). Funkcja CZY.NIEPARZYSTE zwraca jedną z dwóch wartości 1, gdy liczba jest nieparzysta i 0 - gdy parzysta. Gdy C3 zawiera np. 7, to ta część formuły sprawdza czy 7 jest równe 1, bo CZY.NIEPARZYSTE(C3) da w wyniku 1. To oczywiście spowoduje, że ten fragment prawidłowo zadziała tylko gdy w C3 będzie 1 albo dowolna liczba parzysta. Formalnie to wyrażenie jest poprawne ale bezsensowne. Pierwszym argumentem funkcji JEŻELI może być przecież od razu funkcja CZY.NIEPARZYSTE, gdyż zwraca ona, sama z siebie, wartość PRAWDA albo FAŁSZ. Ale już w tym przykładzie coś się nie zgadza, bo wygląda na to, że gdy liczba jest nieparzysta ma zostać dodane 2 a gdy parzysta - 3 a dwa posty niżej napisałeś odwrotnie.
brex87 pisze:Jeśli wyjdzie parzysta to +2, jeśli nieparzysta to +3 ?
Jeżeli chcesz w swojej formule wykorzystać obliczony już w jej procesie wynik, powinieneś użyć funkcji BIEŻĄCY(), funkcja udostępnia wartość obliczoną w wyrażeniu do miejsca jej wystąpienia. Czyli twoja formuła powinna wyglądać mniej więcej tak:
Kod: Zaznacz cały
=$H$3*$B$3*10/1,5+CZY.NIEPARZYSTE(BIEŻĄCY())+2
Funkcje CZY.PARZYSTE() i CZY.NIEPARZYSTE() biorą pod uwagę tylko część całkowitą liczby.
W końcu, co oznacza
brex87 pisze:tymczasem po zaokrągleniu do pełnej liczby, czyli 20 i tak dodawane jest 3
W twojej formule nigdzie nie widać zaokrąglania do liczby całkowitej, więc skąd to pytanie? 19,8+3 to 22,8
Re: Spełnienie warunków
: sob lut 22, 2020 11:18 am
autor: brex87
Mam uruchomioną opcję obliczeń iteracyjnych, gdyż bez tego w ogóle nie będzie działać zwracanie wyników w tej samej komórce.
W założeniu funkcja JEŻELI miała pełnić rolę wykonywania funkcję powiększania wyniku w zależności od tego czy wynikiem jest liczba PARZYSTA czy NIEPARZYSTA.
Funkcja działa połowicznie, gdyż potrzebuję wyniku liczby CAŁKOWITEJ, a nie liczby DZIESIĘTNEJ, i zwrócony wynik ZAWSZE powinien być liczbą PARZYSTĄ tzn:
- mając wynik 19,8 i chcąc uzyskać liczbę całkowitą, funkcja powinna zaokrąglić w dół do 19 i dodać 3 = 22
- mając wynik 14,6 i chcąc uzyskać liczbę całkowitą, funkcja powinna zaokrąglić w dół do 14 i dodać 2 = 16
Można do tego dodać funkcję ZAOKR.DÓŁ i całość prezentuje się wtedy tak:
Kod: Zaznacz cały
=ZAOKR.DÓŁ($H$3*$B$3*10/1,5+JEŻELI(C3=CZY.NIEPARZYSTE(C3);2;3))
, lecz w tej sytuacji nie zwraca poprawnego wyniku w przypadku kiedy wynikiem jest liczba PARZYSTA np. 14,6 i dodaje do niej +3 = 17.
Czyli wartość logiczna powinna wyglądać tak - jeśli dobrze rozumuję:
Kod: Zaznacz cały
=$H$3*$B$3*10/1,5+ZAOKR.DÓŁ(JEŻELI(C3=CZY.NIEPARZYSTE(C3);2;0))+ZAOKR.GÓRA(JEŻELI(C3=CZY.PARZYSTA(C3);3;0))
Re: Spełnienie warunków
: sob lut 22, 2020 1:44 pm
autor: Jermor
brex87 pisze:...gdyż potrzebuję wyniku liczby CAŁKOWITEJ, a nie liczby DZIESIĘTNEJ...
A w jakim miejscu twojej formuły widać, że własnie o to chodzi?
Jeśli jednak o to ci chodzi, to bez włączania "iteracyjności" możesz użyć formuły:
Kod: Zaznacz cały
=ZAOKR.DO.PARZ(ZAOKR.W.DÓŁ($H$3*$B$3*10/1,5))+2
Re: Spełnienie warunków
: sob lut 22, 2020 2:01 pm
autor: Rafkus
brex87 pisze:Można do tego dodać funkcję ZAOKR.DÓŁ i całość prezentuje się wtedy tak:
Kod: Zaznacz cały
=ZAOKR.DÓŁ($H$3*$B$3*10/1,5+JEŻELI(C3=CZY.NIEPARZYSTE(C3);2;3))
, lecz w tej sytuacji nie zwraca poprawnego wyniku w przypadku kiedy wynikiem jest liczba PARZYSTA np. 14,6 i dodaje do niej +3 = 17.
Bo troszkę źle to zapisałeś. Najpierw oblicz i zaokrąglij wyrażenie a następnie z sprawdź czy otrzymany wynik jest parzysty i w zależności od niego dodaj 2 lub 3, czyli:
Kod: Zaznacz cały
=ZAOKR.DÓŁ($H$3*$B$3*10/1,5)+JEŻELI(CZY.PARZ(BIEŻĄCY());2;3)
Re: Spełnienie warunków
: sob lut 22, 2020 3:22 pm
autor: Jermor
Jeszcze uwaga do tej informacji
brex87 pisze:przypadku kiedy wynikiem jest liczba PARZYSTA np. 14,6 i dodaje do niej +3 = 17
Nie przeczytałeś uważnie mojego wyjaśnienia co do formuły typu JEŻELI(C3=CZY.NIEPARZYSTE(C3);2;3)
w tym konkretnym przypadku sprawdzasz czy liczba 14 równa się 1, funkcja CZY.NIEPARZYSTE(C3) zwraca 0, gdyż liczba 14 jest parzysta. No i 14 nie równa się 1, więc jest dodawane 3. Jeśli się zastanowisz nad działaniem tej formuły, to ona dobry wynik daje tylko wtedy gdy C3=1 albo C3=0.
Ponieważ funkcja CZY.NIEPARZYSTE od razu zwraca wynik PRAWDA, to ewentualnie tylko ona powinna pojawić się jako pierwszy argument funkcji JEŻELI.
Bez względu na te rozważania, twoja formuła w ogóle nie wymaga składni z wyrażeniem JEŻELI ani włączania opcji odwołań iteracyjnych.