Задаци: Хијерархија услова¶
Алгоритми и програми у програмском језику C: Хијерархија услова.
Два броја истог знака¶
Прочитај текст задатка.
Овај задатак је поновљен у циљу увежбавања различитих техника решавања.
До решења се могло доћи и угнежђеним (хијерархијским) гранањем, без коришћења логичких оператора, међутим, такво решење даје веома гломазан програмски кôд и треба га избегавати.
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b, i;
scanf("%d%d", &a, &b);
if (a > 0)
if (b > 0)
i = 1;
else
i = 0;
else
if (b > 0)
i = 0;
else
i = 1;
if (i)
printf("da");
else
printf("ne");
return 0;
}
Линеарна једначина¶
Прочитај текст задатка.
Број решења линеарне једначине облика \(a\cdot x+b=0\)$ зависи од тога да ли су коефицијенти једнаки или различити од нуле. Ako je
\(a\neq 0\), једначина има јединствено решење \(x=-\frac{b}{a}\),
\(a=0\) једначина се своди на једначину \(0\cdot x+b=0\), која када је \(b\neq 0\) нема решења. Ако је \(b=0\) једначина гласи \(0\cdot x+0=0\), па је сваки реалан број њено решење.
Након учитавања бројева могуће је извршити гранање и исписати тражени резултат.
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double a, b;
scanf("%lf%lf", &a, &b);
if (a != 0.0)
{
double x = -b / a;
printf("%.2lf", x);
}
else
if (b == 0.0)
printf("BESKONACNO RESENJA");
else
printf("NEMA RESENJA");
return 0;
}
Икс-окс¶
Прочитај текст задатка.
Овај задатак је поновљен у циљу увежбавања различитих техника решавања.
Можемо засебно одредити ком интервалу припада координата \(x\) (гранањем на основу припадности надовезаним интервалима), а затим у свакој грани одредити ком интервалу припада координата \(y\).
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x, y, kvadrat;
scanf("%d%d", &x, &y);
if (y <= 100)
if (x <= 100)
kvadrat = 1;
else if (x <= 200)
kvadrat = 2;
else
kvadrat = 3;
else if (y <= 200)
if (x <= 100)
kvadrat = 4;
else if (x <= 200)
kvadrat = 5;
else
kvadrat = 6;
else
if (x <= 100)
kvadrat = 7;
else if (x <= 200)
kvadrat = 8;
else
kvadrat = 9;
printf("%d", kvadrat);
return 0;
}
Пошто је могућих случајева (квадрата) само 9, могуће је и извршити исцрпну проверу свих могућих случајева. На пример, тачка припада квадрату број 1 ако важи \(1\leq x\leq 100\) и \(1\leq y\leq 100\).
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x, y, kvadrat;
scanf("%d%d", &x, &y);
if (1 <= x && x <= 100 && 1 <= y && y <= 100)
kvadrat = 1;
if (101 <= x && x <= 200 && 1 <= y && y <= 100)
kvadrat = 2;
if (201 <= x && x <= 300 && 1 <= y && y <= 100)
kvadrat = 3;
if (1 <= x && x <= 100 && 101 <= y && y <= 200)
kvadrat = 4;
if (101 <= x && x <= 200 && 101 <= y && y <= 200)
kvadrat = 5;
if (201 <= x && x <= 300 && 101 <= y && y <= 200)
kvadrat = 6;
if (1 <= x && x <= 100 && 201 <= y && y <= 300)
kvadrat = 7;
if (101 <= x && x <= 200 && 201 <= y && y <= 300)
kvadrat = 8;
if (201 <= x && x <= 300 && 201 <= y && y <= 300)
kvadrat = 9;
printf("%d", kvadrat);
return 0;
}
Квадранти и осе¶
Прочитај текст задатка.
Један начин да се задатак реши је да се употреби угнежђено хијерархијско
гранање, тако што се прво одреди да ли је \(x\) координата позитивна, нула или
негативна, а затим, за сваку од тих могућности посебно испита да ли је \(y\)
координата позитивна, нула или негативна. Испитивање да ли је вредност
позитивна, нула или негативна се најлакше ради конструкцијом else-if
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x, y;
scanf("%d%d", &x, &y);
if (x > 0)
if (y > 0)
printf("1. kvadrant");
else if (y < 0)
printf("4. kvadrant");
else
printf("pozitivni deo x ose");
else if (x < 0)
if (y > 0)
printf("2. kvadrant");
else if (y < 0)
printf("3. kvadrant");
else
printf("negativni deo x ose");
else
if (y > 0)
printf("pozitivni deo y ose");
else if (y < 0)
printf("negativni deo y ose");
else
printf("koordinatni pocetak");
return 0;
}
Други начин је да се услов припадности сваком квадранту испита независно (на пример, услов припадности првом квадранту је да је \(x>0\) и \(y>0\), а услов припадности негативном делу \(y\)-осе је да је \(x=0\) и \(y<0\)).
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x, y;
scanf("%d%d", &x, &y);
if (x > 0 && y > 0)
printf("1. kvadrant");
if (x > 0 && y < 0)
printf("4. kvadrant");
if (x > 0 && y == 0)
printf("pozitivni deo x ose");
if (x < 0 && y > 0)
printf("2. kvadrant");
if (x < 0 && y < 0)
printf("3. kvadrant");
if (x < 0 && y == 0)
printf("negativni deo x ose");
if (x == 0 && y > 0)
printf("pozitivni deo y ose");
if (x == 0 && y < 0)
printf("negativni deo y ose");
if (x == 0 && y == 0)
printf("koordinatni pocetak");
return 0;
}
Положај две праве¶
Прочитај текст задатка.
Проблем се своди на решавање система две линеарне једначине са две непознате. У случају када систем има бесконачно много решења, праве се поклапају, када нема решења праве су паралелне а када постоји јединствено решење праве се секу и координате пресечне тачке су управо решење система.
Систем ћемо решавати применом Крамеровог правила. Детерминанту система, \(D\), одређујемо формулом \(D=A_1\cdot B_2-A_2\cdot B_1\). Такође, одређујемо и детерминанте \(Dx=-C_1\cdot B_2+C_2\cdot B_1\) и \(Dy=-A_1\cdot C_2+A_2\cdot C_1\).
Ако је детерминанта система једнака 0 и
детерминанте \(D_x\) и \(D_y\) једнаке 0, онда систем има бесконачно много решења, тј. праве се поклапају
бар једна од детерминанти \(D_x\) и \(D_y\) различита од 0, онда систем нема решења, односно праве су паралелне
Ако је детерминанта система различита од 0, систем има јединствено решење \(x=\frac{D_x}{D}\), \(y=\frac{D_y}{D}\) односно праве се секу у тачки чије су координате управо одређене решењем система. Приметимо да се дискусија случајева опет изводи угнежђеним гранањем (прво се провери услов \(D=0\), а онда ако је он испуњен, проверава се услов \(D_x=0\) и \(D_y=0\)).
Након учитавања параметара, можемо израчунати све детерминанте и након тога анализирати све случајеве и одмах исписивати решења.
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double A1, B1, C1, A2, B2, C2;
scanf("%lf%lf%lf%lf%lf%lf", &A1, &B1, &C1, &A2, &B2, &C2);
double D = A1 * B2 - A2 * B1;
double Dx = -C1 * B2 - -C2 * B1;
double Dy = A1 * -C2 - A2 * -C1;
if (D == 0)
if (Dx == 0 && Dy == 0)
printf("poklapaju se");
else
printf("paralelne su");
else
{
printf("seku se\n");
printf("%.2lf %.2lf", Dx / D, Dy / D);
}
return 0;
}