Skip to content

Instantly share code, notes, and snippets.

@jakubkulhan
Created October 29, 2012 13:02
Show Gist options
  • Select an option

  • Save jakubkulhan/3973408 to your computer and use it in GitHub Desktop.

Select an option

Save jakubkulhan/3973408 to your computer and use it in GitHub Desktop.
loadPositiveInt() má zkoušet načítat číslo, dokud se nepodaří načíst kladné číslo. Čistší řešení?
/*
* loadPositiveInt() má zkoušet načítat číslo, dokud se nepodaří načíst kladné číslo.
*
* Takže pro následující kód:
*
* System.out.println("Zadejte kladné celé číslo:");
* int n = loadPositiveInt();
* System.out.println("Zadali jste: " + n);
*
* může komunikace s programem vypadat následovně:
*
* Zadejte kladné celé číslo:
* x
* Není kladné celé číslo! Zkuste zadat znovu.
* 3.4
* Není kladné celé číslo! Zkuste zadat znovu.
* -5
* Není kladné celé číslo! Zkuste zadat znovu.
* 0
* Není kladné celé číslo! Zkuste zadat znovu.
* 42
* Zadali jste: 42
*
* Jaká verze loadPositiveInt() vám přijde čistší? A proč?
*/
import java.util.Scanner;
public class StdinLoader {
private static Scanner sc = new Scanner(System.in);
// + cyklus s podmínkou
// - přiřazování do proměnné v podmínce cyklu
// - využívání líného vyhodnocování logických operátorů k řízení toku programu
public static int loadPositiveIntV1() {
boolean isInt;
int n;
while (!(isInt = sc.hasNextInt()) || (n = sc.nextInt()) <= 0) {
if (!isInt) {
sc.next();
}
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
return n;
}
// + jednoduché podmínky
// - přiřazování do proměnné v podmínce
// - for (;;)
public static int loadPositiveIntV2() {
int n;
for (;;) {
if (!sc.hasNextInt()) {
sc.next();
} else if ((n = sc.nextInt()) > 0) {
return n;
}
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
}
// https://twitter.com/dmajda/status/262916725283102720
// + tok programu
// - duplikace vypisování chybové hlášky
// - for (;;)
public static int loadPositiveIntV3() {
int n;
for (;;) {
if (!sc.hasNextInt()) {
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
sc.next();
continue;
}
n = sc.nextInt();
if (n <= 0) {
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
continue;
}
return n;
}
}
// V3 bez duplikace vypisování chybové hlášky
// + tok programu
// - do { ... } while (false) + break
// - for (;;)
public static int loadPositiveIntV4() {
int n;
for (;;) {
do {
if (!sc.hasNextInt()) {
sc.next();
break;
}
n = sc.nextInt();
if (n <= 0) {
break;
}
return n;
} while (false);
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
}
// V3 bez duplikace vypisování chybové hlášky
// + tok programu
// - boolean proměnná určující vypisování chybové hlášky
// - přiřazení do shouldPrintErrorMessage v iteraci for cyklu
// - vypisování chybové hlášky na začátku cyklu
// - for (;;)
public static int loadPositiveIntV5() {
boolean shouldPrintErrorMessage = false;
int n;
for (;; shouldPrintErrorMessage = true) {
if (shouldPrintErrorMessage) {
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
if (!sc.hasNextInt()) {
sc.next();
continue;
}
n = sc.nextInt();
if (n <= 0) {
continue;
}
return n;
}
}
// ukecanější V2
// + jednoduché podmínky
// - for (;;)
public static int loadPositiveIntV2_2() {
int n;
for (;;) {
if (!sc.hasNextInt()) {
sc.next();
} else {
n = sc.nextInt();
if (n > 0) {
return n;
}
}
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
}
// ukecanější V5
// + jasný tok programu
// - boolean proměnná určující vypisování chybové hlášky
// - přiřazení do shouldPrintErrorMessage v každé podmínce pro continue
// - vypisování chybové hlášky na začátku cyklu
// - for (;;)
public static int loadPositiveIntV5_2() {
boolean shouldPrintErrorMessage = false;
int n;
for (;;) {
if (shouldPrintErrorMessage) {
System.out.println("Není kladné celé číslo! Zkuste zadat znovu.");
}
if (!sc.hasNextInt()) {
shouldPrintErrorMessage = true;
sc.next();
continue;
}
n = sc.nextInt();
if (n <= 0) {
shouldPrintErrorMessage = true;
continue;
}
return n;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment