Laboratorium Podstaw Programowania
Laboratorium VI
Uwagi Wstępne
Poniżej znajdują się trzy zadania. Za każde można otrzymać do 10 pkt. Zwróć uwagę, aby Twój kod był czytelny
(np. aby nazwy zmiennych odzwierciedlały do czego służą). Uważnie czytaj treść zadań. W razie konieczności dopytaj
prowadzącego.
Zadanie 1
Celem tego zadania jest napisanie programu sprawdzającego, czy z danych trzech odcinków da się zbudować trójkąt.
Napisz funkcję, która przyjmuje trzy parametry wejściowe oraz zwraca wartość typu prawda/fałsz. Parametry wejściowe
oznaczają długości trzech odcinków (dobierz odpowiednie typy zmiennych). Wartość zwracana powinna odpowiadać na
pytanie, czy da się danych trzech odcinków zbudować trójkąt.
Wskazówka: Trójkąt da się zbudować z takich trzech odcinków, dla których długość każdego z nich nie jest większa niż
suma długości pozostałych.
Zadanie 2
Celem tego zadania jest napisanie programu analizującego dane giełdowe.
W pliku gielda.csv dostępnym na eportalu znajdują się dane giełdowe dotyczące spółki Apple. W kolejnych kolumnach
pliku można znaleźć datę, kurs maksymalny danego dnia. Zadanie polega na napisaniu funkcji przyjmującej kolekcję
zmiennych odpowiedniego typu i zwracającej indeks dnia, w którym najbardziej opłacało się kupić akcje. Przez opłacalność
rozumiemy różnicę pomiędzy kwotą zakupu a maksymalną ceną akcji w późniejszym terminie (po dniu zakupu). Skorzystaj
z poniższego szablonu dla swojej klasy (zauważ, że wczytywanie danych z pliku jest już napisane).
W funkcji main należy użyć napisanej funkcji i wypisać dzień (datę), w którym opłacało się kupić akcje.
Przykład
Dla następującego zbioru danych:
2011-11-28,372.35
2011-11-25,368.42
2011-11-23,374.51
2011-11-22,371.02
2011-11-21,370.00
2011-11-18,378.92
najbardziej opłacalnym terminem zakupu akcji jest 2011-11-21, gdyż różnica pomiędzy ceną akcji wtedy a maksylmalnym
kursem po tym dniu wynosi 4, 51 zł.
Wskazówka
Zwróć uwagę, iż dane w pliku są wpisane w odwrotnej kolejności niż możesz oczekiwać. W rozwiązaniu tego problemu
może pomóc odpowiedni sposób ładowania danych do listy. Aby dodać jakąś daną na pozycję zerową (przed wszystkie
poprzednie) należy skorzystać z lista.add(0, element).
Listing 1: Szablon rozwiązania zadania 2
i m p o r t j a v a . u t i l . L i s t ;
i m p o r t j a v a . u t i l . A r r a y L i s t ;
i m p o r t j a v a . i o . B u f f e r e d R e a d e r ;
i m p o r t j a v a . i o . F i l e R e a d e r ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a . u t i l . S t r i n g T o k e n i z e r ;
c l a s s A n a l i z a t o r G i e l d o w y
{
p u b l i c
s t a t i c v o i d main ( S t r i n g [ ]
a r g s )
{
Politechnika Wrocławska
Mateusz Lis
Strona 1 z ??
Laboratorium Podstaw Programowania
Laboratorium VI
L i s t < S t r i n g > daty = new A r r a y L i s t < S t r i n g
> ( ) ; // daty
L i s t < Double > k u r s y = new A r r a y L i s t < Double > ( ) ; // ceny a k c j i o d p o w i a d a j a c e datom
t r y
{
B u f f e r e d R e a d e r w e j s c i e = new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( ” g i e l d a . c s v ” ) ) ;
S t r i n g
l i n i a ; // dana l i n i a z p l i k u
w h i l e ( ( l i n i a = w e j s c i e . r e a d L i n e ( ) ) != n u l l )
{
S t r i n g T o k e n i z e r t o k e n = new S t r i n g T o k e n i z e r ( l i n i a , ” , ” ) ; // d z i e l i m y
l i n i e po p r z e c i n k a c h
S t r i n g d a t a =
t o k e n . nextToken ( ) ; // uzyskujemy d a t e
Double c e n a A k c j i = Double . p a r s e D o u b l e ( t o k e n . nextToken ( ) ) ; // o r a z c e n e a k c j i
// System . o u t . p r i n t l n ( d a t a + c e n a A k c j i ) ;
// w y p i s z na e k r a n
daty . add ( 0 , d a t a ) ;
k u r s y . add ( 0 , c e n a A k c j i ) ;
// t u t a j n a l e z y d o p i s a c w s t a w i a n i e danych do k o l e k c j i
}
}
c a t c h ( I O E x c e p t i o n e )
{
e . p r i n t S t a c k T r a c e ( ) ;
}
System . o ut . p r i n t l n ( daty . g e t ( z n a j d z ( k u r s y
) ) ) ;
}
p u b l i c
s t a t i c
i n t z n a j d z ( L i s t < Double > c o l l
)
{
A r r a y L i s t < Double > maks = new A r r a y L i s t < Double > ( ) ;
f o r ( i n t
i = 0 ;
i < c o l l . s i z e ( )
;
i++ )
{
maks . add ( ( znajdzMaks ( c o l l ,
i
) ) − c o l l . g e t ( i ) ) ;
}
i n t i n d e x = 0 ;
f o r ( i n t
i = 0 ;
i < c o l l . s i z e ( )
;
i++ )
{
i f
( maks . g e t ( i ) > maks . g e t ( i n d e x ) )
{
i n d e x = i ;
}
}
r e t u r n i n d e x ;
}
p u b l i c
s t a t i c Double znajdzMaks ( L i s t <Double> c o l l ,
i n t
s t a r t )
{
Double maks = c o l l . g e t ( s t a r t ) ;
f o r ( i n t
i = s t a r t ;
i < c o l l . s i z e ( ) ;
i++ )
{
i f
(
c o l l . g e t ( i ) > maks ) maks = c o l l . g e t ( i ) ;
}
r e t u r n maks ;
}
}
Zadanie 3
Celem tego zadania jest implementacja programu obsługi kont bankowych.
Na listingu na końcu tego zadania znajduje się implementacja klasy konto. Konto umożliwia następujące operacje:
Politechnika Wrocławska
Mateusz Lis
Strona 2 z ??
Laboratorium Podstaw Programowania
Laboratorium VI
• wpłacanie pieniędzy,
• wypłacanie pieniędzy,
• udostępnianie stanu konta,
• udostępnianie numeru konta.
Napisz dwie klasy dziedziczące po klasie Konto:
Klasa KontoOszczedzaj
Klasa KontoOszczedzaj powinna dziedziczyć po klasie abstrakcyjnej Konto. Dodatkowe funkcjonalności klasy:
• konto oszczędnościowe ma oprocentowanie, które powinno zostać przyjęte jako argument konstruktora,
• metoda aktualizuj dla konta oszczędnościowego kapitalizuje odsetki do konta, doliczając oprocentowanie do aktual-
nego stanu (możesz pominąć podatek „Belki”). Doliczanie odsetek powinno odbywać się wg następującego wzoru:
S
n+1
= S
n
+ S
n
· k
(1)
gdzie:
– S
n+1
to nowy stan konta,
– S
n
to poprzedni stan konta,
– k to wartość oprocentowania (k ∈ [0, 1]).
Klasa ROR
Klasa ROR (rachunek rozliczeniowo-oszczędnościowy). Dodatkowe funkcjonalności:
• ROR powinien mieć pole minimalnyStan (wartość określana w konstruktorze, po przekroczeniu którego, klient otrzy-
muje informację zwrotną,
• metoda aktualizuj klasy ROR powinna wyświetlać na ekranie powiadomienie, jeśli przekroczony został minimalny
stan.
Klasa Bank
Ostatnim krokiem realizacji zadania jest implementacja klasy Bank. Klasa powinna zawierać kolekcję Kont. Napisz dwie
metody:
• ZalozKonto() przyjmującą obiekt klasy konto i dodającą dane konto do banku.
• aktualizujKonta(), która dla każdego z dostępnych kont wywoła metodę aktualizuj() oraz wypisze stan każdego
z kont.
Na końcu w metodzie main() stwórz obiekt klasy Bank oraz dodaj kilka kont danego rodzaju (na konta powinny zostać
wpłacone i wypłacone jakieś kwoty). Wywołaj metodę aktualizujKonta().
Listing 2: Klasa Konto
p u b l i c a b s t r a c t
c l a s s Konto
{
p r o t e c t e d d o u b l e s t a n ;
// Aktualny s t a n konta
p r o t e c t e d i n t numerKonta ;
p u b l i c Konto ( i n t numerKonta )
{
s t a n = 0 . 0 ;
t h i s . numerKonta = numerKonta ;
}
Politechnika Wrocławska
Mateusz Lis
Strona 3 z ??
Laboratorium Podstaw Programowania
Laboratorium VI
p u b l i c v o i d wplac ( d o u b l e kwota )
{
i f
( kwota > 0 )
s t a n += kwota ;
e l s e
System . o ut . p r i n t l n ( ” Nie mozna w p l a c i c
t a k i e j kwoty ” ) ;
}
p u b l i c v o i d wyplac ( d o u b l e kwota )
{
i f
( kwota > 0 )
s t a n −= kwota ;
// s t a n moze byc ujemny !
e l s e
System . o ut . p r i n t l n ( ” Nie mozna w y p l a c i c t a k i e j kwoty ” ) ;
}
p u b l i c d o u b l e d a j S t a n ( )
{
r e t u r n s t a n ;
}
p u b l i c d o u b l e dajNumerKonta ( )
{
r e t u r n numerKonta ;
}
p u b l i c a b s t r a c t v o i d a k t u a l i z u j ( ) ;
}
Politechnika Wrocławska
Mateusz Lis
Strona 4 z ??