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

question-closed Symulacja banku (Pomocy)

Object Storage Arubacloud
0 głosów
174 wizyt
pytanie zadane 23 grudnia 2016 w C i C++ przez PatrykPlusPlus Początkujący (320 p.)
zamknięte 25 grudnia 2016 przez PatrykPlusPlus

Ma ktoś może pomysł jak sprawić aby "pieniądze" z jednej tablicy były odejmowane i trafiały do drugiej. Wiem, że można zrobić : gotowkagraczy[x] = gotowkagraczy[x] - przelew; gotowkagraczy[x] = gotowkagraczy[x] - przelew; , ale jak zrobić, żeby wykryto o jakiego gracza chodzi (bo może być ich do pięciu). Czy jest opcja bez robienia switch'y lub if'ów.

Mój kod:

int gotowkagraczy[8], przelew, przelewod, przelewdo;

            cout<<"Wybierz ilość przelewanych pieniędzy: ";                       cin>>przelew;
            cout<<"Wybierz gracza któremu pieniądze maja być odjęte: ";    cin>>przelewod;
            cout<<"Wybierz gracza któremu pieniądze maja być dodane: ";   cin>>przelewdo;


Co dalej?

komentarz zamknięcia: Problem rozwiązany

2 odpowiedzi

0 głosów
odpowiedź 23 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
wybrane 25 grudnia 2016 przez PatrykPlusPlus
 
Najlepsza

Używając pętli wystarczy jeden warunek sprawdzenia, któremu graczowi zostaną przelane pieniądze, jednak w jaki sposób rozróżnić poszczególnych graczy? Wydaje mi się, że najprostszym narzędziem będzie struktura, czyli taki zbiór składowych/typów, w naszym przypadku dwóch. Niech to będą imię i pieniądze na koncie. Właściwie to tablica struktur, bo oczekujemy, że graczy będzie kilku, pozwól, że przedstawię Ci coś takiego:

#include <iostream>

using namespace std;

struct gracz {
    string imie;
    int pieniadze;
};

int main() {
    const int ROZMIAR = 3;
    string nazwa;
    int przelew;
    gracz przyjaciele[ROZMIAR] = {{"Kamil", 2300},
                                  {"Piotr", 3450},
                                  {"Maria", 2600}};
    cout << "Dane przyjaciol: " << endl;
    for (int i = 0; i < ROZMIAR; i++)
        cout << przyjaciele[i].imie << " " << przyjaciele[i].pieniadze << endl;
    cout << "Komu przelac pieniadze i ile: " << endl;
         cin >> nazwa >> przelew;
    for (int i = 0; i < ROZMIAR; i++)
        if (nazwa == przyjaciele[i].imie)
            przyjaciele[i].pieniadze += przelew;
    cout << "Po transakcji:" << endl;
    for (int i = 0; i < ROZMIAR; i++)
        cout << przyjaciele[i].imie << " " << przyjaciele[i].pieniadze << endl;
    return 0;
}
komentarz 25 grudnia 2016 przez PatrykPlusPlus Początkujący (320 p.)

Znalazłem łatwiejsze rozwiązanie

cout<<tr("Podaj ilość przelewanych pieniędzy: "); int przelew; cin>>przelew;
      cout<<tr("Wybierz gracza, który przelewa(oddaje): "); int od; cin>>od;
      for(int z=0; z!=od; )
{
    z++;
    cout<<z;
    Sleep(2000);
    if(z==od)
        kasa[z]-=przelew;
}

 

0 głosów
odpowiedź 23 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)
Najprościej to obiektowo, jeśli oczywiście potrafisz.
komentarz 23 grudnia 2016 przez PatrykPlusPlus Początkujący (320 p.)
Niestety nie.
komentarz 24 grudnia 2016 przez QizmoPL Stary wyjadacz (11,440 p.)
podejście obiektowe nie jest zawsze najlepsze
komentarz 24 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)
A kiedy nie jest?
komentarz 24 grudnia 2016 przez QizmoPL Stary wyjadacz (11,440 p.)

Tworzenie dodatkowych zależności
Należy dążyć do unikania tworzenia nadmiernej liczby powiązań pomiędzy elementami programu. Dziedziczenie tworzy w gruncie rzeczy aż trzy zależności pomiędzy klasami i są zależności obustronne. Po pierwsze, zamierzona, czyli rozszerzanie klasy bazowej i wykorzystanie jej funkcjonalności we własnej klasie. Niestety, o ile na diagramie <<extends>> to jedna strzałeczka, o tyle przy realizacji tego przez dziedziczenie dochodzą jeszcze dwie niechciane. Klasa dziedzicząca staje się zależna nie tylko od interfejsu klasy bazowej, ale także od jej konkretnego zachowania. W sumie każde użycie klasy powoduje powstanie takiej zależności, ale w przypadku dziedziczenia jest ona o tyle istotna, że bardzo łatwo zapomnieć o tym, że zachowanie klasy bazowej może się zmienić, i oprzeć się na fałszywych założeniach co do niego. Szczególnie łatwo o taką sytuację, gdy klasa bazowa nie zachowuje pełnej enkapsulacji i coś przez protected przechodzi do klasy pochodnej albo nie ma w ogóle żadnego zabezpieczenia na poziomie języka (np. Python, PHP4). Druga strzałeczka idzie w przeciwną stronę i jest o wiele boleśniejsza: klasa bazowa zaczyna być zależna od klasy dziedziczącej. Autor klasy bazowej nie ma już swobody w jej modyfikacji, bo nagle może się okazać, że zmieniając coś w swojej klasie, zepsuje klasę dziedziczącą. Problem? Jeśli skojarzysz, że istnieją projekty większe niż 10-klasowe zabawki z laborek, ktorych po zakończeniu zajęc nie trzeba już utrzymywać, to okaże się, że tak - i to spory. Oprócz wymienionych wyżej problemów pojedynczych strzałek, dochodzi oczywiście ten bardziej globalny: cykl w grafie zależności.

Dziedziczenie tworzy relację między klasami
Dziedziczenie (lub niektóre jego formy - zależy od języka*) wprowadzają relację JEST pomiędzy klasą dziedziczącą a bazową. A o tym, i wynikających z tego wymogach, zbyt wielu programistów - szczególnie początkujących - po prostu kompletnie zapomina. Jednak pamiętanie o problemie może niewiele zmienić, bo żeby mieć pewność, że wszystko zostało poprawnie przeimplementowane, trzeba znać szczegóły implementacji klasy bazowej. Inaczej nie da się przewidzieć, jakie zależności istnieją między elementami klasy, a tym samym, co w ogóle trzeba zmienić. Bo nie, często nie wystarczy przedefiniować tylko interesującej nas metody. Jedyną sytuacją, w której ta ostatnia kwestia nie występuje, jest przypadek klasy, która była jawnie przeznaczona przez autora do dziedziczenia. Wtedy oczywiście jest w dokumentacji napisane, co należy zmieniać. W przeciwnym przypadku ląduje się jednak w poprzednim paragrafie. Oczywiście można przedefiniować wszystkie metody, co jest sposobem struprocentowo pewnym, ale to trochę mija się z celem, dla którego stosowane jest dziedziczenie.

Dziedziczenie niechcianego zachowania
Dziedzicząc przyjmujesz wszystko, co zawiera klasa bazowa. Także rzeczy, które potencjalnie mogą ci do niczego nie być potrzebne. Ładnym przykładem są strumienie w C++. Cały mechanizm ich działania wymaga istnienia obiektu bufora. Niezależnie od tego, czy bufor ten jest do czegoś potrzebny, jakakolwiek klasa mająca implementować np. std::ostream będzie zawierała cały kod i dane związane z jego obsługą. A na co na przykład implementacji ignorującej wszystkie otrzymywane dane** to wszystko, skoro istotnym jest tylko, by metoda zapisująca natychmiast wracała, nie wykonując żadnych dodatkowych czynności? Należy tutaj zauważyć, że źródłem problemu jest nie wybór osoby implementującej klasę dziedziczącą, lecz decyzja autora klasy bazowej, który narzucił innym sposób rozwiązania rozszerzania.

Klasy nie przeznaczone do dziedziczenia
Kolejna sprawa, o której łatwo zapomnieć - czy po klasie bazowej w ogóle można dziedziczyć? Bardzo często... nie. Przyczyną mogą być na przykład kwestie czysto technicznych (np. brak virtual w przypadku C++) lub decyzje autora klasy, która zostałaby użyta jako bazowa. Programista może - zakładając brak dziedziczenia - wykonać optymalizacje zakładające znajomość faktycznego typu obiektów. W momencie, gdy typ ten będzie inny, wszystko może się posypać. Z takimi przypadkami akurat łatwo spotkać się już przy początku nauki. Poczatkujący - nie w celu uzasadnionej optymalizacji, lecz ze zwykłej niewiedzy i niedoświadczenia - nagminnie dublują kod w klasach i robią założenia co do faktycznego typu np. argumentów funkcji.

Jezeli ktos nie zna obiektowki, a pisze w tym paradygmacie to kod jest gorszy od proceduralnego 

komentarz 24 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)
Przy mniejszych projektach składających się z kilku klas może problem nie nastąpić. Ale przy większych może się okazać, że programista stworzy 50 klas i każda będzie zależna od siebie, a w pliku źródłowym main.cpp będzie trzeba includować 50 nagłówków funkcji, co nie powinno mieć miejsca.

Podobne pytania

+1 głos
1 odpowiedź 260 wizyt
pytanie zadane 13 marca 2021 w C i C++ przez bultok0 Nowicjusz (130 p.)
0 głosów
1 odpowiedź 483 wizyt
pytanie zadane 19 kwietnia 2020 w JavaScript przez kubaa322 Użytkownik (710 p.)
0 głosów
2 odpowiedzi 374 wizyt
pytanie zadane 10 października 2016 w C i C++ przez dudussss Nowicjusz (120 p.)

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 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!

...