Jak kawałki danego kodu przerobić na funkcje?

0

Cześć wszystkim,
Napisałem taki dość prosty program i muszę jego kolejne elementy zamienić na funkcje, tak żeby w int main() było jak najmniej.
Problem polega na tym, że zupełnie nie mogę zrozumieć jak funkcję działają. Czytałem kilka kursów itp. i niby coś tam robiłem, ale zawsze wychodzi mi źle.
I tutaj prośba do Was - czy ktoś mógłby w poniższym kadzie zmienić coś na funkcję i mi to wrzucić? Wtedy postaram się na podstawie tego robić dalej. Myślę, że jak zobaczę coś takiego u siebie w kodzie będzie mi łatwiej to przeanalizować, co się zmieniło itp. Od razu chcę powiedzieć, że ta funkcja na początku programu nie była robiona przeze mnie, to i tak mam zamiar wyrzucić z tego kodu i zastąpić prostszym rozwiązaniem.
Kod w c++, używam Visual Studio 2015.

 #include<iostream>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<cstdio>
#include <stdlib.h>
using namespace std;

double pierwiastek(double a, double n)
{
    //poczatkowe przyblizenie
    double result = a;
    //x^n-1
    double tmp = pow(result, (n - 1));
    //dokladnosc obliczen
    double e = 0.00000001;

    //dopoki wynik jest mniej dokladny niz zadana wartosc
    while (abs(a - tmp * result) >= e)
    {
        //oblicz nowe przyblizenie
        result = 1 / n*((n - 1)*result + (a / tmp));
        //x^n-1
        tmp = pow(result, n - 1);
    }

    return result;
}

int main() {
    int n, a, p, k, i;
    char sposob;
    float wynik = 0;
    cout << "Podaj ilosc wartosci (Musi byc liczba parzysta): " << endl;
    cin >> n;
    if (n % 2 != 0) {
        cout << "Liczba musi byc parzysta! Wprowadz teraz poprawna:" << endl;
        cin >> n;
    }
    int * ciaga = new int[n];
    cout << "Jesli chcesz sam podac wartosci elementow ciagu wpisz t, a jesli chcesz podac zakres z ktorego program je wybierze wpisz n" << endl;
    cin >> sposob;
    if (sposob == 't') {
        for ( i = 0; i <= n - 1; i++) {
            cout << "Podaj a: " << endl;
            cin >> a;
            ciaga[i] = a;
            //cout << ciaga[i] << endl;
            wynik = wynik + ciaga[i];
        }
    }
    else if (sposob == 'n') {
        cout << "Podaj pierwsza i ostatnia liczbe przedzialu, z ktorego program ma wybrac wartosci: " << endl;
        cin >> p >> k;
        srand(unsigned(time(0)));
        for (int i = 0; i < n; i++) {
            ciaga[i] = p + rand() % (k - p + 1);
            wynik = wynik + ciaga[i];
        }
        for (int i = 0; i < n; i++)
            cout << ciaga[i] << " ";
    }
    cout << "\n";
    int * b = new int[n / 2];
    for ( i = 0; i <= (n / 2) - 1; i++) {
        b[i] = max(ciaga[i], ciaga[i + 2]);
        cout << "b" << i << " = " << b[i] << endl;
    }
    cout << "Pierwiastek" << n << " stopnia z sumy wyrazow ciagu a = " << pierwiastek(wynik, n) << endl;
    for (i = 0; i <= n; i++) {
        if (b[i] >= pierwiastek(wynik, n)) {
            cout << "Liczba " << b[i] << "jest nie mniejsza od " << pierwiastek(wynik, n) << endl;
            break;
        }
        else
            cout << "Dany ciag nie zawiera liczby wiekszej od " << pierwiastek(wynik, n);
    }

    system("pause");
    return 0;
}
0

Najprostszy przykład użycia funkcji:

#include <iostream>
using namespace std;
int sum(int a, int b)      // funkcja sum przyjmuje 2 liczby i zwraca wartość int 
{
    int c = a + b;           
    return c;                // zwraca wynik
}

int main()
{
    int x = sum(2, 5);   //do zmiennej x jest przypisywana wartość zwracana przez funkcję dla liczb 2 i 5
    cout << x;

    return 0;
}

W Twoim kodzie można zamienić

if (sposob == 't'){
    for ( i = 0; i <= n - 1; i++) {
        cout << "Podaj a: " << endl;
        cin >> a;
        ciaga[i] = a;
        wynik = wynik + ciaga[i];
        }
} 

na

if(sposob == 't')
    wynik = zapis(ciaga, n); 

Funkcja zapis ma za zadanie wypełnienie tablicy 'ciaga' i zwrócenie wartości float. Spróbuj taką napisać.

0
#include <iostream>
#include <cmath>
#include <limits>
#include <string>
#include <vector>
#include <algorithm>
#include <cassert>
#include <random>

namespace detail {
    void clear_bad_input(std::istream &in) {
        in.clear();
        in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }

    template<typename T, typename MessageF, typename Pred>
    T read_if(MessageF messagef, Pred pred, std::istream &in) {
        T result {};
        while(in.good()) {
            messagef();
            if((std::cin >> result) && pred(result)) {
                break;
            }
            clear_bad_input(in);
        }
        return result;
    }
}

template<typename T, typename Pred>
T read_if(std::string const &msg, Pred pred, std::ostream &out = std::cout, std::istream &in = std::cin) {
    auto msgf = [&msg, &out] { return static_cast<bool>(out << msg << '\n'); };
    return detail::read_if<T>(msgf, pred, in);
}

template<typename Cont>
auto read_one_of(std::string const &msg, Cont const &container) {
    auto pred = [&container](auto &&item) {
        return std::find(std::begin(container), std::end(container), item) != std::end(container);
    };
    return read_if<typename Cont::value_type>(msg, pred);
}

double nth_root(double num, double n) {
    return std::pow(num, 1./n);
}

using namespace std;

namespace handy {
    int random_int_from_range(int min, int max) {
        assert(min <= max);
        static std::default_random_engine gen;
        return std::uniform_int_distribution<>{min, max}(gen);
    }

    auto read_even_size() {
        return read_if<size_t>("enter even size", [](auto num) {
            return (num % 2) == 0;  
        });
    }

    auto read_decision() {
        return read_one_of("enter [values] or [range]", vector<string> {
            "values", "range"   
        });
    }

    auto read_elements(size_t size) {
        vector<int> result;
        while(size --> 0) {
            int num;
            cin >> num;
            result.emplace_back(num);
        }
        return result;
    }

    auto gen_elements(size_t size) {
        vector<int> result;
        int a, b;
        while((cin >> a >> b) && ((b-a) == size));
        while(size --> 0) {
            result.emplace_back(random_int_from_range(a, b));
        }
        return result;
    }

    auto read_or_gen_elements(size_t size, string const &decision) {
        if(!(decision == "values" || decision == "range")) {
            cerr << "decision: " << decision << '\n';
            assert(false);
        }
        return decision == "values"?
            read_elements(size)    :
            gen_elements(size);
    }
}

int main() {
    auto size = handy::read_even_size();
    auto decision = handy::read_decision(); 
    auto elements = handy::read_or_gen_elements(size, decision);

    return 0;
}

http://ideone.com/ggaAEl
Nie chce mi się tego dalej robić (nudne zadanie), dlatego pociągnę to na specjalne życzenie.

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