• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

Прашање поврзано со C++ (еднодимензионална низа)

  • Ја почнал/а темата
  • #1

eldiablo

Баниран/a
21 октомври 2008
820
48
Задачата е многу лесна. Да се најде најмалиот број во низата и неговиот реден број, за произволен број на елементи на низата. Задачата успешно ја решив, меѓутоа имам едно прашање:
Код:
#include <iostream>
using namespace std;

void main()
{
	int n,koje,i,a[20],najmal;
	cout<<"Vnesi go brojot na elementite na nizata: ";
	cin>>n;

	for (i=0;i<n;i++){
		cout<<"a["<<i<<"]=";
		cin>>a[i];
	}
	najmal=a[0];	
	[B]koje=0;[/B]
	for (i=0;i<n;i++){

		if (a[i] < najmal) 
		{
			najmal=a[i];
			[B]koje=i;[/B]
		}

	}

	cout<<"Najmaliot broj vo nizata e: "<<najmal<<" so reden broj: "<<koje;
}
Зошто морам променливата koje да ја иницијализирам на 0, пред for циклусот? Благодарам однапред.
 

dejan_bt

Intern
9 декември 2007
35
0
Кога се декларираат променливи треба и да се иницијализирааат односно да им се даде почетна вредносто поради тоа што меморискиот простор кој што му се доделува не е 0 туку некоја вредност која што претходно била запишана на таа мемориска локација. Поради тоа пожелно е при декларирање и да се иницијализираат променливите. Во твојот случај и не е баш некој проблем доколку се изостави које = 0, но доклоку које се користи како индекс при работа со низи може да направи проблеми.
 

''TcM>>

Intern
6 јануари 2008
961
39
Kako sto kaza dejan_bt taka e. A mozes i sam da probas na primer naprai si vaka:
Код:
int main()
{
    int i,m,n;
    cout<<i<<endl<<m<<endl<<n<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
I ke vidis deka im dodeluva random vrednosti... e zatoa!
 

Garfield

Intern
9 декември 2007
277
5
Во твојот код koje мора да биде иницијализиран на 0 за во случај ако во низата а a[0] да е најмал, па и кога ќе печатиш да го имаш неговиот реден број т.е 0.

Инаку исто можеш да го искористиш и i (бидејќи ти е дефинирано надвор од for циклусот)наместо koje, значи koje воопшто не ти е потребен.
 

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
За разлика од некои други програмски јазици, каде што, доколку на променливата не и доделиш вредност, таа би претставувала 0, во c++ не е така. На секоја променлива треба да и се додели вредност.
Додека кај Visual basic на пример, доколку не доделиш променлива, таа се зема за 0.

Конкретен едноставен пример:

#include <iostream.h>

int main() {
int godini;
cout << "Jas imam " << godini << endl;
return 0;
}

Бидејќи godini не го деклариравме, веројатно очекуваш тој да биде 0. Но тестирај, ќе видиш дека самото ќе се додели број различен од 0. Кај мене на пример се печати: Јас имам 2.


Доколку добро го разбрав прашањето, ова е причината.


ЕДИТ: DAAAMN.. Каснам со саати.. :lut2:
Се извинувам што ова испадна како повторување од предходните.. Но бидејќи ми беше веќе отворен предходно табов и место да ја освежам страницава, директно постирав. Не се надевав дека некој веќе постирал..
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Многу грешни заклучоци или претпоставки.

Компајлерот на C++ го следи целиот код и гледа дали ти некаде понатаму ја иницијализираш koje. Штом таа инцијализација се наоѓа во некој условен блок, C++ зема претпоставка и дека тој услов никогаш нема да биде исполнет и променливата ќе остане неиницијализирана, а понатаму треба да се печати. Секоја променлива чија вредност понатаму се користи во некоја пресметка или функција, мора барем еднаш да биде сигурно иницијализирана во претходниот дел од кодот.

@Garfield
Не може да користи i, i секогаш при излегување од циклусот ќе има вредност n.
 

TataMata

Intern
13 јуни 2008
115
1
Мала препорака.

Во суштина не постои еднодимензионална низа во C и донекаде C++ тоа е само обично парче меморија. Е сега, што е препораката. Избегнувајте користење на „стандардната“ низа, или кога тогаш ќе си пукате со сачмарка во нозе. Користете std::vector!

Сега за прашањето. Зошто мора koje да се иницијализира на нула? Па зошто користиш т.н. стек променлива (во стандардот се вика локална променлива, може да грешам). Stack променлива се иницијализира онака како што ќе и текне на било каква вредност. Освен ако нема посебен конструктор. Но тоа е друга тема на муабет.

Ако променливата е глобална (надвор од main) тогаш се иницијализира на нула.
 

''TcM>>

Intern
6 јануари 2008
961
39
@TataMata, da ti kazam skroz na skroz me zbuni... :))
Na primer ova prv pat go gleam: std::vector!
A kako drugo, pa niza i stack ne e isto... sosema razlicno/.
 
  • Ја почнал/а темата
  • #10

eldiablo

Баниран/a
21 октомври 2008
820
48
Прво, благодарност за постовите. Меѓутоа, мислам дека повеќето го промашиле она што всушност јас го прашувам. Видете, мене не ми е јасно зошто претходно да го иницијализирам koje, кога веќе го имам иницијализирано внатре во циклусот како koje=i; па i би требало да добие почетна вредност 0, бидејќи во for циклусот нагласувам for(i=0;i<n;i++)

Многу грешни заклучоци или претпоставки.
Компајлерот на C++ го следи целиот код и гледа дали ти некаде понатаму ја иницијализираш koje. Штом таа инцијализација се наоѓа во некој условен блок, C++ зема претпоставка и дека тој услов никогаш нема да биде исполнет и променливата ќе остане неиницијализирана, а понатаму треба да се печати. Секоја променлива чија вредност понатаму се користи во некоја пресметка или функција, мора барем еднаш да биде сигурно иницијализирана во претходниот дел од кодот.
Ова мислам дека веќе има логика. Значи проблемот се наоѓа во компајлерот, тоа ме интересираше. Добро овака сега, имам уште една недоумица (ситна, да не отворам нова тема). Се работи за многу истотака основна работа, односно декларирање на бројачот во for циклусот. На пр.
Код:
#include <iostream>
#define SIZE 5
using namespace std;

void main()

{	int a[SIZE][SIZE],r,k;
	cout<<"Vnesete go brojot na redicite na matricata: ";
	cin>>r;
	cout<<"Vnesete go brojot na kolonite na matricata: ";
	cin>>k;
	//Inicijalizacija na matricata
	for ([B]int i=0[/B];i<r;i++){
	
	cout<<"Vnesi gi elementite na: "<<i<<"-tata redica:"<<endl;
	
	for([B]int j=0[/B];j<k;j++){

		cout<<"a["<<j<<"]=";
		cin>>a[i][j];

	}

	}

	//Pecatenje na matricata

	cout<<"Matrica "<<r<<"x"<<k<<" e: ";

	for (i=0;i<r;i++){
		
		cout<<endl;

			for (j=0;j<k;j++)

			cout <<a[i][j]<<" ";

	}

	cout<<endl;
}
Во случајов бројачите i и j ги иницијализирав во for циклусот. Меѓутоа кога компајлирам ми ја дава следната грешка:
Код:
c:/program files/microsoft visual studio/myprojects/programiranje/dvodimenzionalnaniza proizvolna tablica za mnozenje.cpp(34) : error C2065: 'j' : undeclared identifier
Ми покажува дека не ми е деклариран j и тоа во последниот for циклус каде што имам искористено j.

А чудно не дава грешка за i. Дали повторно ова има некаква врска со компајлерот?

Благодарам однапред.
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Дали си сигурен дека не дава грешка за i?

Треба да дава грешка за двата. Штом i и j ги декларираш во for циклус, односно во
Код:
for (int i=0;i<r;i++)
i може да се користи само во блокот со код за for циклусот, односно по завршување на for циклусот завршува и животниот век на променливата.

Можеш да ја декларираш i променливата на почеток на програмата и ќе можеш да ја користиш низ целата програма.
 
  • Ја почнал/а темата
  • #12

eldiablo

Баниран/a
21 октомври 2008
820
48
Да, сигурен сум. Еве го целиот код од компајлирањето:
Код:
--------------------Configuration: ispituvanjeniza - Win32 Debug--------------------
Compiling...
ispituvanjeniza.cpp
C:Program FilesMicrosoft Visual StudioMyProjectsProgramiranjeispituvanjeniza.cpp(34) : error C2065: 'j' : undeclared identifier
Error executing cl.exe.

ispituvanjeniza.obj - 1 error(s), 0 warning(s)
Инаку сега ми е јасно. Благодарност до тебе.
Вака, имам молба до модераторите да го променат насловот на темата. Посоодветен наслов ќе биде „Прашања поврзани со основни работи во C++“.
Инаку имам уште неколку прашања до вас. Како се запишува логичкиот оператор негација во C++?
Истотака дали постои форматирано печатење како во Pascal (на пр. a:5:2), пред променливата да има 5 празни места, и вредноста на променливата да биде со 2 децимали?
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Негација се изразува со извичник пред променливата, ако мислиш на тоа во Pascal што е not(promenliva).

Форматирано печатење постои, треба само да вклучиш <iomanip> (#include <iomanip>) во почеток на кодот. Потоа, ако сакаш на пример променливата var да се печати во 8 полиња користиш
Код:
cout << setw(8) << var;
ако сакаш да да се печати во 8 полиња со 3 децимали
Код:
cout << setw(8) << setprecision(3) << var;
 

''TcM>>

Intern
6 јануари 2008
961
39
Код:
Како се запишува логичкиот оператор негација во C++?
Епа вака на пример:
while(nekojapromenliva != 99) ...ratatatata :p
nego znakot za negacija e "!=" :D
 
  • Ја почнал/а темата
  • #15

eldiablo

Баниран/a
21 октомври 2008
820
48
Благодарам уште еднаш. И ова готово јасно ми стана. Сега ми остана уште нешто. Никако не ми е јасно како работи оваа програма:
Код:
#include <iostream>
using namespace std;

void main()
{
char znak;
int brojznaci=0;
cin.get(znak);
do {
brojznaci+=1;
cin.get(znak);
}
while (znak!='\n');
cout<<brojznaci;
}
Значи јасно ми е за што служи. Служи за пресметување на бројот на внесените знаци. Една работа не ми е јасна, за што служи cin.get(znak), на почетокот пред да се изврши циклусот (знам дека е за внес, ама нели имаме во циклусот внатре cin.get(znak)?) . Зошто во do while циклусот користиме cin.get(znak) ? Дали за да ги печати знаците во еден ред? Зошто не cin>>znak ? Зошто не се печати истото со cin>>znak?
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
На кратко, програмава ти пресметува број на внесени знаци од тастатура, се додека не се внесе буквата n.

cin.get(znak) чита внесен карактер од тастатура и го сместува во променливата znak.
 
  • Ја почнал/а темата
  • #17

eldiablo

Баниран/a
21 октомври 2008
820
48
А зошто не го користиме cin>>znak ? И не ми е јасно зошто пред do while циклусот имаме уште едно cin.get(znak). Инаку мала исправка во кодот треба да биде \n, или празно место.
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Пред циклусот имаш cin.get() не знам од која причина, така го замислил кодот програмерот и така го напишал :)

Штом има исправка во кодот, има исправка и во решението, односно се бројат сите карактери пред да се удри Enter ('\n' е знак за нов ред, return).
 

Elektrikz

Intern
21 септември 2008
473
12
Велес - Скопје
не сум користел досега cin.get()...но мислам дека може со cin наместо со cin.get()..

знам дека cin.getline() (или како што видов во VC++ '08 го смениле во cin.gets_s) е команда која чита зборови (вклучувајќи и празни места,па ќе му дојде дека чита реченици...) додека cin чита до првото празно место...

п.с. не ме бива за објаснување... :D
 
  • Ја почнал/а темата
  • #20

eldiablo

Баниран/a
21 октомври 2008
820
48
Пред циклусот имаш cin.get() не знам од која причина, така го замислил кодот програмерот и така го напишал :)

Штом има исправка во кодот, има исправка и во решението, односно се бројат сите карактери пред да се удри Enter ('n' е знак за нов ред, return).
Со cin.get() пред циклусот ако внесам 5 карактери, ќе ми отпечати 5, а доколку го избришам cin.get() пред циклусот, ми печати 6 за внесени 5 карактери.

не сум користел досега cin.get()...но мислам дека може со cin наместо со cin.get()..

знам дека cin.getline() (или како што видов во VC++ '08 го смениле во cin.gets_s) е команда која чита зборови (вклучувајќи и празни места,па ќе му дојде дека чита реченици...) додека cin чита до првото празно место...

п.с. не ме бива за објаснување... :D
Да, сега баш прочепкав нешто и видов дека cin чита до првото празно место, и некој останати карактеристики.
 

TataMata

Intern
13 јуни 2008
115
1
@TataMata, da ti kazam skroz na skroz me zbuni... :))
Na primer ova prv pat go gleam: std::vector!
Па од искуство ти кажувам. std::vector е да речам, динамичка низа. Може да работи како и обична низа (има operator[]), елементите се секвенцијално во меморија, имаш (ако сакаш) контрола на пристапот (добро е за дебагирање). Низа на стероиди.
 
  • Ја почнал/а темата
  • #22

eldiablo

Баниран/a
21 октомври 2008
820
48
А како да направам елементите од низата (еднодимензионална) да примаат реални броеви (т.е со децимали)? Пробав со double a[10]; ми дава грешка.
 

maximilian

Gaining Experience
26 март 2008
1,064
74
Не би требало со double a[10] да ти дава грешка. Провери да не е нешто друго грешка во тој ред :zbunet:
 

maximilian

Gaining Experience
26 март 2008
1,064
74
Е што би била разликата? И double и float ти се тип на реални броеви, ако не работи на едното не би требало да работи и на другото. Него јас мислам нешто друго е проблемот.

@eldiablo:
Најарно остави го цел код тука ако сакаш да го погледнеме, да видиме што е фрката
 

Нови мислења

Последни Теми

Статистика

Теми
43,566
Мислења
823,528
Членови
28,073
Најнов член
Death Markk
На врв Дно