Advertisement
Guest User

School System - Nasko Lapchev

a guest
May 14th, 2015
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.67 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApplication28
  8. {
  9.     internal class Program // Nasko Lapchev
  10.     {
  11.         private static void Main(string[] args)
  12.         {
  13.             // databases
  14.             SortedDictionary<string,
  15.             SortedDictionary<string, List<double>>> dataDictionary =
  16.                 new SortedDictionary<string, SortedDictionary<string, List<double>>>(); // тук събираме студенти, предмети, оценки
  17.  
  18.             // тук слагаме накрая форматираните за печат резултати от събраната информация
  19.             SortedDictionary<string, SortedSet<string>> finals = new SortedDictionary<string, SortedSet<string>>();
  20.  
  21.             //SortedDictionary<string, SortedDictionary<string, double>> dataO =
  22.                 //new SortedDictionary<string, SortedDictionary<string, double>>();
  23.            
  24.             // input
  25.             int dataLinesNumber = int.Parse(Console.ReadLine());
  26.  
  27.             // declarations - страхотна идея - дава яснота на кода по-нататък
  28.             string lineContents = String.Empty;
  29.             string[] lineTokens;
  30.             string student = "";
  31.             string predmet = String.Empty;
  32.             int ocenka = 0;
  33.  
  34.             // reading and parsing the lines
  35.             // имаме 3 основни случая:
  36.             // 1. такъв студент още не е добавян:
  37.             // * правим List<double> за оценките му, и прибавяме оценката към този лист
  38.             // * правим SortedDictionary<string, List<double>> studentData, и към него прибавяме предмета, и списъка с оценки (списък за да можем да прибавим и следващи оценки ако се появят
  39.             // * чак сега вече можем да прибавим към  dataDictionary.Add(student, studentData);
  40.             // 2. Вече има такъв студент додразбира се че и SortedDictionary<string, List<double>> studentData вече има, тъй като този речник се прибавя заедно със студента),
  41.             // но предмета е нов: правим List<double> ocenki = new List<double>();, и прибавяме dataDictionary[student].Add(predmet, ocenki);
  42.             // 3. има такъв студент, има такъв предмет, само оценката е нова
  43.             // тогава: dataDictionary[student][predmet].Add(ocenka);
  44.  
  45.             for (int i = 0; i < dataLinesNumber; i++)
  46.             {
  47.                 lineContents = Console.ReadLine();
  48.                 lineTokens = lineContents.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
  49.                 student = (lineTokens[0]) + " " + (lineTokens[1]);
  50.  
  51.                 predmet = lineTokens[2];
  52.                 ocenka = int.Parse(lineTokens[3]);
  53.  
  54.                 if (!dataDictionary.ContainsKey(student))
  55.                 {
  56.                     // ако в речника още няма такъв студент - няма как да прибавяме към него, трябва първо да го създадем
  57.                     // същото с информацията за студента (SortedDictionary<string, List<double>> studentData) -
  58.                     // използвах твоята идея за речника предмет-оценка, но го развих в предмет-оценки: за да може в един List<double> с оценки да пълним всички оценки
  59.                     // между другото - за разлика от теб щях да се сетя че трябва оценките да са double - не по рано от 1 час селд като съм почнала да пиша кода :)
  60.                     SortedDictionary<string, List<double>> studentData = new SortedDictionary<string, List<double>>();
  61.                     List<double> ocenki = new List<double>(); // ако искаш може да смениш "ocenka/i" с grade/s
  62.  
  63.                     ocenki.Add(ocenka);
  64.                     studentData.Add(predmet, ocenki);
  65.                     dataDictionary.Add(student, studentData); // чак сега вече можем да добавим нов студент в речника
  66.                 }
  67.  
  68.                 else if (dataDictionary.ContainsKey(student))
  69.                 {
  70.                     if (!dataDictionary[student].ContainsKey(predmet))
  71.                     {
  72.                         //dataDictionary[student][predmet] = new List<double>(); // мисля че няма да можем да прибавим оценки ако няма такъв студент и ние още не сме го добавили
  73.                         // иначе казано, за да го има студента вече в речника, тяй е бил добавен заедно с SortedDictionary<string, List<double>> studentData, и там вече си има друг предмет, с други оценки
  74.                         // остава само да добавим във вътрешня речник studentDatа нов предмет, с оценките към него
  75.                         List<double> ocenki = new List<double>();
  76.                         ocenki.Add(ocenka);
  77.                         dataDictionary[student].Add(predmet, ocenki);
  78.                     }
  79.                     else if (dataDictionary[student].ContainsKey(predmet))
  80.                     {
  81.                         // за да го има предмета, той е бил добавен с List<double> с оценки, сега остава само да прибавим още една оценка
  82.                         dataDictionary[student][predmet].Add(ocenka);
  83.                     }
  84.                 }
  85.             }
  86.  
  87.             // сега идеяата е точно както ти попита: да се подготвим за печатане, ще превърнем всичката информация за студента в един форматиран стринг
  88.             foreach (var pair in dataDictionary)
  89.             {
  90.                 SortedSet<string> infoPoPredmeti = new SortedSet<string>();
  91.                 foreach (var pair2 in pair.Value) // трябва ни само информацияята за студента, без самия студент
  92.                 {
  93.                     string predmet_srednaocenka = String.Format("{0} - {1:F2}", pair2.Key, pair2.Value.Average()); // така форматираме с колко знака след десетичната точка ще се печата средната оценка
  94.                  //  и за всеки предмет ще получим нещо такова: "history – 5.00"
  95.  
  96.                     infoPoPredmeti.Add(predmet_srednaocenka); // тук са събрани всички стрингове от типа "history – 5.00", за един студент само
  97.                 }
  98.                 finals.Add(pair.Key, infoPoPredmeti); // тук прибавяме студента, със съответната infoPoPredmeti
  99.             }
  100.  
  101.             foreach (var pair in finals)
  102.             {
  103.                 string infoZaStudenta = string.Join(", ", pair.Value);
  104.                 Console.WriteLine("{0}: [{1}]", pair.Key, infoZaStudenta);
  105.             }
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement