Conversation
…beticFrequencySequence & SortCharacters in BWT class
HW1_BWT/HW1_BWT/HW1_BWT.csproj
Outdated
|
|
||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net5.0</TargetFramework> |
There was a problem hiding this comment.
Перейдите, пожалуйста, на .NET 7 :)
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| @@ -0,0 +1,166 @@ | |||
| using System; | |||
| using System.Linq; | |||
There was a problem hiding this comment.
Неиспользуемый using. Надо убрать
HW1_BWT/HW1_BWT/BWT.cs
Outdated
|
|
||
| namespace HW1_BWT | ||
| { | ||
| public class BWT |
There was a problem hiding this comment.
У вас все методы static и поле тоже. Класс тоже стоит сделать static
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| public static string Encode(string sequence) | ||
| { | ||
| if (sequence.Length <= 1) | ||
| { |
There was a problem hiding this comment.
А еще значение строки может быть null. Тогда ваша программа упадет с исключением NullPointerException.
Хорошо бы случаях, когда sequence == null || sequence.Length <= 0 возвращать, например, null - значение, которое будет индикатором того, что входные данные были некорректные
There was a problem hiding this comment.
Тут я не соглашусь, отсутствие значения должно быть явным, а null возвращать не надо никогда (и стандартная библиотека .NET никогда его не возвращает). Иначе уже вызывающий словит NullReferenceException внезапно для себя. И, кстати, в .NET 7 хорошо работает nullability-анализ — попытка передать или вернуть что-то, что может быть null, вызовет недовольство компилятора.
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| } | ||
| } | ||
|
|
||
| return String.Join("", encodedSequence); |
There was a problem hiding this comment.
return new string(encodedSequence) вероятно будет несколько понятнее выглядеть
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| return String.Join("", encodedSequence); | ||
| } | ||
|
|
||
| public static string Decode(string sequence) |
There was a problem hiding this comment.
Для обратного преобразования Барроуза-Уилера нам нужна строка и позиция (это написало в условии задачи, кстати).
Ваш класс - это API для работы с преобразованием Барроуза-Уилера. Вы можете захотеть когда-то где-то его переиспользовать и сами же пострадаете от своего кода.
Что плохо: вы рассчитываете, что пользователь сначала вызовет Decode и только после этого вызова вызовет Encode (организация записи и чтения из поля POSITION). То есть вы рассчитываете на определенную последовательность вызовов методов. Но вам ее никто гарантировать не может.
Если вызвать Decode перед Encode, то ваша программа будет работать некорректно. Поправьте, пожалуйста :)
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| currentPosition = vector[currentPosition]; | ||
| } | ||
|
|
||
| return String.Join("", result); |
There was a problem hiding this comment.
Тут тоже return new string(result) вероятно будет несколько понятнее выглядеть
HW1_BWT/HW1_BWT/Program.cs
Outdated
| Console.WriteLine("Tests have been failed"); | ||
| return; | ||
| } | ||
| string code = BWT.Encode("banana"); |
There was a problem hiding this comment.
Из условия: "На вход подаётся строка, на выходе должна получиться строка, преобразованная Барроузом-Уилером, и позиция конца строки в результате преобразования."
Во-первых, надо дать пользователю возможность ввести строку, чтобы выполнить преобразование, а не хардкодить ее.
Во-вторых, нужно вернуть не только строку - результат преобразования, но и позицию
HW1_BWT/HW1_BWT/Program.cs
Outdated
| } | ||
| string code = BWT.Encode("banana"); | ||
| Console.WriteLine(code); | ||
| string encoded = BWT.Decode(code); |
There was a problem hiding this comment.
Из условия: "Реализовать также и обратное преобразование, принимающее преобразованную строку и позицию, и возвращающую исходную строку."
Надо дать пользователю возможность ввести строку и позицию
HW1_BWT/HW1_BWT/Program.cs
Outdated
| string code = BWT.Encode("banana"); | ||
| Console.WriteLine(code); | ||
| string encoded = BWT.Decode(code); | ||
| Console.WriteLine(encoded); |
There was a problem hiding this comment.
Сейчас ваша программа вообще не общается с пользователем. Ему, например, непонятно, что в консоль выводится.
Пользовательский ввод обязательно должен сопровождаться подсказками, а вывод в консоль, какой-то информацией, поясняющей, что собственно вывелось
… to encode, fixed test
added input output and fixed test encode
added input output
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| @@ -0,0 +1,162 @@ | |||
| using System; | |||
|
|
|||
| namespace HW1_BWT | |||
There was a problem hiding this comment.
Используйте file-scoped namespaces вместо namespaces с фигурными скобочками.
И еще пользуйтесь top-level statements
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| { | ||
| return Tuple.Create(sequence, 0); | ||
| } | ||
| int[] permutationsPositions = new int[sequence.Length]; |
There was a problem hiding this comment.
Используйте var - аналог auto в C++.
Это
int[] permutationsPositions = new int[sequence.Length];можно записать так:
var permutationsPositions = new int[sequence.Length];, где тип левой части будет на самом деле известен компилятору по правой части выражения
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| permutationsPositions[i] = i; | ||
| } | ||
| SortPermutations(permutationsPositions, sequence); | ||
| char[] encodedSequence = new char[sequence.Length]; |
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| } | ||
| SortPermutations(permutationsPositions, sequence); | ||
| char[] encodedSequence = new char[sequence.Length]; | ||
| int position = 0; |
There was a problem hiding this comment.
Ненужное присваивание.
В .NET у типов есть значения по умолчанию, у int это 0. Достаточно просто int position;
HW1_BWT/HW1_BWT/Test.cs
Outdated
| { | ||
| private static bool TestEncode() | ||
| { | ||
| string[] testCases = new[] { "abracadabra", "banana", "abacaba", ""}; |
There was a problem hiding this comment.
Даже тут можно var использовать
HW1_BWT/HW1_BWT/Test.cs
Outdated
| private static bool TestEncode() | ||
| { | ||
| string[] testCases = new[] { "abracadabra", "banana", "abacaba", ""}; | ||
| string[] correctAnswers = new[] { "rdarcaaaabb", "nnbaaa", "bcabaaa", ""}; |
There was a problem hiding this comment.
Пробел потеряли при инициализации массива и лучше с var. То есть:
var correctAnswers = new[] { "rdarcaaaabb", "nnbaaa", "bcabaaa", "" };
HW1_BWT/HW1_BWT/Test.cs
Outdated
|
|
||
| private static bool TestDecode() | ||
| { | ||
| string[] testCases = new[] { "rdarcaaaabb", "bcabaaa"}; |
There was a problem hiding this comment.
Снова пробел потерян при инициализации массива и можно var использовать
HW1_BWT/HW1_BWT/Test.cs
Outdated
| { | ||
| Tuple<string, int> answer = BWT.Encode(testCases[i]); | ||
| if (String.Compare(answer.Item1, correctAnswers[i]) != 0 | ||
| || correctPositions[i] != answer.Item2) |
There was a problem hiding this comment.
Если что-то не умещается в строку, то отступ не 4, а 8 пробелов.
if (String.Compare(answer.Item1, correctAnswers[i]) != 0
|| correctPositions[i] != answer.Item2)
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| int[] firstPositionsOfSortedCharacters = new int[cardinality]; | ||
| char[] alphabet = new char[cardinality]; | ||
| GetAlphabeticFrequencySequence(sequence, firstPositionsOfSortedCharacters, alphabet); |
There was a problem hiding this comment.
- Метод
Get..., который ничего не возвращает. Такое название путает. - Вы создаете 2 пустых массива, чтобы потом с ними какие-то манипуляции в методе GetAlphabeticFrequencySequence произвести. Создавайте тогда массивы в этом методе. А метод GetAlphabeticFrequencySequence может вернуть объект класса, в который вы захотите обернуть возвращаемое значение (2 ваших массива, который вам дальше нужны). В крайнем случае можно их в кортеже вернуть, это будет несколько менее понятно, но пока так можно при условии, что добавите к методу комментарии о смысле возвращаемого значения
HW1_BWT/HW1_BWT/Program.cs
Outdated
| return; | ||
| } | ||
|
|
||
| if (option == 1) |
There was a problem hiding this comment.
Здесь switch... case будет несколько лучше смотреться
| @@ -0,0 +1,161 @@ | |||
| using System; | |||
|
|
|||
| namespace HW1_BWT; | |||
There was a problem hiding this comment.
Нужна пустая строка после namespace
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| using System; | ||
|
|
||
| namespace HW1_BWT; | ||
| public static class BWT { |
There was a problem hiding this comment.
Скобочку по стайлгайду для C# надо на следующую строку перенести
| @@ -0,0 +1,43 @@ | |||
| using System; | |||
|
|
|||
| namespace HW1_BWT; | |||
There was a problem hiding this comment.
Опять-таки нужна пустая строка после namespace
HW1_BWT/HW1_BWT/Test.cs
Outdated
| using System; | ||
|
|
||
| namespace HW1_BWT; | ||
| public class Test { |
There was a problem hiding this comment.
И опять нужно скобочку на следующую строку перенести.
Уже гораздо лучше, но стоит внимательнее проверять на корректность то, что ввел пользователь и то, что передается в качестве аргументов в публичные методы. Поправьте, пожалуйста, эти замечания и можно будет оценку поднять на балл
There was a problem hiding this comment.
Проверять на корректность аргумент в самом методе?
There was a problem hiding this comment.
Проверять на корректность аргумент в самом методе?
Мы с Юрием Викторовичем договорились, что будем требовать от вас для public методов проверку на всё. Для internal методов проверку на null можно не делать, потому что nullability-анализ не позволит вам просто так взять и передать в метод null
HW1_BWT/HW1_BWT/Program.cs
Outdated
| if (!Test.TestBWT()) | ||
| { | ||
| Console.WriteLine("Tests have been failed"); | ||
| return; | ||
| } | ||
| Console.WriteLine("Please, enter the option (1 to encode and 2 to decode):"); | ||
| var isCorrect = Int32.TryParse(Console.ReadLine(), out int option); | ||
| if (!isCorrect) | ||
| { | ||
| Console.WriteLine("Not a number"); | ||
| return; | ||
| } | ||
|
|
||
| switch (option) | ||
| { | ||
| case 1: | ||
| Console.WriteLine("Please, enter a string to encode:"); | ||
| var sequence = Console.ReadLine(); | ||
| if (sequence == null) | ||
| { | ||
| Console.WriteLine("Empty string"); | ||
| return; | ||
| } | ||
| var answer = BWT.Encode(sequence); | ||
| Console.WriteLine("Encoded string : {0} \nPosition : {1}", answer.Item1, answer.Item2); | ||
| break; | ||
|
|
||
| case 2: | ||
| Console.WriteLine("Please, enter a string to decode:"); | ||
| sequence = Console.ReadLine(); | ||
| if (sequence == null) | ||
| { | ||
| Console.WriteLine("Empty string"); | ||
| return; | ||
| } | ||
| Console.WriteLine("Please, enter a position:"); | ||
| isCorrect = Int32.TryParse(Console.ReadLine(), out int position); | ||
| if (!isCorrect) | ||
| { | ||
| Console.WriteLine("Not a number"); | ||
| return; | ||
| } | ||
| if (position >= sequence.Length || position < 0) | ||
| { | ||
| Console.WriteLine("Position is incorrect"); | ||
| return; | ||
| } | ||
| var decodedString = BWT.Decode(sequence, position); | ||
| Console.WriteLine("Decoded string : {0} ", decodedString); | ||
| break; | ||
|
|
||
| default: | ||
| Console.WriteLine("Option is incorrect"); | ||
| break; | ||
| } No newline at end of file |
There was a problem hiding this comment.
Сместите все, пожалуйста, на 4 пробела влево
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| return Tuple.Create(new string(encodedSequence), position); | ||
| } | ||
|
|
||
| public static string Decode(string sequence, int position) |
There was a problem hiding this comment.
Тут тоже стоило проверить, что sequence не null, а position находится в корректном диапазоне значений
HW1_BWT/HW1_BWT/BWT.cs
Outdated
| } | ||
| } | ||
|
|
||
| static bool ComparePermutations(int first, int second, string sequenceZero) |
There was a problem hiding this comment.
Давайте договоримся явно указывать модификаторы видимости :) Так код чуточку понятнее становится
| @@ -0,0 +1,58 @@ | |||
| using System; | |||
There was a problem hiding this comment.
Нужна пустая строка после using
HW1_BWT/HW1_BWT/Program.cs
Outdated
| var sequence = Console.ReadLine(); | ||
| if (sequence == null) | ||
| { | ||
| Console.WriteLine("Empty string"); | ||
| return; | ||
| } |
There was a problem hiding this comment.
Здесь пользователь мог ввести, например, Ctrl + Z. В результате такого ввода Console.ReadLine вернет null. Еще пользователь мог нажать Enter, тогда из Console.ReadLine вернется пустая строка. Для пустой строки вы выполняете преобразование и даже выдаете position! То есть ваш вывод для этого случая некорректен. Поправьте, пожалуйста :)
HW1_BWT/HW1_BWT/Program.cs
Outdated
| sequence = Console.ReadLine(); | ||
| if (sequence == null) | ||
| { | ||
| Console.WriteLine("Empty string"); | ||
| return; | ||
| } |
There was a problem hiding this comment.
Здесь то же самое. Пользователь мог нажать Enter, Console.ReadLine вернула пустую строку. То есть можно в этот if еще и проверку на пустую строку добавить
No description provided.