Rysowanie obwodu prostokąta gwiazdkami w konsoli

2015-02-10 10:33
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("*");
        }
edytowany 2x, ostatnio: jabluszko, 2015-02-10 10:34

Pozostało 580 znaków

2015-02-10 10:50
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

Pozostało 580 znaków

2015-02-10 10:53
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ś:

**********          
**      **          
* *    * *          
*  *  *  *          
*   **   *          
*   **   *          
*  *  *  *          
* *    * *          
**      **          
**********          
edytowany 1x, ostatnio: spartanPAGE, 2015-02-10 10:53

Pozostało 580 znaków

2015-02-10 11:05
0

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

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

?

edytowany 1x, ostatnio: jabluszko, 2015-02-10 11:07

Pozostało 580 znaków

2015-02-10 11:13
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

Pozostało 580 znaków

2015-02-10 12:11
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);
    } 
}

Pozostało 580 znaków

2015-02-10 12:23
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

edytowany 2x, ostatnio: furious programming, 2015-02-10 21:27
Twój kod rysuje tylko górny bok oraz w nieskończoność wydłuża lewy i prawy. Inkrementacji powinno być poddane i. - jabluszko 2015-02-10 13:45
@setsudanhana - wstawiaj kod w znaczniki kolorujące składnię; - furious programming 2015-02-10 21:27

Pozostało 580 znaków

2015-02-10 12:28
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

edytowany 2x, ostatnio: FakeAccount, 2015-02-10 12:29

Pozostało 580 znaków

2015-02-10 12:32
0

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

Pozostało 580 znaków

2015-02-10 12:34
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

edytowany 1x, ostatnio: FakeAccount, 2015-02-10 12:37

Pozostało 580 znaków

2015-02-10 12:37
0

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

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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