Ćwiczenie pętli i instrukcji

0

Cześć, mam problem z napisaniem programu, który wchodzi w zestaw ćwiczeń z książki.
Program ma przyjmować 1 liczbę i jej jednostkę(dozwolone cm,m,cal,st), najlepiej przy użyciu

while(cin>>liczba && cin>>jednostka) {...} 

Po czym ma zapamiętywać:
1.Sumę wszystkich wpisanych liczb.
2.Ilość wszystkich wpisanych liczb.
3.Najmniejszą i największą z podanych liczb.
4.Przy każdym podaniu liczby i jednostki wyświetla się liczba wraz z jednostką i jeśli jest ona dotychczas największa lub
najmniejsza użytkownik zostaje o tym powiadomiony.
5.Po wpisaniu | program ma wyświetlić wszystkie zapisywane rzeczy takie jak najmniejsza i największa liczba itd.
Oczywiście nie wspomnę, że program jest przygotowany na nieobsługiwane typy jednostek.

Więc większość z tego ogarnąłem lecz kilka rzeczy nie mogę rozgryźć.
1.Używając

while(cin>>liczba && cin>>jednostka) {...}  

i chcąc aby po naciśnięciu | program wypisał statystyki powstają problemy. Znak | zostaje zapisany do zmiennej liczba, która nie
obsługuje znaków i program się wyłącza. Więc jak w takim przypadku zrobić żeby program wyświetlił statystyki bez żadnych problemów?
2.Drugie pytanie dotyczy funkcji:

int checkunit(int arg_in; string arg_unit; bool okej){
        okej = true;
	if (arg_unit != "cm" && arg_unit != "m" && arg_unit != "cal" && arg_unit != "st" && arg_unit != "|"){
		cout << "Nieznana jednostka: " << arg_unit << "\n";
		okej = false;
	}
	else if (arg_unit == "cm")
		return arg_in;
	else if (arg_unit == "m")
		return arg_in * 100;
	else if (arg_unit == "cal")
		return arg_in * 2.54;
	else if (arg_unit == "st")
		return arg_in *30.8;
}

Nie wiedziałem w jaki sposób stworzyć funkcję która będzie miała 2 rezultaty, 1 to konwersja liczba na cm, a drugi to
czy jednostka jest obsługiwana. Próbowałem zmieniać jeden z argumentów funkcji, ale dostałem błędy że "bool okej" wygląda jak funkcja, ale nie ma parametrów. Nie mogę używać zmiennych globalnych. To pytanie nie jest tak ważne jak pierwsze, jeśli się tak nie da to zrobię oddzielną funkcję do sprawdzania, ale jestem po prostu ciekawy czy to możliwe.

0

W pierwszym pytaniu, to może po prostu najpierw wczytuj jedno, sprawdzaj, czy nie jest to znak, który oznacza coś specjalnego (np. "|"), Jeżeli tak, to wyświetl sobie statystyki, a jak nie, to pobierz jeszcze jednostkę i zrób z tym co trzeba. Można też sprawdzić czy podane znaki to liczba, czy nie (jest od tego jakaś funkcja, ale nie pamiętam nazwy, możesz też sam taką napisać na podstawie kodu ASCII znaków).

Jeśli chodzi o zmienianie argumentów funkcji, to pamiętaj, że w C++ masz 3 sposoby na przekazywanie argumentów do funkcji. W Twoim przypadku funkcja checkunit() tworzy kopie argumentów na stosie i na nich operuje. Jeżeli chcesz mieć możliwość modyfikacji argumentów, to przekaż je np. przez wskaźnik. Wtedy do funkcji podajesz adres zmiennej i możesz modyfikować to, co pod tym adresem jest zapisane. Czyli coś takiego:

 
int checkunit(int arg_in; string arg_unit; bool *okej){
        *okej = true;
        if (arg_unit != "cm" && arg_unit != "m" && arg_unit != "cal" && arg_unit != "st" && arg_unit != "|"){
                cout << "Nieznana jednostka: " << arg_unit << "\n";
                *okej = false;
        }
// ... a wywołujesz funkcję przekazując adres, czyli checkunit(arg1, arg2, &arg3);

Sory, jeżeli coś zbyt łopatologicznie przedstawiałem, ale jeżeli to ćwiczenia do książki, to zakładam, że możesz nie być jeszcze ze wszystkim obeznany, nie ma co się przejmować, poznasz to i owo w swoim czasie, a tymczasem można kombinować i robić tak, żeby działało (nie koniecznie było akceptowanym/dobrym rozwiązaniem) :)

0

No tak tylko chodzi o to że ja wskaźników używać nie mogę bo o niczym takim jeszcze nie czytałem. Trochę uległem i użyłem zmiennych globalnych, ale wskaźniki to trochę za dużo. Dzięki za dobre chęci.
Jeśli chodzi o rozwiązanie pierwszego problemu to zmiana kolejności wczytywania nie wchodzi w grę. Nie było też nic powiedziane o żadnych funkcjach sprawdzających
czy coś jest liczbą czy nie. Ten program mam napisać z tego co wyczytałem, a od razu mówię że jest to niewiele.
Aktualny kod programu prezentuje się tak:

#include <iostream> 
#include <string>

using namespace std;

double a = 0;
double biggest = 0;
double smallest = 0;
double suma = 0;
double count = 0;
string unit;

double checkunit(double arg_in, string arg_unit){
	if (arg_unit != "cm" && arg_unit != "m" && arg_unit != "cal" && arg_unit != "st" && arg_unit != "|"){
		cout << "Nieznana jednostka: " << arg_unit << "\n";
		return 0;
	}
	else if (arg_unit == "cm"){
		suma += a;
		++count;
		return arg_in;
	}
	else if (arg_unit == "m"){
		suma += arg_in * 100.0;
		++count;
		return arg_in * 100.0;
	}
	else if (arg_unit == "cal"){
		suma += arg_in * 2.54;
		++count;
		return arg_in * 2.54;
	}
	else if (arg_unit == "st"){
		suma += arg_in *30.8;
		++count;
		return arg_in *30.8;
	}
	else if (arg_unit == "|") {
		cout << "Suma: " << suma << " ,ilosc: " << count << "\n";
		}
}

void doit(double arg_in, string arg_unit){
	cout << arg_in << "cm\n";
	if (arg_in > biggest) {
		biggest = arg_in;
		cout << "Ta do tej pory byla najwieksza\n";
	}
	else if (arg_in < smallest) {
		smallest = arg_in;
		cout << "Ta do tej pory byla najmniejsza\n";
	}
}

void main() {
	cout << "Podaj jedna liczbe i jej jednostke\n";
	while (cin>>a && cin>>unit){
		doit(checkunit(a,unit),unit);
	}
	char wait;
	cin >> wait;
}

Wiem, że jest w nim masę bugów, niezgodności i zbędnego pisania, sam to wszystko widzę, tylko nie mogę kontynuować bez tego rozwiązania. Na razie aby uzyskać statystyki trzeba wpisać dowolną liczbę i jednostkę |. Do tego po wpisaniu takiego czegoś zawszę dostaje statystki + "-1.#INDcm" (cout << arg_in << "cm\n";)

0

Bump

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