Created
October 29, 2012 13:02
-
-
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í?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * 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