Rafał Roppel

Rafał Roppel Software Architect

Temat: zabawa - pytania i zadania

Co zostanie wyswietlone po uruchomieniu ponizszego kawalka kodu?

char c = 'A';
int i = 1;
System.out.print(true ? c : 0);
System.out.print(false ? i : c);

konto usunięte

Temat: zabawa - pytania i zadania

A65, czyli nr autostrady, której w Polsce nigdy nie będzie;)
Rafał Roppel

Rafał Roppel Software Architect

Temat: zabawa - pytania i zadania

Hehe, prawda. Teraz Twoja kolej:)

konto usunięte

Temat: zabawa - pytania i zadania

jaki ciąg liczb zostanie wyświetlony przez poniższy kod? No i czemu (niech będzie jakiś element edukacyjny:)


byte b = -8;
for (byte count=0; count<5; count++, b=(byte) (b>>1)) {
System.out.print(b);
}


ps. poprawność odpowiedzi sprawdzę dopiero jutro. Szczęśliwego Nowego Roku i oby Java 7 spełniła wszystkie Wasze oczekiwania! :)

konto usunięte

Temat: zabawa - pytania i zadania

Wyswietli sie -8-4-2-1-1 zamiast -4-2-1-1-1, ponieważ:

dla instrukcji for(a;b;c)

a - wykonuje sie tylko raz na samym poczatku.
b - musi byc warunkiem boolean/Boolean, i sprawdzane jest na poczatku kazdej iteracji.
c - wykonuje sie na koncu kazdego przebiegu, stad pierwsze "b" bedzie jeszcze wyswietlone przed przesunieciem :)

Pozdrawiam i rownież życze Wszystkiego dobrego w Nowym Roku :))Karol Kornecki edytował(a) ten post dnia 31.12.09 o godzinie 18:56

konto usunięte

Temat: zabawa - pytania i zadania

Karol Kornecki:
Wyswietli sie -8-4-2-1-1 zamiast -4-2-1-1-1, ponieważ:
dla instrukcji for(a;b;c)

ha! nie wpadłem na to, że problem może być w forze - chodziło mi raczej o operacje bitowe i brak przejścia z -1 do 0. Ale nieważne. Odpowiedź tak czy inaczej dobra. Twoja kolej:)

konto usunięte

Temat: zabawa - pytania i zadania

To jest troszkę długie, ale bardzo mi się podoba to pytanko :))
A zatem, co się wyświetli?

class A
{
int i = 1;
public int print()
{
System.out.println(" z klasy A ");
return i;
}
}
public class B extends A
{
int i = 2;
public int print()
{
System.out.print(" z klasy B ");
return i;
} public static void main(String[] arg)
{
A a = new B();
System.out.println("i " + a.print()); }
}Karol Kornecki edytował(a) ten post dnia 01.01.10 o godzinie 14:28
Michał Miotk

Michał Miotk Senior Technical
Program Manager

Temat: zabawa - pytania i zadania

Jest to wariant znanej pułapki :-)
W tym wypadku odpowiedź brzmi:

i z klasy B 2

Każdy może sobie sam sprawdzić, jaka jest
poprawna odpowiedź, toteż znacznie ciekawsze
jest wyjaśnienie, dlaczego tak to właśnie działa.

Obiekt klasy B rozszerza klasę A i przy okazji
"przykrywa" metodę _print_.
Zatem pomimo rzutowania A a = new B(); tak na prawdę
wywołamy metodę print z obiektu typu B. Dodatkowo
klasa typu B posiada pole _i_ więc metoda _print_
odwoła się do pola z klasy B, stąd też wyświetlona
zostanie wartość 2 a nie 1, jak można było podejrzewać.
Maciej Kowalski

Maciej Kowalski programista Java EE

Temat: zabawa - pytania i zadania

>Jest to wariant znanej pułapki :-)
W tym wypadku odpowiedź brzmi:
i z klasy B 2
[ciach]

też wpadłem w pułapkę myślenia, że to wariant znanej pułapki :D. po uruchomieniu kodu okazało się, że zagadka jest znacznie ciekawsza!
Michał Miotk

Michał Miotk Senior Technical
Program Manager

Temat: zabawa - pytania i zadania

Ech... trzeba było jednak najpierw uruchomić :-P
Faktycznie początkowo byłem pewien, że to prostszy
wariant pułapki i przez to przeoczyłem ważny fakt.
Zagadka była podchwytliwa - gratulacje dla autora!
Wniosek jest taki, że Maciek rozwiązał zagadkę,
tylko musi jeszcze uzasadnić odpowiedź ;)
Maciej Kowalski

Maciej Kowalski programista Java EE

Temat: zabawa - pytania i zadania

poczekajmy na kogoś, kto będzie wiedział bez sprawdzania ;)
Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: zabawa - pytania i zadania

ja tu nic nie pisałem.. <gwiżdże niewinnie>Jerzy Mieczyński edytował(a) ten post dnia 05.01.10 o godzinie 00:32
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: zabawa - pytania i zadania

przepraszam, ale nie widzę tutaj żadnego podstępu ani potrzeby uruchamiania tego
1. najpierw opracowywanie parametrów
2. podstawowy w Javie polimorfizm
czyli
 z klasy B i 2

EDIT: żeby być ścisłym to 2. wywołanie metody wirtualnejZacheusz Siedlecki edytował(a) ten post dnia 06.01.10 o godzinie 11:33
Maciej Kowalski

Maciej Kowalski programista Java EE

Temat: zabawa - pytania i zadania

Zacheusz Siedlecki:
przepraszam, ale nie widzę tutaj żadnego podstępu ani potrzeby
uruchamiania tego

spoko, nie obraziliśmy się ;)
dajesz swoją zagadkę.
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: zabawa - pytania i zadania

Zgadnij co wypisze poniższy fragment kodu:

Set iSet = new HashSet();
Set fSet = new HashSet();
Set dSet = new HashSet();
int start = Integer.MAX_VALUE - 10;
int stop = Integer.MAX_VALUE;
for (int i = start; i < stop; ++i) {
iSet.add(i);
fSet.add((float)i);
dSet.add((double)i);
}
System.out.println(iSet.size());
System.out.println(fSet.size());
System.out.println(dSet.size());
Zacheusz Siedlecki edytował(a) ten post dnia 07.01.10 o godzinie 00:04

konto usunięte

Temat: zabawa - pytania i zadania

10
1
10
Bez odpalenia nie umiałem odpowiedziec dokłądnie, jakie są wyniki. Poprostu jest to dla człowieka nie możliwe. Dlaczego przy zbiorze typu float jest tylko 1 element?
Wynika to ze specyfiki tej reprezentacji IEEE754 - poprostu nie każda liczba całkowita ma dokładną reprezentację zmienoprzecinkową. Pierwszą taką liczbę całkowitą, jest zdaje się 16777217. Co można łatwo sprawdzic robiac tak:

float zmienna = 16777216.0f;
System.out.println(zmienna + 1.0f);
System.out.println(zmienna + 1.0f == zmienna);


Jaki bedzie wynik poniższego kodu, i dlaczego?

int count1 = 0;
for (float x = 0.0f; x < 20000000.0f; x = x + 1.0f)
count1++;
System.out.println(count1);

int count2 = 0;
for (double x = 0.0; x < 20000000.0; x = x + 1.0)
count2++;
System.out.println(count2);
Konrad K. edytował(a) ten post dnia 07.01.10 o godzinie 10:35
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: zabawa - pytania i zadania

Konrad K.:
10
1
10
Bez odpalenia nie umiałem odpowiedziec dokłądnie, jakie są wyniki. Poprostu jest to dla człowieka nie możliwe.
Jest to możliwe bez odpalania. Jeśli mniej więcej wiesz jaki jest rozkład floatów możesz strzelać, że trafiło w 1 do kilku floatów. Ale rzeczywiście można było zadać pytaie odrobinę inaczej. Mogłe ma dole dać:
System.out.println(iSet.size() == fSet.size());
Jaki bedzie wynik poniższego kodu, i dlaczego?
int count1 = 0;
for (float x = 0.0f; x < 20000000.0f; x = x + 1.0f)
count1++;
System.out.println(count1);

int count2 = 0;
for (double x = 0.0; x < 20000000.0; x = x + 1.0)
count2++;
System.out.println(count2);

Na oko to już pierwsza pętla się nie zakończy bo odległości między floatami będą znacznie większe niż 1 i w efekcie jak dojdzie do tego miejsca to licznik nie powiększy się. Przyczyna jest ta sama jak w moim zadaniu. (bez uruchamiania)

EDIT: wyrzuciłem code z quote bo się mieszałoZacheusz Siedlecki edytował(a) ten post dnia 07.01.10 o godzinie 15:22
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: zabawa - pytania i zadania

ktoś mnie sprawdzi ? ;)Zacheusz Siedlecki edytował(a) ten post dnia 07.01.10 o godzinie 15:14

konto usunięte

Temat: zabawa - pytania i zadania

dokładnie - ten sam myk - poprostu jak trafi w pierwsza liczbe float, która nie ma dokładnej reprezentacji i spełnia warunek
f + 1 == f 

czyli np. rzeczona 16777217 - to sie petla nie skonczy nigdy...
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: zabawa - pytania i zadania

Konrad K.:
dokładnie - ten sam myk - poprostu jak trafi w pierwsza liczbe float, która nie ma dokładnej reprezentacji i spełnia warunek
f + 1 == f 

czyli np. rzeczona 16777217 - to sie petla nie skonczy nigdy...
Czy Ty czasem poszukując wyjaśnienia nie trafiłeś na starego posta na moim blogu tutaj ?
No ok to następne zadanie. Jaki jest wynik wykonania takiego fragmentu:
public static void main(String a[]) throws MalformedURLException {
java.net.URL url1 = new java.net.URL("http://o2.pl");
java.net.URL url2 = new java.net.URL("http://tlen.pl");
System.out.println(url1.equals(url2));
}
liczy się precyzyjna odpowiedź ;)

Następna dyskusja:

rozmowa kwalifikacyjna _ za...




Wyślij zaproszenie do