Rysowanie obwodu prostokąta gwiazdkami w konsoli

0

Mam problem z narysowaniem obwodu prostokąta. Muszę użyć while. Narysowałem górny oraz lewy bok. Teraz chcę narysować prawy bok, jednak trochę mi nie wychodzi. Co jest nie tak z trzecim whilem?

int dlugosc = 5;
        int szerokosc = 7;
        int i=1,j=1;
        
        while(i<szerokosc){
            i++;
            System.out.print("*");
        }
        while(j<dlugosc){
            j++;
            System.out.println("*");
        }    
        while(i==szerokosc){
        i++;
        System.out.println("*");
        }
1

Podejście które wydaje mi się bardziej logiczne:

Masz prostokąt rozmiaru N x M

więc tworzysz sobie 2 elementy z których składa się dany prostokąt(w pętli)

pierwszy element składa się z samych gwiazdek (powiedzmy że N) ... <- N gwiazdek
drugi element ma 2 gwiazdki i N-2 spacji * ... *

mając te 2 elementy możemy narysować prostokąt składający się z M linii rysując:

1x pierwszy element
M-2 x drugi element
i znowu 1x pierwszy element

0
import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		int width = 20;
		int height = 20;
		char[] canvas = new char[width*height];
		Arrays.fill(canvas, ' ');
		
		for(int i = 0; i < 10; ++i){
			canvas[0*height+i] = '*';
			canvas[9*height+i] = '*';
			canvas[i*height] = '*';
			canvas[i*height+9] = '*';
			canvas[i*height+i] = '*';
			canvas[(9-i)*height+i] = '*';
		}
		
		for(int y = 0; y < height; ++y){
			for(int x = 0; x < width; ++x)
				System.out.print(canvas[y*width+x]);
			System.out.println();
		}
	}
}

http://ideone.com/N7PNjQ
Wychodzi z tego taki piękniś:

**********          
**      **          
* *    * *          
*  *  *  *          
*   **   *          
*   **   *          
*  *  *  *          
* *    * *          
**      **          
**********          
0

setsudanhana nie rozumiem Cię do końca. Jak mam to zrobić?

String a = "*******";
String b = "*     *";

?

1

Chodzi o to, zeby rysowac linie po kolei. Najpierw rysujesz gorna krawedz, ma ona tyle gwiazdek ile wynosi szerokosc prostokata (pierwsza petla while). Potem rysujesz te linie srodkowe - to, co podales jako String b. Kazda taka linia sklada sie z gwiazdki, potem jest N-2 spacji (N - szerokosc prostokata) i potem druga gwiazdka. Takich lini rysujesz M-2 (M - wysokosc prostokata). Na koncu robisz to co w pkt 1, czyli N gwiazdek. Dokladnie tak, jak opial wczesniej @setsudanhana

0

Nie wiem czy do końca o to Wam chodziło. A jak się na to zapatrujecie?

String a = "*******";
        String b = "*     *";
        int m=0;
        int n=0;
        
        while(m<=0){
            m++;
           System.out.println(a);
        }
        while(n<3){
            n++;
            System.out.println(b);
        }
        System.out.println(a);
    } 
}
1

jak masz zdefiniowane a i b to wystarczy Ci sama wysokość prostokąta, czyli

String a = "*******";
        String b = "*     *";
        int m=4; // powiedzmy 4
        int n=0;
 
        System.out.println(a);

        for(int i = 0; i < m - 2; ++i){
               System.out.println(b);
        }

        System.out.println(a);
    } 
}

dodanie znacznika <code class="java"> - @furious programming

1

Zakladajac, ze prostokat ma stala szerokosc mogloby to ujśc. Jesli natomiast oba wymiary sa dynamiczne to to niestety nie zadziala;p

Mozesz probowac jakos tak:

//wymiary
int X = 10;
int Y = 10;


for(int i = 0; i< X; i++) //rysujesz pierwsza krawedz
{
	System.out.print("*");
}
 
System.out.println(); //przechodzisz do nastepnej lini
 
for(int i = 0; i< Y-2; i++) //wysujesz "wewnetrzne" linie
{
	System.out.print("*");  //lewa gwiazdka
	for(int j =0 ; j< X-2; j++)
	{
		System.out.print(" ");  //srodkowe spacje
	}
	System.out.println("*"); //prawa gwiazdka i przejscie do nastepnej lini
}
 
for(int i = 0; i< X; i++) //rysujesz ostatnia krawedz
{
	System.out.print("*");
}  

Wynik: http://ideone.com/nqOn8U

0

przypominam, że chcę użyć tylko while :)

1

No to uzyj while, podmienienie fora trudne nie jest;)

Przyklad:

//petla for
for(int i = 0; i< N; i++) 
{
	System.out.print("dupa");
}
//petla while
int i = 0;
while(i<N)
{
	System.out.print("dupa");
	i++;
}

Zauwaz, ze te petle robia dokladnie to samo w prawie identyczny sposob, roznica jest tylko w zapisie. W kazdym tutorialu z programowania to jest w jednej z pierwszych lekcji ;p

0

nie doszedłem jeszcze do for :D dopiero zacząłem naukę

0

Mniejsza o większość. Czy Twoim zdaniem w tym przypadku "nie ważne jak, oby działało" ma tu jakąś rację bytu? Czy może to co napisałem jest nie do przyjęcia (chodzi o kod)?

0

Skoro sie uczysz to chyba lepiej zrobic to poprawnie i tak jak powinno sie robic, nie? ;) Skoro chcesz napisac program, ktory działa "prawie dobrze", to wystarczy, ze zrobisz;

public static void main (String[] args)
{
    System.out.print("*");
}

Uruchomi sie, costam wypisze, wiec prawie dziala;p A do tego ile razy szybciej :D

0

Masz rację. Jednak mój kod działa poprawnie, a nie "prawie" poprawnie. Robi to, co ma robić. Nie uważam też, że jakoś mega go rozwlokłem. Po prostu brak mi jeszcze praktyki. Od czegoś trzeba chyba zacząć ;)

0

Zakladajac, ze ten prostokat stale wymiary, zawsze takie same, to wtedy dziala ok. Jesli wymaganie jest takie, zeby rysowal prostokat dla dowolnych wymiarow (w granicach rozsadku) to wtedy nie dziala - wiec tutaj to jest kwestia tego, co chcesz zeby ten program robil ;)

0

Dzięki za pomoc :)

0

Teraz chciałbym narysować trójkąt prostokątny (wypełniony). Jak się do tego zabrać?

int lw = 1; // 
        int i=0, j=0;
        
        while(lw<7){
            while(i<lw){
                i++;
                System.out.println("*");
            }
            lw++;
        }
1
  1. Nazywaj zmienne jakos normalnie, to Ci ulatwi pozniejsze kodowanie jak takie nawyki sobie wbijesz do glowy
  2. Formatowanie kodu. Jak kod jest ladnie sformatowany to szbciej sie go czyta, a w przypadku dosc krotkich fragmentow po pierwszym spojrzeniu juz wiadomo co robi
  3. Zastanow sie jak to ma dzialac, wyobraz sobie po kolei kroki programu, czyli w tym przypadku bedzie to jedna petla, ktora bedzie rysowala linie trojkata i druga petla ( wewnetrzna) ktora bedzie rysowala wiersz zlozony z gwiazdek w ilosci zaleznej od tego jak "gleboko" jest ta zewnetrzna petla

Edit: Jak sie poddasz to tu masz mały hint: http://ideone.com/ZIcjxB ;p

0
  int a=10;
        int i=0, j=0;
        
        while(i<10){
            while(){
                
            }
            i++;
            System.out.println("*");
        }

Utknąłem przy drugim while.

2

Po co dwie pętle?

String line = "*";
int nr = 1;
while(nr <= 10)
{
    System.out.println(line);
    line+="*";
    nr++;
}
0

Wcześniej zrobiłem coś takiego jak to na dole i nie rysowało mi całego trójkąta, więc wkleiłem kod bez argumentów dla drugiego while z prośbą o pomoc. Zauważyłem, że deklarujesz j, po pierwszym while. To jedyna różnica. Możesz mi wyjaśnić dlaczego nie mogę tego zrobić przed whilem?

        int a=10;
        int i=0, j=0;
        
        while(i<10){
            while(j<i){
                System.out.print("*");
                j++;
            }
            i++;
            System.out.println("*");
        }
0

Mozesz ja deklarować gdzie chcesz, chodzi o to, zeby sie wyzerowala przed wejsciem do drugiego whila

1 użytkowników online, w tym zalogowanych: 0, gości: 1