background image

© 2013 dr inż. Jerzy R. Jaworowski, Instytut Teleinformatyki, Politechnika Krakowska im. Tadeusza Kościuszki 

Praca domowa 08 – calc 

 

Termin zwrotu : 04 czerwca godz. 23.00 

Zadanie uznaje się za zaliczone, gdy praca oceniona zostanie na co najmniej 6 pkt. 

 

Dany  jest  zbiór  liczb  naturalnych  P  =  {1,  2,  3.,  ….,  n-1,  n}.    Rozważmy  wszystkie  n-elementowe  permutacje  utworzone  z  elementów 

zbioru P. Wszystkich możliwych permutacji jest n! 

 
Załóżmy, że permutacje  zbioru P zachowują porządek leksykograficzny, tj. kolejne permutacje tworzone są  wg zasady, iż w pierwszej 

kolejności  dokonujemy  wymiany  elementów  na  prawym  końcu  ciągu,  posuwając  się  w  miarę  tworzenia  kolejnych  od  prawej  do  lewej,  czyli 
przykładowo dla n = 4 uporządkowany leksykograficznie ciąg permutacji wyglądać będzie następująco : 

 
P

1

={1, 2, 3, 4} P

2

={1, 2, 4, 3} P

3

={1, 3, 2, 4} P

4

={1, 3, 4, 2} P

5

={1, 4, 2, 3} P

6

={1, 4, 3, 2} P

7

={2, 1, 3, 4 } ………. P

24

={4, 3, 2, 1} 

 

 

Niech P

k

 oznacza k-tą permutację w porządku leksykograficznym określonym jak wyżej (czyli 1 <= k <= n!). 

 
 

W  tekstowym  pliku  wejściowym  <input_file>  zapisany  jest  w  formacie  swobodnym  ciąg  kolejnych  liczb  całkowitych 

stanowiących pewną permutację, a więc przykładowo: 

 

 

7 4 2 5 1 6 3 

 
Dla podanej permutacji P

k

 należy znaleźć permutację ‘odwrotną’ P

o

 a następnie wyznaczyć (obliczyć) różnicę indeksów k-o, gdzie k oraz 

o  określają  ich  położenie  w  porządku  leksykograficznym.  Algorytm  rozwiązania  NIE  MOŻE  korzystać  z  mechanizmu  opartego  na  obliczaniu 
kolejnych permutacji w porządku leksykograficznym w celu znalezienia indeksu k. 

 
Przykładowo dla n = 4 niech badaną permutacją będzie {1,4,3,2}. Wtedy k = 6. Permutacja ‘odwrotna’ ma postać {2,3,4,1}, czyli o = 10. 

Wynikiem działania programu jest zatem wartość -4. 

 
Program ma być zapisany wyłącznie w dwóch plikach :  

Calc.java

 zawierającym implementację mechanizmu wyznaczania indeksu k, 

oraz 

Main.java

 – zawierającym programem główny. Program nie może korzystać z jakichkolwiek bibliotek zewnętrznych.. 

 
Proces kompilacji musi być możliwy z użyciem komendy 

 

javac –Xlint Calc.java Main.java 

 
 

Uruchomienie programu winno być możliwe z użyciem komendy  

background image

© 2013 dr inż. Jerzy R. Jaworowski, Instytut Teleinformatyki, Politechnika Krakowska im. Tadeusza Kościuszki 

 

java Main <input_file>  

 
 

Wynik  końcowy  (w  strumieniu  wyjściowym  nie  powinny  pojawiać  się  jakiekolwiek  inne  elementy  –  np.  wydruki  kontrolne)  działania 

programu  musi zawierać pojedynczą liczbę określającą wartość poszukiwanego indeksu, a więc np. 
 

Indeks : 31 
 

Wymagania : 
 

•  Klasa implementująca problem winna zostać zdefiniowana w pliku

 Calc.java

 

•  Klasa implementująca mechanizm program główny (metoda main) winny być zdefiniowane w pliku  

Main.java

 

•  W  pliku  README.pdf  winien  być  zawarty  szczegółowy  opis  organizacji  struktur  danych  oraz  szczegółowy  opis  zastosowanego 

algorytmu. 

•  Proces  obliczenia  rozwiązania  winien  się  kończyć  w  czasie  nie  przekraczającym  2  min  (orientacyjnie  dla  typowego  notebooka).  Po 

przekroczeniu  limitu  czasu  zadanie  będzie  przerywane,  i  traktowane  podobnie  jak  w  sytuacji  błędów  wykonania  (czyli  nie  podlega 
dalszej ocenie). 

 
Sposób oceny :      
 

•  1 pkt – Kompilacja : każdy z plików winien być kompilowany bez jakichkolwiek błędów lub ostrzeżeń (w sposób omówiony wyżej) 
•  1 pkt – Wykonanie : program powinien wykonywać się bez jakichkolwiek błędów i ostrzeżeń (dla pliku danych wejściowych zgodnych 

z wyżej zamieszczoną specyfikacją) z wykorzystaniem omówionych wyżej parametrów linii komend 

•  2  pkt  –  README  :  plik  README.pdf  dokumentuje  w  sposób  kompletny  i  właściwy  struktury  danych,  oraz  opis  przyjętej  koncepcji 

algorytmu całkowania z wykorzystaniem techniki Monte Carlo 

•  1  pkt  –  Komentarze  wewnętrzne  :    czy  program  jest  skomentowany  w  sposób  zapewniający  zrozumienie  jego  działania,  oraz 

wyjaśniający warunki, które muszą zachodzić przed i po wykonaniu każdej z funkcji. 

•  1  pkt  –  Styl  kodowania  :  czy  funkcji  i  zmienne  posiadają  samo-wyjaśniające  nazwy  ?  Czy  podział  na  funkcje  ułatwia  czytelność  i 

zrozumiałość kodu ? Czy funkcje eliminują (redukują) powtarzające się bloki kodu ?  Czy wcięcia, odstępy, wykorzystanie nawiasów itp. 
(formatowanie kodu) są spójne i sensowne ?  

•  4  pkt  –  Poprawność  algorytmu  :  czy  algorytm  został  zaimplementowany  poprawnie  a  wynik  odpowiada  prawidłowej  (określonej 

zbiorem danych testowej) wartości.