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

Аудиториски вежби 5

1. Контролни структури за циклуси

1.5. Задача 4

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

4031 (4=0+3+1), 5131 (5=1+3+1)

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int i, n, sum, first_digit, digit;
        i = 1000;
        while (i <= 9999) {
            first_digit = i / 1000;
            n = i % 1000;
            sum = 0;
            while (n > 0) {
                digit = n % 10;
                sum += digit;
                n /= 10;
            }
            if (sum == first_digit) cout << i << "\t";
            i++;
        }
        return 0;
    }

1.6. Задача 5

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

пример броеви

12321 5061605

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int i, from, to, temp, op, digit;
        cin >> from >> to;
        for (i = from; i <= to; i++) {
            temp = i;
            op = 0;
            while (temp > 0) {
                digit = temp % 10;
                op = op * 10 + digit;
                temp /= 10;
            }
            if (op == i) cout << i << "\t";
        }
        return 0;
    }

1.7. Задача 6

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

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int n, max;
        if (cin >> max) {
            while (cin >> n) {
                if (max < n) {
                    max = n;
                }
            }
            cout << max;
        } else {
            cout << "Ne e vnesen broj.";
        }
        return 0;
    }

1.8. Задача 7

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

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int n, max;
        if (cin >> max) {
            while (cin >> n) {
                if (n > 100) continue;
                if (max < n) {
                    max = n;
                }
            }
            cout << max;
        } else {
            cout << "Ne e vnesen broj.";
        }
        return 0;
    }

1.9. Задача 8

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

пример

Ако се внесат броевите 2 4 7 4 2 1 8 6 9 7 10 3 програмата ќе отпечати 10 и 9.

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int n, max1, max2, temp;
        if (cin >> max1 >> max2) {
            if (max2 > max1){
                temp = max1;
                max1 = max2;
                max2 = temp;
            }
            while(cin >> n) {
                if(n > max1){
                    max2 = max1;
                    max1 = n;
                } else if (n > max2) {
                    max2 = n;
                }
            }
            cout << max1 << endl;
            cout << max2 << endl;
        } else {
            cout << "Vnesete najmalku 2 broja";
        }
        return 0;
    }

1.10. Задача 9

Да се напише програма што од N цели броеви внесени од тастатура ќе ја определи разликата од сумите на броевите на парни и непарни позиции (според редоследот на внесување). Ако оваа разлика е помала од 10 на екран се печати “Dvete sumi se slicni”, а во спротивно “Dvete sumi mnogu se razlikuvaat”.

пример

За броевите внесени од тастатура:

2 4 3 4 2 1 1 6 1 7

suma_neparni_pozicii = 9

suma_parni_pozicii = 22

На екран ќе се испечати:

Dvete sumi mnogu se razlikuvaat

Решение:

    #include <iostream>
    #include <cmath>
    using namespace std;

    int main() {
        int difference, i, n = 0, number = 0;
        int sum_odd_positions = 0, sum_even_positions = 0;
        cin >> n;
        for (i = 1; i <= n; i++) {
            cin >> number;
            if (i % 2) {
                sum_odd_positions += number;
            } else {
                sum_even_positions += number;
            }
        }
        difference = sum_even_positions - sum_odd_positions;
        if (abs(difference) < 10){
            cout << "Dvete sumi se slicni";
        } else {
            cout << "Dvete sumi mnogu se razlikuvaat";
        }
        return 0;
    }

1.11. Задача 10

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

Решение:

    #include <iostream>
    using namespace std;

    int main() {
        int pol_position, position, max_sum, sum, previous, next;
        cin >> previous >> next;
        pol_position = position = 2;
        max_sum = sum = previous + next;
        while (1) {
            if (previous < 0 && next < 0) {
                break;
            }
            sum = previous + next;
            if (sum > max_sum) {
                max_sum = sum;
                pol_position = position;
            }
            previous = next;
            cin >> next;
            position++;
        }
        if (position > 2)
            cout << "Broevite se na pozicii " << pol_position - 1 << " i " << pol_position << " i nivnata suma e " << max_sum;
        return 0;
    }

2. Пример колоквиумски задачи за прв колоквиум

2.1. Задача 1

Со Морзеовата азбука, знаците (букви, цифри) се претставуваат со точки и цртички. Цифрите од 0 до 4 се претставуваат, соодветно, на следниот начин: “—–”, “.—-”, “..—”, “…–”, “….-”. Од тастатура се внесува даден природен број N (N<100 000), и потоа се внесуваат N други природни броеви. За секој од внесените броеви, во посебен ред, да се отпечати остатокот при делењето на тој број со 5 во Морзеов код.

Решение:

    #include <iostream>

    using namespace std;
    int main() {
        int n, current_number;

        cin >> n;

        for (int i = 0; i < n; ++i) {
            cin >> current_number;
            int rest = current_number%5;
            if (rest == 0) {
                cout<<"-----"<<endl;
            } else if (rest == 1) {
                cout<<".----"<<endl;
            } else if (rest == 2) {
                cout<<"..---"<<endl;
            } else if (rest == 3) {
                cout<<"...--"<<endl;
            } else {
                cout<<"....-"<<endl;
            }
        }

        return 0;
    }

2.2. Задача 2

Бројаница е „број“ добиен со слепување на првите N броеви, по редослед. На пример, за N=4 тоа е 1234, за N=11 тоа е 1234567891011. Обратна бројаница е слично како погоре, но се започнува од N па броевите се слепуваат обратно. Така за N=5 тоа е 54321.

За дадено N, на екран испишете ги по редослед: Бројаница за 1, обратна бројаница за 1, бројаница за 2, обратна бројаница за 2…, се така до обратна бројаница за N.

На пример, за N=5 треба да отпечатите:

1
1
12
21
123
321
1234
4321
12345
54321

Решение:

    #include <iostream>

    using namespace std;

    int main() {
        int i, j, N;
        cin >> N;

        for (i = 1; i <= N; i++) {
            for (j = 1; j <= i; j++) {
                cout << j;
            }
            cout << endl;
            for (j = i; j > 0; j--) {
                cout << j;
            }
            cout << endl;
        }

        return 0;
    }

2.3. Задача 3

Среден број е број кај кој секоја следна цифра е помала на претходната (гледајќи од најзначајната кон најмалку значајната). На пример, 7421. Едноцифрените броеви не се средни броеви.

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

Доколку не постои број кој го задоволува условот се печати вредност -1.

Пример за влез:

5
435
643
12234
721
7720

Пример за излез:

643
721
643

Решение:

    #include <iostream>

    using namespace std;

    int main() {
        int num, i, tmp, min = -1, N;
        cin >> N;

        for (i = 0; i < N; i++) {
            cin >> num;
            tmp = num;
            while (tmp > 9) {
                if (tmp % 10 >= (tmp / 10) % 10) break;
                tmp /= 10;
            }
            if (tmp < 10) {
                cout << num << endl;
                if (min == -1) min = num;
                else if (num < min) min = num;
            }
        }

        cout << min;
        return 0;
    }

3. Контролна структура за повеќекратно гранење (switch)

3.1. Пример

#include <iostream>
using namespace std;

int main() {
  char odgovor;
  cout << "Dali SP e lesen predmet? (d/n): "<<endl;
  cin >> odgovor;
  switch (odgovor) {
  case 'D':
  case 'd': 
    cout << "I jas mislam taka!" << endl;
    break;
  case 'N':
  case 'n':
    cout << "Navistina?" << endl;
    break;
  default:
    cout << "Ova e DA ili NE?" << endl;
  }
  return 0;
}

3.2. Пример за реализација на (текст) мени

#include <iostream>
using namespace std;

int main() {
    int vrednost, izbor;
    cout << "Внесете почетна вредност: ";
    cin >> vrednost;

    do {
        do {
            cout << "Мени:" << endl;
            cout << "1 - Зголеми" << endl;
            cout << "2 - Намали" << endl;
            cout << "3 - Дуплирај" << endl;
            cout << "0 - Крај" << endl;
            cout << "Избор: ";
            cin >> izbor;
        } while (izbor < 0 || izbor > 3);

        switch (izbor) {
            case 1:
                vrednost++;
                break;
            case 2:
                vrednost--;
                break;
            case 3:
                vrednost *= 2;
                break;
            case 0:
                cout << "Крај" << endl;
                break;
            default:
                cout << "Невалиден избор!" << endl;
                break;
        }

        cout << "Вредност = " << vrednost << endl;
    } while (izbor != 0);

    return 0;
}

3.3. Задача 1

Да се напише програма што за знак внесен од тастатура ќе одреди дали е самогласка, цифра или другo.


#include <iostream>

using namespace std;

int main() {
  char znak;
  cout << "Enter a character: ";
  cin >> znak;

  switch (znak) {
    case 'a':
    case 'A':
    case 'e':
    case 'E':
    case 'i':
    case 'I':
    case 'o':
    case 'O':
    case 'u':
    case 'U':
      cout << "Самогласка: " << znak << endl;
      break;
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      cout << "Цифра: " << znak << endl;
      break;
    default:
      cout << "Внесено е: " << znak << endl;
  }

  return 0;
}

3.4. Задача 2

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

broj1 operator broj2

По извршената операција во зависност од операторот, се печати резултатот во формат:

broj1 operator broj2 = rezultat

Решение:


#include <iostream>
using namespace std;

int main() {
    double broj1, broj2, rezultat;
    char operator;

    cout << "Внесете два броја и оператор (пр. 5 + 3): ";
    cin >> broj1 >> operator >> broj2;

    switch (operator) {
        case '+':
            rezultat = broj1 + broj2;
            break;
        case '-':
            rezultat = broj1 - broj2;
            break;
        case '*':
            rezultat = broj1 * broj2;
            break;
        case '/':
            if (broj2 != 0) {
                rezultat = broj1 / broj2;
            } else {
                cout << "Делење со 0 не е дозволено." << endl;
                return 1;
            }
            break;
        default:
            cout << "Непознат оператор." << endl;
            return 1;
    }

    cout << broj1 << ' ' << operator << ' ' << broj2 << " = " << rezultat << endl;

    return 0;
}