Циклуси (for)

Уколико решавамо проблем у програмирању који захтева да се неки блок наредби изврши више пута потребне су нам наредбе понављања које називамо циклусима или петљама, односно програмима са цикличном структуром. Једно извршавање блока наредби у оквиру петље назива се итерација. У програмском језику C постоје три наредбе које можемо користити за креирање циклуса: for, while и do-while. На овој страници обрадићемо наредбу for.

Синтакса наредбе for изгледа овако:

for(inicijalizacija; uslov; inkrementacija)
{
	blok naredbi
}

Прво се извршава иницијализација, па се затим проверава тачност услова. Уколико је вредност услова тачна, односно различита од 0, улази се у блок наредби који је наведен у циклусу. Када се изврше све наредбе извршава се инкрементација* и ток програма се враћа на поновно испитивање услова. Описани процес се понавља све док је услов испуњен. Ако услов није испуњен, односно ако је његова вредност једнака нули, излази се из циклуса.

*део за инкрементацију не мора увек да значи повећање вредности неке променљиве за један, то може да буде произвољно повећање или смањење вредности променљиве, а најчешће се мења вредност променљиве која се појављује у услову.


Испис бројева

Напишите програм који учитава вредност целобројне променљиве n и на екрану исписује бројеве у интервалу од 1 до n.

#include <stdio.h>
main()
{
	int i, n;
	printf("Unesite n: ");
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
		printf("%d\n", i);
}

Испис непарних

Напишите програм који на екрану исписује непарне бројеве у интервалу од 1 до n.

#include <stdio.h>
main()
{
	int i, n;
	printf("Unesite n: ");
	scanf("%d", &n);
	for (i = 1; i <= n; i+=2)
		printf("%d\n", i);
}

Сума бројева

Напишите програм који израчунава суму бројева у интервалу од 1 до n.

#include <stdio.h>
main()
{
	int i, n, suma;
	printf("Unesite n: ");
	scanf("%d", &n);
	suma = 0;
	for (i = 1; i <= n; i++)
		suma += i;
	printf("Suma brojeva u intervalu od 1 do %d je %d", n, suma);
}

Производ дељивих

Напишите програм који израчунава производ бројева који су дељиви са 2 а нису дељиви 3 у интервалу од 1 до n.

#include <stdio.h>
main()
{
	int i, n, proiz;
	printf("Unesite n: ");
	scanf("%d", &n);
	proiz = 1;
	for (i = 2; i <= n; i += 2)
		if (i % 3 != 0)
			proiz *= i;
	printf("Proizvod brojeva u intervalu od 1 do %d koji\n", n);
	printf("su deljivi sa 2 a nisu deljivi sa 3 je %d", proiz);
}

Обратите пажњу да смо у претходном задатку навели почетну вредност променљиве suma = 0, а у овом задатку proiz = 1. Увек водите рачуна да не множите/делите са нулом!


Степеновање

Ако је х позитиван реалан број, а у позитиван цео број, напиши програм који израчунава вредност броја х подигнутог на степен у. Забрањено је користити библиотечке функције за степеновање. Резултат приказати као реалан број са два децимална места.

#include <stdio.h>
main()
{
	int i, y;
	double x, rez;
	printf("Unesite pozitivan realan broj (x): ");
	scanf("%lf", &x);
	printf("Unesite stepen (y): ");
	scanf("%d", &y);
	if (x > 0 && y > 0)
	{
		rez = 1;
		for (i = 1; i <= y; i++)
			rez *= x;
		printf("Broj %.2lf podignut na stepen %d = %.2lf", x, y, rez);
	}
	else
		printf("Pogresan unos!");
}

Просек оцена ученика

Напишите програм који израчунава и исписује просек n унетих оцена ученика. Резултат прикажите као број са две децимале.

#include <stdio.h>
main()
{
	int i, n, ocena;
	double suma, prosek;
	printf("Koliko imate ocena: ");
	scanf("%d", &n);
	suma = 0;
	for (i = 1; i <= n; i++)
	{
		printf("Unesite ocenu: ");
		scanf("%d", &ocena);
		suma += ocena;
	}
	prosek = suma / n;
	printf("Prosek unetih ocena je %.2lf", n, prosek);
}

Претходни програм јесте исправан, али у реалности ученик који има јединице аутоматски има недовољан успех. Како би преправили претходни програм да задовољи следећи критеријум – ако није унешена ни једна јединица исписати просек унетих оцена, а ако јесте унешена макар једна јединица исписати да ученик има недовољан успех.

#include <stdio.h>
main()
{
	int i, n, ocena, nedovoljan;
	double suma, prosek;
	printf("Koliko imate ocena: ");
	scanf("%d", &n);
	suma = 0;
	nedovoljan = 0;
	for (i = 1; i <= n; i++)
	{
		printf("Unesite ocenu: ");
		scanf("%d", &ocena);
		suma += ocena;
		if (ocena == 1)
			nedovoljan = 1;
	}
	if (nedovoljan == 0)
	{
		prosek = suma / n;
		printf("Prosek unetih ocena je %.2lf", prosek);
	}
	else
		printf("Ucenik ima nedovoljan uspeh!");
}

Ситуација је у реалности заправо још компликованија. Ако ученик има све позитивне оцене и јединицу из владања, њему се рачуна просек оцена (са закљученом јединицом из владања). Захтев је сада следећи:

  • израчунати просек n унетих оцена ако су оцене од прве до претпоследње оцене позитивне – последња оцена може да буде и позитивна и недовољна;
  • ако постоји макар једна недовољна оцена од прве до претпоследње оцене не рачунати просек него исписати да ученик има недовољан успех + број недовољних оцена.
#include <stdio.h>
main()
{
	int i, n, nedovoljan;
	double ocena, suma, prosek;
	printf("Koliko imate ocena: ");
	scanf("%d", &n);
	suma = 0; nedovoljan = 0;
	for (i = 1; i < n; i++)
	{
		printf("Unesi ocenu: ");
		scanf("%lf", &ocena);
		if (ocena == 1)
			nedovoljan += 1;
		suma += ocena;
	}
	printf("Unesi ocenu iz vladanja: ");
	scanf("%lf", &ocena);
	suma += ocena;
	if (nedovoljan == 0)
	{
		prosek = suma / n;
		printf("Prosek ocena je: %.2lf", prosek);
	}
	else
	{
		printf("Ucenik je NEDOVOLJAN\n");
		printf("Ucenik ima %d nedovoljnih ocena", nedovoljan);
	}
}

Најлошији контролни

Ученици током школске године раде n контролних задатака. Наставник је обећао да ће приликом закључивања оцена сваком ученику занемарити једну најслабију оцену. Напиши програм који учитава n оцена једног ученика, занемарује једну најслабију оцену, па потом исписује просечну оцену заокружену на две децимале.

#include <stdio.h>
main()
{
	int i, n, ocena, min;
	double suma, prosek;
	printf("Koliko je bilo kontrolnih zadataka: ");
	scanf("%d", &n);
	printf("Unesite 1. ocenu: ");
	scanf("%d", &ocena);
	min = ocena;
	suma = ocena;
	for (i = 2; i <= n; i++)
	{
		printf("Unesite %d. ocenu: ", i);
		scanf("%d", &ocena);
		suma += ocena;
		if (min > ocena)
			min = ocena;
	}
	suma = suma - min;
	prosek = suma / (n - 1);
	printf("Prosecna ocena bez najslabije je %.2lf", prosek);
}

Производ за динар

У продавници је у току акција у којој се купцима који купе више од једног производа нуди да један најјефтинији производ добију за један динар. Напиши програм који одређује износ рачуна купца у току трајања акције.

#include <stdio.h>
main()
{
	int i, n;
	double cena, min, racun;
	printf("Koliko proizvoda kupujete: ");
	scanf("%d", &n);
	if (n > 1)
	{
		printf("Unesite cenu 1. proizvoda: ");
		scanf("%lf", &cena);
		min = cena;
		racun = cena;
		for (i = 2; i <= n; i++)
		{
			printf("Unesite cenu %d. proizvoda: ", i);
			scanf("%lf", &cena);
			racun += cena;
			if (min > cena)
				min = cena;
		}
		racun = racun - min + 1;
		printf("Vas racun je umanjen za %.2lf dinara\n", min-1);
		printf("Vas racun sada iznosi %.2lf dinara", racun);
	}
	else
	{
		printf("Unesite cenu proizvoda: ");
		scanf("%lf", &cena);
		printf("Vas racun nece biti umanjen\n");
		printf("Vas racun iznosi %.2lf dinara", cena);
	}
}

Скијашки скокови

На такмичењу у скијашким скоковима поред удаљености коју скакач прескочи оцењује се и стил скакача. N судија оцењују стил скакача оценама од 0 до 20. Затим се од свих добијених оцена избришу једна најмања и једна највећа. Напиши програм којим се одређује коначна оцена стила скакача која представља просек преосталих оцена заокружен на две децимале.


Најтоплији дан

Напишите програм којим се одређује редни број најтоплијег дана у седмици ако се уносе дневне температуре за сваки дан почевши од понедељка. Ако више дана има исту температуру која је највиша у седмици, треба исписати редни број првог дана који је имао највишу температуру.

Advertisements