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

Jak w C++ zwiększyć liczby niezależnie od znaku ?

+1 głos
2,420 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)
Cześć,

Jak w C++ zwiększyć liczby niezależnie od znaku (+, -) ?

np.

-2 + 1 = -3

2 + 1 = 3

czy da się to zrobić bez if'ów ?
komentarz 20 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
Z ciekawości zapytam dlaczego nie chcesz użyć ifów ?

9 odpowiedzi

+4 głosów
odpowiedź 20 czerwca 2016 przez niezalogowany
od kiedy -2+1 daje -3??
komentarz 21 czerwca 2016 przez draghan VIP (106,230 p.)
Pomijając kwestię błędnego zapisu w sensie arytmetycznym, można takie działanie zinterpretować jako przesunięcie wektora.
+1 głos
odpowiedź 20 czerwca 2016 przez draghan VIP (106,230 p.)

Da się, chociaż Twój formalny zapis jest niepoprawny. -2 + 1 =/= -3

Kod, realizujący to zadanie bez instrukcji warunkowych może wyglądać tak (przy założeniu nieujemnej wartości dodawanej):

#include <cmath>
#include <iostream>

int add(int x, unsigned y)
{
    return (std::abs(x) + y) * (std::pow(-1, (x<0)));
}

int main()
{
    std::cout<<add(-2, 1);
}

 

1
komentarz 20 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
Ten kod jest nie optymalny bo działa tylko z przykładem który podał.
komentarz 21 czerwca 2016 przez draghan VIP (106,230 p.)
Mógłbyś rozwinąć?
komentarz 21 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
Mój błąd. Kod jest w porządku.
+1 głos
odpowiedź 20 czerwca 2016 przez niezalogowany
n+k*n/wartość_bezwzględa(n) gdzie n-liczba, k-druga liczba :)
0 głosów
odpowiedź 20 czerwca 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Nie wiem czy dobrze rozumuję, ale chcesz robić wartości bezwzględne z liczb i dopiero wtedy je dodawać? W takim wypadku najłatwiej będzie mnożyć ujemne liczby * -1. Przykład: if (x<0) { x *= -1; }

A czy bez ifów? Na pewno, ale nic nie przychodzi mi do głowy.
komentarz 20 czerwca 2016 przez Garniturek Użytkownik (820 p.)
fabs(liczba) daje wartość bezwzględna zmiennej liczba ;)
komentarz 20 czerwca 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
A tak, pamiętam kiedyś to używałem ale wyleciało mi z głowy. Dzięki ;)
komentarz 21 czerwca 2016 przez niezalogowany
Funkcje fabs używa się dla typów zmiennoprzecinkowych. Dla typów całkowitych jest funkcja abs.
komentarz 21 czerwca 2016 przez draghan VIP (106,230 p.)
W C++ przeciążono funkcję std::abs() dla argumentów typów zmiennoprzecinkowych i całkowitoliczbowych. :)
komentarz 21 czerwca 2016 przez niezalogowany
Rzeczywiście.
0 głosów
odpowiedź 20 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
edycja 20 czerwca 2016 przez Szahid
Myślałem myślałem i wymyśliłem :)

 

Możesz użyć operatora ?

Działa to tak samo ja ify.

Podam Ci książkowy przykład żebyś zobaczył jak to działa.

 

5>3 ? 10:12 // 5 jest większe od 3 więć wartością tego wyrażnia jest liczba 10 ( jeśli prawda to brana jest wartość z lewej strony dwukropka a jeśli fałsz to z prawej)

 

Dałem Ci pomysł jak zrobić to bez ifów lecz jeśli chcesz to moge jeszcze napisać konkretnie jak to ma wyglądać w Twoim przypadku lecz zachęcam żebyś spróbował sam to zrobić i wytawić poniżej efekt swojej pracy :)

 

EDIT

W pod tym linkiem  masz działający kod .

http://wklej.org/id/2602023/
0 głosów
odpowiedź 20 czerwca 2016 przez Avernis Nałogowiec (27,400 p.)

możesz użyć funkcji zmieniającej 1 na -1. Wyglądało by to mniej więcej tak:-

int func(int x)
{
    return -x;
}

 

komentarz 20 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
Wtedy -2+  funkcja(1) będzie działało

Jednak bez ifa nie będziesz wiedział kiedy ją stosować a kiedy nie bo 2+1 ma dać 3
komentarz 20 czerwca 2016 przez Avernis Nałogowiec (27,400 p.)
nie aplikujesz tego wszędzie, tylko tam gdzie liczba będzie na +
komentarz 20 czerwca 2016 przez Szahid Pasjonat (20,970 p.)
Rzecz w tym że nie wiesz kiedy będzie i to jest wyzwanie . Gościu podał taki przykład żeby pokazać o co mu chodzi.. To rozwiązanie nie zadziała kiedy liczby nie bedą znane przed kompilacją programu
0 głosów
odpowiedź 20 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
edycja 21 czerwca 2016 przez MetRiko

A to moje rozwiązanie : )

int liczba=-2;
liczba+=liczba<0?-1:1;
//liczba jest równa -3
komentarz 21 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Nie rozumiem po co ten minus.. : /
Przecież osobie, która wstawiła ten post chodziło o zwiększenie odległości liczby na osi liczbowej od punktu 0 o 1. Ten kod robi dokładnie to. Co prawda dla wartości 0 to działanie doda 1.. ale można to naprawić w taki sposób:
liczba+=liczba<0?-1:liczba>0?1:0;
Teraz wynik dla zera to dalej będzie zero.
komentarz 21 czerwca 2016 przez Aisekai Nałogowiec (42,190 p.)
Nie ja dałem -, ale wg mnie autor podał tylko taki przykład. Niekoniecznie chodzi mu o to, żeby przesuwać o 1, a o jakąkolwiek (niekoniecznie) inną liczbę. Pewnie stąd ten -
komentarz 21 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Wtedy wystarczy zamienić 1 i -1 na dowolną inną wartość a i -a.
komentarz 22 czerwca 2016 przez Aisekai Nałogowiec (42,190 p.)
A co jeśli twoja pierwsza liczba będzie dodatnia, powiedzmy 3, a druga będzie ujemna, powiedzmy -1?
0 głosów
odpowiedź 21 czerwca 2016 przez CharlieGG Użytkownik (900 p.)

Wymyśliłem coś takiego, bez żadnych ifów, ani funkcji, ani skróconego ifa:

liczba += 1 - (2 * (liczba < 0));
–4 głosów
odpowiedź 21 czerwca 2016 przez hubot Dyskutant (9,090 p.)

Weź kolego się najpierw naucz matematyki i podstaw programowania bo nawet liczyć nie potrafisz. Od kiedy to -2 + 1 = -3? Jak chcesz to bez if-ów zrobić? Po co kombinujesz niepotrzebnie? Co za problem napisać (VB.NET - mój ulubiony język do edukacji)

If -2 < 0 Then
    Console.WriteLine(-2 + 1)
Else
    Console.WriteLine(2 + 1)
End If

???

Podobne pytania

0 głosów
1 odpowiedź 3,566 wizyt
+1 głos
3 odpowiedzi 535 wizyt
0 głosów
2 odpowiedzi 868 wizyt

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

63,382 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...