ФИНКИ / Основи и алгоритми

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

Постави добра основа во C++: од променливи и услови до функции, низи и решавање задачи со јасен алгоритам.

01 / ШТО ЌЕ УЧИМЕ

Темите зад
решенијата.

Краток преглед според официјалната предметна програма ↗.
Код: F23L1W020
Проверено: 08.10.2026.

  1. 01Типови, оператори и влез/излез во C++
  2. 02Услови, циклуси и разложување на задачата
  3. 03Функции, низи, матрици и рекурзивни решенија
  4. 04Покажувачи, текст и работа со датотеки
02 / РАЗБЕРИ ГО КОНЦЕПТОТ

Логиката зад
решението.

Структурното програмирање го претвора проблемот во јасна низа чекори. Променливите ги чуваат вредностите, условите избираат што ќе се случи, а циклусите повторуваат работа. Функциите издвојуваат целини што можат повторно да се употребат. Пред пишување код, одреди ги влезот, очекуваниот излез и граничните случаи.

ПРИМЕР ОД СЕКОЈДНЕВНАТА ПРАКТИКАИЛУСТРАТИВЕН ПРИМЕР

Како продавница ја пресметува сметката?

Мала продавница треба да пресмета сметка за три производи со цени 120, 80 и 200 денари. За вкупна вредност од најмалку 400 денари важи попуст од 10%.

  1. 01

    Со циклус ги собираме цените: 120 + 80 + 200 = 400.

  2. 02

    Условот проверува дали збирот е најмалку 400.

  3. 03

    Посебна функција го пресметува попустот: 400 × 0,10 = 40.

Што добиваме?

Конечната сметка е 360 денари. Со празна листа збирот е 0; не смее да се чита непостоечки прв производ.

Сценариото и податоците се поедноставени за учење. Примерот не претставува конкретен клиентски проект или измерени резултати од продукциски систем.

03 / СТУДЕНТСКИ ПРАШАЊА

Прашај.
Разбери подобро.

Кога користам циклус, а кога услов?

Условот избира меѓу можности. Циклусот ја повторува истата постапка за повеќе производи; внатре во него можеш повторно да користиш услов.

Зошто да пишувам функција за кратка пресметка?

Името на функцијата ја објаснува намерата, а пресметката се проверува одделно. Истиот попуст може да се примени на повеќе сметки.

Зошто програмата работи за три производи, но не за нула?

Веројатно претпоставуваш дека постои прв елемент. Провери празен влез, почетни вредности и граници на индексите пред пристап до низата.

04 / РЕКУРЗИВНИ ФУНКЦИИ

Помал проблем.
Иста функција.

Рекурзивна функција се повикува себеси за помал случај од истиот проблем. Секој пример има услов за запирање и чекор што нè приближува до него. Прво се создаваат повиците, а потоа нивните резултати се враќаат наназад. Рекурзијата не е секогаш подобра од циклус: секој активен повик користи простор во магацинот на повици.

ПРИМЕР 01 / C++

Сметка во продавница: рекурзивен збир на цени

Имаме три цени: 120, 80 и 200 денари. Наместо циклус, ја пресметуваме сумата на првите n цени како последната цена плус сумата на претходните n − 1.

01 / ОСНОВЕН СЛУЧАЈ

Кога n е 0, нема производи и функцијата враќа 0.

02 / ПОМАЛ ПРОБЛЕМ

Секој повик го намалува n за 1. Проблемот станува помал и конечно стигнува до празната низа.

ЦЕЛОСЕН ПРИМЕР / C++11 ИЛИ ПОНОВПреземи .cpp ↗
#include <iostream>

long long sumPrices(const int prices[], int n) {
    if (n == 0) {
        return 0;
    }
    return prices[n - 1] + sumPrices(prices, n - 1);
}

int main() {
    const int prices[] = {120, 80, 200};
    const int n = sizeof(prices) / sizeof(prices[0]);
    std::cout << sumPrices(prices, n) << '\n';
}

Следи ги повиците.

  1. sumPrices(prices, 3) = 200 + sumPrices(prices, 2)
  2. sumPrices(prices, 2) = 80 + sumPrices(prices, 1)
  3. sumPrices(prices, 1) = 120 + sumPrices(prices, 0)
  4. sumPrices(prices, 0) = 0
  5. Враќање: 0 → 120 → 200 → 400
ИЗЛЕЗ ОД ПРОГРАМАТА400

Внимавај: Функцијата претпоставува дека n е ненегативен и не ја надминува должината на низата. За празна низа не се чита елемент. Сложеноста е O(n), со O(n) длабочина на повици; за голема низа, циклус е попрактичен.

Пробај сам.

Додај производ од 50 денари. Пред да ја извршиш програмата, запиши ги повиците и очекуваниот резултат 450.

ПРИМЕР 02 / C++

Шифра на производ: рекурзивен збир на цифри

За шифрата 1254 сакаме да го добиеме збирот на цифрите: 1 + 2 + 5 + 4. Ова е едноставна пресметка со шифра, а не безбеден механизам за проверка на идентитет или интегритет.

01 / ОСНОВЕН СЛУЧАЈ

Кога бројот ќе стане 0, нема преостанати цифри и враќаме 0.

02 / ПОМАЛ ПРОБЛЕМ

n % 10 ја дава последната цифра. n / 10, со целобројно делење, ја отстранува и го намалува проблемот.

ЦЕЛОСЕН ПРИМЕР / C++11 ИЛИ ПОНОВПреземи .cpp ↗
#include <iostream>

unsigned int sumDigits(unsigned int n) {
    if (n == 0) {
        return 0;
    }
    return n % 10 + sumDigits(n / 10);
}

int main() {
    std::cout << sumDigits(1254) << '\n';
}

Следи ги повиците.

  1. sumDigits(1254) = 4 + sumDigits(125)
  2. sumDigits(125) = 5 + sumDigits(12)
  3. sumDigits(12) = 2 + sumDigits(1)
  4. sumDigits(1) = 1 + sumDigits(0)
  5. sumDigits(0) = 0
  6. Враќање: 0 → 1 → 3 → 8 → 12
ИЗЛЕЗ ОД ПРОГРАМАТА12

Внимавај: Примерот работи со ненегативен цел број. Типот unsigned int не е наменет за внес на негативни шифри. Ако се важни почетни нули, шифрата треба да се чува како текст. Бројот на повици расте со бројот на цифрите.

Пробај сам.

Пресметај sumDigits(9070). Последната нула е валидна цифра, а очекуваниот збир е 16.

ПРИМЕР 03 / C++

Магацин: рекурзивно пребарување на подредени шифри

Магацинот има подредени шифри 1001, 1007, 1012, 1050 и 1088. Бараме 1050. Бинарното пребарување проверува средина и ја отфрла половината во која бараната вредност не може да се наоѓа.

01 / ОСНОВЕН СЛУЧАЈ

Ако left е поголемо од right, интервалот е празен и враќаме −1. Ако средниот елемент е бараната шифра, ја враќаме неговата позиција.

02 / ПОМАЛ ПРОБЛЕМ

Продолжуваме само во левата или десната половина. Границите ја исклучуваат веќе проверената средина, па интервалот строго се намалува.

ЦЕЛОСЕН ПРИМЕР / C++11 ИЛИ ПОНОВПреземи .cpp ↗
#include <iostream>

int findCode(const int codes[], int left, int right, int target) {
    if (left > right) {
        return -1;
    }
    const int mid = left + (right - left) / 2;
    if (codes[mid] == target) {
        return mid;
    }
    if (target < codes[mid]) {
        return findCode(codes, left, mid - 1, target);
    }
    return findCode(codes, mid + 1, right, target);
}

int main() {
    const int codes[] = {1001, 1007, 1012, 1050, 1088};
    std::cout << findCode(codes, 0, 4, 1050) << '\n';
}

Следи ги повиците.

  1. Интервал [0, 4]: mid = 2, codes[2] = 1012
  2. 1050 е поголемо од 1012 → продолжуваме во [3, 4]
  3. Интервал [3, 4]: mid = 3, codes[3] = 1050
  4. Шифрата е најдена → враќаме индекс 3
ИЗЛЕЗ ОД ПРОГРАМАТА3

Внимавај: Низата мора да биде подредена по растечки редослед, а границите да бидат валидни. Индекс 3 е четвртиот елемент, бидејќи броењето почнува од 0. За отсутна шифра се враќа −1. При дупликати се враќа едно совпаѓање, не нужно првото. Пребарувањето бара O(log n) време и O(log n) длабочина на повици.

Пробај сам.

Побарај 1060 и следи како интервалот станува празен. Очекуваниот резултат е −1.

УЧИ СО РАЗБИРАЊЕ

Твојот материјал.
Нашата следна задача.

Работиме на делот што ти е најпотребен: основни концепти, практични задачи или подготовка за колоквиум и испит. Содржината ја усогласуваме со материјалите што ги учиш во твојата генерација.

НЕ САМО ЕДНАШ. КОЛКУ ШТО ТИ ТРЕБА.

Часот завршува.
Знаењето останува.

Секој час се снима. Врати се на објаснувањата, паузирај кај потешките делови и повтори ги задачите со свое темпо.

Снимките се достапни најмалку
во текот на еден семестар.
Снимките се наменети за твоето учење. Споделување и објавување се дозволени само по претходен договор.
ЕДЕН РАЗГОВОР. НОВ ПОЧЕТОК.

Твојот следен ред код
почнува тука.

Пријави се за час
Или јави се: 075 443 230