Prostując nieco dogmatyczny post kolegi fasadina (odmieniać? nie odmieniać?) dodam trochę informacji od siebie.
zmien dev-cpp na code::blocks
Dodajmy może użyteczną dla OP informację - że jeżeli używa Bloodshed Dev-C++ to używa starego IDE oraz najpewniej też wersji GCC, która również jest stara jak jasny pieron. :P (3.4.5? no w każdym razie coś z 2005/6 roku)
Jeżeli używa wxDev-C++ lub Orwell's Dev-C++ to już nie jest tak źle, bo to aktywne projekty. OP - dobrze by było gdybyś rozejrzał się za świeższą wersją GCC (http://tdm-gcc.tdragon.net/download ew. http://nuwen.net/mingw.html są godne polecenia) i być może świeższym IDE - QtCreator, NetBeans C/C++, Code::Blocks (jeśli zainstalujesz jedną z powyższych dystrybucji GCC/MinGW to nie potrzebujesz już wersji dołączonej do C::B), etc. Jest też, o zgrozo, Visual Studio Community Edition. :P
- nie uzywa sie goto
-
goto
w języku jest i raczej z niego nie wyleci. Sytuacja z goto
jest jednak taka, że zwykle sprawia, że kod staje się mniej czytelny, może się zrobić "spaghetti" i można nieźle namieszać... Chociaż C++ przed najgorszym nas tu akurat chroni. Strzelić sobie w stopę używając goto
ciągle możemy, ale już odrąbać nogi niekoniecznie, bo nie przeskoczymy inicjalizacji zmiennych, ani nie poskaczemy między funkcjami.
Samo goto
w C++ nie jest jakieś diaboliczne, raczej po prostu zwykle niepotrzebne, a nadużywanie go przez początkującego programistę jest większym problemem niż sam fakt jego użycia.
Więc taka generalna zasada powinna brzmieć nie tyle "goto nie używamy", co raczej "jeżeli nie potrafisz dobrze uargumentować dlaczego goto
w tym przypadku jest przydatne - to pewnie nie powinieneś go tu używać". Jednym z wybaczalnych przypadków może być szybkie wyskoczenie z bardzo głębokiego zagnieżdżenia.
Jest jeszcze przynajmniej jedna okazja do użycia goto
, które byłoby nie tylko wybaczalne, ale wręcz pożądane... Ale taka sytuacja, możliwa do napotkania w C, w C++ może być rozwiązana za pomocą lepszych sposobów - mianowicie RAII.
- inicjalizuj zmienne (bo niezainicjalizowane posiadaja smieci)
Generalnie dobra rada. Oczywiście w tym przypadku niewiele to zmienia, bo nie używasz tych śmieciowych wartości, ale generalnie się zgadzam. Może być sytuacja, gdzie śmieci na ten przykład w dużej tablicy Ci w ogóle nie przeszkadzają, bo wiesz, że nadpiszesz te wartości czymś sensownym. Nawet w takiej sytuacji jednak, jeżeli inicjalizacja nie jest wielce kosztowna - radzę się nią zainteresować. ;)
- endl nie sluzy do nowej liini. Od tego jest "\n"
Wszystko super, poza tym, że jak byk każdy newbie Ci zademonstruje, że std::endl
"do nowej linii służy". :P Problem jest w tym, że std::endl
poza wrzuceniem ostream::widen('\n')
do strumienia odpali również ostream::flush()
, co w tym momencie nie ma znaczenia, ale już gdybyśmy wyrzucali sporo danych w pętli, to częste flushowanie mogłoby srogo spowolnić nasz program. Dlatego dobrym rozwiązaniem byłoby po prostu używać std::endl
tam, gdzie chcemy do strumienia wrzucić nową linię, oraz go od razu "spłukać". ;) W innym przypadku, dodanie '\n' to raczej lepsze wyjście. Szczególnie tutaj:
cout << "Wcisnales zly przycisk" <<endl <<endl;
Po co się tak męczyć, jak można po prostu:
cout << "Wcisnales zly przycisk\n\n";
5) nie uzywa sie char tylko string (klasy string)
A to już nie ma sensu. char
używa się tam, gdzie nam potrzebny char
, a std::string
gdzie nam potrzebny std::string
. Jasne, powinieneś się zainteresować klasą std::string
, bo choć nie jakaś z nieba zrzucona, to jednak znacznie ułatwia pracę z ciągami znaków w C++. Pierwsza rzucająca się w oczy sprawa to po prostu zdolność stringa do dynamicznej zmiany rozmiaru. Nie musisz już ręcznie realloc
wołać bo Ci się bufor skończył. ;)
Ale co to ma wspólnego z char
per se? ;)
Poza tym, z małych rzeczy - w C++ mamy <cmath>
zamiast <math.h>
. Czyszczenie ekranu bym sobie kompletnie odpuścił (dlaczego usuwasz użytkownikowi sprzed oczu przydatną informację?), ale jeśli nalegasz - to po cin >> temp;
z powyższego kodu dodaj cin.ignore(...)
, żeby pozbyć się ewentualnych śmieci z bufora.