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

>>cin Liczba z przecinkiem zamiast kropki

Object Storage Arubacloud
0 głosów
925 wizyt
pytanie zadane 27 maja 2017 w C i C++ przez Piotrek Korzeniewski Początkujący (360 p.)
edycja 27 maja 2017 przez Piotrek Korzeniewski

Witam napisałem program w którym podaje się swoją kwotę pieniędzy i on oblicza ile możesz za to zeszytów kupić, teraz mam pytanie, ponieważ w program trzeba wpisać liczbę z kropką np. 3.3, bo inaczej jeśli wpisałbyś 3,3 program nie przeczyta liczby za przecinkiem, teraz nadchodzi moje pytanie, jak zrobić, wpisywać można liczby zarówno z przecinkiem jak i z kropką?

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

int ilosc[2];
long double kwota,reszta[2];

int main()
{
	cout<<" Podaj twoj kapital: ";
	cin>>kwota;
	cout<<endl<<endl<<" Jeden zeszyt z gruba okladka kosztuje 3zl i 30 groszy."
	<<endl<<" Jeden zeszyt z miekka okladka kosztuje 2 zl i 40 groszy."
	<<endl<<" Jeden zeszyt A4 w linie kosztuje 2zl i 90 groszy."
	<<endl<<endl<<" Wiec za kwote "<<kwota<<" zlotych mozesz kupic:"<<endl;
	
	ilosc[0]=kwota/3.30;
	reszta[0]=kwota-(ilosc[0]*3.30);
	ilosc[1]=kwota/2.40;
	reszta[1]=kwota-(ilosc[1]*2.40);
	ilosc[2]=kwota/2.90;
	reszta[2]=kwota-(ilosc[2]*2.90);
	///1/////////////////////////////////////////////////////////////////////////
	if(kwota<3.30)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z gruba okladka.";
	}
	else if(kwota>=3.30)
	{
	if((reszta[0]>-0.01)&&(reszta[0]<0.01))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka oraz nie otrzymujesz reszty.";
	}
	if((reszta[0]>0.01)&&(reszta[0]<1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<reszta[0]*100<<" groszy.";
	}
	if((reszta[0]>1)&&(reszta[0]<1.01))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl.";
	}
	if((reszta[0]>1.01)&&(reszta[0]<2))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl i "<<(reszta[0]*100)-100<<" groszy.";
	}
	if((reszta[0]>2)&&(reszta[0]<2.01))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl.";
	}
	if((reszta[0]>2.01)&&(reszta[0]<3))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl i "<<(reszta[0]*100)-200<<" groszy.";
	}
	if((reszta[0]>3)&&(reszta[0]<3.01))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3 zl.";
	}
	if(reszta[0]>3.01)
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3zl i "<<(reszta[0]*100)-300<<" groszy.";
	}
	}
	///2/////////////////////////////////////////////////////////////////////////
	if(kwota<2.40)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z miekka okladka.";
	}
	else if(kwota>=2.40)
	{
	if((reszta[1]>-0.01)&&(reszta[1]<0.01))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka oraz nie otrzymujesz reszty.";
	}
	if((reszta[1]>0.01)&&(reszta[1]<1))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<reszta[1]*100<<" groszy.";
	}
	if((reszta[1]>1)&&(reszta[1]<1.01))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl.";
	}
	if((reszta[1]>1.01)&&(reszta[1]<2))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl i "<<(reszta[1]*100)-100<<" groszy.";
	}
	if((reszta[1]>2)&&(reszta[1]<2.01))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl.";
	}
	if(reszta[1]>2.01)
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl i "<<(reszta[1]*100)-200<<" groszy.";
	}
	}
	///3/////////////////////////////////////////////////////////////////////////
	if(kwota<2.90)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt A4 w linie.";
	}
	else if(kwota>=2.90)
	{
	if((reszta[2]>-0.01)&&(reszta[2]<0.01))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie oraz nie otrzymujesz reszty";
	}
	if((reszta[2]>0.01)&&(reszta[2]<1))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<reszta[2]*100<<" groszy.";
	}
	if((reszta[2]>1)&&(reszta[2]<1.01))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl.";
	}
	if((reszta[2]>1.01)&&(reszta[2]<2))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl i "<<(reszta[2]*100)-100<<" groszy.";
	}
	if((reszta[2]>2)&&(reszta[2]<2.01))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl.";
	}
	if(reszta[2]>2.01)
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl i "<<(reszta[2]*100)-200<<" groszy.";
	}
	}
	
	return 0;
}

 

komentarz 27 maja 2017 przez CzikaCarry Szeryf (75,340 p.)
Nie chciałbym nic mówić, ale te wszystkie ify można zastąpić jednym if..else i trzema operacjami modulo.... Ale rób jak chcesz, powodzenia w nauce!
1
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
To jest ambitny i pouczający komentarz, nie rozumiem innych co piszą, POWINIENEŚ NAJPIERW PRZEROBIĆ PODSTAWY, ZLE TO ZROBILES PAJACU itp. dzięki za słowa otuchy.
komentarz 27 maja 2017 przez CzikaCarry Szeryf (75,340 p.)
Nie ma za co :). Co nie zmienia faktu, że jeśli byłoby to zadanie na informatykę, to dostałbyś dwie pały, jedną za brak jakichkolwiek​obsługi błędów, a drugą za zmarnowanie tych kilkuset cykli procesora, czyli jakiegoś 0.5ws (czy jak kto woli J) energii...

Na prawdę, te ify tak kłują w oczy, to po prostu dobija procesor. To tak, jakbyś miał wykopać dół 2m*2m*0.5m, i kopał go gołymi rękoma zamiast użyć szpadla który leży obok...
komentarz 27 maja 2017 przez Wiciorny Ekspert (270,110 p.)
dramatyzujecie..., fakt kod strasznie nieczytelny :D
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Jeśli jesteś chętny to mógłbyś mi napisać jak poprawnie powinno to wyglądać?

3 odpowiedzi

+2 głosów
odpowiedź 27 maja 2017 przez k222 Nałogowiec (30,150 p.)
wybrane 27 maja 2017 przez Piotrek Korzeniewski
 
Najlepsza

To może dobitniej wytłumaczę

-dodajesz bibliotekę

#include <string>

robisz zmienną string

string x;

-wczytujesz w string i zamieniasz , na .

cin>>x;
for(int i=0; i<x.length(); i++)
    {
        if(x[i] == ',')
            x[i] = '.';
    }

- zamieniasz string na double (tutaj poszukaj w google)

komentarz 27 maja 2017 przez k222 Nałogowiec (30,150 p.)
A co do tych if'ów to dlaczego po prostu nie wyświetlacz reszty? Bo ją liczysz i jest ona dokładnie tą wartością którą chcesz uzyskać w if'ach
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
jeżeli przeczytasz cały kod to zrozumiesz, jak ja chce żeby reszta się wyświetlała.
komentarz 27 maja 2017 przez k222 Nałogowiec (30,150 p.)

Dobra to tak na przyszłość - to nie jest ten "najładniejszy" sposób ale jest skuteczny i prosty w niektórych sytuacjach:

 cout<<"Kupisz "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<(int)reszta[0]<< "zl i "<<reszta[0] - (int)reszta[0]<<" groszy";

i myślę że o takie coś mniej więcej chodziło czyż nie?

komentarz 27 maja 2017 przez k222 Nałogowiec (30,150 p.)
Ładniej jest za to użyć specjalnych funkcji z biblioteki cmath są to round, ceil i floor, tutaj można by użyć tej ostatniej:

http://cpp0x.pl/dokumentacja/standard-C/floor/32
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Wow, kompletnie nie pomyślałem, że można tak zrobić dziekuje!
+1 głos
odpowiedź 27 maja 2017 przez Knayder Nałogowiec (37,640 p.)
Co to za kod XD
Musisz pobrać liczbę jako string, przecinek zamienić na kropkę, a potem stringa na float, czy tam double.
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Co tobie w tym kodzie nie pasuję, skoro wszystko działa bez błędnie? Mógłbyś mi to napisać w praktyce, ponieważ dopiero się uczę i nie wiem jak to zrobić?
komentarz 27 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Skoro dopiero się uczysz to nie ma sensu byś wgłębiał się w to o czym mówi kolega, choć jednak minimalnie mógłbyś poczytać o pojęciach takich jak CLEAN CODE i SOLID.
komentarz 27 maja 2017 przez Knayder Nałogowiec (37,640 p.)
Taka ilość ifów jest bardzo zła. Lepiej wyrazić to matematycznie.
komentarz 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
W takim razie jest ktoś chętny, żeby skrócić ten kod i go pokazać jak powinien wyglądać prawidłowo?
komentarz 28 maja 2017 przez QizmoPL Stary wyjadacz (11,440 p.)

Marcin_N_97 po co mu SOLID, jezeli nie ma to nic wspolnego z programowaniem obiektowym, 

komentarz 28 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
@Piotrek Korzeniewski - ja nie.

@QuizmoPL - a czy ja cokolwiek mówiłem o programowaniu obiektowym? Ja mówiłem tylko o tym, że w przyszłości takie lektury pomogą mu zachować porządną jakość kodu, a jednocześnie wymusi to na nim stosowanie obiektowości.
komentarz 28 maja 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
"mógłbyś poczytać o pojęciach takich jak CLEAN CODE i SOLID", jak ma poczytac to ma byc mu w domysle w tym momencie potrzebne, jak bedzie mu to w przyszlosci potrzebne to sie nauczy, ine ma sensu uczyc sie na zapas
+1 głos
odpowiedź 28 maja 2017 przez j23 Mędrzec (194,920 p.)
edycja 28 maja 2017 przez j23
string s;
double v;
	
cin >> s;
		
for(char &c : s)
{
	if(c == '.' || c == ',') 
	{
		c = use_facet<numpunct<char>>(locale()).decimal_point();
		break;
	}
}

istringstream(move(s)) >> v;
	
cout << v << '\n';

 

Można tak, z uwzględnieniem ustawień lokalizacyjnych.

Podobne pytania

+1 głos
1 odpowiedź 212 wizyt
pytanie zadane 20 stycznia 2021 w C i C++ przez MateuszFisch Początkujący (250 p.)
0 głosów
3 odpowiedzi 490 wizyt
pytanie zadane 9 października 2017 w HTML i CSS przez klikweeb Obywatel (1,480 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...