#6 Martin
Ved KIIV ti povedal co sa deje. Precitaj si to este raz a pri tom si uvedom ze pocitac je velmi rychly :)
fasffa ti zas napisal jedno z mnoha rieseni tvojho problemu (funguje na windowse).
#1 fnenks
miesto:
inventory(Type = 0); //do stringu nemozes zpisat integer
pouzi 2 konstruktori.
inventory(const Type &t);
inventory();
vo funkcii operator(int, int) sa tiez snazis do stringu priradit 0.
Na indexovanie matice nebudes potrebovat zaporne cisla, pouzi unsigned, pripadne size_t.
To ze sa skoro vsetko indexuje od 0 ale tvoje funkcie budu indexovat od 1 bude fakt prehladne :)
Nerob funkcie moc blbovzdorne, radsej napis komentar ako sa maju pouzivat.
#1 fnenks
Pri pretazeni operatora nemozes menit jeho prioritu ani pocet parametrov.
Operator [] moze ale vracat premennu. Takze pretazis [] napr takto:
int &operator[](const unsigned &n);
Cize operator vrati referenciu na int (pripadne na iny typ). Referencia sa da pouzit ako lvalue, cize mozes pozuit naslende priradenie cez = .
Ten algoritmus ma ale dost velku zlozitost (je pomaly). Da sa napisat jednoduzsi algoritmus ktori nepozuiva strlen() a na spracovanie retazca mu staci 1 prechod cez cele pole(retazec).
char *a, *b;
for(a= b= str1; *b != '\0'; b++){
if(*b != 'x' && *b != 'w'){
*a = *b;
++a;
}
}
*a = '\0';
#5 Wannabie
Skus si tam zadat "axxbxxc". Ked narazis na prve 'x', tak posunies zvysok retazca. Lenze na miesto povodneho 'x' vlozis nasledujucu hodnotu ktora je v tomto pripade zas 'x'. Kedze vo for-e inkrementujes p tak toto dalsie 'x' uz netestujes a ostane ti v retazci.
Aka je to "horna trojuholnikova" matica, co reprezentuje ta matica, ako ju chces upravovat a co vlastne pocitas?
Zatial mi to pripada ze matica reprezentuje rovnice o viacerych premennych a chces ju upravyt na stupnovyty tvar (cez gem?) a potom vypocitat korene. Mozno len taram blbosti a pocitas daco ine :)
#7 Marcel
vo funkcii vypis() pouzivas neinicializovanu maticu, ked nacitas/vytvoris maticu, tak ju musis dostat do funkcie ako parameter (alebo this, globalnu premennu, ...) . Cize funkcia bude vyzerat dako takto:
void vypis(int ** mat, size_t riadky, size_t stlpce);
Kedze programujes v c++, tak sa uplne ziada pouzit na maticu triedu ktora bude obsahovat samotne data, pocet riadkov a stlpcov. Potom moze vyzerat funkcia takto:
class matica{
int **mat;
size_t riadky;
size_t stlpce;
public:
//konstruktor
//destructor
//...
};
void vypis(const matica &mat);
alebo rovno:
class matica{
//...
void vypis();
void nacitaj(const string &meno_suboru);
};
Mozno by bolo dobre alokovat maticu ako jednorozmerne pole( new int[riadky*stlpce]), bude zaberat menej miesta, alokacia bude rychlejsie a bude sa lepsie zapisovat do suboru; Na pristup k prvkom matice sa da pekne pretazit operator []
int main (int argc, char *argv[]) {
vector<int> v; //vytvori vektor (kontajner)
vector<int>::iterator i; //vytvori iterator(iterator odkazuje na prvok kontajneru, v tomto pripade vektor<int>, zatial je neinicializovany)
v.push_back(1); //vlozi na koniec vektora cislo 1
v.push_back(2);
v.push_back(3);
//vypisanie obsahu vektora pomocou ciselnych indexov:
for(size_t n = 0; n < v.size(); ++n){
cout << v[n] << endl;
}
//vypisanie obsahu vektora pomocou iteratora:
for(
i = v.begin(); //inicializuje iterator na prvy prvok vektora
i != v.end(); //iterator i sa nesmie rovnat poslednemu prvku vektora(kontajnera), treba si uvedomit ze funkcia end() nevracia iterator na psoledny nami vlozeny prvok ale iterator na prvok co by nasledoval za nim (to akym sposobom je to implementovane nie je podstatne)
++i){ //inkrementuje iterator
cout << *i << endl; //vypise hodnotu na ktoru ukazuje iterator
}
v.clear(); //zmeze obsah vectora(kontajnera)
return 0;
}
Ak mozes pouzit stl tak si skus pozriet set. Mozes to potom velmi jednoducho zjednodusit.
Mohol by si pouzit referencie v parametroch:
bool obsahuje(const string &prvek)const;
void vypis()const;
int getVelikost()const;
const string &getPrvek(int index)const;
bool addPrvek(const string &prvek);
Mnozina operator+(const Mnozina ¶m)const;
Mnozina operator-(const Mnozina ¶m)const;
Mnozina operator*(const Mnozina ¶m)const;
stdarg.h obsahuje macra na pracu s funkciami ktore maju premennlivy pocet parametov.
printf a fprintf su funkcie ktore maju premenlivy pocet parametrov a zrejme vyuzivaju macra v stdarg.h.
v podstate si musis vytvorit novu funkciu, napr:
xprintf(FILE *f, const char * str, ...);
tato funkcia bude volat aj printf aj fprintf s rovnakymi parametrami (okrem prveho, ten je u printf standartne stdout).
Cize musis zyskat vsetky "premenlive" parametre z xprintf a zavolat s nimi fprntf a printf (mozno ich bude treba aj pretypovat).
Alebo mozes pozit vfprintf
#1 jupiik
Funkcia operator* je template, cize musis specifikovat podla akych typov sa ma generovat. V tvojom pripade podla typov <T, K>
template <typename T, typename K>
class Matrix
{
public:
friend Matrix<T,K>& operator*<T, K>(const K left, Matrix<T,K>& right);
};
toupper zmeni male pismena na velke, takze staci testovat 'A' a 'N'.
Nasledna podmienka bude vzdy pravdiva.
if(c == 'A' || 'a')
Spravne by mala byt takto, ale kedze je tam predtym toupper tak je to zbytocne...
if(c == 'A' || c == 'a')
toto bude mozno fungovat, ale neskusal som to
if(kbhit()){
char c = toupper(getch());
if(c == 'A')/* ... */;
else if(c == 'N')/* ... */;
}
del /S /Q <zlozka>
Ak bouzivas win tak mozno bude stacit kbhit
#1 piwolukas
int x=strlen(jmeno +1)
tato cast bude fungovat len ak je retazec nenulovej dlzky, ak je nulovy tak inkrementujes poziciu retazca za '\0' a strlen bude pracovat s neukoncenym retazcom (v lepsom pripadne program havaruje)
lepsie je pouzit toto:
int x=strlen(jmeno)-1
Ucit sa programovat na 3D hernom engine je fakt velke sústo :)
Dik.
Mam nasledovny problem:
template <class T>
class C{
T t;
};
template <class T>
class A{
public:
list<C<T> > lb; //<-- bez chyby
list<C<T> >::iterator i; //<-- chybne
list<C<int> >::iterator k; //<-- pre konkretny typ bez chyby
};
To Grungy :
Presne tak, ale uz som asi zistil cim to bude.
Volanie virtualnych tried sa robi cez tebulky virtualnych metod (pekne vysvetlene tu: http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/)
Tieto vtables neuchovavaju udaje o pristupovych pravach, cize prekladac vyuzie pristupove prava triedy z ktorej je metoda volana.
V mojom priklade bola metoda volana z triedy B. V tejto triede je B verejna a to ze v skotocnosti sa pouzie trieda D kde je privatna nemal prekladac ako zistit. Ale je zaujimave ze sa to da takto okaslat :)
Mam jeden "problem". Potreboval by som vysvetlit nasledujuci kod:
#include "iostream"
using namespace std;
class B{
public:
virtual void fun(){cout << "B::fun()" << endl;}
};
class D : public B{
private:
void fun(){cout << "D::fun()" << endl;}
};
int main()
{
D d;
B *x= &d;
x->fun();
return 0;
}
Moze 2+ vlaknovy proces vyuzit viac procesorov alebo treba vytvorit viac procesovy program?
Ukazatele su v c/c++ vsade. Polia, retazce, dynamicka allokacia pamete(vsetko je zviazane s ukazatelmi)... Neskor pri oop to bude este zaujimavejsie(dedenie + pointre + virtualne funkcie :) ). Dalej ukazatele na ukazatele, ukazatele na funkcie. Cim skor sa ich naucis, tym lepsie. Nevyhnes sa im, vpodstate su aj jednoduche.
V podstate je velka cast jazyku c podmnozinou c++, samozrejme su tam dake rozdiely. Jazyk c je rychlejsi a jednoduhsi ako c++ lebo neobsahuje kopu oop balastu ale zas v c++ napises vela veci rychlejsie a prehladnejsie. Dobre je vediet c aj c++ :) . Samozrejme mozes kombinovat jazyky, cast programu napises v c, inu cast v c++, dalsiu trebarz v jave/c# ...
Ako spomenuli vyzsie, hlavne je dvolezite naucit sa principy programovania (algoritmizacia, ...). Ked uz vies daky prgramovaci jazyk, tak naucenie dalsieho je radovo jednoduhsie a rychlejsie.
Ja som robil ako semestralku maticovu kalkulacku (s moznostou zadavania jednoduchych scriptov, napr "( A * B) / sin(C) + det(D)..." kde pismena mohly byt cisla(int, real), matice, premenne pripadne aj retazce ). Naucil som sa pri tom toho dost :)
Neviem ci je dobre pri dedeni rozlisovat triedy na rodica a potomka(to skor pri procesoch)...
Mozno si chcel nieco taketo:
class Predmet
{
private:
int aPosX;
SDL_Surface *aPovrch;
public:
Predmet(int x, SDL_Surface *p=NULL){ aPosX = x; aPovrch = p; }
};
class Terc : public Predmet
{
public:
Terc(int x):Predmet(x, SDL_LoadBMP("..\\terc.bmp") ){}
};
Constructor a destructor v triede Terc ma tiez divne meno :)
(a kopa inych chyb...)
Minuly rok som robil tieto triediace algoritmi do skoly. Tusim kazdy cyklus/rekruzia ktora prejde cez cele pole ja nasobok n. Rekruzivne volania v tomto pripade budu mat asi zlozitost log(n).
Nasiel som zadanie co som robil do skoly:
template <class DATA>
DATA *quick_sort(DATA *data, unsigned len)
{
DATA *a = data+1, *b=data+len-1, *med = data;
unsigned a_len=0u, b_len=0u;
if(len==1)return data;
while( a <= b ){
if(*a > *med){
if(a != b)swap(*a, *b);
b--;
b_len++;
}
else {
a++;
a_len++;
}
}
if(!a_len){
a=data;
a_len=1;
b=data+1;
}
else if(!b_len){
swap(data[len-1u], *med);
a=data;
b=data+len-1u;b_len=1u;
}
else{
a = data;
a_len++;
b++;
}
quick_sort(a, a_len);
quick_sort(b, b_len);
return NULL;
}
V tom programe mas chybicku.
Pivot by mala byt stredna honota prvkov pola, ale zistit strenu hodnotu je narocne.
Preto ju treba dako tipnut. Lenze ak v tvojom programe tipnes za pivot akurat najmensiu honotu v poli tak sa pole neusporiada spravne.
Je to preto, lebo vzdy pridavas prvky rovne pivotu do pravej casti pola, tym paom ak je pivot najmensi prvok pola tak lava cast ostane prazdna.
skus si to pre napr. toto pole:
int nmb[10]={10,9,8,7,1,1,1,4,3,2};