Witam. Mam problem z zadankiem z załącznika. Moj program dziala ok, ale tylko dla niektorych liczb , a kod jest b.długi. Mógłby ktos podrzucic ideę, albo podpowiedz/rozwiazanie?:)
Moze pokaz kod, zeby mozna bylo ustalic i podpowiedziec jaki popelniasz blad? Wnioskuje ze zadanie do szkoly / na uczelnie, wiec wklejanie gotowego rozwiazania zrobi Ci wiecej zlego niz dobrego, mimo ze to 10 linijek kodu.
Co do podpowiedzi:
zadanie sa wstanie zalatwic dwie zagniezdzone petle z jednym if'em wewnatrz, ktory ustala kiedy rysowac "X", a kiedy " " + podzial na linie w zewnetrznej petli
Oto moj kod:
import java.util.Scanner;
public class Zadanie112 {
public static void main(String[] args) {
System.out.println("Podaj liczbę: ");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//Pierwsza linijka:
for(int i = 0 ; i < n ; i++){
System.out.print("X ");
}
System.out.print("\n");
//Linijki od drugiej do n/2:
for(int i = 0 ; i < (n-1)/2 ; i++){
System.out.print("X ");
for(int s = 0 ; s < i ; s++){
System.out.print(" ");
}
System.out.print("X ");
for(int s = n - 2*i - 4 ; s > 0 ; s--){
System.out.print(" ");
}
System.out.print("X ");
for(int s = 0 ; s < i ; s++){
System.out.print(" ");
}
System.out.print("X ");
System.out.print("\n");
}
//Linijki od n/2 do przedostatniej:
for(int i = 0 ; i < (n-1)/2 ; i++){
System.out.print("X ");
for(int s = (n-1)/2 - i - 1; s > 0 ; s--){
System.out.print(" ");
}
System.out.print("X ");
for(int s = 0 ; s < 2*i ; s++){
System.out.print(" ");
}
System.out.print("X ");
for(int s = (n-1)/2 - i - 1 ; s > 0 ; s--){
System.out.print(" ");
}
System.out.print("X ");
System.out.print("\n");
}
//Ostatnia linijka:
for(int i = 0 ; i < n ; i++){
System.out.print("X ");
}
}
}
Jak widac jest b.dlugi i malo czytelny. Tak, potrzebuje tego na uczelnie. Moze jeszcze jakies nakierowanie/podpowiedz?:P
Czy te dwie petle o ktorych mowisz odpowiadaja odpowiednio za X-y po ukosie z lewej do prawej, a drugi z lewej do prawej? Probowalem to zrobic w ten sposob, ale nie wychodzi nic ..:(
Dwie petle odpowiadaja za wyswietlenie kwadratu. Za to, gdzie znajda sie "X", odpowiada warunek wewnatrz tych petli.
Rozbiles wyswietlenie tego "kwadratu" na poszczegolne linie, gdzie niemal kazda obslugujesz osobno, a co z pewnoscia nie chodzilo w tym zdaniu. Wykladowca raczej chcial, zebys potrafil ulozyc algorytm, ktory to wygeneruje.
Sprobuje jeszcze troche to wyjasnic, a jesli nie poskutkuje, to w załączniku jest finalny kod, ale zalecam probowac samemu.
Na poczatek trzeba sobie rozlozyc problem na male elementy. Po wczytaniu rozmiaru kwadratu (dla uproszczenia w moich przykladach przypisuje go na sztywno w kodzie) chcesz go wyswietlic (na razie nie przejmujac sie tym, gdzie maja byc "X" a gdzie nie). Zakladam, ze cos takiego jest dla Ciebie jasne, gdyz w swoim kodzie masz swego rodzaju zagniezdzone petle:
public class Zadanie112
{
public static void main(String[] args)
{
int rozmiar = 10;
for (int i = 0; i < rozmiar; ++i)
{
for (int j = 0; j < rozmiar; ++j)
{
System.out.print("X ");
}
System.out.println();
}
}
}
Teraz kolejne czynnosci, to doprowadzenie, by w tym kodzie "X" wyswietlal sie tylko w tych miejscach, w ktorych wymaga tego zadanie.
W miejscu, gdzie instrukcja System.out.print("X "); wyswietla znak na ekranie, masz dostep do dwoch zmiennych, ktore informuja Ciebie o tym, ktore wspolrzedne kwadratu aktualnie bedziesz wyswietlal. Dla zobrazowania tego, wykonaj taki kod:
public class Zadanie112
{
public static void main(String[] args)
{
int rozmiar = 10;
for (int i = 0; i < rozmiar; ++i)
{
for (int j = 0; j < rozmiar; ++j)
{
System.out.printf("[%d,%d] ", i, j);
}
System.out.println();
}
}
}
Rezultat:
[0,0] [0,1] [0,2] [0,3] [0,4] [0,5] [0,6] [0,7] [0,8] [0,9]
[1,0] [1,1] [1,2] [1,3] [1,4] [1,5] [1,6] [1,7] [1,8] [1,9]
[2,0] [2,1] [2,2] [2,3] [2,4] [2,5] [2,6] [2,7] [2,8] [2,9]
[3,0] [3,1] [3,2] [3,3] [3,4] [3,5] [3,6] [3,7] [3,8] [3,9]
[4,0] [4,1] [4,2] [4,3] [4,4] [4,5] [4,6] [4,7] [4,8] [4,9]
[5,0] [5,1] [5,2] [5,3] [5,4] [5,5] [5,6] [5,7] [5,8] [5,9]
[6,0] [6,1] [6,2] [6,3] [6,4] [6,5] [6,6] [6,7] [6,8] [6,9]
[7,0] [7,1] [7,2] [7,3] [7,4] [7,5] [7,6] [7,7] [7,8] [7,9]
[8,0] [8,1] [8,2] [8,3] [8,4] [8,5] [8,6] [8,7] [8,8] [8,9]
[9,0] [9,1] [9,2] [9,3] [9,4] [9,5] [9,6] [9,7] [9,8] [9,9]
W ten sposob mozesz zobaczyc, jakie wartosci przyjmuja zmienne i,j w poszczegolnych komorkach kwadratu. Teraz aby osiagnac wymagany rezultat, nalezy od wartosci tych zmiennych uzaleznic, czy wyswietlasz "X", czy spacje.
Np. aby wyswietlic lewa pionowa linie, nalezy "X" umieszczac wtedy, gdy j==0
Np. aby wyswietlic prawa pionowa linie, nalezy "X" umieszczac wtedy, gdy w tym konkretnym wypadku j==9. Poniewaz rozmiar tablicy nie jest Ci znany w momencie tworzenia kodu, musisz to zrobic inaczej. W tym zadaniu nalezy to porownywac ze zmienna przechowujaca rozmiar ( w tym przypadku 10), wiec porownanie bedzie wygladalo tak: j+1==rozmiar
Wiec aby narysowac tylko te dwie pionowe linie, wewnatrz petli umiescisz taki kod:
if (j==0 || j+1 == rozmiar)
System.out.print("X ");
else
System.out.print(" ");
Rozgryziesz pozostale linie?
PS. Weselej sie zrobi, jak kolejne zadanie bedzie wymagalo zrobienia tego samego bez uzycia petli ;) Ilosc linii podobna, ale kod juz troche mnie czytelny i nigdy do konca nie zrozumiem, czego to uczy :)
Tak, dzieki Tobie dalem juz sobie rade i wszystko dziala jak nalezy:) Bardzo dziekuje za fachowa pomoc, naprawde mi sie to przydalo:)