Na zmiennej jakiego typu zrobić to działanie?

0

Męczę się z tym od 3 godzin, kombinuje, zmieniam... i nic. Całe działanie jest bardziej skomplikowane i zależne od kilku zmiennych. Ja doszedłem do tego w którym miejscu jest błąd.
A więc chcę zrobić działanie:

zmienna := ((39 / 19) div 2); 

W tej chwili zmienną mam ustawiona typ extended. Ale Lazarus wyświetla komunikat:

program.lpr(604,47) Error: Incompatible types: got "Double" expected "Int64"

Zmiana typu zmiennej na int64 zwraca ten sam komunikat.

Domyślam się, że nie można użyć div po dzieleniu. Wcześniej myślałem, że diva nie można używać na liczbach z przecinkiem, ale w tym podanym przykładzie zamiana 39 na 38 niczego nie zmienia, a przy takim działaniu przecinków nie ma. Próbowałem zmienić na inne typy danych, ale ani razu nie udało się tego przejść. Co mogę teraz zrobić?

dodanie znacznika <code class="delphi"> - Furious Programming

2

Nie rozumiem w czym problem i co chcesz osiągnąć. Jednak oczywiste jest, że div służy do dzielenia liczb całkowitych. Także zmień div na / i będzie raczej ok. Jeżeli potrzebujesz później zaokrągleń do liczb całkowitych, to są do tego odpowiednie funkcje. A i to, że używasz Lazarusa chyba tutaj nie wpływa na błąd.

0

Oczywiście, że Lazarus na to nie wpływa, ale wyświetla komunikat.

A więc w jaki sposób mogę zaokrąglić liczbę? Bo właśnie poniekąd o to mi chodzi. Mając wynik np. 17,84 chcę, żeby liczyło się tylko ile jest 1 w tym, albo dwójek. Podzielenie przez 1 da ten sam wynik. Więc zaokrąglenie będzie dobre, tyle, że według matematyki zaokrągli do 18, a mi zależy na 17.

1

Ja też tak mam, że napisze do kogoś albo na forum i później dalej szukam rozwiązania i często znajduje. Szkoda tylko, że nie chciałeś chwilę sam pogooglować. Wiele rzeczy można znaleźć szybciej samodzielnie niż pytać na forum. Poczytaj: Obliczenia od Operacje artymetyczne: funkcyjne. Sa tam wymienione funkcje, których możesz użyć. Dostępne w Delphi od dawien dawna, to i w Lazarusie powinny też być :)

0

Ja też szukałem, ale gdybym nic nie znalazł to może tutaj by ktoś odpowiedział. Szukał i znalazłem, ale prawie. Floor, z tym, że to nie chce zadziałać. Wyświetla sie komunikat, że takiej zmiennej nie ma.

2

Oczywiście dodałeś moduł Math, prawda?

0

To zrób to po ludzku: zmienna := ((39 div 19) div 2);

1
lucasp17 napisał(a)

Floor, z tym, że to nie chce zadziałać. Wyświetla sie komunikat, że takiej zmiennej nie ma.

Floor to nie zmienna, a funkcja; W bibliotece standardowej jest kilka funkcji, z których możesz skorzystać:

  • Trunc - obcina część ułamkową, zwraca wartość typu Int64,
  • Round - zaokrągla do najbliższej liczby całkowitej, zwraca wartość typu Int64,
  • Floor - zaokrągla zawsze do dołu, zwraca wartość typu Integer,
  • Ceil - zaokrągla zawsze w górę, zwraca wartość typu Integer,
  • RoundTo - zaokrągla do określonej liczby cyfr przed przecinkiem, zwraca wartość typu Double;
    Aby z nich skorzystać trzeba sprawdzić w jakim module są zawarte; Wybierz sobie odpowiednią i wykorzystaj, ewentualnie skorzystaj tylko z liczb całkowitych i użyj do tego celu operatora Div (dzielenia bez reszty).
0
Patryk27 napisał(a):

Oczywiście dodałeś moduł Math, prawda?

Teraz już tak :)

0
_13th_Dragon napisał(a):

To zrób to po ludzku: zmienna := ((39 div 19) div 2);

Może w przypadku tych liczb by to zadziałało, ale to były tylko przykładowe liczby. A tak na prawdę jest to działanie oparte na kilku różnych zmiennych.

0
lucasp17 napisał(a):

Może w przypadku tych liczb by to zadziałało, ale to były tylko przykładowe liczby. A tak na prawdę jest to działanie oparte na kilku różnych zmiennych.

Ależ to całkowicie zmienia postać rzeczy!

zmienna := ((Jedna_Rozna_zmienna div Druga_Rozna_zmienna) div Trzecia_Rozna_zmienna);
0
_13th_Dragon napisał(a):
lucasp17 napisał(a):

Może w przypadku tych liczb by to zadziałało, ale to były tylko przykładowe liczby. A tak na prawdę jest to działanie oparte na kilku różnych zmiennych.

Ależ to całkowicie zmienia postać rzeczy!

zmienna := ((Jedna_Rozna_zmienna div Druga_Rozna_zmienna) div Trzecia_Rozna_zmienna);

Ale to chodzi o to, że jest też w działaniu mnożenie liczb, które nie są całkowite.

0
 
var
   a, b : Extended;
   c, d : Integer;
Begin
  a:= 39;
  b:= 19;  
  c:= 2;

  d:= Trunc(a/b) div c;
end;

O to chodziło?

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