O mica problema la afisare la clase!!!

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

O mica problema la afisare la clase!!!

Post by yoyulian » 11 Apr 2013, 20:25

Salut asa avea o problema, nu stiu cum sa fac sa afisez frumos fiecare Student nmerotat, in functie de nr de studenti. Am facut un for in functia main ca sa imi numeroteze, studentii dar nu merge.

Code: Select all

#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>

class Student 
{
	char nume[30];
	char prenume[30];
	int grupa;
	int *note; //tablou in care se stocheaza notele de la n discipline 
	float media;
public:
	int nr_discipline;
	Student();
	~Student();
	void init(char *n, char *p,int nr,int gru);
	float medie();
	//metode getter
	char *get_nume()
	{
		return nume;
	}
	char *get_prenume()
	{
		return prenume;
	}
	int get_nr_discipline()
	{
		return nr_discipline;
	}
	int get_grupa()
	{
		return grupa;
	}

	//metode setter
	void set_nume(char *n)
	{
		strcpy(nume, n);
	}
	void set_prenume(char *p)
	{
		strcpy(prenume,p);
	}
	void set_nr_discipline(float nr)
	{
		nr_discipline=nr;
	}
	void set_grupa(float gru)
	{
		grupa=gru;
	}
};

Student::Student()
{
	char name[30];
	char lastname[30];
	int nd;
	int gru;
	cout<<endl;
	cout<<"Nume:";
	cin>>name;
	cout<<"Prenume:";
	cin>>lastname;
	cout<<"Introduceti grupa:";
	cin>>gru;
	cout<<"Numarul de discipline este implicit 6!!!\n";
	nd=6;
	init(name , lastname , nd, gru);
}

Student::~Student()
{
	cout<<"Se face eliberarea spatiului!!!";
	delete []note;
}

void Student::init(char *n,char *p, int nr,int gru)
{
	strcpy(nume,n);
	grupa=gru;
	strcpy(prenume,p);
	nr_discipline=nr;
	note=new int[nr];
	
	cout<<"Introduceti notele obtinute la cele 6 materii\n";
	for(int i=0;i<6;i++)
	{
		cout<<"\tNota"<<i+1<<": ";
		cin>>note[i];
	}
	cout<<endl;
}
float Student::medie()
{
	int S=0;
	for(int i=0;i<nr_discipline;i++)
		S+=note[i];
	return((float)S/nr_discipline);
}
int main()
{
	int ns,temp;
	float *medii;
	char  buf[30];
	cout<<"Introduceti numarul Studentilor:";
	cin>>ns;
	cout<<endl;
	
	Student *stu; //salveaza studentii in vectorul dinamic stu
	for(int i=0;i<ns;i++)
	{
		cout<<"Introduceti datele Studentului "<<i+1;

	Student *stu= new Student[ns]; //salveaza studentii in vectorul dinamic stu 
	} 
	//salveaza mediile studentilor in vectorul dinamic medii
	medii=new float[ns];
	for(int i=0;i<ns;i++)
		medii[i]=stu[i].medie();
cout<<endl;
	cout<<"Mediile studentilor:";
	for(int i=0;i<ns;i++)
		cout<<medii[i]<<" ";

	//ordonarea vectorului medii cu metoda bulelor
	int flag,nrparc=0;
	for(int i=0;i<ns;i++)
	{
		flag=0;
		for(int j=1;j<ns-nrparc;j++)
		{
			if(medii[j-1]<medii[j])  //pentru a ordona descrescator
			{
				flag=1;
				//interschimbam mediile
				temp=medii[j-1];
				medii[j-1]=medii[j];
				medii[j]=temp;
				//odata ce am schimbat mediile trebuie sa schimbam si studentii corespunzator mediilor
				//1.Schimbam numele
				strcpy(buf,stu[j-1].get_nume());
				stu[j-1].set_nume(stu[j].get_nume());
				stu[j].set_nume(buf);
				//2.Schimbam prenumele 
				strcpy(buf, stu[j-1].get_prenume());
				stu[j-1].set_prenume(stu[j].get_prenume());
				stu[j].set_prenume(buf);
				//3.Schimbam numarul de discipline
				temp=stu[j-1].get_nr_discipline();
				stu[j-1].set_nr_discipline(stu[j].get_nr_discipline());
				stu[j].set_nr_discipline(temp);
			} //end if
		}
		nrparc++;  //crestem numarul de parcurgeri dupa prima parcurgere suntem singuri ca ultimul element e pus
		//bine=>nu-l vom mai verifica
		if(flag==0)
			break;
		//daca s-a parcurs tot vectorul si nu s-a facut interschimbarea =>sirul este deja ordonat
	}//end Bubble_Sort
	//am ordonat tabloulul medii si tabloul studenti descrescator in f d medii
	//afisam primii trei studenti
	cout<<endl;
	cout<<"\nVectorul medii ordonat:";
	for(int i=0;i<ns;i++)
		cout<<medii[i]<<" ";
	cout<<endl;
	

	cout<<"\nStudentii aranjati in ordinea mediilor!Nr de studenti sunt:"<<ns<<"\n";
		for(int i=0;i<ns;i++)
		{
			cout<<"\n"<<i+1<<". Numele si Prenumele:"<<stu[i].get_nume()<<" "<<stu[i].get_prenume()<<"\n\t Grupa "<<stu[i].get_grupa()<<"\n\tMedia:"<<medii[i];
			cout<<" ("<<stu[i].get_nr_discipline()<<" discipline)\n";
		}
}   //endmain
Last edited by Marius Bancila on 15 Apr 2013, 12:45, edited 1 time in total.
Reason: code tags



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: O mica problema la afisare la clase!!!

Post by Ovidiu Cucu » 11 Apr 2013, 21:43

Pana una-alta, arunca te rog un ochi aici: viewtopic.php?f=13&t=2394#p15441.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: O mica problema la afisare la clase!!!

Post by bu7ch3r » 12 Apr 2013, 00:42

Mica mica problema. Dar ce ne facem cu nivelul de acces...
Ai acolo setteri, getteri, constructori, destructori...de toate. O apa si-un pamant...
Hint: Eu n-am mai vazut clase instantiabile care sa aibe constructori privati, zic si eu :-??
Alt hint: pune si tu [ *code*] inainte de code si [*/code*] inainte de codul tau sursa, fara *, sa vezi ce faine se vede. Daca mai bagi si niste taburi/4 spatii pe unde crezi o sa fie si aliniat fain fain.
Ultimul hint promit: codul il vad, dar pune si erorile de compilare ca sa poate doritorii sa-ti explice mai bine(ca mine).

L.E. Scuza-ma, tocmai am vazut "public:" prin cod:)
Cu stima,
Lupu Claudiu

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: O mica problema la afisare la clase!!!

Post by Ovidiu Cucu » 12 Apr 2013, 09:47

Pana la a o face sa mearga...
Odata ce programezi in C++ si folosesti deja STL (std::cin si std::cout din iostream), atunci poti folosi si clasele std::string si std::vector, tot din STL.

Ceva de genul

Code: Select all

#include <iostream>
#include <string>
#include <vector>

class Student
{
   std::string m_nume;
   std::string m_prenume;
   unsigned int m_grupa;
   std::vector<unsigned int> m_note;
   // ...
};
Asta te scuteste de grija alocarilor / dealocarilor si a altor dureri de cap.
OK, sa zicem ca ramanem deocamdata in domeniul "C cu cin si cout" la care adaugam si "class". :).
Hai sa vedem ce-i naspa in codul tau, pas cu pas!
  1. Code: Select all

    class Student 
    {
       //...
       float media;
       //...
    };
    media este un membru redundant. Nu ai nevoie sa-l stochezi in obiect atata timp cand poti calcula media oridecate ori ai nevoie. Deci scoate acel membru si adauga o metoda, sa-i zicem, "calculeza_media".
  2. Code: Select all

       int grupa;
       // ...
       void set_grupa(float gru)
       {
          grupa=gru;
       }
    La ce bun argument tip float daca vrei sa setezi un int? Ca sa-l faci pe bietul compilator sa-i vina rau de-atatea warning-uri? Deci, daca vrei sa setezi un int, pune un argument tip int.
  3. Code: Select all

    class Student 
    {
       char nume[30];
       // ...
    
    De ce 30 si nu 10 sau 10000? Ok, sa zicem ca am ales 30 iar pe student il cheama "Mobutu Sese Seko Kuku Ngbendu wa Za Banga". Sau pur si simplu utilizatorul se joaca si introduce un nume luuuuuuung... Da pe dinafara, nu-i asa?
    Deci, in general stringurile de acest fel e bine sa le aloci dinamic, adica
    • sau pui membrii nume, prenume tip char* si aloci dinamic atat cat ai nevoie, tinand si cate un membru care sa stie lungimea
    • sau implemetezi o clasa sa-i zicem String; asta poate fi un overkill insa cred ca am dat prin forumn un scehelet simplu
    • sau, cel mai bine folosesti o clasa deja facuta pentru stringri, de exemplu std::string de care aminteam la inceput.
  4. Code: Select all

       void set_nr_discipline(float nr)
       {
          nr_discipline=nr;
       }

    Asta, in afara de ce-am zis mai devreme cu argumentul de tip float, e cu huiduieli. Modifici doar membrul care ar trebui sa tina minte cate note are bietul student, fara sa modifici si alocarea pentru int *note. Motiv suficient ca undeva in alta parte programul sa dea pe din laturi si sa crape cu strigaturi.
  5. Code: Select all

    Student::Student()
    {
       // face, dreje, arde, frije; n-are gura ca sa strige... :)
    }

    Intr-un constructor e bine sa te limitezi la a seta membrii cu valori date ca parametri sau valori default. Nu te apuci de cinestie ce cularai ca introdus date de la consola, citit fisiere s.a.m.d. In caz ca una dintre functiile apelate da kix (intoarce eroare sau arunca o exceptie), obiectul ramane in "zona crepusculara", pe romaneste in ceatza.
    In cazul tau, pentru introdus nume, prenume si ce-o mai fi de la consola, fa o metoda separata.
  6. Code: Select all

       Student *stu; //salveaza studentii in vectorul dinamic stu
       for(int i=0;i<ns;i++)
       {
          //...
          Student *stu= new Student[ns]; //salveaza studentii in vectorul dinamic stu 
       } 
    Serios? Vezi ca ai doua variabile Student *stu distincte: una interioara iar alta exterioara buclei for.
  7. si sigur or mai fi...

yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

O mica problema la afisare la clase!!!

Post by yoyulian » 12 Apr 2013, 18:50

Mersii mult la toti. Eu nu sunt profesionist ca voi, ce sa faci acuma incep sa invat si eu programare.
Si eu am intrebat, ca as vrea sa imi numeroteze Studentii. Cand intrii in program iti cere nr de studenti, iar pe urma zice in felul urmator ”Introduceti datele Studentului” iar eu as vrea sa imi afiseze ”Introduceti datele Studentului 1”, ”Introduceti datele studentului 2”, .... s.a.m.d, in functie de cat am declarat initial. Si de aia spuneam ca am facut un for in functia main si nu merge, nu stiu cum sa fac. N-are nici o eroare la compilare!!!


In ceea ce priveste float-ul de care ziceai, aia recunosc ca am gresit.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: O mica problema la afisare la clase!!!

Post by Ovidiu Cucu » 12 Apr 2013, 19:37

yoyulian wrote:[...] N-are nici o eroare la compilare!!!
Asta nu inseamna ca e si bine scris.
yoyulian wrote:[...]In ceea ce priveste float-ul de care ziceai, aia recunosc ca am gresit.
Mersiii! Bine macar ca pe asta o recunosti. :)

Cred ca n-am fost destul de clar, deci se pare n-ai inteles.
#6: Ai doua variabile cu acelasi nume, Student *stu, una declarata inainte de for iar cealalta in interiorul blocului care urmeaza instructiunii for. Cea din interior o "ascunde" pe cea de dinainte, iar in continuare o s-o vezi pe prima, cea neinitializata.
Ca sa te prinzi ce vreau sa spun, incearca mai bine urmatorul programel simplu si vezi ce-ti afiseaza.

Code: Select all

#include <iostream>
int main()
{
   int numar = 777;
   for(int i = 0; i < 10; i++)
   {
      int numar = 666;
   }
   std::cout << "numar = " << numar << std::endl;
   return 0;
}
Ca sa nu mai fie "ascunsa" scoate declaratia din bloc, adica

Code: Select all

#include <iostream>
int main()
{
   int numar = 777;
   for(int i = 0; i < 10; i++)
   {
      numar = 666;
   }
   std::cout << "numar = " << numar << std::endl;
   return 0;
}
E mai clar acum?
Asta ca sa retii cum e cu "ascunsul".
Oricum insa, in programelul tau nici nu ai nevoie de acel for.
Scrii doar

Code: Select all

   Student *stu= new Student[ns];
Daca vrei totusi un for in care sa afisezi frumos "introduceti datele studentului numarul x", atunci ajungem la ce-am spus la observatia #5: scoate darcului citirea datelor din constructor si fa pentru asta o metoda speciala.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: O mica problema la afisare la clase!!!

Post by Ovidiu Cucu » 12 Apr 2013, 22:14

Ca sa nu zici ca-s baiat rau si pentru ca tot n-am alta treaba :) uite o implementare cu STL:

Code: Select all

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

class Student
{
// Data members
private:
   std::string m_sNume;
   std::string m_sPrenume;
   unsigned int m_nGrupa;
   std::vector<unsigned int> m_vNote;
// Get/Set methods
public:
   const std::string& GetNume() const {return m_sNume;}
   void SetNume(const std::string& sNume) {m_sNume = sNume;}
   const std::string& GetPrenume() const {return m_sPrenume;}
   void SetPrenume(const std::string& sPrenume) {m_sPrenume = sPrenume;}
   unsigned int GetGrupa() const {return m_nGrupa;}
   void SetGrupa(unsigned int nGrupa) {m_nGrupa = nGrupa;}
   const std::vector<unsigned int>& GetNote() const {return m_vNote;}
   void SetNote(const std::vector<unsigned int>& vNote) {m_vNote = vNote;}
// Operations
public:
   void IntroduDatele();
   void IntroduNotele();
   float CalculeazaMedia() const;
   static bool sort_medie_desc(const Student& s1, const Student& s2);
};

Code: Select all

void Student::IntroduDatele()
{
   std::cout << "Nume: ";
   std::cin >> m_sNume;
   std::cout << "Prenume: ";
   std::cin >> m_sPrenume;
   std::cout << "Grupa: ";
   std::cin >> m_nGrupa;
}

void Student::IntroduNotele()
{
   unsigned int nr_discipline;
   std::cin >> nr_discipline;
   m_vNote.resize(nr_discipline);
   for(unsigned int i = 0; i < nr_discipline; i++)
   {
      std::cout << "Nota la disciplina nr." 
         << i + 1 << " : ";
      std::cin >> m_vNote[i];
   }
}

float Student::CalculeazaMedia() const
{
   float fRet = 0;
   size_t nr_discipline = m_vNote.size();
   unsigned int suma = 0;
   for(size_t i = 0; i < nr_discipline; i++)
   {
      suma += m_vNote[i];
   }
   if(nr_discipline > 0)
   {
      fRet = (float)suma / nr_discipline;
   }
   return fRet;
}

bool Student::sort_medie_desc(const Student& s1, const Student& s2)
{
   return s1.CalculeazaMedia() > s2.CalculeazaMedia();
}
Are cam tot ce-i trebuie pentru problema data. Chiar in plus, metodele IntroduDatele si IntroduNotele fiind oarecum redundante cu metodele "Set".
Sau, alternativ, ai putea implementa metode "Get" non-const care intorc referinta non-const, in asa fel incat sa le poti folosi direct cu operatorul >> din std::istream.
Oricum, asa e mult mai bine decat sa citesti de la consola in constructor (vezi din nou observatia #5).

Iata si un exemplu de programel care utilizeaza clasa Student.

Code: Select all

int main()
{
   // citire numar studenti
   unsigned int nr_studenti = 0;
   std::cout << "Numarul de studenti: ";
   std::cin >> nr_studenti;

   // citire date studenti + note
   std::vector<Student> vStudenti(nr_studenti);
   for(unsigned int i = 0; i < nr_studenti; i++)
   {
      std::cout << "Datele pentru studentul nr." << i + 1 << std::endl;
      vStudenti[i].IntroduDatele();
      vStudenti[i].IntroduNotele();
   }
   // ordonare dupa medie, descrescator
   std::sort(vStudenti.begin(), vStudenti.end(), &Student::sort_medie_desc); 

   // afiseaza Nume, Prenume, Grupa, Media
   std::cout << "Mediile studentilor:" << std::endl; 
   for(unsigned int i = 0; i < nr_studenti; i++)
   {
      std::cout << vStudenti[i].GetNume().c_str() << " "
         << vStudenti[i].GetPrenume().c_str()
         << " Grupa: " << vStudenti[i].GetGrupa()
         << " Media: " << vStudenti[i].CalculeazaMedia() 
         << std::endl;
   }
}
Acuma, iti ramane ca tema sa "traduci" in "C cu cin si cout", ca sa nu dea profu-n balbaiala cand vede asa ceva. :)
O sa fie mai greu decat cu STL pentru ca, asa cum am mai spus, va trebui sa ai grija de alocari/dealocari si alte chestii pe care clasele din STL le fac ele singure.
Si o ultima observatie: am folosit pentru sortare functia std::sort. Echivalentul din biblioteca standard C este qsort. Dar daca vrei si-ti place atat de mult bubble sort, no problem poti s-o pastrezi. ;)
Ah da, uitam, inca una: n-am facut validari de genul "nota trebuie sa fie intre 1 si 10".

Daca sunt intrebari, observatii, nelamuriri, intreaba ca nu ma supar.

yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

Re: O mica problema la afisare la clase!!!

Post by yoyulian » 12 Apr 2013, 23:21

Mersii mult Domnu Ovidu, raman dator. Vad ca esti foarte priceput la programare, si asa ne-a invatat dupa cum am scris exemplu pentru care am cerut explicatii. Sunt mult lucruri noi pe care tu le folosesti si noi inca nu am facut prea multe exemple. De exemplu de ce mai folosesti std::in fata lui cin, cout, nu am putea introduce dupa biblioteca ”using namespace std;”, si ce semnifica ”const”, adica este o constanta, si la ce ajuta?

yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

Re: O mica problema la afisare la clase!!!

Post by yoyulian » 12 Apr 2013, 23:48

Apropo, am doua nelamuriri si sper sa nu fi prea insistent, pentru ca am pus cam multe intrebari pana acum. In primul rand cand imi cere sa introduc grupa la program, am introdus o valoare numerica, iar pentru a trece la pasul urmator de a citi notele mai trebuie sa mai introduc inca o valoare numerica(dar care nu se ia in calcul la afisare grupei), de ce trebuie sa mai introduc inca o valoare? In al doilea rand sunt in neclar cum ai adaugat spatiu de memorie pentru studenti, note, si medie? Ai alocat dinamic, ca nu se vede in program ca si cum se adauga medorie dinamic in modul ”clasic”(asa cum stiu eu). Mersii mult!!!

George92
Junior
Junior
Posts: 16
Joined: 13 Apr 2013, 00:37
Judet: Dolj

Re: O mica problema la afisare la clase!!!

Post by George92 » 13 Apr 2013, 00:39

m_vNote.resize(nr_discipline);

Aici a alocat spatiu in functie de cate discipline sunt. Mai documenteaza-te pe net despre Templates sau eventual daca esti la inceput sincer nu ar trebui sa iti bati capu cu asta acum si sa folosesti o metoda mai accesibila pt inceput. Cat despre faza cu citirea n`am urmarit programu dar e posibil sa fie o problema cu caracterul enter ' \n ' , ca am vaz ca sunt multicele cin-uri pe acolo.

yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

Re: O mica problema la afisare la clase!!!

Post by yoyulian » 13 Apr 2013, 00:51

Mersii George

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: O mica problema la afisare la clase!!!

Post by Ovidiu Cucu » 13 Apr 2013, 21:43

Incerc cat mai pe scurt, cu exemple simple si pe inteles. :)
  • pe scurt despre namespace
    Namespace reprezinta un mijloc simplu pentru evitarea conflictelor dintre nume.
    Sa presupunem ca proiectul nostru foloseste clasa Student definita (sa zicem) intr-o biblioteca A in headerul A.h. De asemenea avem o alta clasa Student definita intr-o alta biblioteca B cu headerul B.h. Daca facem asa

    Code: Select all

    // A.h
    class Student
    {
       // ....
    };

    Code: Select all

    // B.h
    class Student
    {
       // ....
    };

    Code: Select all

    // MyProgram.cpp
    #include A.h
    #include B.h
    
    int main()
    {
       Student student;
       // ...
    }
    Compilatorul imi va da eroare pentru ca, saracul nu are de unde sa stie de ce tip trebuie sa fie obiectul student, de tipul class Student definit in A.h sau de tipul class Student definit in B.h.
    Asta se poate rezolva cu namespace.

    Code: Select all

    // A.h
    namespace A
    {
       class Student
       {
          // ...
       };
    }

    Code: Select all

    // B.h
    namespace B
    {
       class Student
       {
          // ...
       };
    }
    Acum pot spune clar compilatorului care dintre clasele Student vreau sa instantiez
    • Folosind operatorul de rezolutie (::)

      Code: Select all

      // MyProgram.cpp
      #include A.h
      #include B.h
      int main()
      {
         A::Student student1; // student1 este de tipul class Student definit in namespace-ul A.
         B::Student student2; // student2 este de tipul class Student definit in namespace-ul B.
         // ... 
      }
    • sau cu using namespace

      Code: Select all

      // MyProgram.cpp
      #include A.h
      #include B.h
      int main()
      {
         using namespace A;
         Student student1; // student1 este de tipul class Student definit in namespace-ul A.
         // ... 
      }
      De notat ca using namespace X este vizibil/valabil la nivel de fisier, atunci cand este declarat in a afara oricarui bloc sau la nivel de bloc.
      In cazul din exemplu, using namespace A este valabil in blocul functiei main. Intr-o alta functie pot pune foarte bine "using namespace B".
    Cred ca, din exemplul de mai sus se poate vedea cam care ar fi avantajul folosirii operatorului de rezolutie in loc de using namespace.
    Daca in cele doua namespace-uri apar identificatori cu acelasi nume, ceva de genul

    Code: Select all

    // MyProgram.cpp
    #include A.h
    #include B.h
    int main()
    {
       using namespace A;
       using namespace B;
       Student student; // Error!
       // ... 
    }
    Din nou avem conflict!

    In fine, pentru un programel simplu ca cel despre care discutam, in care folosim doar STL, aflat in namespace std a alege una sau cealalta metoda e doar o chestie "de gust" sau de obisnuinta sau de cum vede un programator ca un cod este mai usor de scris sau de citit.
    In programe mai complexe insa, unde de obicei pot fi folosite mai multe biblioteci (sa zicem STL, BOOST s.a.m.d.), metoda cu operatorul de rezolutie ar fi cea indicata pentru evitarea oricaror conflicte sau ambiguitati si implicit, dureri de cap.

yoyulian
Junior
Junior
Posts: 33
Joined: 05 Dec 2012, 14:53
Judet: Cluj

Re: O mica problema la afisare la clase!!!

Post by yoyulian » 14 Apr 2013, 00:14

Mersii am inteles.

Post Reply