Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Limbaj C++  (Citit de 3262 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
cristy
De-al casei
***

Karma: 2
Deconectat Deconectat

Mesaje: 136



Vezi Profilul
« : Iunie 22, 2006, 11:02:33 »

de ceva vreme, m-am pus pe c++, si am unele nelamuriri, nu stiu cum sa fac unele kestii, de ex:
1. nu stiu sa declar o lista simplu dublu inlantuita de ex
2. am vazut ca se pot supraincarca operatori, dar pentru asta am vazut ca trebuie declarati in diferite clase, de ex cum trebuie facuta o clasa pentru operatii pe numere mari

pls...help.... 
Memorat

... lipsa de inspiratie ...
Prostu
Nu mai tace
*****

Karma: 134
Deconectat Deconectat

Mesaje: 323



Vezi Profilul
« Răspunde #1 : Iunie 22, 2006, 13:57:44 »

1. Pentru a declara o lista simplu inlantuita spre exemplu poti sa faci asa:
Cod:
struct nod { int info; nod *urm; }; 
nod *prim;
Si pentru a declara o lista dublu inlantuira aproape la fel:
Cod:
struct nod { int info; nod *prev, *urm; };
nod *prim;
Cam asa se declara in principiu, exact ca orice structura. Dar pot sa varieze in functie de cum vrei sa o implementezi.

2. Pentru o clasa de numere mari poti face asa:
Cod:
class Mare{ //ordinea functiilor nu conteaza, conteaza in schimb in ce categorie le pui
    private: int n, a[LMAX]; //pot fi accesate numai de elementele clasei (off topic: clasele prieten sunt ceva mai complicate)
    //poti sa declari aici si functii
    public: //pot fi accesate din exterior
    Mare(); //constructor, optional, in general il declari
    //restul functiilor
    Mare operator+ (Mare x); // se declara ca orice functie, [type] [name] ([parameters]);
    void afisare();
    //si ce mai vrei
    ~Mare(); //destructor, optional, il folosesti mai mult la debug
};
Functiile le poti defini in clasa (si sunt definite inline) sau in afara, caz in care functia se apeleaza [type] [classname]::[name] ([parameters]) :
Cod:
Mare::Mare() { n = 0; memset(a, 0, sizeof(a)); }
Mare Mare::operator+ (Mare x) {
    Mare ret;
    int t;
    for (ret.n = 0; ret.n < this->n || ret.n < x.n || t; ++ret.n, t /=10) // Berinde(c)
          ret.a[ret.n] = (t += this->a[ret.n] + x.a[ret.n]) % 10;
    return ret;
}
// pentru a nu se crea confuzii pointerul "this" indica elementul care a apelat functia
void Mare::afisare() {
   printf("%d\n", n); // nu e nici o confuzie, dar e in general mai bine sa folosesti pointerul "this"
   //blablabla
}

//pentru a le folosi ai ceva de genul
Mare a, b, c;
a = b + c;
a.afisare();
//operatorul "=" este incarcat implicit, dar poti sa-l supraincarci si pe el daca vrei...

Poti afla forte multe pe de pe net, sunt un infinit de tutoriale pentru clasele din C++ si in general C++. Eu, cel putin, le-am invatat din cateva tutoriale de pe net. Google it.
Memorat
Coty
Nu mai tace
*****

Karma: 6
Deconectat Deconectat

Mesaje: 235



Vezi Profilul WWW
« Răspunde #2 : Iunie 22, 2006, 15:03:36 »

cat despre overloading, cum ai zis si tu, cum a zis si stefan, se poate face si fara sa fie in clasa, din cate stiu eu.
de exmplu poti sa pui
Cod:
long operator--(long x)
{
      return x-1;
}
ce e drept, am incercat
Cod:
Mare operator+(Mare A, Mare B)
{
//    bla bla bla
}
si m-am intrebat de ce nu merge... si mai ales de ce functia de adunare pe care a scris-o stefan nu e declarata ca
Cod:
Mare Mare::operator+=(Mare A)
Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #3 : Iunie 22, 2006, 15:44:04 »

Functia data de Stefan(Prostu) face ce face si + pe int-uri (nu +=)... adica c=a+b, nu a=a+b.. D-aia e declarata ca + si nu += Tongue

Faza cu supraincarcarea operatorilor de long... nu am facut-o si nici nu am de ce... Oricum ce ai zis tu acolo nu compileaza Smile

ce e drept, am incercat
Cod:
Mare operator+(Mare A, Mare B)
{
//    bla bla bla
}
si m-am intrebat de ce nu merge...
O functie operator intr-o clasa e ca orice alta functie in o clasa, doar ca apelarea lor este diferita...
O functie normala e apelata clasa.functie(parametrii);
O functie operator e apelata clasa operator parametrii;

Operatorul + nu primeste 2 parametrii, ci doar unul (cel din dreapta operatorului)... Operandul din stanga e cel asupra caruia se aplica operatorul... De aceea in declararea unei functii operator trebuie specificat clasa asupra caruia se poate aplica (partea cu Clasa:: ), in cazul in care declararea nu se face direct intr-o clasa.

De asemenea, in cazul in care in cadrul unei functii / functii operator e nevoie de clasa asupra careia se aplica functia / operatorul se poate folosi pointerul "this"... Asta e folositor de exemplu in supraincarcarea operatorului = cand, dupa ce se modifica componenta clasei curente, se returneaza "*this". Aceasta permite apelarea unui lant de atribuiri (a = b = c)
« Ultima modificare: Iunie 22, 2006, 15:51:43 de către bogdan2412 » Memorat
Prostu
Nu mai tace
*****

Karma: 134
Deconectat Deconectat

Mesaje: 323



Vezi Profilul
« Răspunde #4 : Iunie 22, 2006, 15:50:48 »

Operatorul '+' este un operator binar.
Cod:
Mare a, b, c;
a = b + c;
Expresia este evaluata in mod normal, operatorul '=' fiind evaluat de la dreapta la stanga si operatorul '+' de la stanga la dreapta. Operatorul '+' este apelat de 'b' si, din moment ce este in operator binar, are nevoie de un al doilea operand 'c'. Suma returneaza un element de tip 'Mare', care este atribuit lui 'a'.

In cazul clasei operatorul '+' este apelat de un element, asta pentru a respecta principiul de definire a clasei, si a nu lasa pe nimeni sa se joace cu ea din exterior. De aceea e diferit de [urm exemplu] unde poti sa schimbi elementele din exterior fara nici o grija si sa te joci cu ele.
Cod:
struct ceva{ int a, b; };
ceva operator+ (ceva x, ceva y) {
    ceva z;
    z.a = x.a + y.a;
    z.b = x.b + y.b;
    return z;
}

Clasa are rolul de a garanta integritatea datelor, introducand conceptele de 'private' si 'friend'. Altfel poti sa o scrii totul la fel de usor sub forma de struct.
« Ultima modificare: Iunie 22, 2006, 16:16:14 de către Prostu » Memorat
Coty
Nu mai tace
*****

Karma: 6
Deconectat Deconectat

Mesaje: 235



Vezi Profilul WWW
« Răspunde #5 : Iunie 23, 2006, 07:59:19 »

Bun, bogdane, acum m-ai lamurit si pe mine Very Happy ca nu stiam chestia cu "clasa operator parametrii"...
Si, pe de alta parte...
Cod:
struct ceva{ int a, b; };
ceva operator+ (ceva x, ceva y) {
    ceva z;
    z.a = x.a + y.a;
    z.b = x.b + y.b;
    return z;
}
asta merge sa fie apelata x=a+b, unde x,a,b sunt de tip ceva? ca acum mi se pare logic ce zici

PS: ca mi-am adus aminte, nici eu nu as face overload pe int sau pe long, dar am dat un exemplu...
Memorat
cristy
De-al casei
***

Karma: 2
Deconectat Deconectat

Mesaje: 136



Vezi Profilul
« Răspunde #6 : Iunie 23, 2006, 19:34:39 »

faceti-mi pls o clasa pt suma de vectori, cu functia respectiva necompletata...sa vad concret...ca nu prea am inteles...
Memorat

... lipsa de inspiratie ...
Prostu
Nu mai tace
*****

Karma: 134
Deconectat Deconectat

Mesaje: 323



Vezi Profilul
« Răspunde #7 : Iunie 23, 2006, 21:44:55 »

 Think Raised eyebrow
As you wish...
Cod:
class Mare{
    private: int n, a[LMAX];
    public:
        Mare();
        Mare operator+ (Mare x);
};
Memorat
nash_mit
Vizitator
« Răspunde #8 : Iunie 24, 2006, 08:32:44 »

http://www.cwu.edu/~andonie/Cartea%20de%20algoritmi/cap2.htm#c2
   Citeste asta ... te ajuta sa iti dai seama ce si cum ... dupa ce ti-ai dat seama despre ce este vb o sa vezi ca nu este mare filosofie ....
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines