Kod bardziej przejrzyście

0

Witam, czy dałoby się jakoś bardziej przejrzyście zapisać ten kod zachowując strukturę? :

#include <cstdlib>
#include <iostream>
#include <ctime>


class zadanie3
{
public:
int Fiby[1000]; int n;

void liczbyFib()
{
std::cout<<"Ile liczb wyznaczyc?: "<<std::endl;
std::cin >>n;

Fiby[0]=1;
Fiby[1]=1;

for(int i=2; i<n ;i++)
{
Fiby[i] = Fiby[i-1]+Fiby[i-2];
}

return 0;
}
void wyswietlFiby()
{
for(int i=0; i<n ;i++)
{
std::cout<<std::endl<<"Wyraz nr "<<i+1<<": "<<Fiby[i];
}

}
void wypiszPoIndeksie(int x)
{
std::cout<<std::endl<<std::endl<<"Wybrany element nr "<<x<<": "<<Fiby[x-1]<<std::endl;
}
void iloczynDwochLosowych()
{
int a = rand() % 100-50;
int b = rand() % 100-50;

std::cout<<std::endl<<a<<"*"<<b<<"= "<<a*b<<std::endl;
}


};


int main()
{
srand(time(NULL));
zadanie3 zadanie3;

zadanie3.liczbyFib();
zadanie3.wyswietlFiby();
zadanie3.wypiszPoIndeksie(10);
zadanie3.iloczynDwochLosowych();

return 0;
}
1

jak w deklaracji

class zadanie3
{
}

będą tylko nagłówki funkcji a ich ciała poza to będzie bardziej przejrzyście

2

Doceniasz przejrzystość, to cenne.
Poczułeś, ze napisanie klasy do tego może doprowadzić ... w teorii dobrze.

To były dwie dobre wiadomości. Teraz złe.

Nie każde class to programowanie obiektowe, oj nie. Klasa to nie zbiornik na "wszystko co mi się udało"', ale zakres odpowiedzialności i dobra nazwa która sie wiąże z jakością projektu
Tu nazwa "zadanie3" bardzo szczerze ujawnia problem z projektem klasy, czym ona naprawdę jest. Jest zbiornikiem na wszystko. Mogła by być nazwa FibbonaciDoLimitu (celowo przesadzam z dokładnością), i bardzo wyraźnie zamierzona jako pojemnik na N liczb (podane w konstruktorze, dialogi wcześniej, a więc klasa jest czystsza) *) .

Metody
Dobra metoda to wyrazista odpowiedzialność, wyrażająca się JEDNYM czasownikiem.
Tu jest kiepsko. Właściwie wszystkie metody mają zakłamane nazwy, a ich realne działanie opisują spójniki "i".
"Prowadź dialogi z użytkownikiem" I "wypełnij tablicę" i "drukuj"

Drukowanie.
Twój kod cierpi (jak często kod edukacyjny) na "wszędzie drukowanie". Najkrócej patologię odsłania funkcja iloczynDwochLosowych, która jest typu void, ale drukuje.
Funkcja 'ilosczyn' powinna zwracać swój wynik, a drukować miałby jej klient (miejsce wywołania), o ile uzna, że drukowanie na cout w ogóle go interesuje. Bo może to program graficzny, albo webowy, i chce inaczej wykorzystać uzyskaną liczbę.

Jeśli drukowanie.
jesli drukowanie, jak bym widział podanie strumienia w argumencie - niechby wywołujący miał wybór, na co chce to drukować.
void wyswietlFiby(std::ostream & str)

*) wtedy funkcja ujawniająca jeden element void wypiszPoIndeksie(int x) by była zupełnie inna, w wariancie master const operator tablicowy (troszkę trudniejsze), ale jeśli jako funkcja, to zwracająca wartość do dyspozycji.
Mam na myśi, że jeśli mocno się nakierujesz, że klasa to "koszyk na jabłka", to dobre operacje na takiej klasie się dość łatwo nasuną.

1

clang format to podstawa:

#include <cstdlib>
#include <ctime>
#include <iostream>

class zadanie3 {
public:
    int Fiby[1000];
    int n;

    void liczbyFib()
    {
        std::cout << "Ile liczb wyznaczyc?: " << std::endl;
        std::cin >> n;

        Fiby[0] = 1;
        Fiby[1] = 1;

        for (int i = 2; i < n; i++) {
            Fiby[i] = Fiby[i - 1] + Fiby[i - 2];
        }
    }

    void wyswietlFiby()
    {
        for (int i = 0; i < n; i++) {
            std::cout << std::endl
                      << "Wyraz nr " << i + 1 << ": " << Fiby[i];
        }
    }

    void wypiszPoIndeksie(int x)
    {
        std::cout << std::endl
                  << std::endl
                  << "Wybrany element nr " << x << ": " << Fiby[x - 1] << std::endl;
    }

    void iloczynDwochLosowych()
    {
        int a = rand() % 100 - 50;
        int b = rand() % 100 - 50;

        std::cout << std::endl
                  << a << "*" << b << "= " << a * b << std::endl;
    }
};

int main()
{
    srand(time(NULL));
    zadanie3 zadanie3;

    zadanie3.liczbyFib();
    zadanie3.wyswietlFiby();
    zadanie3.wypiszPoIndeksie(10);
    zadanie3.iloczynDwochLosowych();

    return 0;
}

https://godbolt.org/z/1d36Ko776

1 użytkowników online, w tym zalogowanych: 0, gości: 1