• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konstrukcja kodu - Czy robię to dobrze

VPS Starter Arubacloud
0 głosów
446 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)

Witajcie, mam kod symulatora bankomatu który zrobiłem i który działa w 99 procent (brak ogranicznika przy przelewaniu pieniędzy przez co można nabić nieskończenie ujemne saldo, ale zaraz to dopiszę). 

 

Kod działa, ale chcę żebyście rzucili okiem i powiedzieli mi, czy sposób w który go zbudowałem jest akceptowalny.. Jedyne co wiem, że robię źle to wcięcia i goto x; (ale nie wiedziałem jak wracać do funkcji menu głównego, a na internecie znalazłem, że to jeden z niepolecanych, ale najprostszych sposobów, więc stwierdziłem, że na początek starczy.)

 

Pierwszy cout to ASCI ART, dodany dla zabawy :)

+ Czy zaawansowani "kodersi" dodawają sobie komentarze do kodu? // czy to raczej lamerskie?

+ Czy długość kodu, a raczej pustych wierszy ma znaczenie na wydajność kodu?

 

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <stdio.h>

using namespace std;
string opcja;
int stan = 2000;

bool zalogowano=false;
int proby=0;

int main()
{
    while(!zalogowano&&proby<3)
    {

        cout <<" _______  _______  __    _  ___   _    ___   __    _  _______ \n|  _    ||   _   ||  |  | ||   | | |  |   | |  |  | ||       |\n| |_|   ||  |_|  ||   |_| ||   |_| |  |   | |   |_| ||    ___|\n|       ||       ||       ||      _|  |   | |       ||   | __ \n|  _   | |       ||  _    ||     |_   |   | |  _    ||   ||  |\n| |_|   ||   _   || | |   ||    _  |  |   | | | |   ||   |_| |\n|_______||__| |__||_|  |__||___| |_|  |___| |_|  |__||_______|\n\n\n";
        Sleep(1500);
        system("cls");
        cout << "Witamy w banku. \nProsimy o autoryzacje: \n \n";
        string login,haslo;
        cout << "Login: ";
        cin >> login;
        cout << "Haslo: ";
        cin >> haslo;

    if(login=="wachu"&&haslo=="test")
    {
        zalogowano=true;
        system("cls");
        x:
        {
            cout << "\n Menu wyboru: \n 1. Przelew \n 2. Wplata \n 3. Wyplata \n 4. Stan konta \n 5. Kredyt \n 6. Wyloguj\n\n";
            cout << "[Stan konta: " << stan << " zl]\n\n";
            cout << "\nWybierz opcje: ";
            cin >> opcja;
        }
        if(opcja=="przelew"||opcja=="Przelew"||opcja=="1")
        {   int ile; string target;
            cout << "Ile pieniedzy przelac: ";
            cin >> ile;
            cout << "Na jaki rachunek przeslac pieniadze: ";
            cin >> target;
            cout << "Czy na pewno chcesz przelac " << ile << " zlotych na rachunek " << target << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if (choice=="tak"||choice=="Tak")
            {
                stan=stan-ile;
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja przelewu. \n ";
                Sleep(2000);
                cout << "\n \nPrzelew udany. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }}
            }
            else
            {
                cout << "Anulowano przelew. \n \n Nastepuje powrot do menu.";
            }
            if(opcja=="Wplata"||opcja=="wplata"||opcja=="2")
        {   int ile;
            cout << "Ile pieniedzy wplacic: ";
            cin >> ile;
            cout << "Czy na pewno chcesz wplacic " << ile << " zlotych na swoj rachunek " << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if (choice=="tak")
            {
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja wplaty. \n";
                Sleep(2000);
                cout << "\n \nWplata udana. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;

            }
            else
            {
                cout << "Anulowano wplate. \n \n Nastepuje powrot do menu.";
                goto x;
            }
        } // if wplaty
            if(opcja=="Wyplata"||opcja=="wyplata"||opcja=="3")
            {
            int ile;
            cout << "Ile pieniedzy wyplacic: ";
            cin >> ile;
            cout << "Czy na pewno chcesz wyplacic " << ile << " zlotych ze swojego rachunku " << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if(choice=="tak"||choice=="Tak")
            {
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja wyplaty. \n";
                Sleep(2000);
                cout << "\n \nWyplata udana. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }
            else
            {
                system("cls");
                cout << "Anulowano wylate. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }
            }
             if(opcja=="stan konta"||opcja=="stankonta"||opcja=="4")
    {
        cout << "Twoj stan konta wynosi: " << stan << " zlotych.";
        Sleep(4000);
        system("cls");
        goto x;
    }
    if(opcja=="kredyt"||opcja=="Kredyt"||opcja=="5")
    {
        system("cls");
        cout << "Warunki kredytu: \n \n";
        cout << "1. Kredyt moga wziac tylko osoby ze stanem konta powyzej 10zl.\n (Wynika to z ochrony phishingowej)\n";
        cout << "2. Kredyt udzielany jest wylacznie osobom pelnoletnim. \n (Konta junior nie moga uzyskac kredytu)\n";
        cout << "3. Kredyt jest udzielany maksymalnie na 24 raty.\n";
        cout << "4. Oprocentowanie wynosi 4% przez pierwszy rok. \n";
        cout << "5. Maksymalna kwota kredytu wynosi 5 tysiecy zlotych. \n \n \n";
        Sleep(1000);
        string akceptacja;
        cout << "Czy akceptujesz warunki kredytu: ";
        cin >> akceptacja; if(opcja=="stan konta"||opcja=="stankonta"||opcja=="4")
    {
        cout << "Twoj stan konta wynosi: " << stan << " zlotych.";
        Sleep(2000);
        goto x;
    }
        if(akceptacja=="tak"||akceptacja=="Tak")
        {
            int kwota;
            cout << "Podaj kwote kredytu: ";
            cin >> kwota;
            if(kwota<=5000)
            {
                stan=stan+kwota;
                cout << "Kredyt zostal udzielony. \n \nTwoj aktualny stan konta wynosi:" << stan << " zlotych.";
                Sleep(2000);
                system("cls");
                cout << "Nastepuje przejscie do menu wyboru.";
                goto x;

            }
        }
        else
        {
            cout << "Nie zaakceptowano warunkow umowy. \nNastapi powrot do menu wyboru.";
            goto x;
        }

    }
        if(opcja=="wyloguj"||opcja=="Wyloguj"||opcja=="6")
        {
            system("cls");
             cout << "Dziekujemy za skorzystanie z uslug naszego banku. \n\nZapraszamy ponownie.";
             Sleep(2000);
             break;
        }
    else
    {
        proby++;
        cout << "Nie udalo sie zalogowac." << " \nTo twoja " << proby << " proba." << endl;
    }
   }  // klamka od petli


    return 0;
} // klamra maina

 

5 odpowiedzi

+1 głos
odpowiedź 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Odnośnie komentarzy.

Generalnie ich się nie stosuje - praktycznie nigdy. Co innego komentarze typu doc (/**  */) z dwiema * przy rozpoczęciu.

Czemu się nie stosuje? Bo powinno z góry się pisać kod zrozumiały i czytelny. Podzielony na proste kawałki, które wykonują tylko jedno zadanie.

Spórz na swoje nazwy zmiennych:
opcja, ile, choice, akceptacja, proby, stan

Czy one coś mówią o wykorzystaniu programu? Na ich podstawie mógłbyś powiedzieć co robi ten program? Raczej wątpię. Do tego zmieszałeś polskie nazwy z angielską. Jeśli byś napisał to w sposób czytelny to byłoby to dużo lepsze rozwiązanie.

Ja jestem zwolennikiem braku bloku else w kodzie. Ale to juz inna kwestia.
komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Rozumiem i dziękuję. Mam jeszcze jedno pytanie. Mam okazję odkupić symfonię C++ za niewielką cenę, czy opłaca się w dzisiejszych czasach jeszcze ją czytać? Bo jakiś czas temu się zastanawiałem, ale na forum ludzie pisali, że niestety, ale jest już stara, czy w tej książce jest wytłumaczony ten  język w jakiś sposób przyjazny dla ludzi?

 

Niedawno próbowałem nauczyć się pythona, ale książka "zanurkuj w pythonie" mnie zniechęciła, bo dosłownie nurkowała w kodzie już od pierwszych stron i się gubiłem :)
0 głosów
odpowiedź 7 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 7 listopada 2015 przez Dorion300
1.Wszystko uwalone w Mainie, przez co kod staje się nie czytelny.
Przez co można zrobić strukturalnie a nawet obiektowo.
2.Jeśli wszystko jest uwalone w mainie to nie ma potrzebny robić zmienne globalne.
3. Goto? używanie Goto w trochę wyżach językach programowania jest niepotrzebne.
komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Uczę się trzeci dzień, kiedyś próbowałem, ale się zniechęciłem. Teraz się uczę z kursów Pana Mirosława Zelenta, jestem na czwartym odcinku i jak dotąd wszystko robione było tylko w funkcji main.

 

Dziękuję za krytykę, przyda się, idę dalej ćwiczyć :)
komentarz 7 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
Ale jak na początek to nawet dobrze ci idzie.

Ale nie polecam używana Goto, szczególnie podczas nauki gdyż się nauczysz złych nawyków które ci wcale nie pomogą w dużych programach.
0 głosów
odpowiedź 7 listopada 2015 przez niezalogowany
Nie używaj goto. Zamiast tego użyj pętli i funkcji.
0 głosów
odpowiedź 7 listopada 2015 przez adrian17 Ekspert (349,840 p.)

Czy zaawansowani "kodersi" dodawają sobie komentarze do kodu? // czy to raczej lamerskie?

To tak jak nazywanie dokumentacji, podręczników, Wikipedii lamerskimi. Jeśli komentarz pomoże Tobie lub komuś innemu za 5 lat zrozumieć co kod ma robić, to jest przydatny.

Czy długość kodu, a raczej pustych wierszy ma znaczenie na wydajność kodu?

Kompilatora interesuje co kod ma robić, nie to jak jest napisany.

komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)

Dodatkowo dowód żywo dokumentowanego kodu: https://youtu.be/z0y3IPJDyp0?t=661

Swoją drogą - jest masa przeprowadzonych badań, że komentarze w kodzie zaciemniają jego strukturę. Jeżeli coś wymaga komentarza, to znaczy, że zostało to prawdopodobnie źle napisane. 

Są komentarze wymagane przez IDE tak samo komentarze do dokumentacji automatycznej. Są też komentarze prawne czy były kiedyś komentarze CVS. 

Dziś już się najczęściej odchodzi od tego. 

Nie wszystkie komentarze są złe, ale trzeba mieć wiedzę kiedy je użyć żeby rozjaśniły w głowie - na przykład przy sortowaniu mogę napisać, że to QuickSort a nie jakieś inne. 

A komentarze przy "} // koniec pętli", które autor dał w kodzie jednak zaburzają czytelność.

komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
http://www.bottega.com.pl/pdf/materialy/ddd/ddd2.pdf

Polecam przeczytanie również tego.
komentarz 7 listopada 2015 przez adrian17 Ekspert (349,840 p.)
No i... nie rozumiem do czego zmierzasz, bo podsumowane tam poglądy ogólnie są podobne do moich i można je streścic "kod mówi co, komentarze po co / dlaczego". W zasadzie mam wrażenie że jest mi bliżej do tego, co ten tekst próbował przekazać, niż Tobie.

(edit: to była odpowiedź na pierwszy komentarz)
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
W aplikacjach sterowanych modelem (DDD) bardzo rzadko uświadczysz komentarze - po prostu kod sam siebie opisuje. W postaci dobrze napisanego kodu (który jest po prostu odzwierciedleniem specyfikacji), napisanych testów które dopowiadają Ci jak i po co działa ten kod.

Po prostu jest to dużo szybsze rozwiązanie. Nie bronie używania komentarzy, ale uważam, że im mniej ich tym lepiej. W tym kodzie Parsera który dałeś, dużo więcej czasu idzie na czytanie komentarza i zrozumienie go niż spojrzenie na kod i przeanalizowanie - a kod sam w sobie jest rzeczywiście mało czytelny, gdzie komentarze również nie pomagają w żaden sposób.
komentarz 7 listopada 2015 przez adrian17 Ekspert (349,840 p.)
Cóż, mamy kompletnie różne standardy i się nie dogadamy, więc radzę przerwać dyskusję.
0 głosów
odpowiedź 7 listopada 2015 przez furas Maniak (53,800 p.)
Kod powinien być podzielony na małe funkcje, które robią jedną rzecz i używają czytelnych nazw zmiennych - wtedy sam kod robi za komentarz. Warto tez dodać komentarz dla wyjaśnień pewnych rzeczy ale nie należy komentować oczywistych rzeczy. Nie ma sensu dodawać komentarz do każdej linii.

Puste linie nie mają znaczenie dla kompilatora i szybkości kodu ale mają znaczenie dla ludzi, którzy muszą kod oglądać. Puste linie pomagają wyłapać początek funkcji czy kawałki kodu, które robią pewne skończone zadanie - tak jak to robi nowy akapit w książce.

Podobne pytania

0 głosów
3 odpowiedzi 2,336 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)
0 głosów
1 odpowiedź 533 wizyt
pytanie zadane 30 marca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
3 odpowiedzi 945 wizyt

93,018 zapytań

141,982 odpowiedzi

321,283 komentarzy

62,365 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...