2023(e)ko otsailaren 12(a), igandea

4. astea | WHILE-DO eta REPEAT-UNTIL: Segida baten batukaria

Demagun ondoko segidaren balioa lortu nahi dugula:








Ikus daitekeenez, batetik batugaiak gero eta txikiagoak dira balio absolutuz, eta bestetik zeinua aldatuz doa. Segidaren balioa batugaien batura algebraikoa dela kontsideraturik, arazoa determinaturik geratuko da batugaien kopurua ezagutzean, baina demagun zenbat batugai datua zeharka ematen dela, demagun teklatutik sartzen den datua prezisioa dela. Adibidez, segidaren kalkuluak milakoen doitasuna izango duela; hau da, segidari metatu egingo zaion azken batugaiaren balio absolutua 0.001 baino txikiagoa izango da, eta horrez gero prozesu errepikakorra etengo da.



Algoritmoa:


  1. Doitasuna teklatutik irakurri, rDoitasuna aldagaiari balioa eman

  2. Hasieraketak. Lau izango dira, alde batetik emaitza partzialak gordeko dituen rEmaitza aldagaiak behar duena, eta bestetik begiztan sartzea bermatzen duen uneko batugaiaren balioa eta berari dagokion zeinua, eta laugarrenik batugaiak lortzeko erabili behar den iKontagailua kontagailua

  3. Begiztaren iterazio bakoitzeko: uneko batugaiaren balioa kalkulatu eta emaitzari metatu, hurrengo begiztarako prestakizunak burutu (kontagailua inkrementatu, zeinua aldatu). Azken batugaia (balio absolutuan) doitasuna baino txikiago izan bada begiztatik irten

  4. Metagailuak gordetzen duena pantailaratu, horixe delako bilatzen den emaitza








WhileSegida1.pas


Goiko segida kalkulatzen duen WhileSegida1.pas iturburu-programa exekutatuz honelako irteera lor daiteke:









WhileSegida1.pas programa horri ondoko aldaketak egin eta zer gertatzen den aztertu:


  1. rEmaitza:=0.0; agindua kendu

  2. rBatugaia:=77.7; agindua kendu

  3. iZeinua:=1; agindua kendu

  4. iKontagailua:=1; agindua kendu

  5. Begizta barruko iKontagailua:=iKontagailua+1; agindua kendu

  6. Begizta barruko WriteLn agindua kendu

  7. Begizta barruko iZeinua:=iZeinua*(-1); agindua kendu

  8. Begizta kontrolatzen duen baldintza aldatu eta > eragilearen ordez jarri >= konparatzailea


Proposatzen den 8. aldaketa egitean, eta sarrerako datua 0.01 neurriko doitasuna balitz, ondoko bi irudietako emaitzak lortuko lirateke:





while abs(rBatugaia) > rDoitasuna DO







while abs(rBatugaia) >= rDoitasuna DO








WhileSegida2.pas


Goiko segida kalkulatzen duen WhileSegida2.pas iturburu-programa bertsio honek ez dauka alde handirik WhileSegida1.pas programarekiko, oraingo honetan batugai bakoitzaren zeinua kontrolatzeko ez da iZeinua aldagaia erabiltzen. Bigarren bertsio honetan iBatugaia aldagaiaren balioa beti positiboa izango da eta berarekin metagailuari batuketa egiten zaio batzuetan, beste batzuetan berriz kenketa egiten zaio metagailuari.



Bigarren bertsio honetan rBatugaia:=77.7; hasieraketa berriro egiten da, horrela bermatzen da programaren exekuzioa WHILE-DO barrura sartzen dela. Argi dago 77.7 kopurua guztiz arbitrarioa dela eta horregatik programa ez dela erabat txukun geratzen.







WhileSegida3.pas


Goiko segida kalkulatzen duen WhileSegida3.pas iturburu-programa exekutatuz honelako irteera lor daiteke:











WhileSegida3.pas programa honetan rBatugaia:=77.7; hasieraketa egin ordez lehen batugaia WHILE-DO egituratik kanpo kalkulatzen da.







RepeatSegida1.pas


Aurreko WhileSegida1.pas eta WhileSegida2.pas programetan rBatugaia:=77.7; hasieraketa egin izan da, horrela ziurtatzen baita programaren fokoa WHILE-DO sententziaren barrura sartzen dela.



RepeatSegida1.pas iturburu-programa honetan REPEAT-UNTIL egitura erabili denez, ez dago zertan rBatugaia aldagaia hasieratu behar REPEAT-UNTIL aginduak lehendabiziko sarrera irekita duelako eta bere barruan dauden sententziak beti exekutatuko dira gutxienez behin. Iturburu-programa exekutatuz honelako irteera lor daiteke:





WHILE-DO aginduaren logika eta REPEAT-UNTIL aginduaren logikoa aurkakoak dira. WHILE-DO aginduan begiztaren barrukoa exekuatuko da baldintzaren emaitza egia den bitartean. Eta REPEAT-UNTIL aginduan begiztaren barrukoa exekutatuko da baldintzaren emaitza egia izan arte (hau da, begiztaren barrukoa exekutatuko da baldintzaren emaitza gezurra den bitartean).




Horregatik, ondoko bi baldintza hauek baliokideak dira:





  while abs(rBatugaia) > rDoitasuna do   
  ...





  ...
  until abs(rBatugaia) <= rDoitasuna ;   



Gogoratu De Morgan Legeak eta haien azalpen grafikoak:






Ikusi bestela RepeatSegida1.pas programaren irteera hau eta alderatu aurreko WhileSegida1.pas programaren irteerarekin, bietan noski 0.01 neurriko doitasuna ematean:







iruzkinik ez:

Argitaratu iruzkina