harnasiek
#programowanie #cpp #cplusplus #informatyka #programujzwykopem
Hej, zakupiłem do nauki C++ książkę, którą ludzie polecali "Język C++" Bjarne Stroustrupa.
I teraz ważne pytanie, bo nie wiem co robić. W technikum uczyli mnie bardzo prostej budowy c++, a tu w książce kod wygląda totalnie inaczej i według mnie jest bardziej złożony. Czy lepiej już nauczyć się budować program tak jak pokazuje Bjarne, ale jest więcej do wypisania, czy pozostać przy typowym int main?
Poglądowy kod z technikum:

`#include
using namespace std;
int main()
{double x;
cin>>x;
cout<<"Kwadrat liczby wynosi:"<
  • Najlepsze
  • Wszystkie komentarze
mirkogreg
@harnasiek to jakieś #heheszki ? xD
mirkogreg
@harnasiek chodzi mi o to, że Twoje pytanie można sparafrazować: Mam pisać profesjonalny kod, czy mogę pisać jak gimnazjalista? :D Dobrym nawykiem jest pisanie kodu który jest zrozumiały i czytelny, czasami oznacza to realizowanie mnożenia w osobnej funkcji, czasami w 'mainie', tak bym powiedział
MarcinOrlowski
MarcinOrlowski

@harnasiek: to co na obrazku pokazuje rozbicie kodu na logiczne bloki. Oczywiście wynik będzie taki sam, ale czytelność kodu zyskuje. Poza tym powiedzmy ze nie potęgujesz ale liczysz np. "prędkość satelity względęm Wenus". Mozesz wsadzic obliczenia od razu w maina albo przeniesc je do funkcji calculateVelocityRelativeToVenus(). I w kodzie to wywoływać. Wynik ten sam ale potem czytając ten kod, bedziesz widział, "ok, tu podstawiamy prędkość wzgl. Wenus", przy
MarcinOrlowski
MarcinOrlowski
@harnasiek: ogolnie tak. De facto nawet pobranie danych powinno byc w oddzielnej funkcji np. getX() (czy jakkolwiek :), którą wołasz a ona zwraca wprowadzony x. Zauważ od razu korzyść. Zechcesz brać dane np. z pliku zamiast z klawiatury, zmieniasz tylko ciało funkcji getX() i już. Nic więcej nie musisz zmieniać. Albo nawet idąc dalej getX() jest bardziej złożone i bierze albo z pliku, albo z stdin albo z sieci.
arszonto
@harnasiek: Generalnie raczej sugerowałbym się od początku przyzwyczajać do struktury jaką tam masz. Natomiast jasne, jeśli po prostu chcesz coś konkretnego przetestować/prototypować np. sprawdzić działanie czegoś, to nie, nie musisz. Chociaż tak jak MarcinOrlowski wspomniał, wydaje mi się, że chodziło też tutaj o pokazanie właśnie jak strukturyzować kod.
mirkogreg
@harnasiek jeżeli jakis kod realizuje pewne konkretną funkcję, to warto go umieścić w funkcji, pozwala to przekazać pewne intencje autora, poprawia czytelność, umożliwia ponowne wykorzystanie etc.
arszonto
@harnasiek: Nie koniecznie "na tej". Staraj się po prostu, żeby kod był podzielony na jakieś logiczne, spójne części. Pod tym kątem polecam zapoznać Ci się z takimi założeniami jak np. zasady SOLID, w tym wypadku konkretnie pierwszą literką - S, jak Single responsibility.
MarcinOrlowski
MarcinOrlowski
Czyli int main będzie służył


@harnasiek: przy okazji, deklaracja int main() oznacza ze funkcja main() powinna zwrocić int. Twój klod tego nie robi i kompilator powinien pokazać warning. to co main() zwraca jest zwracane potem do systemu tak zeby wiedział czy program się wykonał poprawnie czy nie. Jeśli z maina zwrócisz zero (return 0;) to znaczy ze jest ok. Jeśli np. zmiast cyfry w X user wprowadził
MarcinOrlowski
MarcinOrlowski
@harnasiek: generalnie lepiej jak na obrazku ale to też trzeba z umiarem. Tak czy siak ten kod z przykladu jest mocno nietrafiony do bo wygląda jak zwykły over-engineering. No chyba że to ma demonstrowac strukture programu a nie sam kod.
harnasiek
harnasiek Autor
0
@MarcinOrlowski: to przy na serio prostym liczeniu pozostać na działaniu na samym mainie?
harnasiek
harnasiek Autor
0
@mirkogreg: nie, zwykłe pytanie kogoś kto dopiero zaczyna, a chce nabrać dobrych nawyków w pisaniu kodu
harnasiek
harnasiek Autor
0
@mirkogreg: czyli już nawet próbować samemu pisać jakieś kody bazując na tej strukturze tak?
harnasiek
harnasiek Autor
0
@MarcinOrlowski: Czyli int main będzie służył do wywołania jedynie potrzebnych mi wartości, a reszta to będą osobne funkcje ze swoim kodem tak?
arszonto
@harnasiek: Main to takie miejsce gdzie Twój program się zaczyna (nie jest to do końca prawda, ale na ten moment możesz tak przyjąć), to co już tam wywołasz, zależy od Ciebie i dużo łatwiej ogarnąć kod, jeśli konkretne zadania są oddelegowane do odseparowanych bloków kodu/funkcji/metod/klas/whatever, które potem sobie tam wywołać. Tak jak kolega wyżej podał Ci przykład, możesz stworzyć X funkcji obrazujących np. każda jeden etap procedury startowej samolotu, nazwać
arszonto
@MarcinOrlowski: W przypadku C++98 i wyżej i *chyba* C99 i wyżej, standard zapewnia, że defaultowo będzie zwrócona wartość 0, więc analiza też i warninga raczej w tym konkretnym przypadku nie pokaże.
MarcinOrlowski
MarcinOrlowski
@arszonto: Masz raację, ale to IMHO zło jest i uczy złych nawyków. Sugeruje by @harnasiek jednak na tym nie polegał (przynajmniej teraz) bo zmieni język i sie nadzieje. Szczęśliwie jest -Wreturn-type dla kompilatora :)
R.....y
R.....y
@harnasiek: pisanie globalnego using namespace std to zła praktyka, więc jak mozesz to tego nie rób.
generalnie programy powinno rozbijać się na jak najwięcej funkcji, a jak najmniej pisać stłoczonego kodu.
ktoś mi kiedyś powiedział że jeżeli jakaś twoja funkcja ma ponad 50 linii kodu, to znaczy że zrobiłeś coś źle, i tak szczerze to się pod tym mogę podpisać, bo mało jest momentów kiedy moje funkcje mają więcej, i