Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60

Что означает код?

26.10.2018, 16:34. Показов 1285. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Выполняю задание из курса. Суть задания перебрать все значения и создать гистограмму.

Есть метод, который создает эту гистограмму, но он упрощенный (гистограмма тут показывает кол-во рожденных в конкретный год)

Моя задача - это понять что означает этот метод и создать свой с другими параметрами.
Вот код.
Я создал описание справа всех строк кода, как их понимаю я.
как видно, после создания массива мое понимание опускается до минимума, не могу разобраться что делается там.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
 
namespace Names
{
    internal static class HistogramSample // класс к которому обращаемся в классе программ
    {
        
        public static HistogramData GetHistogramBirthsByYear(NameData[] names) // создаем метод GetHistogramBirthsByYear, который 
                                                                               // собственно и создает гистограмму (в фигурных скобках 
                                                                               // массив NameData, который состоит из списка дат рождений
        {
            /*
            Подготовка данных для построения гистограммы 
            — количества людей в выборке в зависимости от года их рождения.
            */
 
            Console.WriteLine("Статистика рождаемости по годам");// текст на консольке
            var minYear = int.MaxValue; // создаем переменную minYear означающую минимальный год в списке
            var maxYear = int.MinValue; // создаем переменную maxYear означающую максимальный год в списке
            foreach (var name in names) // перебираем все года в списке (цикле nameData[] names)
            {
                minYear = Math.Min(minYear, name.BirthDate.Year); // присваиваем (вычисляем значение) переменной minYear, для того, что бы узнать 
                                                                  //минимальный год в списке
                maxYear = Math.Max(maxYear, name.BirthDate.Year); // присваиваем (вычисляем значение) переменной maxYear, для того что бы узнать 
                                                                  //макс год в списке
            }
 
            var years = new string[maxYear - minYear + 1]; // создаем массив размера (maxYear - minYear + 1) почему +1???
            for (var y = 0; y < years.Length; y++) // перебираем значения массива в цикле for
                years[y] = (y + minYear).ToString(); // передаем значение каждому элементу массива 
            var birthsCounts = new double[maxYear - minYear + 1]; // создаем еще один массив опять почему +1????
            foreach (var name in names) // перебираем значения циклом foreach
                birthsCounts[name.BirthDate.Year - minYear]++; // присваиваем значение каждому элементу массива почему именно такие???
 
            return new HistogramData("Рождаемость по годам", years, birthsCounts); // возвращаем название и 2 цикла
        }
    }
}
Буду признателен если обьясните что происходит после var years = new string[maxYear - minYear + 1].
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2018, 16:34
Ответы с готовыми решениями:

Что означает код?
Добрый день форумчане, есть задание создать текстовое изображение шахматной доски. Метод WriteBoard должен возвращать текстовое...

Что означает этот код
public override IEnumerable&lt;PropWrapper&gt; GetListProps(ТипРеквизитов type) { switch (type) { ...

Что означает такой код?
int max = x &lt; y ? x : y; Просто вкратце объясните логику. Было в книге раньше, подзабыл. А на какой странице не припомню. Спасибо

16
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
26.10.2018, 17:00
Цитата Сообщение от lexatorgas Посмотреть сообщение
создаем массив размера (maxYear - minYear + 1) почему +1???
Потому что, например, если maxYear == minYear , то надо получить 1, а не 0.

Добавлено через 2 минуты
В остальном вроде комментарии правильны. Что-то ещё не понятно?
0
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 17:07  [ТС]
значение maxYear 2002
значение minYear 1893

Они не равны, если +1 убираешь или меняешь то происходит выход за границы массива. Не понимаю почему. Обьясни, пожалуйста, подробнее.

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
foreach (var name in names) // перебираем все года в списке (цикле nameData[] names)
            {
                minYear = Math.Min(minYear, name.BirthDate.Year); // присваиваем (вычисляем значение) переменной minYear, для того, что бы узнать 
                                                                  //минимальный год в списке
                maxYear = Math.Max(maxYear, name.BirthDate.Year); // присваиваем (вычисляем значение) переменной maxYear, для того что бы узнать 
                                                                  //макс год в списке
            }
этой строчкой мы же просто вычисляем значения?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
26.10.2018, 17:17
Весь Ваш код сводится к 4 строчкам
C#
1
2
3
4
5
6
7
        public static HistogramData GetHistogramBirthsByYear(IEnumerable< NameData> names)
        {
            var namesGroup = names.GroupBy(name => name.BirthDate.Year); // Получение групп по годам рождения
            string[] years = namesGroup.Select(group => group.Key.ToString()).ToArray(); // Получение годов групп
            string[] birthsCounts = namesGroup.Select(group => group.Count().ToString()).ToArray(); // Получение рождений по годам
            return new HistogramData("Рождаемость по годам", years, birthsCounts);
        }
Добавлено через 3 минуты
Цитата Сообщение от lexatorgas Посмотреть сообщение
значение maxYear 2002
значение minYear 1893
Они не равны, если +1 убираешь или меняешь то происходит выход за границы массива. Не понимаю почему. Обьясни, пожалуйста, подробнее.
Я знаю, что они не равны. Привел для простоты понимания - но ...
Допустим, в маленьком массиве у Вас получилось все одного года. Т.е. minYear==maxYear. Выходной массив из скольки элементов должен быть? Из одного или из нуля?
То же самое для понимания, посчитайте вручную, для 2, 3 и т.д. разных годов рождения.
Арифметика из начальных классов! Растормашитесь чуток!
1
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 17:20  [ТС]
Ты, возможно, меня не правильно понял.
Мне нужно лишь помочь разобраться в этом методе, для того, что бы я самостоятельно создал другой метод, по другим данным.
Проблема моя в том, что я не до конца понимаю что именно происходит в коде, который я отправил выше.
Мне нужно просто обьяснить своими словами для чего мы создаем массивы, перебираем, почему вводим именно те значения.
Вот

Добавлено через 1 минуту
щас буду разбираться, спасибо тебе!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
26.10.2018, 17:23
Цитата Сообщение от lexatorgas Посмотреть сообщение
этой строчкой мы же просто вычисляем значения?
Строчкой var years = new string[maxYear - minYear + 1]; создаётся новый одномерный массив типа string[] и с количество членов (длиной массива) maxYear - minYear + 1

Добавлено через 1 минуту
Цитата Сообщение от lexatorgas Посмотреть сообщение
Проблема моя в том, что я не до конца понимаю что именно происходит в коде, который я отправил выше.
Тогда задайте вопросы по конкретным строчкам - на сколько смогу, разъясню.

Добавлено через 1 минуту
Цитата Сообщение от lexatorgas Посмотреть сообщение
Мне нужно лишь помочь разобраться в этом методе, для того, что бы я самостоятельно создал другой метод, по другим данным.
Этот метод имеет достаточно путанный код, трудный для понимания - не советую на его основе делать свой.
0
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 17:37  [ТС]
C#
1
2
3
var birthsCounts = new double[maxYear - minYear +1 ]; // создаем еще один массив опять почему +1????
            foreach (var name in names) // перебираем значения циклом foreach
                birthsCounts[name.BirthDate.Year - minYear]++; // присваиваем значение каждому элементу массива почему именно такие???
тут вычисляем кол-во рожденных людей в конкретный год, если как то изменить кол-во эл массива birthsCounts идет выход за границы, почему?
0
1524 / 510 / 126
Регистрация: 09.01.2018
Сообщений: 1,562
26.10.2018, 17:45
lexatorgas,
+1, чтобы получить массив диапазона лет включительно

Например, я хочу получить массив, в который уместятся все значения лет с 2012 до 2015 включительно. Это: 2012, 2013, 2014, 2015. Т.е. всего четыре значения. Но 2015 - 2012 = 3. Это просто разность, говорящая о том, что с 2012 до 2015 проходит 3 года. Мне же надо включить и 2012-й. Поэтому прибавляется единица.
1
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
26.10.2018, 17:50
Цитата Сообщение от lexatorgas Посмотреть сообщение
Они не равны, если +1 убираешь или меняешь то происходит выход за границы массива. Не понимаю почему.
Например, если нужно построить гистограмму за последние три(!) года (2016-2018), с точки зрения арифметики, обычная разница не будет брать в расчет первый год (2018 - 2016 = 2, то есть разность не учитывает 2016-ый). Именно поэтому добавляется 1.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
26.10.2018, 17:58
Границы массива определяются строкой var birthsCounts = new double[maxYear - minYear +1 ];. Эта строка создаёт массив birthsCounts типа double[] с количеством членов maxYear - minYear +1 и, соответственно, элементы массива будут иметь индексы от нуля до maxYear - minYear
Потом в строке birthsCounts[name.BirthDate.Year - minYear]++; записываются значения в элементы этого массива. Индексация элементов производится через выражение name.BirthDate.Year - minYear при name.BirthDate.Year==minYear получается наименьший индекс - ноль. При name.BirthDate.Year==maxYear получается наибольший - maxYear - minYear. Если изменить, то есть уменьшить размер массива, то при индексации по максимальному году - будет выход за его границы.
0
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 18:05  [ТС]
C#
1
return new HistogramData("Рождаемость по годам", years, birthsCounts);
По мере понимания возникают еще вопросы.
В этой строчке кода мы возвращаем что ??
Мы меняем значение метода HistogramData?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
26.10.2018, 18:11
Цитата Сообщение от lexatorgas Посмотреть сообщение
В этой строчке кода мы возвращаем что ??
Тут просто возвращается объект, хранящий только что вычисленные данные.

Цитата Сообщение от lexatorgas Посмотреть сообщение
foreach (var name in names) // перебираем значения циклом foreach
* * * * * * * * birthsCounts[name.BirthDate.Year - minYear]++; // присваиваем значение каждому элементу массива почему именно такие???
Тут идет подсчет статистики, если в массиве names будет несколько ровесников (>1), то элемент массива birthCounts за указанные год отразит нам это.
0
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 18:15  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Linq;
 
namespace Names
{
    public class HistogramData
    {
        private string v1;
        private string[] v2;
        private int[] dateBirth;
 
        public HistogramData(string title, string[] xLabels, double[] yValues)
        {
            Title = title;
            XLabels = xLabels;
            YValues = yValues;
        }
 
        public HistogramData(string v1, string[] v2, int[] dateBirth)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.dateBirth = dateBirth;
        }
 
        public string Title { get; }
        public string[] XLabels { get; }
        public double[] YValues { get; }
 
        public bool Equals(HistogramData other)
        {
            return other.XLabels.SequenceEqual(XLabels) && other.YValues.SequenceEqual(YValues);
        }
    }
}
вот HistogramData
мы возвращая значения меняем его?
0
1524 / 510 / 126
Регистрация: 09.01.2018
Сообщений: 1,562
26.10.2018, 18:22
Цитата Сообщение от lexatorgas Посмотреть сообщение
По мере понимания возникают еще вопросы.
В этой строчке кода мы возвращаем что ??
Возвращаем объект класса HistogramData.

Цитата Сообщение от lexatorgas Посмотреть сообщение
Мы меняем значение метода HistogramData?
HistogramData это не метод. Это класс.
Метод: GetHistogramBirthsByYear(NameData[] names) и он возвращает объект типа HistogramData. (вычисляет значения, создает объект типа HistogramData и возвращает его.)
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
26.10.2018, 18:26
Цитата Сообщение от lexatorgas Посмотреть сообщение
C#
1
return new HistogramData("Рождаемость по годам", years, birthsCounts);
По мере понимания возникают еще вопросы.
В этой строчке кода мы возвращаем что ??
Мы меняем значение метода HistogramData?
Этой строкой создаётся новый объект класса HistogramData в конструктор передаются параметры string title, string[] xLabels, double[] yValues.
Созданный объект возвращается методом.
1
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
26.10.2018, 18:28
lexatorgas, мы ничего не меняем, мы просто создали отдельный класс для хранения данных графика (гистограммы).
Разве не видно, что код return new HistogramData("Рождаемость по годам", years, birthsCounts); создает новый объект и заносит туда только что вычисленные данные?

При этом, у Элд Хасп ятп код более правильный, так как в вашем коде года вычисляются так:
C#
1
2
3
 var years = new string[maxYear - minYear + 1]; // создаем массив размера (maxYear - minYear + 1) почему +1???
            for (var y = 0; y < years.Length; y++) // перебираем значения массива в цикле for
                years[y] = (y + minYear).ToString(); // передаем значение каждому элементу массива
То есть берется минимальный год, и затем последовательно берутся следующие years.Length -1.
То есть массив years - последовательные числа. Но кто сказал, что в массиве NamesData[] names находится непрерывный интервал?

Соответственно, у Элд Хасп это исправляется через группировку по годам. И, получается, предоставленный вами код, искажает настоящую картину.
1
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 60
26.10.2018, 19:25  [ТС]
Всех благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2018, 19:25
Помогаю со студенческими работами здесь

Разбираю код одной темы, что означает следующий код и зачем он нужен?
Доброго времени суток всем. Скачал тут как-то на днях вот такую тему для wordpress и смотрю, разбираю, что там внутри и как это работает. ...

Что означает код?
Подскажите, что делается в этих строках, в оракл не силен =( ord mdsys.SDO_ORDINATE_ARRAY:=mdsys.SDO_ORDINATE_ARRAY(); eleminfo...

Что означает код?
for (const char &amp; c : str)

Что означает код?
Девайс зовут , ID .

Что означает код
$r = mysql_query(&quot;SELECT p.*, d.cNm as cDept FROM dbUsers.tblMain as p, dbRefs.tbldept as d WHERE p.iDept=d.iDept ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru