Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Përmirësuar për loop java. Java Loops: while dhe Do-While

A keni menduar ndonjëherë pse ekzistojnë programet? Nëse e thjeshtojmë dhe përgjithësojmë përgjigjen e kësaj pyetjeje, rezulton se programet janë të nevojshme për të automatizuar procesin e punës, për të rritur shpejtësinë e punës së kryer, për të çliruar një person nga mijëra veprime monotone, etj. Le të përqendrohemi në veprimet që përsëriten njëra pas tjetrës, ose, me fjalë të thjeshta, cikle.

Një cikël është një ekzekutim vijues i veprimeve të përsëritura bazuar në një parakusht të caktuar. Për shembull, ju duhet të lëvizni njëqind kuti nga një cep në tjetrin. Nëse e shkruajmë disi këtë në Java (për fat të keq, Java nuk do të jetë në gjendje të riorganizojë kutitë për ju), do të merrni një hyrje me njëqind rreshta:

1. merr kutinë nr. 1 dhe vendose në një cep tjetër;
2. merr kutinë nr.2 dhe vendose në një cep tjetër;
3. merr kutinë nr.3 dhe vendose në një cep tjetër;

100. merr kutinë nr.100 dhe vendose në një cep tjetër;

Njëqind rreshta kodi janë tashmë shumë, por ka një mijë, dy, tre, e kështu me radhë. Për këto qëllime, përkatësisht, për të thjeshtuar regjistrimin e veprimeve të përsëritura, përdoren ciklet.

Janë tre operatorë që përfaqësojnë sythe në gjuhën Java - while, do/white dhe for. Secili prej operatorëve është i nevojshëm në situatën e vet, por operatori for përdoret akoma më shpesh. Le të shqyrtojmë secilin prej operatorëve sipas radhës.

ndërsa deklarata

Sintaksa për deklaratën while është si më poshtë:

Ndërsa(kushti) ( // veprimet )

Ekziston edhe plotësimi i një parakushti të caktuar, por ndryshe nga pohimi if/else, ky konstruksion ndërtohet mbi cikle të kontrollit të gjendjes. Kur programi arrin deklaratën while, nëse kushti i propozuar është i vërtetë, të gjitha veprimet në bllokun e kllapave kaçurrelë (...) ekzekutohen. Pas kryerjes së këtyre veprimeve, programi përsëri kontrollon gjendjen pas deklaratës while dhe nëse kushti është përsëri i vërtetë, veprimet në bllok përsëriten. Veprimet në bllok kryhen derisa gjendja të bëhet false, dhe vetëm atëherë del cikli while.
Për të dalë nga sythe, të ashtuquajturat numërues përdoren më shpesh. Le të shohim një shembull të vogël:

Int i = 0; nderkohe une< 10) { // действия i++; }

Së pari, ndryshores i i caktohet vlera 0, më pas kontrollohet kushti i0)

( // veprimet i--; )

Të njëjtat veprime, por në drejtim të kundërt. Për më tepër, në ciklin while (dhe në të vërtetë unazat e tjera) është e mundur të përdoren variabla Boolean që përmbajnë vlerat false ose true. Në këtë rast, kontrollohet një parakusht i caktuar.

Boolean i = e vërtetë; ndërsa (i) ( // veprimet )

Ndryshores i është true, asaj i caktohet vlera true, kështu që cikli while ekzekutohet derisa ndryshores i i caktohet vlera false. Prandaj, është e nevojshme të kujdeset për daljen nga një lak i tillë, përndryshe cikli while do të ekzekutohet pafundësisht dhe unazat e tilla quhen unaza të pafundme.

Së fundi, do të doja të tërhiqja vëmendjen te operatori ==. Nëse e shkruani ciklin në këtë mënyrë:

Int i = 0 ndërsa (i == 5) ( // veprimet i++; )

Kjo do të rezultojë në një cikli plotësisht të zbatueshëm, por nëse bëni një gabim ose përdorni versionin klasik të operatorit të barabartë = të përdorur në matematikë, atëherë do të keni një problem në formën e një cikli të pafund.

Int i = 0 ndërsa (i = 5) ( // veprimet i++; )

Në parakusht ndryshores i i është caktuar vlera 5, por ky veprim nuk është i ndaluar dhe çfarë kemi si rezultat? Ekzekutimi i këtij blloku të ciklit do të fillojë në fund të të cilit vlera e i do të rritet me një, por në kushtin paraprak pas deklaratës while, ndryshores i do t'i caktohet përsëri vlera pesë dhe cikli do të vazhdojë punën e tij ad. infinitum. Ky është një shembull i një laku të thjeshtë të pafund dhe, si rezultat, një gabim klasik që u ndodh shumë shpesh programuesve fillestarë.

bëj/ndërsa lak

Cikli while që sapo shikuam mund të mos funksionojë në kushte të caktuara. Për shembull, nëse kushti është fillimisht fals, cikli nuk do të ekzekutohet as edhe një herë. Programi, kur të arrijë një linjë kodi me një deklaratë while, do të kontrollojë gjendjen dhe nëse është false, do të injorojë të gjithë ciklin dhe do të kalojë te kodi menjëherë pas ciklit while. Por ndonjëherë ekziston nevoja për të ekzekutuar lak të paktën një herë. Java ka një lak do/while për këto qëllime. Regjistrimi dhe krijimi i një cikli do/while bëhet si më poshtë:

Bëj ( // veprime )ndërsa (kusht)

Midis deklaratave do dhe while ekziston një trup i ciklit që do të ekzekutohet derisa kushti pasues i deklaratës while të jetë false. Trupi i lakut do të ekzekutohet të paktën një herë, pas së cilës do të kontrollohet gjendja. Cikli do/while nuk përdoret shpesh, por ndonjëherë rezulton të jetë i domosdoshëm.

për lak

Ky është cikli më i zakonshëm në programim. Cikli for funksionon duke kontrolluar një numërues. Kuptimi i këtij cikli është i ngjashëm me sythe while dhe do/while të diskutuara më sipër. Shikoni se si duket sintaksa për një lak for:

Për (int i = 0; i< 10; i++) { // действие }

Pas fjalës kyçe for, vjen kushti për ekzekutimin e ciklit. Vetë gjendja kombinon tre faza. Fillimisht inicializohet numëruesi i = 0, pastaj kontrollohet kushti i< 10 и в конце увеличение переменной i на единицу.

Cikli for funksionon si më poshtë. Kur programi arrin ciklin, inicializohet numëruesi i = 0 dhe kontrollohet gjendja i< 10. Далее программа переходит в тело цикла. По окончанию всех действий в цикле for, происходит обращение к третьему этапу цикла: i++, увеличивая счетчик на единицу. После чего сразу же происходит переход ко второму этапу – проверке переменной i < 10 и повторный выход в тело цикла. Весь цикл продолжается до тех пор, пока условие i < 10 не станет ложным. Цикл for используется постоянно при инициализации массива данных, где без него очень сложно, а порой и не возможно обойтись. Так же как и в цикле while возможно использование оператора декремента, например.

Që nga JDK 5, ekzistojnë dy forma të ciklit for në Java. E para është forma tradicionale, e përdorur që nga versioni origjinal i Java. E dyta është forma e re "për secilin". Ne do të shohim të dy llojet e sytheve për, duke filluar me formën tradicionale.

Forma e përgjithshme e operatorit tradicional për si në vazhdim:

Nëse vetëm një deklaratë do të përsëritet në një lak, ju mund të hiqni mbajtëset kaçurrelë.

Cikli për funksionon si më poshtë. Kur cikli niset për herë të parë, programi ekzekutohet inicializimi pjesë e ciklit. Në përgjithësi, kjo është një shprehje që përcakton vlerën e një ndryshoreje kontrolli të ciklit, e cila vepron si një numërues që kontrollon ciklin. Është e rëndësishme të kuptohet se shprehja inicializimi ekzekutuar vetëm një herë. Më pas programi llogarit gjendje e cila duhet të jetë logjike shprehje. Në mënyrë tipike, shprehja kushtet krahason vlerën e ndryshores së kontrollit me vlerën e synuar. Nëse kjo vlerë është e vërtetë, programi ekzekutohet trupi ciklit. Nëse është false, ekzekutimi i ciklit ndërpritet.. Më pas programi ekzekutohet trupi lak dhe vetëm pas kësaj pjesa ekzekutohet përsëritje ciklit. Përsëritje zakonisht është një shprehje që rrit ose ul vlerën e një ndryshoreje kontrolli. Më pas programi përsërit ciklin, sa herë që kalon, fillimisht duke llogaritur kushtëzuar shprehje, pastaj duke bërë trupi cikli dhe ekzekutimi i shprehjes përsëritjet . Procesi përsëritet deri në vlerën e shprehjes kushtet nuk do të bëhet false.

Meqenëse shumica e sytheve përdorin variablat e tyre vetëm brenda ciklit, ciklit për lejon shprehjen inicializimi ishte një deklaratë e plotë variabël. Kështu, ndryshorja është e kufizuar në trupin e lakut dhe është e padukshme nga jashtë.

Këtu janë disa shembuj që shpjegojnë të gjitha sa më sipër:

Në këtë shembull ndryshorja i deklaruar jashtë ciklit (rreshti 7), kështu që është gjithashtu i disponueshëm pas përfundimit të tij (rreshti 12).

Nga dalja e këtij programi shihet se shprehja përsëritjet cikli, përkatësisht shtimi i prefiksit ( ++i) variabël i ekzekutohet pasi të jetë ekzekutuar trupi i lakut, domethënë pasi të jetë ekzekutuar rreshti 10, i cili printon përshëndetjen.

Kjo pikë është shumë e rëndësishme për t'u kuptuar në mënyrë që të kemi një kuptim të saktë se si funksionon cikli. për.

Tani le të shohim daljen e këtij programi me dhe pa argumente të linjës së komandës:

Siç shihet nga dalja e këtij programi, rritja e ndryshores i ndodh pasi të ekzekutohet komanda e fundit në lak, e cila printon përshëndetjen (rreshti 10).

Tani le të deklarojmë një ndryshore brenda ciklit (për deklaratën):

Siç mund ta shihni, Eclipse menjëherë na vuri në dukje gabimin që ndryshoi j, i deklaruar në rreshtin 15, nuk është i dukshëm jashtë ciklit, sepse shtrirja ose shtrirja e tij shtrihet vetëm në trupin e ciklit në të cilin është deklaruar.

Që programi të funksionojë, duhet të komentoni rreshtin 19.

Prodhimi i këtij kodi është i ngjashëm me daljen e kodit që sapo shikuam, përveç se në vend të "Hello", ai nxjerr "Hello". Epo, pas lakut nuk është e mundur të shfaqet vlera e një ndryshoreje j.

Kur deklaroni një ndryshore brenda një cikli përështë e nevojshme të mbani mend rrethanën e mëposhtme të rëndësishme: zona dhe jetëgjatësia e këtij variabli përputhen plotësisht me zonën dhe kohën e ekzistencës së operatorit. për .

Sintaksa e lakut për nuk kufizohet në sythe me një ndryshore të vetme. Si në shprehje inicializimi , dhe në shprehje përsëritjet mund të përdoret presje për të ndarë shprehje të shumta inicializimi Dhe përsëritjet .

Për shembull:

Në këtë shembull në inicializimi pjesë e lakut vendosim vlerat fillestare të të dy variablave të kontrollit a Dhe b. Të dyja deklaratat me presje në përsëritëse pjesët ekzekutohen sa herë që cikli përsëritet.

Ky kod gjeneron daljen e mëposhtme:

Cikli për mbështet disa shije që rrisin aftësitë dhe zbatueshmërinë e tij. Fleksibiliteti i këtij cikli është për faktin se tre pjesët e tij: inicializimi , duke kontrolluar kushtet Dhe përsëritëse nuk duhet të përdoret vetëm për qëllimin e synuar. Në fakt, secili nga seksionet e deklaratës për mund të përdoret për çdo qëllim. Për shembull:

Shembulli është sigurisht pak i çuditshëm, por në thelb është i thjeshtë. Pjesa e parë e deklaratës inicializon variablin b, i dyti e kontrollon dhe i treti shfaq një mesazh në tastierë.

Në thelb ky program bën të njëjtën gjë të përshëndetjes së argumenteve nëse ato ekzistojnë. Nëse nuk janë aty, atëherë nuk nxjerr asgjë. Më lejoni të jap menjëherë një shembull të prodhimit të tij:

Siç shihet nga dalja e këtij programi, pjesa e përsëritjes ekzekutohet, siç u përmend tashmë, pasi të ekzekutohet trupi i ciklit. Në këtë rast është operatori println në rreshtin 9. Deklarata for në këtë kod shtrihet në dy rreshtat 9 dhe 10 sepse është mjaft i gjatë. E bëra këtë për të demonstruar se çdo pjesë e deklaratës for mund të përdoret për qëllime të ndryshme. Gjithashtu vlen të theksohet se rritja e ndryshores i ndodh në rreshtin 12 dhe gjithashtu vendos një kusht për vazhdimin ose daljen nga laku, i cili kontrollohet në rreshtin 9.

Një shembull tjetër i ngjashëm, një cikli for mund të përdoret për të përsëritur përmes elementeve të një liste të lidhur:

Gjithashtu vlen të theksohet se çdo pjesë të ciklit për (inicializimi, gjendje Dhe përsëritëse) ose madje mund të kapërceni gjithçka. Për shembull, mund të krijoni një lak të pafund në këtë mënyrë:

( ;; ){
//cikël pa fund
}

Mund të mungojë një shprehje inicializimi ose përsëritjeje, ose të dyja:

Në këtë shembull inicializimi Dhe përsëritëse shprehjet zhvendosen jashtë përkufizimit të operatorit për. Si rezultat, pjesët përkatëse të deklaratës për bosh.

Për ta bërë më të qartë sekuencën e ekzekutimit të pjesëve të deklaratës for, do të jap një shembull të vogël. Megjithëse nuk i kemi studiuar ende metodat, shpresoj që ideja e këtij programi të kuptohet nga ju. Qëllimi i tij është të tregojë qartë sekuencën e ekzekutimit të të gjitha pjesëve të deklaratës for.

Nga dalja e programit është e qartë se inicializimi pjesë e programit ( Metoda initTest().) ekzekutohet vetëm një herë.

Më pas kryhet kontrolli kushtet , e përfaqësuar nga metoda condTest ().

Pas kontrollit kushtet , kryer trupi ciklit.

Dhe pas kësaj pjesa ekzekutohet përsëritje , e përfaqësuar nga metoda recTest ().

Metoda condTest() kontrollon gjendjen e vazhdimit të ciklit. Në këtë rast, ndryshorja i krahasohet me 4, dhe për sa kohë që ndryshorja i është më e vogël se 4, ekzekutohet trupi i ciklit.

Trupi i ciklit ekzekutohet katër herë pasi ndryshorja i është inicializuar në zero si parazgjedhje.

Operatori per secilin

Duke filluar me JDK 5, Java mund të përdorë një formë të dytë të ciklit for, i cili zbaton një lak në stilin per secilin ("per secilin"). Cikli në stil per secilin është menduar për ekzekutimin rreptësisht sekuencial të veprimeve të përsëritura në lidhje me koleksionet e objekteve, të tilla si vargje. Në Java, aftësia për të përdorur një lak per secilin zbatohet duke përmirësuar ciklin për. Formulari i versionit të përgjithshëm per secilin ciklit për ka formën e mëposhtme:

për deklaratat e bllokut (lloji i variablit përsëritës: koleksion).

Lloji ky është lloji i ndryshores, ndryshorja e përsëritjes - emri i një ndryshoreje përsëritëse që do të marrë në mënyrë sekuenciale vlerat nga koleksionet , nga i pari tek i fundit. Elementi i mbledhjes specifikon koleksionin mbi të cilin duhet të qarkullohet. Me cikël për Ju mund të përdorni lloje të ndryshme koleksionesh, por tani për tani ne do të përdorim vetëm vargje, meqë ra fjala, të cilat nuk i kemi provuar ende, por të paktën tashmë ka pasur shumë shembuj me përshëndetje nga një grup vargjesh, ku argumentet e linjës së komandës shko.

Në një shënim: operatori per secilin zbatohet për vargje dhe klasa që implementojnë ndërfaqen java.lang.Iterable.

Në çdo përsëritje të ciklit, programi merr elementin tjetër të koleksionit dhe e ruan atë në një variabël përsëritjeje. Cikli funksionon derisa të merren të gjithë elementët e koleksionit.

Edhe pse cikli përsëritet për në stil per secilin ekzekutohet derisa të përpunohen të gjithë elementët e grupit (koleksionit); cikli mund të ndërpritet më herët duke përdorur operatorin thyej.

Për shkak se një variabël përsëritës merr vlera nga një koleksion, lloji i tij duhet të përputhet (ose të jetë i pajtueshëm me) llojin e elementeve të ruajtura në koleksion. Kështu, kur qarkulloni mbi vargje, lloji duhet të jetë i pajtueshëm me llojin themelor të grupit.

Për të kuptuar motivimin e përdorimit të sytheve në stil per secilin , merrni parasysh llojin e ciklit për, të cilin ky stil synon ta zëvendësojë.

Le të marrim përsëri shembullin tonë të argumenteve përshëndetëse nga linja e komandës:

A nuk është shumë më elegante sesa përdorimi i operatorëve të tjerë loop për këtë qëllim?

Në fakt, ky program ka një dalje të thjeshtë:

E kemi parë tashmë shumë herë në versione të ndryshme, por përsëritja është nëna e të mësuarit.

Për qartësi të plotë, le të shohim disa shembuj të tjerë.

Sa herë kalon cikli, ndryshores x i caktohet automatikisht një vlerë e barabartë me vlerën e elementit tjetër në grupin nums. Kështu, në përsëritjen e parë x përmban 1, në të dytën - 2, etj. Kjo thjeshton sintaksën e programit dhe eliminon mundësinë për të shkuar përtej grupit.

Rezultati i kësaj pjese të programit është:

Edhe pse cikli përsëritet për në stil per secilin ekzekutohet derisa të përpunohen të gjithë elementët e grupit; cikli mund të ndërpritet më herët duke përdorur operatorin thyej. Për shembull:

Në këtë shembull, cikli do të ekzekutojë vetëm tre përsëritje, pas së cilës cikli do të dalë sipas gjendjes së operatorit nëse, e cila do të aktivizojë operatorin thyej.

Është gjithashtu e rëndësishme të kuptohet se ndryshorja e përsëritjes merr vlera nga koleksioni (vargu) në çdo përsëritje, prandaj, edhe nëse vlera e tij ndryshohet në trupin e lakut, atëherë në përsëritjen tjetër do të marrë përsëri tjetrin. vlerë nga koleksioni. Për më tepër, ndryshimet e tij nuk ndikojnë në asnjë mënyrë në vlerat e koleksionit (elementet e grupit në këtë shembull).

Ky kod do të nxjerrë sa vijon:

Mund të përdoret çdo metodë që kthen një grup per secilin . Për shembull, klasa String përmban një metodë toCharArray që kthen një grup char. Shembull:

Ky kod thjesht do të printojë vargun Hello World!

Këtu mund të përfundojmë me këta operatorë. E vetmja gjë që vlen të përmendet është se në pjesën e inicializimit mund të deklaroni vetëm variabla të të njëjtit lloj, ose të inicializoni variabla të llojeve të ndryshme, por ato që mund të transferohen në një lloj të përbashkët sipas rregullit të hedhjes së tipit që kemi parë më herët.

Më në fund, do të jap disa shembuj të tjerë të një operatori të avancuar për. Në përgjithësi, ky është vetëm një kod i rifaktoruar i shembullit që kam dhënë tashmë.

A nuk është e vërtetë që ky kod është bërë më i lexueshëm dhe më i kuptueshëm se ai që kam dhënë tashmë? Apo nuk është e qartë? Epo atëherë, le të shohim një shembull tjetër të kodit që bën të njëjtën gjë.

A nuk është përsëri e qartë?

Të dy këta kode prodhojnë të njëjtin rezultat:

Sigurisht, me kusht që argumentet në vijën e komandës të ishin Vasya dhe Petya.

Kjo përfundon me operatorin for dhe hijen e tij foreach.

për lak

Që nga JDK 5, ekzistojnë dy forma të ciklit for në Java. E para është forma tradicionale, e përdorur që nga versioni origjinal i Java. E dyta është forma e re "për-çdo". Ne do të shohim të dy llojet e sytheve për, duke filluar me formën tradicionale.

Forma e përgjithshme e një deklarate tradicionale për është si më poshtë:

për (inicializimi; kusht; përsëritje)
(// trupi
}

Nëse vetëm një deklaratë do të përsëritet në një lak, ju mund të hiqni mbajtëset kaçurrelë.

Cikli for funksionon si më poshtë. Kur cikli niset për herë të parë, programi kryen pjesën e inicializimit të ciklit. Në përgjithësi, kjo është një shprehje që përcakton vlerën e një ndryshoreje kontrolli të ciklit, e cila vepron si një numërues që kontrollon ciklin. Është e rëndësishme të kuptohet se shprehja e inicializimit ekzekutohet vetëm një herë. Më pas programi vlerëson gjendjen, e cila duhet të jetë një shprehje Boolean. Në mënyrë tipike, shprehja krahason vlerën e një ndryshoreje kontrolli me një vlerë të synuar. Nëse kjo vlerë është e vërtetë, programi ekzekuton trupin e ciklit. Nëse është false, ekzekutimi i ciklit ndërpritet. Më pas programi kryen pjesën e përsëritur të ciklit. Zakonisht kjo është një shprehje që rrit ose ul vlerën e një ndryshoreje kontrolli. Më pas programi përsërit ciklin, çdo herë që kalon duke vlerësuar fillimisht shprehjen e kushtëzuar, më pas duke ekzekutuar trupin e ciklit dhe duke ekzekutuar shprehjen e përsëritjes. Procesi përsëritet derisa shprehja e përsëritjes të vlerësohet në false.

Më poshtë është një version i programit të numërimit të orës që përdor një cikli for.

// Demonstrimi i përdorimit të një cikli for.
klasa ForTick (

int n;
për (n=10; n>0; n-)

}
}

Deklarimi i variablave të kontrollit të ciklit brenda një cikli for

Shpesh ndryshorja që kontrollon një cikli for nevojitet vetëm për atë cikli dhe nuk përdoret askund tjetër. Në këtë rast, ndryshorja mund të deklarohet brenda pjesës së inicializimit të deklaratës for. Për shembull, programi i mëparshëm mund të rishkruhet duke deklaruar një variabël kontrolli të tipit int brenda një cikli for:

// Deklarimi i një ndryshoreje kontrolli të ciklit brenda një cikli for.
klasa ForTick (produkt publik statik i zbrazët (args me vargje) (
//në këtë rast ndryshorja n deklarohet brenda ciklit for
për (int n=10; n>0; n-)
System.out.println("beat" + n);
}
}

Kur deklaroni një variabël brenda një cikli for, duhet të mbani mend rrethanën e mëposhtme të rëndësishme: shtrirja dhe jetëgjatësia e kësaj ndryshoreje përkon plotësisht me shtrirjen dhe jetëgjatësinë e deklaratës for. (D.m.th., shtrirja e ekzistencës së ndryshores është e kufizuar në ciklin for.) Jashtë ciklit for, ndryshorja do të pushojë së ekzistuari. Nëse një variabël kontrolli loop duhet të përdoret në pjesë të tjera të programit, ai nuk mund të deklarohet brenda një cikli for.

Në rastet kur një variabël kontrolli loop nuk nevojitet askund tjetër, shumica e programuesve Java preferojnë ta deklarojnë atë brenda një deklarate for. Si shembull, këtu është një program i thjeshtë që kontrollon nëse numri i futur është i thjeshtë. Vini re se ndryshorja e kontrollit të ciklit i është deklaruar brenda ciklit for sepse nuk nevojitet askund tjetër.

Variacionet e ciklit for

Cikli for vjen në disa variacione që rrisin aftësitë dhe zbatueshmërinë e tij. Fleksibiliteti i këtij cikli është për faktin se tre pjesët e tij: inicializimi, kontrolli i gjendjes dhe përsëritja nuk duhet të përdoren vetëm për qëllimin e tyre të synuar. Në fakt, çdo seksion i deklaratës for mund të përdoret për çdo qëllim. Le të shohim disa shembuj.

Një nga variacionet më të zakonshme përfshin përdorimin e një shprehjeje të kushtëzuar. Në veçanti, kjo shprehje nuk ka nevojë të krahasojë variablin e kontrollit të lakut me ndonjë vlerë të synuar. Në fakt, kushti që drejton një cikli for mund të jetë çdo shprehje Boolean. Për shembull, merrni parasysh fragmentin e mëposhtëm:

boolean bërë = false;
për(int i=1; !mbaruar; i++) (
// ...
nëse(ndërprerë()) bërë = e vërtetë;
}

Në këtë shembull, cikli for vazhdon derisa mbarimi të vendoset në true. Në këtë cikli, vlera e ndryshores së kontrollit të ciklit i nuk kontrollohet.

Këtu është një variant tjetër i ciklit for. Duke i lënë bosh të tre pjesët e deklaratës, mund të krijoni qëllimisht një lak të pafund (një lak që nuk përfundon kurrë). Për shembull:

për (; ;) (
// ...
}

Ky lak mund të funksionojë pafundësisht sepse nuk ka asnjë kusht që do të shkaktonte ndërprerjen e tij. Edhe pse disa programe, të tilla si procesorët e komandave të sistemit operativ, kërkojnë një lak të pafund, shumica e "cikleve të pafundme" janë në të vërtetë vetëm sythe me kushte të veçanta ndërprerjeje. Siç do ta shihni së shpejti, ekziston një mënyrë për të thyer një lak - madje edhe një lak të pafund si ky shembull - që nuk kërkon përdorimin e një cikli të rregullt të kushtëzuar.

Versioni "për secilin" i ciklit for

Duke filluar me JDK 5, Java ju lejon të përdorni një formë të dytë të ciklit for, i cili zbaton një lak të stilit "për-secil". Siç mund ta dini, koncepti i sytheve "për secilin" po bëhet gjithnjë e më i zakonshëm në teorinë moderne të gjuhëve të programimit dhe po bëhet shpejt funksionalitet standard në shumë gjuhë. Një lak për çdo stil është krijuar për të kryer veprime të përsëritura në një koleksion objektesh, të tilla si një grup, në një mënyrë strikte sekuenciale. Ndryshe nga disa gjuhë si C#, të cilat përdorin fjalën kyçe foreach për të zbatuar sythe për secilin, Java e bën të mundur ciklin për çdo duke përmirësuar ciklin for. Avantazhi i kësaj qasjeje është se asnjë fjalë kyçe shtesë nuk kërkohet për ta zbatuar atë dhe asnjë kod para-ekzistues nuk është i prishur. Stil për secilin për ciklin quhet gjithashtu një cikli i zgjeruar për. Forma e përgjithshme e versionit "për-çdo" të një cikli for është:

për (shtypni iter: koleksion)
operatorët e bllokut

Këtu tipi tregon llojin, dhe iter-per është emri i ndryshores së përsëritjes që do të marrë në mënyrë sekuenciale vlerat nga koleksioni, nga e para në të fundit. Elementi i mbledhjes specifikon koleksionin mbi të cilin duhet të qarkullohet. Ka shumë lloje koleksionesh që mund t'i përdorni me një cikli for, por në këtë kapitull ne do të përdorim vetëm vargje. (Llojet e tjera të koleksioneve që mund të përdoren me një cikli for, të tilla si ato të përcaktuara në Kornizën e Koleksionit, diskutohen në kapitujt e mëvonshëm të librit.) Në çdo përsëritje të ciklit, programi merr elementin tjetër të koleksionit dhe e ruan atë në ndryshoren iter. Cikli funksionon derisa të merren të gjithë elementët e koleksionit.

Për shkak se një variabël përsëritës merr vlera nga një koleksion, lloji duhet të përputhet (ose të jetë i pajtueshëm me) llojin e elementeve të ruajtura në koleksion. Kështu, kur qarkulloni mbi vargje, lloji duhet të jetë i pajtueshëm me llojin themelor të grupit.

Për-çdo stil për lak ju lejon të automatizoni këtë proces. Në veçanti, përdorimi i një cikli të tillë ju lejon të shmangni vendosjen e vlerës së numëruesit të ciklit duke specifikuar vlerat fillestare dhe përfundimtare të tij dhe eliminon nevojën për të indeksuar manualisht grupin. Në vend të kësaj, programi kalon automatikisht në të gjithë grupin, duke marrë vlerat e secilit prej elementeve të tij në mënyrë sekuenciale, nga i pari tek i fundit. Për shembull, duke pasur parasysh versionin "për secilin" të ciklit for, fragmenti i mëparshëm mund të rishkruhet si më poshtë:

int nums = ( 1, 2, 3, 4, 5, b, 7, 8, 9, 10);
shuma int = 0;
for(int x: nums) shuma += x;

Sa herë kalon cikli, ndryshores x i caktohet automatikisht një vlerë e barabartë me vlerën e elementit tjetër në grupin nums. Kështu, në përsëritjen e parë x përmban 1, në të dytin - 2, etj. Kjo jo vetëm që thjeshton sintaksën e programit, por gjithashtu eliminon mundësinë e gabimeve të vargjeve jashtë kufijve.

Më poshtë është një shembull i një programi të plotë që ilustron përdorimin e këtij versioni "për-çdo" të ciklit for.

// Përdorimi i një cikli for në për-çdo stil.
klasa Për çdo (
boshllëk publik statik kryesor (Args varg) (

shuma int = 0;
// përdorni për çdo stil për të shfaqur dhe përmbledhur vlerat
për (int x: numra) (

shuma += x;
}
System.out.println("Shuma është: " + shuma) ;
}
}

Vlera është: 1
Vlera është: 2
Vlera është: 3
Vlera është: 4
Vlera është: 5
Vlera është: 6
Vlera është: 7
Vlera është: 8
Vlera është: 9
Vlera është: 10
Shuma është: 55

Siç mund ta shihni nga kjo dalje, stili "për-secil" për deklaratën automatikisht kalon nëpër elementët e grupit, nga indeksi më i ulët në indeksin më të lartë.

Megjithëse stili për secilin për ciklin përsëritet derisa të përpunohen të gjithë elementët e grupit, cikli mund të ndërpritet më herët duke përdorur një deklaratë pushimi. Për shembull, programi i mëposhtëm përmbledh vlerat e pesë elementëve të parë të grupit të numrave.

// Përdorimi i një deklarate pushimi në një cikli for-në për-çdo stil.
klasa ForCdo 2 (
boshllëk publik statik kryesor (Args varg) (
shuma int = 0;
int nums = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// përdorni një cikli for për të shfaqur dhe përmbledhur vlerat
për (int x: numra) (
System.out.println("Vlera është: " + x) ;
shuma += x; v nëse (x == 5) thyej; // stop loop pas marrjes së 5 vlerave
}
System.out.println("Shuma e pesë elementëve të parë është: " + shuma);
}
}

Programi gjeneron daljen e mëposhtme:

Vlera është: 1
Vlera është: 2
Vlera është: 3
Vlera është: 4
Vlera është: 5
Shuma e pesë elementëve të parë është: 15

Siç mund ta shihni, cikli ndalon ekzekutimin pas marrjes së vlerës së elementit të pestë. Deklarata break mund të përdoret gjithashtu me unaza të tjera Java. Ky operator do të diskutohet më në detaje në seksionet vijuese të këtij kapitulli.

Kur përdorni një lak për çdo, duhet të keni parasysh një gjë të rëndësishme: Variabla e saj e përsëritjes është një variabël vetëm për lexim sepse është e lidhur vetëm me grupin origjinal. Operacioni i caktimit të një vlere një ndryshoreje përsëritëse nuk ka efekt në grupin origjinal. Me fjalë të tjera, përmbajtja e një grupi nuk mund të ndryshohet duke i caktuar një vlerë të re një ndryshoreje të përsëritur. Për shembull, merrni parasysh programin e mëposhtëm:

// Ndryshorja për çdo cikli është vetëm për lexim.
klasa NoChange (
boshllëk publik statik kryesor (Args varg) (
int nums = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
për (int x: numra) (
System.out.print(x + " ");
x=x*10; // ky operator nuk ka asnjë efekt në grupin nums
}
System.out.println();
për (int x: numra)
System.out.print(x + " ");
System.out.println();
}
}

Cikli i parë for rrit vlerën e ndryshores së përsëritjes me 10. Megjithatë, ky operacion caktimi nuk ka efekt në grupin origjinal të numrave, siç mund të shihet në daljen e deklaratës së dytë për. Prodhimi i gjeneruar nga programi konfirmon këtë:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

Përsëritja në vargje shumëdimensionale

Një version i përmirësuar i ciklit for zbatohet gjithashtu për vargjet shumëdimensionale. Sidoqoftë, mbani në mend se në Java, vargjet shumëdimensionale përbëhen nga vargje vargjesh. (Për shembull, një grup dy-dimensionale është një grup vargjesh njëdimensionale.) Kjo është e rëndësishme kur përsëritet në një grup shumëdimensional, sepse rezultati i çdo përsëritjeje është grupi tjetër, jo një element i vetëm. Për më tepër, lloji i variablit të përsëritjes së ciklit for duhet të jetë i pajtueshëm me llojin e grupit që rezulton. Për shembull, në rastin e një grupi dydimensional, ndryshorja e përsëritjes duhet të jetë një referencë për një grup njëdimensional. Në përgjithësi, kur përdorni një cikli për çdo për të përsëritur përmes një grupi me madhësi N, objektet që rezultojnë do të jenë vargje me madhësi N-1. Për të kuptuar se çfarë rrjedh nga kjo, merrni parasysh programin e mëposhtëm. Ai përdor unazat e mbivendosura për të marrë elementë të renditur në rresht të një grupi dydimensional.

// Përdorimi i një cikli for-each-style për në një grup dy-dimensionale.
klasa ForCdo 3 (
boshllëk publik statik kryesor (Args varg) (
shuma int = 0;
int nums = int i ri;
// caktimi i vlerave të elementeve të grupit nums
për (int i = 0; i nums[i] [j] = (i+l)*(j+l) ; // përdorni një stil për secilin për lak për t'u shfaqur
// dhe përmbledhja e vlerave
për (int x: nums) (
për (int y: x) (
System.out.println("Vlera është: " + y);
shuma += y;
}
}
System.out.println("Shuma: " + shuma);
}

Ky program gjeneron daljen e mëposhtme:

Vlera është: 1
Vlera është: 2
Vlera është: 3
Vlera është: 4
Vlera është: 5
Vlera është: 2
Vlera është: 4
Vlera është: 6
Vlera është: 8
Vlera është: 10
Vlera është: 3
Vlera është: 6
Vlera është: 9
Vlera është: 12
Vlera është: 15
Shuma: 9 0

Linja e mëposhtme e këtij programi meriton vëmendje të veçantë:

për (int x: nums) (

Kushtojini vëmendje mënyrës së deklarimit të ndryshores x. Kjo variabël është një referencë për një grup njëdimensional të vlerave të plota. Kjo është e nevojshme sepse rezultati i çdo përsëritjeje të ciklit for është grupi tjetër në grupin nums, duke filluar me grupin e specifikuar nga elementi nums. Cikli i brendshëm for më pas përsëritet përmes secilit prej këtyre grupeve, duke shfaqur vlerat e secilit element.

Përdorimi i një laku të përmirësuar për

Meqenëse çdo stil për çdo deklaratë mund të kalojë vetëm në elementet e një grupi në mënyrë sekuenciale, duke filluar nga i pari dhe duke përfunduar me të fundit, mund të duket se ka përdorim të kufizuar. Megjithatë, nuk është kështu. Shumë algoritme kërkojnë përdorimin e këtij mekanizmi të veçantë. Një nga algoritmet më të përdorura është kërkimi. Për shembull, programi i mëposhtëm përdor një cikli for për të kërkuar një vlerë në një grup të parregulluar. Kërkimi ndalon kur të gjendet vlera e kërkimit.

// Kërkoni grupin duke përdorur një stil për çdo lak.
Kërkimi i klasës (
boshllëk publik statik kryesor (Args varg) (
int nums = ( 6, 8, 3, 7, 5, 6, 1, 4);
int val =5;
boolean gjetur = false;
// përdorni for loop në për-çdo stil
për (int x: numra) (
nëse (x == val) (
gjetur = e vërtetë;
pushim;
}
}
nëse (gjendet)
System.out.println ("Vlera e gjetur!");)

Në këtë rast, zgjedhja e stilit "për secilin" për ciklin for është plotësisht e justifikuar, pasi kërkimi përmes një grupi të parregulluar përfshin shikimin e secilit element në mënyrë sekuenciale. (Sigurisht, nëse grupi do të porositej, mund të përdoret kërkimi binar, i cili do të kërkonte një stil të ndryshëm të ciklit për t'u zbatuar.) Lloje të tjera aplikacionesh që përfitojnë nga cikli për secilin përfshijnë mesataren, gjetjen e vlerës minimale ose maksimale në një grup, kërkoni për kopje, etj.



Java, si pothuajse çdo gjuhë programimi, ka mjete për të siguruar që një pjesë e caktuar e kodit të përsëritet shumë herë, ose unazat, siç quhen zakonisht. Sythet në Java përfaqësohen nga deklarata të tilla si for dhe while, si dhe variacionet e tyre. Në mënyrë tipike, unazat përdoren për të përshkuar vargje njëdimensionale dhe shumëdimensionale dhe struktura të dhënash të përsëritura (përfshirë koleksionet) me qëllim që të gjenden elementë të caktuar dhe të veprojnë më tej mbi to. Megjithatë, kjo nuk është mënyra e vetme për të përdorur një mjet si cikli Java. Shembujt e përdorimit do të jepen ndërsa rishikohen.

Java: përshkrim dhe shembuj

Operatori themelor i ciklit në Java është while. Fragmenti i kodit i mbyllur në trupin e tij do të përsëritet derisa kushti i shprehjes së mbyllur në kllapa pasi të plotësojë vlerën logjike të së vërtetës. Forma e përgjithshme e deklaratës while është si më poshtë:

ndërsa (gjendja) (

//trup lak

Sapo vlera e kushtit logjik të pushojë së qeni e vërtetë, kodi i mbyllur në trupin e lakut do të ndalojë së ekzekutuari dhe kontrolli do të transferohet në linjën menjëherë pas tij.

Nëse trupi i lakut përmban vetëm një deklaratë, atëherë mbajtëset kaçurrelë mund të hiqen, por konsiderohet formë e mirë nëse ato janë gjithmonë të pranishme. Figura e mësipërme tregon një bllok diagram të funksionimit të këtij operatori.

Për qartësi, le të shohim shembullin e paraqitur në figurën më poshtë:

Numërimi i ndryshores së deklaruar fillimisht ka vlerën 1. Më pas shohim një shprehje logjike të mbyllur në kllapa pas emrit të operatorit. Do të jetë e vërtetë, d.m.th. kthen true përderisa vlera e variablit count është më e vogël ose e barabartë me 10. Në trupin e ciklit, me çdo kalim (përsëritje), vlera e ndryshores rritet me 1 dhe shfaqet në ekranin e konsolës. Vini re se kur ndryshorja arriti në 11, cikli pushoi së funksionuari.

Nëse vlera e variablit count fillimisht ishte e barabartë me 11, atëherë kushti i ciklit do të ishte false dhe programi as nuk do të hynte në trupin e tij.

Vlen të përmendet se sintaksa Java ju lejon të përdorni një deklaratë while pa një trup. Le të japim një shembull. Le të themi se kemi dy ndryshore i = 100 dhe j = 200, përballemi me detyrën e llogaritjes programore të mesatares së tyre aritmetike - për këtë mund të përdorim "boshllëkun" ndërsa:

ndërsa (++i< --j);

Si rezultat, vlera e cilësdo prej dy variablave do të jetë e barabartë me mesataren e vlerave të tyre origjinale. Siç mund ta shihni, laku funksionoi në mënyrë të përsosur pa trup dhe kreu të gjitha veprimet e nevojshme në shprehjen e kushtëzuar.

lak do-while

Në shembujt e mëparshëm, nëse shprehja e kushtëzuar fillimisht kthehej false, atëherë ekzekutimi i programit do të injoronte trupin e ciklit dhe do të vazhdonte. Sidoqoftë, shpesh lindin situata në të cilat ekzekutimi i kodit të përfshirë në trupin e lakut kërkohet të paktën një herë, pavarësisht nga vërtetësia e shprehjes së kushtëzuar. Me fjalë të tjera, ndodh që kontrollimi i së vërtetës së një shprehjeje të kushtëzuar kërkohet jo në fillim, por në fund të lakut. Një variacion i ciklit while i quajtur do-while mund ta sigurojë këtë funksionalitet. Ajo ka formën e mëposhtme:

bej(
//trup lak

) ndërsa(kusht);

Siç mund ta shohim, së pari ekzekutohet trupi i lakut dhe vetëm atëherë kontrollohet e vërteta e kushtit - dhe kështu me radhë çdo përsëritje.

Kodi i mësipërm do të funksionojë në të njëjtën mënyrë si me një kohë të rregullt. Megjithatë, nëse e vendosim numërimin në 11, trupi i ciklit do të ekzekutohej akoma një herë përpara se deklarata të testonte vërtetësinë e shprehjes.

Përshkrimi dhe shembuj të for - Java loop

Përfaqëson një formë gjuhësore universale dhe efikase në Java. Para versionit të pestë të Java SDK, ekzistonte vetëm një formë tradicionale e operatorit for, dhe pas kësaj u shfaq një e re - për secilën. Në këtë seksion do të shikojmë formën tradicionale të operatorit. për Java, cikli duket si ky:

Përpara se kontrolli të transferohet në kodin në trupin e ciklit, fillimisht inicializohet ndryshorja i, e cila vepron si numërues. Më pas, kontrollohet një shprehje e kushtëzuar që krahason numëruesin me një vlerë specifike, dhe nëse kthehet e vërtetë, trupi i ciklit ekzekutohet. Pastaj vlera e numëruesit ndryshohet me një hap të paracaktuar dhe shprehja e kushtëzuar kontrollohet përsëri, dhe kështu me radhë derisa kushti të bëhet false. Grafiku i rrjedhës më poshtë ilustron të gjitha fazat e ciklit.

Për një kuptim më të mirë, këtu është një shembull se si funksionon një cikli Java për:

Shohim që ndryshorja loopVal përdoret si numërues. Pas çdo përsëritjeje të ciklit, vlera e tij do të rritet me 1 dhe kjo do të vazhdojë derisa të arrijë në 11. Vini re se një variabël kontrolli mund të deklarohet jashtë deklaratës for, por nëse nuk keni ndërmend ta përdorni këtë ndryshore diku tjetër përveç në një lak, rekomandohet të deklarohet drejtpërdrejt në deklaratë. Mbani në mend se një ndryshore e deklaruar në vetë deklaratën ka një shtrirje brenda të njëjtit lak.

Ka situata kur duhet të deklaroni disa variabla të kontrollit të ciklit. Për Java, një lak ju lejon të specifikoni dy ose më shumë variabla të ndara me presje, dhe ta bëni këtë si gjatë inicializimit të tyre ashtu edhe gjatë përsëritjes. Një operator i tillë do të duket si ky:

for(int i = 1, int j = 10; i< j; ++i, --j) {}

Me çdo përsëritje, vlera e ndryshores i do të rritet me 1 dhe vlera e ndryshores j do të ulet me 1. Përsëritjet do të kryhen derisa i të bëhet më i madh ose i barabartë me j.

Karakteristikat e përdorimit të operatorit for

Cikli for është një dizajn mjaft fleksibël sepse të tre pjesët e tij (fillimi, gjendja dhe rritja/zvogëlimi) mund të përdoren për qëllime të tjera. Për shembull, në vend të një shprehjeje të kushtëzuar me një ndryshore kontrolli, mund të zëvendësoni çdo ndryshore logjike.

dalje boolean = false;

për (int i = 0; !dalje; ++i) (

Në shembullin e mësipërm, ne mund të vëzhgojmë se si funksionimi i lakut është absolutisht i pavarur nga ndryshorja e kontrollit i dhe numri i përsëritjeve varet vetëm nga momenti në të cilin ndryshorja e daljes bëhet e vërtetë. Për më tepër, ndryshorja e kontrollit mund të hiqet plotësisht nga cikli dhe kjo nuk do të ndikojë në funksionimin e saj në asnjë mënyrë: for(; !exit;) (). Megjithëse kjo nuk është mënyra më e zgjuar për të programuar, ndonjëherë mund të jetë e dobishme. Gjëja kryesore është të sigurohet një situatë në të cilën ndryshorja do të marrë vlerën e nevojshme për të dalë nga laku, në mënyrë që të mos e kthejë atë në një të pafundme.

Për Java, një lak mund të deklarohet gjithashtu në këtë mënyrë: for(; ;) (). Ky është një shembull tipik i një laku të pafund me kushte të veçanta ndërprerjeje. Ne do të flasim se si të ndërpresim këtë lloj ciklesh pak më vonë.

Për çdo lak stili

Cikli Java foreach përdoret gjithmonë për të përsëritur në mënyrë sekuenciale elementët e një grupi ose ndonjë tjetër dhe për të kryer disa operacione të përsëritura mbi to. Një shembull i kësaj forme të deklaratës for është paraqitur më poshtë:

Emri deklarohet si një ndryshore përsëritëse, dhe grupi i emrave të vargjeve të deklaruara më parë vepron si argumenti i dytë i operatorit. Emri i ndryshores do të marrë vlerat e secilit element të grupit me radhë derisa të merren të gjithë elementët e tij. Duhet të theksohet se lloji i ndryshores duhet të jetë i pajtueshëm me llojin e elementeve që ruhen në grup. Gjithashtu, ndryshorja e emrit është vetëm për lexim dhe përpjekja për ta ndryshuar atë nuk do të ndryshojë elementin në vetë grup.

Lloko deklaratat e ndërprerjes

Ekzistojnë tre deklarata të ndërprerjes së ciklit: pushim, kthim dhe vazhdo. Dy të parat janë në gjendje të ndërpresin plotësisht ciklin, ndërsa vazhdimi ndërpret vetëm përsëritjen aktuale. Nëse përdorni një lak qëllimisht të pafund në Java në kodin tuaj, këta operatorë duhet të jenë të pranishëm në të. Le të shohim një shembull të thjeshtë të përdorimit të pushimit:

Edhe pse kjo deklaratë për ka 11 përsëritje, vetëm 8 do të ekzekutohen, sepse kur numërimi i është i barabartë me 7, kushti që përmban deklaratën break do të aktivizohet.

Deklarata kthyese funksionon në mënyrë të ngjashme, me ndryshimin se jo vetëm siguron dalje nga cikli Java, por edhe nga metoda në të cilën vendoset cikli.

Përdorimi i pushimit si goto

Duhet pasur parasysh se thyerja ndërpret vetëm lakun në trupin e të cilit ndodhet drejtpërdrejt, d.m.th. nëse e përdorni në një lak të ndërthurur, laku i jashtëm nuk do të ndalojë së funksionuari. Për ta bërë këtë, deklarata break mund të përdoret si një formë e civilizuar e goto.

Në këtë version, ky operator përdoret së bashku me një etiketë, e cila ju lejon të organizoni një dalje jo vetëm nga sythe, por edhe nga çdo bllok kodi. Një etiketë është një identifikues i emërtuar siç duhet i ndjekur nga një dy pika. Etiketa deklarohet në fillim të bllokut të kodit që shënohet. Për të ndërprerë ekzekutimin e një blloku të shënuar, duhet të deklaroni në vendin e duhur: break label_name. Konsideroni shembullin në figurën më poshtë:

Kodi deklaron tre blloqe me emrat e etiketës Një, Dy dhe Tre, respektivisht. Deklarata e ndërprerjes e emërtuar Dy është e vendosur në të tre blloqet, por kur të aktivizohet, programi do të dalë nga blloqet Tre dhe Dy dhe do të vazhdojë ekzekutimin në bllokun Një. Ato. në tastierë do të shohim dy mesazhe: Tre dhe Një.

konkluzioni

Mësuam për konceptin e sytheve në Java, deklaratat kryesore while dhe for, dhe do-while e tyre dhe për secilën formë, përkatësisht. Për një kuptim më të mirë, ju rekomandojmë të bëni ushtrime duke përdorur këta operatorë në forma të ndryshme, si dhe mënyra të ndryshme për t'i ndërprerë ato dhe për të kaluar nga një bllok në tjetrin.

Në këtë tutorial, ne do të mësojmë se si të riekzekutojmë pjesë të kodit tonë në një mënyrë të kontrolluar duke parë lloje të ndryshme të sytheve në Java. Le të hedhim një vështrim më të afërt të cikleve: derisa, bej-derisa, për. Ne do të përpiqemi të përcaktojmë se në cilat raste cili cikël është më i përshtatshëm për përdorim.

Pastaj do të shikojmë shkurtimisht temën e numrave të rastit ( e rastitnumrat). Le të shohim Java-Klasa E rastësishme dhe si mund të na ndihmojë në lojën tonë.

Një lak, siç sugjeron emri, është një mënyrë për të ekzekutuar të njëjtën pjesë të kodit aq herë sa është e nevojshme (pa përsëritur domosdoshmërisht rezultatin e ekzekutimit të kodit në lak). Numri i përsëritjeve të ciklit mund të përcaktohet paraprakisht ose i panjohur për vetë programuesin. Ne do të shikojmë llojet kryesore të sytheve që gjuha na ofron të përdorim. Java. Dhe më pas do t'i prezantojmë disa prej tyre në lojën tonë, duke e përmirësuar kështu atë.

Ndërsa Loop

Cikli derisa ka sintaksën më të thjeshtë. Mbani mend nëse-udhëzime që i kemi studiuar pak më parë. Në shprehjen e kushtëzuar të operatorit nëse(çfarë mbyllet në kllapa pas fjalës nëse) mund të vendosni pothuajse çdo kombinim të operatorëve dhe variablave. Nëse shprehja është e vërtetë ( e vërtetë), pastaj kodi i mbyllur në trupin e bllokut nëse do të kompletohet. Në mënyrë të ngjashme në lak derisa vendosim një shprehje që mund të vlerësohet në e vërtetë ose i rremë siç tregohet në këtë kod:

Int x = 10; ndërsa (x > 0) ( x--; //x zvogëlohet me një çdo kalim të ciklit)

Cfare po ndodh ketu? Gjëja e parë jashtë lakut derisa ne deklaruam një variabël x lloji ndër dhe ia caktoi vlerën “10” kësaj ndryshoreje. Pastaj fillon cikli derisa, në kushtet e së cilës është shkruar x > 0”– kjo do të thotë se kodi i shkruar në trupin e lakut derisa do të ekzekutohet për aq kohë sa variabla x më shumë 0 dhe kushti nuk do të arrijë vlerën i rremë. Prandaj, kodi do të ekzekutohet 10 herë (x=10,x>0; x=9,x>0; x=8,x>0; x=7,x>0; x=6,x>0; x=5,x>0; x=4,x>0; x=3,x>0; x=2,x>0; x=1,x>0). Në kalimin e parë të ciklit x = 10, në të dytën tashmë 9 , në të tretën 8 etj. Dhe kur x do të jetë i barabartë 0 , atëherë nuk do të plotësohet kushti për të hyrë në ciklin, dhe programi do të vazhdojë nga rreshti tjetër pas përfundimit të ciklit.

Njësoj si në operator nëse, është e mundur një situatë në të cilën cikli nuk do të ekzekutohet as edhe një herë. Hidhini një sy shembullit të mëposhtëm:

Int x = 10; while(x > 10)( //disa kod //por nuk do të ekzekutohet kurrë ndërsa x është më i madh se 10)

Për më tepër, nuk ka asnjë kufi për kompleksitetin e shprehjes së kushtit ose sasinë e kodit që mund të shkruhet në trupin e ciklit:

Int playerLives = 3; int alienShips = 10; ndërsa (playerLives >0 && alienShips >0)( //Të gjitha kodet e lojës këtu //... //... // etj. ) //programi do të vazhdojë këtu kur ose playerLives ose alienShips = 0

Ky lak do të funksionojë deri në variablin lojtari jeton, ose alienships nuk do të jetë e barabartë ose më e vogël se zero. Sapo të ndodhë një nga këto kushte, shprehja në kusht do të marrë vlerën i rremë dhe programi do të vazhdojë nga rreshti tjetër pasi të përfundojë cikli.

Vlen të përmendet se sapo programi të hyjë në trupin e ciklit, ai do të ekzekutohet edhe nëse kushti i ciklit bëhet i rremë, diku në trupin e lakut, sepse gjendja kontrollohet vetëm me hyrjen:

Int x = 1; ndërsa (x > 0)( x--; //x tani është e barabartë me 0 dhe kushti herën tjetër do të jetë false //Por kjo rresht do të ekzekutohet //Dhe kjo //Edhe kjo)

Në shembullin e mësipërm, trupi i lakut do të ekzekutohet një herë. Përveç kësaj, ju mund të vendosni një kusht të tillë që lak do të funksionojë përgjithmonë - kjo quhet cikël pa fund. Ja një shembull:

Int x = 0; ndërsa (e vërtetë)( x++; //Unë do të bëhem shumë i madh!)

Prodhimi i ciklit të tyre. Fjalë kyçe thyej

Po sikur vërtet të kemi nevojë të përdorim një lak të pafund, por në një mënyrë të tillë që të vendosim se në cilën pikë të dalim prej tij. Për këtë qëllim në Java ka një fjalë kyçe thyej. Ne mund të përdorim thyej kur duhet të "dalim" nga laku:

Int x = 0; ndërsa (e vërtetë)( x++; //Unë do të bëhem shumë i madh! thyej; //Jo, nuk do të bësh! //kodi këtu nuk do të arrihet)

Me siguri tashmë e keni marrë me mend se është e mundur të kombinohen mjete të ndryshme vendimmarrëse, si p.sh nëse,tjetër,kaloni brenda lakut tonë derisa dhe cikle të tjera, të cilat do t'i shqyrtojmë më poshtë. P.sh.

Int x = 0; int tooBig = 10; while(true)( x++; //Unë do të bëhem shumë i madh! if(x == shumë i madh)( thyej; //Jo, nuk do. ) //kodi këtu do të jetë i disponueshëm derisa x të jetë i barabartë me 10)

Mund të shkruajmë shumë variacione të tjera të ndryshme, por për ne zbatimi praktik i kësaj njohurie është më i rëndësishëm, ndaj nuk do të thellohemi tani. Le të shohim një koncept tjetër që mund të manipulohet në një lak.

Fjalë kyçe vazhdojnë

vazhdojnë funksionon pothuajse njësoj si thyej. Fjalë kyçe vazhdojnë do t'ju largojë nga trupi i lakut, por më pas provoni shprehjen e kushtit në vend që të vazhdoni nga mbajtësja kaçurrelë mbyllëse e lakut, siç do të ndodhte me thyej. Shembulli i mëposhtëm tregon përdorimin vazhdojnë:

Int x = 0; int tooBig = 10; int tooBigToPrint = 5; ndërsa (e vërtetë)( x++; //Unë do të bëhem shumë i madh! nëse (x == shumë i madh)( thyej; ) //Jo, nuk do. //kodi këtu do të jetë i disponueshëm vetëm derisa x të jetë i barabartë me 10 if(x > = tooBigToPrint)( //nuk do të printohet më në ekran, por cikli do të vazhdojë; ) //kodi këtu do të jetë i disponueshëm derisa x të jetë i barabartë me 5 //kodi për të printuar x në ekran )

Shpjegim: ne deklarojmë dhe inicializojmë variablat. Ne hyjmë në lak dhe i shtojmë vlerës së ndryshores x njësi (tani x= 1). Kontrolloni "A është 1 i barabartë me 10?" - i rremë- operatori i parë nëse nuk ekzekutohet. Kontrolli tjetër është "A është 1 më i madh apo i barabartë me 5?" - i rremë- operatori i dytë nëse nuk ekzekutohet. Ne nxjerrim x në ekran.

Le të shqyrtojmë opsionin kur x do të marrë vlerën 5 kur futet në lak. Ne hyjmë në lak dhe i shtojmë vlerës së ndryshores x njësi (tani x= 6). Po kontrollon "6 është 10?" - i rremë- operatori i parë nëse nuk ekzekutohet. Kontrolli tjetër është "6 është më i madh ose i barabartë me 5?" - e vërtetë- hyjmë në trup nësevazhdojnë, dilni nga cikli dhe kontrolloni gjendjen për të hyrë në lak.

Tani opsioni është kur x do të marrë vlerën 9 kur futet në lak. Ne hyjmë në lak dhe i shtojmë vlerës së ndryshores x njësi (tani x= 10). Kontrolloni "A është 10 e barabartë me 10?" - e vërtetë- hyjmë në trup nësethyej, dilni nga cikli dhe kodi do të vazhdojë përtej mbajtësit kaçurrelë mbyllës të lakut derisa.

lak do-while

Pothuajse njësoj si cikli i mëparshëm me përjashtim të një veçorie - kontrolli i ekzekutimit të shprehjes së kushtëzuar do të ndodhë pas trupit të ciklit. Kjo do të thotë se cikli bej-derisa do të ekzekutohet gjithmonë të paktën një herë. Hidhini një sy shembullit:

Int x = 0; bëj ( x++; ) ndërsa (x< 10); //x теперь = 10

Fjalë kyçe thyej,vazhdojnë

për lak

Cikli për ka një sintaksë më komplekse se derisa Dhe bej-derisa, pasi kërkon pak më shumë manipulim për t'u inicializuar. Le t'i hedhim një vështrim në fillim dhe pastaj ta ndajmë:

Për(int i = 0; i< 10; i++){ //Что-то, что должно произойти 10 раз будет записано здесь }

Si e sheh këtë përpiluesi? Si kjo:

For(deklarimi dhe inicializimi; kushti; ndryshimi pas çdo kalimi të lakut) ( // trupi i ciklit)

  • Deklarimi dhe inicializimi– kemi krijuar një variabël të ri të llojit ndër Me emër i dhe i caktoi një vlerë 0 ;
  • gjendja– si ciklet e tjera të diskutuara më herët, këtu kontrollojmë kushtin për të hyrë në cikël. Nëse vlera llogaritet si e vërtetë, pastaj hyjmë në trupin e lakut;
  • Ndryshimi pas çdo cikli- në shembullin e mësipërm i++ do të thotë që pas kalimit të radhës të ciklit arrijmë në vlerën e ndryshores i shtoni një (1). Për më tepër, ne mund të shkruajmë në ndryshimin e ndryshores dhe i për të zbritur një, për shembull:
for(int i = 10; i > 0; i--)( //numërimi mbrapsht) //tasti i fillimit, i = 0

Fjalë kyçe thyej,vazhdojnë mund të përdoret edhe në këtë cikël.

Cikli për merr kontrollin e inicializimit, testimit të gjendjes dhe modifikimit të variablave. Le ta provojmë këtë cikël në praktikë në aplikacionin tonë menjëherë pasi të njihemi numra të rastit Dhe metodat.

Artikujt më të mirë mbi këtë temë