Задаци: Учитавање серија бројева¶
Алгоритми и програми у програмском језику C: Учитавање серија бројева.
Збир n бројева¶
Прочитај текст задатка.
Пошто је познат укупан број ponovi n puta
, извршавање наредби for (int i = 0; i < n; i++)
.
За одређивање збира учитаних бројева користимо променљиву zbir
у којој редом
акумулирамо збир тренутно прочитаних бројева са стандардног улаза. Вредност
променљиве zbir
иницијализујемо на 0. Након тога, кроз петљу пролазимо zbir
ће редом имати вредности
Збир серије бројева представља једну од основних њених статистика. У каснијим задацима показаћемо како можемо израчунавати и друге важне статистике (број елемената, производ, просек, минимум, максимум итд.).
Предложено решење задатка
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, broj, zbir = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &broj);
zbir += broj;
}
printf("%d", zbir);
return 0;
}
Читање до нуле¶
Прочитај текст задатка.
Задатак ћемо решити помоћу разних врста петљи. У свим случајевима услов за излазак из петље је када је учитани број једнак 0.
У решењу помоћу петље while
први број учитавамо пре петље, а у телу петље
прво увећавамо бројач за 1 а затим учитавамо следећи број. На овај начин 0 као
последњи учитани број неће довести до промене бројача.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i = 0, n;
scanf("%d", &n);
while (n != 0)
{
i++;
scanf("%d", &n);
}
printf("%d", i);
return 0;
}
Ако користимо петљу do-while
сва учитавања ћемо вршити у телу петље и при
томе увећавати бројач за 1. На овај начин ћемо избројати све бројеве укључујући
и 0, па се након изласка из петље вредност бројача умањује за 1.
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i = 0, n;
do
{
scanf("%d", &n);
i++;
} while (n != 0);
i--;
printf("%d", i);
return 0;
}
Још једна могућност је да се испитивање услова прекида петље врши унутар њеног
тела, непосредно након учитавања броја. То се може остварити тиме што се креира
бесконачна петља облика while (1)
, чији је услов стално испуњен, а унутар
чијег тела се налази наредба if (n == 0) break;
.
Предложено решење задатка (3)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i = 0, n;
while (1)
{
scanf("%d", &n);
if (n == 0)
break;
i++;
}
printf("%d", i);
return 0;
}
Читање до краја улаза¶
Прочитај текст задатка.
И у овом задатку врши се пребројавање серије елемената. Бројач се иницијализује на нулу и увећава се за сваки учитани број. Кључно питање је како организовати петљу у којој се учитавају бројеви све док се не достигне крај улаза.
У програмском језику C, ако је читање било успешно, функција scanf()
враћа
број успешно попуњених ставки листе аргумената функције. Ако се деси грешка
приликом читања или крај датотеке (енгл. end-of-file), функција scanf()
враћа EOF
(притисaк тастера CTRL+Z
на Windows оперативним системима,
односно CTRL+D
на Linux оперативним системима). Тако се читање до краја улаза
може постићи петљом облика while (scanf("%d", &vrednost) != EOF)
.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i = 0, n;
while (scanf("%d", &n) != EOF)
i++;
printf("%d", i);
return 0;
}
Читање до -1 или до n-тог броја¶
Прочитај текст задатка.
Задатак захтева израчунавање збира квадрата учитаних елемената. То се ради
веома слично израчунавању збира елемената, једино што се на збир уместо сваког
учитаног броја
Један начин да се то уради је да се организује петља у којој се учитава break
), а ако
није, да се збир увећа за квадрат учитаног броја. Напоменимо да се увећавање
не мора вршити у грани else
, већ може и након наредбе гранања - ако је услов
да је учитан број break
, петља ће се
прекинути и неће се ни стићи до наредбе иза наредбе гранања.
Предложено решење задатка (1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, x, zbir = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
if (x == -1)
break;
zbir += x * x;
}
printf("%d", zbir);
return 0;
}
Један начин је да услов изласка из петље обухвати оба услова (да је број for
или петљу
while
). Да би услов да је
Предложено решење задатка (2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, i = 0, x = 0, zbir = 0;
scanf("%d", &n);
while (i < n && x != -1)
{
scanf("%d", &x);
i++;
if (x != -1)
zbir += x * x;
}
printf("%d", zbir);
return 0;
}
Модификација овог решења уместо наредбе break
може да користи променљиву
kraj
којом се одређује да ли је учитана вредност 0
као и да је учитано мање од kraj
се поставља на 1
, а у супротном се збир увећава за квадрат учитаног
броја.
Предложено решење задатка (3)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, x, zbir = 0, kraj = 0;
scanf("%d", &n);
for (int i = 0; !kraj && i < n; i++)
{
scanf("%d", &x);
if (x == -1)
kraj = 1;
else
zbir += x * x;
}
printf("%d", zbir);
return 0;
}