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