Задаци: Линеарна зависност и пропорција¶
Алгоритми и програми у програмском језику C: Линеарна зависност и пропорција.
Подела интервала¶
Прочитај текст задатка.
Интервал \([a,b]\) је дужине \(b-a\) и треба га поделити у размери \(p:q\). То значи да тражимо тачку \(x\) тог интервала тако да je дужинa интервала \([a,x]\) једнака \(p\cdot k\) а дужина интервала \([x,b]\) једнака \(q\cdot k\), за неки реалан број \(k\). Како је дужина интервала \([a,b]\) једнака збиру дужина интервала \([a,x]\) и \([x,b]\), добијамо једначину \(b-a=p\cdot k+q\cdot k\) тј. \(b-a=(p+q)\cdot k\). Решавањем једначине добијамо да је \(k=\frac{b-a}{p+q}\), па је тражена тачка \(x=a+p\cdot k\).
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double a, b;
int p, q;
scanf("%lf%lf%d%d", &a, &b, &p, &q);
double k = (b - a) / (p + q);
double x = a + p * k;
printf("%.2lf", x);
return 0;
}
До решења можемо доћи коришћењем основног својства пропорције да је \(a:b=c:d\) еквивалентно са \(a\cdot d=b\cdot c\). Тачка \(x\) дели интервал \([a,b]\) у размери \(p:q\) ако су дужине интервала \([a,x]\) и \([x,b]\) у размери \(p:q\), тј. ако је \((x-a):(b-x)=p:q\). Из последње пропорције добијамо да је
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double a, b;
int p, q;
scanf("%lf%lf%d%d", &a, &b, &p, &q);
double x = (b * p + a * q) / (p + q);
printf("%.2lf", x);
return 0;
}
Генератор случајних бројева¶
Прочитај текст задатка.
Потребно је дефинисати линеарну функцију која вредност \(0\) пресликава у вредност \(a\) док вредност \(1\) пресликава у вредност \(b\). Ако је та функција облика \(y=k\cdot x+n\) тада важи да је \(a=k\cdot 0+n\) и \(b=k\cdot 1+n\). Зато је \(n=a\) и \(k=b-a\) и тражено пресликавање је \(y=(b-a)\cdot x+a\). Заиста, када вредност из интервала \([0,1)\) помножимо бројем \(b-a\) добијамо број из интервала \([0,b-a)\). Додавањем броја \(a\) добијамо број из интервала \([a,b)\).
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double x, a, b;
scanf("%lf%lf%lf", &x, &a, &b);
double y = a + x * (b - a);
printf("%.5lf", y);
return 0;
}
Група радника¶
Прочитај текст задатка.
Један начин да се задатак реши је да се прво израчуна колико је радник-сати потребно да се заврши цео посао. Пошто сваки од \(n\) радника ради \(s_n\) сати, за завршетак посла потребно је \(n\cdot s_n\) радник-сати (један радник би сам посао радио \(n\cdot s_n\) сати). Ако посао треба да заврши \(n+m\) радника, тада ће се посао завршити \(n+m\) пута брже него када радни један радник, па је број сати за које ће посао бити завршен једнак
До решења се може доћи и применом пропорције. Више радника брже заврши посао, па је потребно применити обрнуту пропорцију. Ако са \(x\) обележимо број сати за које посао уради већа група радника, до решења се долази решавањем пропорције \(n:(n+m)=x:s_n\) (са обе стране једнакости вредности су поређане од мање ка већој).
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, m;
double sn;
scanf("%d%lf%d", &n, &sn, &m);
double snm = (n * sn) / (n + m);
printf("%.2lf", snm);
return 0;
}
Такси¶
Прочитај текст задатка.
Трошкови путовања за путника који излази су:
први: \(\frac{c_1}{3}\)
други: \(\frac{c_1}{3}+\frac{c_2-c_1}{2}\)
трећи: \(\frac{c_1}{3}+\frac{c_2-c_1}{2}+c_3-c_2\)
Наиме, трошак првог дела вожње који износи \(c_1\) динара деле сва три путника равноправно, тако да сваки од њих плаћа \(\frac{c_1}{3}\) динара, трошак другог дела вожње који износи \(c_2-c_1\) динара деле други и трећи путник равноправно (јер је први путник напустио такси) тако да свако од њих плаћа још \(\frac{c_2-c_1}{2}\) динара, док цео трошак трећег дела вожње који износи \(c_3-c_2\) динара плаћа трећи путник (јер су први и други путник тада напустили такси, тако да се он возио сам).
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double c1, c2, c3;
scanf("%lf%lf%lf", &c1, &c2, &c3);
double troskovi1 = c1 / 3;
double troskovi2 = c1 / 3 + (c2 - c1) / 2;
double troskovi3 = c1 / 3 + (c2 - c1) / 2 + (c3 - c2);
printf("%.2lf\n%.2lf\n%.2lf", troskovi1, troskovi2, troskovi3);
return 0;
}
Курс¶
Прочитај текст задатка.
Куповни курс евра према долару је број долара потребних да би се купио један евро. Он се може добити тако што се на основу куповног курса евра према динару израчуна број динара потребних да би се купио један евро, а онда се на основу продајног курса долара према динару одреди број долара које је потребно продати да би се добио тај број динара. Дакле, важи да је
Аналогно,
Продајни курс евра према долару је број долара који се могу добити продајом једног евра. Он се може израчунати тако што се на основу продајног курса евра према динару израчуна број динара који се могу добити продајом једног евра, а онда се на основу куповног курса долара може израчунати број долара који се могу купити за тај износ динара. Дакле, важи да је
Аналогно,
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double kupovniEvroDinar, prodajniEvroDinar, kupovniDolarDinar, prodajniDolarDinar;
scanf("%lf%lf%lf%lf", &kupovniEvroDinar, &prodajniEvroDinar, &kupovniDolarDinar, &prodajniDolarDinar);
double kupovniEvroDolar = kupovniEvroDinar / prodajniDolarDinar;
double kupovniDolarEvro = kupovniDolarDinar / prodajniEvroDinar;
double prodajniEvroDolar = prodajniEvroDinar / kupovniDolarDinar;
double prodajniDolarEvro = prodajniDolarDinar / kupovniEvroDinar;
printf("%.4lf\n%.4lf\n%.4lf\n%.4lf", kupovniDolarEvro, prodajniDolarEvro, kupovniEvroDolar, prodajniEvroDolar);
return 0;
}