Sunteți pe pagina 1din 6

/*

NOTA 3:

Sa se creeze clasa Student ce contine atributele private:
-nume - sir de caractere;
-note - vector de valori intregi fara semn;
-grupa valoare intreaga;
-cod - valoare intreaga a carei valoare NU poate fi modificata dupa initializare


* La nivelul clasei se defineste un atribut static privat, NrStudenti, ce va fi utilizat pentru a numara
numarul de instante de tip Student creat si pentru a genera valori unice pentru atributul unic, cod.
* Pentru a instantia clasa, sa se defineasca DOAR constructori cu parametri (forma acestuia ramane la
alegerea studentului; o abordare posibila ar fi un constructor care sa primeasca numele si grupa).
* In urma apelului constructorului, campul cod trebuie sa fie initializat si sa fie unic indiferent de forma
aleasa pentru constructorul cu parametri (se accepta o valoare initiala nula pentru note).
* Se definesc proprietati care sa permita citire/scriere (unde este cazul) pentru proprietatile:
- nume;
- grupa
- cod
- NrStudenti (atributul static) doar citire

NOTA 4:
* Clasa se deriveaza din ICloneable pentru a permite deep-copy intre obiecte.
* Pentru a permite afisarea la Consola a unui Student se defineste interfata IAfisabil ce defineste
metoda virtuala pura string Afisare();
* Clasa Student se deriveaza si din IAfisabil.

NOTA 5:
* Pentru a permite citirea unui Student de la tastatura se defineste metoda Citeste ce permite
modificarea valorii numelui si grupei.
* Folositi try-catch pentru a genera o exceptie InvalidValueException (definita de utilizator) daca grupa
a fost mai mare de 9999

NOTA 6:
* Se defineste metoda AdaugaNota care primeste vaoarea unei note si o adauga la sirul de note asociat
Studentului.

NOTA 7:
* Pentru a permite acces DOAR in mod scriere la nivelul atributului note se supraincarca operatorul
index.
* Pentru a permite adaugarea unei note la sirul de note al unui student se supraincarca operatorul +
care va aduna un Student cu un intreg fara semn (atentie, + nu modifica valoarea operanzilor)
* Pentru a calcula media unui Student se supraincarca operatorul cast catre double in forma explicita.

NOTA 8:
* In programul apelator se va crea un ArrayList ce va contine minim 3 instante de tip Student. Dupa
creare, studentii vor fi afisati cu metoda Afisare.

NOTA 9:
* In clasa student se defineste metoda DaExamen(uint valoare_nota) ce permite adaugarea unei note
cu valoarea data.
* Se defineste clasa Examen ce gestioneaza un eveniment asociat sustinerii unui examen. In clasa se
definesc:
- atributul: nume examen - sir de caractere
- constructor cu parametri (pentru nume examen)
- un eveniment examen ce gestioneaza delegati catre metode ce returneaza void si primesc un int
- metoda publica InregistrareExamen ce adauga handler-ul oferit de o instanta a clasei student (prin
metoda DaExamen) ce doreste sa sustina acel examen.
- metoda publica SustinereExamen ca starter pentru eveniment; implicit nota este 0, urmand sa o
modifice la publicarea notelor.
* La acest eveniment se pot abona doar studentii dintr-o grupa data de programator.

NOTA 10:
* Programul trebuie sa toate cerintele si acestea trebuie testate in Main. Nu sunt acceptate erori de
executie.

*/
using System;
using System.Collections;

namespace TestStudent
{

interface IAfisabil
{
string Afisare();
}

class Student : ICloneable, IAfisabil
{
int cod;
public int Cod
{
get { return cod; }
private set { cod = value; }
}

string nume;
public string Nume
{
get { return nume; }
set { nume = value; }
}

//clasa pt tratarea exceptiilor invalide
class InvalidValueException : Exception
{
public InvalidValueException(string msg) : base(msg) { }
}

int grupa;
//verifica daca numarul grupei este < 9999
public int Grupa
{
get { return grupa; }
set
{
if (value > 9999) throw new InvalidValueException("Grupa>9999");
grupa = value;
}
}

//metoda de citire pana cand se introduce un numar valid < 9999
public void Citeste()
{
while (true)
{

try
{
Console.WriteLine("Dati numele:");
Nume = Console.ReadLine();
Console.WriteLine("Dati grupa:");
Grupa = int.Parse(Console.ReadLine());
return;
}
catch (FormatException)
{
Console.WriteLine("Err:Numar invalid");
}
catch (InvalidValueException e)
{
Console.WriteLine("Err:{0}", e.Message);
}
}
}


int[] note;

static int nrStudenti = 0;

public Student(string nume, int grupa)
{
nrStudenti++;
this.cod = nrStudenti;
this.Nume = nume;
this.Grupa = grupa;
this.note = new int[] { };
}

public override string ToString()
{
return string.Format("Cod: {0}, Nume: {1,-8}, Grupa: {2}, Note: {3,-10}, Medie: {4,5:#0.00}",
cod, nume, grupa, string.Join<int>(",", note), (double)this);
}

public object Clone()
{
Student copie = new Student(this.nume, this.grupa);
copie.note = new int[this.note.Length];
Array.Copy(this.note, copie.note, this.note.Length);

return copie;
}



public string Afisare()
{
return ToString();
}


public void AdaugaNota(int nota)
{
int[] note = new int[this.note.Length + 1];
this.note.CopyTo(note, 0);
note[note.Length - 1] = nota;
this.note = note;
}

public int NumarNote
{
get { return note.Length; }
}

public int this[int i]
{
get { return note[i]; }
set { note[i] = value; }
}


public static Student operator +(Student student, int nota)
{
Student nou = student.Clone() as Student;
nou.AdaugaNota(nota);
return nou;
}

public static explicit operator double(Student student)
{
if (student.note.Length == 0)
{
return 0;
}

double medie = 0;
foreach (int nota in student.note)
{
medie += nota;
}

return medie / student.note.Length;
}
}
//delegat si eveniment -> la fiecare sustinere a unui examen tb adaugata nota studentului
delegate void DelegatEx(int nota);
class Examen
{
public string Nume { get; set; } //varianta prescurtata -> compilatorul stie ce trebuie implementat
public Examen(string nume)
{
Nume = nume;
}
public event DelegatEx EvExamen;
public void Inregistrare(Student s)
{
EvExamen += s.AdaugaNota; //abonarea la eveniment
}

void s(int nota)
{
throw new NotImplementedException();
}
public void Sustinere()
{
if (EvExamen != null) EvExamen(10); //sustinerea examenului
}
}

class Program
{
static void Main(string[] args)
{

Student ion = new Student("Ion", 1001);
Student maria = new Student("Maria", 1002);

Console.WriteLine(ion);
Console.WriteLine(ion.Clone());
ion.AdaugaNota(6);
ion.AdaugaNota(7);
Console.WriteLine(ion);
ion[1] = 8;
Console.WriteLine(ion);
Console.WriteLine(ion + 10);
Console.WriteLine(ion);

ion.Citeste();

ArrayList studenti = new ArrayList();
studenti.Add(ion);
studenti.Add(ion + 1);
studenti.Add(ion + 2);

foreach (Student student in studenti)
{
student.Afisare();
}

Examen e = new Examen("PAW");
e.Inregistrare(ion);
e.Sustinere();
Console.WriteLine(ion);
}
}
}

S-ar putea să vă placă și