infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Rus Cristian din Iunie 22, 2006, 11:02:33



Titlul: Limbaj C++
Scris de: Rus Cristian din 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.... 


Titlul: Re: Limbaj C++
Scris de: Stefan-Alexandru Filip din 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.


Titlul: Re: Limbaj C++
Scris de: Sima Mihai Cotizo -vechi din 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)


Titlul: Re: Limbaj C++
Scris de: Bogdan-Cristian Tataroiu din 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 += :P

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

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)


Titlul: Re: Limbaj C++
Scris de: Stefan-Alexandru Filip din 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.


Titlul: Re: Limbaj C++
Scris de: Sima Mihai Cotizo -vechi din Iunie 23, 2006, 07:59:19
Bun, bogdane, acum m-ai lamurit si pe mine :D 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...


Titlul: Raspuns: Limbaj C++
Scris de: Rus Cristian din 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...


Titlul: Re: Limbaj C++
Scris de: Stefan-Alexandru Filip din Iunie 23, 2006, 21:44:55
 :-k :eyebrow:
As you wish...
Cod:
class Mare{
    private: int n, a[LMAX];
    public:
        Mare();
        Mare operator+ (Mare x);
};


Titlul: Raspuns: Limbaj C++
Scris de: nash_mit din Iunie 24, 2006, 08:32:44
http://www.cwu.edu/~andonie/Cartea%20de%20algoritmi/cap2.htm#c2 (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 ....