C# Beginner1 Repairing Noname Introduction to methods - Methods.FunctionalModule

Привіт! Розумію, що задачу можна скіпнути, але хочу розібратись, чому моє рішення неправильне, хоча програма, на перший погляд, відпрацьовує так, як повинна це робити за умовою задачі.

Результат:

Код:

using System;

namespace Methods
{
    class FunctionalModule
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                string input = Console.ReadLine();
                input = input.ToLower();
                char firstCharacter = input[0];
                int firstCharacterCode = Convert.ToInt32(firstCharacter);

                if (firstCharacterCode >= 97 && firstCharacterCode <= 102)
                {
                    FromAToF(input);
                }

                else if(firstCharacterCode >= 103 && firstCharacterCode <= 108)
                {
                    FromGToL(input);
                }
                else if(firstCharacterCode >= 109 && firstCharacterCode <= 114)
                {
                    FromMToR(input);
                }
                else if(firstCharacterCode >= 115 && firstCharacterCode <= 122)
                {
                    FromSToZ(input);
                }
            }

        }
        
        static void FromAToF(string command)
        {
            Console.WriteLine($"FromAToF executes {command}.");
        }

        static void FromGToL(string command)
        {
            Console.WriteLine($"FromGToL executes {command}.");
        }

        static void FromMToR(string command)
        {
            Console.WriteLine($"FromMToR executes {command}.");
        }

        static void FromSToZ(string command)
        {
            Console.WriteLine($"FromSToZ executes {command}.");
        }
    }
}
  1. За умовами задачі команда має приймати інпут не 5 разів, а поки користувач не введе слово exit. Що якщо exit буде 2м? чи одразу? чи 7м інпутом? Оскільки ми не можемо вгадати наперед коли ми отримаємо exit, for loop тут не підходить. Що підходить краще?
  2. Дуже і дуже цікаве рішення з числовим значенням літер. Однак з ним є дуже важлива проблема: якщо я не читала б умов задачі (а інші програмісти, які одразу відкривають код найчастіше не бачать, що просили зробити інших), то я б не змогла здогадатися які ж літери тут закодовані. C# дозволяє порівнювати напряму char:
letter >= 'k' 

Такий варіант легше зрозуміти іншим і у тому числі знайти помилку, якщо вона є.

1 Like

Точно! Я так захопилася конвертуванням символів в цифровий код, що навіть не помітила умову про exit. :face_with_peeking_eye:

Дякую за підказку, порівняння символів напряму значно простіше! :smiling_face_with_three_hearts:

Поправила свій початковий код з порівнянням чисел, наче тепер спрацьовує корректно, в якому б місці не була команда exit. Розумію, що у вас в перевірку був закладений інший варіант, тому система мій варіант не приймає як вірний, але цікаво знати, чи можна використати такий варіант, чи й досі є помилки?

using System;

namespace Methods
{
    class FunctionalModule
    {
        static void Main(string[] args)
        {
            bool performCommands = true;
            while (performCommands)
            {
                string input = Console.ReadLine();

                input = input.ToLower();
                if(input == "exit")
                {
                    performCommands = false;
                }
                char firstCharacter = input[0];
                int firstCharacterCode = Convert.ToInt32(firstCharacter);

                if (firstCharacterCode >= 97 && firstCharacterCode <= 102)
                {
                    FromAToF(input);
                }

                else if(firstCharacterCode >= 103 && firstCharacterCode <= 108)
                {
                    FromGToL(input);
                }
                else if(firstCharacterCode >= 109 && firstCharacterCode <= 114)
                {
                    FromMToR(input);
                }
                else if(firstCharacterCode >= 115 && firstCharacterCode <= 122)
                {
                    FromSToZ(input);
                }
            }

        }
        
        static void FromAToF(string command)
        {
            Console.WriteLine($"FromAToF executes {command}.");
        }

        static void FromGToL(string command)
        {
            Console.WriteLine($"FromGToL executes {command}.");
        }

        static void FromMToR(string command)
        {
            Console.WriteLine($"FromMToR executes {command}.");
        }

        static void FromSToZ(string command)
        {
            Console.WriteLine($"FromSToZ executes {command}.");
        }
    }
}

якщо Ви подиветесь на output Вашої задачі, то побачита, що “exit” все одно видає FromAToF executes exit перед тим, як вийти, а має виходити одразу.

  • Один з варіантів при перевірці if(input == "exit") використовувати return; для того, щоб вийти з while loop одразу.

  • Ще один варіант string input = Console.ReadLine(); оголошувати до while loop і потім переназначати, як останній рядок всередені while

1 Like

Дуже дякую за допомогу! Тепер КодІзі приймає за правильне обидва варіанти (з числовим порівнянням та з символьним). Ура!

Правильно я розумію, що у рішенні від КодІзі, команда exit - єдина, в якій регістр має значення, тому що ми переводимо першу літеру в нижній регістр вже після оголошення умови циклу?:

while (command != "exit")
            {
                char letter = command[0];
                char letterInLowerCase = char.ToLower(letter);

Саме так. Обидва варіанти однаково валідні і трохи залежать від того, звідки ми отримували б цей input у житті.

1 Like

Останнє питання з цієї задачі. Пробачте що дістаю, хочеться остаточно розібратись. - А що саме повертає return у запропонованому вами варіанті?

Нічого.

return;

Виходить з того метода у якому ми зараз знаходимося.

if(input == "exit")
   return;

Вийде з Main у цьому прикладі, а відповідно і з програми.

1 Like

Цікаво! Дуже вдячна :hugs:

1 Like