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("*");
}
}
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.
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.
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.
// 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();
}
}
}
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.
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 < lado2; 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.