Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Kuidas lahendada võrratusi Mathematics abil

Käesolev võrratuste lahendamise juhend õpetab võrratusi lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.

Kui kahe avaldise (arvu) vahel on võrratusmärk (<, >, <= või >= ), siis sellist seost nimetatakse võrratuseks.

Võrratuste ja nende ettekujutamine joonisel annab parema mõistmise võrratuste lahendamisele.

Võrratustel võib olla

a)      üks lahend

b)      mitu või lõpmatu arv lahendeid

c)      lahendid võivad puududa

Võrratuste lahendamine tähendab selle kõigi lahendite leidmist. Ülesanded võivad olla antud tekstiga „leia ühine positiivsus- või negatiivsuspiirkond“. Ka sellisel juhul on tegemist võrratuste lahendamise ülesannetega.

 

Ruut- ja lineaarne võrratus

On antud järgmised võrratused, mis tuleb lahendada.

ruutvõrratus

lineaarvõrratus

Võrratuse lahendamiseks tuleb see sisestada Mathematics töölehele (Worksheet) viisil, et nende võrratuste vahel on sõna and. See annab programmile teada, et tegemist on kahe võrratuse samaaegse lahendamisega.

 Microsoft Mathematics

Vajuta enter, tulemusena kuvatakse lahendus x > 3. See on mõlema võrratuse ühine piirkond.

Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solveIneq ja mille lõpus on „x“. SolveIneq tähendab et lahednatakse võrratust ja x tähistab, et seda lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

Microsoft Mathematics

Selleks, et paremini mõista, mida tähendab võrratuse lahendamine graafiliselt, kuva antud tulemus joonisel. Selleks vajuta lingil „plot this inequality“. Joonisel on näha viirutatud ala, mis asub x-teljel number 3-st paremal. See iseloomustabki lahendust x > 3.

Microsoft Mathematics 

Selleks, et aru saada kuidas need kaks võrratust kokku sellise tulemuse annavad, kirjutame need üles võrranditena ja kuvame joonisel.

Töölehele sisesta see võrrand järgmisel kujul: clip_image012[6] ja vajuta enter. Tulemusena kuvatakse võrrandi lahendid, kuid praegusel juhul huvitab meid rohkem graafik.

Microsoft Mathematics

Vajuta lingile „plot both sides of this expression in 2D“. Kõrvutades antud tulemus esialgse võrratuse graafikuga, on näha et mõlemad graafikud on positiivsed alates kolmest, ehk siit jooniselt on lihtne välja lugeda nende võrratuste lahend x > 3.

 Microsoft Mathematics

Leia ühine negatiivsuspiirkond

Olgu antud kaks võrrandit ning ülesanne on leida ühine negatiivsuspiirkond.

ruutvõrrand

lineaarvõrrand

Ülesande tekst nõuab, et need mõlemad võrrandid tuleb teisendada võrratusteks ja seejärel lahendada. Seega ülesande täitmiseks Mathematics abil on tarvis need võrratustena sisestada töölehele järgmisel kujul.

mathematics

Mõlema võrrandi puhul on = y ära vahetatud võrratusega < 0. Ehk siis leitakse mõlema võrratuse ühised lahendid, mis on väiksemad kui 0.

Sisesta see Mathematics töölehele ja vajuta enter. Mathematics annab lahenduseks 3 varianti: x < -1, x > 5/3 ja x < 3.

Microsoft Mathematics 

Kuvame selle tulemuse graafikul, vajutades lingil „plot this inequality“. Graafiline lahendus on viirutatud ala joonisel.

 Microsoft Mathematics

Vaata nüüd kuidas need graafikud joonisel välja näevad ja miks tekkis lahenduseks selline situatsioon.
Sisesta antud võrrandid töölehele ja vajuta enter.

võrrandisüsteem

Microsoft Mathematics

 

Kuva need graafikud joonisel vajutades linki „plot both sides of this expression in 2D“. Alljärgneval joonisel on näha graafiliselt tulemus mõlema graafiku negatiivsest piirkonnast. See on vasakul pool y-telge alates sellest punktist kus parabool on allpool x-telge. Y-teljest paremal pool on näha väike kolmnurkne piirkond, kus parabool on allpool x telge ning sirge pole veel jõudnud veel x-telge ületada.

Microsoft Mathematics

 

 

Kuidas lahendada võrrandeid Mathematics abil

Käesolev võrrandite lahendamise juhend õpetab võrrandeid lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.

Võrrandite ja nende kuvamine joonisel annab parema mõistmise võrrandite lahendamisele.

Võrranditel võib olla

a)      üks lahend

b)      mitu või lõpmatu arv lahendeid

c)      lahendid võivad puududa

 

Kaks ruutvõrrandit

Antud võrrandi mõlemal pool on ruutvõrrand seega on siin situatsioon, kus üks ruutvõrrand võrdub teise ruutvõrrandiga.

kaks ruutvõrrandit

1.      Kirjuta Mathematics töölehele (Worksheet) ülaltoodud võrrand ja vajuta enter.

Microsoft Mathematics

2.      Mathematics väljastab koheselt võrrandi tulemuse, x=-3.

Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solve ja mille lõpus on „x“. See tähendab et antud võrrand lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

 Microsoft Mathematics

3.      Kuna tegemist on numbrite ja x-dega mida on keeruline hoomata, tekib paratamatult küsimus et mis asi on õigupoolest see x mida otsitakse. Sellise võrrandi lahendust on kõige lihtsam mõista graafikul. Vajuta lingile „ploth both sides of this expression in 2D“, et näha antud lahendust joonisel.

Selle lingi vajutamise järel suunatakse kasutaja automaatselt joonise (Graphing) vahelelehele ja kuvatakse antud võrrand graafikul. Joonisel on näha kaks joont, kummagi võrrandi poole jaoks üks joon. Joonise kohal kuvatakse mõlemad võrrandid vastava värviga, millele need joonisel vastavad.

Toodud joonisel on näha, et x, mida otsitakse on mõlema võrrandi lõikekoht x-teljel, mis asubki täpselt -3 peal.

Microsoft Mathematics

 

Kaks lineaarvõrrandit ehk sirget

kaks lineaarvõrrandit ehk sirget

Sisesta võrrand Worksheet lehele, vajuta enter ja kuva lahendus joonisel. Näeme, et mõlemal võrrandi poolel asuvad lineaarvõrrandid ehk sirged ning neil on ühine lõikepunkt x-teljel, x=1/8=0,125.

 Microsoft Mathematics

Ruutvõrrand ja sirge

ruutvõrrand ja sirge

Käesoleva võrrandi esimene pool on absoluutväärtus ruutvõrrandist ning teine pool tavaline sirge ehk lineaarvõrrand. Sellel võrrandisüstemil on kolm lahendust, see tähendab et mõlema graafiku lõikuvad üksteisega kolmel korral: x=-3, x=2, x=0.

 Microsoft Mathematics

Vaatame jooniselt kuidas selline kolme x-ga lahendus on võimalik.

Joonisel on näha, et ruutvõrrandi kaar mis tavaliselt on allpool x-telge on nüüd ülespoole keeratud. Põhjus on selles, et antud ruutvõrrand on absoluutväärtuse märkide vahel, st see ei saa olla negatiivne. Selle tulemusena ongi võimalik saavutada kolm puutepunkti sirgega.

 Microsoft Mathematics

Juhend: HiTechnic prototüüpimislaud

HiTechnic NXT andurite tootjana on teinud ka ühe väga laheda asja – nimelt prototüüpimislaud.

http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NPK1056 

Sellel on 5 analoogsisendit (1024 astet pingega 0..3,3 V) ning 6 digitaalset sisendit/väljundit, mille abil saab kõikvõimalikke keerukaid asju teha. Alljärgnevalt kaks lihtsat näidisprogrammi: a) jooksvad tuled ja b) KITT tuled.

Jooksvad tuled ja KITT tuled HiTechnic Prototype Board abil

Jooksvad tuled

Käesoleva juhendi käigus vaatame ainult prototüüpimislaua digitaalsete väljunditesse kirjutamise osa.

Prototüüpimislaual on 6 digitaalset väljundit B0…B5. Neid saab kasutada nii sisendi kui ka väljundi režiimis. Register “Digital Control” määrab ära millised pordid on sisendid ja millised väljundid. Näiteks “Digital Control” registris number 63 (kahendsüsteemis 111111) muudab kõik väljunditeks.

Digital Out registrisse antud number määrab ära milline väljundportidest on aktiveeritud 1-ga. 1 tähendab siis 3,3V ja 12mA. Näiteks Digital Out numbriga 63 (ehk 0x3F) tähendab, et kõik valgusdioodid põlevad.

Alljärgnev programm suunab DigitalOut registrisse järjest numbrid 1,2, 4, 8, 16, 32 (0x01, 0x02, 0x04, 0x08, 0x10, 0x20).

Alljärgnevalt näidisprogramm kuidas teha prototüüpimislaua abil jooksvad tuled NXC programmeerimiskeeles.

/*
Leivo Sepp 12.02.2011
See programm kasutab HiTechnicu prototüübi plaati
Paneb plaadi taha ühendatud valgusdioodid järjekorras põlema
Ehk teisisõnu "jooksvad tuled"
*/


#define PROTO_PORT S1

int count;
int light = 0x01;
byte cmndbuf[];
byte respbuf[];                 

/* protoboard I/O map
   42,43 - A0 input
   44,45 - A1 input
   46,47 - A2 input
   48,49 - A3 input
   4A,4B - A4 input
   4C    - B inputs
   4D    - B outputs
   4E    - B controls
*/

//see alamprogramm teostab reaalse kirjutamise protolaua registrisse
//aktiveerides kindla pordi (B0..B5), mille taga peab süttima valgusdiood
void writedata(int outputdata)
  {
  //loo 3 väärtusega massiiv
  ArrayInit(cmndbuf, 0, 3);
  //protolaua aadress
  cmndbuf[0] = 0x02;
  //register kuhu kirjutatakse 4D on output
  cmndbuf[1] = 0x4D;
  //output registrisse kirjutatakse number mis aktiveerib kindla väljundi
  cmndbuf[2] = outputdata;
  count=0;
	//Käivitada eelnevate andmete põhjal protolauda kirjutamine
  I2CBytes(PROTO_PORT, cmndbuf, count, respbuf);  
  }

task main()
  {
  SetSensorLowspeed(PROTO_PORT); 
  Wait(100);

  //massiivi initsialiseerimine, 3 väärtust
  ArrayInit(cmndbuf, 0, 3);
  //esimene väärtus massiivis, prototüüpimislaua aadress
  cmndbuf[0] = 0x02;
  //teine väärtus massiivis, registri Control valimine (sisendid/väljundid)
  cmndbuf[1] = 0x4E;
  //kirjutada registrisse Control number 63 ehk 111111
  //st. et kõik B0..B5 on väljundid
  cmndbuf[2] = 0x3F;
  //mitu baiti peab I2C protolaud tagastama, meie puhul 0
  count=0;
  //Käivitada eelnevate andmete põhjal protolauda kirjutamine
  I2CBytes(PROTO_PORT, cmndbuf, count, respbuf);
  Wait(100);

  while (TRUE)
    {
    //kutsutakse välja alamprogramm, kuhu kirjutatakse number
    //numbrid on 1, 2, 4, 8, 16, 32
    writedata(light);
     light = light * 0x02;
     if (light == 0x40)
        light = 0x01;
    Wait(100);
    }
}

KITT tuled.

Ja teine programm, mis paneb tuled edasi-tagasi liikuma, ehk nagu KITT
/*
Leivo Sepp 12.02.2011
See programm kasutab HiTechnicu prototüübi plaati
Paneb plaadi taha ühendatud valgusdioodid edasi/tagasi põlema
Ehk teisisõnu "KITT tuled"
*/


#define PROTO_PORT S1

int count;
int light = 0x01;
byte cmndbuf[];
byte respbuf[]; 
bool kitt=TRUE;                

/* protoboard I/O map
   42,43 - A0 input
   44,45 - A1 input
   46,47 - A2 input
   48,49 - A3 input
   4A,4B - A4 input
   4C    - B inputs
   4D    - B outputs
   4E    - B controls
*/

//see alamprogramm teostab reaalse kirjutamise protolaua registrisse
//aktiveerides kindla pordi (B0..B5), mille taga peab süttima valgusdiood
void writedata(int outputdata)
  {
  //loo 3 väärtusega massiiv
  ArrayInit(cmndbuf, 0, 3);
  //protolaua aadress
  cmndbuf[0] = 0x02;
  //register kuhu kirjutatakse 4D on output
  cmndbuf[1] = 0x4D;
  //output registrisse kirjutatakse number mis aktiveerib kindla väljundi
  cmndbuf[2] = outputdata;
  count=0;
	//Käivitada eelnevate andmete põhjal protolauda kirjutamine
  I2CBytes(PROTO_PORT, cmndbuf, count, respbuf);  
  }

task main()
  {
  SetSensorLowspeed(PROTO_PORT); 
  Wait(100);

	//massiivi initsialiseerimine, 3 väärtust
  ArrayInit(cmndbuf, 0, 3);
  //esimene väärtus massiivis, prototüüpimislaua aadress
  cmndbuf[0] = 0x02;
  //teine väärtus massiivis, registri Control valimine (sisendid/väljundid)
  cmndbuf[1] = 0x4E;
  //kirjutada registrisse Control number 63 ehk 111111
  //st. et kõik B0..B5 on väljundid
  cmndbuf[2] = 0x3F;
  //mitu baiti peab I2C protolaud tagastama, meie puhul 0
  count=0;
  //Käivitada eelnevate andmete põhjal protolauda kirjutamine
  I2CBytes(PROTO_PORT, cmndbuf, count, respbuf);
  Wait(100);

    while (TRUE)
    {
    //kutsutakse välja alamprogramm, kuhu kirjutatakse number
    //numbrid on 1, 2, 4, 8, 16, 32
    writedata(light);
    if (kitt){
    	 //numbrid jooksevad väiksemast suuremaks
       light = light * 0x02;
       if (light == 0x20){
          kitt = FALSE;
          }
       }
    else {
    	  //numbrid jooksevad suuremast väiksemaks
        light = light / 0x02;
        if (light == 0x01)
           kitt = TRUE;
        }
    Wait(200);
    }
}

Bricx Command Center häälestamine

BricxCC on NXT programmeerimise vahend, mille abil meie oma põhilise osa koodist kirjutamine.

Tegemist on tasuta tarkvaraga, mille saab alla laadida siit: http://bricxcc.sourceforge.net/

Järgnevalt leidsin hulga asju mida annab selles keskkonnas vaikimisi häälestuse suhtes oluliselt kasutajasõbralikumaks muuta.

Alljärgnevate ekraanipiltide järgi häälestades saad enda BricxCC keskkonna mugavamaks.

Edit – Preferences – Editor vaheleht

Bricx Preferences Editor seaded

Paremal pool ülalt alla:

Automatically indent lines (ON) – kui kirjutad koodirida mis algas mitte rea algusest vaid eendiga, siis enteriga järgmisele reale minnes satud täpselt samale tasemele eelneva reaga. Väga kasutajasõbralik ning normaalne käitumine.

Alt sets column selection (OFF) – Selle sisselülitamisel saab Alt klahvi all vajutades teha hiirega selectioni üle mitme rea nii et veeru osa jääb paigale. Üsna segane ja mõttetu asi.

Move cursor on right click (ON) – kui teed koodis mõnes kohas hiirega paremklõpsu siis viiakse automaatselt ka hiirekursor sellesse kohta. Põhimõtteliselt on see normaalne asjade toimimise viis arvutis.

Scroll Past EOL (OFF) – sisselülitamisel liigub kursor lõputult paremale kui vajutad noole paremale. Täiesti mõttetu funktsionaalsus – lülitasin välja. Välja lülitaud asendis viib nool paremale kursori rea lõppu jõudes järgmise rea algusesse. See on normaalne ja ootuspärane käitumine.

HalfPage Scroll (OFF) – Kui see on sisse lülitatud siis PgUp või PgDn nuppe vajutades liigub ekraan üles-alla ainult poole kaupa. Ebamugav funktsionaalsus, lülitasin välja, mulle meeldib et kogu leht liigub korraga üles-alla.

Drag and drop editing (ON) – see on ju elementaarne, et saan koodijupi hiirega kinni võtta ja teise kohta lohistada, muidugi lülita sisse.

Quick tab (OFF) – jälle üks mõttetu asi, lülita välja. Sisselülitamise korral liigub kursor TAB klahvi vajutades eelmise rea esimese tühikuni jne. Täiesti ebakasutajasõbralik funktsioon.

Keep trailing blanks (ON) – vajalik sisse lülitada, et TAB klahv korralikult töötaks.

Enhanced home key (ON) – sisselülitamise korral viiakse kursor Home nupule vajutuse korral esimese täheni antud real. Lülitasin välja, kuna ma olen harjunud et kursor viiakse konkreetselt rea algusesse kui vajutan „home“ nuppu.

With grouped undo (OFF) – ei saanudki aru mis undo’d see grupeerib. Lülitasin välja et ei hakkaks mingit segadust kogemata tekitama.

Use Tab to indent (ON) –See on väga oluline asi sisse lülitada. Selle abil saad tervet koodi blokki korraga paremale nihutada või siis Shift-Tab abil vasakule nihutada. Väga vajalik asi sisse lülitada.

Show special characters (OFF) – kuvad koodikirjutamise aknas ka reavahetuse, tühiku jms sümbolid. Pole kunagi vaja läinud.

Convert tabs to spaces (OFF) – pole vaja sisse lülitada. Las tabid jäävad tabideks ja mitte ei muutu tühikuks.

Highlight current line (ON/OFF) – mul on see sisse lülitatud, kuna poistele suurelt ekraanilt näidates on sedasi parem koodirea peal fookust hoida – sellisel juhul tuleb ka Color vahelehelt määrata mis on Highlight rea värvus, mina valisin kollase. Kui kirjutan lihtsalt koodi, siis selleks ajaks võtan välja.

Keep caret x position (ON) – sisselülitamisel hoiab kursor oma positsiooni kui üles alla liikuda. Hea mugav asi, kogu aeg vaja.

Autosize max left character (OFF) – mingi veidi mõttetu asi taas.

Edit – Preferences – General vaheleht

image

Multiformat clipboard copy (ON) – Kopeerib koodi vaikimisi RTF-vormingusse.

Maximize editor Windows (ON) – Käivitamisel ja uute loomisel on aknad kohe full screen.

Use MDI mode (OFF) – võta linnuke ära, siis on programmid TAB-dena

Edit – Preferences – Options vaheleht

image

Lülita sisse ridade nummerdamine. Line numbers.

Edit – Preferences – StartUp vaheleht

image

Määra, et vaikimisi Brick-type oleks NXT.

Juhend: Do–While ja For tsüklid

Alljärgnevalt veel kaks eriliste omadustega tsüklit, mille abil saab panna programmi täitma mingit protseduuri teatud arv kordi.

 

do { “body” } while ("tingimus")

do
 {
    x = x + 1;
    y = y * 2;
 } while (x < 10);

 

Erinevus tavalisest while-tsüklist seisneb selles, et tsükkel täidetakse alati vähemalt ühe korra ja alles seejärel kontrollitakse tingimuse vastavust. Kui on tõene, täidetakse tsükkel teist korda.

Seega, kõigepealt läheb tsükkel käima, täida enda sees olevad käsud ja siis jõuab viimase reani while (..), mille sees on tingimus. Kui see tingimus on tõene minnakse do-tsükli algusesse tagasi ja täidetakse uuesti kõik käsud. Kui aga while (..) tingimus on muutunud vahepeal FALSE-ks, väljutakse tsüklist ja minnakse ülejäänud programmiga edasi.


for("init", “condition”, “increment”) { “body” }

for (int i = 0; i < 8; i++)
 {
    NumOut(0, LCD_LINE1-i*8, i);
 }


Init-ga algväärtustatakse muutuja i, tsükkel täidetakse kuni tingimus on tõene ja iga tsükli alguses täidetakse increment, mis liidab muutujale i juurde ühe numbri.

Seega, For-tsükli eripära seisneb selles, et sellele on sisse ehitatud loendur, mida saab kohe for-tsükli parameetrites häälestada. Pole tarvis ise tsükli sisse kirjutada liitmistehet ja suurem/väiksem kontrolli.

Juhend: NXT ekraani kasutamine

Ekraani saab kasutada selleks, et saada aktiivselt tagasisidet roboti töö kohta. Alljärgnevalt mõned peamised käsud NXC-s, mille abil juhtida ekraani. Siin on toodud välja ka NXT-l asuvad nupud ja heli tegemine.

ClearScreen();

 

Puhastab ekraani.

ClearLine(“Line”);

ClearLine(LCD_LINE2);

Puhastab ekraanil rea nr 2.

TextOut(“x”, “line”, “txt”, “options”);

TextOut(50, LCD_LINE3, "Hello World");

 

Kirjutab  ekraanil reale nr 3 sõnad „Hello World“.

NumOut(“x”, “line”, “val”, “options”);

TextOut(50, LCD_LINE3, 38);

 

Kirjutab  ekraanil reale nr 3 numbri 38.

ButtonPressed(“btn”,“reset”);

ButtonPressed(BTNRIGHT, FALSE);

Kontrollitakse nupuvajutust.

BTNRIGHT

BTNLEFT

BTNCENTER

BTNEXIT

Reset on TRUE/FALSE ning see nullib nupuvajutuste arvu.

PlayTone(“frequency”, “duration”);

PlayTone(440, SEC_2);

Mängib 2 sekundit tooni sagedusel 440 Hz.

Juhend: Matemaatika C-keeles

Programmide kirjutamisel on tarvis liita-lahutada-korrutada-jagada. Oma tavapärasest matemaatikas oleme harjunud kirjutama, et a + b = c.

C-keeles saab aga asju lühemalt väljendada, kõik ikka selleks et programm oleks lihtsam.

Tüüpiliselt on programmis muutuja (see on mingi arv näiteks), millele on vaja juurde liita mingi teine number.

Matemaatiliselt tavaline liitmistehe on võimalik C-keeles järgmiselt teha x += y. Hea lühike.

Tehe C-keeles Kirjeldus

liitmine

x += 2

Liidab muutujale juurde teise arvu. 

  • Olgu x alguses 1
  • Seejärel liidame x-le juurde 2 (x + 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x + 2

Näide 2. x += y

  • olgu x alguses 3 ja y väärtus 2
  • ülaltoodud tehe on x + y ehk siis 3 + 2 = 5
  • antud arv 5 omistatakse x-le, ja seega x = 5

lahutamine

x –= 2

Lahutab muutujast teise arvu. 

  • Olgu x alguses 5
  • Seejärel lahutame x-st arvu 2 (x – 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x - 2

korrutamine

x *= 2

Korrutab muutujat teise arvuga. 

  • Olgu x alguses 3
  • Seejärel korrutame x-i arvuga 2 (x * 2 = 6)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 6 ja seega x = 6

See tehe on pikemalt välja kirjutades x = x * 2

jagamine

x /= 2

Jagab muutujat teise arvuga. 

  • Olgu x alguses 6
  • Seejärel jagame x-i arvuga 2 (x / 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x / 2

liitmine
ühe ühiku võrra

i++

Kahekordne pluss tähistab seda, et muutujale i liidetakse juurde üks ühik.

  • Olgu i alguses 1
  • peale selle käsu käivitamist on tehtud tehe i + 1
  • seega tulemus, i = 2

lahutamine
ühe ühiku võrra

i--

Kahekordne miinus tähistab seda, et muutujast i lahutatakse üks ühik.

  • Olgu i alguses 10
  • peale selle käsu käivitamist on tehtud tehe i - 1
  • seega tulemus, i = 9

Juhend: IF ELSE ja SWITCH kasutamine

Programmeerimise enimkasutatav funktsioon on ilmselgelt IF ja IF ELSE laused. Tegemist siis tingimuste kontrolliga ning vastavalt sellele tegevuse ette võtmine.

Teise funktsioonina olen alljärgnevalt välja toonud ka SWITCH funktsiooni, kuna selle näol on tegemist nö. pika if-elseif-elseif-else lausendi jadaga.


if ("condition”) {“body” } else {“body” }

if (x == 1) {
   y = 1;
   z = 2;
 }
 else {
   y = 3;
   z = 5;
 }

Kui tingimus on tõene, täidetakse esimene käsk kui tingimus on väär täidetakse alternatiivne käsk.

IF lause sees võib ELSE IF lauseid palju olla, vaata alljärgnevat.

if (x == 1) {
   y = 1;
   z = 2;
 }
 else if (x == 2) {
   y = 3;
   z = 5;
 }
else {
  y = 6;
  z = 7;
 }

 

Sellisel juhul kontrollitakse kõigepealt IF tingimust kui see on väär minnakse edasi ja kontrollitakse ELSE IF tingimust, kui ka see on väär minnakse edasi järgmise kontrolli juurde.

Ehk siis ülaltoodud IF lauset tuleks lugeda järgmiselt: Kui x on võrdne 1-ga, pane y väärtuseks 1 ja z väärtuseks 2, kui aga x on võrdne 2-ga, pane y väärtuseks 3 ja z väärtuseks 5, või muidu pane y väärtuseks 6 ja z väärtuseks 7.


switch ("expression”) {“body” }

switch(x)
 {
        case 1:
         // tee midagi kui x on 1
         break;
        case 2:
        case 3:
         // tee midagi kui x on 2 või 3
         break;
        default:
         // tee midagi kui x pole 1, 2 või 3
         break;
 }

 

Switch kontrollib x väärtust ja vastavalt selle väärtusele teostab operatsiooni. See on sama tulemus kui ELSE IF funktsiooni jada kasutades. Kuid switch konstruktsiooni on oluliselt lihtsam kasutada võrreldes ELSE IF lausete jadaga.

Näiteks värviandurist värvi-info saamise korral, musta värvi korral tehakse ühtemoodi, punase korral teisiti jne.

Või infrapuna seekerist saabuvate numbrite 1..9 korral saan kirjeldada, mida ühel või teisel juhul tehakse.

Juhend: while, until tsüklite kasutamine

Programmeerimise peamised konstruktsioonid seisnevad tsüklites ning tingimuslausetes. Tsükkel on  tegevus mida korratakse seni, kuni etteantud tingimus vastab tsükli konstruktsioonile. Alljärgnevalt vaatame tsükleid while ning until ja seda mille poolest need erinevad.

Väga levinud on robootikas kasutada lõpmatult täidetavat tsüklit, seda läheb praktiliselt tarvis iga lõputult toimiva programmi korral.


while("tingimus")

while(x < 10)
 {
        x += 1;
        y *= 2;
 }

Kontrollitakse tingimust x<10 kui see on tõene, täidetakse while tsükli sisu ning siis kontrollitakse taas tingimust. Toimub seni kuni tingimus on väär - siis väljutakse tsüklist. Seega antud näite korral läbitakse tsüklit 9 korda, sest 10-dal korral on x = 10, seega tingimus pole tõene ja väljutakse tsüklist ehk minnakse programmiga edasi. 

while(TRUE) see on lõpmatult kestev tsükkel. Kuna TRUE tähendab seda, et avaldise väärtus on alati tõene siis selline tsükkel täidab oma sisu lõpmatu arv kordi.

Alljärgnev on näide nupu “bumped” funktsiooni teostamine:

while(!Sensor(S1));        // ootab nupule vajutamist
while(Sensor(S1));         // ootab nupu lahti laskmist


Ülalkirjeldatud bumped-funktsionaalsus töötab järgmiselt. Kui nupp on lahti siis see tähendab, et esimene tsükkel on tõene. Kui nupp vajutatakse alla, muutub esimese tsükli tingimus vääraks ning tõeseks muutub teise tsükli tingimus. Kui nuppu hoitakse all ei lähe programm edasi, kuna täidetakse teist tsüklit. Nupu lahti laskmise korral muutub tingimus vääraks ning programm läheb edasi.

 


until(EVENT_OCCURS);

until(SensorUS(S1) > 50);

until käitub vastupidiselt while tsüklile, st. see funktsioon ootab kuni tema tingimus saab tõeseks. Seda saab kasutada edukalt programmi seiskamiseks ning andurist kindla signaali ootamiseks.

Alljärgnev on näide nupu “bumped” funktsiooni teostamine, võrdle while tsükliga:

until(Sensor(S1));         // ootab nupule vajutamist
until(!Sensor(S1));        // ootab nupu lahti laskmist

Kui nupp on avatud siis esimese until funktsiooni tingimus on FALSE ja seega programm ootab selle taga. Nupu allavajutamisel muutub tingimus TRUE-ks ning programm läheb edasi, jäädes ootama teise until funktsiooni taha. Kui nüüd nupp lahti lasta ehk nupu väljund on FALSE, muutub teise until funktsiooni tingimus TRUE-ks ning programm liigub edasi

Juhend: Lihtne matemaatika

lihtne matemaatikaAegajalt tuleb robootikas ette olukordi, kus on vaja muuta mingist andurist tulev signaal märgiliselt vastupidiseks või mingil muul moel lihtsalt teisendada.

Näide 1

Kaugusandurist tulevad välja numbrid 0..100, kuid mootorile oleks vaja sisse anda vastupidine väärtus 100 .. 0. Ehk kui robot on seina lähedal siis eemaldub sellest kiiresti, kuid mida kaugemal on sein seda aeglasemalt robot liigub.

Lihtne matemaatiline tehe: 100 - algne arv = soovitud arv

 


Näide 2

lihtne matemaatikaInfrapuna otsijast (IR seekerist) tulevad välja numbrid 1..9. Nüüd oleks vaja luua keskkoht (5), mis võrdub nulliga ning 6-9 korral lasta robotil paremale keerata ning 1-4 korral lasta robotil vasakule keerata. 0 korral sõidab otse.

Lihtne matemaatika:

esmalt keskkoha arvutamiseks: algne arv – keskkoht (5) = soovitud arv

seejärel võimendus mootorile pööramise jaoks: algne arv x 25 = soovitud arv


Näide 3

lihtne matemaatikaKompassist saame relatiivse nurga mõõtmise korral väljundisse –90 .. 0 .. 90. Nüüd oleks vaja see number muundada vastupidiseks, et kui kompassist saame väljundi –90 siis roboti keeramiseks anname mootori sisendisse 90 ja vastupidi, kui kompass väljastab 90 kraadi siis roboti pööramiseks anname mootori sisendisse –90.

Lihtne matemaatika: 0 – algne arv = soovitud arv