Tee silmukan aikana - Do while loop

Image
Tee silmukan vuokaavio

Useimmissa ohjelmointi kieliä, eli tehdä, kun silmukka on kontrollivuotestauksen toteamus , joka suorittaa koodiosion ainakin kerran, ja sitten joko suorittaa toistuvasti estää tai lopettaa sen suorittamista, riippuen tietty boolean ehto lopussa lohkon .

Tehdä, kun konstrukti koostuu menetelmästä symbolin ja kunto. Ensin suoritetaan lohkon sisällä oleva koodi ja sitten ehto arvioidaan. Jos ehto on tosi , lohkon sisäinen koodi suoritetaan uudelleen. Tämä toistuu, kunnes ehto muuttuu vääräksi . Koska "do while" -silmukat tarkistavat kunnon lohkon suorittamisen jälkeen, ohjausrakenne tunnetaan usein myös testin jälkeisenä silmukana . Toisin kuin while-silmukassa , joka testaa ehdon ennen kuin lohkon koodi suoritetaan, do-while -silmukka on exit-condition-silmukka. Tämä tarkoittaa, että koodi on aina suoritettava ensin ja sitten lauseke tai testiehto arvioidaan. Jos se on totta, koodi suorittaa silmukan rungon uudelleen. Tämä prosessi toistetaan niin kauan kuin lauseke on tosi. Jos lauseke on väärä, silmukka päättyy ja ohjaus siirtyy käskyyn do-while -silmukan jälkeen. Toisin sanoen, kun taas while-silmukka asettaa lauseen totuuden ennakkoedellytykseksi koodin suorittamiselle, do-while -silmukka tarjoaa toiminnon käynnissä olevan suorituksen, joka voidaan poistaa ehdon virheellisyyden perusteella, mikä virheellisyys ( ts . Totuus ehdon negaatio) asetetaan seuraavaksi ehdoksi .

On mahdollista ja joissakin tapauksissa toivottavaa, että ehto arvioi aina totta, luo loputon silmukka . Kun tällainen silmukka luodaan tarkoituksella, on yleensä toinen ohjausrakenne (kuten katkaisulauseke ), joka sallii silmukan lopettamisen.

Jotkut kielet saattavat käyttää erilaista nimeämistapaa tämän tyyppiseen silmukkaan. Esimerkiksi Pascal- ja Lua- kielillä on " toista kunnes " -silmukka, joka jatkuu, kunnes ohjauslauseke on totta (ja päättyy sitten) - kun taas "kun" -silmukka kulkee, kun taas ohjauslauseke on totta (ja päättyy, kun lausekkeesta tulee väärä).

Vastaavat rakenteet

do {
    do_work();  
} while (condition);

vastaa

do_work();

while (condition) {
    do_work();
}

Tällä tavoin do ... while -silmukka tallentaa ensimmäisen "silmukan pohjustuksen" silmukkaa do_work();edeltävälle riville while.

Niin kauan kuin jatkaa lausuma ei käytetä, edellä on teknisesti sama kuin jäljempänä (vaikka nämä esimerkit eivät ole tyypillisiä tai moderni tyyli käyttää jokapäiväisessä tietokoneet):

while (true) {
   do_work();
   if (!condition) break;
}

tai

LOOPSTART:
    do_work();
    if (condition) goto LOOPSTART;

Osoitetaan, kun tehdään silmukoita

Nämä esimerkkiohjelmat laskevat viiden kertoimen käyttäen vastaavan kielensä syntaksia do-while -silmukalle.

ActionScript 3

var counter: int = 5;
var factorial: int = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

trace(factorial);

Ada

with Ada.Integer_Text_IO;

procedure Factorial is
    Counter   : Integer := 5;
    Factorial : Integer := 1;
begin
    loop
        Factorial := Factorial * Counter;
        Counter   := Counter - 1;
        exit when Counter = 0;
    end loop;

    Ada.Integer_Text_IO.Put (Factorial);
end Factorial;

PERUS

Varhaiset BASIC-tiedostot (kuten GW-BASIC ) käyttivät syntaksia WHILE / WEND. Nykyaikaiset BASICit, kuten PowerBASIC, tarjoavat sekä WHILE / WEND- että DO / LOOP-rakenteita, syntaksilla kuten DO WHILE / LOOP, DO UNILIL / LOOP, DO / LOOP WHILE, DO / LOOP UNL ja DO / LOOP (ilman ulompaa testausta, mutta ehdollisella EXIT LOOP: lla jossain silmukan sisällä). Tyypillinen BASIC-lähdekoodi:

Dim factorial As Integer
Dim counter As Integer

factorial = 1
counter = 5

Do 
    factorial = factorial * counter
    counter = counter - 1
Loop While counter > 0

Print factorial

C #

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

System.Console.WriteLine(factorial);

C

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

printf("factorial of 5 is %d\n", factorial);

Do-while (0) -lausekkeita käytetään myös yleisesti C-makroissa keinona kääriä useita lauseita tavalliseen (toisin kuin yhdistettyyn) lauseeseen. Se tekee makron jälkeen tarvittavasta puolipisteestä, joka tarjoaa toiminnallisemman ulkonäön yksinkertaisille jäsentäjille ja ohjelmoijille sekä välttää laajennusongelman if. Sitä suositellaan CERT C -koodausstandardisäännössä PRE10-C.

C ++

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--;
} while (counter > 0);

std::cout << "factorial of 5 is "<< factorial << std::endl;

CFScript

factorial = 1;
count = 10;

do {
    factorial *= count--;
} while (count > 1);

writeOutput(factorial);

D.

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; // Multiply, then decrement.
} while (counter > 0);

writeln("factorial of 5 is ", factorial);

Fortran

Vanhalla FORTRAN 77: llä ei ole DO-WHILE -rakennetta, mutta sama vaikutus voidaan saavuttaa GOTO: lla:

      INTEGER CNT,FACT
      CNT=5
      FACT=1
    1 CONTINUE
      FACT=FACT*CNT
      CNT=CNT-1
      IF (CNT.GT.0) GOTO 1
      PRINT*,FACT
      END

Fortran 90: ssä ja uudemmissa ei ole myöskään do-while-rakennetta, mutta sillä on while-silmukkarakenne, joka käyttää avainsanoja "do while" ja on siten itse asiassa sama kuin for -silmukka .

program FactorialProg
    integer :: counter = 5
    integer :: factorial = 1
    
    factorial = factorial * counter
    counter = counter - 1
    
    do while (counter > 0) ! Truth value is tested before the loop
        factorial = factorial * counter
        counter = counter - 1
    end do
    
    print *, factorial
end program FactorialProg

Java

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

System.out.println("The factorial of 5 is " + factorial);

//============================================//
// The below function does the same as above. //
//============================================//

int counter = 5;
int factorial = 1;

while (counter > 0){
    factorial *= counter--; /* Multiply, then decrement. */
}

System.out.println("The factorial of 5 is " + factorial);

JavaScript

let counter = 5; // Declaring two variables, counter and factorial 
let factorial = 1; 

do {
    factorial *= counter--; //What will be looped
} while (counter > 0); //The looping conditions

console.log(factorial); //Showing the result

Kotlin

var counter = 5
var factorial = 1
//These line of code is almost the same as the above JavaScript codes, the only difference is the keyword that shows the results
do {
    factorial *= counter--
} while (counter > 0)

println("Factorial of 5 is $factorial")

Pascal

Pascalilla ei ole tehtävää / aikaa; sen sijaan sillä on toisto / asti. Kuten johdannossa mainittiin, voidaan katsoa, ​​että toisto / asti vastaa 'do-koodia, kun ei lauseketta' -rakennetta.

factorial := 1;
counter := 5;
repeat
   factorial := factorial * counter;
   counter := counter - 1; // In Object Pascal one may use dec (counter);
until counter = 0;

PHP

$counter = 5;
$factorial = 1;

do {
    $factorial *= $counter--;
} while ($counter > 0);

echo $factorial;

PL / I

PL / I DO lausuma subsumes toimintoja jälkeisen testisilmukassa ( siihen asti, kunnes ), ennen testiä silmukka ( tehdä, kun ), ja silmukka . Kaikki toiminnot voidaan sisällyttää yhteen lausekkeeseen. Esimerkki näyttää vain "tee asti" -syntaksin.

declare counter   fixed initial(5);
declare factorial fixed initial(1);

do until(counter <= 0);
    factorial = factorial * counter;
    counter = counter - 1;
end;

put(factorial);

Python

Pythonilta puuttuu tietty tehtävä, kun taas virtauksen ohjausrakenne. Vastaava voidaan kuitenkin rakentaa hetkellisestä silmukasta, jossa on tauko.

counter = 5
factorial = 1

while True:
    factorial *= counter
    counter -= 1
    
    if counter == 0:
        break
    
print(factorial)

Maila

Racketissä, kuten muissakin Scheme- toteutuksissa, "named-let" on suosittu tapa toteuttaa silmukoita:

#lang racket
(define counter 5)
(define factorial 1)
(let loop ()
    (set! factorial (* factorial counter))
    (set! counter (sub1 counter))
    (when (> counter 0) (loop)))
(displayln factorial)

Vertaa tätä ensimmäiseen esimerkkiin Racketin while loop -esimerkistä. Huomaa, että nimetty let voi myös ottaa argumentteja.

Maila ja kaavio tarjoavat myös oikean do-silmukan.

(define (factorial n)
    (do ((counter n (- counter 1))
        (result 1 (* result counter)))
    ((= counter 0) result) ; Stop condition and return value.
    ; The body of the do-loop is empty.
    ))

Rubiini

counter = 10
factorial = 2

begin
  factorial *= counter
  counter -= 2
end while counter > 1

puts factorial

Rupattelu

| counter factorial |
counter := 5.
factorial := 1.

[counter > 0] whileTrue: 
    [factorial := factorial * counter.
    counter := counter - 1].

Transcript show: factorial printString

Nopea

Swift 2.x ja uudemmat:

var counter = 5
var factorial = 1

repeat {
    factorial *= counter
    counter -= 1
} while counter > 0

print(factorial)

Swift 1.x:

var counter = 5
var factorial = 1

do {
    factorial *= counter
    counter -= 1
} while counter > 0

println(factorial)

Visual Basic .NET

Dim counter As Integer = 5
Dim factorial As Integer = 1

Do
    factorial *= counter
    counter -= 1 
Loop While counter > 0

Console.WriteLine(factorial)

Katso myös

Viitteet

Ulkoiset linkit