subiect lucrare paw rezolvat
DESCRIPTION
aplicatie examen paw rezolvataTRANSCRIPT
/*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); } }}