Једнодимензионални низови

До сада смо користили променљиве и константе чије вредности припадају одређеном типу података (int, float, double, char итд). Међутим, поред основних (неструктурираних) типова података постоје и изведени (структурирани) типови:

  • низови (arrays),
  • показивачи (pointers),
  • ниске тј. знаковни низови (strings),
  • структуре (structures),
  • и уније (unions).

Градиво првог разреда закључићемо управо са једнодимензионалним низовима (које се у литератури често називају векторима), док ће остало бити обрађенo у другом разреду.


Низ као изведени тип података припада групи хомогених типова, што значи да су сви његови елементи истог типа. Сваки елемент у низу има тачно одређену позицију на основу које му се додељује јединствени индекс. Вредност индекса првог елемента је 0, другог 1, трећег 2 итд. што значи да је индекс низа типа int. Елементи низа могу бити било ког типа података који постоји у програмском језику C, стим да сви морају бити истог типа. Сви елементи низа налазе се у суседним (секвенцијалним) меморијским локацијама. Пошто су сви елементи низа индексирани и истог типа, лако им је приступити, претражити их, сортирати их итд.

Декларација низа

Као и све друге променљиве које смо до сада користили и низове морамо декларисати пре употребе. Општи облик декларације низа изгледа овако:

типПодатака имеНиза[величинаНиза]

Правила за именовање низа не разликују се од правила за именовање променљивих које смо до сада користили. Величина (димензија) низа је целобројна позитивна константа типа int (цео број већи од нуле). На пример, декларацијом int A[10]; декларисали смо низ А који има десет елемената типа int.

Иницијализација низа

Иницијализацијом низа додељујемо елементима низа конкретне вредности. На пример:

int A[5] = { 10,21,13,44,25 }

Број елемената у витичастој загради мора бити једнак или мањи од задате величине низа. Уколико је број додељених вредности мањи од величине низа, на преостала места постављају се подразумеване вредности које зависе од типа, на пример за int је то 0, за float и double 0.0.

Приликом иницијализације низа, могуће је изоставити његову величину, што се назива делимична иницијализација. На пример:

double B[] = { 7.1,18.0,2.2,11.5 }

У првом примеру иницијализовали смо низ А који има пет целобројих елемената и то:

A[0]=10, A[1]=21, A[2]=13, A[3]=44, A[4]=25.

У другом примеру иницијализовали смо низ B који има 4 елемента типа double и то:

B[0]=7.1, B[1]=18.0, B[2]=2.2, B[3]=11.5

Обратите пажњу на индексе! У првом примеру у низу од пет елемената, први индекс је 0, а последњи 4, у другом примеру у низу од четири елемента, први индекст је 0, а последњи 3.

Конкретне вредности можемо додељивати и појединачним елементима низа. На пример:

int mojNiz[3];
mojNiz[0] = 19;
mojNiz[1] = 65;
mojNiz[2] = 37;

Иницијализација и испис

Напиши програм којим се иницијализује низ Ocene[15] са твојим оценама са полугодишта и потом исписују сви елементи низа ред по ред.

#include<stdio.h>
main()
{
	int i, Ocene[15] = { 3,4,5,3,3,5,3,4,5,3,4,3,4,5,3 };
	printf("Ovo su moje ocene sa polugodista:\n");
	for (i = 0; i < 15; i++)
		printf("%d\n",Ocene[i]);
}

Поправљање оцена

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

#include<stdio.h>
main()
{
	int i, Ocene[15] = { 3,4,5,3,3,5,3,4,5,3,4,3,4,5,3 };
	printf("Ovo su moje ocene sa polugodista:\n");
	for (i = 0; i < 15; i++)
		printf("%d\n",Ocene[i]);
	printf("Ovo su moje popravljene ocene:\n");
	for (i = 0; i < 15; i++)
	{
		if (Ocene[i] < 5) 
			Ocene[i]++;
		printf("%d\n", Ocene[i]);
	}
}

Плате радника

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

Овај проблем можемо лако решити тако што радне сате радника упишемо у низ реалних бројева S[i], цену радног сата учитамо у реалну променљиву C и затим формирамо низ реалних бројева са платама по формули P[i]=S[i]*C.

#include <stdio.h>
main()
{
	int i, n;
	double S[100], P[100], c;
	printf("Koliko imate zaposlenih?: ");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		printf("Unesite broj radnih sati %d. radnika: ", i + 1);
		scanf("%lf", &S[i]); 
	}
	printf("Kolika je cena radnog sata?: ");
	scanf("%lf", &c);
	for (i = 0; i < n; i++)
	{
		P[i] = S[i] * c;
		printf("Plata %d. radnika je %.2lf RSD.\n", i + 1, P[i]);
	}
}

Често ћете у литератури уместо назива једнодимензионални низ наићи на назив вектор јер се одређена величина, односно вектор положаја у n-димензионалном простору, може представити низом од n елемената, где сваки елемент низа представља одговарајућу координату вектора положаја. На пример, вектор положаја тачке у 3D простору се може представити реалним низом од три елемента, при чему би први елемент означавао x, други y, а трећи z координату вектора. То значи и да се над низовима могу вршити векторске операције као што су сабирање вектора, векторски производ, итд.


Скаларни збир и производ

Напишите програм који у који се уносе два низа A и B који су исте дужине n, па потом израчунава и исписује њихов скаларни збир и производ по формулама S[i] = A[i] + B[i] и p = A[1]*B[1] + A[2]*B[2] + … + A[n]+B[n]

#include <stdio.h>
main()
{
	int i, n;
	double A[100], B[100], S[100], p;
	printf("Koliko elemenata?: ");
	scanf("%d", &n);
	printf("Unesite elemente niza A\n");
	for (i = 0; i < n; i++)
	{
		printf("Unesite A[%d]: ", i);
		scanf("%lf", &A[i]);
	}
	printf("Unesite elemente niza B\n");
	for (i = 0; i < n; i++)
	{
		printf("Unesite B[%d]: ", i);
		scanf("%lf", &B[i]);
	}
	printf("Skalarni zbir:\n");
	for (i = 0; i < n; i++)
	{
		S[i] = A[i] + B[i];
		printf("S[%d]: %.2lf\n", i, S[i]);
	}
	p = 0;
	for (i = 0; i < n; i++)
		p += A[i] * B[i];
	printf("Skalarni proizvod: %.2lf\n", p);
}