| Rafals Temat założony przez niniejszego użytkownika | Czy warto optymalizować kod będąc początkującym programistą? » 2013-05-23 00:16:25 Witam ponownie.
 W lekcji formułujemy problem, a następnie piszemy program, który go rozwiąże. Zalecane było, aby spróbować napisać samemu ten program. Napisałem.
 Pytanie brzmi, który kod jest bardziej optymalny i dlaczego?
 KOD z lekcji:
 #include <iostream>#include <cstdlib>
 #include <ctime>
 
 bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
 {
 if( ile <= 0 )
 return false;
 
 int i = 0;
 do
 {
 if( tab[ i ] == iLiczba )
 return true;
 
 i++;
 } while( i < ile );
 
 return false;
 }
 
 int wylosuj()
 {
 return( rand() % 10 ) + 1;
 }
 
 int main()
 {
 srand( time( 0 ) );
 int wylosowane[ 5 ];
 int wylosowanych = 0;
 do
 {
 int liczba = wylosuj();
 if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
 {
 wylosowane[ wylosowanych ] = liczba;
 wylosowanych++;
 }
 } while( wylosowanych < 5 );
 
 wylosowanych = 0;
 do
 {
 std::cout << wylosowane[ wylosowanych ] << std::endl;
 wylosowanych++;
 } while( wylosowanych < 5 );
 
 return 0;
 }
KOD mój:
 #include <iostream>#include <ctime>
 #include <cstdlib>
 using namespace std;
 
 int wylosuj( int Min, int Max )
 {
 int losowana =( rand() %( Max - Min + 1 ) + Min );
 return losowana;
 }
 
 bool sprawdz( int t[], int t_miejsce, int i_liczba )
 {
 int licznik = 0;
 do
 {
 if( t[ licznik ] == i_liczba )
 return false;
 
 licznik++;
 } while( licznik < t_miejsce );
 
 return true;
 }
 
 int main()
 {
 srand( time( NULL ) );
 int tablica[ 5 ], rozmiar;
 int Min, Max, i_liczba, licznik;
 bool sprawdzT;
 Min = 1;
 Max = 10;
 rozmiar = 5;
 licznik = 0;
 do
 {
 i_liczba = wylosuj( Min, Max );
 sprawdzT = sprawdz( tablica, licznik, i_liczba );
 if( sprawdzT )
 {
 tablica[ licznik ] = i_liczba;
 licznik++;
 }
 
 } while( licznik < rozmiar );
 
 licznik = 0;
 do
 {
 cout << tablica[ licznik ] << ", ";
 licznik++;
 } while( licznik < rozmiar );
 
 return 0;
 }
 
U mnie więcej zmiennych przez to, że tylko w jednym miejscu będę musiał zmienić wartości, zmienić zakres losowania czy wielkość tablicy. | 
|  | 
| DejaVu | » 2013-05-23 00:38:18 Nie ma sensu rozważać aspektów optymalizacyjnych na poziomie podstaw programowania. Ręczę Ci i gwarantuję, że nie jeden absolwent studiów IT nie potrafi oszacować złożoności obliczeniowej algorytmu ani stwierdzić 'co będzie szybsze'.    Złożoność obliczeniową algorytmów warto analizować dopiero wtedy, gdy masz dużą aplikację, dużo danych i pojawia się problem ze zbyt długim czasem reakcji aplikacji na wykonanie danej czynności. Wówczas masz dobre środowisko zarówno do analizowania problemu jak i testowania nowych rozwiązań. Co więcej, koncentrujesz się wtedy stricte na optymalizacji i dociekaniu 'dlaczego to jest lepsze', a nie... próbujesz robić z siebie Greka nie wiedząc tak na dobrą sprawę prawie nic o języku programowania, którego używasz :) Wiedz również, że to nie jest żadna złośliwość czy cokolwiek innego - po prostu odpowiedź na Twoje pytanie nie ma sensu, bowiem nawet proponując algorytm z dużo lepszą złożonością obliczeniową, czas obliczeń będzie niezauważalny dla tak małego zbioru danych.
 W dużym uproszczeniu można powiedzieć: oba algorytmy są porównywalne, bowiem rozmiar danych jest stały, a zatem złożoność obliczeniowa algorytmów jest stała :P
 | 
|  | 
| Rafals Temat założony przez niniejszego użytkownika | » 2013-05-23 00:54:52 Spoko nie wziąłem tego za złośliwość, jak i masz rację, że nic nie wiem o programowaniu ;) Może źle zadałem pytanie. Miało znaczyć to tyle co, jak mój kod wygląda w stosunku do profesjonalisty, na co zwrócić uwagę, aby w przyszłości w trakcie analizy kodu mieć większy porządek. Np. z tego co napisałem w tej chwili bym zmienił: sprawdzT = sprawdz( tablica, licznik, i_liczba );if( sprawdzT )
na if( sprawdz( tablica, licznik, i_liczba ) ) Pisząc optymalny nie miałem na myśli optymalności pod względem szybkości działania tylko przejrzystości i hmm wykonania według sztuki programowania? | 
|  | 
| DejaVu | » 2013-05-23 01:00:23 Na to też nie masz co zwracać specjalnej uwagi - powinieneś przede wszystkim starać się dzielić kod na 'powtarzalne' fragmenty, tj. jeżeli wiesz, że jakieś bardziej złożone operacje będziesz chciał kilka razy wykonać w różnych miejscach w kodzie, to powinieneś utworzyć odpowiednią funkcję. Ponadto na początku drogi programowania najważniejsze jest to, by rozumieć to, co się pisze, a nie przepisywać dobre rozwiązania 'bo ktoś lepszy je napisał' :) Kurs C++ z tej strony wcale nie przedstawia wyrafinowanych rozwiązań - on się koncentruje na tym, by materiał 'sprzedać' w możliwie najprostszej formie, pokazując jednocześnie jak należy stosować w praktyce nowo poznaną wiedzę. W praktyce wiele rzeczy można napisać w jednej/dwóch linijkach zamiast 15 czy też 20 wierszy, ale to jest wypadkowa zdobytego doświadczenia i wielu lat programowania, które początkującego może po prostu odstraszyć :) | 
|  | 
| cyklopek11 | » 2013-05-23 01:00:45 | Np. z tego co napisałem w tej chwili bym zmienił:
 C/C++
 sprawdzT = sprawdz( tablica, licznik, i_liczba );
 if( sprawdzT )
 na
 if( sprawdz( tablica, licznik, i_liczba ) )
 
 | 
 Ja jestem hobbystą i z tego co na razie mam wiedzę (i deasemblacji) przypuszczam, że oba powyższe fragmenty kodu, byłyby identyczne pod względem kodu maszynowego a jedyny niuans z nimi związany to czytelność na poziomie kodu c++. PS Jak sądzisz DejaVu, czy taki początkujący czy też średniak (ja :-) w trakcie pisania swojego, tam prostego kodu powinien już w trakcie pisania obmyślać tricki optymalizujące np. szybkość czy dopiero jak wykona prototypowy działający program? Chodzi mi o taki kod 2000 linijek (czytelnych ale bez rozwlekania).  | 
|  | 
| Rafals Temat założony przez niniejszego użytkownika | » 2013-05-23 01:07:01 Ok także póki co przestanę się przejmować jak to ma wyglądać, byle działało poprawnie i było napisane własnymi "ręcoma" ;]Tylko wiecie, niektórym profesorskim zakutym pałom nie wystarczy, że działa poprawnie i potrafię obronić, jeszcze ma wyglądać ;p Ale to dopiero za 5 miesięcy zacznę się nimi martwić. Chociaż myślę nad sensem studiów informatycznych w wieku 27 lat ;) Stary ale jary ;p
 | 
|  | 
| DejaVu | » 2013-05-23 01:16:12 Przeceniasz uczelnie i kadrę nauczającą ;p Zadaniem wykładowców jest wyłożyć przedmiot, posprawdzać kolokwia/egzaminy i wystawić oceny. Studia w naszym kraju są tylko i wyłącznie konieczną edukacją, a nie profesjonalną wiedzą merytoryczną. Ja zrobiłem studia tylko i wyłącznie po to, aby mieć 'papier', a nie po to by się tam czegoś nauczyć. Idąc na studia miałem już dużą wiedzę z tego co mnie interesowało, a studia tylko pokazały mi, że wszystko jest omawiane zarówno po łebkach jak i na poziomie podstawowym. Ponadto większość przedmiotów jest tworzona pod kadrę, a nie pod praktyczne zastosowanie w IT, więc... siłą rzeczy studia to tak na dobrą sprawę 'papier, papier, papier'.
 No ale mimo wszystko zachęcam do zrobienia studiów - choćby dla papieru :)
 | 
|  | 
| Rafals Temat założony przez niniejszego użytkownika | » 2013-05-23 01:23:00 W większości się z Tobą zgodzę, aczkolwiek uczelnia na którą się wybieram współpracuje z hmm jak oni to nazywali "zrzeszenie małych, średnich i dużych przedsiębiorstw" jakoś tak. Między innymi na praktyki w MS można trafić. Jak i z tego co się orientuję wielu praktyków tam wykłada. Chociaż jest to nadal uczelnia prywatna ;). Wszystko zależy jaki wykładowca, jedna grupa miała zaliczone laborki za to, że przychodzili na zajęcia, a inna musiała już w pierwszym semestrze klepać proste gry strategiczne na konsole, aby otrzymać 5 ;).Zapomniałem, uczelnia to WSNHiD w Poznaniu.
 Do jutra. Dobranoc.
 | 
|  | 
| « 1 »  2 |