Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 30 additions & 4 deletions course-2021-1/exercises/01-primitive-types/Numbers/FloatNumbers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal static double GetNaN()
Необходимо вернуть значение, не используя непосредственно саму константу.
Для этого подумай, какой смысл в себе несет эта константа и где бы она могла стать результатом операции или вычисления функции.
*/
throw new NotImplementedException();
return 0.0 / 0.0;
}

/// <summary>
Expand All @@ -28,20 +28,46 @@ internal static double GetNaN()
internal static bool IsNaN(double d)
{
// Подсказка: по аналогии с константами типа int, у типа double тоже есть свой набор констант.
throw new NotImplementedException();

/*
* Разве использование
* ```cs
* return (d == Double.NaN);
* ```
* не является некорректным?
*/
return Double.IsNaN(d);
}

/// <summary>
/// Возвращает результат сравнения двух вещественнозначных чисел.
/// </summary>
/// <returns>-1 - первое меньше второго, 0 - значения равны, 1 - первое больше второго.</returns>
internal static int Compare(/* дополни сигнатуру метода как считаешь правильным */)
internal static int Compare(double a, double b)
{
/*
Подумай, почему это задание дано в части про вещественнозначные числа. И почему не дана полная сигнатура метода.
Если сходу идей нет, перестань искать подвох и просто реализуй дословно. Теперь еще раз посмотри на код и подумай в чем может быть проблема, сколько должно быть аргументов.
*/
throw new NotImplementedException();

/*
* Не уверен, но могу предложить два объяснения:
* - Проблемы с равенством чисел с плавающей точкой - из-за погрешности равенство может не быть достигнуто.
* В таком случае можно использовать `decimal`, но поскольку условие задания сформулировано как работа именно
* с `double`, я всё-таки поставил в сигнатуре `double`.
* - Неочевидтное поведение сравнений крайних значений. Например, `(0 / 0.0) == Double.NaN`, насколько я понял,
* возвращает `false`. У `Int32` таких значений нет.
*/
if (a.Equals(b))
{
return 0;
} else if (a < b)
{
return -1;
} else
{
return 1;
}
}

// и все?!! О_о
Expand Down
31 changes: 22 additions & 9 deletions course-2021-1/exercises/01-primitive-types/Numbers/Integers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ _Хозяйке на заметку_
* throw new NotImplementedException() - твой бро.

Как думаешь, почему?

* -Чтобы было проще обнаружить источник багов, обусловленных поведением программыб которое кажется нормальным,
* а на самом деле вместо правильных значений в неимплементированных методах возвращается, например, -1,
* а не исключение.

*/

using System;
Expand All @@ -44,9 +49,9 @@ internal static int HalfIntMaxValue()
/*
После C++ вы будете приятно удивлены какое умное в .Net автодополнение (IntelliSense).
Особенно это касается связки Visual Studio + Resharper, используя которую, если просто набрать return и нажать пробел,
то в появившемся списке автодополнения одной из первых будет нужная тебе константа :)
то в появившемся списке автодополнения одной из первых будет нужная тебе константа :)
*/
throw new NotImplementedException();
return Int32.MaxValue / 2;
}

/// <summary>
Expand All @@ -55,7 +60,7 @@ internal static int HalfIntMaxValue()
internal static int Cube(int x)
{
// не сомневайся, пиши. Тут без подвохов.
throw new NotImplementedException();
return x * x * x;
}

/// <summary>
Expand All @@ -66,8 +71,12 @@ internal static int CubeWithOverflowCheck(int x)
/*
Если спал на лекции, то тут придется погуглить, сорри.
И заодно подумай какой режим выставлен по умолчанию. Почему. И почему категорически нельзя надеяться на режим по умолчанию.
*
* По умолчанию chekced не используется, так как это быстрее. Если про это забывать, то переполнение легко не заметить,
* так как исключений не будет, а значения неправильные.
*
*/
throw new NotImplementedException();
return checked(x * x * x);
}

/// <summary>
Expand All @@ -76,7 +85,11 @@ И заодно подумай какой режим выставлен по у
internal static int CubeWithoutOverflowCheck(int x)
{
// если сделал предыдущие, то с этим уже должно быть понятно.
throw new NotImplementedException();

/*
* Не очень понятно отличие от метода `int Cube(int x)`
*/
return x * x * x;
}

/// <summary>
Expand All @@ -93,7 +106,7 @@ internal static string ToString(int x)

Подсказка: нужно воспользоваться методом, который есть у абсолютно всех объектов.
*/
throw new NotImplementedException();
return x.ToString();
}

/// <summary>
Expand All @@ -107,7 +120,7 @@ internal static int Parse(string s)
Продолжай идти простым путем -нужен метод, обратный методу ToString выше, который распарсит дефолтное строковое представление числа.
Подсказка: у каждого примитивного типа есть набор статических методов, среди которых есть нужный.
*/
throw new NotImplementedException();
return Int32.Parse(s);
}

/// <summary>
Expand All @@ -119,7 +132,7 @@ internal static int TenTimes(int x)
Реализуй умножение числа на 10 без использования арифметических операций над числами.
Воспользуйся реализованными выше методами ToString и Parse. И не думай ни о каких переполнениях - задача не на это :)
*/
throw new NotImplementedException();
return Int32.Parse(x.ToString() + "0");
}

/// <summary>
Expand All @@ -133,7 +146,7 @@ internal static string ToHexString(int x)
У метода ToString числовых типов есть перегрузка, которая принимает строку с одним из заданного набора форматов.
В студии дается хорошая и понятная подсказка с этим набором форматов, в других же IDE скорее всего такого не будет, и придется погуглить форматы.
*/
throw new NotImplementedException();
return x.ToString("X");
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ internal static class Time
/// </summary>
public static DateTime WhatTimeIsIt()
{
throw new NotImplementedException();
return DateTime.Now;
}

/// <summary>
/// Возвращает текущее время в UTC.
/// </summary>
public static DateTime WhatTimeIsItInUtc()
{
throw new NotImplementedException();
return DateTime.UtcNow;
}

/// <summary>
Expand All @@ -36,7 +36,7 @@ public static DateTime SpecifyKind(DateTime dt, DateTimeKind kind)
/*
Подсказка: поищи в статических методах DateTime.
*/
throw new NotImplementedException();
return DateTime.SpecifyKind(dt, kind);
}

/// <summary>
Expand All @@ -51,7 +51,7 @@ Обязательно поиграйся и посмотри на измене
Ну и на будущее запомни этот прекрасный строковый формат представления времени - он твой бро!
Название запоминать не нужно, просто помни, что для передачи значения в виде строки, выбирать лучше инвариантные относительно сериализации/десериализации форматы.
*/
throw new NotImplementedException();
return dt.ToString("o");
}

/// <summary>
Expand All @@ -65,7 +65,7 @@ public static DateTime ParseFromRoundTripFormat(string dtStr)
Поиграйся и проверь, что round-trip действительно round-trip, т.е. туда-обратно равно оригиналу (для туда воспользуйся предыдущим методом).
Проверь для всех значений DateTime.Kind.
*/
throw new NotImplementedException();
return DateTime.Parse(dtStr, null, System.Globalization.DateTimeStyles.RoundtripKind);
}

/// <summary>
Expand All @@ -77,7 +77,7 @@ public static DateTime ToUtc(DateTime dt)
Eсли воспользуешься нужным методом, то напоминаю, что результат его работы зависит от dt.Kind.
В случае dt.Kind == Unspecified предполагается, что время локальное, т.е. результат работы в случае Local и Unspecified совпадают. Такие дела
*/
throw new NotImplementedException();
return dt.ToUniversalTime();
}

/// <summary>
Expand All @@ -88,7 +88,7 @@ public static DateTime ToUtc(DateTime dt)
public static DateTime AddTenSeconds(DateTime dt)
{
// здесь воспользуйся методами самого объекта и заодно посмотри какие еще похожие есть
throw new NotImplementedException();
return dt.AddSeconds(10.0);
}

/// <summary>
Expand All @@ -101,8 +101,13 @@ public static DateTime AddTenSecondsV2(DateTime dt)
/*
Ну а здесь воспользуйся сложением с TimeSpan. Обрати внимание, что помимо конструктора, у класса есть набор полезных статических методов-фабрик.
Обрати внимание, что у TimeSpan нет статических методов FromMonth, FromYear. Как думаешь, почему?

*
* Видимо, потому что годы и месяцы имеют разную длительность.
*

*/
throw new NotImplementedException();
return dt.Add(TimeSpan.FromSeconds(10.0));
}

/// <summary>
Expand All @@ -117,8 +122,16 @@ public static int GetHoursBetween(DateTime dt1, DateTime dt2)
1) Подумай, в чем разница между Hours и TotalHours
2) Проверь, учитывается ли Kind объектов при арифметических операциях.
3) Подумай, почему возвращаемое значение может отличаться от действительности.

*
* 1) `Hours` возвращает число часов в записи времени (например, 1530 минут - это 1 сутки 1 час 30 минут, то есть 1),
* а `TotalHours` возвращает полное время в часах как `double` (например, 150 минут - это 2.5 часа).
* 2) Да (т. е. считается правильная разница, по UTC)
* 3) Из-за ограниченной точности DateTime и вообще чисел с плавающей точкой - например, `(dt.AddMinutes(59.999999) - dt).TotalHours = 1`
*

*/
throw new NotImplementedException();
return (int)(dt1 - dt2).TotalHours;
}

/// <summary>
Expand All @@ -127,7 +140,14 @@ public static int GetHoursBetween(DateTime dt1, DateTime dt2)
public static int GetTotalMinutesInThreeMonths()
{
// ну тут все просто и очевидно, если сделал остальные и подумал над вопросами в комментах.
throw new NotImplementedException();

/*
*
* Не очевидно - в каких именно трёх месяцах?
* Сделал для 91 дня (т. е. примерно четверть года)
*
*/
return (int)TimeSpan.FromDays(91).TotalMinutes;
}

#region Adventure time saga
Expand All @@ -147,7 +167,9 @@ public static int GetAdventureTimeDurationInMinutes_ver0_Dumb()
Держи, заготовочку для копипасты:
- 2010, 3, 28, 2, 15, 0
*/
throw new NotImplementedException();
var from = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(+3, 0, 0));
var to = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(+0, 0, 0));
return (int)(to - from).TotalMinutes;
}

/// <summary>
Expand All @@ -165,7 +187,9 @@ public static int GetGenderSwappedAdventureTimeDurationInMinutes_ver0_Dumb()
- 2010, 3, 28, 3, 15, 0
- 2010, 3, 28, 1, 15, 0
*/
throw new NotImplementedException();
var from = new DateTimeOffset(2010, 3, 28, 3, 15, 0, new TimeSpan(+3, 0, 0));
var to = new DateTimeOffset(2010, 3, 28, 1, 15, 0, new TimeSpan(+0, 0, 0));
return (int)(to - from).TotalMinutes;
}

/// <summary>
Expand All @@ -180,7 +204,9 @@ Внимательный читатель мог усомниться в дан
На самом деле смещения таковы: Лондон +1 (BST - British Summer Time), Москва +4 (MSD - Moscow Daylight Time).
Давай теперь учтем правильное смещение. Я понимаю, что это очевидно, что результат не изменится, но тебе же не сложно скопипастить и просто поменять смещения?
*/
throw new NotImplementedException();
var from = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(+4, 0, 0));
var to = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(+1, 0, 0));
return (int)(to - from).TotalMinutes;
}

// GetGenderSwappedAdventureTimeDurationInMinutes_ver1_FeelsSmarter опустим, там то же самое
Expand All @@ -205,7 +231,15 @@ ниже ты найдешь готовый метод GetZonedTime. Прост
const string moscowZoneId = "Russian Standard Time";
const string londonZoneId = "GMT Standard Time";

throw new NotImplementedException();
/*
*
* Не уточнено время отправления/прибытия (видимо, предполагается 2:15)
*
*/

var from = Time.GetZonedTime(new DateTime(2010, 3, 28, 2, 15, 0), moscowZoneId);
var to = Time.GetZonedTime(new DateTime(2010, 3, 28, 2, 15, 0), londonZoneId);
return (int)(to - from).TotalMinutes;
}

/// <summary>
Expand All @@ -218,6 +252,16 @@ public static int GetGenderSwappedAdventureTimeDurationInMinutes_ver2_FeelsLikeR
*/
const string moscowZoneId = "Russian Standard Time";
const string londonZoneId = "GMT Standard Time";

/*
*
* Не уточнено время отправления/прибытия (видимо, предполагается 3:15 и 1:15, как во втором задании)
*
*/

var from = Time.GetZonedTime(new DateTime(2010, 3, 28, 3, 15, 0), moscowZoneId);
var to = Time.GetZonedTime(new DateTime(2010, 3, 28, 1, 15, 0), londonZoneId);
return (int)(to - from).TotalMinutes;
throw new NotImplementedException();
}

Expand Down Expand Up @@ -277,7 +321,7 @@ private static ZonedDateTime GetZonedTime(LocalDateTime localTime, string timeZo
/// <returns>True - если родились в один день, иначе - false.</returns>
internal static bool AreEqualBirthdays(DateTime person1Birthday, DateTime person2Birthday)
{
throw new NotImplementedException();
return person1Birthday.ToString("dd.M").Equals(person2Birthday.ToString("dd.M"));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>

<IsPackable>false</IsPackable>

<RootNamespace>BoringVector.Tests</RootNamespace>

<AssemblyName>BoringVector.Tests</AssemblyName>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\BoringVector\BoringVector.csproj" />
</ItemGroup>

</Project>
Loading