Skocz do zawartości

[C++] kalkulator


kamilmasow

Polecane posty

Witam!!!

Jestem początkującym użytkownikiem programowania i nie wiem jak ustawić poprawne wyświetlanie wyniku dzielenia liczb. Używam programu Borland C++.

Mam wpisane w programie:

 

#include <stdio.h>

#include <conio.h>

void main(void)

{

int a,b; //deklaracja zmiennych a i b

int suma,roznica,iloczyn;

float iloraz;

clrscr();

printf("Podaj liczb© A: \n");

scanf("%d",&a);

printf("Podaj liczb© B: \n");

scanf("%d",&b);

suma=a+b;

roznica=a-b;

iloczyn=a*b;

iloraz=a/b;

printf("Wyniki dziaa:\n");

printf("Suma: %d\n",suma);

printf("Rnica: %d\n",roznica);

printf("Iloczyn: %d\n",iloczyn);

printf("Iloraz: %.3f\n",iloraz);

 

getch();

}

 

 

 

Wyświetla się:

 

Podaj liczbę A:

(np.)5

Podaj liczbę B:

(np.)10

Wyniki działań:

Suma: 15

Różnica: -5

Iloczyn: 50

Iloraz: 0,000000

 

 

Co zmienić aby wyświetlało poprawny wynik ilorazu - 0,50...??

Link do komentarza
Udostępnij na innych stronach

ja jestem początkujący, a czytałem, że c++ jest łatwy dla początkujących :)

 

Jasne, że jest łatwy dla początkujących, każdy język będzie dla Ciebie prosty,

 

jeśli tylko włożysz w jego naukę odpowiednią ilość czasu i nie poddasz się

 

przy pierwszych niepowodzeniach :rolleyes:

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Jasne, że jest łatwy dla początkujących, każdy język będzie dla Ciebie prosty, jeśli tylko włożysz w jego naukę odpowiednią ilość czasu i nie poddasz się przy pierwszych niepowodzeniach

Popieram, ale dorzucę swoje trzy grosze - moim zdaniem lepiej się nauczyć kodzenia na Pascalu, bo potem łatwo jest przejść na C++. Widzę sam po sobie. ^^

Link do komentarza
Udostępnij na innych stronach

Uczyć się przed studiami. Teraz mogę na luzie przychodzić na wykłady i tylko uzupełniać wiedzę :)

Na pierwszym semestrze byli ludzie którzy dopiero zaczynali programować... Nie wyszło to im na zdrowie :D Niektórzy nawet odpadli na samym programowaniu (wstępie do programowania) :D A niektórzy zdali dopiero za trzecią poprawką... Więc kombinuj, kombinuj, najlepiej przerób jakiś podstawowy kurs internetowy, jak załapiesz podstawy to reszta pójdzie jak po maśle :)

Link do komentarza
Udostępnij na innych stronach

Mam jeszcze jeden mały problem,

klikając sobie i sprawdzając czy dobrze chodzi, zapomniałem o możliwości wstawianiu ułamków dziesiętnych, zmieniłem w programie liczby całkowite na rzeczywiste:

 

#include <stdio.h>

#include <conio.h>

void main(void)

{

float a,b; //deklaracja zmiennych a i b

float suma,roznica,iloczyn;

float iloraz;

clrscr();

printf("Podaj liczb© A: \n");

scanf("%f",&a);

printf("Podaj liczb© B: \n");

scanf("%f",&b);

suma=(float)a+(float)b;

roznica=(float)a-(float)b;

iloczyn=(float)a*(float)b;

iloraz=(float)a/(float)b;

printf("Wyniki działań:\n");

printf("Suma: %f\n",suma);

printf("Różnica: %f\n",roznica);

printf("Iloczyn: %f\n",iloczyn);

printf("Iloraz: %f\n",iloraz);

 

getch();

}

 

 

jednak po obliczeniach np.

Podaj liczbę A:

6.7

Podaj liczbę B:

3.3

Wyniki działań:

Suma: 10.000000

Różnica: 3.400000

Iloczyn: 22.109999

Iloraz: 2.030303

 

 

Iloczyn nie jest wynikiem właściwym ponieważ powinno być 22.11

lub:

 

Podaj liczbę A:

56.7

Podaj liczbę B:

3.3

Wyniki działań:

Suma: 60.000000

Różnica: 53.400002 ----->powinno być 53.400000

Iloczyn: 187.110001 ---->powinno być 187.110000

Iloraz: 17.181818

 

 

 

 

Czasami jednak wynik wychodzi dobry, ale z innymi liczbami (5.5 i 6.5)

Co tu może nie grać?

Link do komentarza
Udostępnij na innych stronach

Taką rzeczą zajmują się metody numeryczne. Chodzi ogólnie o to, że zmienne ułamkowe są zapisane jako liczby binarne i nie mogą przez to wszystko dokładnie mieć zapisane (bo mają skończą ilośc liczb) i np. 0.3333 nie zapisze jako 0.333, ale jako coś około tego, to jest taki błąd związany z tym że tak są liczby w pamięci zapisane, drugi błąd to jest że błędy się propagują wraz z obliczeniami i mogą rosnąć. Sumę pokazuje dobrze bo masz tylko 6 liczb po przecinku. Nic na to nei zaradzisz, zmniejsz dokładność w wyświetlaniu i musisz zapamiętać, aby na liczbą rzeczywistych nie używać operatora "==" bo rzadko zwraca true, właśnie przez to, że dopiero na 6 czy dalszym miejscu po przecinku jest coś inaczej. Czasami wynik wychodzi dobyr bo niektóre liczby da się przedstawić jako skończony ciąg binarny

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Jak chcesz zwiększyć dokładność użyj double, wtedy w scanf i printf %lf zamiast %f.

w standardzie IEEE754 32 bitowym są zapisane właśnie tylko przy pomocy 32 bitów w formacie stałoprzecinkowym,

np. liczba A: 6.7 to by było:

110. (6 w pamięci "skonwertowałem" na binarny)

0.7|1

0.4|0

0.8|1

0.6|1

0.2|0

0.4|0

0.8|1

Jak można zauważyć na 0.4 kończy się okres, więc liczba w całości to będzie:

110.10(1100)

przesuń przecinek do pierwszego znaczącego bitu:

1.1010(1100)

przesunięty został o 2 miejsca w lewo, więc dodajemy do tego 127 (to zapisujemy w 8 bitach):

129

i zamień na dwójkowy:

129|1

64|0

32|0

16|0

8|0

4|0

2|0

1|1

Czyli cała liczba będzie tak wyglądać

1|10000001|101011001100110011001

jeśli się nigdzie nie walnąłem :P

Na 64 bitach masz dużo więcej miejsca na zapisanie liczby, więc w typie double najlepiej przeprowadzać operacje na liczbach zmiennoprzecinkowych ;)

Link do komentarza
Udostępnij na innych stronach

zmieniłem na %lf i wyświetliły mi się bardzo duże wyniki wpisując 6.7, 3.3 wyświetliły się liczby 24 cyfrowe przed przecinkiem i za 6,

zmieniłem na 3 cyfry po przecinku i pokazuje dobrze,

mam jeszcze jedno pytanie, czy da się zrobić tak, aby np. w sumie kiedy wynik jest liczbą całkowitą to wyświetlał się wynik całkowity bez zer za przecinkiem (np. 4; a nie 4.000) i kiedy będzie wynik z cyframi po przecinku to kasował pozostałe "0" (np. 5.1; a nie 5.100)??

Link do komentarza
Udostępnij na innych stronach

nie zmieniłem wcześniej float na double, ale efekt po zmianie podobny, tylko że jest mniej cyfr, wychodzą wyniki -0.000000 i tylko w ilorazie inny

-6.4767865769697987000000000000000000000e+73 (coś podobnego), ale zostawię tak jak było przedtem,

 

a czy da się zrobić żeby np. w sumie kiedy wynik jest liczbą całkowitą to wyświetlał się wynik całkowity bez zer za przecinkiem (np. 4; a nie 4.000) i kiedy będzie wynik z cyframi po przecinku to kasował pozostałe "0" (np. 5.1; a nie 5.100)??

Link do komentarza
Udostępnij na innych stronach

Już o tym mówiłem i sam zauważyłeś że np. pisze 53.400002 zamiast 53.400000 i powiedziałem czemu tak jest to nawet jak zera dałoby się odciąć bo by Ci w tym przypadku nic nie odcięło, to jest urok liczb rzeczywistych (a raczej pseudo jak to jest w programowaniu)

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Jak skorzystasz z %g zmiast %lf to Ci obetnie te zera, jest sporo przełączników, na wykładzie miałem, pewnie dałoby się bez zmiany lf na g, tak czy inaczej %g daje najkrótszy zapis, czasem krótszy jest zapis naukowy więc go użyje.

Link do komentarza
Udostępnij na innych stronach

Może nie musi umieć, ale wybacz, Twoje wcześniejsze posty brzmiały jakby się nie dało skorzystać z double, albo nie dało wypisać tak jak trzeba (chciałeś obcinać float'a) :P Więc lepiej wiedzieć coś o tym :)

Link do komentarza
Udostępnij na innych stronach

No obcinać floata, czyli chodziło mi że te zera z końca, a nic że doubla się nie da nie mówiłem. Mówiłem tylko, że nie każda (a raczej z prawdopodobieństwem 1 że się w taką trafi) ładnie się zapisze jako float, czy nawet double (ładnie -czyt. nie ma czegoś takiego: 53.400002 itp.)

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

C++ Builder to IDE przede wszytkim. Niektórzy mówią, że nie do końca zgodne ze standardem, ale Visual też, więc trudno powiedzieć co to c++ jest:D ogólnie Builder dodaje że w klasach można dawać property, co nei jest w standardzie. I pewnie jakieś inne różnice są, ale mało istotne. I rób jeden temat na jeden problem :)

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...