Loading...
Nikodon avatar Nikodon 3 Точки

6. Courses

Здравейте, затруднявам се със задача 6 от Упражненията за Речници.

Бъркам нещо в логиката и не знам къде, защо не ми се получава.

Може ли малко помощ по кода:

 

https://pastebin.com/qn2sJwvy

 

Благодаря

Тагове:
0
Module: C# Advanced
kkaraivanov avatar kkaraivanov 486 Точки

Здравей. Ще се опитам да ти преведа парче от кода и се надявам да ти помогна, а не да те объркам. И така......

if (!registered.ContainsKey(courseName))
{
   registered[courseName] = courseName;
   registered[studentName] = studentName;
}

В тази проверка извършваш следното действие: ако courseName несъществува /това е проверка за ключ - уникален/ тогава създай го, като това се случва когато си написал registered[courseName]. В същото време на ключа courseName присвояваш същата стойност, а на следващия ред променяш стойността със studentName. Не си спомням задачата, но предполагам идеята е един студент да участва в множество курсове и по удачно би било да ползваш Dictionary<string, List<string>> за да можеш в листа да запазиш курсовете, а след това да ги сортираш по брой курсове. Надявам се да съм ти помогнал. Ето и линк към други задачи, които ще ти помог да сверяваш при появили се проблеми.

1
11/03/2020 00:00:36
krum_43 avatar krum_43 756 Точки

Дай линк към условието.

 

0
nickwork avatar nickwork 657 Точки

Привет, това ти е решението коригирано 100/100 разгледай разликите (също така сплита ти не беше правилен, вместо Split(":") - трябва да е Split(" : "))...другото смятам, че ще го видиш сам :)

using System;
using System.Collections.Generic;
using System.Linq;

namespace _6._Courses
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, List<string>> registered = new Dictionary<string, List<string>>();

            string courseAndStudent;

            while ((courseAndStudent = Console.ReadLine()) != "end")
            {
                string[] courseSplitted = courseAndStudent.Split(" : ").ToArray();

                string courseName = courseSplitted[0];
                string studentName = courseSplitted[1];

                if (!registered.ContainsKey(courseName))
                {
                    registered.Add(courseName, new List<string>() { studentName });
                }
                else
                {
                    registered[courseName].Add(studentName);
                }
            }

            foreach (var course in registered.OrderByDescending(x => x.Value.Count()))
            {
                Console.WriteLine($"{course.Key}: {course.Value.Count()}");

                foreach (var name in course.Value.OrderBy(x => x))
                {
                    Console.WriteLine($"-- {name}");
                }
            }
        }
    }
}

0
Nikodon avatar Nikodon 3 Точки

Благодаря ви за помоща!

Мога ли да попитам няколко неща по кода?

Първо, ето този синтаксис не ми е мн ясен:

    registered.Add(courseName, new List<string>() { studentName });
                }
                else
                {
                    registered[courseName].Add(studentName);
                }

Гледах лекцията за Речници няколко пъти , там решаваха задачите с ето такъв синтакси:

  if (!histogram.ContainsKey(currCh))
                    {
                        //histogram.Add(currCh, 1);
                         histogram[currCh] = 1;
                    }
                    else
                    {
                        histogram[currCh]++;

                    }

За това и бях почнал така да го правя. Не разбирам защо сега изведнъж се промени?Казаха ни че това е краткия вариант с Add и може така да го правим. Може ли да обясните разликата, че се обърках?

Другият ми въпрос е защо foreach  са вложени? Ако бяха един след друг нямаше ли да работи. Благодаря още веднъж за помоща.

0
nickwork avatar nickwork 657 Точки

 if (!registered.ContainsKey(courseName))
                {
                    registered.Add(courseName, new List<string>() { studentName });
                }
                else
                {
                    registered[courseName].Add(studentName); (ако го има курса добавяме участник за него) 
                }

 if (!registered.ContainsKey(courseName)) - проверяваме дали не съществува вече такъв курс, ако не създаваме в речника такъв курс (courseName) и инициализираме колекция от стрингове  (new List<string>() ) в която до пазим хората, които са записани за съответният курс. По условие трябва ако няма такъв курс да го създадем и да добавим в колекцията си от хора ( new List<string>() ) човека който ни е подаден. Това може да стане 

1. !registered.Add(courseName, new List<string>();

register[courseName].Add(studentName);

(в твоят код който беше можеш да видиш, че ти не инициализираше нова колекция (List<string>)), a имаше само една стрингова променлива в речника (в която няма как да пазиш хора повече от един => Dictionary<string, string> registered = new Dictionary<string, string>();)

2. Или по пократкият начин по който аз съм го написал - директно със създаването на листа(колекцията), вкарвам и един човек в нея.

registered.Add(courseName, new List<string>() { studentName }); => този синтаксис е също единтичен с този:

registered.Add(courseName, new List<string>()

{

studentName

});

накратко замества командата add => директно ги вкарвам в колекцията (още един пример => ако ми трябва да вкарам няколко имена в някакъв лист мога да го направя и по този начин new var temp = new List<string>() { studentName1, studentName2, studentName3 }; , вместо да казвам  => temp.Add(studentName1), temp.Add(studentName2) ... тествай това парче код и ще разбереш.

Защо са вложени...защото трябва да се отпечата името на курса - това е едната итерация, всеки курс има записани участници...какво ще се получи ако имаме два отделни фора - първият ще печата имената на курсовете и ще ги нареди един след друг (което не е по условие), а втория ще отпечата имената на участниците (и пак едно след друго но вече след като са изброени всички курсове)... за да стане по условие - първо името на курса и всички участници в него ни трябва вложен фор - който от начало да върти през курса (първият фор) и след това да мине през всички участници в него (вторият вложен фор)...дебъгни го няколко пъти и смятам, че ще ти стане ясно.. 

 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.