Wywołanie licznika pętli z funkcji

0

Cześć!

Stworzyłem takie cudo do wyznaczania pierwiastka arytmetycznego. Jak zauważycie, zamieściłem tam licznik wykonań pętli while. Z racji tego, że nie mam pojęcia co robię to nie wiem jak odwołać się do tego licznika w funkcji głównej? Jak wyświetlić tam jego wartość? Jestem totalnie poczatkujący więc mam nadzieję, że wybaczycie mi w ogóle to pytanie. :)

#include<iostream>
#include<iomanip>
#include<cmath>

using namespace std;

double pierwiastek(double x, double e)
{
    double w = 1., b = x;
    int licznik = 0;
       while (fabs(w - b) >= e)
        {
            w = (w + b) / 2;
            b = x / w;
            licznik++;
        } 
       return w;
 }

int main()
{
    double liczba; 
    double parametr; 

    cout << "Wprowadz liczbe do spierwiastkowania: "; cin >> liczba;
    cout << "Wprowadz parametr dokladnosci obliczen: "; cin >> parametr;
    cout << setprecision(8) << fixed << pierwiastek(liczba, parametr) << endl;
}

Będę wdzięczny za podpowiedź
Pozdrowionka

1

Możesz użyć np. zmiennej statycznej:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

static int licznik = 0;

double pierwiastek(double x, double e)
{
    double w = 1., b = x;
    while (fabs(w - b) >= e)
    {
        w = (w + b) / 2;
        b = x / w;
        licznik++;
    }
    return w;
}

int main()
{
    double liczba;
    double parametr;

    cout << "Wprowadz liczbe do spierwiastkowania: "; cin >> liczba;
    cout << "Wprowadz parametr dokladnosci obliczen: "; cin >> parametr;
    cout << setprecision(8) << fixed << pierwiastek(liczba, parametr) << endl;
}

Wtedy możesz się odwołać do niej wewnątrz funkcji main po wykonaniu funkcji pierwiastek.

5

Tak ogolnie to rozwiazanie problemu jest nieco filozoficzne, ale NIE uzywaj zmiennej globalnej. Owszem, w tym prostym programie zadziala, ale wystaczy dodac watki i juz rozwiazanie przestaje byc poprawne. Zamiast tego wiecej niz jeden parametr mozna zwrocic np. tak:

  • zwroc klase zawierajaca rezultat i licznik, albo gotowa (pair/tuple) albo zeby bylo czytelniej swoja
  • licznik mozesz zwrocic w argumencie przez referencje/wskaznik (jesli to jest wskaznik, to warto dac w api int* licznik = nullptr i tego nulla obsluzyc, dzieki czemu jesli kod wolajacy licznika nie potrzebuje to nie musi sie nim przejmowac)
  • mozesz stworzyc klase ktora bedzie miec metode liczaca i metody zwracajace to co policzyla (to jest analogiczne do zmiennej globalnej, wiec pewnie fanatycy programowania funkcyjnego stwierdza ze beznadziejne, ale w przeciwienstwie do zmiennej globalnej za kazdym razem jak chcesz policzyc mozesz stworzyc nowy obiekt)
3

@eleventeen, w pkt 3 nie masz racji.

struct pierwiastek
{
    public:
    size_t count;
    double e;
    pierwiastek(double e):e(e) {}
    double calc(double x)
    {
        double w=1,b=x;
        for(count=0;fabs(w-b)>=e;++count)
        {
            w=(w+b)/2;
            b=x/w;
        }
        return w;
    }
};

...
pierwiastek p(1e-10);
cout<<p.calc(2)<<'\t'<<p.count<<endl;
3

Są dwa sposoby

  1. Przekazać wartość przez argument:
double pierwiastek(double x, double e, int& licznik)
{
    double w = 1., b = x;
    licznik = 0;
    while (fabs(w - b) >= e) {
        w = (w + b) / 2;
        b = x / w;
        licznik++;
    }
    return w;
}
  1. Stworzyć wartość zwracaną, która będzie zawierać dodatkowe dane (to proponował eleventeen w pierwszym punkcie):
struct Wynik {
    double pierwiastek;
    int licznik;
};

Wynik pierwiastek(double x, double e)
{
    double w = 1., b = x;
    int licznik = 0;
    while (fabs(w - b) >= e) {
        w = (w + b) / 2;
        b = x / w;
        licznik++;
    }
    return { w, licznik };
}

Proponowana przez pajacol zmienna globalna to najgorsze możliwe rozwiązanie.

0

Dziękuję Wam za pomoc. :)

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