Задаци: Елементарне статистике¶
Алгоритми и програми у програмском језику C: Елементарне статистике.
Факторијел¶
Прочитај текст задатка.
За одређивање факторијела природног броја faktorijel
у којој редом акумулирамо производ бројева од 1 до
На почетку вредност променљиве faktorijel
поставимо на 1. Након тога,
коришћењем петље у којој ћемо бројачкој променљивој faktorijel
множити са
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, f = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
f *= i;
printf("%d", f);
return 0;
}
Степен¶
Прочитај текст задатка.
Резултат можемо добити ако израчунамо производ
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double x;
int n, f = 1;
scanf("%lf%d", &x, &n);
double s = 1.0;
for (int i = 0; i < n; i++)
s *= x;
printf("%.5lf", s);
return 0;
}
Већина језика већ пружа готову функцију или операцију степеновања. У језику C
степеновање реалних бројева се врши функцијом pow
, декларисаној у заглављу
math.h
.
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
double x;
int n, f = 1;
scanf("%lf%d", &x, &n);
printf("%.5lf", pow(x, n));
return 0;
}
Просек свих бројева до краја улаза¶
Прочитај текст задатка.
Као што смо већ видели, рачунање просека серије бројева своди се на засебно израчунавање збира и броја елемената серије и њихово дељење (ако су и збир и број цели бројеви, пре дељења је потребно конвертовати их у реални тип).
Видели смо и да се збир серије бројева израчунава тако што се променљива у којој се акумулира збир иницијализује на нулу, а затим се у петљи пролази кроз елементе серије и збир се увећава за текући елемент.
Видели смо и да се број елемената серије одређује тако што се бројачка променљива у којој се тај број акумулира иницијализује на нулу, а затим се у петљи пролази кроз елементе серије и бројач се у сваком кораку увећава за један.
Показано је и како се може организовати петља која учитава све бројеве са стандардног улаза.
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int z = 0, i = 0, n;
while (scanf("%d", &n) != EOF)
{
z += n;
i++;
}
double p = (double)z / (double)i;
printf("%.5lf", p);
return 0;
}
Средине¶
Прочитај текст задатка.
Просечна брзина представља однос укупног пређеног пута и укупног времена трајања пута.
Претпоставимо да је сваки део пута трајао исто време
Претпоставимо сада да је на сваком делу пута аутомобил прешао исто растојање
Приметимо да се у првом случају просечна брзина израчунава као аритметичка средина појединачних брзина, док се у другом случају израчунава као хармонијска средина појединачних брзина.
Израчунавање аритметичке средине (просечне вредности) свих бројева учитаних са
стандардног улаза приказали смо раније. У овом случају радимо са реалним
бројевима, па је имплементација још једноставнија јер не морамо да водимо
рачуна о конверзији типова. Што се тиче израчунавања хармонијске средине, она
се може израчунати тако што се израчуна збир реципрочних вредности свих брзина,
а затим се
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i = 0;
double x, z = 0.0, zr = 0.0;
while (scanf("%lf", &x) != EOF)
{
i++;
z += x;
zr += 1.0 / x;
}
double as = z / i;
double hs = i / zr;
printf("%.2lf\n%.2lf", as, hs);
return 0;
}
Просечан раст цена¶
Прочитај текст задатка.
Претпоставимо да је основна цена производа
Производ серије можемо израчунати алгоритмом у коме резултат иницијализујемо на
1 и множимо га редом једним по једним кофицијентом повећања
Корен можемо израчунати свођењем на степеновање pow
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
double x, p = 1.0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%lf", &x);
p *= (1.0 + x / 100.0);
}
double pp = 100.0 * (pow(p, 1.0 / n) - 1.0);
printf("%.2lf", pp);
return 0;
}
Производња малина¶
Прочитај текст задатка.
Производња сваког месеца чини геометриски низ тј. геометријску прогресију
(низ бројева у коме је количник сваког члана и њему претходног константан) и у
овом задатку потребно је одредити његов
Маринко прве године планира да произведе
У језику C степен броја се може израчунати функцијом pow
декларисаном у
заглављу math.h
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
double t, p;
scanf("%d%lf%lf", &n, &t, &p);
double x = t * pow(1 + p / 100, n - 1);
printf("%.2lf", x);
return 0;
}
Задатак може бити решен и уз помоћ петље у којој се производ иницијализује на
вредност
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
double t, p;
scanf("%d%lf%lf", &n, &t, &p);
double x = t;
for (int i = 1; i < n; i++)
x = x * (1 + p / 100);
printf("%.2lf", x);
return 0;
}
Сума низа бројева¶
Прочитај текст задатка.
Обележимо са
Једноставном анализом можемо закључити да је
Ако леву и десну страну претходне једнакости помножимо са
Извршимо множења на десној страни једнакости:
Сређивањем последњег израза добијамо
У језику C степен броја се може израчунати функцијом pow
декларисаном у
заглављу math.h
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
double a, q;
scanf("%d%lf%lf", &n, &a, &q);
double s = a * (1 - pow(q, n)) / (1 - q);
printf("%.5lf", s);
return 0;
}
Рецимо и да је збир било могуће одредити и тако што бисмо употребили алгоритам
сабирања елемената серије коришћењем петље, при чему бисмо сваки наредни
елемент могли инкрементално израчунати од претходног множењем са
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
double a, q;
scanf("%d%lf%lf", &n, &a, &q);
double x = a;
double s = a;
for (int i = 1; i < n; i++)
{
x *= q;
s += x;
}
printf("%.5lf", s);
return 0;
}
Једнакост растојања¶
Прочитај текст задатка.
Тражена тачка је аритметичка средина унетих тачака.
Докажимо претходно тврђење. Ако са
Ако се израз са десне стране пребаци на леву и када знак
што је еквивалентно са
Одавде се добија:
Према томе, тражена тачка је аритметичка средина унетих тачака:
Израчунавање аритметичке средине серије бројева већ смо разматрали раније. Потребно је израчунати збир елемената серије и затим га поделити са бројем елемената серије (који је у овом случају унапред познат).
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
double s = 0, x;
for (int i = 0; i < n; i++)
{
scanf("%lf", &x);
s += x;
}
printf("%.5lf", s / n);
return 0;
}
Тежиште¶
Прочитај текст задатка.
Већ смо разматрали тежиште скупа тачака на правој које је одређено као просечна
вредност координата тачака. Исто ће се догодити и код тачака у равни. Заиста,
обележимо тежиште са
Одатле следи:
Задатак се решава једноставним израчунавањем аритметичких средина координата
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
double zx = 0.0, zy = 0.0, x, y;
for (int i = 0; i < n; i++)
{
scanf("%lf%lf", &x, &y);
zx += x;
zy += y;
}
double tx = zx / n;
double ty = zy / n;
printf("%.5lf\n%.5lf", tx, ty);
return 0;
}