NotAComputerScienceStudent Ответов: 2

Почему мой код проходит через оператор if и else


В основном мой код проходит через оба оператора if и else при первом цикле.

В основном это происходит через if(length = length) и if(length < length)

[^]

В первый раз все идет нормально но во второй раз нет

Что я уже пробовал:

if (GuessChar.Length == ActualChar.Length)//GIVING ERROR
            {
                //Check Each Element
                for (int i = 0; i < WordLenght; i++)
                {
                    for (int p = 0; p < WordLenght; p++)
                    {
                        if (GuessChar[i] == ActualChar[p])
                        {
                            LetterGuessed++;
                        }
                    }
                }
                //Repeating in a single array
                var duplicateDict = new Dictionary<char, int>();
                foreach (var ch in GuessChar)
                {
                    if (duplicateDict.ContainsKey(ch))
                    {
                        duplicateDict[ch]++;
                    }
                    else
                    {
                        duplicateDict.Add(ch, 1);
                    }
                }

                foreach (var ch in duplicateDict.Where(x => x.Value > 1))
                {
                    //Console.WriteLine(string.Format("Duplicate Character {0}, Count {1}", ch.Key, ch.Value));
                    repeated++;
                }
                if (repeated == 1)
                {
                    repeated = 0;
                }
                for (int i = 0; i < WordLenght; i++)
                {
                    if (ActualChar[i] == GuessChar[i]) Victory = true;
                }

            }
            else if (GuessChar.Length > WordLenght)
            {
                //THIS ONE IS GIVING THE ERROR
                Console.WriteLine("Wrong Length, Actual Lenght is : Shorter");
            }
            else if (Guess.Length > WordLenght)
            {
                Console.WriteLine("Wrong Length, Actual Lenght is : Longer");
            }

Richard MacCutchan

В вашем коде есть несколько "если" и "если". На какие из них вы ссылаетесь и какие условия проверяются?

2 Ответов

Рейтинг:
0

Richard MacCutchan

else if (GuessChar.Length > WordLenght)
{

    Console.WriteLine("Wrong Length, Actual Lenght is : Shorter");
}
else if (Guess.Length > WordLenght) // *** this one should use < operator
{
    Console.WriteLine("Wrong Length, Actual Lenght is : Longer");
}

Вы используете один и тот же оператор сравнения для двух разных тестов.


Maciej Los

Ястребиный глаз!

Richard MacCutchan

Если я изменю свое имя, меня скоро раскроют. :(

NotAComputerScienceStudent

если (GuessChar.Длина == ActualChar.Длина) и еще если (GuessChar.Length > WordLenght) оба этих утверждения исключаются.

Richard MacCutchan

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

F-ES Sitecore

Один тестирует GuessChar, а другой просто угадывает.

Richard MacCutchan

Упс, я пропустил это.

Рейтинг:
0

George Swan

Мне кажется, что вы поступаете не лучшим образом.


//Check Each Element
              for (int i = 0; i < WordLength; i++)
              {
                for (int p = 0; p < WordLength; p++)
                 {
                   if (GuessChar[i] == ActualChar[p])
                    {
                      LetterGuessed++;
                    }
                 }
              }

Может быть заменен на


foreach (char c in GuessChar)
{
    LetterGuessed = ActualChar.Contains(c) ? LetterGuessed+=1: LetterGuessed;
}

А это


//Repeating in a single array
var duplicateDict = new Dictionary<char, int>();
foreach (var ch in GuessChar)
{
    if (duplicateDict.ContainsKey(ch))
    {
        duplicateDict[ch]++;
    }
    else
    {
        duplicateDict.Add(ch, 1);
    }
}

foreach (var ch in duplicateDict.Where(x => x.Value > 1))
{
    //Console.WriteLine(string.Format("Duplicate Character {0}, Count {1}", ch.Key, ch.Value));
    repeated++;
}

Может быть преломлен в


var letters = GuessChar.GroupBy(c => c, (k, x) => (Letter:k, DuplicateCount:x.Count()-1));
 foreach(var letter in letters)
 {
     repeated += letter.DuplicateCount;
 }

Не знаю, почему вы сидите repeated до 0, если это 1, но вы можете удалить if заявление, сделав это


//if (repeated == 1)
//{
//    repeated = 0;
//}
repeated= repeated==1?0:repeated;

Этот цикл должен иметь возможность раннего выхода


for (int i = 0; i < WordLength; i++)
              {
                  if (ActualChar[i] == GuessChar[i]) Victory = true;
              }
for (int i = 0; i < WordLength; i++)
              {
                  if (ActualChar[i] == GuessChar[i])
                   {
                    Victory = true;
                    break;
              }

Наконец, последнее else if заявление


else if (GuessChar.Length > WordLength)
{
    //THIS ONE IS GIVING THE ERROR
    Console.WriteLine("Wrong Length, Actual Lenght is : Shorter");
}
else if (GuessChar.Length > WordLength)
{
    Console.WriteLine("Wrong Length, Actual Lenght is : Longer");
}

Может быть заменен на


else
          {
              string substring = GuessChar.Length > WordLength ? "Shorter" : "Longer";
              Console.WriteLine($"Wrong Length, Actual Length is : {substring}");

          }