Как я могу проверить формат вывода мелодии? [закрыто]

Вопрос или проблема

Напишите программу под названием LoopyMelody в вашем пакете mmw, которая будет

  1. принимать из стандартного входного потока данные, соответствующие количеству нот в строке мелодии и количеству полутонах, на которое нужно сдвинуть от средней Ля.
  2. разрешать случайное смещение относительно средней Ля.
  3. выводить в стандартный поток вывода получившуюся мелодию
  4. используя цикл while.

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

выполнить:
Введите количество нот в ряду мелодии: 5
Введите изменения (0 – 8) выше средней Ля, или -1 для случайного сдвига: 2
Вот ваша мелодия!
(C ,1/2) (C ,1/2) (C ,1/2) (C ,1/2) \ (A ,1/2)
/(C ,1/2) (C ,1/2) (C ,1/2) \ (A ,1/2) / (D ,1)
(C ,1/2) (C ,1/2) \ (A ,1/2) / (D ,1) / (E ,1)
(C ,1/2) \ (A ,1/2) / (D ,1) / (E ,1) / (F ,1)
(E ,1/2) \ (D ,1) / (E ,1) / (F ,1) / (G ,1)
(C ,1/2) / (E ,1/2) \ (D ,1) / (E ,1) / (F ,1)
(C ,1/2) (C ,1/2) / (E ,1/2) \ (D ,1) / (E ,1)
(C ,1/2) (C ,1/2) (C ,1/2) / (E ,1/2) \ (D ,1)
(C ,1/2) (C ,1/2) (C ,1/2) (C ,1/2) / (E ,1/2) (E ,2)

выполнить:
Введите количество нот в ряду мелодии: 4
Введите изменения (0 – 8) выше средней Ля, или -1 для случайного сдвига: 5
Вот ваша мелодия!
(F ,1/2) (F ,1/2) (F ,1/2) \ (D ,1/2)
/(F ,1/2) (F ,1/2) \ (D ,1/2) / (G ,1)
(F ,1/2) \ (D ,1/2) / (G ,1) / (A ,1)
(A ,1/2) \ (G ,1) / (A ,1) / (B ,1)
(F ,1/2) / (A ,1/2) \ (G ,1) / (A ,1)
(F ,1/2) (F ,1/2) / (A ,1/2) \ (G ,1)
(F ,1/2) (F ,1/2) (F ,1/2) / (A ,1/2) (A ,2)

выполнить:
Введите количество нот в ряду мелодии: 6
Введите изменения (0 – 8) выше средней Ля, или -1 для случайного сдвига: -1
Вот ваша мелодия!
(G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) \ (E ,1/2)
/(G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) \ (E ,1/2) / (A ,1)
(G ,1/2) (G ,1/2) (G ,1/2) \ (E ,1/2) / (A ,1) / (B ,1)
(G ,1/2) (G ,1/2) \ (E ,1/2) / (A ,1) / (B ,1) / (C ,1)
(G ,1/2) \ (E ,1/2) / (A ,1) / (B ,1) / (C ,1) / (D ,1)
(B ,1/2) \ (A ,1) / (B ,1) / (C ,1) / (D ,1) / (E ,1)
(G ,1/2) / (B ,1/2) \ (A ,1) / (B ,1) / (C ,1) / (D ,1)
(G ,1/2) (G ,1/2) / (B ,1/2) \ (A ,1) / (B ,1) / (C ,1)
(G ,1/2) (G ,1/2) (G ,1/2) / (B ,1/2) \ (A ,1) / (B ,1)
(G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) / (B ,1/2) \ (A ,1)
(G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) (G ,1/2) / (B ,1/2) (B ,2)

Кроме того, ваша программа должна соответствовать следующему тексту программы на Java, и итерации должны выполняться только с помощью циклов while. То, что я сделал, заключалось в том, чтобы написать программу, а затем удалить тела некоторых методов. Ваша задача – вернуть инструкции. Или, по крайней мере, инструкции, которые выполнят эту работу и использует циклы while. Кроме добавления инструкций в указанные методы, весь исполняемый код должен оставаться точно таким же, как в сопроводительном тексте программы. – что означает, что вы можете добавлять комментарии себе по мере необходимости. Вы должны быть в состоянии использовать вашу программу для генерации мелодий, которые появляются в моей демонстрации, а также многие другие.

package mmw;

import note.SNote; 
import java.util.Scanner;

public class LoopyMelody {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        SNote note = new SNote();

        note.text(); 

        // Начать с средней Ля; подготовка к сдвигу.
        note.lp(2); 

        int rowPlays = askForNumberOfNotesPerRow(sc);
        int pitchShift = askForPitchShift(sc);

        note.rp(pitchShift);
        playMelody(rowPlays, note);  

        // Вернуть высоту до средней До для неизменности.
        note.lp(pitchShift);
        note.rp(2);

        note.untext();
    }

    private static int askForPitchShift(Scanner sc) {
        // Вам нужно написать тело этого метода.
    }

    private static int askForNumberOfNotesPerRow(Scanner sc) {
        // Вам нужно написать тело этого метода.
    }

    private static void playMelody(int rowPlays, SNote note) {
        // Вы должны написать этот метод. Вы должны использовать циклы while.
        // Хорошо используйте методы playSamePitch и
        // playRisingPitch, которые написаны для вас ниже.
        // Начните, получив "базовую" высоту и
        // "ноту сдвига", чтобы играть правильно, и затем добавьте
        // последовательность восходящих тонов.
    }

    private static void playSamePitch(int i, SNote note) {
        int j = 0;
        while (j < i) {
            note.play();
            j = j + 1;
        }
    }

    private static void playRisingPitch(int i, SNote note) {
        int j = 0;
        while (j < i) {
            note.rp();
            note.play();
            j = j + 1;
        }
        note.lp(i);
    }
}

Вот код, который я написал, но я испытываю трудности с идентификацией ошибки. Когда я запускаю его, вывод, похоже, начинает и заканчивается только (C, 1) или (-, 1), и он не соответствует ожидаемой структуре мелодии из описания проблемы. Я думаю, что проблема может быть в методе playMelody, но я хотел бы попросить помощи, так как я все еще новичок в этом, а программирование мелодий немного сложно для меня.

package mmw;

import note.SNote; 
import java.util.Scanner;

public class LoopyMelody {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        SNote note = new SNote();

        note.text(); 

        // Начать с средней Ля; подготовка к сдвигу.
        note.lp(2); 

        int rowPlays = askForNumberOfNotesPerRow(sc);
        int pitchShift = askForPitchShift(sc);

        note.rp(pitchShift);
        playMelody(rowPlays, note);  

        // Вернуть высоту до средней До для неизменности.
        note.lp(pitchShift);
        note.rp(2);

        note.untext();
    }

    private static int askForPitchShift(Scanner sc) {
        // Вам нужно написать тело этого метода.
        System.out.print("Введите изменения (0 - 8) выше средней Ля, или -1 для случайного сдвига: ");
        int shift = sc.nextInt();
        
        // Проверка на случайный сдвиг.
        if (shift == -1) {
            shift = (int) (Math.random() * 9); // Генерация случайного сдвига от 0 до 8.
        }
        
        // Проверка валидности ввода.
        while (shift < -1 || shift > 8) {
            System.out.print("Неверный ввод. Пожалуйста, введите значение от 0 до 8 или -1 для случайного сдвига: ");
            shift = sc.nextInt();
            if (shift == -1) {
                shift = (int) (Math.random() * 9);
            }
        }
        return shift;
    }

    private static int askForNumberOfNotesPerRow(Scanner sc) {
        // Вам нужно написать тело этого метода.
        System.out.print("Введите количество нот в ряду мелодии: ");
        return sc.nextInt(); // Возвращаем ввод пользователя напрямую.
    }

    private static void playMelody(int rowPlays, SNote note) {
        // Вы должны написать этот метод. Вы должны использовать циклы while.
        // Хорошо используйте методы playSamePitch и
        // playRisingPitch, которые написаны для вас ниже.
        // Начните, получив "базовую" высоту и
        // "ноту сдвига", чтобы играть правильно, и затем добавьте
        // последовательность восходящих тонов.
        int baselinePitch = 2; // Начальная высота (средняя Ля).
        int shiftNote = baselinePitch + pitchShift; // Вычислить ноту сдвига с использованием предоставленного сдвига.
        int lines = 6; // Общее количество строк для вывода.

        // Первая часть мелодии.
        int currentLine = 0;
        while (currentLine < lines) {
            int i = rowPlays; // Сбросите i до количества нот в строке для каждой линии.

            // Играть ноты одинаковой высоты.
            playSamePitch(i, note);

            // Играть ноту сдвига в конце каждой строки.
            System.out.print(" \\ ");
            note.lp(shiftNote);
            note.play();
            System.out.println();

            currentLine++; // Перейти к следующей строке.
        }
    }

    private static void playSamePitch(int i, SNote note) {
        int j = 0;
        while (j < i) {
            note.play();
            j = j + 1;
        }
    }

    private static void playRisingPitch(int i, SNote note) {
        int j = 0;
        while (j < i) {
            note.rp();
            note.play();
            j = j + 1;
        }
        note.lp(i);
    }
}

Ответ или решение

К сожалению, ваше сообщение используется без описания проблемы, поэтому я не имею возможности предложить конкретное решение. Однако, основываясь на предоставленных вами фрагментах кода и информации о программе для генерации мелодии, я дам опорный план по проверке формата вывода программы.

Шаги для валидации формата вывода

1. Понимание требований к структуре вывода:

Чтобы валидировать формат вывода программы LoopyMelody, мы должны внимательно рассмотреть детализированные требования к структуре мелодии. Это включает в себя:

  • Количество нот на строку: Принимаемое пользователем значение для количества нот на строку.
  • Сдвиг высоты: Сдвиг, заданный пользователем, или случайное значение от 0 до 8, если введён -1.

2. Проверка соответствия выведенных данных:

Вывод должен соответствовать заранее заданному формату. Каждый элемент мелодии в формате (X, Y):

  • X: Нота, выводимая в интервале от C до G, в зависимости от текущей высоты.
  • Y: Длительность ноты, которая всегда равна 1/2 для первых нот и 1 для последней ноты в строке.

3. Реализация процедуры проверки:

  • Создайте метод, который будет проверять каждую строку выведенного результата.
  • Распечатайте сообщениях о любых отклонениях от ожидаемого формата.

Примерный алгоритм может выглядеть так:

private static void validateOutput(String output) {
    String[] lines = output.split("\n"); // Разделить вывод на строки
    for (String line : lines) {
        // Проверяем, что строка содержит ожидаемое количество нот
        String[] notes = line.split(" ");
        // Проверка количества нот
        if (notes.length != ожидаемое_количество_нот) {
            throw new IllegalArgumentException("Количество нот не совпадает");
        }
        for (String note : notes) {
            // Проверка формата каждой ноты
            if (!note.matches("\\([A-G],(1/2|1)\\)")) {
                throw new IllegalArgumentException("Некорректный формат ноты: " + note);
            }
        }
    }
}

4. Тестирование:

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

Заключение

Проверка формата вывода программы LoopyMelody — это многоэтапный процесс, требующий внимательного анализа входных данных и выведенных результатов. Используйте системный подход для определения отклонений и их быстрого исправления в коде. Удачи в создании мелодии!

Оцените материал
Добавить комментарий

Капча загружается...