Skip to content

Hw1 bwt#2

Open
AnNyiiik wants to merge 12 commits intomainfrom
HW1_BWT
Open

Hw1 bwt#2
AnNyiiik wants to merge 12 commits intomainfrom
HW1_BWT

Conversation

@AnNyiiik
Copy link
Copy Markdown
Owner

No description provided.


<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перейдите, пожалуйста, на .NET 7 :)

@@ -0,0 +1,166 @@
using System;
using System.Linq;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Неиспользуемый using. Надо убрать


namespace HW1_BWT
{
public class BWT
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У вас все методы static и поле тоже. Класс тоже стоит сделать static

public static string Encode(string sequence)
{
if (sequence.Length <= 1)
{
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А еще значение строки может быть null. Тогда ваша программа упадет с исключением NullPointerException.
Хорошо бы случаях, когда sequence == null || sequence.Length <= 0 возвращать, например, null - значение, которое будет индикатором того, что входные данные были некорректные

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут я не соглашусь, отсутствие значения должно быть явным, а null возвращать не надо никогда (и стандартная библиотека .NET никогда его не возвращает). Иначе уже вызывающий словит NullReferenceException внезапно для себя. И, кстати, в .NET 7 хорошо работает nullability-анализ — попытка передать или вернуть что-то, что может быть null, вызовет недовольство компилятора.

}
}

return String.Join("", encodedSequence);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return new string(encodedSequence) вероятно будет несколько понятнее выглядеть

return String.Join("", encodedSequence);
}

public static string Decode(string sequence)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для обратного преобразования Барроуза-Уилера нам нужна строка и позиция (это написало в условии задачи, кстати).
Ваш класс - это API для работы с преобразованием Барроуза-Уилера. Вы можете захотеть когда-то где-то его переиспользовать и сами же пострадаете от своего кода.
Что плохо: вы рассчитываете, что пользователь сначала вызовет Decode и только после этого вызова вызовет Encode (организация записи и чтения из поля POSITION). То есть вы рассчитываете на определенную последовательность вызовов методов. Но вам ее никто гарантировать не может.
Если вызвать Decode перед Encode, то ваша программа будет работать некорректно. Поправьте, пожалуйста :)

currentPosition = vector[currentPosition];
}

return String.Join("", result);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут тоже return new string(result) вероятно будет несколько понятнее выглядеть

Console.WriteLine("Tests have been failed");
return;
}
string code = BWT.Encode("banana");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Из условия: "На вход подаётся строка, на выходе должна получиться строка, преобразованная Барроузом-Уилером, и позиция конца строки в результате преобразования."

Во-первых, надо дать пользователю возможность ввести строку, чтобы выполнить преобразование, а не хардкодить ее.
Во-вторых, нужно вернуть не только строку - результат преобразования, но и позицию

}
string code = BWT.Encode("banana");
Console.WriteLine(code);
string encoded = BWT.Decode(code);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Из условия: "Реализовать также и обратное преобразование, принимающее преобразованную строку и позицию, и возвращающую исходную строку."

Надо дать пользователю возможность ввести строку и позицию

string code = BWT.Encode("banana");
Console.WriteLine(code);
string encoded = BWT.Decode(code);
Console.WriteLine(encoded);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас ваша программа вообще не общается с пользователем. Ему, например, непонятно, что в консоль выводится.

Пользовательский ввод обязательно должен сопровождаться подсказками, а вывод в консоль, какой-то информацией, поясняющей, что собственно вывелось

added input output and fixed test encode
added input output
@@ -0,0 +1,162 @@
using System;

namespace HW1_BWT
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Используйте file-scoped namespaces вместо namespaces с фигурными скобочками.
И еще пользуйтесь top-level statements

{
return Tuple.Create(sequence, 0);
}
int[] permutationsPositions = new int[sequence.Length];
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Используйте var - аналог auto в C++.
Это

int[] permutationsPositions = new int[sequence.Length];

можно записать так:

var permutationsPositions = new int[sequence.Length];

, где тип левой части будет на самом деле известен компилятору по правой части выражения

permutationsPositions[i] = i;
}
SortPermutations(permutationsPositions, sequence);
char[] encodedSequence = new char[sequence.Length];
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Снова можно использовать var

}
SortPermutations(permutationsPositions, sequence);
char[] encodedSequence = new char[sequence.Length];
int position = 0;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ненужное присваивание.
В .NET у типов есть значения по умолчанию, у int это 0. Достаточно просто int position;

{
private static bool TestEncode()
{
string[] testCases = new[] { "abracadabra", "banana", "abacaba", ""};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Даже тут можно var использовать

private static bool TestEncode()
{
string[] testCases = new[] { "abracadabra", "banana", "abacaba", ""};
string[] correctAnswers = new[] { "rdarcaaaabb", "nnbaaa", "bcabaaa", ""};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пробел потеряли при инициализации массива и лучше с var. То есть:

var correctAnswers = new[] { "rdarcaaaabb", "nnbaaa", "bcabaaa", "" };


private static bool TestDecode()
{
string[] testCases = new[] { "rdarcaaaabb", "bcabaaa"};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Снова пробел потерян при инициализации массива и можно var использовать

{
Tuple<string, int> answer = BWT.Encode(testCases[i]);
if (String.Compare(answer.Item1, correctAnswers[i]) != 0
|| correctPositions[i] != answer.Item2)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если что-то не умещается в строку, то отступ не 4, а 8 пробелов.

if (String.Compare(answer.Item1, correctAnswers[i]) != 0 
        || correctPositions[i] != answer.Item2)

Comment on lines +40 to +42
int[] firstPositionsOfSortedCharacters = new int[cardinality];
char[] alphabet = new char[cardinality];
GetAlphabeticFrequencySequence(sequence, firstPositionsOfSortedCharacters, alphabet);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Метод Get..., который ничего не возвращает. Такое название путает.
  2. Вы создаете 2 пустых массива, чтобы потом с ними какие-то манипуляции в методе GetAlphabeticFrequencySequence произвести. Создавайте тогда массивы в этом методе. А метод GetAlphabeticFrequencySequence может вернуть объект класса, в который вы захотите обернуть возвращаемое значение (2 ваших массива, который вам дальше нужны). В крайнем случае можно их в кортеже вернуть, это будет несколько менее понятно, но пока так можно при условии, что добавите к методу комментарии о смысле возвращаемого значения

return;
}

if (option == 1)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь switch... case будет несколько лучше смотреться

@@ -0,0 +1,161 @@
using System;

namespace HW1_BWT;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужна пустая строка после namespace

using System;

namespace HW1_BWT;
public static class BWT {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Скобочку по стайлгайду для C# надо на следующую строку перенести

@@ -0,0 +1,43 @@
using System;

namespace HW1_BWT;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опять-таки нужна пустая строка после namespace

using System;

namespace HW1_BWT;
public class Test {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И опять нужно скобочку на следующую строку перенести.

Уже гораздо лучше, но стоит внимательнее проверять на корректность то, что ввел пользователь и то, что передается в качестве аргументов в публичные методы. Поправьте, пожалуйста, эти замечания и можно будет оценку поднять на балл

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверять на корректность аргумент в самом методе?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверять на корректность аргумент в самом методе?

Мы с Юрием Викторовичем договорились, что будем требовать от вас для public методов проверку на всё. Для internal методов проверку на null можно не делать, потому что nullability-анализ не позволит вам просто так взять и передать в метод null

Comment on lines +4 to +58
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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сместите все, пожалуйста, на 4 пробела влево

return Tuple.Create(new string(encodedSequence), position);
}

public static string Decode(string sequence, int position)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут тоже стоило проверить, что sequence не null, а position находится в корректном диапазоне значений

}
}

static bool ComparePermutations(int first, int second, string sequenceZero)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давайте договоримся явно указывать модификаторы видимости :) Так код чуточку понятнее становится

@@ -0,0 +1,58 @@
using System;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужна пустая строка после using

Comment on lines +21 to +26
var sequence = Console.ReadLine();
if (sequence == null)
{
Console.WriteLine("Empty string");
return;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь пользователь мог ввести, например, Ctrl + Z. В результате такого ввода Console.ReadLine вернет null. Еще пользователь мог нажать Enter, тогда из Console.ReadLine вернется пустая строка. Для пустой строки вы выполняете преобразование и даже выдаете position! То есть ваш вывод для этого случая некорректен. Поправьте, пожалуйста :)

Comment on lines +33 to +38
sequence = Console.ReadLine();
if (sequence == null)
{
Console.WriteLine("Empty string");
return;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь то же самое. Пользователь мог нажать Enter, Console.ReadLine вернула пустую строку. То есть можно в этот if еще и проверку на пустую строку добавить

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants