Вопрос или проблема
Напишите программу под названием LoopyMelody в вашем пакете mmw, которая будет
- принимать из стандартного входного потока данные, соответствующие количеству нот в строке мелодии и количеству полутонах, на которое нужно сдвинуть от средней Ля.
- разрешать случайное смещение относительно средней Ля.
- выводить в стандартный поток вывода получившуюся мелодию
- используя цикл 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 — это многоэтапный процесс, требующий внимательного анализа входных данных и выведенных результатов. Используйте системный подход для определения отклонений и их быстрого исправления в коде. Удачи в создании мелодии!