Здравствуйте, мастера по С#, надеюсь на вашу помощь!
У меня есть данный код, переделанный под WinForms:
int n = 10, k = 0;
bool key = false;
string[] str = new string[k];
var sb = new StringBuilder();
var result = sb.ToString();
while (n < 1 || n > 5)
{
n = Convert.ToInt32(FunctionAmount.Text);
}
string znach = FunctionValues.Text;
if (znach.Length != (int)Math.Pow(2, n))
{
MessageBox.Show("Введено неверное количество значений функции");
goto end;
}
for (int i = 0; i < (int)Math.Pow(2, n); i++)
if (Convert.ToInt32(znach[i]) < 49 && Convert.ToInt32(znach[i]) > 50)
{
MessageBox.Show("Введены недопустимые значения функции");
goto end;
}
for (int i = 0; i < (int)Math.Pow(2, n); i++)
if (znach[i] == '1')
{
k++;
Array.Resize<string>(ref str, k);
char[] chars = Convert.ToString(i, 2).PadLeft(n, '0').ToCharArray();
for (int j = 0; j < n; j++)
{
if (chars[j] == '0')
chars[j] = Convert.ToChar(97 + j);
if (chars[j] == '1')
chars[j] = Convert.ToChar(65 + j);
}
string strr = new string(chars);
str[k - 1] = strr;
}
foreach (string strng in str)
{
sb.AppendLine(strng + " ");
}
sb.AppendLine();
while (!key)
{
key = true;
string[] ptr = new string[0]; //массив для склеек на данном этапе
int[] reuse = new int[str.Length]; //массив меток
for (int l = 0; l < reuse.Length; l++) //метка использования (был ли задействован кусок ДНФ на данной итерации)
{
reuse[l] = 0;
}
for (int i = 0; i < str.Length; i++) //попарно сравниваем
{
for (int j = i + 1; j < str.Length; j++)
{
if (str[i].Length == str[j].Length) //если длинв одинаковы то вперед
{
int sbnr = 20, sbcnt = 0, sbcntt = 0; //переменные для нахождения кол-ва различных знаков иномера знака с различием
char[] charsi = str[i].ToCharArray(); //конвертнем в массивы
char[] charsj = str[j].ToCharArray();
for (int l = 0; l < charsi.Length; l++)
{
if (Convert.ToInt32(charsi[l]) - Convert.ToInt32(charsj[l]) == 32)
{
sbnr = l;
sbcnt++;
}
if (charsi[l] == charsj[l])
{
sbcntt++;
}
}
sbcntt++;
if (sbcnt == 1 && sbcntt == charsi.Length) //если куски ДНФ различаются на 1 знак
{
for (int u = sbnr; u < charsi.Length - 1; u++)
{
charsi[u] = charsi[u + 1];
}
reuse[i] = 1;
reuse[j] = 1;
key = false;
Array.Resize<char>(ref charsi, charsi.Length - 1); //то удаляем его
}
string strr = new string(charsi);
if (ptr.Length == 0 && !key) //заносим получившуюся склейку в ptr
{
Array.Resize<string>(ref ptr, 1);
ptr[0] = strr;
key = true;
}
if (ptr.Length != 0 && !key) //если ptr уже содержит куски
{
for (int t = 0; t < ptr.Length; t++)
{
if (ptr[t] == strr)
{
key = true;
}
}
if (!key)
{
Array.Resize<string>(ref ptr, ptr.Length + 1);
ptr[ptr.Length - 1] = strr;
key = true;
}
}
} //конец склейки
}
}
for (int i = 0; i < reuse.Length; i++) //добавление кусков не участвовавших в склейке
{
if (reuse[i] == 0)
{
Array.Resize<string>(ref ptr, ptr.Length + 1);
ptr[ptr.Length - 1] = str[i];
}
if (reuse[i] == 1)
{
key = false;
}
}
Array.Resize<string>(ref str, ptr.Length); //переносим ptr в str
for (int i = 0; i < ptr.Length; i++)
{
str[i] = ptr[i];
}
foreach (string strng in str)
{
sb.AppendLine(strng + " ");
}
} //едем на обратно на while
for (int i = 0; i < str.Length; i++)
{
if (!key)
sb.AppendLine(" V ");
key = false;
sb.AppendLine(str[i]);
textbox1.Text = str[i];
}
end:
И при проверке работоспособности кода я заметил, что код работает неправильно
Вот правильный вариант
А вот мой вариант
И я никак не могу найти ошибку, отладка не упростила мне эту задачу