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

Podstawy funkcji w C++ - książka Alexa Allaina

Object Storage Arubacloud
0 głosów
589 wizyt
pytanie zadane 31 sierpnia 2016 w C i C++ przez FatDeiv Początkujący (300 p.)

Witam! To mój 3 dzień z C++ a mianowicie z książką Alexa Allaina o podstawach tego języka. Na końcu rozdziału o funkcjach czekało na mnie takie zadanie: 

Weź program z menu, który napisałeś wcześniej. i rozbij go na serię wywołań funkcji z których każda odpowiada za jedną pozycję menu. Jako dwie nowe pozycje menu dodaj kalkulator oraz tekst piosenki 99 Bottles of Beer

Program działa ale jestem przekonany że można go napisać 10x lepiej stąd ten wpis na forum. Byłbym bardzo wdzięczny jeżeli ktoś bardziej ogarnięty w temacie mógł mi udzielić chociaż jednej wskazówki ! Obiecuję, że gdy zdobędę większą wiedzę w tym zakresie to również będę aktywnie pomagał innym początkującym :))

#include <iostream>

using namespace std;

void bottles ()
{
    int i;
    for ( int i = 99; i > 1; i-- )
    {
        cout << i << " bottles of beer on the wall, " << i << " bottles of beer. Take one down and pass it around - " << i - 1 << " bottles of beer on the wall." << endl;
    }
    cout << i << " bottle of beer on the wall, " << i << " bottle of beer. Take it down and pass it around - no more bottles of beer on the wall.";
}

void kalkulator (int pierwszy_argument, int drugi_argument)
{
    cout << pierwszy_argument << " * " << drugi_argument << " = " << pierwszy_argument * drugi_argument << endl;
    cout << pierwszy_argument << " + " << drugi_argument << " = " << pierwszy_argument + drugi_argument << endl;
    cout << pierwszy_argument << " / " << drugi_argument << " = " << pierwszy_argument / drugi_argument << endl;
    cout << pierwszy_argument << " - " << drugi_argument << " = " << pierwszy_argument - drugi_argument << endl;
}


int main()
{
    int pierwszy_argument,drugi_argument;
    int wybierz;

    cout << "1. Tekst piosenki 99 bottles " << endl;
    cout << "2. Kalkulator " << endl;
    cin >> wybierz;

    while ( wybierz != 1 && wybierz !=2 )
    {
        cout << "Podano niepoprawna liczbe, sprobouj jeszcze raz: " << endl;
        cin >> wybierz;
    }


    if (wybierz == 1)
    {
        bottles();
    }
    else if (wybierz == 2)
    {
        cout << " Podaj pierwszy argument: ";
        cin >> pierwszy_argument;
        cout << " Podaj drugi argument: ";
        cin >> drugi_argument;
        kalkulator(pierwszy_argument, drugi_argument);
    }

    return 0;
}

 

To mój 3 dzień z C++ z góry przepraszam za kod niskich lotów i proszę o wyrozumiałość :D

komentarz 20 sierpnia 2017 przez Dordonmegazordon Początkujący (350 p.)

Proszę o ocenę kodu czy kod jest w ogóle czytelny

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
  int multiplyFun(int x, int y){
      return x*y;
     } ;
  int dividingFun(int x, int y){
      return x/y;
     } ;
  int addingFun(int x, int y){
      return x+y;
     } ;
  int subtractionFun(int x, int y){
      return x-y;
     } ;
  void bottles () {
    int i;
    for ( int i = 99; i > 1; i-- )
    {
        cout << i << " bottles of beer on the wall, " << i << " bottles of beer. Take one down and pass it around - " << i-- << " bottles of beer on the wall." << endl;
    }
    cout << i << " bottle of beer on the wall,  " << i << " bottle of beer. Take it down and pass it around - no more bottles of beer on the wall.";
} ;
 void Menu_calculator(){
     
         int number1, number2;
         int option;
         
     cout<< "  MENU KALKULATORA" << endl;
     cout<< "wybierz opcje" << endl;
     cout<< "1. mnozenie" << endl;
     cout<< "2. dzielenie" << endl;
     cout<< "3. dodawanie" << endl;
     cout<< "4. odejmowanie" << endl;
     cin>> option;
     system("CLS");

    switch(option){

    case 1:{
        cout<< "podaj pierwsza liczbe "<< endl;
        cin>> number1;
        system("CLS");
        cout<< "podaj druga liczbe "<< endl;
        cin>> number2;
        system("CLS");
       int outcome= multiplyFun(number1, number2) ;
       cout<<" wynik mnozenia= " <<outcome << endl<< endl;}
    break;

    case 2:
        cout<< "podaj pierwsza liczbe "<< endl;
        cin>> number1;
        system("CLS");
        cout<< "podaj druga liczbe "<< endl;
        cin>> number2;
        system("CLS");
    if(number2==0){cout<<" nie dzielimy przez zero"<< endl;}
    else if(number1!=0){
         int outcome= dividingFun(number1, number2) ;
       cout<<" wynik dzielenia= " << outcome << endl<< endl;}
    break;

    case 3:{
        cout<< "podaj pierwsza liczbe "<< endl;
        cin>> number1;
        system("CLS");
        cout<< "podaj druga liczbe "<< endl;
        cin>> number2;
        system("CLS");
        int outcome= addingFun(number1, number2) ;
       cout<<" wynik dodawania= " << outcome << endl<< endl;
           }
    break;

    case 4:{
        cout<< "podaj pierwsza liczbe "<< endl;
        cin>> number1;
        system("CLS");
        cout<< "podaj druga liczbe "<< endl;
        cin>> number2;
        system("CLS");
        int outcome= subtractionFun(number1, number2) ;
        cout<<" wynik odejmowania= " << outcome << endl << endl;
       }
    break;
    default:{cout<<"Opcja o numerze "<<option<<" nie istnieje" << endl<< endl;}
              };
                              };

int main()

{
for(;;){

    int choice;
   cout<<" MENU " << endl;
   cout<< "1. tekst piosenki 99 bottles" << endl;
   cout<< "2. kalkulator" << endl;
   cin>> choice;
         system("CLS");

        switch(choice){
    case 1:
    bottles() ;
    break;

    case 2:
    Menu_calculator();
    break;

    default: {cout<< "Opcja o numerze "<<choice<<" nie istnieje" << endl<< endl;} };
     };
    return 0;
}

 

2 odpowiedzi

+3 głosów
odpowiedź 31 sierpnia 2016 przez MichuDev Pasjonat (20,300 p.)
wybrane 31 sierpnia 2016 przez FatDeiv
 
Najlepsza
  • Funkcja główna nie powinna robić wszystkiego, raczej powinna delegować do swoich zadań inne funkcje oraz ładować pewne rzeczy...
  • Zamiast tworzyć instrukcje if, które jedynie mają za sprawdzenie równości czytelniejszy będzie switch.
  • Na twoim miejscu dałbym użytkownikowi po użyciu jednej opcji w menu dostęp do drugiej bez ponownego uruchamiania programu zamieszczając go w pętli nieskończonej - while(true) lub for(;;)
  • Nie odsłaniaj przestrzeni nazw globalnie tylko tam gdzie jest to potrzebne.
  • --i i ++i jest szybsze od i-- i i++ co wynika z tego, że --i najpierw inkrementuje, a potem zwraca wynik, a i-- kopiuje wartość i do rejestru, następnie inkrementuje i i zwraca wartość z rejestru. Choć wrzucanie do rejestru nie jest wymagane od implementacji, ale zachowanie dla programisty i prawdopodobnie zmniejszona szybkość tak.
  • W przypadku opcji kalkulatora zrobiłbym podobnie co w przypadku piosenki.
  • w funkcji bottles nie musisz tworzyć zmiennej i na początku ponieważ tworzysz ją w pętli.
  • Nazwy zmiennych, funkcji, struktur, klas, komentarzy, unii... piszemy po angielsku, jednak to co pokazujesz użytkownikowi pisz w takich językach do których jest dostosowana aplikacja (w większych aplikacjach trzymałbym te informacje w stałych / zmiennych zależnych od wersji językowej).
  • Na pochwałę zasługuje to, że nie używasz zmiennych globalnych, gdy nie są one potrzebne.
  • Myślę, że to co napisałem jak na 3 dzień z C++ to jest dużo więc polecam ci poprawić kod :)
  • Jak masz jakieś pytania to pisz w komentarzach, chętnie odpowiem :)

 

komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
szok :O no to mam co robić przez najbliższe kilka godzin. Bardzo dziękuje ! na pewno będę miał kilka pytań :D
komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
edycja 31 sierpnia 2016 przez FatDeiv

2.Co do switch'a dopiero po dziale z funkcjami będę go przerabiał stąd jego brak w kodzie.



7. W funkcji bottle gdy stworzyłem zmienną w pętli kompilator wyrzucał mi błąd : main.cpp|11|error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]|

8. Już własnie analizuje pdf'a kolegi odnośnie stylu kodowania którego udostępnił go dla mnie niżej w kometarzu, także nazwy będą poprawione ! :D

10.Miałeś na myśli, że dużo błędów jak na 3 dzień ?

komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
#include <iostream>

using namespace std;

void bottles ()
{
    int i;
    for ( i = 99; i > 1; --i )
    {
        cout << i << " bottles of beer on the wall, " << i << " bottles of beer. Take one down and pass it around - " << i - 1 << " bottles of beer on the wall." << endl;
    }
    cout << i << " bottle of beer on the wall, " << i << " bottle of beer. Take it down and pass it around - no more bottles of beer on the wall.";
}

void calculator (int firstArg, int secondArg)
{
    cout << firstArg << " * " << secondArg << " = " << firstArg * secondArg << endl;
    cout << firstArg << " + " << secondArg << " = " << firstArg + secondArg << endl;
    cout << firstArg << " / " << secondArg << " = " << firstArg / secondArg << endl;
    cout << firstArg << " - " << secondArg<< " = " << firstArg - secondArg << endl;
}

void menu ()
{
      while ( true )
    {
        int firstA, secondA;
        int choose;

        cout <<"\n \n1. Tekst piosenki 99 bottles " << endl;
        cout << "2. Kalkulator " << endl;
        cin >> choose;

        if (choose == 1)
        {
            bottles();
        }

        else if (choose == 2)
        {
            cout << " Podaj pierwszy argument: ";
            cin >> firstA;
            cout << " Podaj drugi argument: ";
            cin >> secondA;
            calculator(firstA, secondA);
        }

    }

}

int main()
{
    menu();
    return 0;
}

 

Wygląda trochę lepiej ?

+1 głos
odpowiedź 31 sierpnia 2016 przez bimbrownik Mądrala (5,180 p.)
edycja 31 sierpnia 2016 przez bimbrownik

Zmienne i funkcje powinieneś zapisywać po angielsku, najlepiej przy użyciu camelCase. Do sprawdzenia poprawności zmiennej wybierz możesz użyć pętli do while(). W bottles() dwukrotnie zadeklarowałeś zmienną i - wystarczy tylko raz, w pętli for. Powinieneś zapętlić menu oraz dodać trzecią opcję - wyjście. Poza tym, zmienne lokalne funkcji nie muszą mieć tej samej nazwy co w mainie.

Poprawka, po pętli też jest zmienna i, w takim razie możesz usunać int z pętli for albo wrzucić tego couta gdzieś do środka pętli.

komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
Bardzo bardzo dziękuję za odpowiedź ! Cenne uwagi dla takiego nubka jak ja :D zaraz sobie wszystko przeanalizuje - co do tych samych nazw w funkcji lokalnej i mainie chciałem tylko sobie przetestować zakres,zasięg funkcji, także dlatego tutaj się to pojawiło :D

 

A dlaczego polecasz camelCase? Posiada ona jakąś przewagę nad tym co ja zastosowałem?
1
komentarz 31 sierpnia 2016 przez bimbrownik Mądrala (5,180 p.)

Nie, nie ma przewagi, ale jest to dobra praktyka w programowaniu. Sprawdź to.

1
komentarz 31 sierpnia 2016 przez manjaro Nałogowiec (37,390 p.)
edycja 31 sierpnia 2016 przez manjaro

Nie chcę wszczynać awantury ale na tym forum jak mantrę wszyscy powtarzają angielski angielski angielski... 

Na innych forach niekoniecznie. Przykładowe konwencje nazewnictwa i stylu:

"Stosujemy jednolity język (polski lub angielski), nie mieszamy (zarówno jeżeli chodzi o program jako całość, jak i pojedyncze nazwy zmiennych i funkcji)."

W zasadzie wszędzie można przeczytać jedynie o standardach nazewnictwa:

1. Nazwy klas rozpoczynamy Wielką literą.

class Klasa{ ... }

2. Nazwy metod rozpoczynamy z małej litery.

void metoda(){ ... }

3. Nazwy zmiennych rozpoczynamy z małej litery.

int zmienna;

4. Jeśli nazwa składa się z kilku wyrazów, to kolejne człony rozpoczynamy także z Wielkiej litery.

class NazwaMojejKlasy{ ... }
void toMojaMetoda(){ ... }
int jakasZmienna;

5. Nazwy stałych piszemy Wielkimi literami, a kolejne człony oddzielamy znakiem podkreślenia.

final int TO_JEST_STALA;
komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
Bardzo podobnie jak w pdf'ie kolegi - różnica tylko w podejściu do języków. Wydaje mi się, że angielski jest bardziej przejrzysty dla szerszego grona np. przy jakiś większych projektach i dlatego jest taki nacisk na ten angielski, żeby taki młody pelikan jak ja od samego początku nabrał takiego nawyku :D
1
komentarz 31 sierpnia 2016 przez bimbrownik Mądrala (5,180 p.)

Tak, angielski jest dobry przy tworzeniu większych projektów, a dodatkowo poszerzasz słownictwo.

Co do dobrych praktyk to polecam książkę Roberta Martina pt. Czysty Kod.

komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
Myślisz, że przy moim stopniu zaawansowania opłaca się przerabiać dwie książki naraz ? tzn. Podstawy C++ i Czysty Kod?
1
komentarz 31 sierpnia 2016 przez bimbrownik Mądrala (5,180 p.)

Raczej nie, lepiej przepracuj spokojnie te podstawy, na razie raczej nie będziesz robił nic bardziej złożonego, do tego możesz części nie zrozumieć.  Ale gdybyś koniecznie chciał, tutaj możesz przejrzeć skróconą wersję w formie prezentacji.

komentarz 31 sierpnia 2016 przez FatDeiv Początkujący (300 p.)
Ok, spróbuję ogarnąć chociaż jakąś część tej prezentacji i wrócę do niej później gdy skończę już podstawy. Jeszcze raz, wielkie dzięki ! :D btw. zaraz skończę poprawiać kod

Podobne pytania

0 głosów
1 odpowiedź 142 wizyt
–1 głos
1 odpowiedź 774 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez dewe Gaduła (4,300 p.)
+1 głos
2 odpowiedzi 726 wizyt
pytanie zadane 24 listopada 2016 w C i C++ przez szerwi Użytkownik (620 p.)

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...