[c++] Program nie działa poza kompilatorem

Witam. Mój problem jest taki jak w temacie. Napisałem program liczący BMI. Działa on w kompilatorze Dev-C++, ale kiedy chcę go uruchomić poza nim, to mogę wpisać tylko mój wzrost, bo jak wpiszę wagę, to zaraz się wyłącza.

Tutaj kod:

#include 

#include 


using namespace std;

int main(int argc, char *argv[]) {

	int h,m;

	cout << "Podaj swoja wage [w kg]: "; cin >> m;

	cout << "Podaj swoj wzrost [w m]: ", cin >> h;

	cout << m/pow(h,2) <
	cout <
	cout << " ****************************" <
	cout << "* Zakres wartosci: *" <
	cout << " ****************************" <
	cout << "*<18 niedowaga *" <
    cout << " ****************************" <
	cout << "*18,5-24,99 waga prawidlowa*" <
    cout << " ****************************" <
	cout <<	"*25< nadwaga *" <
    cout << " ****************************" <



	return 0;

}

Coś kręcisz. Wagę wprowadzasz jako pierwszą, później jest wzrost. Zakłądam, że po prostu się pomyliłeś.

out << "Podaj swoj wzrost [w m]: ", cin >> h;

Średnik, nie przecinek, powinnien być po cudzysłowie (jak się to w ogóle skompilowało?).

int h,m;

Problem w tym, że wymagasz podawania wzrostu w metrach, czyli w postaci 1.72 , co doprowadzi do niezgodności typów. Zamień (najlepiej oba) na float (lub poproś o wzrost w centymetrach i dziel przez 100) oraz pamiętaj o dwóch rzeczach: 1) separatorem w C++ jest kropka, więc zapis 1,72 jest błędny; 2) użytkownik może (specjalnie lub nie) wpisać tutaj jakiś tekst, co znowu wyrzuci błąd/wyłączy program. Można tego uniknąć najpierw zapisując wartość do zmiennej typu string, a następnie (po sprawdzeniu czy nie występują inne znaki jak cyfry i kropka) skonwertować je do float za pomocą funkcji atof() [wymaga] (uwaga! ta funkcja przyjmuje jako argument zmienną typu c_string - łatwo to uzyskać ze zmiennej typu string poprzez metodę c_str():

zmienna.c_str()

Dlaczego nie działa po uruchomieniu? A masz gdzieś czekanie na reakcję użytkownika? Program (po wprowadzeniu ostatniej zmiennej) wyświetla wszystkie napisy i natychmiast się wyłącza.

system("pause");

Powyższy kod powinien zatrzymać program do czasu naciśnięcia przez użytkownika klawisza. Nie jest to najlepsze wyjście, ale zdaje egzamin.

Wyjątek,albo zobacz opcje generacji pliku wynikowego i sprawdż czy dołącza biblioteki do programu,gdy uruchamiasz w kompilatorze,to tam jest komplet bibliotek i program odpala,to będą opcje link librares to exe file,bądż podobne

na końcu programu daj system (“pause”); - czekanie na klawisz - bez tego program szybko się zamyka.

Niezgodność typów - wartości zmiennych wzrost i waga nie są zwykle liczbami całkowitymi - to jest pewnie przyczyna zawieszania się programu,deklarujesz typ int,a potem podajesz np. 1,75.

Dev-C++ to nie kompilator tylko IDE. Dev-C++ używa kompilatora MinGW/GCC.

Oryginalny Bloodshed Dev-C++ jest od dawna nierozwijany i zawiera starą wersję kompilatora. Mógłbys zainstalować sobie coś nowszego np. Orwell Dev-C++, wxDev-C++ lub Code::Blocks.

Nie zaraz tylko najpierw wypisuje co miał wypisać, a potem się kończy (bo co miałby dalej robić?).

Wiele IDE przytrzymuje konsolę po zakończeniu programu ale Windows standardowo zamyka konsolę gdy kończy się program, do którego należy. Możesz np. najpierw uruchomić cmd a spod niego uruchomic swój program.

Operator , jest tu użyty poprawnie składniowo, jednak rzeczywiście powinien być raczej ;

W kodzie tak. Natomiast strumieniowi można ustawić odpowiedni locale, który zmieni uzywany operator dziesiętny.

Prościej byłoby raczej sprawdzić czy nastapił błąd i jeśli tak to wyczyścić strumień i jescze raz poprosić użytkownika o liczbę.

float x;

cin >> x;

while(cin.fail())

{

	cout << "Błąd. Podaj Liczbę: ";

	cin.clear(); //czyści flagi błędu

	cin.sync(); //czyści bufor

	cin >> x;

}

system() służy do wywoływania polecenia systemowego. W tym przypadku to przerost formy nad trścią, lepiej

cin.sync();

cin.get(); //pobiera znak, czeka aż klepniesz Enter

@op Jeśli się uczysz to mogę Ci polecić:

Miłej zabawy :smiley:

Miło wiedzieć.

Mówiłem o domyślnych ustawieniach, więc… tak, masz rację.

Jest wiele sposobów, zależy od programisty.

Tam gdzie program pisze podaj wzrost niema średnika - [;] po cout.

A i jeśli chcesz zobaczyć koniec użyj biblioteki conio.h

dzięki niej użyjesz na końcu funkcje getch().