Losango de asteriscos

Galera, fiz um algoritmo pra ler um losango em asteriscos. Porém, cada vez que o usuário digitar “n” o losango deve mudar de tamanho, e quanto maior foi o “n”, maior o losango. Para n=5 funciona, mas pra outros números o losango se deforma. Tentem mecher no código e arrumar pra mim, por favor, já tentei de tudo

[code]import javax.swing.*;
public class Figura {

public static void main(String args[]) {
	int i;
	int k;
	int n = Integer.parseInt(JOptionPane.showInputDialog("Qual o valor de 'n'?"));

	for(i=n; i>=1; i--){
		for(k=1; k<i; k++){
			System.out.print("  ");
		}
		System.out.print("*");
		for(k=-i-1; k>=i-n*2; k--){
			System.out.print("  ");
		}
		if(k==-i-1){
			System.out.println("  ");
		}
		else
		System.out.println("*");
	}
	for(i=1; i<=n-1; i++){
		System.out.print("  ");
		for(k=1; k<i; k++){
			System.out.print("  ");
		}
		System.out.print("*");
		for(k=-i*3; k>=-i-n*1-2; k--){
			System.out.print("  ");
		}
		if(k==-i*3){
		System.out.println("  ");
		}
		else
		System.out.println("*");

	}
}

}
[/code]

Olá, JorgeMN!

Eu acho que consegui:

[code]public class Losang{

public static void main(String[] args){

	int lado = 5; // Seta o tamanho do Losango
	int altura = (lado*2)-1;
	int zero = 0;
	int lan = 0;
	int cont = 1;
	int qtdAst = (lado*2)+(lado-2)*2;
	int ast = 0;

	StringBuffer espaco = new StringBuffer("");
	StringBuffer losang = new StringBuffer("");

	for(int i = 1; i < lado; i++)
		espaco.append(" ");

	for(int i = 0; i < altura; i++){
		System.out.print(espaco+"*"+losang);
		ast++;
		if(ast == 1)
			System.out.println("");
		if(ast > 1 && ast < qtdAst){
			System.out.println("*");
			ast++;
		}

		// Manipula os espaços internos
		if(losang.length() < altura-2 && lan == 0){
			for(int j = 1; j <= cont; j++){
				losang.append(" ");
			}
			if(cont<2)
				cont++;
		}else if(lan == 1){
			for(int j = 1; j <= 1; j++){
				if(losang.length()>2){
					losang.deleteCharAt(0);
					losang.deleteCharAt(0);
				}
			}
		}else{
			losang.deleteCharAt(0);
			if(losang.length()>1)
			losang.deleteCharAt(0);
			lan = 1;
		}

		// Manipula os espaços externos
		if(espaco.length() > 0 && zero == 0)
			espaco.deleteCharAt(0);
		else if(zero == 1)
			espaco.append(" ");
		else{
			espaco.append(" ");
			zero = 1;
		}
	}

}

}[/code]

Ta bem grotesco, depois vou ver como posso melhorar, fiz correndo aqui. Depois vou dar uma olhada no teu código para tentar acompanhar teu raciocínio e ver se fazemos uma coisa mais bonita.

EDIT: Esqueci de dizer, para mudar o tamanho do Losango é só mudar o valor da variável lado. Coloquei comentario lá agora.

Mais a noite eu posto aqui, abraço!

Então amigo, obrigado pela ajuda mas estou estudando Java e ainda não cheguei aos códigos usados em seu algoritmo, mas agradeço mesmo assim. Estou tentando concertar o código, e temos dois “FOR’s”, e o erro parece estar no segundo FOR, na última estrutura de repetição. Um abraço.

Olá, meu camarada!

Note que você está usando espaçamento, de dois em dois espaços, porém dentro do Losango, é necessário espaçamento em quantidades impares, independente da grandeza do Losango.

Pense, primeira linha: Somente o *;
Segunda linha: * * ou * * (1 ou 3 espaços, pois o asterisco da primeira linha tem que ficar no cento em relação aos da segunda linha)

Com 2 espaços por vez não é possível centralizar o asterisco da primeira linha.

Você disse que acha que o erro está no segundo FOR, mas no primeiro também está imprimindo errado, repare bem nos seus resultados.

Se mudar o espaçamento para 1 espaço por vez e fizer algumas modificações nos FORs da para consertar seu código.

Espero que tenha entendido o que expliquei.

Abraço!

Fala amigo, vê se isso te ajuda…

// Exercício 5.25: LosangosModificado.java
// Programa de impressão de losangos de acordo com entrada do usuário
import java.util.Scanner;

public class LosangosModificado
{
	public static void main( String[] args )
	{
		Scanner entrada = new Scanner( System.in );
		
		System.out.print( "Digite um número ímpar entre  1 a 19: " );
		int d = entrada.nextInt();
		int aux = 1;
		
		// Faz um tratamento para aceitar somente números ímpares entre 1 a 19
		while( ( d % 2 == 0 ) || ( d < 1 ) || ( d > 19 ) ) 
		{
			System.out.print( "ERRO. Digite um número ímpar entre  1 a 19: " );	
			d = entrada.nextInt();
			
		} // fim do tratamento - loop while
		
		 for( 
		 int i = 1; i <= (d/2)+1; i++) //contador de linhas
		{
				for( int j = (d/2)+1; j > i; j-- ) //contador de espaços
						System.out.print( " " );
				for( int k = 1 ; k <= aux; k++ ) //contador de asteriscos
						System.out.print( "*" );
				aux += 2;
				System.out.println();
		}
		
		aux -= 2;
		
		for( int i = 1; i <= (d/2); i++ ) //contador de linhas
		{
				for( int j = 1; j <= i; j++ ) //contador de espaços
						System.out.print( " " );
				
				aux -= 2;
				
				for( int k = 1 ; k <= aux; k++ ) //contador de asteriscos
						System.out.print( "*" );
				System.out.println();
		}

	}
}

Olá, lucas_guj!

Acredito que vai ajudá-lo sim, porém ele quer um losango vazado, ou seja, o losango tem que ter apenas suas bordas em asterico, seu interior não pode ser preenchido, isso requer um raciocínio um pouco diferente.

Abraço!

ah sim, desculpe o equivoco então

Não, amigo, equívoco algum, com certeza o raciocínio do seu código vai ajudar ao amigo a fazer o dele.

Vlw, abraço!

Olá, JorgeMN!

Como eu havia ficado de acertar seu código, venho aqui postar ele agora funcionando legal, apenas foi feito ajustes necessários para ele funcionar:

[code]import javax.swing.*;
public class Figura {

public static void main(String args[]) {
	int i;
	int k;
	int n = Integer.parseInt(JOptionPane.showInputDialog("Qual o valor de 'n'?"));

	for(i=n; i>=1; i--){
		for(k=1; k<i; k++){
			System.out.print(" ");
		}
		System.out.print("*");
		for(k=-i-1; k>=i-n*2+1; k--){
			System.out.print(" ");
		}
		if(k==-i-1){
			System.out.println(" ");
		}
		else
		System.out.println("*");
	}
	for(i=1; i<=n-1; i++){
		System.out.print(" ");
		for(k=1; k<i; k++){
			System.out.print(" ");
		}
		System.out.print("*");
		for(k=-i*3; k>=-i-n*2+4; k--){
			System.out.print(" ");
		}
		if(k==-i*3){
		System.out.println(" ");
		}
		else
		System.out.println("*");

	}		
}

}[/code]
Como eu também havia falado de rever meu código, segue um que fiz mais bem elaborado:

[code]/* Losango

  • Autor: Delano Lima
  • Data: 19/10/2011
    */
    import javax.swing.JOptionPane;

public class Losango{
public static void main(String[] args){
int lado = Integer.parseInt(JOptionPane.showInputDialog(“Qual tamanho do Losango?”));
for(int i = 1; i < lado2; i++){
for(int j = 1; j < lado
2; j++){
if(j == lado - i+1 || j == lado + i-1 || (i > lado && j == i - lado+1 || j == lado2+lado-1-i)){
System.out.print("
");
}else{
System.out.print(" “);
}
}
System.out.println(”");
}
}
}[/code]
Abraço, espero que ajude nos teus estudos.

Obrigado, ajudou sim. O losango que eu havia feito estava com defeito em um dos lados. Tinha 4 “colunas”, duas de 5 “" e duas de 4 "”, por isso você reparou na desproporção do primeiro FOR. Muito obrigado.