Kurs Java Podstawy - rozszerzony

Rozwiązanie 1.13

Tutaj zadanie było nieco bardziej skomplikowane. Należało pobrać od użytkownika liczbę elementów i na tej podstawie utworzyć tablicę. Można oczywiście zapisać to w krótszej formie, ale chciałem, aby wszystko było dobrze widoczne. Przy wyświetlaniu danych na ekran należało pamiętać, aby zwiększać indeks licznika, ponieważ w innym wypadku zapętlilibyśmy się.

import java.util.Scanner;

public class Tablice{
  public static void main(String[] args){
	  int[] tablica;
	  Scanner odczyt = new Scanner(System.in);

	  System.out.println("Podaj ilość elementów: ");
	  int liczbaElementow = odczyt.nextInt();
	  tablica = new int[liczbaElementow];

	  for(int i=0; i<tablica.length; i++)
              tablica[i] = i+1;

          int licznik=0;
          while(licznik<tablica.length){
              System.out.print(tablica[licznik]+" ")
              licznik++;
          }
  }
}

Komentarze

Łukasz

witam. co do tego rozwiązania to mam zastrzeżenie. W poleceniu jest napisane aby wyświetlić zawartość za pomocą pętli while... tu zaś jest for...

Slawek

niestety ucięło przykład, w pętli for wypełniamy tablicę, wyświetlamy ją w pętli while. Już poprawione.
Dzięki za zwrócenie uwagi.

Michał

while(licznik<tablica.length){
System.out.print(tablica[i]+" ")
licznik++;
}

tutaj chyba błąd jest, klasa nie skompiluje się bo zmienna [i] jest deklarowana w for-ach i tylko tam istnieje

Slawek

Oczywiście masz rację.
W razie jakichś błędów piszcie śmiało, bo przykłady w większości piszę z palca bez sprawdzania i widać co z tego wychodzi ;)

Davis00

System.out.print(tablica[i]+" ")
nie jest zakończone średnikiem

Michał

Dzięki za szybką odpowiedź i poprawkę ;)
Rozumiem, że w razie czego można zawracać dupę jak się coś nie chce kompilować, albo się czegoś nie ogarnia ? :P

Slawek

jasne ;) najlepiej w komentarzach, bo powiadomki o komentarzach dostaję na swojego maila, a tego kontaktowego sprawdzam tylko od czasu do czasu.

kunich

ten program sie nie wyswietla od 1 tylko od 0.
według mnie powinno być tak:

import java.util.Scanner;

public class Tablice{
public static void main(String[] args){
int[] tablica;
Scanner odczyt = new Scanner(System.in);

System.out.print("Podaj ilosc elementow: ");
int liczbaElementow = odczyt.nextInt();
tablica = new int[liczbaElementow];
int a=1;
for(int i=0; i<tablica.length; i++)
tablica[i] = a++;

int licznik=0;
while(licznik<tablica.length){
System.out.print(tablica[licznik]+" ");
licznik++;
}
}
}

Slawek

faktycznie rozwiązanie jakby nie od tego zadania mi tu wyskoczyło ;)
W swoim rozwiązaniu możesz zrezygnować ze zmiennej a i zapisać w pierwszej pętli:
tablica[i] = i+1;

kunich

faktycznie. dopiero zaczynam z java

Mateusz

A ja zrozumiałem, że mam wypełnić tablicę i wyświetlić elementy przy użyciu pętli while i zrobiłem tak:
import java.util.Scanner;

public class Zadanie13{
public static void main(String[] args){
Scanner odczyt = new Scanner(System.in);
System.out.println("\nZ ilu elementow ma sie skladac tablica?");
int n = odczyt.nextInt();
int[] tablica = new int[n];
int i=0;
while(i<n){
tablica[i] = i+1;
System.out.println("\nElement tablicy z indexem "+i+" ma wartosc: "+tablica[i]);
i++;}
}
}
Działa, ale czy taki zapis jest poprawny?

Natalii

Programowanie ma to do siebie, ze dany problem mozna rozwiazac na kilka sposobow. Praktycznie tyle ile jest ludzi tyle moze byc rozwiazan (grunt zeby dzialalo).

Andrzej

Witam:) moze glupia prośba ale mogłby ktoś przyblizyc dokladnie działanie .lenght??:) chyba ze pojawiło sie wczesniej ale nie znalazlem:(

Slawek

http://javastart.pl/podstawy-jezyka/tablice-wielowymiarowe/

Janosch

W skrócie mówiąc .length zwraca długość np.

dla zmiennej: String zmienna = "To jest zmienna tekstowa"
wyrażenie zmienna.length() zwróci Ci wartość 24 bo tyle jest znaków łącznie ze spacjami.

dla zmiennej tablicowej: int[] tablica = new int[n]
wyrażenie tablica.lenght zwróci Ci wartość "n", czyli długość tablicy, tyle ile jest w niej elementów.
Mam nadzieję, że trochę Ci się wyjaśniło :)

mike

Zrobilem troche inaczej ale wg mnie lepiej wyglada i uzywa tylko 1 petli.

import java.util.Scanner;
public class Tablice{
public static void main(String[] args){
int i = 0;
int n = 0;
Scanner od = new Scanner(System.in);
System.out.print("Podaj rozmiar tab: ");
i = od.nextInt();
int[] tab = new int[i];
while(i>0){
i--;
tab[i] = ++n;
System.out.print(tab[i]+" ");
}
}
}

monika

System.out.print(tablica[licznik]+" ")

Brakuje ;

System.out.print(tablica[licznik]+" ");

kamil2321

Moja rada, jeśli ktoś ma windowsa 7 to lepiej nie dawać znaków takich jak Monika dała bo cmd nie odczyta i wywali błąd bo będzie myślał że jest to litera L taka dziwna ;f

System.out.print(tablica[licznik]+" ");

Lepiej dawać nie ukośne cudzysłowy lecz takie jakie widzicie u mnie.

kamil2321

Moja rada, jeśli ktoś ma windowsa 7 to lepiej niech sobie zamieni ręcznie te cudzysłowy jak ktoś będzie kopiować zawartości z komentarzy, bo w win 7 w cmd nie odczyta znaków cudzysłowa jak w przykładzie Moniki jest.

System.out.print(tablica[licznik]+" ");

pawel91

a czemu użyto ".length" jeżeli jest to omówione w następnej lekcji?

Sławek Ludwiczak

żeby przedstawić czytelnikowi dodatkową wersję rozwiązania, sprawić, że zatrzyma się przy kodzie przynajmniej na chwilę i zapamięta dobry nawyk od samego początku.

Pozdrawiam :)

przemek91

Użyłem tylko jednej pętli (while) i wszystko działa jak należy, chciałbym tylko wiedzieć czy określanie tabeli za pomocą for jeżeli można użyć while jest niezbędne ?

Krzysztof

Mem problem z ostatnim fragmentem rozwiązania, mianowicie:

int licznik=0;
while(licznik<tablica.length){
System.out.print(tablica[licznik]+" ")
licznik++;
}

Rozumiem to w następujący sposób: Zmienna licznik ma wartość 0, jeżeli licznik jest mniejszy od długości tablicy to wyświetl "tablica[licznik]" (nie rozumiem, dlaczego ta zmienna jest w kwadratowym nawiasie, w ogóle tego fragmentu nie kapuję) + spacja (" "), na końcu inkrementuj aż do końca długości tablicy.

Sławek Ludwiczak

Kwadratowy nawias pozwala odwołać się do wartości z tablicy o indeksie=licznik
Spacja na końcu jest dodana dla czytelności (wywoływana jest metoda print, nie println)
Inkrementacja jest potrzebna, żeby wyświetlać kolejne elekenty tablicy.

Misio

Mam małe pytanie, napisałem taki oto kawałek kodu:

import java.util.*;

public class Tablice2 {

public static void main(String[] args){

System.out.println("Podaj liczbe imion: ");
Scanner readNumber = new Scanner(System.in);
int number = readNumber.nextInt();
// readNumber.close(); <<<<<<<<<<<<<============== !!!
String [] tab = new String[number];
Scanner readName = new Scanner(System.in);

for(int i=0; i<tab.length; i++){

System.out.println("Podaj "+(i+1)+" imię: ");
tab[i] = readName.nextLine();
}
readName.close();

int a=0;
while (a<tab.length){
System.out.println("Imie: "+tab[a]);
a++;
}

}
}

Dlaczego jeżeli w tym miejscu (tutaj gdzie jest zakomentowane) uzyje metody readNumber.close() to w pętli ten kod się wysypuje? Skoro tam korzystam z całkiem innego inputa? Z tego wynika, że wszystkie dane, które odbiera się od użytkownika zawsze trzeba domykac na samym końcu gdy już nie będziemy odbierać żadnych innych? Bo w przypadku gdy readNumber.close() umieszcze już po za pętlą for to wszystko jest ok.

Misio

Ma być nie po za pętlą for tylko pod pętlą for :P

michał._.

Scanner input = new Scanner(System.in);
System.out.println("do ilu policzyć? :");
int liczba = input.nextInt();
int[] liczby = new int[liczba+1];
int i=1;
while(i<=liczba){
liczby[i] = i;
System.out.println(liczby[i]);
i++;

i mam to samo tylko o 2 linijki mniej :)

adrian.*

import java.util.Scanner;public class proje{public static void main(String[]args){
int n=0;int x=0;System.out.println("Podaj liczbę");Scanner o=new Scanner(System.in);
n=o.nextInt();int[]tab=new int[n];while(x<n){tab[x]=x+1;x++;}x=0;while(x<n){System
.out.println(tab[x]);x++;}}}

to można z while w 3,5 linijki upchać, to nic że trochę nieprzejrzyście :D

Janosch

No trochę nieprzejrzyjście, ale co tam, każdy dobry programista od razu zauważy o co chodzi w programie ;P

kixub

Iteracje też można zagnieżdżać jakby ktoś chciał oszczędzić linijek :)

int n,i = 0;
Scanner czytaj=new Scanner(System.in);
System.out.println("Podaj wymiar tablicy: ");
n=czytaj.nextInt();
int[] tab=new int[n];
while (n-->0)
tab[n]=n+1;
while (i<tab.length)
System.out.print(tab[i++]+" ");

Janosch

Dobrze wiedzieć, a czy w takim przypadku iteracja nie nastąpi przed pierwszym wykonaniem pętli?

kixub

Iteracja przed pierwszym wykonaniem wyglądałaby tak: ++i

M.in tym różni się od zapisu i++

Janosch

Dobra sam sobie odpowiem, może innym się przyda :)

while(++licznik<tablica.lenght){...} - inkrementacja nastąpi przed sprawdzeniem zmiennej licznik
while(licznik++<tablica.lenght){...} - inkrementacja nastąpi po sprawdzeniu zmiennej licznik.

Niby nic, ale może komuś rozjaśnić :)

Rands

No ja zrobiłem to tak. Czy używanie, zamiast metody tablica.LENGTH, jakiejś utworzonej do tego celu zmiennej (u mnie to "n"), która jednoznacznie wskazuję ile elementów ma dana tablica jest czymś złym lub niewłaściwym?

import java.util.Scanner;
public class Tablica
{
public static void main(String[] args)
{
Scanner wpisz = new Scanner(System.in);
System.out.println("Ile elementowa tablicę utworzyć ?");
int n = wpisz.nextInt();

int tablica[] = new int[n];

System.out.println("Twoja tablica zostanie wypełniona liczbami od 1 do "+n);

for(int i=0; i<n; i++)
{
tablica[i]=i+1;
}

int x=0;
while(x<n)
{
System.out.println(tablica[x]+". element tablicy to: "+tablica[x]);
x++;
}
}
}

Patryk

ja zrobiłem bardzo podobnie, wydaje mi się jadnek ze użycie tablica.length jest bardziej "pro" podejściem
Oto mój przykład:

int n;

Scanner odczyt = new Scanner(System.in);
System.out.println("Podaj liczbę: ");
n = odczyt.nextInt();
int[] tablica = new int[n];
int i = 0;
while(i != n){
tablica[i] = i+1;
i++;
}
int j = 0;
while(j<n){
System.out.println("Elemnt: " + tablica[j]);
j++;
}


}

}

pawel

czy taki zapis tego zadanie jest poprawny :
import java.util.Scanner;
public class powtorka_tablic {
public static void main(String []args){
Scanner n = new Scanner(System.in);
System.out.println("podaj liczbe");
int [] b = new int[n.nextInt()];
int c=0;
for (int i=0 ; i<b.length ;i++)
while (c<b.length){
System.out.println("liczenie :"+b[i]+c++);
}
}
}

// tu tez pytanko - co za roznica czy w "System.out.println("liczenie :"+b[i]+c++); " b[] wpisze "i" czy "c"
zwraca to samo?
skoro nie ma roznicy to mozna by to zapisac tak
Scanner n = new Scanner(System.in);
System.out.println("podaj liczbe");
int [] b = new int[n.nextInt()];
for (int i=0 ; i<b.length ;i++)
while (i<b.length){
System.out.println("liczenie :"+b[i]+i++);
i jest ok ale pojawia sie problem jak chce zrobic

Scanner n = new Scanner(System.in);
System.out.println("podaj liczbe");
int [] b = new int[n.nextInt()];
for (int i=0 ; i<=b.length ;i++)
while (i<=b.length){
System.out.println("liczenie :"+b[i]+i++);
i tu juz tego nie rozumiem

k2marko

Ależ się nagłowiłem. Najważniejsza rzecz której się przy okazji nauczyłem to (i++)!=(i+1) :D

Janosch

Moje rozwiązanie zadania 1.13 na forum, niżej link
http://forum.javastart.pl/Thread-Tablice-jednowymiarowe?pid=990#pid990

Janosch

A poniżej rozwiązanie zadania 1.12, link do forum poniżej
http://forum.javastart.pl/Thread-Tablice-jednowymiarowe?pid=990#pid990