ssssssssss!
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.707.112
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Kak je i bilo najavljeno, tak i dostavljam. Ispalo je da je ovo bozicni specijal.
http://www.bug.hr/forum/topic/programiranje/tutorial-uvod-umjetnu-inteligenciju-ga/234094.aspx
.
.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 83, 114, 101, 116, 110, 97, 32, 110, 111, 118, 97, 32, 103,
111, 100, 105, 110, 97, 33, 10, 84, 114, 97, 99, 101, 114, 10, 10 };
for each (char i in v)
cout << i;
return 0;
}
@TracerCPP
Ako nekoga zanima ovo je rezultat gornjeg programa.
Samo sam dodao
system("pause");
prije
return 0;
da mi zadrži rezultat programa.
Sretan nova godina Traceru i svima ostalima koji pomažu oko programiranja.
Kod je kriv, C++ for each
nema each. :D
Takoder C++ imlicitno ima return 0; tako da je to nepotrebno.
A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;
Ja sam koristio VS gdje sve ovo radi, ali ako te već toliko smeta for each zamijeni ga s for(auto ...) ili običnom for petljom itd. pa da ti bude skroz u skladu s standardom. A ovo za return 0 mislim da je nebitno.
I opet, sretna nova godina
Kod je kriv, C++ for each
nema each. :D
Takoder C++ imlicitno ima return 0; tako da je to nepotrebno.
A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;
E baš si Grinch
Istina, ako se u main funkciji ne stavi return, prevoditelj se neće buniti. To jest po standardu, ali je programerski nekonzistentno, pošto za sve druge funkcije sa prototipom koji ima povratnu vrijednost return se mora staviti. Ni prva ni zadnja nekonzistentnost u C++, pošto C++ ima drukčiji razvojni put nego C# ili drugi čisti OOP jezici.
Nebitno je da li je jezik cisto OOP ili ne. I ovo za cpp main je razumni default. Naravno C++ ima tonu iritantnih problema(most vexing parse, kda staviti typename u templejtima... :) ), ali to nije zbog toga sto nije cisti OOP jezik ( mislim nitko ti ne brani da ga koristis kao cisti OOP jezik, nije OOP mjerilo kvalitete jezika pa je C banana, C++ napola ok a JAVA i C# jedini pravi) nego jer je em evoluirao iz Ca sa kojim mora zadrzati kompatibilnost em je kreiran 10-20 godina prije C# i JAVA pa je naravno teze ugurati neke nove stvari u jezik koji postoji nego kada dizajniras jezik od pocetka.
Pozdrav,trebao bi pomoć oko ovog zadatka:
Generiraj 20 jednoznamenkaskih prirodnih brojeva (uključujući i nulu) i pohrani ih u niz. Ispiši niz kao jedan dvadesetoznamenkasti broj. Zamjeni sve brojeve u nizu njihovim sljedbenicima osim broja 9 koji je potrebno zamjeniti nulom. Ponovno ispiši niz na isti način
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ int i, niz[20];
srand(time(NULL));
for(i=0;i<20;i++)
{niz[i]=rand()%10;
printf("%d",niz[i]);}
printf("\n\n");
//ovo dalje iz nekog razloga ne radi
for(i=0;i<20;i++)
{if(niz[i]=9)niz[i]=0;
else niz[i]=niz[i]+1;
printf("%d",niz[i]);}
printf("\n\n");
getch();
}
Operator = nije isto što i operator ==
Niti ne trebaš taj if else kod pomicanja znamenke za 1
niz[i] = (niz[i]+ 1) % 10
Inače, nevezano za ovo, u C++ prolazi donji kod baš zahvaljujući kompatibilnosti unatrag sa C-om. Što nekad dobro dođe za izvući se iz škripca. Tako da ja ne smatram neke nekonzistentnosti u C++ nužno lošim, čak dapače. A o dobrom starom C da bi ružnu riječ rekao, čak mi je to prije mana nego prednost, uopće i ne radim sa jezicima koji nisu C like, tako da je bio nesporazum, OOP sam spomenuo usput, ne u konteksu bolji lošiji.
#include<iostream >
#include <ctime>
using namespace std;
int main()
{
int niz[20];
srand(time(NULL));
for (int i = 0; i<20; i++)
{
niz[i] = rand() % 10;
cout << niz[i];
}
cout << endl;
for (int i = 0; i<20; i++)
{
niz[i] = (niz[i] + 1) * (niz[i]<9);
cout << niz[i];
}
cout << endl;
return 0;
}
Imam nekoliko pitanja za zadatak ispod.
Prvo, jel mi netko može reći koja je svrha ovog zadatka? Istina da sam početnik u programiranju, ali nisam toliko glup da ne vidim svrhu nekog koda čim ga pročitam, Ovdje ne vidim.
Što znači definirati operator za klasu?
Znam što je konstruktor, ali što je kopirni konstruktor?
BArem za funkcije nemam pitanja. Nadam se da je netko voljan objasnit mi ovo.
Pokušao sam naravno sam, uvijek pokušam. Ali jednostavno ne shvaćam smisao zadatka, ne kužim što kod treba napraviti, čemu služi taj kurčev radijus kad se ne traži nikakvo računanje?
Nije valjda smisao zadatka tek onako pokazati da znaš promijeniti neki dio koda, bez ikakve svrhe?
Zadatak 4. Deklarirana je klasa SimpleCircle
class SimpleCircle
{
public:
SimpleCircle();
~SimpleCircle();
void SetRadius(int);
int GetRadius();
private:
int m_radius;
};
Koristeći ovu deklaraciju
- a) napišite konstruktor, kojim se ujedno inicijalizira član m_radius na vrijednost 5.
- b) Definiraj operator= za klasu SimpleCircle.
- c) Definiraj kopirni konstruktor klase SimpleCircle
- d) Definiraj funkcije SetRadius i GetRadius. Kojima se postavlja i dobavlja vrijednost članske varijable
Imam nekoliko pitanja za zadatak ispod.
Prvo, jel mi netko može reći koja je svrha ovog zadatka? Istina da sam početnik u programiranju, ali nisam toliko glup da ne vidim svrhu nekog koda čim ga pročitam, Ovdje ne vidim.
Što znači definirati operator za klasu?
Znam što je konstruktor, ali što je kopirni konstruktor?
BArem za funkcije nemam pitanja. Nadam se da je netko voljan objasnit mi ovo.
Pokušao sam naravno sam, uvijek pokušam. Ali jednostavno ne shvaćam smisao zadatka, ne kužim što kod treba napraviti, čemu služi taj kurčev radijus kad se ne traži nikakvo računanje?
Nije valjda smisao zadatka tek onako pokazati da znaš promijeniti neki dio koda, bez ikakve svrhe?
...
Koristeći ovu deklaraciju- a) napišite konstruktor, kojim se ujedno inicijalizira član m_radius na vrijednost 5.
- b) Definiraj operator= za klasu SimpleCircle.
- c) Definiraj kopirni konstruktor klase SimpleCircle
- d) Definiraj funkcije SetRadius i GetRadius. Kojima se postavlja i dobavlja vrijednost članske varijable
Hm, ajmo ovako. Klasa je nacrt za nekakvi objekt. Kakav objekt? Pa to ovisi o poslu koji radis. Konkretno ovdje je rijec o kruznici. Svaka kruznica ima svojstvo radijusa, dakle ima definiran radijus. Isto kao sto i pas ima "po defaultu" noge, mada mu ne trebaju jer u tom trenutku ne trci. Ali ih ima. Tako je i ovdje, govori se o kruznici i iako se radijus nigdje ne treba racunati, to je njezino svojstvo i kao takvo bi se trebalo navesti u klasi. Druga stvar, mozda se bude u sljedecem zadatku koristio da se nesto izracuna. Ne znam kako da ti bolje objasnim. Ti u objektnom programiranju stvaras neke objekte, a oni imaju neka svojstva koja im onda pridodas. Naravno, uvijek ces ta svojstva na neki nacin koristiti, ali ovdje je to samo zadatak za vjezbu (a velim, mozda samo prvi u nizu koji radi s tom klasom) pa je jako pojednostavljen.
A koja je svrha? Da te nauci inicijalizirati privatne clanove odmah prilikom stvaranja objekta, da te nauci getterima i setterima (sucelje za rad s privatnim varijablama) i dr.
Korisnicke klase koje sam radis nemaju definirane operatore. Kad bi ti napravio svoj objekt i pokusao ga pridruziti nekoj drugoj varijabli, to bi propalo jer se ne zna kako to ide. Npr., ako imas dva objekta tipa SimpleCircle i zelis ih zbrojiti to nece raditi. Zasto? Zato sto kompajler ne zna kako bi to trebalo izvrsiti. Zato onda sam definiras operator zbrajanja. Npr. neka se zbrajanjem dviju kruznica stvori nova ciji je radijus zbroj radijusa prve i druge. Onda definiras operator+ da tako radi i kad napravis:
SimpleCircle c1 = SimpleCircle(5);
SimpleCircle c2 = SimpleCircle(10);
SimpleCircle c3 = c1 + c2; // c3 sad ima radijus 15, bez operatora+ ne radi
to ce raditi. Bez definiranog operatora+ nece.
Isto je i s operatorom pridruzivanja, ne mozes napraviti SimpleCirclec3 = c2;, jer ga nisi definirao i kompajler ne zna kako ih izjednaciti. Druga stvar koja ti treba da bi ovo s operatorom jednako radilo je kopirni konstruktor (copy constructor). To je konstruktor koji prima referencu na objekt tipa tog kojeg je (u tvom slucaju SimpleCircle(const SimpleCircle& c) {} ). Tada u njemu postavis sve vrijednosti da budu iste kao kod objekta kojeg ustvari kopiras.
Malo se zurim pa nisam bolje mogao ovo napisati, nadam se da si bar nesto skuzio.
Koji faks je u pitanju? Ovo me podsjeća na stare zadatke sa TVZ-a..
Hvala Domagoj :)
Ako ne mene misliš, radi se o FESB Split.
Hvala Domagoj :)
Ako ne mene misliš, radi se o FESB Split.
Koji nick, što imaš toliko protiv pokazivača
Uzmi onda moju skriptu pa pogledaj. Imaš primjere i zadatak na tu temu.
https://www.dropbox.com/s/4ku7sz4ikkqugbm/ObjektnoProgramiranje_TVZ.pdf?dl=0
Isto je i s operatorom pridruzivanja, ne mozes napraviti SimpleCirclec3 = c2;, jer ga nisi definirao i kompajler ne zna kako ih izjednaciti. Druga stvar koja ti treba da bi ovo s operatorom jednako radilo je kopirni konstruktor (copy constructor). To je konstruktor koji prima referencu na objekt tipa tog kojeg je (u tvom slucaju SimpleCircle(const SimpleCircle& c) {} ). Tada u njemu postavis sve vrijednosti da budu iste kao kod objekta kojeg ustvari kopiras.
Malo se zurim pa nisam bolje mogao ovo napisati, nadam se da si bar nesto skuzio.
Samo ću malo proširiti na tvoj post jer si većinu na pristupačan način već objasnio pa je lako shvatiti.
Konstruktor kopije (ilitiga kopirni konstruktor) je konstruktor kao i svi drugi, radi novi objekt. Međutim, on je pomalo specifičan jer radi novi objekt na temelju postojećeg objekta. Kao što bi parametarskom predao vrijednosti parametara za inicijalizaciju podatkovnih članova, ovom daješ (uobičajeno konstantnu) referencu na postojeći objekt. Konstruktor kopije tada ima posao stvoriti novi objekt kao identičnu kopiju objekta kojeg si mu dao - odnosno pročitati vrijednosti podatkovnih članova postojećeg objekta i zapisati ih u novi objekt.
Operatori, kao što ti je Domagoj rekao, postoje za ugrađene tipove podataka. Ako želiš standardizirani način za zbrajanje objekata, odnosno imaš klasu za kompleksni broj primjerice, onda moraš sam napisati kako za tvoju klasu radi operator zbrajanja - za ovu konkretnu nastaje novi kompleksan broj kojem je realni dio jednak zbroju realnih, a imaginarni jednak zbroju imaginarnih dijelova brojeva koje zbrajaš. Isto je i za sve druge operatore koji se daju preopteretiti (= je mrvicu specifičan, vidi niže). Imaš na Stacku jako lijep sticky o preopterećivanju operatora u C++u.
Inače, neke stvari dobiješ kod bilo koje klase koju pišeš sam. To su defaultni (podrazumijevani) konstruktor (njega imaš ako sam ne napišeš niti jedan drugi), dobiješ destruktor koji ne radi ništa, dobiješ konstruktor kopije koji radi tzv. plitko kopiranje i dobiješ operator pridruživanja (=). (Ovdje se ne slažem s Domagojem, jer out of the box imaš operator = koji bi radio u ovako jednostavnom slučaju). I sve to radi u jednostavnijim slučajevima. Čim imaš dinamičko zauzimanje memorije stvar se raspada, jer ti je potrebno duboko kopiranje. Predlažem ti (ne Domagoju nego kolegi koji je pitao) da svakako pročitaš o čemu je riječ (plitko vs. duboko), a i da provjeriš tzv. "pravilo svetog trojstva".
A smisao zadatka, da na jednostavnom primjeru napišeš svoju klasu koja ima atribute i metode, da se poigraš s preopterećivanjem operatora, da u kasnijim zadacima dodaš funkcionalnosti, da ju koristiš u nekom malo većem projektu i slično (Vjerujem da će biti tako, s obzirom da je riječ o nastavnim materijalima).
Počeo sam učiti prema nekim tutorijilima, pa kad sam se prebacio na zadatke sa faksa, shvatio sam da se gradivo ne podudara 100%. Zato sam reagirao sa "wtf" kad sam čuo za neke pojmove. Tako da ću sa da prijeći gradivo sa faksa, pa ću vas onda opet gnjaviti za pomoć.
U svakom slučaju, hvala na odgovorima. Pozdrav.
Kod tebe se jasno vidi da nisi išao na predavanja jer tebi pojmovi nisu jasni a kamoli problematika i implementacija koda. Stoga, ne očekuj nikakva čuda na brzinu.
Išao sam na početku, ali sam odustao kad sam shvatio da mi se pristup profesora ne sviđa, a i laboratorijske vježbe su beskorisne. Inače, ranije sam imao JAVU kod jedne profesorice koja je to puno interesantnije objašnjavala, i laboratorijske vježbe kod profesora koji je cijeli sat objašnjavao i zajedno s nama radio na problemima. Sada na laboratorijskim vježbama, uzmeš skriptu, popuniš što znaš sam, što ne znaš prepišeš, i ideš doma. Tako da sam poprilično osuđen na uglavnom samostalan rad.
A s obzirom da sam shvatio proces učenja programiranja na JAVI, znam kako to ide. Samo to je nažalost bilo kratkotrajno, za potrebe kolegija, poslije nisam imao vremena za programiranje, mada sam htio to znanje barem održati.
Išao sam na početku, ali sam odustao kad sam shvatio da mi se pristup profesora ne sviđa, a i laboratorijske vježbe su beskorisne. ...
Ma jasno. Uvijek je u nekome/nečemu drugome problem
Išao sam na početku, ali sam odustao kad sam shvatio da mi se pristup profesora ne sviđa, a i laboratorijske vježbe su beskorisne. ...
Ma jasno. Uvijek je u nekome/nečemu drugome problem
Jesi li pročitao moj komentar do kraja? Ako nisi, shvatit ću tvoj netočni zaključak.
Uzmi onda moju skriptu pa pogledaj. Imaš primjere i zadatak na tu temu.
https://www.dropbox.com/s/4ku7sz4ikkqugbm/ObjektnoProgramiranje_TVZ.pdf?dl=0
Ovo ne vidjeh ranije, hvala na linku :)
Nauci se prevoditi bezvezne Hr pojmove tipa kopirni konstruktor i operator pridruzivanja tako da si mozes naci ok tutoriale na engleskom:
I da cesto su u Hr predavaci ocaj, ali zapamti da ucis za sebe, ne za njih i neka ako su oni najvece budale na planetu(sto vjerojatno nisu) nema razloga da se zamaras previse sa time...
Odradi sto trebas u skoli, a ako hoces nesto bolje nauciti lagano na netu nades resurse.
Nauci se prevoditi bezvezne Hr pojmove tipa kopirni konstruktor i operator pridruzivanja tako da si mozes naci ok tutoriale na engleskom:
http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/
I da cesto su u Hr predavaci ocaj, ali zapamti da ucis za sebe, ne za njih i neka ako su oni najvece budale na planetu(sto vjerojatno nisu) nema razloga da se zamaras previse sa time...
Odradi sto trebas u skoli, a ako hoces nesto bolje nauciti lagano na netu nades resurse.
Ma naravno, potpuno se slažem. Samo problem je kad pored toga imaš fiziku, matišu, i još ostale obaveze... Svaka čast onima koji se mogu organizirati tokom predavanja, ali ja kvalitetno mogu učiti samo na praznicima. Tada jedino imam mir.
Kad smo već kod predavača, želim javno pohvaliti Andriju Sommera iz Splita. Momak objašnjava fantastično. Dakle, nisu svi loši. Ali jbg, nisu svi ni dobri.
Hvala na linku :)
Nauci se prevoditi bezvezne Hr pojmove tipa kopirni konstruktor i operator pridruzivanja tako da si mozes naci ok tutoriale na engleskom:
http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/
I da cesto su u Hr predavaci ocaj, ali zapamti da ucis za sebe, ne za njih i neka ako su oni najvece budale na planetu(sto vjerojatno nisu) nema razloga da se zamaras previse sa time...
Odradi sto trebas u skoli, a ako hoces nesto bolje nauciti lagano na netu nades resurse.
Ma naravno, potpuno se slažem. Samo problem je kad pored toga imaš fiziku, matišu, i još ostale obaveze... Svaka čast onima koji se mogu organizirati tokom predavanja, ali ja kvalitetno mogu učiti samo na praznicima. Tada jedino imam mir.
Kad smo već kod predavača, želim javno pohvaliti Andriju Sommera iz Splita. Momak objašnjava fantastično. Dakle, nisu svi loši. Ali jbg, nisu svi ni dobri.
Hvala na linku :)
Pusti ti njega, mi koji smo odavno završili faksove možemo reći što nas je volja, a ti se drži one poslovice da se "šušati i rogati ne mogu bosti". Pohvale ne škode, svatko voli čuti dobro o sebi, ali okani se pokuda, ne voli nitko čuti loše o sebi. Naravno da ima dobrih, jedan od takvih ti je dao svoju skriptu da ti olakša učiti.
Nauci se prevoditi bezvezne Hr pojmove tipa kopirni konstruktor i operator pridruzivanja tako da si mozes naci ok tutoriale na engleskom:
http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/
I da cesto su u Hr predavaci ocaj, ali zapamti da ucis za sebe, ne za njih i neka ako su oni najvece budale na planetu(sto vjerojatno nisu) nema razloga da se zamaras previse sa time...
Odradi sto trebas u skoli, a ako hoces nesto bolje nauciti lagano na netu nades resurse.
Ma naravno, potpuno se slažem. Samo problem je kad pored toga imaš fiziku, matišu, i još ostale obaveze... Svaka čast onima koji se mogu organizirati tokom predavanja, ali ja kvalitetno mogu učiti samo na praznicima. Tada jedino imam mir.
Kad smo već kod predavača, želim javno pohvaliti Andriju Sommera iz Splita. Momak objašnjava fantastično. Dakle, nisu svi loši. Ali jbg, nisu svi ni dobri.
Hvala na linku :)
Pusti ti njega, mi koji smo odavno završili faksove možemo reći što nas je volja, a ti se drži one poslovice da se "šušati i rogati ne mogu bosti". Pohvale ne škode, svatko voli čuti dobro o sebi, ali okani se pokuda, ne voli nitko čuti loše o sebi. Naravno da ima dobrih, jedan od takvih ti je dao svoju skriptu da ti olakša učiti.
Razumijem, ali ne postoje bez razloga anketne ocjene svakog profesora. Nema smisla da se podrazumijeva kao da je svaki profesor idealan, a studenti su krivi. Također, nema smisla ni da su svi profesori loši a studenti su idealni.
Ukratko, besmisleno je generalizirati. Rekao sam da mi se pristup jednog profesora ne sviđa, i to je moj subjektivan dojam. Dopuštam da se nekome baš taj profesor sviđa. Sto ljudi, sto ćudi.
Što se pokuda tiče, objektivna osoba bi trebala biti sposobna poslušati pokude i kritike, i objektivno ih izanalizirati te vidjeti što se može napraviti po tom pitanju A ne doživljavati ih emotivno i osobno.
I obratite pažnju da upravo zbog tog poštovanja prema profesoru, nisam spominjao njegovo ime.
Što se laboratorijskih vježbi tiče, tu je više stvar sistema nego laboranta. Ne može laborant tu puno napraviti ako mu je nastavni plan takav kakav je. Uglavnom, da ne bih previše oftopičio, završit ću.
Gospodinu, profesoru Kovačveću, se još jednom zahvaljujem.