JAVA predavanje 5

java_thumbRačunanje vsote vrst

Primer 4: Metoda, ki vrača vrednost


Naloga: Predelati prejšnjo metodo v tako obliko, da bo vračala vrednost.

2 spremembi:
  • v glavi metode moramo namesto rezervirane besede void navesti ime tipa (s tem povemo, kakšnega tipa je vrednost, ki jo metoda vrača)
  • stavek return: s stavkom return določimo vrednost, ki jo metoda vrne.

Splošna oblika:

return <izraz>;        //izraz določa vrednost, ki jo metoda vrne


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Primer4{
public static double poEnemLetu (double glavnica, double obrMera){
double novoStanje = glavnica + glavnica * obrMera / 100;
return novoStanje;

//namesto gornjih dveh stavkov lahko imamo samo
//return glavnica + glavnica * obrMera / 100;
}

public static void main(String[] args){
//metode, ki vračajo vrednost kličemo znotraj izraza
//klic metode, ki vrača vrednost ni samostojen stavek,
//ampak le del izraza

double novoStanje = poEnemLetu(1000, 3.5);
System.out.println(novoStanje);

System.out.println(poEnemLetu(100000, 3.9);
System.out.println("Po enem letu dobite " + poEnemLetu(10000, 3.9) + "EUR");
}
}

 



Vrstni red metod ni pomemben.


Primeri programov, ki uporabljajo metode iskanja popolnih (perfektnih) števil.

Napišite program, ki izpiše vsa popolna števila z intervala od 1 do nMax.

Popolno število – vsota vseh pravih deliteljev tega števila mora biti to število.


Npr.

28=1+2+4+7+14
6=1+2+3

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PopolnaStevila{
public static void main(String[] args){
System.out.print("vrednost nMax: ");
int nMax = BranjePodatkov.preberiInt();
for (int n = 1; n <= nMax; n++){
if(jePerfektno(n))
System.out.println(n);
}
}
public static boolean jePerfektno(int n){
int vsota = 0;
for (int d = 1; d <= n/2; d++){
if(n % d == 0) vsota += d;
}
return vsota == n;
}
}

 

Računanje vsote številskih vrst


vsote

Vsoto računamo v zanki

clen = 1;
vsota = 1;
n = 0;
while (dokler je velikost člena večja od predpisane natančnosti (Abs – absolutno)){
n++;
izračunaj naslednji člen
vsota += naslednji člen
}

 



Računanje naslednjega člena

Naslednji člen izračunamo iz prejšnjega.



Prejšnji člen moramo pomnožiti z x in deliti z n.

 

racunanje_naslednjega_clena

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MatFunkcije{
private static double eps = 1e – 5; //0,00001

public static double exp(double x){
double vsota = 1;
double clen = 1;
int n = 0;
while(Math.abs(clen) > eps){
n++;
clen = clen * x / n;
vsota += clen
}
return vsota;
}
public static double sinus(double x){
double vsota = x;
double clen = x;
int n = 1;
while(Math.abs(clen) > eps){
n += 2;
clen = -clen * x * x / ((n – 1) * n);
vsota += clen;
}
return vsota;
}
public static void nastaviEps(double novEps){
eps = novEps;
}
}



Predpostavka: imamo uporabnika, ki bo v svojem programu uporabil našo metodo sinus. Narediti hoče tabelo sinusov za vrednosti 30°, 60°, ..., 360°)

1
2
3
4
5
6
7
8
9
10
public class TabelaSinus{
public static void main(String[] args){
System.out.println("Kot: Sinus: ");
System.out.println(»-----------------------------»); // podčrtano
for(int kot = 0; kot <= 360; kot += 30){
System.out.printf("%3d %7.4f%n", kot, MatFunkcije.sinus(Math.PI / 180 * kot));
// %n -> skok v novo vrsto
}
}
}

 

Rekurzija

  • Metoda kliče samo sebe
  • Rekurzija je učinkovito orodje za reševanje problemov, ki so po svoji naravi rekurzivni
  • Računanje Fibonaccijevih števil prvega reda (vsako naslednje fibonaccijevo število je vsota prejšnjih dveh.).


f0 = 0, f1 = 1
fn = fn-2 + fn-1 (n>1)

public static int fib(int n){
if(n <= 1)
return n;
else
return fib(n-1) + fib(n-2)
}


Rešitev z rekurzijo v tem primeru ni učinkovita, ker sproži preveč klicev. Učinkovita rešitev je rešitev z interacijo.

Kadarkoli obstaja preprosta interativna rešitev se odločimo za interacijo.

Z rekurzijo rešujemo le tiste probleme, pri katerih je interativna rešitev zapletena.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Fibonacci{
public static int fib(int n){
if(n <= 1)
return n;
else
return fib(n-1) + fib(n-2);
}

public static int fibIte(int n){
int x = 1, y = 0 // zadnje in predzadnje fibonaccijevo število

// ostala fibonaccijeva števila računamo v zanki
for(int i = 2; i <= n; i++){
int z = x;
x = x + y;
y = z
}
return x;
}

public static void main(String[] args){
System.out.print("Vrednost n: ");
int n = BranjePodatkov.preberiInt();
System.out.println("rekurzivno: " + fib(n) + "%n interativno: " + fibIte(n));
}
}

 

RAZREDI in OBJEKTI


OOP – object oriented programming – programske komponente so objekti, ki so podobni objektom iz realnega sveta.

Razred – vsi objekti istega tipa tvorijo nek razred.
Objekt – konkreten primerek nekega razreda


Objekt vsebuje atribute in metode

  • atributi opisujejo lastnosti objekta in stanje objekta
  • metode predstavljajo operacije, ki jih objekt lahko izvede



Razred opisuje zgradbo objektov, zato vsebuje:

  • deklaracijo atributov
  • deklaracijo metod
  • deklaracijo konstruktorjev


Skrivanje detajlov, ki so povezani z realizacijo -> Objekt se obnaša, kot črna škatla -> enkapsulacija -> uporabnik ne vidi, kako je realizacija izvedena.

{jgototop}{/jgototop}

Vsi vodiči so na voljo BREZPLAČNO!
Pišite mi

Želite mnenje ali pomoč pri vašem projektu?

Pišite mi in bom pomagal, kakor bom v tistem trenutku lahko.