Qual seria a melhor forma de resolver esse exercício? Não sei se o que fiz está ok

Usando o laço while:

Xuxa, a rainha dos baixinhos, criou uma música que tem o segunte formato:

n patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: Quá, quá, quá, quáMas só n-1 patinhos voltaram de lá.

Que se repete até nenhum patinho voltar de lá.
Ao final, todos os patinhos voltam:

A mamãe patinha foi procurar
Além das montanhas
Na beira do mar
A mamãe gritou: Quá, quá, quá, quá
E os n patinhos voltaram de lá.

Crie um programa em Java que recebe um inteiro positivo do usuário e exibe a música inteira na tela, onde o inteiro recebido representa o número inicial n de patinhos que foram passear.
.
.
.
package fundamentos;

import java.util.Scanner;

public class WhileFixacao {
public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);
System.out.println("qual numero de patinhos?");
int nPatos = entrada.nextInt();
int nPatos2 = nPatos;
while (nPatos != 1) {
	System.out.printf(" %d patinhos foram passear"
			+ "Além das montanhas"
			+ "Para brincar"
			+ "A mamãe gritou: Quá, quá, quá, "
			+ "quáMas só %d patinhos voltaram de lá. \n",nPatos,nPatos-1);
		
	nPatos--;}

if (nPatos == 1) {
	System.out.printf(" %d patinhos foi passear, ma nenhum patinho voltou de la\n",nPatos);}
	
System.out.printf("A mamãe patinha foi procurar"
			+ "Além das montanhas"
			+ "Na beira do mar"
			+ "A mamãe gritou: Quá, quá, quá, quá"
			+ "E os %d patinhos voltaram de lá.",nPatos2);


entrada.close();

}
}

Só mudaria o nome das variáveis para “patosInicial” (valor original digitado) e “patos” (valor atual).
A formatação tá um pouco estranha, pode ter sido na hora de colar aqui.

Uma das coisas que você tem que aprender ao programar é reconhecer padrões. No caso, identificar o que se repete e o que muda a cada iteração - que neste caso são algumas frases:

  • alguém foi passear/procurar: muda conforme a quantidade
  • Além das montanhas: nunca muda
  • para brincar ou procurar: mudar na última iteração
  • A mamãe gritou: nunca muda
  • E alguns ou todos voltam: muda a cada iteração

Então basta fazer um loop de nPatos até zero, e mudar as strings de acordo:

int nPatos = // ler quantidade do Scanner...
for (int n = nPatos; n >= 0; n--) {
    String quemFoi, acao, volta;
    if (n >= 1) {
        quemFoi = String.format("%d patinho%s passear", n, n == 1 ? " foi" : "s foram");
        acao = "Para brincar";
        if (n == 1) {
            volta = "Mas nenhum patinho voltou de lá";
        } else {
            volta = String.format("Mas só %d patinho%s de lá", n - 1, n == 2 ? " voltou" : "s voltaram");
        }
    } else {
        quemFoi = "A mamãe patinho foi procurar";
        acao = "Na beira do mar";
        volta = String.format("E os %d patinhos voltaram de lá", nPatos);
    }
    System.out.printf("%s\nAlém das montanhas\n%s\nA mamãe gritou: qua qua qua qua\n%s\n\n", quemFoi, acao, volta);
}

Quando n é maior que zero significa que ainda tem patinhos, e quando for zero é porque não tem mais nenhum e portanto é a vez da mamãe procurá-los.

Também coloquei \n para pular a linha, assim fica mais parecido com o que o enunciado parece querer. A saída é:

5 patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: qua qua qua qua
Mas só 4 patinhos voltaram de lá

4 patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: qua qua qua qua
Mas só 3 patinhos voltaram de lá

3 patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: qua qua qua qua
Mas só 2 patinhos voltaram de lá

2 patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: qua qua qua qua
Mas só 1 patinho voltou de lá

1 patinho foi passear
Além das montanhas
Para brincar
A mamãe gritou: qua qua qua qua
Mas nenhum patinho voltou de lá

A mamãe patinho foi procurar
Além das montanhas
Na beira do mar
A mamãe gritou: qua qua qua qua
E os 5 patinhos voltaram de lá
1 curtida

Valeu, foi quando colei o texto. Mas vou organizar.

Hugo, obrigado. Vou fazer uma versão com essas estruturas de controle, nesse caso eu precisava usar o while, pra fins didáticos.

A princípio, um for pode ser facilmente convertido para while:

int nPatos = // ler quantidade do Scanner...
int n = nPatos;
while(n >= 0) {
    String quemFoi, acao, volta;
    if (n >= 1) {
        quemFoi = String.format("%d patinho%s passear", n, n == 1 ? " foi" : "s foram");
        acao = "Para brincar";
        if (n == 1) {
            volta = "Mas nenhum patinho voltou de lá";
        } else {
            volta = String.format("Mas só %d patinho%s de lá", n - 1, n == 2 ? " voltou" : "s voltaram");
        }
    } else {
        quemFoi = "A mamãe patinho foi procurar";
        acao = "Na beira do mar";
        volta = String.format("E os %d patinhos voltaram de lá", nPatos);
    }
    System.out.printf("%s\nAlém das montanhas\n%s\nA mamãe gritou: qua qua qua qua\n%s\n\n", quemFoi, acao, volta);
    n--;
}

Obrigado Hugo, vou refazer. Ajudou muito!!!