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

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


1. Оператори во C++

1.1. Релациски оператори

Се применуваат над било кои споредливи типови на податоци, а резултатот е цел број 0 (неточно) или 1 (точно).

Оператор Значење
< Помало
<= Помало или еднакво
> Поголемо
>= Поголемо или еднакво
== Еднаквост
!= Нееднаквост (различност)

1.2. Логички оператори

Се користат најчесто во комбинација со релациските оператори за формирање на сложени логички изрази, кои повторно враќаат резултат 0 или 1.

Оператор Значење
&& Логичко И (AND)
| | Логичко ИЛИ (OR)
! Негација (NOT)

Пример.

int a = 5 && 0; // a = 0;
a = 2 && 5;     // a = 1;
a = 0 || 5;     // a = 1;
a = !0;         // a = 1;
a = !5;         // a = 0;

1.3. Оператор за доделување

 x = (y = 10) * (z = 5);
 x = y = z = 20;

1.4. Оператори за инкрементирање и декрементирање

а) Префикс

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

a = ++b;

б) Постфикс

Вредноста на променливата се зголемува откако ќе се пресмета изразот.

a = b++;

1.5. Двојни оператори: комбинација од оператор за доделување и друг оператор

a += 5; // a = a + 5;
a += b * c; // a = a + b * c;
a -= 3; // a = a – 3;
a *= 3; // a = a * 3;
a /= 3; // a = a / 3;
a %= 3; // a = a % 3;

2. Контролни структури за избор. if-else

if ( uslov ) {
    naredbi_za_vistinit_uslov ;
} 
else {
    naredbi_za_nevistinit_uslov ;
}

Пример. Што ќе отпечати?

#include <iostream>
using namespace std;
int main() {
    int m = 5, n = 10;
    if (m > n)
        ++m;
        ++n;
    cout << "m = " << m << ", n = " << n;
    return 0;
}

Решение: m = 5, n = 11

3. Задачи

3.1. Задача 1

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

ПОМОШ: Користете логички и релациски оператори за тестирање на ASCII вредноста на знакот.

Решение:

#include <iostream>
using namespace std;

int main()
{
    char ch;
    int rez;
    cout << "Vnesete znak: ";
    cin >> ch;
    rez = (ch >= 'a') && (ch <= 'z');
    cout << rez;
    return 0;
}

Решение на бонусот:

rez = (ch >= '0') && (ch <= '9');

3.2. Задача 2

Од тастатура се внесуваат координати на една точка од рамнина. Да се напише програма со која ќе се испечати на кој квадрант припаѓа внесената точка.

Решение 1

    #include <iostream>
    using namespace std;
    
    int main () {
            float x, y;
            cout<<"Vnesi koordinati"<<endl;
            cin>>x>>y;
            if (x > 0 && y > 0)
                    cout<<"I kvadrant."<<endl;
            if (x > 0 && y < 0)
                    cout<<"IV kvadrant."<<endl;
            if (x < 0 && y > 0)
                    cout<<"II kvadrant."<<endl;
            if (x < 0 && y < 0)
                    cout<<"III kvadrant."<<endl;
            return 0;
    }

Решение 2

    #include <iostream>
    using namespace std;
    int main () {
        float x, y;
        cout<<"Vnesi koordinati"<<endl;
        cin>>x>>y;
        if (x > 0)
            if (y > 0)
                cout<<"I kvadrant."<<endl;
            else
                cout<<"IV kvadrant."<<endl;
        else if (y > 0)
            cout<<"II kvadrant."<<endl;
        else
            cout<<"III kvadrant."<<endl;
        return 0;
    }
  1. Дали ваквата програма ги опфаќа сите случаи?

  2. Дали ќе испечати нешто за која било внесена точка?

Решение 3

    #include <iostream>
    using namsepace std;
    int main () {
        float x, y;
        cout<<"Vnesi koordinati"<<endl;
        cin>>x>>y;
        if (x > 0)
            if (y > 0)
                cout<<"I kvadrant."<<endl;
            else if (y < 0)
                cout<<"IV kvadrant."<endl;
            else
                cout<<"Pozitivna X oska."<endl;
        else if (x < 0)
            if (y > 0)
                cout<<"II kvadrant."<endl;
            else if (y < 0)
                cout<<"III kvadrant."<endl;
            else
                cout<<"Negativna X oska."<endl;
        else
            if (y > 0)
               cout<<"Pozitivna Y oska."<endl;
            else if (y < 0)
                cout<<"Negativna Y oska."<endl;
            else
                cout<<"Koordinaten pocetok.");
        return 0;
    }

3.3. Задача 3

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

Решение


    #include <iostream>
    using namespace std;
    int main () {
        int poeni, ocenka = 0;
        cout<<"Vnesi poeni: "<<endl;
        cin>>poeni;
        if (poeni >= 0 && poeni <= 50) ocenka = 5;
        else if (poeni > 50 && poeni <= 60) ocenka = 6;
        else if (poeni > 60 && poeni <= 70) ocenka = 7;
        else if (poeni > 70 && poeni <= 80) ocenka = 8;
        else if (poeni > 80 && poeni <= 90) ocenka = 9;
        else if (poeni > 90 && poeni <= 100) ocenka = 10;
        else cout<<"Nevalidna vrednost na poeni!"<<endl;
        cout<<"Ocenka: "<<ocenka<<endl;
        return 0;
    }

Решение в2


    #include <iostream>
    using namespace std;
    
    int main () {
        int poeni, ocena = 0;
        cout<<"Vnesi poeni: "<<endl;
        cin>>poeni;
        if (poeni < 0 || poeni > 100)
            cout<<"Nevalidna vrednost za poeni!"<<endl;
        else {
            if (poeni > 90) ocena = 10;
            else if (poeni > 80) ocena = 9;
            else if (poeni > 70) ocena = 8;
            else if (poeni > 60) ocena = 7;
            else if (poeni > 50) ocena = 6;
            else ocena = 5;
            cout<<"Ocena: "<<ocena<<endl;
        }
        return 0;
    }

3.4. Задача 4

Да се промени претходната програма, така што покрај оценките ќе се испечатат и знаците + и – во зависност од вредноста на последната цифра на поените:

последна цифра

печати

пример

81 = 9-

94 = 10

68 = 7+

За оценката 5 не треба да се додава + или –, а за оценката 10 не треба да се додава знакот +.

Решение


    #include <iostream>
    using namespace std;
    int main () {
        int poeni, ocenka = 0;
        cout<<"Vnesi poeni: "<<endl;
        cin>>poeni;
        if (poeni < 0 || poeni > 100)
            cout<<"Nevalidna vrednost za poeni!"<<endl;
        else {
            if (poeni > 90) ocenka = 10;
            else if (poeni > 80) ocenka = 9;
            else if (poeni > 70) ocenka = 8;
            else if (poeni > 60) ocenka = 7;
            else if (poeni > 50) ocenka = 6;
            else ocenka = 5;
            char znak = ' ';
            int pc = poeni % 10;
            if (ocenka != 5) {
                if (pc >= 1 && pc <= 3) znak = '-';
                else if (ocenka != 10 && (pc >= 8 || pc == 0))
                    znak = '+';
            }
            cout<<"Ocena: "<<ocenka<<znak<<endl;
        }
        return 0;
    }

3.5 Задача 5

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

Решение


    #include <iostream>
    using namespace std;
    
    int main() {
        float a, b, c;
        cout<<"Vnesi dolzini na strani: "<<endl;
        cin>>a>>b>>c;
        if ((a + b <= c) || (a + c <= b) || (b + c <= a))
            cout<<"Ne moze da se konstruira triagolnik."<<endl;
        else {
            if (a >= b) {
                float tmp = a;
                a = b;
                b = tmp;
            }
            if (a >= c) {
                float tmp = a;
                a = c;
                c = tmp;
            }
            if (b >= c) {
                float tmp = b;
                b = c;
                c = tmp;
            } // po ova najdolgata strana kje bide vo c
            if (c * c == a * a + b * b) {
                cout<<"Tragolnikot e pravoagolen."<<endl;
                cout<<"Ploshtinata mu e: "<<a * b / 2;
            } else {
                cout<<"Tragolnikot NE e pravoagolen."<<endl;
            }
        }
        return 0;
    }

3.6. Задача 6

Од тастатура се внесуваат должини на три отсечки во произволен редослед. Да се провери дали од дадените отсечки може да се конструра триаголник. Ако може, да се испечати дали триаголникот е разностран, рамностран или рамнокрак и да му се пресмета плоштината.

Решение


    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        float a, b, c;
        cout<<"Vnesi dolzini na strani: "<<endl;
        cin>>a>>b>>c;
        if ((a + b <= c) || (a + c <= b) || (b + c <= a))
            cout<<"Ne moze da se konstruira triagolnik."<<endl;
        else {
            if (a == b && b == c)
                cout<<"Tragolnikot e ramnostran."<<endl; // equilateral
            else if (a == b || b == c || a == c)
                cout<<"Tragolnikot e ravnokrak."<<endl; // isosceles
            else
                cout<<"Tragolnikot e raznostran."<<endl; // scalene
        float p, s = (a + b + c) / 2;
        p = sqrt(s * (s - a) * (s - b) * (s - c));
        cout<<"Ploshtinata mu e :"<<p;
        }
        return 0;
    }

3.7. Задача 7

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

Доколку се внесе негативен број за возраста, да се испечати следната порака: “Vozrasta mora da bide pozitiven broj”.

Забелешка: За првите две години, една кучешка година е еднаква на 10,5 човечки години. После тоа, секоја кучешка година е еднаква на 4 човечки години.

#include <iostream>

using namespace std;

int main() {
    int kucheskaVozrast, chovecheskaVozrast;

    cout << "Vnesete kucheshka vozrast: ";
    cin >> kucheskaVozrast;

    if (kucheskaVozrast < 0) {
        cout << "Vozrasta mora da bide pozitiven broj" << endl;
    } else {
        if (kucheskaVozrast <= 2) {
            chovecheskaVozrast = kucheskaVozrast * 10.5;
        } else {
            chovecheskaVozrast = 2 * 10.5 + (kucheskaVozrast - 2) * 4;
        }

        cout << "Chovecheska vozrast na kucheto e: " << chovecheskaVozrast << endl;
    }

    return 0;
}

3.8. Задача 8

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

Решение:

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cout << "Vnesi 2 broja: " << endl;
    cin >> a >> b;
    if (a > b)
        cout << "Maximum: \n" << a;
    else
        cout << "Maximum: \n" << b;
    return 0;
}

Решение 2 (без if-else):

#include <iostream>
using namespace std;

int main() {
    int a, b, maks;
    cout << "Vnesi 2 broja: " << endl;
    cin >> a >> b;
    maks = (a > b) ? a : b;
    cout << "Maximum: " << maks;
    return 0;
}

3.9. Задача 9

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

Примери за престапни години: 1976, 2000, 2004, 2008, 2012…

ПОМОШ: Годината е престапна ако е делива со 4 но не е делива со 100, или пак ако е делива со 400.

Решение:

#include <iostream>
using namespace std;

int main() {
    int godina;
    cout << "Vnesi godina: \n";
    cin >> godina;
    if((godina%4==0 && godina%100!=0) || godina%400==0)
        cout << godina << " e prestapna.\n";
    else
        cout << godina << " e prosta.\n";
    return 0;
}