Gyakorlati alapok

Ömlesztett számok összege

 

A probléma a Bekért számok összege című fejezetben már részletesen ismertetésre került. Ebben a fejezetben az alapalgoritmust bontjuk szét külső, önállóan működő metódusokra. Ehhez 2 db (+1) metódust kell definiálnunk:

Először ismétlésképpen tanulmányozzuk át az alapalgoritmust:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int szam = 0;
        int osszeg = 0;
        do {
            System.out.print("Adjon meg egy számot vagy kérje az összeget 0-val!\n");
            String szamString = in.nextLine();
            szam = Integer.parseInt(szamString);
            osszeg += szam;
        } while (szam != 0);
    System.out. println("Az összeg: " + osszeg);
    }
}

 

Végeredmény:

Adjon meg egy számot vagy kérje az összeget 0-val!
4
Adjon meg egy számot vagy kérje az összeget 0-val!
5
Adjon meg egy számot vagy kérje az összeget 0-val!
6
Adjon meg egy számot vagy kérje az összeget 0-val!
0
Az összeg: 15

 

Az implementáció legnagyobb problémája, hogy nem tudjuk előre a felhasználó által bevitt bemeneti adatok (itt int típusú számok) előzetes mennyiségét. Ezt csak úgy tudjuk (korlátozottan) kivédeni, hogy nagy méretű tömböt foglalunk le, ez azonban nem valami elegáns megoldás, illetve potenciálisan magában hordozza a mérettúllépés veszélyét. Az optimális megoldás már rég elérhető a Java-nyelvben, ez a dinamikusan változó tömbök lehetősége. Erről már részletesen írtam a Tömblista című fejezetben. Ezt a csodafegyvert fogjuk tehát most bevetni.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Ismétlésképpen: a tömblista behozhatatlan előnye, hogy nem szükséges előzetesen méretével foglalkoznunk, azt a JVM igénytől függően automatikusan és dinamikusan bővíti.

 

A tömblista típusos használatához a következő deklarációk pontos, égi kinyilatkoztatása szükséges:

 

import java.util.ArrayList;
...

ArrayList<Integer> tomblista = new ArrayList<Integer>();
...

 

Egyúttal bekérési függvényünk (static ArrayList<Integer> bekeres()) szintén ilyen típust ad vissza, összegző függvényünk pedig (static int osszegzes(ArrayList<Integer> tomblista)) ilyen típust vesz át. A tömblista használata során 3 beépített függvényére is hivatkoztunk:

Nézzük meg a végeredményt:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.Scanner;
import java.util.ArrayList;

public class Main {

static ArrayList<Integer> bekeres(){
    Scanner in = new Scanner(System.in);
    int szam = 0;
    ArrayList<Integer> tomblista = new ArrayList<Integer>();
    do{
        System.out.print("Adjon meg egy számot vagy kérje az összeget 0-val!\n");
        String szamString = in.nextLine();
        szam = Integer.parseInt(szamString);
        tomblista.add(szam);
    }while (szam != 0);
    return tomblista;
}

static int osszegzes(ArrayList<Integer> tomblista){
    int eredmeny = 0;
    for (int i = 0; i < tomblista.size(); i++) {
        eredmeny += tomblista.get(i);
    }
    return eredmeny;
}

public static void main(String[] args) {
    ArrayList<Integer> tomblista = new ArrayList<Integer>();
    tomblista = bekeres();
    int eredmeny = osszegzes(tomblista);
    System.out. println("Az eredmény: " + eredmeny);
    }
}

 

Végeredmény:

Adjon meg egy számot vagy kérje az összeget 0-val!
1
Adjon meg egy számot vagy kérje az összeget 0-val!
2
Adjon meg egy számot vagy kérje az összeget 0-val!
3
Adjon meg egy számot vagy kérje az összeget 0-val!
4
Adjon meg egy számot vagy kérje az összeget 0-val!
5
Adjon meg egy számot vagy kérje az összeget 0-val!
6
Adjon meg egy számot vagy kérje az összeget 0-val!
0
Az eredmény: 21

 

Az osszegzes() függvényben "hagyományos" for ciklust használtunk, hiszen a size() metódus segítségével be tudtuk állítani helyes működését:

 

static int osszegzes(ArrayList<Integer> tomblista){
    int eredmeny = 0;
    for (int i = 0; i < tomblista.size(); i++) {
        eredmeny += tomblista.get(i);
    }
    return eredmeny;
}
 

Természetesen lehetőségünk van egyszerűsített fejlécű for ciklus használatára is, amely csak az objektum nevét és típusát tartalmazza:

 

static int osszegzes(ArrayList<Integer> tomblista){
    int eredmeny = 0;
    for (Integer szam : tomblista) {
        eredmeny += szam;
    }
    return eredmeny;
}

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.Scanner;
import java.util.ArrayList;

public class Main {

static ArrayList<Integer> bekeres(){
    Scanner in = new Scanner(System.in);
    int szam = 0;
    ArrayList<Integer> tomblista = new ArrayList<Integer>();
    do{
        System.out.print("Adjon meg egy számot vagy kérje az összeget 0-val!\n");
        String szamString = in.nextLine();
        szam = Integer.parseInt(szamString);
        tomblista.add(szam);
    }while (szam != 0);
    return tomblista;
}
 

static int osszegzes(ArrayList<Integer> tomblista){
    int eredmeny = 0;
    for (Integer szam : tomblista) {
        eredmeny += szam;
    }
    return eredmeny;
}


public static void main(String[] args) {
    ArrayList<Integer> tomblista = new ArrayList<Integer>();
    tomblista = bekeres();
    int eredmeny = osszegzes(tomblista);
    System.out. println("Az eredmény: " + eredmeny);
    }
}

 

Végeredmény:

Adjon meg egy számot vagy kérje az összeget 0-val!
1
Adjon meg egy számot vagy kérje az összeget 0-val!
2
Adjon meg egy számot vagy kérje az összeget 0-val!
3
Adjon meg egy számot vagy kérje az összeget 0-val!
4
Adjon meg egy számot vagy kérje az összeget 0-val!
5
Adjon meg egy számot vagy kérje az összeget 0-val!
6
Adjon meg egy számot vagy kérje az összeget 0-val!
0
Az eredmény: 21

 

A magasabb szintű programozás-technikai szemlélet azt is megengedi, hogy a külső metódus ne csak a main() függvényen belül helyezkedjen el, hanem egy másik metódusban. Erre egyébként már láttunk példákat a Számolgatógép fejszámolós teljesítménymérővel című fejezetben. Az összegző metódust akkor most pakoljuk be a bekérő metódusba, de nem lesz elegánsabb megoldás az előzőnél, sőt: kissé visszalépés a szemlélet fejlettségében. Éppen ezért az alábbi futtatható  Java-kód csak szemléltetésül lett beillesztve:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.Scanner;
import java.util.ArrayList;

public class Main {

static int bekeres(){
    Scanner in = new Scanner(System.in);
    int szam = 0;
    int eredmeny = 0;
    ArrayList<Integer> tomblista = new ArrayList<Integer>();
    do{
        System.out.print("Adjon meg egy számot vagy kérje az összeget 0-val!\n");
        String szamString = in.nextLine();
        szam = Integer.parseInt(szamString);
        tomblista.add(szam);
    }while (szam != 0);
    eredmeny = osszegzes(tomblista);
    return eredmeny;
}

static int osszegzes(ArrayList<Integer> tomblista){
    int eredmeny = 0;
    for (int i = 0; i < tomblista.size(); i++) {
        eredmeny += tomblista.get(i);
    }
    return eredmeny;
}

public static void main(String[] args) {
    int eredmeny = bekeres();
    System.out. println("Az eredmény: " + eredmeny);
    }
}

 

Végeredmény:

Adjon meg egy számot vagy kérje az összeget 0-val!
5
Adjon meg egy számot vagy kérje az összeget 0-val!
10
Adjon meg egy számot vagy kérje az összeget 0-val!
10
Adjon meg egy számot vagy kérje az összeget 0-val!
20
Adjon meg egy számot vagy kérje az összeget 0-val!
0
Az eredmény: 45