JavaRush /Java блогу /Random-KY /Java'да тармалдашуу

Java'да тармалдашуу

Группада жарыяланган
Бул макалада биз жалпысынан компьютердик программаларда жана Java тorнде жазылган тармактарда тармакташуу түшүнүгүн карайбыз. Башкаруу структуралары жөнүндө сөз кылалы, мисалы:
  • if-then(же if)
  • if-then-else(же if-else)
  • switch-case
Java тилкесинде тармакташуу - 1

Бутактуу

Негизги түшүнүктөрдөн баштайлы. Ар кандай программа – бул компьютер тарабынан аткарылуучу буйруктардын жыйындысы. Көбүнчө буйруктар биринин артынан бири ырааттуу түрдө аткарылат. Программа буйруктарынын ырааттуу агымын өзгөртүү керек болгондо бир аз сейрек (бирок дагы эле көп) жагдайлар пайда болот. Кээде, белгилүү бир шарттарга жараша, башкасынын ордуна буйруктардын бир блогун аткаруу зарыл болушу мүмкүн. Ал эми бул шарттар өзгөргөндө, тескерисинче кылыңыз. Мисалы, 18 жашка чейинкилерге кирүүгө тыюу салынган бир катар сайттар бар. Адатта, мындай ресурска биринчи жолу киргенде, колдонуучуну кандайдыр бир форма менен тосуп алышат, анда колдонуучуга жаш чеги жөнүндө эскертorп, анын туулган күнүн киргизүүнү суранышат. Андан кийин, колдонуучу киргизген маалыматтарга жараша, ага ресурска кирүүгө уруксат берилет же жок. Бул функция көбүнчө бутактандыруу деп аталган нерсе менен камсыз кылынат. Дагы бир окшоштук келтирели. Келгиле, өзүбүздү жети жолдун кесorшинде элестетип көрөлү. Биз тандоо алдында турабыз: солго же оңго бурулуңуз же түз жүрүңүз. Биздин тандообуз белгилүү бир шарттарга негизделген. Ошондой эле бир эле учурда бир нече жолду басып өтүүгө мүмкүнчүлүгүбүз жок. Ошол. кээ бир шарттарга жараша биз бир жолду тандоого туура келет. Ошол эле принцип бутактанууга да тиешелүү. Эми бутактанууга аныктама бергенге аракет кылалы. Тармакташуу – бул кандайдыр бир шарттын чындыгына жараша бир нече аракеттердин ырааттуулугунун бири аткарылуучу алгоритмдик долбоор. Тармакташтыруу (кыязы) бардык программалоо тилдеринде ишке ашырылат. Java программалоо тorнде сиздин программаңызда бутактандырууну ишке ашырууга мүмкүндүк берген бир нече башкаруу конструкциялары бар. Программалоо тorнде мындай 3 конструкция бар:
  • Операторif-then
  • Операторif-then-else
  • Үчтүк оператор? :
if-elseБул макалада биз жана операторлорун карап чыгабыз switch-case.

эгерде - анда

Оператор if-then, же жөн эле, ifбалким, эң кеңири таралган оператор. "Ооба, эгер 1 жаз" деген сөз буга чейин эле популярдуу болуп калды. Оператор ifтөмөнкү структурага ээ:
if (bool_condition) {
	statement
}
Бул дизайнда:
  • bool_conditionчын же жалган деп баалаган логикалык туюнтма. Бул туюнтма шарт деп аталат.
  • statement— шарт чын болсо, аткарылышы керек болгон буйрук (бирден ашык болушу мүмкүн) ( bool_statement==true)
Бул курулуш төмөнкүчө окуса болот:

Если (bool_condition), то {statement}
Бул жерде кээ бир мисалдар келтирилген:
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 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
Бул программада колдонуучудан смартфонунун батарейкасынын зарядынын пайызын киргизүү сунушталат. Эгерде заряддын 10 пайыздан азы калса, программа колдонуучуга смартфонду кубаттоо зарылчылыгы жөнүндө эскертет. Бул эң жөнөкөй дизайндын мисалы if. Белгилей кетчү нерсе, эгерде `a` өзгөрмөсү 10дон чоң же барабар болсо, анда эч нерсе болбойт. Программа андан кийинки codeду аткарууну улантат if. Ошондой эле, бул учурда, конструкцияда ifаткаруу үчүн бир гана иш-аракеттер бар экенин белгилей кетүү керек: текстти басып чыгаруу, же эч нерсе кылбоо. Бул бир "бутак" менен бутактануунун вариациясы. Бул кээде зарыл. Мисалы, биз өзүбүздү туура эмес баалуулуктардан коргогубуз келгенде. Мисалы, сап болсо, саптагы тамгалардын санын биле албайбыз null. Төмөндө мисалдар:
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());
    }
}
Негизги ыкманы аткаруунун натыйжасында консолго төмөндөгүлөр чыгарылат:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Муну текшерүүнүн аркасында string != nullбиз программадагы каталарды болтурбай алдык. stringЖана өзгөрмө ге барабар болгон учурларда эч нерсе кылбаңыз null.

Эгер Анан дагы

Кадимки учурда ifпрограммада тандоо бар болсо: "бир нерсе кылба же эч нерсе кылба", анда if-elseпрограмманы тандоодо "бир нерсени же башканы жасоо" келип чыгат. "Эч нерсе кылба" параметри жок болот. Бутактануунун бул түрү менен аткаруунун эки же андан көп варианттары (же бутактардын саны) бар. Келгиле, эки вариант болгондо ишти карап көрөлү. Андан кийин башкаруу структурасы төмөнкүдөй формага ээ:
if (bool_condition) {
	statement1
} else {
	statement2
}
Бул жерде:
  • bool_statementчын же жалган деп баалаган логикалык туюнтма. Бул туюнтма шарт деп аталат.
  • statement1— шарт чын болсо, аткарылышы керек болгон буйрук (бирден ашык болушу мүмкүн) ( bool_statement==true)
  • statement2— шарт туура эмес болсо, аткарылышы керек болгон буйрук (бирден көп болушу мүмкүн) ( bool_statement==false)
Бул курулуш төмөнкүчө окуса болот:

Если (bool_condition), то {statement1}
Иначе {statement2}
Бул жерде бир мисал:
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");
    }
}
Смартфондогу батарейканын деңгээли жөнүндө да ушундай эле мисал. Эгерде акыркы жолу программа смартфонду кубаттоо зарылдыгын гана эскертсе, бул жолу бизде кошумча эскертме бар. Муну карап көрөлү if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Эгер a < 10чын болсо (батареянын деңгээли 10дон төмөн), программа бир текстти басып чыгарат. Болбосо, шарт a < 10аткарылбаса, программа такыр башка текстти чыгарат. Ошондой эле экинчи мисалыбызды жыйынтыктайлы, анда биз сапта тамгалардын санын көрсөткөн. Акыркы жолу өткөн сап ге барабар болсо, программа эч нерсе чыгарган жок null. Келгиле, муну кадимкидей кылып ifоңдойлу 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!");
    }
}
Усулда биз printStringSizeкурулушка ifблок коштук else. Эми, эгерде биз программаны иштетсек, ал консолго 2 сап эмес, 4 сап чыгарат, бирок киргизүү (ыкма main) акыркы жолкудай бойдон калат. Программа чыгара турган текст:

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Кырдаалдар elseалардан кийин аткаруу буйруктары эмес, башка if. Андан кийин курулуш төмөнкү форманы алат:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
Бул дизайн бир нече шарттарды камтыйт:
  • bool_шарт1
  • bool_шарт2
  • bool_conditionN
Мындай шарттардын саны чектелбейт. Ар бир шарттын өзүнүн буйруктары бар:
  • билдирүү 1
  • билдирүү 2
  • билдирүү Н
Ар бири statement1 же андан көп code саптарын камтышы мүмкүн. Шарттары бирден текшерилет. Биринчи чыныгы шарт аныкталгандан кийин, чыныгы шартка "байланышкан" бир катар буйруктар аткарылат. ifБул буйруктарды аткаргандан кийин, алдыда дагы текшерүүлөр болсо дагы, программа блоктон чыгат . Эгерде жогоруда аныкталган шарттардын бири да туура болбосо, "detailN+1" туюнтмасы аткарылат. Бул курулуш төмөнкүчө окуса болот:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
Бул учурда акыркы сап милдеттүү эмес. Сиз акыркы жалгызсыз кыла аласыз else. Ошондо дизайн төмөнкү форманы алат:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
Жана ал мындайча окулат:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Демек, эгерде шарттардын бири да туура болбосо, анда эч кандай буйрук аткарылbyte. Келгиле, мисалдарга өтөлү. Смартфондун заряд деңгээли боюнча абалга кайрылып көрөлү. Ээсине анын аппаратынын заряд деңгээли жөнүндө кененирээк маалымат бере турган программаны жазалы:
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);
    }
}
Мисалы, бул учурда, эгерде колдонуучу 15ти киргизсе, программа экранда: "Заряддоочу кайда экенин эстеп калууга убакыт келди" деген жазуу пайда болот. 15 аз жана 30 жана 50 жана 75 жана 100 болгонуна карабастан, экрандагы чыгаруу 1 гана болот. Консолго жуманын кайсы күнү экенин басып чыгара турган дагы бир тиркемени жазалы:
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("Сегодня суббота");
    }
}
Бул, албетте, ыңгайлуу, бирок монотондуу тексттин көптүгү көзүңүздү бир аз таң калтырат. Бизде көптөгөн варианттар бар учурларда, төмөндө талкуулана турган операторду колдонуу жакшы.

которгуч

ifКөп бутактары бар калыңга альтернатива оператор болуп саналат switch-case. Бул оператор "Демек, бизде бул өзгөрмө бар. Карачы, эгерде анын мааниси `x`ге барабар болсо, анда биз муну жана тигини кылабыз, эгерде анын мааниси `y`ге барабар болсо, анда биз муну башкача кылабыз, ал эми жогорудагылардын бирине да барабар болбосо, анда биз жөн гана жасайбыз. ал мындай... ” Бул оператор төмөнкү структурага ээ.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
Бул структураны кененирээк карап көрөлү. argument өзгөрмө, анын маанисин биз гипотетикалык ар кандай варианттар менен салыштыра турган өзгөрмө. өзгөрмө болушу керек final. Бул оператор switchаргумент катары ар кандай маалымат түрүн колдобой турганын да айта кетүү керек. Жарактуу түрлөрү төмөндө келтирилген:
  • byte жана byte
  • кыска жана кыска
  • int жана Integer
  • символ жана каарман
  • энум
  • String
case value1 (value2, valueN)- бул баалуулуктар, биз өзгөрмөнүн маанисин салыштырган конкреттүү константалар argument. Ошондой эле, ар бир учур аткарылышы керек болгон буйруктардын топтомун аныктайт. statement1, statement2, бирине барабар болуп чыкса, statementNаткарылышы керек болгон буйруктар . Мисалы, ал барабар болсо , анда программа аткарат . жана "демейки маанилер" болуп саналат. Эгерде көрсөтүлгөндөрдүн бирине да барабар болбосо , анда бутак ишке киргизилет жана буйрук аткарылат . жана оператордун кошумча атрибуттары болуп саналат . — ар бир блоктун аягында билдирүү бар экенин байкай аласыз . Бул оператор дагы кошумча болуп саналат жана ар кандай учурлардын codeун айырмалоо үчүн кызмат кылат. Кээде ар кандай учурларда бир эле аракеттерди жасоо керек болот: анда бул учурларды айкалыштырууга болот. Бул учурда, ачкыч сөз алынып салынат жана оператордун түзүлүшү төмөнкүдөй болот: argumentvalueargumentvalue2statement2defaultdefault_statementargumentvaluedefaultdefault_statementdefaultdefault_statementswitch-casebreakbreakbreakswitch-case
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
Белгилей кетчү нерсе, `case valueX:` жана `case valueY:` ортосунда оператор жок break. Бул жерде, эгерде argumentал барабар болсо value1, анда ал аткарылат statement1. valueXАл эми аргумент экөөнө тең болсо valueY, statementXY. Келгиле, түшүнүү кыйын теорияны түшүнүктүү практикага айландыралы. Оператордун жардамы менен мисалды жуманын күндөрү менен кайра жазалы 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;
    }
}
Эми оператордун жардамы менен бүгүн иш күнү же дем алыш күн экенин көрсөткөн программаны жазалы 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;

    }
}
Бир аз түшүндүрүп берейин. Бул программада биз enum DayOfWeekжуманын учурдагы күнүн билдирген . Андан кийин, биз өзгөрмөнүн мааниси экөөнүн тең dayOfWeekбаалуулуктарына барабар экендигин карап чыгабыз . Андай болсо, программа "Бүгүн дем алыш күн" дегенди көрсөтөт. Эгерде андай болбосо, анда биз өзгөрмөнүн маанисинин маанисине барабар экендигин текшеребиз . Андай болсо, программа "Эртең эс алуу күнү" дегенди көрсөтөт. Эгерде бул учурда жок болсо, анда бизде бир нече варианттар бар, калган күн иш күнү болуп саналат, ошондуктан демейки боюнча, эгерде бүгүн Жума ЭМЕС, Ишемби ЭМЕС жана Жекшемби ЭМЕС болсо, программа "Бүгүн жумуш күнү" көрсөтөт. SUNDAYSATURDAYdayOfWeekFRIDAY

Корутунду

Ошентип, бул макалада биз компьютердик программада бутактандыруу деген эмне экенин карап чыктык. Биз ошондой эле Java'да тармакташууларды ишке ашыруу үчүн кандай башкаруу структуралары колдонуларын түшүндүк. Биз дизайндарды талкууладык, мисалы:
  • if-then
  • if-then-else
  • switch-case
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION