Sets and Dictionaries Advanced LAB - 2. Average Student Grades
Здравейте!
Получавам само 20/100 с кода тук:https://pastebin.com/EUe5t9bV
Интересното е, че по условие трябва да са подреденеи по среден успех от най-голям към най-малък, а първоначално, когато използвам
.OrderByDescending(x => x.Value.Average()) в сортировката на принтирането ми дава 10/100 с 3/3 верни нулеви тестове. А без тази сортировка, дава 20/100 с 2/3 верни нулеви тестове.
Много бих бил благодарен на лекторите, все пак да пускат решенията си в джъджа, защото понякога с тяхното решение не дава 100/100, да не говорим за решениеята в презентациите, които са написани на 2 на 3, и често некоретна стилизация на кода (примерно на if statement отдолу тялото е написано като 1 ред вместо с къдрави скоби).
Не съм ти тествал кода но това което забелязвам е
if (!dictNameAndGrades.ContainsKey(nameAndGrades[0])) => тук проверяваш дали няма такъв ключ
{
dictNameAndGrades[nameAndGrades[0]] = new List<double>(); => тук пък му казваш (след проверката като знаем, че няма такъв ключ), на този ключ (който знаем че го няма и не е добавен) nameAndGrades[0] е равен на нов масив от стринг => първо това е ключа ти и той не трябва да е масив а просто стринг., а и не можеш да присвоиш стойност на нещо което не съществува или да инициализираш нещо което го няма ..така че логиката е доста объркана в този случай.. това което трябва да направиш е като видиш че няма такъв ключ да добавиш такъв с командата адд
dictNameAndGrades.Add(nameAndGrades[0], new List<double>()); и после надолу си продължаваш с кода.
}
dictNameAndGrades[nameAndGrades[0]].Add(double.Parse(nameAndGrades[1]));
Мисля че самия запис по този начин dictNameAndGrades[nameAndGrades[0]] = new List<double>() би трябвало да създаде нов ключ "namAndGrades[0] и на този ключ да му даде стойност нов масив от double.
Ако не е така значи много съм се оплел.
Тествах цялото ти решение и да ти кажа, че не си се оплел ами си прав, наистина и такъв синтаксис работи, аз лично никога не съм инициализирал по този начин, а и не съм виждал да се инициализира така и за това си помислих, че там е грешката, но не беше (евала за което)... основният проблем в решението е, че приемаш входните данни като масив на един ред, а те се получават на 2 отделни... вкарах и малко корекция в отпечатването на изхода...пускам ти решението ти преправено да го разгледаш..
using System;
using System.Collections.Generic;
using System.Linq;
namespace Average_Student_Grades
{
class Program
{
static void Main(string[] args)
{
var num = int.Parse(Console.ReadLine());
var dictNameAndGrades = new Dictionary<string, List<double>>();
for (int i = 0; i < num; i++)
{
var name = Console.ReadLine();
var grade = double.Parse(Console.ReadLine());
if (!dictNameAndGrades.ContainsKey(name))
{
dictNameAndGrades[name] = new List<double>();
}
dictNameAndGrades[name].Add(grade);
}
foreach (var kvp in dictNameAndGrades.Where(x => x.Value.Sum() / x.Value.Count >= 4.5).OrderByDescending(x => x.Value.Sum() / x.Value.Count))
{
var avrageSum = kvp.Value.Average();
Console.WriteLine($"{kvp.Key} -> {avrageSum:f2}");
//foreach (var val in kvp.Value)
//{
// Console.Write($"{val:f} ");
//}
//Console.WriteLine($"(avg: {avrageSum:f})");
}
}
}
}
Явно си гледал друго условие на тази задача.
Ето това е линк към условието на задачата. 2-ра задача, не виждам условие за сортиране там.
И доколкото видях входа на даннги го взимам правилно.
Смени double с decimal.