Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [4]  Все   Вниз
  Печать  
Автор Тема: Написание программы  (Прочитано 62651 раз)
0 Пользователей и 26 Гостей смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #90 : 20-10-2019 15:24 » 

Если всё понятно, то остаётся только рализовать Ваш метод с разбивкой на слова.

Сначала, на нормальном (русском) языке записываете/описываете новый метод для теста ключа в словах.
Ессно в нём Вы будете вызывать другие "новые" методы. Например вспомогательный метод для "выдёргивания" слова из запроса.

Не старайтесь сделать ВСЁ в одном методе. Сформулируйте конкретную задачу этого метода и разбейте её на подзадачи. Реализуйте методы для подзадач и тд.

После этого "прогоните" метод на его работоспособность (поставьте себя на место компьютера и "выполните" код) и, если всё работает, переходите к кодированию, записи алгоритма на языке C#.

Результат - в студию.
« Последнее редактирование: 20-10-2019 15:30 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
KOzh1r
Участник

ru
Offline Offline

« Ответ #91 : 20-10-2019 18:52 » 

Из непонятного:
Методы GetSubString и IsCharInArray как реализуются?

GetSubString - должен разделять введённую информацию на несколько символов и записывать каждую группу в свою переменную или создавать некий массив, с данными по три символа;

IsCharInArray - должен произвести анализ в переменных, массиве или просто в методе GetSubString?
Записан
KOzh1r
Участник

ru
Offline Offline

« Ответ #92 : 20-10-2019 19:22 » 

Пока получается вот это:
Код: (C#)
using System;
using System.Text;

public class MainClass
{
    enum ManufactureCountryKey
    {
        Undefined,
        Russia,
        Japan
    };

    public static void Main()
    {
        string request = GetRequest();
        ManufactureCountryKey key = FindKey(request);
        string data = FindData(key);  
        OutputResult(data);
    }

    private static bool HasRUS(string request)
    {
        for (int i = 0; i < request.Length; i++)
        {
            string keySequence = GetSubString(request, i, 3);
            if (VerifyRUS(keySequence))
            {
                return true;
            }
        }
        return false;
    }

    private static bool HasJAP(string request)
    {
        for (int i = 0; i < request.Length; i++)
        {
            string keySequence = GetSubString(request, i, 3);
            if (VerifyJAP(keySequence))
            {
                return true;
            }
        }
        return false;
    }
    private static bool VerifyRUS(string keySequence)
    {
        if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
        {
            string allowedInFirstPos = "Рр";
            string allowedInSecondPos = "УуОоАа";
            string allowedInThirdPos = "Сс";
            if (IsCharInArray(keySequence[0], allowedInFirstPos))
            {
                if (IsCharInArray(keySequence[1], allowedInSecondPos))
                {
                    if (IsCharInArray(keySequence[2], allowedInThirdPos))
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private static bool VerifyJAP(string keySequence)
    {
        if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
        {
            string allowedInFirstPos = "ЯяИи";
            string allowedInSecondPos = "Пп";
            string allowedInThirdPos = "Оо";

            if (IsCharInArray(keySequence[0], allowedInFirstPos))
            {
                if (IsCharInArray(keySequence[1], allowedInSecondPos))
                {
                    if (IsCharInArray(keySequence[2], allowedInThirdPos))
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    private static string GetRequest()
    {
        Console.WriteLine("Введите запрос");
        string a = Console.ReadLine();
        return a;
    }
    private static ManufactureCountryKey FindKey(string request)
    {        
        if (!string.IsNullOrEmpty(request))
        {
            if (HasRUS(request))
            {
                return ManufactureCountryKey.Russia;
            }
            else if (HasJAP(request))
            {
                return ManufactureCountryKey.Japan;
            }
        }
        return ManufactureCountryKey.Undefined;
    }

    private static string FindData(ManufactureCountryKey key)
    {
        StringBuilder sb = new StringBuilder();

        switch (key)
        {
            case ManufactureCountryKey.Russia:
                {
                    sb.Append("Ваз");
                    sb.Append(" ");
                    sb.Append("Газ");
                }
                break;
            case ManufactureCountryKey.Japan:
                {
                    sb.Append("Mazda");
                    sb.Append(" ");
                    sb.Append("Toyota");
                    sb.Append(" ");
                    sb.Append("Nissan");
                }
                break;
            default:
                {
                    sb.Append("По Вашему запросу данных нет");
                }
                break;
        }

        string result = sb.ToString();
        return result;
    }
    private static void OutputResult(string data)
    {
        Console.WriteLine(data);
    }

}

Не реализованы последние два метода, о которых писал выше. Может Вы увидите еще ошибки?
Записан
KOzh1r
Участник

ru
Offline Offline

« Ответ #93 : 20-10-2019 20:21 » 

Код: (C#)
private static string GetSubString (string request)
    {
        string one = "";
        for (int i = 0; i < request.Length; i++)
        {
           char ch = request [i];
           one = one + ch;
        }
    }

Как ограничить "one" тремя символами? Как остановить цикл, когда в переменную попадет нужное значение? Или опять не то делаю Я? Здесь была моя ладья...

Код: (C#)
private static bool HasRUS(string request)
// вернуть результат проверки наличия "русского" ключа во введённом пользователм запросе
{
    // перебираем все позиции в запросе начиная с нулевого
    for (int i = 0; i < request.Length; i++)
    {
        // последовательность для проверки = Получить из запроса последовательность длиной 3 символа, начиная с текущей позиции
        string keySequence = GetSubString(request, i, 3);
        // если последовательность соответствует "русскому" ключу
        if(VerifyRUS(keySequence))
        {
            // останавливаем выполнение программки (метода, собачки) и возвращаем результат истина
            return true;
        }
    }
    // "русский" ключ в запросе не найден, возвращем результат ложь
    return false;
}

Как Я понимаю, эти два метода действуют аналогично. Только работают с разными вводными данными. Верно?
« Последнее редактирование: 20-10-2019 20:45 от KOzh1r » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #94 : 20-10-2019 23:31 » 

Как ограничить "one" тремя символами?

Улыбаюсь

Почти правильно, только сигнатура GetSubString у Вас какая? string GetSubString (string request)? А должна быть?

Подсказки
 * добавить в код вспомогательный метод выделения из строки-источника определённого количества символов в строку начиная с определённой позиции
   * private static string GetSubString(string source, int startPosition, int length)
   * не забудьте про проверку индекса

Я пока "подправлю" Ваш метод. Как цикл работает Вы поняли, это уже хорошо.

Итак

В Вашем коде Вы "вытаскиваете" последовательно символы и сохраняете их в буфер - это то что нам нужно. Только
1. Вытаскивать надо из request, который передаётся в метод в качестве параметра source
2. Сколько? 3 символа, значит цикл должен рабоать только 3 раза

дальше коменты в коде

Код: (C#)
private static string GetSubString(string source, int startPosition, int length)
{
            string rus = ""; // а для вытаскивания японских этот метод разве не подойдёт? ну ладно пусть будет rus
            // string b = "рус"; // это к чему? выкидываем нафик
            for (int i = 0; i < b.Length; i++) // почему с 0? стартовая позиция передаётся в метод в качестве параметра -> startPosition
            // конечное условие? длина последовательности -> length, но нам нужен индекс символа, совершенно очевидно, что если мы начнём "вытаскивать" с 5-ой позиции, то условие 5 < 3 будет изначально ложно, и цикл не выполнится ни разу
            // что надо сделать? пересчитать индекс символа с учётом стартовой позици. Логика: получить 3 символа, начиная с пятой позиции, значит какие индексы нам нужны? 5,6,7 или?
            {
                char ch = request[i];
                rus = rus + ch;
            }

        return rus;
}

Вот и всё... Уже можно работать, НО опасно. А что если метод будет вызван со стартовым индексом 134? Я уже говорил, что доступ к не существующим индексам приведёт к обрушению программы. Значит, перед тем как его запускать
надо проверить стартовое и... конечное значение. Ведь если в метод будет передан индекс последнего символа, то на втором шаге индек будет больше количества элементов в строке.
Это делается простыми известными Вам if-ами

Внимательно посмотрите, ниже Вы же сами написали в методе HasRUS:

        // последовательность для проверки = Получить из запроса последовательность длиной 3 символа, начиная с текущей позиции
        string keySequence = GetSubString(request, i, 3);

i - это и есть "текущая" позиция, знчение этой переменной изменяется в цикле, те на первом шаге метод GetSubString будет вызван с параметрами:
GetSubString(request, 0, 3);
GetSubString(request, 1, 3);
GetSubString(request, 2, 3);
и тд

Вспомним пример из описания алгоритма

Это как раз и даёт нам:

Цитата
Поскольку мы не знаем, в каком месте они находятся, необходимо "пробежать" по всей строке

0 Пок
1 ока
2 каж
3 ажи
4 жи
5 и р
6  ру
7 рус
8 уск
и тд

Таким образом Ваша реализация метода не получает необходимой информации. Она получает только источник = все символы запроса, это правильно. Но,

1. она должна вытаскивать только 3. Можно эти 3 забить жёстко, тогда цикл будет выглядеть так for (int i = 0; i < 3; i++), но это снизит гибкость логики. А если нам потребуется вытаскивать не 3, а 2,4,5... Поэтому лучше передавать длину в качестве параметра.

2. цикл начинается всегда с 0, те сколько бы этот метод не вызывали, он ВСЕГДА будет возвращать только ПЕРВЫЕ три символа. Значит ему надо сообщить дополнительно, с какой позиции надо вытаскивать эти три символа: с нулевой, первой, второй и тд


Добавлено через 3 минуты и 15 секунд:
Как остановить цикл, когда в переменную попадет нужное значение? Или опять не то делаю Я? Здесь была моя ладья...

В данном случае речь не идёт о "нужном" значении. Или я не понимают что Вы имеете ввиду? Этот метод тупо должен вытаскивать запрошенное количество (в нашем случае 3) символов из переданной в него строки.
Всё. Что это за символы ему по барабану. Анализ не является задачей этого метода.
« Последнее редактирование: 21-10-2019 00:26 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #95 : 20-10-2019 23:43 » new

Как Я понимаю, эти два метода действуют аналогично. Только работают с разными вводными данными. Верно?

Да. Нет.

1. Да, эти методы действуют аналогично
2. Нет, они не получают разные вводные данные

Оба метода, получают строку ввода в качестве параметра, только один пытается найти в ней "русский" ключ, а второй "японский". Единственное отличие HasRUS вызывает VerifyRUS, а HasJPA соответственно VerifyJAP.
private static bool HasRUS(string request)
{
    for (int i = 0; i < request.Length; i++)
    {
        string keySequence = GetSubString(request, i, 3);
        if (VerifyRUS(keySequence))
        {
            return true;
        }
    }
    return false;
}
private static bool HasJAP(string request)
{
    for (int i = 0; i < request.Length; i++)
    {
        string keySequence = GetSubString(request, i, 3);
        if (VerifyJAP(keySequence))
        {
            return true;
        }
    }
    return false;
}

И только уже методы VerifyRUS и VerifyJAP, "внутри себя" определяют различные данные для поиска своего собственного ключа. Те самые разрешённые символы в первой, второй и третьей позициях.

private static bool VerifyRUS(string keySequence)
{
    if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
    {
        string allowedInFirstPos = "Рр";
        string allowedInSecondPos = "УуОоАа";
        string allowedInThirdPos = "Сс";

        if (IsCharInArray(keySequence[0], allowedInFirstPos))
        {
            if (IsCharInArray(keySequence[1], allowedInSecondPos))
            {
                if (IsCharInArray(keySequence[2], allowedInThirdPos))
                {
                    return true;
                }
            }
        }
    }
    return false;
}
private static bool VerifyJAP(string keySequence)
{
    if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
    {
        string allowedInFirstPos = "ЯяИи";
        string allowedInSecondPos = "Пп";
        string allowedInThirdPos = "Оо";

        if (IsCharInArray(keySequence[0], allowedInFirstPos))
        {
            if (IsCharInArray(keySequence[1], allowedInSecondPos))
            {
                if (IsCharInArray(keySequence[2], allowedInThirdPos))
                {
                    return true;
                }
            }
        }
    }
    return false;
}
« Последнее редактирование: 20-10-2019 23:52 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #96 : 21-10-2019 00:00 » 

Из непонятного:
Методы GetSubString и IsCharInArray как реализуются?

С первым вроде разобрались.

IsCharInArray - должен произвести анализ в переменных, массиве или просто в методе GetSubString?

Подсказки
 * добавить в код вспомогательный метод для проверки нахождения символа в массиве других смволов
    * private static bool IsCharInArray(char ch, string allowedChars)

Этот метод должен подтвердить или опровергнуть (вернуть true или false) предположение, что символ находится в каком-то массиве символов? А что есть массив символов? Строка.
Те метод получает символ, которой он должен найти, в качестве параметра 1, и 2-ой параметр эта самая строка с разрешёнными (назовём их так) символами.

private static bool IsCharInArray(char ch, string allowedChars)

В цикле перебираем все символы строки и сравниваем каждый с параметром 2. Если они равны, возвращаем true.
« Последнее редактирование: 21-10-2019 00:27 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
KOzh1r
Участник

ru
Offline Offline

« Ответ #97 : 21-10-2019 15:26 » 

Как Я понимаю, эти два метода действуют аналогично. Только работают с разными вводными данными. Верно?

Да. Нет.

1. Да, эти методы действуют аналогично
2. Нет, они не получают разные вводные данные

Оба метода, получают строку ввода в качестве параметра, только один пытается найти в ней "русский" ключ, а второй "японский". Единственное отличие HasRUS вызывает VerifyRUS, а HasJPA соответственно VerifyJAP.
private static bool HasRUS(string request)
{
    for (int i = 0; i < request.Length; i++)
    {
        string keySequence = GetSubString(request, i, 3);
        if (VerifyRUS(keySequence))
        {
            return true;
        }
    }
    return false;
}
private static bool HasJAP(string request)
{
    for (int i = 0; i < request.Length; i++)
    {
        string keySequence = GetSubString(request, i, 3);
        if (VerifyJAP(keySequence))
        {
            return true;
        }
    }
    return false;
}

И только уже методы VerifyRUS и VerifyJAP, "внутри себя" определяют различные данные для поиска своего собственного ключа. Те самые разрешённые символы в первой, второй и третьей позициях.

private static bool VerifyRUS(string keySequence)
{
    if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
    {
        string allowedInFirstPos = "Рр";
        string allowedInSecondPos = "УуОоАа";
        string allowedInThirdPos = "Сс";

        if (IsCharInArray(keySequence[0], allowedInFirstPos))
        {
            if (IsCharInArray(keySequence[1], allowedInSecondPos))
            {
                if (IsCharInArray(keySequence[2], allowedInThirdPos))
                {
                    return true;
                }
            }
        }
    }
    return false;
}
private static bool VerifyJAP(string keySequence)
{
    if (!string.IsNullOrEmpty(keySequence) && (keySequence.Length == 3))
    {
        string allowedInFirstPos = "ЯяИи";
        string allowedInSecondPos = "Пп";
        string allowedInThirdPos = "Оо";

        if (IsCharInArray(keySequence[0], allowedInFirstPos))
        {
            if (IsCharInArray(keySequence[1], allowedInSecondPos))
            {
                if (IsCharInArray(keySequence[2], allowedInThirdPos))
                {
                    return true;
                }
            }
        }
    }
    return false;
}


Методы "RUS" и "JAP" идентичны, это без проблем понял. Я имел ввиду, что метод GetSubString работает схоже с методом HasRUS.

Не понял сначала, каким образом метод GetSubString работает с данными, которые получает (эти самые три символа) и как именно работает IsCharInArray.
Записан
Страниц: 1 2 3 [4]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines