Структурно програмирање

Аудиториска вежба 6 - Функции


1. Потсетување од предавања

1.1. Дефинирање на функција во C++

    tip ime(lista_na_formalni_argumenti) {
    telo_na_funkcijata
    }

1.2. Повик на функција во C++

    ime(lista_na_argumenti);

1.3. Пример на кориснички дефинирана функција

Да се напише програма во која со посебна функција се пресметува куб n3 за вчитан природен број n.

    #include <iostream>

    using namespace std;

    double kub(int x) {
        return x * x * x;
    }

    int main() {
        int n;
        cout << "Vnesete eden priroden broj: ";
        cin >> n;
        double rezultat = kub(n);

        cout << "Kubot na brojot " << n << " e " << rezultat << endl;
        return 0;
    }

2. Функции од математичката библиотека cmath

3. Најчесто користени математички функции

Функција Објаснување
sqrt(x) квадратен корен од x
exp(x) експоненцијална функција ех
log(x) природен логаритам од х (со основа е)
log10(x) логаритам од х со основа 10
fabs(x) апсолутна вредност од х
ceil(x) заокружува х на најмалиот цел број не помал од х
floor(x) заокружува х на најголемиот цел број не поголем од х
pow(x, y) x на степен y
fmod(x, y) остаток од х/у како реален број
sin(x) синус од х (во радијани)
cos(x) косинус од х (во радијани)
tan(x) тангенс од х (во радијани)

1.3. Пример на користење на функција од cmath

Да се напише програма во која со посебна функција се пресметува куб n3 за вчитан природен број n.

    #include <iostream>
    #include <cmath>

    using namespace std;

    int main() {
        int n;
        cout << "Vnesete eden priroden broj: ";
        cin >> n;
        double rezultat = pow(n, 3);

        cout << "Kubot na brojot " << n << " e " << rezultat << endl;
        return 0;
    }

4. Задачи

4.1. Задача 1

Да се напишат соодветни функции за пресметување на дијаметар, периметар и плоштина на круг чиј што радиус се предава како аргумент. Потоа да се напише и програма во која за внесен (од тастатура) радиус ќе се повикаат овие функции за да се пресметаат дијаметарот, периметарот и плоштината на соодветниот круг.

    #include <iostream>
    #include <iomanip>
    #define PI 3.14

    using namespace std;

    double dijametar(double radius);
    double perimetar(double radius);
    double ploshtina(double radius);

    int main() {
        double radius, D, L, P;
        cout << "Vnesete radius na krugot: ";
        cin >> radius;

        D = dijametar(radius);
        L = perimetar(radius);
        P = ploshtina(radius);

        cout << "Dijametar na krugot = " << fixed << setprecision(2) << D << endl;
        cout << "Perimetar na krugot = " << fixed << setprecision(2) << L << endl;
        cout << "Ploshtina na krugot = " << fixed << setprecision(2) << P << endl;
        return 0;
    }

    double dijametar(double radius) {
        return 2 * radius;
    }

    double perimetar(double radius) {
        return 2 * radius * PI;
    }

    double ploshtina(double radius) {
        return radius * radius * PI;
    }

НАПОМЕНА: setprecision претставува функција од библиотеката #include <iomanip> и притоа овозможува дефинирање на прецизноста на излезот со подвижна запирка.

4.2. Задача 2

Да се напише програма која што ќе ги отпечати сите четирицифрени природни броеви кои се деливи со збирот на двата броја составени од првите две цифри и од последните две цифри на четирицифрениот број. На крајот треба да отпечати и колку вакви броеви се пронајдени.

Пример:

    3417 е делив со 34 + 17
    5265 е делив со 52 + 65
    6578 е делив со 65 + 78
    #include <iostream>

    using namespace std;

    int zbir_po_2cifri(int n) {
        return n % 100 + n / 100;
    }

    int main() {
        int i;
        int count = 0;
        for (i = 1000; i <= 9999; ++i) {
            if (i % zbir_po_2cifri(i) == 0) {
                cout << i << endl;
                ++count;
            }
        }
        cout << "Vkupno: " << count << endl;
        return 0;
    }

4.3. Задача 3

Да се напише програма која за даден природен број ја пресметува разликата помеѓу најблискиот поголем од него прост број и самиот тој број.

Пример: Ако се внесе 573, програмата треба да испечати 577 – 573 = 4

    #include <iostream>

    using namespace std;

    int prost(int n) {
        int i;
        for (i = 2; i * i <= n; ++i) {
            if (n % i == 0) {
                return 0;
            }
        }
        return 1;
    }

    int prv_pogolem_prost(int n) {
        ++n;
        while (!prost(n)) {
            ++n;
        }
        return n;
    }

    int main() {
        int n;
        cin >> n;
        int pogolem_prost = prv_pogolem_prost(n);
        cout << pogolem_prost << " - " << n << " = " << pogolem_prost - n << endl;
        return 0;
    }

4.4. Задача 4

Да се напише програма што ќе ги отпечати сите прости броеви помали од 10000 чиј што збир на цифри е исто така прост број. На крајот да се отпечати колку вакви броеви се пронајдени.

    #include <iostream>

    using namespace std;

    int is_prime(int n) {
        if (n < 4) return 1;
        else {
            if (n % 2 == 0) return 0;
            else {
                for (int i = 3; i * i <= n; i += 2) {
                    if (n % i == 0) {
                        return 0;
                    }
                }
            }
        }
        return 1;
    }

    int sum_digits(int n) {
        int sum = 0;
        while (n != 0) {
            sum += n % 10;
            n /= 10;
        }
        return sum;
    }

    int main() {
        int count = 0;
        for (int i = 2; i <= 9999; ++i) {
            if (is_prime(i) && is_prime(sum_digits(i))) {
                cout << i << "\t";
                ++count;
            }
        }
        cout << "\nVkupno: " << count << endl;
        return 0;
    }

4.5. Задача 5

Да се напише програма што ќе ги отпечати сите парови прости броеви помали од 1000 што се разликуваат меѓу себе за 2. На крај да се отпечати и нивниот број.

    #include <iostream>

    using namespace std;

    int prost(int n) {
        for (int i = 2; i * i <= n; ++i) {
            if (n % i == 0) {
                return 0;
            }
        }
        return 1;
    }

    int main() {
        int count = 0;
        for (int i = 1; i < 998; ++i) {
            if (prost(i) && prost(i + 2)) {
                cout << i << " " << i + 2 << endl;
                ++count;
            }
        }
        cout << "Vkupno: " << count << endl;
        return 0;
    }

4.6. Задача 6

Да се пресмета збирот:

1! + (1 + 2)! + (1 + 2 + 3)! + …​ + (1 + 2 + …​ + n)!

НАПОМЕНА: Користете функција за пресметување на збирот на првите k природни броеви Користете функција за пресметување факториел на еден природен број k.

    #include <iostream>

    using namespace std;

    int suma(int n) {
        int s = 0;
        for (int i = 1; i <= n; ++i) {
            s += i;
        }
        return s;
    }

    int faktoriel(int n) {
        int result = 1;
        for (int i = 1; i <= n; ++i) {
            result *= i;
        }
        return result;
    }

    int main() {
        int n;
        cin >> n;

        if (n > 0) {
            int result = 0;
            int s;
            for (int i = 1; i < n; ++i) {
                s = suma(i);
                result += faktoriel(s);
                cout << s << "! + ";
            }
            s = suma(n);
            result += faktoriel(s);
            cout << s << "! = " << result << endl;
        } else {
            cout << "Nevalidna vrednost" << endl;
        }

        return 0;
    }