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

question-closed Dlaczego mój program mówi mi, że 72/10=7, a nie 7,2?

Cloud VPS
+2 głosów
478 wizyt
pytanie zadane 9 czerwca 2015 w C i C++ przez ukszuu Nowicjusz (230 p.)
zamknięte 9 czerwca 2015 przez ukszuu

Witam. Pytanie dotyczy mojego programu ze spoja do zadania o obżartuchach.

Oto kod:

  1. #include <iostream>

  2. #include <math.h>

  3.  

  4. using namespace std;

  5.  

  6. int N, M, zestawy, czas, jedno, ciastka=0;

  7. double x;

  8.  

  9. int main()

  10. {

  11.     cin>>zestawy;

  12.  

  13.     for (int i=1; i<=zestawy; i++)

  14.     {

  15.         cin>>N>>M;

  16.  

  17.         for (int j=1; j<=N; j++)

  18.         {

  19.             cin>>czas;

  20.             jedno=floor(86400/czas);

  21.             ciastka+=jedno;

  22.         }

  23.         x=ciastka/M;

  24.         cout<<"x"<<x<<endl;

  25.         cout<<ceil(ciastka/M)<<endl;

  26.     }

  27.     return 0;

  28. }

Po wprowadzeniu pewnych danych do programu wychodzi, że ciastka=72, zaś M=10.

Dlaczego w takim przypadku x wychodzi równe 7, a nie 7,2? 

Sprawę rozwiązałem zmieniając typ zmiennej "ciastka" na float. Czy umknęła mi jakaś zasada mowiąca, że int/int=int?

komentarz zamknięcia: Udzielona odpowiedź

4 odpowiedzi

+4 głosów
odpowiedź 9 czerwca 2015 przez Pieniek Gaduła (3,330 p.)
wybrane 9 czerwca 2015 przez ukszuu
 
Najlepsza

Zadałeś fajne pytanie i jeśli wiesz czym są funkcje wyjaśnię Ci o co chodziło.

Tak naprawdę używając operatorów czyli np + , - , * , / , = , << , >> , & , ! wywołujesz określoną funkcję. I teraz skoro to funkcja to typ argumentów ma znaczenie więc np dzielenie int / int to zupełnie inna funkcja niż float / int (jeszcze inne to int / float czy float / float). A skoro każdy z tych przypadków wywołuję inną funkcję twórcy c++ mogli ich działanie zoptymalizować w zależności od przypadku i tak by działanie int / int było możliwie jak najszybsze wypluwa int-a (szybszy algorytm i nie zmusza do konwersji kogoś kto chciał otrzymać int-a).

Co ciekawe float / int = float , int / float = float oraz int + float = float więc jeśli chcesz otrzymać float z 2 int-ów możesz zrobić taką sztuczkę:
int / (int+0.0) = float
(72 / (10+0.0) = 7.2)


A żeby było ciekawiej na koniec dodam że kiedyś nauczysz się samemu przeciążać operatory i będziesz mógł sprawić by int / int = float (albo nawet int / int = string czy żeby operacja dzielenia na intach wypisywała na konsoli napis "nie rób tego!")

komentarz 9 czerwca 2015 przez ukszuu Nowicjusz (230 p.)
Dzięki! Dokładnie o to mi chodziło :)
komentarz 9 czerwca 2015 przez Pieniek Gaduła (3,330 p.)

Ciesze się że umiałem pomóc : )

+1 głos
odpowiedź 9 czerwca 2015 przez iwan9449 Pasjonat (20,810 p.)
Owszem, po prostu dzieląc liczbę całkowitą przez jakąkolwiek liczbę otrzymasz zawsze liczbę całkowitą. Typ int jest liczbą całkowitą i jak sama nazwa wskazuje nie przechowuje on nic po przecinku, ta część jest po prostu tracona. Żeby nie tracić wartości po przecinku trzeba właśnie użyć float lub double, ponieważ te typy przechowją liczby zmiennoprzecinkowe :)

Pozdrawiam!
komentarz 9 czerwca 2015 przez Pieniek Gaduła (3,330 p.)
edycja 9 czerwca 2015 przez Pieniek

Hej to tak nie działa!(albo źle Cie zrozumiałem) Spróbuj:

 

#include<iostream>

using namespace std;

int main(){
	int x = 72;
	float y = 10;
	float f = x / y;
	cout << f;
	cin >> x;
	return 0;
}

Przy dzieleniu w c++ otrzymywany wynik nie jest przypisywany dzielonej liczbie więc ta niekoniecznie musi być zmiennoprzecinkowa jeśli chcemy otrzymać wynik zmiennoprzecinkowy wystarczy by którakolwiek z liczb była zmiennoprzecinkowa.

A tak na marginesie szacun za ładną stonkę w profilu!


Pozdrawiam!: )

0 głosów
odpowiedź 9 czerwca 2015 przez krecik1334 Maniak (58,390 p.)
Operator '/' w C/C++ to nie jest zwykly operator dzielenia. To jest operator dzielenia całkowitego. Wykonując operację np.

z = x / y

zwróci ci największe takie z , że po pomnożeniu przez y da liczbę mniejszą lub równą x (dla liczb dodatnich).
0 głosów
odpowiedź 9 czerwca 2015 przez Dorion300 Szeryf (90,250 p.)
Ponieważ operujesz na liczbach całkowitych typu int. Użyj float albo double

Podobne pytania

0 głosów
0 odpowiedzi 918 wizyt
0 głosów
2 odpowiedzi 1,025 wizyt
pytanie zadane 26 września 2020 w C i C++ przez MoniaB Nowicjusz (150 p.)
+1 głos
1 odpowiedź 581 wizyt
pytanie zadane 24 października 2021 w C i C++ przez mn130496 Gaduła (3,530 p.)

93,482 zapytań

142,414 odpowiedzi

322,761 komentarzy

62,894 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

Kursy INF.02 i INF.03
...