» »

[Java] Kako filtrirati, katera števila lahko vpišeš?

[Java] Kako filtrirati, katera števila lahko vpišeš?

c0dehunter ::

Recimo, delček kode:

System.out.println("Vpisi oceno:");
ocena=vhod.nextInt();


Kako filtrirat input, da lahko vneseš samo števila od 1 do 5, v nasprotnem primeru pa te opozori, da nisi vnesel veljavno število in moraš vnesti število še enkrat.

Razmišljal sem, da bi s try-catch, ampak to bi samo ugotovilo napako, ne bi pa dalo še ene možnosti uporabniku, da bi lahko vnesel pravo število...
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Matek ::

int ocena = 0;
while(ocena < 1 || ocena > 5)
{
ocena = vhod.nextInt();
}
Bolje ispasti glup nego iz aviona.

c0dehunter ::

Hvala Matek, preprosta in učinkovita rešitev :)

Ne vem kako da jaz nisem prišel na to idejo :8)
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

c0dehunter ::

Pjebi, še en problem :D

System.out.println("Vpisi oceno:");
ocena=vhod.nextInt();
while(ocena < 1 || ocena > 5){
System.out.println("Stevilo, ki si ga vpisal, ni ocena!");
ocena=vhod.nextInt();
}


Tole sicer deluje, ampak, če vneseš najprej npr. 12, nato pa 1, pravi da ni ocena :\
Isto če naprimer prvič vneseš 10, pa spet še enkrat 10, pa potem vneseš 3, pravi da ni ocena.
Če pa daš najprej 10, pa nato 2, ali 3, ali 4, pa deluje.

Problem delajo le 1 in 5.... Pa več zaporednih napačnih vnosov... Potem ti izpisuje "Stevilo, ki si ga vpisal, ni ocena!" v nedogled.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Zgodovina sprememb…

overlord_tm ::

	public static void preberiOceno() {
		Scanner sc = new Scanner(System.in);

		int ocena = 0;
		do {
			System.out.println("Vpisi oceno:");
			ocena = sc.nextInt();
			System.out.println("Vpisali ste " + ocena);
		} while (ocena > 0 && ocena < 6);

		System.out.println("Vpisali ste napacno oceno!");
		
		A.preberiOceno();
	}

	public static void preberiOceno2() {
		
		Scanner sc = new Scanner(System.in);
		int ocena = 0;
		
		while(true) {
			System.out.println("Vpisi oceno:");
			ocena = sc.nextInt();
			if(ocena > 0 && ocena < 6) {
				System.out.println("Vpisali ste oceno " + ocena);
			} else {
				System.out.println("Nekaj je narobe z oceno!");
			}
		}		
	}

c0dehunter ::

Hvala, overlord_tm za pomoč, ampak jaz moram vnesti ne eno oceno, ampak 5 ocen. Če bi šel tole kodo rinit zraven not pri vsaki oceni, bo toliko vsega .... A ni kaj krajšega?


P.s.: kakšen tag je treba uporabit da ti tako lepo izpiše kodo na forumu? [code] ?
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

overlord_tm ::

S-T markup ;)

	public static void vnesi5() {
		
		Scanner sc = new Scanner(System.in);
		int ocena = 0;

		int[] ocene = new int[5];
		
		for(int i = 0; i < 5; i++) {
			System.out.println("Vpisi oceno:");
			ocena = sc.nextInt();
			if(ocena > 0 && ocena < 6) {
				System.out.println("Vpisali ste oceno " + ocena);
				ocene[i] = ocena;
			} else {
				System.out.println("Nekaj je narobe z oceno!");
				i--;
			}
		}

		System.out.println("Vpisali ste 5 ocen");

		for(int i = 0; i < ocene.length; i++) {
			System.out.println(ocene[i]);
		}

	}

	public static void vnesi5b() {
		
		Scanner sc = new Scanner(System.in);
		int ocena = 0;

		Vector<Integer> ocene = new Vector<Integer>();
		
		while(ocene.size() < 5) {
			System.out.println("Vpisi oceno:");
			ocena = sc.nextInt();
			if(ocena > 0 && ocena < 6) {
				System.out.println("Vpisali ste oceno " + ocena);
				ocene.add(ocena);
			} else {
				System.out.println("Nekaj je narobe z oceno!");
			}

		}

		for(int i = 0; i < ocene.size(); i++) {
			System.out.println(ocene.get(i));
		}
	}

Matek ::

Malenkost komplicirate, se mi zdi.

int[] ocene = new int[5];
for(int i = 0; i < 5; i++){
    while(ocene[i] < 1 || ocene[i] > 5){
        ocene[i] = vhod.nextInt();
        if(ocene[i] < 1 || ocene[i] > 5)
	    System.out.println("Ocena ni veljavna.");
    } 
}
Bolje ispasti glup nego iz aviona.

c0dehunter ::

Hvala obema! Sem skombiniral vsakega nekaj, da sedaj deluje optimalno glede na moj program.

Še nekaj me zanima..
Funkcija Math.round() vedno zaokroži število navzdol. V primeru 1,5 bo zaokrožlo na 1. Js bi pa rad da v tem primeru zaokroži navzgor. Kaj bi mogu naredit?
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

overlord_tm ::

Hvala obema! Sem skombiniral vsakega nekaj, da sedaj deluje optimalno glede na moj program.

Še nekaj me zanima..
Funkcija Math.round() vedno zaokroži število navzdol. V primeru 1,5 bo zaokrožlo na 1. Js bi pa rad da v tem primeru zaokroži navzgor. Kaj bi mogu naredit?


Hmmm, round bi moral kar ima decimalni del vecji od .5 navzgor zaokrozit. Si prepričan da ne castaš kje števila prej. Ker če imaš recimo 1,5 in narediš cast v int tip, potem samo odbije decimalna mesta stran ;)

Drugače si pa poglej še Math.floor in Math.ceil

Genetic ::

Ce Math.round(double value) zayokrozi navzdol, potem k value pristej 0.5: int rounded = Math.round(value + 0.5);

c0dehunter ::

Ups, neki sem zamuštral. Ja, 1.5 zaokroži na 2, indeed.

Primer:
int zakljuceno=Math.round(((ocena1+ocena2)/2)+0.05);


Tale zgornji primer pa ne gre, pravi da bi morala biti spremenljivka "zakljuceno" tipa long (Possible loss of precision).
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

overlord_tm ::

Glede zaokrozevanja. Če hočeš da ti Math.round vrne int, moraš podati long. Če podaš double ti vrne long. Nekako tako je pomoje.

Glede tega da narobe zaokrožuje, pomoje je problem v tem da sta oceni skorajda sigurno tipa int.

Recimo double k = 9/2 // vrne 4.0
medtem ko double k = 9.0/2.0 // vrne 4.5

Tako da ti dobiš že napačno povprečno oceno v round funkcijo ;)

Tak da edina stvar ki mi pade na pamet je da oceni najprej spremenis v double.

int z = (int)Math.round(((double)(a+b))/2);


PS: Kak strucko zna razlozit razliko v obnasanju med double in Double v javi? (primitiven tip vs razred)

Zgodovina sprememb…

Bojevnik ::

Vseh razlik ne poznam, vem da primitivni ne morejo biti null.

nevone ::

PS: Kak strucko zna razlozit razliko v obnasanju med double in Double v javi? (primitiven tip vs razred)

Nisem ravno stručko, ampak razlika je pomoje samo v tem, da Double ima modernejšo formo, kot že ime pove da je mali double pa pač primitiven.
Double je pač šel v korak s časom in se je pridružil vsem ostalim Velikim v razredu. Mali double pa bo počasi potonil v pozabo, vendar ga bomo vseeno ohranili v lepem spominu. :)

o+ nevone
Either we will eat the Space or Space will eat us.

Quikee ::

Nekih razlik med double in Double ni saj je Double "wrapper" za double. Tak kot je Bojevnik rekel je Double lahko null, ker je za razliko od double objekt. Java drugače sama poskrbi, da Double spreminja v double in nazaj ko je potrebno (auto-boxing). Včasih zna bit ravno zaradi tega problem, ko naletiš na situacijo v kateri to ne zna (recimo: assertEquals(1L, metodaKiVracaLong() )).

Kar se pa zaokroževanja tiče ne vem točno kako zaokrožuje pri *.5 ampak pri BigDecimal imaš možnost izbrat kakšno obnašanje bi rad pri zaokroževanju *.5 vrednosti. Recimo sode *.5 zaokroži navzgor ; lihe navzdol, pozitivne *.5 ; negativne navzdol,...

overlord_tm ::

Ma zanimal me je ker sem opazil da če napišeš
double a = 5/2;

se zadeva prevede, medtem ko
Double a = 5/2;

pa vrže ven error da so nekompaktibilni tipi (int in double).

Ampak kul, to je ze offtopic ...

Quikee ::

Ma zanimal me je ker sem opazil da če napišeš
double a = 5/2;

se zadeva prevede, medtem ko
Double a = 5/2;

pa vrže ven error da so nekompaktibilni tipi (int in double).

Ampak kul, to je ze offtopic ...


Noja.. to je čudno saj int implicitno prevede v double, kar pa "močno" tipiziran jezik, kot je Java, ne bi smel dovolit.

fiction ::

Ma zanimal me je ker sem opazil da če napišeš
double a = 5/2;

se zadeva prevede, medtem ko

Double a = 5/2;

pa vrže ven error da so nekompaktibilni tipi (int in double).

Ampak kul, to je ze offtopic ...

Stevilcna konstanta je v Javi po defaultu int. V prvem primeru se zato izvede celostevilcno deljenje
med 5 in 2, kar je enako 2. Ta int se potem pretvori v double in shrani v spremenljivko a.
Int se vedno lahko implicitno pretvori v double, ker s tem ni nobene izgube natancnosti, problem je
ker si ti na zacetku racunal z int-om namesto z double-om. Ce hoces iz vecjega tipa pretvoriti v manjsega
rabis ekspliciten typecast.

Ce hoces, da bo v a 2.5 moras najmanj enega od operandov "castati" v stevilo s plavajoco vejico.
Recimo (double)5 / 2 ali 5/2f ali pa 5.0/2, medtem ko (double)(5/2) ni kul, saj se to itak zgodi implicitno.

Double a = 5/2;

Prvi problem tukaj je, da autoboxing dela samo v Javi 2 5.0 oz. novejsih verzijah.
Pa tudi sicer autoboxing samo pretvori primitiven tip v pripadajoc objekt (double v Double), ne zgodi
se pa tukaj impliciten typecast iz int v double.
Zato recimo tudi:

Long l = 5;

ne deluje. 5 je int in bi se lahko pretvoril samo v Integer. Ce pa napises:

Long l = 5l;

je pa ok.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java] Problem s Scanner-jem

Oddelek: Programiranje
92273 (2067) Zlatan
»

BMI kalkulator

Oddelek: Programiranje
91035 (861) jype
»

Java - dva problema

Oddelek: Programiranje
141637 (1245) nightrage
»

Java problem

Oddelek: Programiranje
201505 (1203) infiniteLoop
»

[Java] Liha potenca

Oddelek: Programiranje
81745 (1639) bijonda

Več podobnih tem