C/C++

Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
Ок. Прво да обајаниме што се покажувачи.
Покажувашот е всушност обичен цел број (integer) со големина на битноста на оператибниот систем (16, 32, 64 битен, итн.)
Комјутерот ја адресира меморијата. Секој бајт (8 бита) има своја адреса. која понува од 1 па до максималниот број кој тој интеџер го собира. Кај 32 битен цел број, тоа е 2^32-1, што занчи дека 32 битен ОС можи да адресира и да користи 2^32-1 бајти.

Покажувач како што рековме е цел број, кој е наменет да СОДРЖИ мемориски адреси. Кај типови кои зафаќаат повеќе од еден бајт (повеќето типови), тогаш тој ја треба да ја содржи адресата на првиот бајт од променливата од тој тип.
Има два оператори кај покажувачите, & и *.
& ставен пред некоја променлива ја враќа адресата (на првиот бајт) од таа променлива. Таа вредност се запамтува во покажувач.
Операторот * вели, пристапи на адресата која се содри во овој покажувач.

Код:
int a = 5;    // a се наоѓа пример на 123456789 и содржи 5
int * p1;     // p1 се наоѓа на некоја друга адреса и не содржи ништо
p1 = &a;      // p1 содржи број кој е адресата на а - 123456789
(*p1 == a)    // ова враќа True

int * p2 = p1 //вреноста на p1 (адреса на а) се копира во p2

printf("%d", a); //печати 5
printf("%d", &а) //печати 123456789
printf("%d", p1) //печати 123456789
printf("%d", *p1) //печати 5 

printf("%d", p2) //печати 123456789
printf("%d", *p2) //печати 5
Еве како работи твојот код
Код:
{    
    int a=1,b=2;
    int *pok1,*pok2;
    pok1=&a;    // pok1 прима адреса на а
    pok2=&b;    // pok1 прима адреса на b
    *pok1=10;   // променливата на адреса пок1 (таа е а) прима 10
    *pok2=*p1;  // променливата на адреса пок2 (таа е б) прима вредност од променливата на адреса пок1 (тоа е а). исто како да си напишал b = a; значи б е 10, исто како а
    pok1=pok2;  //го копираме покажувачот пок2 во пок1. двата покажуваат кон б
    *pok1=20;   // б прима 20

    printf("%d, %d", a, b); // печати 10, 20
}
 
Член од
25 јуни 2009
Мислења
9
Поени од реакции
0
Уште нешто...

Најпрво, фала ти bibil за поопширното теоретско објсанување, како и за твојот код со коментари кој го додаде во прилог. Како што напишав претходно, сите овие работи околу користењето и имплементацијата на покажувачите во рамките на некој елементарен алгоритам во C/C++ во глобала ми се јасни и ги разбирам (се мисли на пристап до адреса, до вредност и слично).
Но...користејќи ги коментарите кои ги имаш напишано на кодот што јас го испратив како пример, би сакал да те потпрашам доколку можеш да ми го појасниш и следново (ќе го болдирам и ќе го обележам со црвено):


Код:
{    
    int a=1,b=2;
    int *pok1,*pok2;
    pok1=&a;    // pok1 прима адреса на а
    pok2=&b;    // pok1 прима адреса на b
    *pok1=10;   // променливата на адреса пок1 (таа е а) прима 10
    *pok2=*p1;  // променливата на адреса пок2 (таа е б) прима вредност од променливата на адреса пок1 (тоа е а). исто како да си напишал b = a; значи б е 10, исто како а
   [B] pok1=pok2;  [COLOR="Red"]//го копираме покажувачот пок2 во пок1. двата покажуваат кон б[/COLOR][/B]
    *pok1=20;   // б прима 20

    printf("%d, %d", a, b); // печати 10, 20
}
-Значи со тој ред код ние го копираме едниот покажувач во другиот и добиваме два покажувачи кои покажуваат на иста мемроска локација. Е сега..мене тој ред веднаш ме асоцираше на таквото извршување (однесување), НО...ме збунува следново...зошто кога двата покажувачи покажуваат, (гледаат) на истата мемориска локација вредноста во променливата a останува непроменета?? Нели една промена на вредноста треба да ја видат и двата покажувачи или...???
Или има некоја финта во копирањето на покажувачите...???


Се надевам дека и ова ќе можеш да ми го дообјасниш во најскоро време.

Благодарам уште еднаш и чекам answer:vozbud: :smeshko:
Поздрав :salut:

WOW!!!

Нема потреба bibil од дополнителен одговор и појаснување.
Сега откако го постував последното прашање и откога уште еднаш го разгледав кодот ја поврзав работава. Не ми е јасно само што сум мислел кога прв пат го видов истиот код. :tapp: :tapp: :tapp:
Оф леле...фактички покажувачот ја менува еднаш вредноста на променливата a (индиректно), а потоа покажува кон б заедно со другиот покажувач, па така променливата a и нејзината вредност воопшто и немаат врска со тој ред код и со менувањето на вредноста на промеливата б. Ете забуната околу копирањето ја снема.

Да да...БЛАГОДАРИМЕ у секој случај за помошта.

п.с.идам да се освежам пошо почнав редови да скокам у кодовиве и теории да измислувам :pos2:

Поздрав другар и секое добро.
 
Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
Како што кажав, покажувачите се само цели броеви, незвисни од променливите кон кои покажуваат. Еве со пример.
Да речеме дека адресата на a е 11111 а на b 22222.
Тогаш, pok1 содржи 11111, а pok2 содржи 22222

и после пишуваме
pok1 = pok2
така, pok1 ја добива вредноста од pok2, значи pok1 и pok2 ќе имаат вредност 22222

И кога пишуваме *pok1 на крајот, велиме пристапи на променливата со адреса 22222, а таа е b. Така на краојт b станува 20.
 
Член од
25 јуни 2009
Мислења
9
Поени од реакции
0
Сега е комплетно јасно!

Да да...го сфатив тоа, во ред е сега. Но, не знам, навистина си се чудам со самиот себеси како сум можел тој ред така да го сфатам. :tapp: :tapp:
Се си е јасно напишано, само што јас изгледа копирањето на покажувачите сум го сфатил обратно, па затоа ме бунела вредноста на променливата b. Упорно бев замислен околу тоа да двата покажувачи се на истата мемориска локација, ама кај промеливата а, а всушност копирањето значи истите да покажуваат кон променливата b, па по чекорот копирање всушност се врши промена на вредноста на променливата (која во мојот пример е b).

Благодарам уште еднаш за одвоеното време и за јасното толкување за кое се обратив.

Поздрав. :helou:
 

PlayBoY

I am the MuNgoS
Член од
6 февруари 2007
Мислења
1.063
Поени од реакции
5
Информатика и компјутерска техника
Kaде ? Скопје Штип Битола ???и кој Факс ?

#include<iostream>
using namespace std;
int main(void)
{
system("TITLE Calculator");
system("COLOR 2");
char znak;
double broj1;
double broj2;
char pak;

do
{
system("CLS");
cout<<"te molam vnesi go prviot broj sto ke go ko koristis"
<<endl <<endl;
cin >>broj1;
cout<<"Te molam vnesi ja operacijata sto sakas da se izvrsi"
<< "(+,-,*,/)"<< endl <<endl;
cin>>znak;

cout<<"Te molam vnesi go vtoriot broj sto ke go koristis"<<endl;
cin>>broj2;
switch (znak)
{
case '+':
cout<<"odgovorot e : " << broj1<< " + " << broj2 << " = " << (broj1 + broj2)
<<endl <<endl;
break;
case '-':
cout<<"odgovorot e : " << broj1<< " - " << broj2 << " = " << (broj1 - broj2)
<<endl <<endl;
break;
case '*':
cout<<"odgovorot e : " << broj1<< " * " << broj2 << " = " << (broj1 * broj2)
<<endl <<endl;
break;
case '/':
if(broj2 == 0)(
cout<<"ivalidna operacija" )<< endl;
else(
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
)
<<endl;

break;

default:
cout<<"toa e validna operacija"<<

cout<<"sakas li pak da ja prais programava ? (y or n)" <<endl<<endl;
cin>>pak;
while (pak == 'Y' || pak == 'y');
}
system("pause");
return 0;
}

На крај ми јавува грешка, и неможам да сватам што е.. помош?
 
D

drle

Гостин
Kaде ? Скопје Штип Битола ???и кој Факс ?




На крај ми јавува грешка, и неможам да сватам што е.. помош?
#include<iostream>
using namespace std;
int main(void)
{
system("TITLE Calculator");
system("COLOR 2");
char znak;
double broj1;
double broj2;
char pak;

do
{
system("CLS");
cout<<"te molam vnesi go prviot broj sto ke go ko koristis"
<<endl <<endl;
cin >>broj1;
cout<<"Te molam vnesi ja operacijata sto sakas da se izvrsi"
<< "(+,-,*,/)"<< endl <<endl;
cin>>znak;

cout<<"Te molam vnesi go vtoriot broj sto ke go koristis"<<endl;
cin>>broj2;
switch (znak)
{
case '+':
cout<<"odgovorot e : " << broj1<< " + " << broj2 << " = " << (broj1 + broj2)
<<endl <<endl;
break;
case '-':
cout<<"odgovorot e : " << broj1<< " - " << broj2 << " = " << (broj1 - broj2)
<<endl <<endl;
break;
case '*':
cout<<"odgovorot e : " << broj1<< " * " << broj2 << " = " << (broj1 * broj2)
<<endl <<endl;
break;
case '/':
if(broj2 == 0)(
cout<<"ivalidna operacija" )<< endl;
else(
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
)
<<endl;

break;

default:
cout<<"toa e validna operacija"<<

cout<<"sakas li pak da ja prais programava ? (y or n)" <<endl<<endl;
cin>>pak;
}while (pak == 'Y' || pak == 'y');
system("pause");
return 0;
}


Напиши што грешка ти вади, вака од око, на брзина без компајлирање мислам дека грешаката е тоа што болдираното треба после големата заграда да оди.
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
На крај ми јавува грешка, и неможам да сватам што е.. помош?
Овој дел:

Код:
if(broj2 == 0)(
cout<<"ivalidna operacija" )<< endl;
else(
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
)
<<endl;

break;

default:
cout<<"toa e validna operacija"<<
Промени го вака:
Код:
if(broj2 == 0) [B]{[/B]
cout<<"ivalidna operacija" << endl;
[B]}[/B] else [B]{[/B]
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
<<endl;
[B]}[/B]

break;

default:
cout<<"toa e validna operacija"<<[B]endl;
}[/B]
Мислам дека вака ќе биде океј, пробај го па ако извади ерор кажи што ерор ти вади.
 

PlayBoY

I am the MuNgoS
Член од
6 февруари 2007
Мислења
1.063
Поени од реакции
5
Овој дел:

Код:
if(broj2 == 0)(
cout<<"ivalidna operacija" )<< endl;
else(
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
)
<<endl;

break;

default:
cout<<"toa e validna operacija"<<
Промени го вака:
Код:
if(broj2 == 0) [B]{[/B]
cout<<"ivalidna operacija" << endl;
[B]}[/B] else [B]{[/B]
cout<<"odgovorot e : " << broj1<< " / " << broj2 << " = " << (broj1 / broj2)
<<endl;
[B]}[/B]

break;

default:
cout<<"toa e validna operacija"<<[B]endl;
}[/B]
Мислам дека вака ќе биде океј, пробај го па ако извади ерор кажи што ерор ти вади.

tnx dude .. tocno e sea..
 

old_School_mk

Програмер, гејмер, psy-trance уживател
Член од
11 август 2009
Мислења
6.153
Поени од реакции
5.921
Епа луѓе, прва лабораториска вежба... Ај за да не идам ко труп таму ако може малце помош?

Да се напише програма со која што во променливите a, b и c ќе се вчитаат вреднистите на страните на еднаквокрак трапез, каде што a и b се однесуваат на основите на трапезот, а со c се означени краците. Програмата треба да го пресмета и испечати квадратот од висината на трапезот.
 

Песимист

Добро информиран оптимист
Член од
11 ноември 2008
Мислења
1.676
Поени од реакции
181
Те и јас да се погубам тука почна и јас да учам на факултет овоа и сега за сега ми изгледа доста лесно и разбирливо и интересно колку и да изгледа комплицирано ама рано е уште да зборам него освен оние туторијали на нет да не има некаде нешто поинтересно или па некој туторијал на спрски/македонски/хрватски
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Епа луѓе, прва лабораториска вежба... Ај за да не идам ко труп таму ако може малце помош?

Да се напише програма со која што во променливите a, b и c ќе се вчитаат вреднистите на страните на еднаквокрак трапез, каде што a и b се однесуваат на основите на трапезот, а со c се означени краците. Програмата треба да го пресмета и испечати квадратот од висината на трапезот.
Код:
#include <iostream> // biblioteka za input i output

using namespace std; // za da ne koristish std:: pred sekoja vlezna ili izlezna komanda

int main() // glavna funkcija
{
int a,b,c; // deklariranje na promenlivite

cout << "Vnesete ja vrednosta 'a': ";
cin >> a; // vchituvanje na vrednosta 'a'

cout << "Vnesete ja vrednosta 'b': ";
cin >> b; // vchituvanje na vrednosta 'b'

cout << "Vnesete ja vrednosta 'c': ";
cin >> c; // vchituvanje na vrednosta 'c'

float h = (c*c) - (a-b) / 2 * (a-b) / 2; // formulata za h (visinata)
// mozhno e da e greshna formulava
// ako e greshna napishi ja tochnata formula za presmetuvanje na visina :)))

// Pechatenje na kvadrat na visinata
cout << "Kvadrat na visinata e: " << h*h << endl;

cin.get();
}
Те и јас да се погубам тука почна и јас да учам на факултет овоа и сега за сега ми изгледа доста лесно и разбирливо и интересно колку и да изгледа комплицирано ама рано е уште да зборам него освен оние туторијали на нет да не има некаде нешто поинтересно или па некој туторијал на спрски/македонски/хрватски
Ќе ти пратам по ПП туторијали на македонски денес или утре (се надевам не се брзаш :)).
 
Член од
14 јуни 2008
Мислења
1.369
Поени од реакции
1.075
Код:
#include <iostream> // biblioteka za input i output

using namespace std; // za da ne koristish std:: pred sekoja vlezna ili izlezna komanda

int main() // glavna funkcija
{
int a,b,c; // deklariranje na promenlivite

cout << "Vnesete ja vrednosta 'a': ";
cin >> a; // vchituvanje na vrednosta 'a'

cout << "Vnesete ja vrednosta 'b': ";
cin >> b; // vchituvanje na vrednosta 'b'

cout << "Vnesete ja vrednosta 'c': ";
cin >> c; // vchituvanje na vrednosta 'c'

float h = (c*c) - (a-b) / 2 * (a-b) / 2; // formulata za h (visinata)
// mozhno e da e greshna formulava
// ako e greshna napishi ja tochnata formula za presmetuvanje na visina :)))

// Pechatenje na kvadrat na visinata
cout << "Kvadrat na visinata e: " << h*h << endl;

cin.get();
}
Ќе ти пратам по ПП туторијали на македонски денес или утре (се надевам не се брзаш :)).
Треба да биде во C напишано... значи место cin и cout има printf и scanf , друга библиотека и тако даље:baeh:

п.с ако може и за мене туторијалот :helou:
фала:smir:
 
Х

Ханзо

Гостин
Кодот на SkyDriver преведен во C, верувам ова ви треба за лабораториски по структурирано.
Код:
#include <stdio.h> // biblioteka za input i output

int main() // glavna funkcija
{
int a,b,c,h; // deklariranje na promenlivite

printf("Vnesete ja vrednosta 'a': ");
scanf("%d",&a); // vchituvanje na vrednosta 'a'

printf("Vnesete ja vrednosta 'b': ");
scanf("%d",&b); // vchituvanje na vrednosta 'b'

printf("Vnesete ja vrednosta 'c': ");
scanf("%d",&c); // vchituvanje na vrednosta 'c'

float h = (c*c) - (a-b) / 2 * (a-b) / 2; // formulata za h (visinata)
// mozhno e da e greshna formulava
// ako e greshna napishi ja tochnata formula za presmetuvanje na visina :)))

// Pechatenje na kvadrat na visinata
printf("Kvadrat na visinata e: %f",h);

}
 

Kajgana Shop

На врв Bottom