PDA

Prikaži potpunu verziju : pocetnicko pitanje za c++


BlaziX
4.2.2010, 19:45
od skoro sam poceo da se bakcem sa c++. prijavio sam se na z-trening.com, i bas mi se svideo sajt. medjutim, najlaksi program koji postoji jeste zbir dva broja, koji sam uradio sa sledecim kodom:
#include<stdio.h>
int main()
{
int a,b,c;
printf ("Unesi dva broja");
scanf("%d %d",&a,&b);
c=a+b;
printf("\n suma dva broja je: %d",c);
}


pitam se zasto kad se program run-uje, on naravno na neki nacin radi, unesem dva broja i treba da mi ispise zbir ta dva broja, ali nije bas tako. Uneo sam 2 broja i kad treba da izbaci zbir on izadje iz cmd skroz, zasto to? probao sam da ubacim pre zavrsetka bloka funkciju return 0; ali isto mi se vata, pogledao sam i kako su uradili ostali clanovi na z-treningu ali isto je kao i kod mene.
evo i snimak na youtube kako to prakticki izgleda: http://www.youtube.com/watch?v=CuKYh025By0

holodoc
4.2.2010, 19:57
od skoro sam poceo da se bakcem sa c++. prijavio sam se na z-trening.com, i bas mi se svideo sajt. medjutim, najlaksi program koji postoji jeste zbir dva broja, koji sam uradio sa sledecim kodom:
#include<stdio.h>
int main()
{
int a,b,c;
printf ("Unesi dva broja");
scanf("%d %d",&a,&b);
c=a+b;
printf("\n suma dva broja je: %d",c);
}
pitam se zasto kad se program run-uje, on naravno na neki nacin radi, unesem dva broja i treba da mi ispise zbir ta dva broja, ali nije bas tako. Uneo sam 2 broja i kad treba da izbaci zbir on izadje iz cmd skroz, zasto to? probao sam da ubacim pre zavrsetka bloka funkciju return 0; ali isto mi se vata, pogledao sam i kako su uradili ostali clanovi na z-treningu ali isto je kao i kod mene.
evo i snimak na youtube kako to prakticki izgleda: http://www.youtube.com/watch?v=CuKYh025By0

1. Kod koji si naveo nema ništa od C++ specifičnosti pa da možeš da ga nazoveš C++ kodom. Ovo je klasičan C kod.

2. Pri definisanju main funkcije naveo si da će pozivaocu (u ovom slučaju operativnom sistemu) vratiti celobrojnu vrednost a na kraju svog koda to nigde ne činiš. Dodaj jedan return 0; na kraju.

3. Program se zatvara iz jednostavnog razloga što ne postoji ništa u kodu što bi ga nateralo da napravi pauzu nakon što ti prikaže rezultate obrade. Imaš dva načina da rešiš ovaj problem. Prvi je da program pozoveš iz konzole a drugi je da dodaš nešto na kraju svog koda a pre return što će zaustaviti izvršenje do interakcije sa korisnikom. Veoma popularna, mada ne i najbolja, metoda je dodavanje jednog system("PAUSE"); ispred return reda.

4. Počni da se navikavaš na terminologiju proramiranja :) Ono što ti zoveš "runovanje" je u stvari build-ovanje, provera koda pred build-ovanje se zove kompajliranje itd. itš. ;)

Evo tvog koda sa svim navedenim izmenama.

#include<stdio.h>
int main()
{
int a,b,c;
printf ("Unesi dva broja");
scanf("%d %d",&a,&b);
printf("\n suma dva broja je: %d", a+b);
system("PAUSE"); //ovde mozes da iskoristis i getchar();
return 0;
}

BlaziX
4.2.2010, 20:43
hvala na brzom odgovoru.

BlaziX
4.2.2010, 20:55
imam jos jedno pitanje, pa ako nije problem da dobijem opet odgovor.
dakle, potrebna mi je ideja da bi mogao da dovrsim program skroz, posto sa mojim znanjem sa c jezikom ne mogu da je smislim.
iz programa:
//Unijeti dva broja. Ako je prvi veci od drugog ispisati njihov zbir, a ako nije (prvi veci od drugog) ispisati njihov proizovod.

#include<cstdlib>
#include<iostream>

int main()
{
int a,b,c;
printf(" Unesi prvi broj:\n");
scanf("%d",&a);
printf("\n Unesi drugi broj:\n");
scanf("%d",&b);
if (a>b)
c=a+b;
if (b>a)
c=a*b;
printf(" iznos je: %d \n",c);
system("PAUSE");
return 0;
}

želim da umetnem nesto u program što bi bilo pouzdano oko izračunavanja, znači, ako je prvi veći od drugog da mi umesto ‚‚iznos je‚‚ piše ‚‚zbir je:‚‚ isto tako i ako je drugi veći od prvog da umesto ‚‚iznos je‚‚ piše ‚‚proizvod je‚‚ :eek:

irreal
4.2.2010, 21:41
da li vidis kako program odlucuje da li da pomnozi ili sabere ?
(posto si ocigledno od nekuda kopirao kod)

primeti da imas
if (a > b)
<saberi>
if (b > a)
<pomnozi>

dakle, postavlja se pitanje da li je a vece od b, ako jeste, nesto se izvrsi, ako nije, nikom nista.
zatim se postavlja pitanje da li je b vece od a, ako jeste, nesto se izvrsi, ako nije, opet nikom nista.
(p.s. logicnim razmisljanjem mozes da vidis da jedan slucaj nije pokriven, ako ni a nije vece od b, ni b od a
u tom slucaju tvoj program nece nista ispisati, ni jedna od te dve naredbe se nece izvrsiti.)

zar to nije upravo ono sto ti hoces ?
ako je a > b, bice sabiranje, i hoces da kazes "zbir je"
a ako je b > a, bice mnozenje i hoces da kazes "proizvod je"

dakle ispravan kod bi bio otprilike


if (a>b)
{
c=a+b;
printf(" zbir je: %d \n",c);
}
if (b>a)
{
c=a*b;
printf(" proizvod je: %d \n",c);
}

kao sto vidis, da bi izvrsio vise od jedne linije kada je neki uslov ispunjen, sve komande koje zelis da se izvrse moraju da stoje izmedju viticastih zagrada ( { i } )
tako grupises delove koda.

probaj malo sam da vezbas - uradi da ispise "brojevi su isti" ako se ukucaju dva ista broja.

G@Rtn3R
4.2.2010, 21:50
Ajde da i ja pitam nešto :D
Koja je razlika između "printf", "scanf" i "cin>>", "cout<<"?
Ja sam radio sa ovim "cin>>" i "cout<<" ali sa ovim drugim nisam :kreza:

BlaziX
4.2.2010, 22:01
ne, nego sam c poceo raditi od pre 3 dana i to samo u slobodno vreme. nisam prepisao program sam sam ga uradio.
evo uradio sam i za iste brojeve:
//Unijeti dva broja. Ako je prvi veci od drugog ispisati njihov zbroj, a ako nije (prvi veci od drugog) ispisati njihov umnožak.

#include<cstdlib>
#include<iostream>

int main()
{
int a,b,c;
printf(" Unesi prvi broj:\n");
scanf("%d",&a);
printf("\n Unesi drugi broj:\n");
scanf("%d",&b);
if (a>b)
{
c=a+b;
printf("\n Zbir brojev je: %d \n",c);
}
if (b>a)
{
c=a*b;
printf(" kolicnik brojeva je: %d \n",c);
}
if (a=b)
{
printf("\n Dva uneta broja su ista, nije moguc proracun.\n");
}
system("PAUSE");
return 0;
}

BlaziX
4.2.2010, 22:03
Ajde da i ja pitam nešto :D
Koja je razlika između "printf", "scanf" i "cin>>", "cout<<"?
Ja sam radio sa ovim "cin>>" i "cout<<" ali sa ovim drugim nisam :kreza:

cin je ekvivalentno scanf a cout ekvivalentno printf.

holodoc
4.2.2010, 22:12
ne, nego sam c poceo raditi od pre 3 dana i to samo u slobodno vreme. nisam prepisao program sam sam ga uradio.
evo uradio sam i za iste brojeve:
//Unijeti dva broja. Ako je prvi veci od drugog ispisati njihov zbroj, a ako nije (prvi veci od drugog) ispisati njihov umnožak.

#include<cstdlib>
#include<iostream>

int main()
{
int a,b,c;
printf(" Unesi prvi broj:\n");
scanf("%d",&a);
printf("\n Unesi drugi broj:\n");
scanf("%d",&b);
if (a>b)
{
c=a+b;
printf("\n Zbir brojev je: %d \n",c);
}
if (b>a)
{
c=a*b;
printf(" kolicnik brojeva je: %d \n",c);
}
if (a=b)
{
printf("\n Dva uneta broja su ista, nije moguc proracun.\n");
}
system("PAUSE");
return 0;
}


Ovaj kod će ti "progutati" samo Visual Studio jer mešaš headere iz C++-a i C-a ;) printf i scanf su funkcije iz stdio.h zaglavlja koje je po prirodi C zaglavlje tako da Visual Studio tokom faze buildovanja sam ubacuje neophodna zaglavlja na početku pre kompajliranja. cstdlib i iostream ti za ovaj kod nisu uopšte potrebni ;) Svi ostali kompajleri bi na default podešavanjima odbili da kompajliraju tvoj program.

irreal
4.2.2010, 22:20
ne valja ti kod :)

jel si ga testirao uopste ?
taj kod bi trebao sta god da otkucas da ti kaze da su brojevi isti, cak i kada nisu.

to je zato sto ti u trecem uslovu stoji if (a=b)
= sluzi da u varijablu sa leve strane stavis vrednost koja se nalazi sa desne strane

a == sluzi da testiras da li su dve vrednosti iste ili razlicite.

dakle, if (a==b) ce u slucaju da je vrednost a ista kao i vrednost b vratiti true, inace ce vratiti false.

a if (a=b) ce pokusati da u varijablu a upise vrednost varijable b, ako ova operacija uspe, vratice true, ako ne uspe, vratice false.
tebi ona naravno uvek uspeva (generalno ne uspeva samo ako dodeljujes ne kompatibline vrendosti) i samim time je treci uslov uvek ispunjen, sto nije zeljeno ponasanje.


printf i scanf su funkcije iz standardne C biblioteke.
one, kao sto sigurno znate, ispisuju tekst na standardni izlaz i ucitavaju tekst sa standardnog ulaza (najcesce, naravno, konzola za izlaz a tastatura za ulaz).

Cin i Cout su STREAM-ovi, a ne funkcije. deo su c++ biblioteke.

razlika izmedju stream-a i funkcije je sto funkciju morate da pozivate svaki put kada zelite nesto da ispisete / ucitate

a stream je bukvalno kao sto bi prevod i glasio "potok".
stream stoji otvoren, i sve sto u njega ubacujete se obradjuje i prolazi kroz njega.

sa streamom mozete koristiti operatore << i >>, koji pokazuju "tok" podataka

cout prima podatke od vaseg programa i prosledjuje ih negde dalje, samim time strelice pokazuju od vaseg programa ka cout
cout << "Zdravo" << " " << "Svete" << " ovo je pri" << "mer kako mozete gurati podatke u " << "stream";

a kod cin-a, podaci dolaze od nekud (sa tastature) u vas program, samim time strelice pokazuju od cin-a ka vasim varijablama
npr.
cin >> ime;

i ne zaboravite : google je vas prijatelj !

p.s.
naravno, objasnjenja sam malo pojednostavljeno predstavio, koristite google wikipediu i ostatak interneta ako vas zanimaju detalji :)

bvitnik
4.2.2010, 22:24
cin je ekvivalentno scanf a cout ekvivalentno printf.

Ni približno tačno.

Ajde da i ja pitam nešto :D
Koja je razlika između "printf", "scanf" i "cin>>", "cout<<"?
Ja sam radio sa ovim "cin>>" i "cout<<" ali sa ovim drugim nisam :kreza:

printf() i scanf() su C funkcije za ispis i unos vrednosti, respektivno. cin i cout su objekti (instance) klase istream i ostream, respektivno, kojima su overload-ovani operatori << (binarno pomeranje ulevo) i >> (binarno pomeranje udesno). cin i cout naravno ne postoje u C-u.

BlaziX
4.2.2010, 22:28
Ovaj kod će ti "progutati" samo Visual Studio jer mešaš headere iz C++-a i C-a ;) printf i scanf su funkcije iz stdio.h zaglavlja koje je po prirodi C zaglavlje tako da Visual Studio tokom faze buildovanja sam ubacuje neophodna zaglavlja na početku pre kompajliranja. cstdlib i iostream ti za ovaj kod nisu uopšte potrebni ;) Svi ostali kompajleri bi na default podešavanjima odbili da kompajliraju tvoj program.

uglavnom radim na Dev c++,do sad je ‚‚progurivalo‚‚ svaki program. Mada imam i VS 2010 al gotovo da ga ne korisitm (za sad). A to cstdlib i iostream sa stdio.h me je bunilo jako (tj jos me buni). Ucim iz tutorijala sto mi je drug dao i tamo se sve govori sa cstdlib i iostreeam. Eksperimentisao sam, umestno cstdlib iostream ubacim stdio.h, pa prilikom kompajliranja izbaci eror u system("PAUSE"); , pokusam da obrisem system("PAUSE"); i radi , al ne mogu da vidim rezultat :icon_scra

BlaziX
4.2.2010, 22:42
ne valja ti kod :)

jel si ga testirao uopste ?
taj kod bi trebao sta god da otkucas da ti kaze da su brojevi isti, cak i kada nisu.

to je zato sto ti u trecem uslovu stoji if (a=b)
= sluzi da u varijablu sa leve strane stavis vrednost koja se nalazi sa desne strane

a == sluzi da testiras da li su dve vrednosti iste ili razlicite.

dakle, if (a==b) ce u slucaju da je vrednost a ista kao i vrednost b vratiti true, inace ce vratiti false.

a if (a=b) ce pokusati da u varijablu a upise vrednost varijable b, ako ova operacija uspe, vratice true, ako ne uspe, vratice false.
tebi ona naravno uvek uspeva (generalno ne uspeva samo ako dodeljujes ne kompatibline vrendosti) i samim time je treci uslov uvek ispunjen, sto nije zeljeno ponasanje.
testirao sam, skoro da radi (mada se to u programiranju ne tolerise :) ). kad ukucam 2 razlicita broja program odradi svoj zadatak ali na kraju plus doda da su brojevi isti. dodao sam = pa radi sad ok. hvala druze

holodoc
4.2.2010, 22:43
Ni približno tačno.

printf() i scanf() su C funkcije za ispis i unos vrednosti, respektivno. cin i cout su objekti (instance) klase istream i ostream, respektivno, kojima su overload-ovani operatori << (binarno pomeranje ulevo) i >> (binarno pomeranje udesno). cin i cout naravno ne postoje u C-u.
E ako si mu rekao :dzavo: Ako te je neko sa trodnevnim "C/C++" stažom razumeo šta su overloadovani operatori i bitwise shifting odmah odo da se bačim u Kanal ;)
uglavnom radim na Dev c++,do sad je ‚‚progurivalo‚‚ svaki program. Mada imam i VS 2010 al gotovo da ga ne korisitm (za sad). A to cstdlib i iostream sa stdio.h me je bunilo jako (tj jos me buni). Ucim iz tutorijala sto mi je drug dao i tamo se sve govori sa cstdlib i iostreeam. Eksperimentisao sam, umestno cstdlib iostream ubacim stdio.h, pa prilikom kompajliranja izbaci eror u system("PAUSE"); , pokusam da obrisem system("PAUSE"); i radi , al ne mogu da vidim rezultat :icon_scraTaj DevC++ je odavno napušten projekt. Predlažem ti da se prebaciš ili na Code::Blocks ili na vwDevCpp. Možeš i na Visual Studeio Express Edition ali ti onda treba i WindowsSDK da bi kreirao aplikacije u native modu.

BlaziX
4.2.2010, 22:52
E ako si mu rekao :dzavo: Ako te je neko sa trodnevnim "C/C++" stažom razumeo šta su overloadovani operatori i bitwise shifting odmah odo da se bačim u Kanal ;) samo cu reci ... lol
Taj DevC++ je odavno napušten projekt. Predlažem ti da se prebaciš ili na Code::Blocks ili na vwDevCpp. Možeš i na Visual Studeio Express Edition ali ti onda treba i WindowsSDK da bi kreirao aplikacije u native modu.
Drug mi je kao pocetniku predlozio dev c++ tako da sam njega poslusao. da nije njega sad bi ucio na Visual Studio 2010 Ultimate :dzavo:

holodoc
4.2.2010, 23:05
samo cu reci ... lol

Drug mi je kao pocetniku predlozio dev c++ tako da sam njega poslusao. da nije njega sad bi ucio na Visual Studio 2010 Ultimate :dzavo:DevC++ je važio za dobar izbor pre par godina kada je projekat održavan. Međutim kad je izašla beta verzije 5 projekat je jednostavno napušten i to u tako jadnom stanju da je "Petica" potpuno neupotrelbjiva. Primera radi debuger uopšte ne radi, call stackovi ne mogu da se prate itd. Nešto malo kasnije druga grupa programera je preuzela izvorni kod DevC++-a i započela projekat wxDevCpp (http://wxdsgn.sourceforge.net/) koji u sebe implementira i visual komponentu uz pomoć wxWidgets biblioteke pa je sad moguće da se programi kreiraju kao i kod Visual Stuidio paketa sa raznim komponentama itd. Alternativa je Code::Blocks (http://www.codeblocks.org/) koji isto tako nije loš a ako nameravaš da koristiš Visual Studio u native režimu (ne kreiraš "programe" koji zavise od .NET platforme) treba da skineš i WindowsSDK (aktuelna verzija je 7.0ako se ne varam za Windows 7).

bvitnik
4.2.2010, 23:24
E ako si mu rekao :dzavo: Ako te je neko sa trodnevnim "C/C++" stažom razumeo šta su overloadovani operatori i bitwise shifting odmah odo da se bačim u Kanal ;)


Odgovor je upućen G@Rtn3R-u a on, pretpostavljam, ima malo više iskustva.