Program nie rozpoznaje pustej zmiennej

0

Napisałem prosty program, który pobiera od użytkownika liczbę z jednostką i konwertuje to na inne jednostki. Nie wiem jak obsłużyć przypadek, kiedy użytkownik wpisuje liczbe bez jednostki. Chcę, aby program wypisywał to samo co w przypadku ostatniego else'a.

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
	double liczba=0.0, liczba_cm=0.0, min=0.0, max=0.0;
	string unit="";
	do
	{
		cout<<"Wpisz nowa liczbe z jednostka cm lub cal lub st lub m: "<<endl;
		cin>>liczba>>unit;
		if (getchar()=='|') break;
		cout<<"Wpisales wartosc: "<<liczba<<unit<<endl;
		
		if (unit=="cm")
		{
			liczba_cm=liczba;
			cout<<"To jest: "<<(liczba/100)<<"m"<<endl;
			cout<<"To jest: "<<(liczba/2.54)<<"cal"<<endl;
			cout<<"To jest: "<<(liczba/2.54/12)<<"st"<<endl;
		}
		else if (unit=="m")
		{
			cout<<"To jest: "<<(liczba*100)<<"cm"<<endl;
			cout<<"To jest: "<<(liczba*100/2.54)<<"cal"<<endl;
			cout<<"To jest: "<<(liczba*100/2.54/12)<<"st"<<endl;
			liczba_cm=(liczba*100);
		}
		else if (unit=="cal")
		{
			cout<<"To jest: "<<(liczba*2.54)<<"cm"<<endl;
			cout<<"To jest: "<<(liczba*2.54/100)<<"m"<<endl;
			cout<<"To jest: "<<(liczba/12)<<"st"<<endl;
			liczba_cm=(liczba*2.54);
		}
		else if (unit=="st")
		{
			cout<<"To jest: "<<(liczba*12*2.54)<<"cm"<<endl;
			cout<<"To jest: "<<(liczba*12*2.54/100)<<"m"<<endl;
			cout<<"To jest: "<<(liczba*12)<<"cal"<<endl;
			liczba_cm=(liczba*12*2.54);
		}
		else
		{
			cout<<"Wpisales zla jednostke. Sprobuj ponownie."<<endl;
			break;
		}
		
		if (liczba_cm>max)
		{
			max=liczba_cm;
			cout<<"Byla to jak dotad najwieksza wpisana liczba."<<endl;
		}
		else if (liczba_cm<min)
		{
			min=liczba_cm;
			cout<<"Byla to jak dotad najmniejsza wpisana liczba."<<endl;
		}
	} while (getchar()!='|');
	return 0;
}
0

Możesz zrobić jedną funkcje,która będzie to wypisywać

cout<<"To jest: "<<(liczba*12*2.54)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczba*12*2.54/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczba*12)<<"cal"<<endl;
                        liczba_cm=(liczba*12*2.54);

Jeżeli jednostka jest pusta to wynosi tyle co ""
Więc jaki problem?
Może napisz to za pomocą switcha.

0

No właśnie jeśli dodaje else'a, że

unit="";

to nic to nie daje.

0

nie będzie takiego przypadku kiedy użytkownik nie poda żadnej jednostki bo nie można wczytać pustego stringa użytkownik musi coś do niego wpisać chociażby jeden znak.

0

To wyobaźcie sobie, że użytkownik wpisuje liczbę i wciska 'enter'. Co zrobić, żeby w takiej sytuacji program wyrzucił jakiś komunikat błędu?

0
 
if (cin.get() == '\n')
 {...}
else
 {...}
0

@abcde: to nie ma sensu

@noldok: no to jest prawidłowe zachowanie, przynajmniej przy takim wczytywaniu. Jeżeli koniecznie chcesz wymóc wprowadzenie od razu jednostki to można to zrobić tak:

#include <string>
#include <sstream>

...

string input;
getline(cin, input);
istringstream iss(input);
iss >> liczba;
if(!iss || iss.eof()){/*tutaj obsługa błędu, gdy użytkownik nie podał liczby*/}
iss >> unit;
if(iss.eof()){/*tutaj obsługa błędu, gdy użytkownik nie podał jednostki*/}
0

W którym miejscu umieścić to w programie tak, żeby nie miało to wpływu na standardowe warunki?

0

Musisz na początku pobrać cały długi string ze liczbą i ze jednostką. Później musisz oddzielić liczbę od tego długiego stringa oraz jednostkę. Całośc wygląda mniej wiecej tak:

#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;

double liczb; //liczba która wyłuskaliśmy ze podanego stringa
std::string unit; //jednostka

int main()
{

        double liczba=0.0, liczba_cm=0.0, min=0.0, max=0.0;

		string input;

        do
        {
                cout<<"Wpisz nowa liczbe z jednostka cm lub cal lub st lub m: "<<endl;

				getline(cin, input);
                cout<<"Wpisales wartosc: "<<input<<endl;
				
				std::for_each(input.begin(), input.end(), [](char z)->void 
				{
					static bool wyst = false;
					if(wyst) //jeśli prawda to możemy zacząć wyłuskiwać
					{
						unit += z;
					}
					else
					{
						static std::string cyfry = "0123456789";
						static std::string * liczba = new string(); //do wyciągnięcia liczby ze stringa

						//sprawdzamy czy jakiś znak z input występuje w ciągu cyfry
						for(std::string::iterator is = cyfry.begin(); is != cyfry.end(); is++)
						{
							if(*is == z)
							{
								(*liczba) += z; //przypisujemy do stringa wynikowego dla liczby znak który wystąpił w ciągu "cyfry"
								wyst = true;
								break; //nie ma sensu sprawdzać dalej 
							}
						}
						if(!wyst) //to znaczy że jest to pierwszy znak nie cyfra w ciągu input
						{
							std::stringstream ss(*liczba);
							if((*liczba).empty())
							{
								std::cout <<"Nie podano żadnej cyfry\n";
							}
							else
							{
								ss >> liczb;
							}

							wyst = true; //aby za następnym obiegiem pętli wykonał się pierwszy warunek czyli jednostki
						}
						else //jeśli nie znaleziono to znaczy że następny elementy jaki będziemy iterować to jednostka
						{
							wyst = false;
						}
					}

				});

                if (unit=="cm")
                {
                        liczba_cm=liczb;
                        cout<<"To jest: "<<(liczb/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczb/2.54)<<"cal"<<endl;
                        cout<<"To jest: "<<(liczb/2.54/12)<<"st"<<endl;
                }
                else if (unit=="m")
                {
                        cout<<"To jest: "<<(liczb*100)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczb*100/2.54)<<"cal"<<endl;
                        cout<<"To jest: "<<(liczb*100/2.54/12)<<"st"<<endl;
                        liczba_cm=(liczb*100);
                }
                else if (unit=="cal")
                {
                        cout<<"To jest: "<<(liczb*2.54)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczb*2.54/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczb/12)<<"st"<<endl;
                        liczba_cm=(liczb*2.54);
                }
                else if (unit=="st")
                {
                        cout<<"To jest: "<<(liczba*12*2.54)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczba*12*2.54/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczba*12)<<"cal"<<endl;
                        liczba_cm=(liczb*12*2.54);
                }
                else
                {
                        cout<<"Wpisales zla jednostke. Sprobuj ponownie."<<endl;
                        break;
                }


                if (liczba_cm>max)
                {
                        max=liczba_cm;
                        cout<<"Byla to jak dotad najwieksza wpisana liczba."<<endl;
                }
                else if (liczba_cm<min)
                {
                        min=liczba_cm;
                        cout<<"Byla to jak dotad najmniejsza wpisana liczba."<<endl;

                }
					unit.clear();
					liczb = 0.0;
					input.clear();
		

        } while (getchar()!='|');

		cin.get();

		return 0;
}
 
0

Po co robić to takie przekombinowane? Tu się kłania zasada KISS!
Nie sądzę też, żeby autor teraz ogarnął lambdy czy for_each

#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
        double liczba=0.0, liczba_cm=0.0, min=0.0, max=0.0;
        string unit="";
        string input;
        do
        {
                cout<<"Wpisz nowa liczbe z jednostka cm lub cal lub st lub m(exit - zakończenie aplikacji): "<<endl;
                getline(cin, input);

                if (input == "exit") break; //zakończenie aplikacji

                istringstream iss(input);
                iss >> liczba;
                if(!iss || iss.eof()){cout << "Nie podałeś liczby!"; continue;}
                iss >> unit;
                if(!iss || unit.length() == 0){cout << "Nie podałeś jednostki!"; continue;}

                cout<<"Wpisales wartosc: "<<liczba<<unit<<endl;
 
                if (unit=="cm")
                {
                        liczba_cm=liczba;
                        cout<<"To jest: "<<(liczba/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczba/2.54)<<"cal"<<endl;
                        cout<<"To jest: "<<(liczba/2.54/12)<<"st"<<endl;
                }
                else if (unit=="m")
                {
                        cout<<"To jest: "<<(liczba*100)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczba*100/2.54)<<"cal"<<endl;
                        cout<<"To jest: "<<(liczba*100/2.54/12)<<"st"<<endl;
                        liczba_cm=(liczba*100);
                }
                else if (unit=="cal")
                {
                        cout<<"To jest: "<<(liczba*2.54)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczba*2.54/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczba/12)<<"st"<<endl;
                        liczba_cm=(liczba*2.54);
                }
                else if (unit=="st")
                {
                        cout<<"To jest: "<<(liczba*12*2.54)<<"cm"<<endl;
                        cout<<"To jest: "<<(liczba*12*2.54/100)<<"m"<<endl;
                        cout<<"To jest: "<<(liczba*12)<<"cal"<<endl;
                        liczba_cm=(liczba*12*2.54);
                }
                else
                {
                        cout<<"Wpisales zla jednostke. Sprobuj ponownie."<<endl;
                        break;
                }
 
                if (liczba_cm>max)
                {
                        max=liczba_cm;
                        cout<<"Byla to jak dotad najwieksza wpisana liczba."<<endl;
                }
                else if (liczba_cm<min)
                {
                        min=liczba_cm;
                        cout<<"Byla to jak dotad najmniejsza wpisana liczba."<<endl;
                }
        } while (true);
        return 0;
}

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