Autor Wątek: Prosty Algorytm - Jak to rozwiązać ? Amatorszczyzna.  (Przeczytany 4378 razy)

Offline Hawkman

  • Użytkownik

# Listopad 09, 2011, 14:26:41
 Od tego roku zacząłem uczęszczać na studia gdzie wykładowcy zaczynają nas uczulać na punkcie "profesjonalizmu" w kodzie. Siedzę nad takim prostym zadaniem:

Napisać program który wczytuje nieustannie ciąg znakowy i tak długo jak podany ciąg
znakowy będzie równy napisowi  yes utrzymuje swoje działanie...


No i zadanie tam leci sobie dalej. Jeżeli użytkownik wpisze yes to ma zrobić tam szereg instrukcji.
Pytanie: jak napisać algorytm który zapyta - sprawdzi czy yes - jeżeli yes to obliczy i się spętli - jeżeli nie to skończy.

Ja wymyśliłem coś takiego:

bool a;
do
{
    wczytaj ciąg znaków;
    if ( ciąg znaków == yes)
       {
        wykonaj szereg instrukcji;
        wypisz wynik;
        a = true;
        }
    else
    a = false;
}  while (a);              // moglbym tutaj wrzucic jeszcze raz   czy ciag znakow == yes; zamiast tego boola, ale uznalem ze jak nie bede sprawdzal dwa razy tego samego warunku to bedzie bardziej... pro


czy to jest 100% amatorsko ? Czy jest jakiś lepszy sposób ? Co o tym sadzicie ?
« Ostatnia zmiana: Listopad 09, 2011, 14:29:26 wysłana przez Hawkman »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline KeeL

  • Użytkownik

# Listopad 09, 2011, 14:29:24
Moja odpowiedź może być mało profesjonalna, ale czy nielepiej po prostu
do
{
    wczytaj ciąg znaków;
 
}  while ( ciag_znakow=="yes");     

Wydaje mi się że to najprostszy sposób.

Offline Hawkman

  • Użytkownik

# Listopad 09, 2011, 14:31:33
Tak, ale sęk w tym że są instrukcje które muszą się wykonać jeżeli  ciag_znakow=="yes" w tej wlasnie petli wiec jezeli zrobilbym tak jak Ty to musialbym wykonac sprawdzanie tego samego warunku dwa razy:

do
{
    wczytaj ciąg znaków;
   if  (  ciag_znakow=="yes" )
   zrob instrukcje;
 
}  while ( ciag_znakow=="yes");   

dlatego postanowiłem dodać zmienna (bool a) która mi powie czy ten warunek przeszedł pozytywnie czy niegatywnie.

Ja wiem że kod działa, ale pytanie czy w "pracy" czy w innym poważnym kodzie coś takiego jest O.k ?
« Ostatnia zmiana: Listopad 09, 2011, 14:33:54 wysłana przez Hawkman »

Offline KeeL

  • Użytkownik

# Listopad 09, 2011, 14:35:52
Kod i tak sprawdzi ten warunek, tylko że nie w instrukcji warunkowej, a jako warunek w pętli.


Wydaję mi się w takim razie, że tak będzie najlepiej. Najprostszy sposób. Tylko wywaliłbym deklaracje zmiennej logicznej przed pętle :).

Offline Solgar

  • Użytkownik

# Listopad 09, 2011, 14:38:32
Oh my... uczula was na punkcie profesjonalizmu? I to jest wszystko co powiedział na ten temat? Odnoszę wrażenie, że ten pan jest co najmniej nieprofesjonalny, jeżeli nie wytłumaczył na czym ten profesjonalizm według niego ma wyglądać. Kod ważne żeby był czytelny, zrozumiały, działał i nie zawierał błędów, wtedy jest profesjonalny.

Offline Hawkman

  • Użytkownik

# Listopad 09, 2011, 14:44:40
Tłumaczy nam co tydzień na ćwiczeniach :)
- bezwzgledny zakaz używania breaków, goto, continue w pętlach
- formatowanie
- zniechęca do inicjalizowania zmiennych:

int a,b,c,d,e,f ;

w sumie z dosyć przemawiającym argumentem że jeżeli chcemy zmienić typ zmiennej czy dwóch to pojawi się problem. No i nie ma gdzie wsadzić komentarzy


i takie tam różne

Offline Armageddon

  • Użytkownik

# Listopad 09, 2011, 14:50:16
Hawkman, witam kolegę z roku albo nawet i ćwiczeń ^^

To co napisał KeeL jest jak najbardziej prawidłowy i "profesjonalny". Tylko nie zapominaj opakować to w char* bo std::string jest "dla amatorów" :P.

Formatowanie(chociaż tutaj czasami przesadza ;P) i zakaz używania goto etc. jest bardzo dobry bo zwiększa czytelność kodu. Szybko byś się pogubił we własnym kodzie.

A co do inicjalizowania zmiennych też ma trochę racji ponieważ jak nawrzucasz za dużo zmiennych do jednej linii to się też znowu pogubisz we własnym kodzie. Oczywiście można tak robić jeśli zmienne te są jakoś "tematycznie" powiązane ze sobą.

@Solgar
No niestety, ten Pan jest trochę takim zapalonym assemblerowcem :) Wymaga aby wszystko programować w czystym C, nie używać szablonów z std oraz alokowania pamięci przez new(!), ponieważ są jak już wcześniej napisałem dla amatorów, każdy pr0 sam sobie taką implementacje piszę.

Po części ma racje bo dobrze wiedzieć co siedzi w środku i jak co działa, chociaż moim zdaniem trochę przegina znowu w drugą stronę :). Kwestia gustu.

Offline BadRay

  • Użytkownik
    • Portfolio

# Listopad 09, 2011, 14:50:53
Tłumaczy nam co tydzień na ćwiczeniach :)
- bezwzgledny zakaz używania breaków, goto, continue w pętlach

goto ok... ale continue i break?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 09, 2011, 14:53:17
Cytuj
- bezwzgledny zakaz używania breaków, goto, continue w pętlach
No to bezwzględnie radzę nie słuchac tego pana. ;)

Bez używania break i continue to w tej branży daleko nie zajedziesz, bo będziesz tworzył spaghetti, a nie kod. :)

Cytuj
- zniechęca do inicjalizowania zmiennych:
Zniechęca, czy zachęca? Inicjalizowanie zmiennych jest BARDZO dobrą praktyką. Inaczej łatwo o błędy.


Cytuj
No i nie ma gdzie wsadzić komentarzy
No bo zadanie jest tak banalne, że nie ma tu czego komentować.


A co do samego kodu, to proponuję takie rozwiązanie: ;)
for(string s;cin >> s, s=="yes";) wykonaj_instrukcje();

Offline Liosan

  • Redaktor

# Listopad 09, 2011, 15:02:37
Bez używania break i continue to w tej branży daleko nie zajedziesz, bo będziesz tworzył spaghetti, a nie kod. :)
Zauważ, że nikt nie napisał, że nie można wyjść z pętli przez wcześniejszy return; :) Czyli pewnie dałoby się coś wymyślić :)

Liosan

Offline bies

  • Użytkownik

# Listopad 09, 2011, 15:04:53
Tłumaczy nam co tydzień na ćwiczeniach :)
- bezwzgledny zakaz używania breaków, goto, continue w pętlach
Czym pokazuje swój brak praktyki. Każdy porządny kod(*) w C używa goto do obsługi błędów (w C++ raczej wyjątki). Break używane jest właśnie w takich przypadkach o których piszesz aby nie tworzyć zbędnych zmiennych warunkowych. Pseudokod:
while (true) {
    string input = read_string_from_input();
    if (input != "yes")
        break;
    // do sth if yes
}

(*) Przykładem naprawdę porządnego kodu w C jest jądro Linuksa.

// edit zmieniłem warunek na czytelniejszy
« Ostatnia zmiana: Listopad 09, 2011, 15:13:24 wysłana przez bies »

Offline Hawkman

  • Użytkownik

# Listopad 09, 2011, 15:08:02
Powiedział że są takie przypadki gdzie MOŻNA używać break czy continue, ale zazwyczaj jest to oznaką amatorstwa.

Witam, witam, Armageddon :)
Dokładnie, nie mogę używać bibliotek C++, więc muszę
for(string s;cin >> s, s=="yes";) wykonaj_instrukcje();napisać w czystym C :)

Ale właśnie o to mi chodziło ! Wiedziałem że jest łatwiejszy sposób na rozwiązanie tego.

Cytuj
Zniechęca, czy zachęca? Inicjalizowanie zmiennych jest BARDZO dobrą praktyką. Inaczej łatwo o błędy.
Chodziło mi o to co jest po dwukropku : inicjalizowanie zmiennej po zmiennej w taki sposób int a,b,c,d;


returnów też zabronił ;P

edit:

hah, myślisz że nie wpadłem na to żeby zrobić nieskończoną pętlę ? :) Już raz to zrobiłem, z breakiem i nieźle mi się dostało na ćwiczeniach. hehe

"używanie nieskończonej pętli, a co dopiero breaków w kodzie jest oznaką że programista nie mógł sobie poradzić tworząc normalny algorytm"  -- czy coś takiego.

« Ostatnia zmiana: Listopad 09, 2011, 15:10:11 wysłana przez Hawkman »

Offline bies

  • Użytkownik

# Listopad 09, 2011, 15:17:26
hah, myślisz że nie wpadłem na to żeby zrobić nieskończoną pętlę ? :) Już raz to zrobiłem, z breakiem i nieźle mi się dostało na ćwiczeniach. hehe

"używanie nieskończonej pętli, a co dopiero breaków w kodzie jest oznaką że programista nie mógł sobie poradzić tworząc normalny algorytm"  -- czy coś takiego.
Brak praktyki i niewyściubienie nosa poza uczelnie. Jest naprawdę dużo kodu bardzo wysokiej jakości który jest używany w milionach instalacji (jeśli nie rzędy wielkości więcej). I ten kod więcej mówi o profesjonalnym kodzie niż większość tego co usłyszysz na uczelni. Więc po prostu poczytaj ten kod.

Offline Hawkman

  • Użytkownik

# Listopad 09, 2011, 15:27:15
Cytuj
Brak praktyki i niewyściubienie nosa poza uczelnie. Jest naprawdę dużo kodu bardzo wysokiej jakości który jest używany w milionach instalacji (jeśli nie rzędy wielkości więcej). I ten kod więcej mówi o profesjonalnym kodzie niż większość tego co usłyszysz na uczelni. Więc po prostu poczytaj ten kod.

Dzięki. Dobra rada :)

Dziękuję wszystkim za pomoc. Teraz już mam wszystko poukładane.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 09, 2011, 15:36:07
Cytuj
Powiedział że są takie przypadki gdzie MOŻNA używać break czy continue, ale zazwyczaj jest to oznaką amatorstwa.
Największą oznaką amatorstwa jest pisanie takich rzeczy. Mógłbym się założyć, że człowiek w zyciu nie napisał samemu bardziej złożonego projektu.

Cytuj
for(string s;cin >> s, s=="yes";) wykonaj_instrukcje();
napisać w czystym C :)
No to będzie i czysty C.
for(char s[100];fgets(s,100,stdin),strcpy(s,"yes")==0;) wykonaj_instrukcje();