infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Herpesius din Septembrie 28, 2008, 12:19:19



Titlul: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 12:19:19
Am răsfoit câteva pagini din manualul de a X-a şi cateva documentaţii & articole legate de STL. Sunt destul de bulversat în legătură cu câteva noţiuni care nu le-am înţeles.

1 ) Ce face using namespace std;
2 ) Ce-i un container? Dar un container deque (şi de ce se numeşte aşa)
3 ) Cu ce se mănâncă un iterator ?
4 ) La ce ajută map-ingul în C++ ?
5 ) Ce fac cu typedef ? Dar cu enum ?
6 ) Care este diferenţa dintre cerr şi clog ?
7 ) Care este diferenţa dintre ofstream f;f.open("Jiji.txt"); şi ofstream f("Jiji.txt"); ?
8 ) Ce face cout << 2222 << flush;
9 ) De ce pe compilatorul infoarena există librăriile iostream.h, fstream.h, etc şi pot să folosesc streamuri fără using namespace std; ?
10 ) Ce este un heap şi la ce ajută ?
11 ) Ce este un buffer şi la ce să-l folosesc ?
12 ) Un vector declarat din STL pot sal folosesc exact ca pe unul declarat clasic ?

Mersi :) .


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Andrei Grigorean din Septembrie 28, 2008, 12:55:27
Cam multe intrebari :P. Iti voi raspunde eu la prima:

1) In C (ca si in alte limbaje mai vechi) exista un singur univers in care traiesc variabilele si functiile. Daca intr-un proiect foarte mare ai 2 functii cu acelasi nume, vei primi o eroare de compilare. In cazul in care ajungi la foarte multe linii de cod, vei intampina probleme cu alegerea numelor astfel incat sa fie toate distincte. De aici rezulta nevoie de namespace. Practic poti sa-ti creezi mai multe "universuri" in care sa existe variabilele tale. Declaratia este ceva de genul:

Cod:
namespace MyNamespace {
    int i;
    void f() {}
    class A {};
}

Acum, pentru a accesa ceva din ce ai declarat mai sus, trebuie sa procedezi astfel:

Cod:
    MyNamespace::i;
    MyNamespace::f();
    MyNamespace::A a;

Daca doresti sa ai acces direct, trebuie sa declari undeva ca vrei sa folosesti un anumit namespace:

Cod:
    using namespace MyNamespace;

    i;
    f();
    A a;

Toate functiile si clasele din librariile standard C++ se afla in namespace-ul std. Trebuie sa il incluzi daca vrei sa renunti la constructii de genul:

Cod:
    std::cout << "Hello world!" << endl;


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 13:02:20
Mersi.  ](*,) n-a fost chiar aşa greu. :). Deci Borland C++ 3.1  for dos (sau cum se numeste) este compilator numai pentru C++ ?


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Andrei Grigorean din Septembrie 28, 2008, 13:18:41
Borland C++ 3.1 (care este un IDE) are un compilator invechit care nu respecta niciun standard.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Valentin Stanciu din Septembrie 28, 2008, 13:28:48
Borland C++ este un compilator de C cu extensii de C++. Programul a fost scos _inainte_ sa se stabileasca standardul C++. De aceea nici nu il respecta.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 14:14:51
Păi la olimpiadă(judeţeană) eu scriu algoritmi care nu respectă standardul C/C++ ? Defapt nici manualul care este tipărit în 2008 nu-l respectă cu void main, care este incorect si impropiu zis ca un program să nu aibă exit status.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 14:27:03
Borland C++ este un compilator de C cu extensii de C++. Programul a fost scos _inainte_ sa se stabileasca standardul C++. De aceea nici nu il respecta.

Am folosit compilatorul BC 5.5 in linia de comanda si e ok :). De cand cu UNIX-u nu mai am nevoie de el.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Andrei Grigorean din Septembrie 28, 2008, 15:34:15
La olimpiada nu scrii algoritmi, scrii programe. Si DA, esti obligat sa folosesti un compilator care nu respecta standardul! (nici manualele nu sunt foarte destepte ;) )


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 15:48:30
Citat
Prin participarea la olimpiada judeţeană de informatică eşti de acord să scrii programe care încalcă orice standard existent.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Valentin Stanciu din Septembrie 28, 2008, 15:57:49
Păi la olimpiadă(judeţeană) eu scriu algoritmi care nu respectă standardul C/C++ ? Defapt nici manualul care este tipărit în 2008 nu-l respectă cu void main, care este incorect si impropiu zis ca un program să nu aibă exit status.

Poti sa scrii C standard in Borland C++. Pe ala cred ca il respecta :)
C++ sigur nu e complet. (ex: nu are biblioteci STL, variabilele au alt scope, etc)


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 16:05:35
Dacă îl respecta atunci int c[9]={0}; era {0,0,0,0,0,0,0,0,0,0} nu {0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Stefan Istrate din Septembrie 28, 2008, 16:36:40
2) Containerul e o clasa capabila sa retina alte tipuri de obiecte. De exemplu, vector <Obj> retine obiecte de tip Obj. Containerul deque este pur si simplu un alt container (deque = double-ended queue).

3) Iteratorii pentru niste containere sunt ca niste pointeri pentru variabilele obisnuite. Astfel, ii poti folosi pentru a traversa tot containerul din element in element si ii poti dereferentia pentru a afla elementul catre care refera.

4) Maparea este folositoare cand ai o corespondenta intre 2 multimi A si B, iar unui element din multimea A ii corespunde doar unul din multimea B.

5) Cu typedef dai tu un alt nume unui tip de date deja existent. Poate vrei sa nu definesti in program variabilele intregi ca int. Si atunci definesti:
Cod:
typedef int Intreg;
Enum e folosit pentru a defini mai multe constante intregi intre care exista o oarecare legatura.
Cod:
enum STARE_PROGRAM {PROGRAM_NEINCEPUT, PROGRAM_IN_EXECUTIE, PROGRAM_TERMINAT};
Acum, folosind o variabila de tip STARE_PROGRAM, tu te referi doar la una din cele 3 stari.

6) cerr e pentru a directiona erorile catre el, clog pentru alte informatii. Nu stiu ce detalii sa-ti dau mai mult.

7) Cu ofstream f; f.open("Jiji.txt"); tu creezi un obiect gol de tip ofstream dupa care ii deschizi un fisier.
Cu ofstream f("Jiji.txt"); deschizi fisierul chiar de la crearea obiectului (deci din constructor)

Intr-adevar multe intrebari. Poate iti mai raspund mai incolo.
Btw, la 8 banuiesc ca vroiai sa scrii flush in loc de flux.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 17:00:32
Da, flush. Mersi mult.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Valentin Stanciu din Septembrie 28, 2008, 19:08:21
Dacă îl respecta atunci int c[9]={0}; era {0,0,0,0,0,0,0,0,0,0} nu {0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}

Cum poate tipul int sa aibe valoarea NULL?
Poate am inteles eu gresit ce vrei sa zici. Oricum, initializarea corecta este descrisa aici: http://www.eskimo.com/~scs/cclass/notes/sx4aa.html


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 20:08:20
Am greşit , înloc de NULL e un număr aleator. Pe gcc iniţializează tot vectorul cu valoarea 0.


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Sebastian Crisan din Septembrie 28, 2008, 20:19:47
5)
Enum e folosit pentru a defini mai multe constante intregi intre care exista o oarecare legatura.
Cod:
enum STARE_PROGRAM {PROGRAM_NEINCEPUT, PROGRAM_IN_EXECUTIE, PROGRAM_TERMINAT};
Acum, folosind o variabila de tip STARE_PROGRAM, tu te referi doar la una din cele 3 stari.

Respectivele constante iau in ordine valorile 0, 1, 2, ...
sau poti sa le dai tu alte valori
Cod:
enum STARE_PROGRAM {PROGRAM_NEINCEPUT = 10, PROGRAM_IN_EXECUTIE = 100, PROGRAM_TERMINAT = 500};

Asa poti sa-ti creezi un tip boolean
Cod:
enum {FALSE, TRUE};
sau sa lucrezi cu lunile anului
Cod:
enum {IAN = 1, FEB, MAR, APR };
Try it!


Titlul: Răspuns: Ajutaţi-mă să înţeleg câteva lucruri vă rog.
Scris de: Herpesius din Septembrie 28, 2008, 20:25:18
Good point. Încă un motiv să-mi uimesc colegii la tablă ...