JavaRush /Java Blog /Random-IT /Ramificazione in Giava

Ramificazione in Giava

Pubblicato nel gruppo Random-IT
In questo articolo esamineremo il concetto di ramificazione nei programmi per computer in generale e in quelli scritti in Java. Parliamo di strutture di controllo come:
  • if-then(O if)
  • if-then-else(O if-else)
  • switch-case
Ramificazione in Java - 1

Ramificazione

Partiamo dai concetti base. Qualsiasi programma è un insieme di comandi eseguiti da un computer. Molto spesso i comandi vengono eseguiti in sequenza, uno dopo l'altro. Un po' meno spesso (ma comunque abbastanza spesso) si verificano situazioni in cui è necessario modificare il flusso sequenziale dei comandi del programma. A volte, a seconda di determinate condizioni, potrebbe essere necessario eseguire un blocco di comandi invece di un altro. E quando queste condizioni cambiano, fai il contrario. Ad esempio, esistono numerosi siti la cui visita è vietata ai minori di 18 anni. Di solito, quando visita una risorsa di questo tipo per la prima volta, l'utente viene accolto da un modulo in cui viene avvisato del limite di età e gli viene chiesto di inserire la sua data di nascita. Quindi, a seconda dei dati inseriti dall'utente, gli sarà consentito o meno di inserire la risorsa. Questa funzionalità è fornita da ciò che viene comunemente chiamato branching. Facciamo un'altra analogia. Immaginiamoci all'incrocio di sette strade. Siamo di fronte a una scelta: girare a sinistra o a destra, oppure andare dritto. La nostra scelta si basa su determinate condizioni. Inoltre non abbiamo la possibilità di percorrere più strade contemporaneamente. Quelli. a seconda di alcune condizioni, dovremo scegliere una strada. Lo stesso principio vale per la ramificazione. Proviamo ora a dare una definizione di ramificazione. La ramificazione è una costruzione algoritmica in cui, a seconda della verità di alcune condizioni, viene eseguita una delle numerose sequenze di azioni. La ramificazione è implementata (molto probabilmente) in tutti i linguaggi di programmazione. Il linguaggio di programmazione Java dispone di diversi cosiddetti costrutti di controllo che consentono di implementare ramificazioni nel programma. Ci sono 3 costruzioni di questo tipo nel linguaggio di programmazione:
  • Operatoreif-then
  • Operatoreif-then-else
  • Operatore ternario? :
In questo articolo esamineremo gli operatori if-elsee switch-case.

se poi

Operatore if-theno semplicemente ifforse l'operatore più comune. L'espressione "sì, scrivi 1 se" è già diventata popolare. L'operatore ifha la seguente struttura:
if (bool_condition) {
	statement
}
In questo disegno:
  • bool_conditionè un'espressione booleana che restituisce vero o falso. Questa espressione è chiamata condizione.
  • statement— un comando (potrebbero essercene più di uno) che deve essere eseguito se la condizione è vera ( bool_statement==true)
Questa costruzione può essere letta in questo modo:

Если (bool_condition), то {statement}
Ecco alcuni esempi:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
In questo programma all'utente viene chiesto di inserire la percentuale di carica della batteria del proprio smartphone. Se rimane meno del 10% della carica, il programma avviserà l'utente della necessità di caricare lo smartphone. Questo è un esempio del design più semplice if. Vale la pena notare che se la variabile "a" è maggiore o uguale a 10, non accadrà nulla. Il programma continuerà a eseguire il codice che segue il file if. Si noti inoltre che in questo caso il costrutto ifha solo una sequenza di azioni da eseguire: stampare il testo o non fare nulla. Questa è una variante della ramificazione con un “ramo”. Questo a volte è necessario. Ad esempio, quando vogliamo proteggerci da valori errati. Ad esempio, non possiamo scoprire il numero di lettere in una stringa se la stringa è null. Esempi di seguito:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    }
}
Come risultato dell'esecuzione del metodo main, sulla console verrà visualizzato quanto segue:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Grazie a questo controllo string != nullsiamo riusciti ad evitare errori nel programma. E non fare nulla nei casi in cui la variabile stringera uguale a null.

se-allora-altro

Se, in condizioni normali, ifil programma ha una scelta: "fare qualcosa o non fare nulla", allora quando if-elsesi sceglie un programma si tratta di "fare una cosa o un'altra". L'opzione "non fare nulla" scompare. Esistono due o più varianti di esecuzione (o numero di diramazioni) con questo tipo di diramazione. Consideriamo il caso in cui ci sono due opzioni. Allora la struttura di controllo ha la seguente forma:
if (bool_condition) {
	statement1
} else {
	statement2
}
Qui:
  • bool_statementè un'espressione booleana che restituisce vero o falso. Questa espressione è chiamata condizione.
  • statement1— un comando (potrebbero essercene più di uno) che deve essere eseguito se la condizione è vera ( bool_statement==true)
  • statement2— un comando (potrebbero essercene più di uno) che deve essere eseguito se la condizione è falsa ( bool_statement==false)
Questa costruzione può essere letta in questo modo:

Если (bool_condition), то {statement1}
Иначе {statement2}
Ecco un esempio:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    } else {
        System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
    }
}
Lo stesso esempio relativo al livello della batteria su uno smartphone. Solo se l'ultima volta il programma avvisava solo della necessità di caricare lo smartphone, questa volta abbiamo una notifica aggiuntiva. Diamo un'occhiata a questo if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Se a < 10vero (livello della batteria inferiore a 10), il programma stamperà un testo. Altrimenti, se la condizione a < 10non è soddisfatta, il programma produrrà un testo completamente diverso. Finalizziamo anche il nostro secondo esempio, in cui abbiamo visualizzato il numero di lettere in una riga. L'ultima volta il programma non ha prodotto nulla se la stringa passata era uguale a null. Risolviamo questo problema trasformando quello normale ifin if-else:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    } else {
        System.out.println("Ошибка! Переданная строка равна null!");
    }
}
Nel metodo abbiamo aggiunto un blocco printStringSizealla costruzione . Ora, se eseguiamo il programma, verranno inviate alla console non 2 righe, ma 4, sebbene l'input (metodo ) rimanga lo stesso dell'ultima volta. Il testo che il programma produrrà: ifelsemain

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Le situazioni sono accettabili quando elsesono seguite non da comandi di esecuzione, ma da un altro if. Allora la costruzione assume la seguente forma:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
Questo disegno ha diverse condizioni:
  • bool_condizione1
  • bool_condizione2
  • bool_condizioneN
Il numero di tali condizioni non è limitato. Ogni condizione ha i suoi comandi:
  • dichiarazione1
  • dichiarazione2
  • dichiarazione N
Ognuno statementpuò contenere 1 o più righe di codice. Le condizioni vengono verificate una per una. Una volta determinata la prima condizione vera, verranno eseguiti una serie di comandi “legati” alla condizione vera. Dopo aver eseguito questi comandi il programma uscirà dal blocco if, anche se ci fossero più controlli da fare. L'espressione “istruzioneN+1” verrà eseguita se nessuna delle condizioni sopra definite è vera. Questa costruzione può essere letta in questo modo:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
L'ultima riga in questo caso è facoltativa. Puoi fare a meno dell'ultimo solitario else. E poi il design assumerà la seguente forma:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
E si leggerà così:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Di conseguenza, se nessuna delle condizioni è vera, non verrà eseguito un singolo comando. Passiamo agli esempi. Torniamo alla situazione con il livello di carica sullo smartphone. Scriviamo un programma che informerà il proprietario in modo più dettagliato sul livello di carica del suo dispositivo:
public static void main(String[] args) {
    String alert5 = "Я скоро отключусь, но помни меня бодрым";
    String alert10 = "Я так скучаю по напряжению в моих жилах";
    String alert20 = "Пора вспоминать, где лежит зарядка";
    String alert30 = "Псс, пришло время экономить";
    String alert50 = "Хм, больше половины израсходовали";
    String alert75 = "Всё в порядке, заряда больше половины";
    String alert100 = "Я готов к приключениям, если что..";
    String illegalValue = "Такс, кто-то ввел некорректное meaning";

    Scanner scanner = new Scanner(System.in);
    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a <= 0 || a > 100) {
        System.out.println(illegalValue);
    } else if (a < 5) {
        System.out.println(alert5);
    } else if (a < 10) {
        System.out.println(alert10);
    } else if (a < 20) {
        System.out.println(alert20);
    } else if (a < 30) {
        System.out.println(alert30);
    } else if (a < 50) {
        System.out.println(alert50);
    } else if (a < 75) {
        System.out.println(alert75);
    } else if (a <= 100) {
        System.out.println(alert100);
    }
}
Ad esempio, in questo caso, se l'utente inserisce 15, il programma visualizzerà sullo schermo: "È ora di ricordare dov'è il caricabatterie". Nonostante 15 sia inferiore e 30 e 50 e 75 e 100, l'output sullo schermo sarà solo 1. Scriviamo un'altra applicazione che stamperà sulla console quale giorno della settimana è:
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    if (dayOfWeek == DayOfWeek.SUNDAY) {
        System.out.println("Сегодня воскресенье");
    } else if (dayOfWeek == DayOfWeek.MONDAY) {
        System.out.println("Сегодня понедельник");
    } else if (dayOfWeek == DayOfWeek.TUESDAY) {
        System.out.println("Сегодня вторник");
    } else if (dayOfWeek == DayOfWeek.WEDNESDAY) {
        System.out.println("Сегодня среда");
    } else if (dayOfWeek == DayOfWeek.THURSDAY) {
        System.out.println("Сегодня четверг");
    } else if (dayOfWeek == DayOfWeek.FRIDAY) {
        System.out.println("Сегодня пятница");
    } else if (dayOfWeek == DayOfWeek.SATURDAY) {
        System.out.println("Сегодня суббота");
    }
}
È comodo, ovviamente, ma l’abbondanza di testo monotono abbaglia un po’ gli occhi. Nelle situazioni in cui abbiamo un gran numero di opzioni, è meglio utilizzare l'operatore, di cui parleremo di seguito.

scatola dell'interruttore

Un'alternativa al grassetto ifcon molti rami è l'operatore switch-case. Questo operatore sembra dire “Quindi, abbiamo questa variabile. Guarda, se il suo valore è uguale a "x", allora facciamo questo e quello, se il suo valore è uguale a "y", allora lo facciamo diversamente, e se non è uguale a nessuno dei precedenti, facciamo semplicemente è così... ” Questo operatore ha la seguente struttura.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
Diamo un'occhiata a questa struttura in modo più dettagliato. argument è una variabile il cui valore confronteremo con ipotetiche diverse opzioni. La variabile deve essere final. Vale anche la pena dire che l'operatore switchnon supporta alcun tipo di dati come argomento. I tipi validi sono elencati di seguito:
  • byte e byte
  • breve e corto
  • int e intero
  • carattere e carattere
  • enum
  • Corda
case value1 (value2, valueN)- questi sono valori, costanti specifiche con cui confrontiamo il valore di una variabile argument. Inoltre, ogni caso definisce una serie di comandi che devono essere eseguiti. statement1, statement2, statementNsono comandi che dovranno essere eseguiti se argumentrisulta essere uguale a uno di value. Ad esempio, se argumentè uguale a value2, il programma verrà eseguito statement2. defaulte default_statementsono "valori predefiniti". Se argumentnon è uguale a nessuno di quelli presentati value, il ramo verrà attivato defaulte il comando verrà eseguito default_statement. defaulte default_statementsono attributi facoltativi dell'operatore switch-case. break— puoi notare che alla fine di ogni blocco case c'è un'affermazione break. Anche questo operatore è facoltativo e serve a differenziare il codice dei diversi casi. A volte è necessario compiere le stesse azioni in casi diversi: poi questi casi possono essere combinati. In questo caso, la parola chiave breakviene omessa e la struttura dell'operatore switch-casesarà simile alla seguente:
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
Vale la pena notare che non esiste alcun operatore tra `case valueX:` e `case valueY:` break. Qui, se argumentè uguale a value1, verrà eseguito statement1. E se l'argomento è uguale valueXa valueY, statementXY. Diluiamo la teoria difficile da comprendere in una pratica facile da comprendere. Riscriviamo l'esempio con i giorni della settimana utilizzando l'operatore switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
            System.out.println("Сегодня воскресенье");
            break;
        case MONDAY:
            System.out.println("Сегодня понедельник");
            break;
        case TUESDAY:
            System.out.println("Сегодня вторник");
            break;
        case WEDNESDAY:
            System.out.println("Сегодня среда");
            break;
        case THURSDAY:
            System.out.println("Сегодня четверг");
            break;
        case FRIDAY:
            System.out.println("Сегодня пятница");
            break;
        case SATURDAY:
            System.out.println("Сегодня суббота");
            break;
    }
}
Ora scriviamo un programma che mostri se oggi è un giorno feriale o un fine settimana utilizzando l'operatore switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
        case SATURDAY:
            System.out.println("Сегодня выходной");
            break;
        case FRIDAY:
            System.out.println("Завтра выходной");
            break;
        default:
            System.out.println("Сегодня рабочий день");
            break;

    }
}
Lasciami spiegare un po'. In questo programma otteniamo enum DayOfWeek, che denota il giorno corrente della settimana. Successivamente, vediamo se il valore della nostra variabile è uguale ai dayOfWeekvalori di SUNDAYuno dei due SATURDAY. In tal caso, il programma visualizza "Oggi è un giorno libero". In caso contrario, controlliamo se il valore della variabile è uguale al dayOfWeekvalore di FRIDAY. In tal caso, il programma visualizza "Domani è un giorno libero". Se in questo caso non c'è, allora abbiamo poche opzioni, qualsiasi giorno rimanente è un giorno feriale, quindi per impostazione predefinita, se oggi NON è venerdì, NON sabato e NON domenica, il programma visualizzerà "Oggi è un giorno lavorativo".

Conclusione

Quindi, in questo articolo abbiamo esaminato cos'è la ramificazione in un programma per computer. Abbiamo anche capito quali strutture di controllo vengono utilizzate per implementare la ramificazione in Java. Abbiamo discusso di progetti come:
  • if-then
  • if-then-else
  • switch-case
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION