Imprimir quadrado usando apenas while e if [Resolvido]

Olha eu consegui aqui

[code]import java.util.Scanner;

public class Testes {

public static void main(String[] args) {

	int l = 0, l2, l3, l4;
	// variáveis utilizadas na construção do quadrado.
	Scanner input = new Scanner(System.in);

	// enquanto o usuário não inserir um valor no intervalo de 1 e 20
	while (l < 1 || l > 20) {
		System.out
				.print("Informe o lado do quadrado (comprimento de 1 a 20): ");
		l = input.nextInt();
	}

	l2 = l;
	l3 = l;
	l4 = l;

	while (l2 != 0) {
		// impressão da reta horizontal superior
		System.out.print("*");
		--l2;
	}

	// quais são as instruções necessárias para imprimir a reta vertical
	// direita?

	while (l3 != 1) {
		// impressão da reta vertical esquerda
		System.out.print("\n*");

		if (l3 != 2) {
			for (int i = 0; i < l - 2; i++) {
				System.out.print("x");
			}
			System.out.print("*");
		}

		--l3;

	}

	while (l4 != 1) {
		// impressão da reta horizontal inferior
		System.out.print("*");
		--l4;
	}

	System.out.println();

} // fim de main

} // fim da classe AsteriscoQuadrado[/code]

aqui funcionou, nao sei se todos os testes de cima funcionam .-.
comecei a aprender java faz 2 semanas, mas esse funcionou^^ espero q ajude

[quote=marcobiscaro2112]Procure por System.out.printf (ou String.format) e os argumentos possíveis para formatação. Por exemplo:

System.out.printf("%10s%n", "Olá");

Esse código imprime “Olá” alinhado à direita, usando 10 casas (ou seja, ele já completa com os devidos espaços se preciso).[/quote]

Boa tarde. Aproveitando a dica do marcobiscaro2112, gostaria de saber se seria possível escrever a seguinte instrução: System.out.printf("%xs%n", “Olá”); na qual x seria uma variável que teria recebido anteriormente um valor inteiro qualquer. Se tiver como fazer algo desse tipo, como seria a sintaxe correta para tal instrução?

Obs.: eu dei uma olhada na classe PrintStream e vi que o parâmetro passado para esse System.out.printf é String. Só com a sobreposição (override) que seria possível passar um integer ao invés de uma String?

Boa tarde Phoenix, ambas abaixo funcionam…

String espacos = "10"; System.out.printf("%"+ espacos +"s%n", "Olá");

int espacos = 10; System.out.printf("%"+ espacos +"s%n", "Olá");

Só seria integer se o primeiro argumento do printf fosse somente um número, desta forma:

int espacos = "10"; System.out.printf(espacos, "Olá");

Uma letra qualquer já o torna String

int espacos = "10"; System.out.printf(espacos +"letra", "Olá");

[quote=joselmocs]Boa tarde Phoenix, ambas abaixo funcionam…

String espacos = "10"; System.out.printf("%"+ espacos +"s%n", "Olá");

int espacos = 10; System.out.printf("%"+ espacos +"s%n", "Olá");[/quote]

Que ótimo joselmocs, bem prático mesmo! quanto ao %n, ele formata o quê? eu estou estudando pelo livro dos Deitel e no cap. 5 ele ensinou a escrever a seguinte instrução:

System.out.printf( "%s%20s \n", "Ano", "Quantidade depositada"); 

Só que não foi explicado nada ainda sobre o %n. Abraços e obrigado!

Ele funciona como o \n (quebra de linha)

Consegui desenvolver o " quadrado " ( retângulo ) proposto. O problema de desenvolver um quadrado é que o aumento da quantidade de espaços não é uniforme. Já que a quantidade de espaços para um quadrado de quatro asteriscos é de 5:

* * * *   
*     *
*     * 
*     *
* * * * 

Que é diferente da quantidade de espaços do de 5 asteriscos ( que é de 7) e, apesar da diferença entre a quantidade de espaços de um quadrado e outro ser uma P.A de razão 2 , não sei como inseri-la no código.

* * * * * * 
*         * 
*         *  
*         * 
*         * 
*         * 
* * * * * * 

Segue abaixo o código:


package asteriscoquadrado;

/**
 *
 * @author Eduardo Felipe
 */
public class AsteriscoQuadrado
{

    private int L;
    int i = 0;

    public void setL(int L)
    {
        this.L = L;
    }

    public void geraLinha()
    {

        i = 0;
        while (i < L)
        {
            System.out.print("*");
            ++i;
        }
        System.out.println();
    }

    public void geraHorizontal()
    {

        i = 0;
        int espaco = L - 2;
        while (i < L - 2)
        {
            System.out.printf("%s%" + espaco + "s%s", "*", " ", "*");
            System.out.println();
            ++i;
        }

    }
}

package asteriscoquadrado;

/**
 *
 * @author Eduardo Felipe
 */
import java.util.Scanner;
public class AsteriscoQuadradoTest
{

   public static void main(String[] args)
   {

      int L = 0;
      AsteriscoQuadrado q = new AsteriscoQuadrado();
      Scanner input = new Scanner(System.in);

      while( L < 1 || L > 20)
      {
           System.out.print("Informe o tamanho do lado do quadrado (entre 1 e 20): ");
           L = input.nextInt();
       }
        
        q.setL(L);
        
        q.geraLinha();
        q.geraHorizontal();
        q.geraLinha();
    }

}

Ele funciona como o \n (quebra de linha)[/quote]
Na verdade o “%n” é uma quebra de linha que funciona independentemente da plataforma (no Windows ele é traduzido como “\r\n” e em outros SOs como “\n”).

Boa noite Phoenix,

Tente alterando estes 2 métodos da classe AsteriscoQuadrado:

public void geraLinha() { i = 0; while (i < L) { if (i == (L -1)) { System.out.print("*"); } else { System.out.print("* "); } ++i; } System.out.println(); }e

public void geraHorizontal() { i = 0; while (i < L - 2) { System.out.printf("*%" + ((L * 2) -2) + "s%n", "*"); ++i; } }
edit.:
Retirei 2 parâmetros no printf do metodo geraHorizontal pra você ver que pode ser passado qualquer coisa no primeiro parâmetro.

System.out.printf("Meu Nome é %s", "Joselmo");

Abraços

Obrigado joselmocs! eu vou usar o recurso de comparação de códigos do NetBeans para analisar cuidadosamente a diferença de um algoritmo para o outro. Abraços!