Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication28
- {
- internal class Program // Nasko Lapchev
- {
- private static void Main(string[] args)
- {
- // databases
- SortedDictionary<string,
- SortedDictionary<string, List<double>>> dataDictionary =
- new SortedDictionary<string, SortedDictionary<string, List<double>>>(); // тук събираме студенти, предмети, оценки
- // тук слагаме накрая форматираните за печат резултати от събраната информация
- SortedDictionary<string, SortedSet<string>> finals = new SortedDictionary<string, SortedSet<string>>();
- //SortedDictionary<string, SortedDictionary<string, double>> dataO =
- //new SortedDictionary<string, SortedDictionary<string, double>>();
- // input
- int dataLinesNumber = int.Parse(Console.ReadLine());
- // declarations - страхотна идея - дава яснота на кода по-нататък
- string lineContents = String.Empty;
- string[] lineTokens;
- string student = "";
- string predmet = String.Empty;
- int ocenka = 0;
- // reading and parsing the lines
- // имаме 3 основни случая:
- // 1. такъв студент още не е добавян:
- // * правим List<double> за оценките му, и прибавяме оценката към този лист
- // * правим SortedDictionary<string, List<double>> studentData, и към него прибавяме предмета, и списъка с оценки (списък за да можем да прибавим и следващи оценки ако се появят
- // * чак сега вече можем да прибавим към dataDictionary.Add(student, studentData);
- // 2. Вече има такъв студент додразбира се че и SortedDictionary<string, List<double>> studentData вече има, тъй като този речник се прибавя заедно със студента),
- // но предмета е нов: правим List<double> ocenki = new List<double>();, и прибавяме dataDictionary[student].Add(predmet, ocenki);
- // 3. има такъв студент, има такъв предмет, само оценката е нова
- // тогава: dataDictionary[student][predmet].Add(ocenka);
- for (int i = 0; i < dataLinesNumber; i++)
- {
- lineContents = Console.ReadLine();
- lineTokens = lineContents.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
- student = (lineTokens[0]) + " " + (lineTokens[1]);
- predmet = lineTokens[2];
- ocenka = int.Parse(lineTokens[3]);
- if (!dataDictionary.ContainsKey(student))
- {
- // ако в речника още няма такъв студент - няма как да прибавяме към него, трябва първо да го създадем
- // същото с информацията за студента (SortedDictionary<string, List<double>> studentData) -
- // използвах твоята идея за речника предмет-оценка, но го развих в предмет-оценки: за да може в един List<double> с оценки да пълним всички оценки
- // между другото - за разлика от теб щях да се сетя че трябва оценките да са double - не по рано от 1 час селд като съм почнала да пиша кода :)
- SortedDictionary<string, List<double>> studentData = new SortedDictionary<string, List<double>>();
- List<double> ocenki = new List<double>(); // ако искаш може да смениш "ocenka/i" с grade/s
- ocenki.Add(ocenka);
- studentData.Add(predmet, ocenki);
- dataDictionary.Add(student, studentData); // чак сега вече можем да добавим нов студент в речника
- }
- else if (dataDictionary.ContainsKey(student))
- {
- if (!dataDictionary[student].ContainsKey(predmet))
- {
- //dataDictionary[student][predmet] = new List<double>(); // мисля че няма да можем да прибавим оценки ако няма такъв студент и ние още не сме го добавили
- // иначе казано, за да го има студента вече в речника, тяй е бил добавен заедно с SortedDictionary<string, List<double>> studentData, и там вече си има друг предмет, с други оценки
- // остава само да добавим във вътрешня речник studentDatа нов предмет, с оценките към него
- List<double> ocenki = new List<double>();
- ocenki.Add(ocenka);
- dataDictionary[student].Add(predmet, ocenki);
- }
- else if (dataDictionary[student].ContainsKey(predmet))
- {
- // за да го има предмета, той е бил добавен с List<double> с оценки, сега остава само да прибавим още една оценка
- dataDictionary[student][predmet].Add(ocenka);
- }
- }
- }
- // сега идеяата е точно както ти попита: да се подготвим за печатане, ще превърнем всичката информация за студента в един форматиран стринг
- foreach (var pair in dataDictionary)
- {
- SortedSet<string> infoPoPredmeti = new SortedSet<string>();
- foreach (var pair2 in pair.Value) // трябва ни само информацияята за студента, без самия студент
- {
- string predmet_srednaocenka = String.Format("{0} - {1:F2}", pair2.Key, pair2.Value.Average()); // така форматираме с колко знака след десетичната точка ще се печата средната оценка
- // и за всеки предмет ще получим нещо такова: "history – 5.00"
- infoPoPredmeti.Add(predmet_srednaocenka); // тук са събрани всички стрингове от типа "history – 5.00", за един студент само
- }
- finals.Add(pair.Key, infoPoPredmeti); // тук прибавяме студента, със съответната infoPoPredmeti
- }
- foreach (var pair in finals)
- {
- string infoZaStudenta = string.Join(", ", pair.Value);
- Console.WriteLine("{0}: [{1}]", pair.Key, infoZaStudenta);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement