Задаци: Итерација кроз правилне серије бројева¶
Алгоритми и програми у програмском језику C: Итерација кроз правилне серије бројева.
Бројеви од a до b¶
Прочитај текст задатка.
Потребно је исписати све целе бројеве од a
до b
и да би се то могло урадити
потребно је употребити петљу.
Најприроднији начин је да се употреби петља for
. Користићемо петљу у којој
ћемо бројачкој променљивој i
додељивати редом вредности од најмање (то је
вредност a
) до највеће (то је вредност b
) и у сваком пролазу кроз петљу
исписивати њену вредност. У иницијализацији петље вредност променљиве i
поставићемо на a
, у услову ћемо проверавати да ли важи i <= b
, док ћемо у
кораку петље вредност променљиве i
увећавати за један.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
for (int i = a; i <= b; i++)
printf("%d\n", i);
return 0;
}
Свака петља for
може се једноставно изразити и помоћу петље while
.
Иницијализацију i = a
потребно је извршити непосредно пре петље while
,
услов петље је i <= b
, док се корак i++
, i += 1
или i = i + 1
додаје
као последња наредба у телу петље.
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
int i = a;
while (i <= b)
{
printf("%d\n", i);
i++;
}
return 0;
}
Задатак је могуће решити и исписивањем тренутне вредности променљиве a
у
петљи while
, при чему се при сваком проласку кроз петљу вредност променљиве
a
увећа за 1, све док a
не достигне вредност већу од b
. Мана таквог
решења је да након исписа бројева, оригинални интервал
Бројање у игри жмурке¶
Прочитај текст задатка.
Бројачку променљиву потребно је иницијализовати на i += 5
или i = i + 5
). Наравно, ово је могуће реализовати било уз
помоћу петље for
било петље while
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x;
scanf("%d", &x);
for (int i = 5; i <= x; i += 5)
printf("%d\n", i);
return 0;
}
Још један могући приступ (додуше, мање ефикасан од претходног), је да се у
петљи набрајају сви бројеви између
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x;
scanf("%d", &x);
for (int i = 5; i <= x; i++)
if (i % 5 == 0)
printf("%d\n", i);
return 0;
}
Троцифрени парни бројеви¶
Прочитај текст задатка.
Потребно је исписати све троцифрене парне бројеве редом, почевши од најмањег
троцифреног парног броја из целобројног интервала
Само набрајање бројева можемо извршити било помоћу петље for
, било помоћу
петље while
. У оба случаја бројачку променљиву ћемо иницијализовати на
почетну вредност do
, јер је то резервисана реч у већини програмских језика.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
int x = a > 100 ? a : 100;
int y = b < 999 ? b : 999;
if (x % 2 != 0)
x++;
if (y % 2 != 0)
y--;
for (int i = x; i <= y; i += 2)
printf("%d\n", i);
return 0;
}
Други начин (мање ефикасан од претходног) је заснован на филтрирању. Могуће је
да се итерација (набрајање) врши редом по свим бројевима из целобројног
интервала
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
for (int i = 100; i <= 999; i++)
if (a <= i && i <= b && i % 2 == 0)
printf("%d\n", i);
return 0;
}
Одбројавање уназад¶
Прочитај текст задатка.
Потребно је исписати све бројеве од for
или помоћу петље while
. Ако користимо петљу for
, тада ћемо
променљивој for
), додељивати редом вредности
од највеће (тј. од вредности i--
, i -= 1
или i = i - 1
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
for (int i = a; i >= 0; i--)
printf("%d\n", i);
return 0;
}
Решење са петљом while
се може имплементирати и без помоћне бројачке
промељиве (тако што се умањује вредност a
).
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
while (a >= 0)
{
printf("%d\n", a);
a--;
}
return 0;
}
Најаве емисије у правилним временским интервалима¶
Прочитај текст задатка.
Рад са временом се олакшава ако се преведе дато време у број минута протеклих
од поноћи и обратно. Тако ћемо времена почетка и завршетка филма изразити у
минутима. Времена приказивања најаве ћемо израчунати и исписати у оквиру петље
у којој се користи променљива која представља време текуће најаве (опет у
минутима). Полазећи од времена почетка филма у сваком кораку петље приказаћемо
текуће време најаве и увећати га за интервал у минутима, док не престигне време
завршетка филма. Наравно, ово је могуће имплементирати било петљом for
, било
петљом while
.
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int hp, mp, hk, mk, v;
scanf("%d%d%d%d%d", &hp, &mp, &hk, &mk, &v);
int p = hp * 60 + mp;
int k = hk * 60 + mk;
for (int i = p; i <= k; i += v)
{
int hi, mi;
hi = i / 60;
mi = i % 60;
printf("%d:%d\n", hi, mi);
}
return 0;
}
Подела интервала на једнаке делове¶
Прочитај текст задатка.
Потребно је прво одредити равномерно растојање for (double x = a; x <= b; x += dx)
.
Међутим, због непрецизности до којих може доћи при раду са реалним бројевима,
могуће је да се вредност растојања dx = (b-a) / (n-1)
заправо садржи вредност која је мало већа
од стварне вредности растојања x
у последњој итерацији тек за мало премаши вредност променљиве
b
и да се због тога прескочи исписивање десног краја интервала тј. тачке
Због тога је ипак пожељно итерацију контролисати бројачем помоћу којег се броје
тачке које су исписане, тј. помоћу петље облика for (int i = 0; i < n; i++)
.
Једна могућност је да се у реалној променљивој
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
double a, b;
scanf("%d", &n);
scanf("%lf%lf", &a, &b);
double dx = (b - a) / (n - 1);
double x = a;
for (int i = 0; i < n; i++)
{
printf("%.5lf\n", x);
x += dx;
}
return 0;
}
Може се приметити да су тражени бројеви
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n;
double a, b;
scanf("%d", &n);
scanf("%lf%lf", &a, &b);
double dx = (b - a) / (n - 1);
for (int i = 0; i < n; i++)
printf("%.5lf\n", a + i * dx);
return 0;
}
Геометријска серија¶
Прочитај текст задатка.
Потребно је исписати све природне бројеве из интервала
Задатак ћемо решити тако што ћемо у променљивој коју ћемо мењати кроз петљу
одржавати текућу вредност ове серије бројева. Променљиву ћемо иницијализовати
на вредност while
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
int i = a;
while (i <= b)
{
printf("%d\n", i);
i *= 3;
}
return 0;
}
Приметимо да се јасно могу идентификовати четири основне целине петље:
иницијализација (бројачка променљива се иницијализује на вредност for
.
Приметимо и да је серија бројева који се исписују геометријска серија бројева,
док класична петља генерише аритметичку серију - разлика је заправо само у томе
да ли се у кораку врши увећавање сабирањем или множењем са датом вредношћу (да
ли се користи +=
или оператор *=
).
Приметимо и да се сваки наредни елемент серије израчунава само на основу
претходног (није потребно памтити све елементе од почетка). За овакве серије
кажемо да су рекурентне (за ову серију важи да је
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
for (int i = a; i <= b; i *= 3)
printf("%d\n", i);
return 0;
}