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

Struktura e programit në gjuhën C. Struktura e një programi C

Përditësimi i fundit: 18.05.2017

Një program C përbëhet nga një grup direktivash paraprocesoresh, përkufizime funksionesh dhe objekte globale. Direktivat e paraprocesorit kontrollojnë se si teksti konvertohet përpara se të përpilohet. Objektet globale përcaktojnë të dhënat që do të përdoren ose gjendjen e programit. Dhe funksionet përcaktojnë sjelljen ose veprimet e një programi. Programi më i thjeshtë C që u përcaktua në temat e mëparshme është:

#përfshi int main(void) ( printf("Përshëndetje botë! \n"); return 0; )

udhëzime

Blloqet më të thjeshta të ndërtimit të një programi C janë deklaratat. Çdo instruksion kryen një veprim specifik. Udhëzimet C përfundojnë me një pikëpresje (;). Kjo shenjë i thotë përpiluesit të plotësojë udhëzimin. Për shembull:

printf ("Përshëndetje botë!");

Thirrni funksionet printf, i cili printon vargun "Hello world!" në tastierë. është një pohim dhe përfundon me një pikëpresje.

Një grup udhëzimesh mund të përfaqësojë një bllok kodi. Një bllok kodi është i formatuar me mbajtëse kaçurrelë, udhëzimet që përbëjnë trupin e këtij blloku vendosen midis kllapave kaçurrelë hapëse dhe mbyllëse:

( printf ("Përshëndetje botë!"); printf ("Mirupafshim botë!");

Ka dy udhëzime në këtë bllok kodi. Të dy udhëzimet paraqesin një thirrje për funksionin printf() dhe printojnë një varg specifik në tastierë.

Direktivat e paraprocesorit

Shembulli i mësipërm përdor funksionin printf() për të nxjerrë të dhëna në tastierë, por për të përdorur këtë funksion, në mënyrë që të na bëhet fare i disponueshëm në programin C, është e nevojshme të përfshijmë skedarin e kokës stdio.h në fillimi i skedarit të kodit burimor duke përdorur direktivën e përfshirjes.

Direktiva e përfshirjes është një direktivë parapërpunuese. Përveç kësaj përfshijnë, ekzistojnë një sërë direktivash paraprocesoresh, për shembull, define.

Çdo direktivë e paraprocesorit vendoset në një linjë. Dhe ndryshe nga udhëzime të zakonshme gjuha C, e cila mbaron me pikëpresje; , shenja e fundit e direktivës së paraprocesorit është një linjë e re. Përveç kësaj, direktiva duhet të fillojë me një shenjë paund #.

Direktiva "përfshi" përcakton se në cilat skedarë duhet të përfshihen ky vend në tekstin e programit. Si parazgjedhje, ne mund të përfshijmë skedarë standardë nga drejtoria e të ashtuquajturave "skedarët e kokës", të cilët zakonisht furnizohen me bibliotekat standarde përpilues. Dhe skedari "stdio.h" është vetëm një nga këto skedarë kokë.

Në përgjithësi, termi "skedari i kokës" (skedari i kokës) nënkupton përfshirjen e tekstit të skedarit në fillim ose në kokën e programit. Prandaj, skedarët e kokës përfshihen, si rregull, në fillim të kodit burimor. Për më tepër, skedari i kokës duhet të përfshihet përpara se të thirrni funksionet që ai përcakton. Kjo do të thotë, për shembull, skedari stdio.h ruan përkufizimin e funksionit printf, kështu që ky skedar duhet të përfshihet përpara se të thirret funksioni printf.

Por në përgjithësi, direktivat e paraprocesorit nuk duhet të vendosen në fillim të skedarit.

Gjatë përpilimit të kodit burimor, fillimisht aktivizohet paraprocesori, i cili skanon burimi për rreshtat që fillojnë me karakterin #. Këto linja trajtohen si direktiva nga paraprocesori. Dhe në vend të këtyre direktivave, teksti transformohet. Për shembull, në vend të direktivës #include kodi futet nga skedari stdio.h.

funksioni kryesor

Pika e fillimit për çdo program C është funksioni main(). Pikërisht me këtë funksion fillon ekzekutimi i aplikacionit. Emri i tij kryesor është fiks dhe është gjithmonë i njëjtë për të gjitha programet C.

Një funksion është gjithashtu një bllok kodi, kështu që trupi i tij është i përshtatur nga mbajtëse kaçurrelë, midis të cilave ka një grup udhëzimesh.

Duhet theksuar se në literaturë dhe shembuj të ndryshëm mund të gjenden modifikime të këtij funksioni. Në veçanti, në vend të përkufizimit të mësipërm, ne mund të shkruajmë ndryshe:

#përfshi void main() ( printf("Përshëndetje botë!");

#përfshi int main() ( printf ("Përshëndetje botë!"); return 0; )

Përdorimi i këtyre përkufizimeve nuk do të ishte gabim dhe programi do të printonte gjithashtu vargun "Hello world" në tastierë. Dhe për shumicën e përpiluesve, kjo do të ishte mirë.

Ne do t'i hedhim një vështrim më të afërt përkufizimeve të funksioneve më vonë, por këtu është një aspekt tjetër që duhet mbajtur parasysh. Përkufizimi i një funksioni në formën e int main(void) është fiksuar në standardin e gjuhës C11. Përpiluesit udhëhiqen kryesisht nga standardi i gjuhës, specifikimi i saj. Prandaj, nëse përdorim përkufizimin e dhënë në standardin gjuhësor, atëherë ka më shumë mundësi që ai të mbështetet nga të gjithë përpiluesit. Edhe pse, përsëri, e përsëris, duke përdorur opsionin e dytë ose int main () gabim i madh nuk do të jetë.

Standardi i plotë më i fundit C11 mund të shihet në

Fig.1 Struktura e programit në gjuhën C.

Struktura e brendshme programet

Program i ekzekutueshëm në C përbëhet nga 4 pjesë: zona e komandës, zona e të dhënave statike, zona dinamike e të dhënave, zona e stivit. shih Fig.2.

1. Zona e komandës përmban komandat e makinës; instruksionet që do të ekzekutohen nga mikroprocesori.

2. Një zonë e të dhënave statike për ruajtjen e variablave me të cilat funksionon programi;

3. Zona dinamike e të dhënave për vendosjen e të dhënave shtesë që shfaqen gjatë funksionimit të programit (për shembull, variabla të përkohshëm).

4. Stack përdoret për të ruajtur përkohësisht të dhëna dhe për të kthyer adresat nga funksionet.


funksioni i trupit/*trupi funksion*/

printf (" Përshendetje Botë!");

rreshti 1 është një direktivë që përfshin skedarin standard të kokës hyrëse/dalëse. Ka pak operatorë në C, por ka një bibliotekë funksionesh. Për t'i përdorur ato, duhet t'i lidhni, gjë që bën direktiva - rreshti i parë i programit. Simboli # tregon se vargu duhet të përpunohet nga paraprocesori C.



rreshti i 2-të - emri funksioni kryesor kryesore (), ky funksion nuk kthen asnjë parametër (për këtë do të flas pak më vonë). Një program C gjithmonë ka një funksion kryesore (). Fillon ekzekutimin e programit.

rreshti i 3-të - fillimi i trupit të funksionit. () përcaktoni trupin e funksionit (në Pascal, këto fillojnë dhe mbarojnë)

rreshti i 4-të - një koment, ai nuk është i përpiluar, por vetëm shpjegon atë që po bëhet.

rreshti i 5-të - funksioni i bibliotekës - printimi në ekran, shprehja në kllapa në këtë rresht është një parametër funksioni, ai citohet gjithmonë.

; - kjo është një shenjë e operatorit C, është pjesë e operatorit, dhe jo një ndarës i operatorëve, si në Pascal.

Këshilla për ta bërë programin të lexueshëm:

1) Zgjidhni emra kuptimplotë

2) Përdorni komentet

3) Përdorimi vija boshe për të ndarë një pjesë të një funksioni nga një tjetër

4) Vendosni çdo deklaratë në një rresht të ndryshëm.

ELEMENTET THEMELORE TË GJUHËS C

Merrni parasysh elementet e nevojshme, me ndihmën e të cilit duhet të hartohet programi C:

1. Komentet përdoren për të dokumentuar programin. Çdo program duhet të përmbajë komente: çfarë algoritmi përdoret, çfarë bën programi ...

Ø 1 mënyrë: /* Teksti */ - kudo në program.

Sapo përpiluesi ndeshet me /**/, ai i kalon ato. Përpiluesi injoron /* */ sepse nuk mund të interpretojë një gjuhë tjetër përveç C. Kjo do të thotë, nëse dëshironi të përjashtoni disa rreshta nga përpilimi, atëherë mbylleni atë në /**/.

Ø 2 mënyra: nëse komenti është i madh, atëherë përdorni këtë lloj

/* Rreshti 1 - për një koment të çdo gjatësie

vargu 3*/

Ø 3 mënyra: // - tekst deri në fund të rreshtit.

2. Identifikues - ky është emri që i caktohet një objekti (ndryshoreje). Shkronjat e vogla dhe shkronjat e mëdha, numrat dhe nënvizimet. Shkronjat e vogla dhe të mëdha janë të ndryshme. (Në BASIC nuk ndryshojnë). Nëse e quani një ndryshore emër, Emër ose EMRI, atëherë këto do të jenë variabla të ndryshëm.

Identifikuesit fillojnë me një shkronjë ose një nënvizim. Për shembull, _name. Por nuk rekomandohet të fillohet me _, sepse ky karakter përdoret për emrat globalë të të gjithë gjuhës C.

V programim modern shpesh përdoret për të krijuar identifikues Shënim hungarez, ku disa karaktere përdoren për të karakterizuar identifikuesin, për shembull:

b - byte; ch është një karakter me një bajt;

w është një fjalë; f - flamuri;

l - fjalë e gjatë; fn është një funksion;

u është i panënshkruar; p është një tregues;

c - banak; d – diferenca e dy pre-x

cz - varg; etj.

3. Fjalët e shërbimit - këto janë fjalë me të cilat krahasohen rreptësisht në gjuhë kuptime të caktuara semantike dhe që nuk mund të përdoren për qëllime të tjera. Këta janë emrat e operatorëve, funksionet e bibliotekës, komandat e paraprocesorit, e kështu me radhë. Këto fjalë nuk mund të përdoren për të krijuar emrat e funksioneve tuaja, variablave ...

TË DHËNAT NË PROGRAMIN C

Çdo program funksionon me të dhëna. Ato janë të pranishme në program në formën e variablave dhe konstanteve.

Të dhënat që mund të ndryshojnë ose të caktohen vlera gjatë ekzekutimit të programit quhen variablave.

Të dhënat që vendosen në vlera të caktuara dhe i ruajnë vlerat e tyre gjatë gjithë programit, quhen konstante.

Konstante

Konstantet janë vlera fikse. Vlera, pasi vendoset, nuk ndryshon më. Konstantet vijnë në lloje të ndryshme. Llojet ndryshojnë sipas parimit të vendosjes në kujtesën e kompjuterit, dhe për një person sipas llojit të regjistrimit. Në C, ekzistojnë 7 fjalë kyçe që përdoren për t'iu referuar tipe te ndryshme të dhënat: int, e gjatë, e shkurtër, e panënshkruar, char, float, double.

Llojet e vazhdueshme :

a) Numrat e plotë dhe të gjatë . Ato shkruhen në sistemet e numrave dhjetorë, oktalë dhe heksadecimalë. Ato mund të jenë të nënshkruara ose të panënshkruara.

Sistemi dhjetor: konstante të plota zënë 16 bit memorie dhe merrni një sërë vlerash: -32768 në +32767 (2 15) . Nëse konstanta është e panënshkruar, atëherë diapazoni dyfishohet: 0 deri në 65535(për shkak të faktit se shifra e 15-të - një shenjë përdoret për një numër). Për të treguar një numër të panënshkruar, përdorni prapashtesën u (i panënshkruar), për shembull 123u.

Nëse numri është më i madh se 40000, atëherë përpiluesi automatikisht do ta shndërrojë atë në një numër negativ, pra prapashtesa u kërkohet: 40000u. Në shembullin 123u, përpiluesit nuk i intereson nëse ka një prapashtesë apo jo, pasi ky numër është në intervalin 32767.

numër i plotë i gjatë merr 32 bit , varg vlerash

±2147483648 (nënshkruar gjatë - gjatë). Nëse vendosni një prapashtesë l, atëherë, pavarësisht nga numri, 32 bit do të jenë të zënë. Për shembull: -5326 l

0 – 4294967295 i panënshkruar gjatë- (i panënshkruar gjatë). Gama është rritur me bitin e 31-të. Përdoren prapashtesa ul, për shembull, 32659ul.

Sistemi oktal :

Nëse një numër fillon me 0, ai interpretohet si një numër oktal

16 bit 0 ¸ 077777

0100000 ¸ 0177777u

32 bit 0200000 ¸ 01777777777l

020000000000 ¸ 037777777777ul

Sistemi heksadecimal :

Nëse numri fillon me karakterin 0x, atëherë ai interpretohet si heksadecimal

16 bit 0x0000 ¸ 0x7FFF

0x8000 - 0xEFFFu

32 bit 0x10000 ¸ 0x7FFFFFFFFl

0x80000000 ¸ 0xFFFFFFFFFul

b) Konstante reale. Këta janë numra me pikë lundruese. A ka rëndësi pjesë thyesore. Si parazgjedhje, të gjitha konstantet reale janë të tipit double. dyfishtë . Zënë në kujtesë 8 bajt (edhe nëse 0.0). Gama e vlerave ±1*10±307 , mund të shkruhet edhe në formë shkencore, për shembull: 0.5e+15 ose

1.2e-3 \u003d 1.2 * 10 -8 \u003d 0.0012.

Ju mund ta detyroni formatin të jetë me saktësi të vetme noton . Numri do të marrë 4 bajt , përdoret prapashtesa f(5.7 f). Si rezultat, diapazoni ngushtohet. ±1*10±37

Si dhe saktësi të zgjeruar dyfish i gjatë - 10 bajtë . (3,14 litra)

Shenja + mund të hiqet. Lejohet të hiqet ose presja dhjetore ose pjesa eksponenciale, por jo të dyja (.2; 4e16). Ju nuk mund të shkruani një pjesë të pjesshme ose të plotë, por jo në të njëjtën kohë (100.; .8e-5)

c) Konstantet simbolike. Ky është grupi i simboleve të përdorura në kompjuterë.

Ato ndahen në 2 grupe: të shtypura dhe jo të shtypura(kodet e kontrollit). Një konstante karakteresh përfshin vetëm 1 karakter, i cili duhet të jetë i mbyllur në apostrofa dhe marrë 1 bajt memorie.

Çdo simbol ka paraqitjen e tij të dyfishtë Tabela ASCII. Në program futen konstante simbolike citate të vetme, kur përpilohet në program, ai zëvendësohet vlerë numerike personazhe nga ASCII. Një karakter zë 1 bajt.

Karakteri "A" "a" "" "\n"

Kodi i tij është 65 97 32 10

Si tip numër i plotë të dhënat "A"=0101 8 , 01000001 2 , 41 16 , 65 10 . Ju nuk keni nevojë të mbani mend kodet.

Kodet e kontrollit fillojnë me \ dhe janë gjithashtu të mbyllura me apostrofa. Kodet më të zakonshme të kontrollit janë:

\n - linjë e re

\t - tabela (zhvendosni kursorin me një vlerë fikse)

\b - hap prapa (zhvendos një pozicion prapa)

\r - kthimi i karrocës (kthimi në fillim të linjës)

\f - formuloni furnizimin (fusni letrën në 1 faqe)

\' - apostrof

\" - kuotat

Tre personazhet e fundit mund të veprojnë konstantet e karakterit, si dhe duke u përdorur në funksionin printf(), kështu që përdorimi i tyre si karaktere mund të rezultojë në një gabim. Për shembull, nëse duam të shfaqim vargun "Karakteri \ quhet i pjerrët", atëherë deklarata duhet të duket kështu:

printf("Karakteri \\ quhet i pjerrët");

a) Konstantet e vargut - përmbajnë një sekuencë prej 1 ose më shumë karakteresh të mbyllura në " ". 1 bajt shpenzohet për çdo karakter + 1 bajt për të ashtuquajturin karakter zero - një shenjë e fundit të rreshtit. Karakteri null nuk është numri zero, do të thotë se numri i karaktereve në vargun (N) duhet të jetë 1 bajt më shumë (N + 1) për të treguar fundin e vargut (përpiluesi e shton atë automatikisht). Për shembull: "linja e tekstit" zë (13+1) bajt;

"Paqe" -

Një program i shkruar në C# përbëhet nga blloqet e mëposhtme:

  • deklarata e hapësirës së emrit (një lloj kontejneri);
  • deklarata e klasës (thelbi kryesor i programit);
  • metodat e klasës (nënrutinat), të paktën një metodë Kryesor;
  • operatorët dhe shprehjet;
  • komentet.

Një shembull i një programi të thjeshtë

le të shqyrtojmë programi më i thjeshtë shkruar në C#. Ky do të jetë një aplikacion konsol që shfaq vargun "Hello World" (një lloj klasik, për programin e parë në praktikën e programuesit). Kodi për një program të tillë është paraqitur më poshtë, le ta shohim atë:

//Lidhja e sistemit të hapësirës së emrave duke përdorur Sistemin; //Deklarata e hapësirës së emrit Hapësira e emrit Struktura e programit ( //Klasa e deklarimit të klasës Programi ( // Metoda kryesore programet static void Main(string args) ( //Output string Console.WriteLine("Hello World!"); //Deklarata ndihmëse Console.ReadKey(); ) ) )

Rreshti i parë i këtij programi është një koment. Komentet nuk ndikojnë në funksionimin e programit në asnjë mënyrë, ato janë të nevojshme për personin që do të mbajë kodin e programit (përfundoni atë, rregulloni gabimet, etj.).

Rreshti i dytë i programit ( duke përdorur Sistemin;) është një operator që përfshin hapësirën standarde të emrave Sistemi. Në fakt, ne kemi akses në një grup klasash të disponueshme në "kontejner" Sistemi. Siç shihet, vargu i dhënë përbëhet nga dy fjalë, e para ( fjalë kyçe duke përdorur) do të thotë që duam të përfshijmë hapësirën e emrave dhe të dytën Sistemiështë emri i hapësirës së emrave të dëshiruar.

Në fund të rreshtit të dytë është karakteri ";", i cili tregon fundin e deklaratës. Çdo deklaratë programi duhet të përfundojë me një karakter të tillë.

Rreshti i katërt i programit është përsëri një koment, ashtu si rreshtat 7, 10, 13, 15. Komentet në C# fillojnë me karakteret "//" (dy prerje, dy të pjerrëta) dhe zgjasin vetëm deri në fund të rreshtit. .

C# gjithashtu ka komente me shumë rreshta, ndonjëherë është më i përshtatshëm për t'i përdorur ato, do t'i hasim më vonë.

Në rreshtin e pestë ( Struktura e programit të hapësirës së emrit) deklaron hapësirën e vet të emrave, quhet "ProgramStructure". Hapësira e emrave është një lloj kontejneri dhe kufizohet me mbajtëse kaçurrelë (që hapen në rreshtin 6 dhe mbyllen në rreshtin 19) pas emrit të saj. Kështu, gjithçka midis rreshtave 6 dhe 19 i përket hapësirës së emrave Struktura e programit.

Rreshti 8 deklaron një klasë të quajtur "Program", kjo është klasa kryesore dhe e vetme e programit tonë. Siç mund ta shihni, deklarata e klasës përdor fjalën kyçe klasës pasuar nga emri i klasës. Në program, mund të ketë jo një, por disa klasa. Në mënyrë tipike, një klasë përbëhet nga një grup metodash që përcaktojnë të ashtuquajturën sjellje të klasës (funksionaliteti, nëse dëshironi). Kufijtë e klasave, si dhe hapësirat e emrave, shënohen me kllapa kaçurrelë (rreshtat 9 dhe 18). Në rastin tonë, klasa ka vetëm një metodë, kjo është metoda Kryesor.

Rreshti 11 thjesht deklaron metodën Kryesor. Kjo metodë është kryesore në programin tonë, e ashtuquajtura pika hyrëse në program. Kjo do të thotë që kur programi të fillojë, metoda do të ekzekutohet së pari. Kryesor. Çdo metodë ka gjithashtu kufij, të cilët tregohen gjithashtu nga mbajtëset kaçurrelë (linjat 12 dhe 17).

Metoda Kryesor programi ynë përmban vetëm dy deklarata. Këto deklarata shfaqen në rreshtat 14 dhe 16. I pari printon mesazhin "Hello World!". Dhe e dyta është ndihmëse, e bën programin të presë për një goditje të tastierës dhe nuk e lejon atë të përfundojë ekzekutimin e tij deri në atë moment (pa këtë operator, programi do të shfaqte një linjë dhe do të mbyllej shpejt, kështu që ne nuk e bëmë madje keni kohë të lexoni atë që doli).

Tani përpiquni të ndërtoni dhe ekzekutoni këtë program në Visual Studio. Për këtë ju duhet:

  • lëshoni Visual Studio;
  • krijojnë projekt i ri aplikimi i konsolës;
  • kopjoni rreshtat 13-16 nga shembulli i mësipërm;
  • futni këto rreshta në metodë Kryesor një projekt i krijuar në Visual Studio;
  • shtypni tastin F5.

Unë fola në detaje se si të krijoni një projekt aplikacioni tastierë në Visual Studion në, ju këshilloj ta lexoni.

Nga se përbëhet programi

Për të filluar, ia vlen të kuptohet se një program nuk mund të lexohet dhe shkruhet si një libër: nga kopertina në kopertinë, nga lart poshtë, rresht pas rreshti. Çdo program përbëhet nga blloqe të veçanta. Fillimi i një blloku kodi në C/C++ tregohet nga një mbajtës kaçurrelë i majtë ( , fundi i tij është djathtas mbajtëse kaçurrelë } .

Blloqet janë tipe te ndryshme dhe cili do të ekzekutohet kur varet nga kushtet e jashtme. Në shembullin program minimal ju mund të shihni 2 blloqe. Në këtë shembull, blloqet thirren përcaktimi i funksionit. Një funksion është vetëm një bllok kodi me emrin e dhënë, të cilin dikush më pas mund ta përdorë nga jashtë.

V këtë rast kemi 2 funksione të emërtuara setup dhe loop . Prania e tyre është e detyrueshme në çdo program C++ për Arduino. Mund të mos bëjnë asgjë, si në rastin tonë, por duhet të shkruhen. Përndryshe, do të merrni një gabim në fazën e përpilimit.

Zhanri klasik: LED që pulson

Le të plotësojmë tani programin tonë në mënyrë që të paktën të ndodhë diçka. Në Arduino, një LED është i lidhur me pinin e 13-të. Ato mund të kontrollohen, gjë që ne do ta bëjmë.

void setup() (pinMode(13, OUTPUT) ;) void loop() (DixhitalWrite(13, LARTË) ; vonesë (100 ) ; digitalWrite (13 , LOW) ; vonesë (900 ) ; )

Përpiloni, shkarkoni programin. Do të shihni që çdo sekondë LED në tabelë pulson. Le të kuptojmë pse ky kod çon në pulsimin çdo sekondë.

Çdo shprehje është një urdhër për procesorin për të bërë diçka. Shprehjet brenda një blloku ekzekutohen njëra pas tjetrës, në mënyrë strikte pa asnjë pauzë dhe ndërprerës. Kjo do të thotë, nëse po flasim për një bllok specifik kodi, ai mund të lexohet nga lart poshtë për të kuptuar se çfarë po bëhet.

Tani le të kuptojmë se në çfarë rendi ekzekutohen vetë blloqet, d.m.th. funksionet e konfigurimit dhe ciklit. Mos mendoni tani për tani se çfarë kuptimi kanë shprehjet specifike, thjesht vëzhgoni rendin.

    Sapo ndizet Arduino, ai pulson ose shtypet butoni RESET, "diçka" thërret një funksion konfigurimi. Domethënë detyron që shprehjet në të të ekzekutohen.

    Një herë konfigurimi i punës përfundon, menjëherë "diçka" thërret funksionin e ciklit.

    Sapo të përfundojë puna e ciklit, menjëherë "diçka" thërret përsëri funksionin e ciklit dhe kështu me radhë ad infinitum.

Nëse numërojmë shprehjet sipas radhës në të cilën janë ekzekutuar, marrim:

void setup() ( pinMode(13, OUTPUT) ; ❶ ) void loop() ( digitalWrite(13 , LARTË) ; ❷ ❻ ❿ vonesë (100 ) ; ❸ ❼ … dixhital Shkrimi (13 , LOW) ; ❹ (9) vonesë (13 , LOW) ; ❹ ; ❺ ❾ )

Edhe një herë ju kujtojmë se nuk duhet të përpiqeni të perceptoni të gjithë programin duke lexuar nga lart poshtë. Nga lart poshtë, lexohen vetëm përmbajtja e blloqeve. Në përgjithësi mund të ndryshojmë rendin e deklaratave të konfigurimit dhe ciklit.

void loop() ( dixhitalWrite(13, LARTË) ; ❷ ❻ ❿ vonesë (100 ) ; ❸ ❼ … dixhitalWrite (13 , LOW) ; ❹ ❽ vonesë (900 ) ; ❺ ❾ (3 UTTP), konfigurim i pavlefshëm ) ; ❶)

Rezultati i kësaj nuk do të ndryshojë asnjë pikë: pas përpilimit, do të merrni një skedar binar absolutisht ekuivalent.

Çfarë bëjnë shprehjet

Tani le të përpiqemi të kuptojmë pse programi i shkruar çon në ndezjen e LED.

Siç e dini, kunjat Arduino mund të funksionojnë si dalje ashtu edhe si hyrje. Kur duam të kontrollojmë diçka, domethënë të lëshojmë një sinjal, duhet ta transferojmë pinin e kontrollit në gjendjen e daljes. Në shembullin tonë, ne po e drejtojmë LED-in në pinin 13, kështu që pini 13 duhet të bëhet një dalje përpara përdorimit.

Kjo bëhet nga një shprehje në funksionin e konfigurimit:

PinMode(13, OUTPUT);

Shprehjet janë të ndryshme: aritmetikë, deklarata, përkufizime, kushtore etj. Në këtë rast, ne zbatojmë në shprehje thirrje funksioni. E mbani mend? Ne kemi e tyre funksionet setup dhe loop, të cilat thirren nga diçka që ne e quajtëm "diçka". Pra tani ne ne i quajmë funksione që tashmë janë shkruar diku.

Në mënyrë të veçantë, në konfigurimin tonë, ne quajmë një funksion të quajtur pinMode. Ai vendos pinin e specifikuar nga numri në modaliteti i paracaktuar: hyrje ose dalje. Tregojmë për cilin pin dhe cilin modalitet po flasim në kllapa, të ndara me presje, menjëherë pas emrit të funksionit. Në rastin tonë, ne duam që kunja e 13-të të funksionojë si një dalje. OUTPUT do të thotë dalje, INPUT do të thotë hyrje.

Quhen vlera kualifikuese të tilla si 13 dhe OUTPUT argumentet e funksionit. Nuk është e nevojshme që të gjitha funksionet të kenë 2 argumente. Sa argumente ka një funksion varet nga thelbi i funksionit, nga mënyra se si e ka shkruar autori. Mund të ketë funksione me një argument, tre, njëzet; Funksionet nuk mund të kenë fare argumente. Pastaj për t'i thirrur ata kllapa e rrumbullakët hapet dhe më pas mbyllet:

NoInterrupts() ;

Në fakt, mund të keni vënë re se funksionet tona të konfigurimit dhe të ciklit nuk marrin asnjë argument. Dhe "diçka" misterioze thjesht i quan me kllapa bosh në kohën e duhur.

Le të kthehemi te kodi ynë. Pra, meqenëse po planifikojmë ta ndezim LED-in përgjithmonë, kunja e kontrollit duhet të dalë një herë, dhe më pas nuk duam ta mbajmë mend. Funksioni i konfigurimit është krijuar ideologjikisht për këtë: konfiguroni tabelën sipas nevojës, në mënyrë që të punoni me të më vonë.

Le të kalojmë te funksioni i ciklit:

void loop() ( digitalWrite (13 , LARTË) ; vonesë (100 ) ; digitalWrite (13 , LOW) ; vonesë (900 ) ; )

Siç u përmend, thirret menjëherë pas konfigurimit. Dhe thirret herë pas here sapo mbaron. Funksioni i ciklit quhet cikli kryesor i programit dhe është krijuar ideologjikisht për të bërë punë të dobishme. Në rastin tonë punë e dobishme- LED që pulson.

Le t'i kalojmë shprehjet me radhë. Pra, shprehja e parë është një thirrje për funksionin e integruar DigitalWrite. Është projektuar për të dhënë një zero logjike (LOW, 0 volt) ose një logjike (HIGH, 5 volt) në një pin të caktuar. 2 argumente i kalohen funksionit DigitalWrite: numri i pinit dhe një vlerë logjike. Si rezultat, gjëja e parë që bëjmë është ndezja e LED-së në pinin e 13-të duke aplikuar 5 volt në të.

Sapo të bëhet kjo, procesori kalon menjëherë në shprehjen tjetër. Për ne, kjo është një thirrje për funksionin e vonesës. Funksioni i vonesës është, përsëri, një funksion i integruar që e bën procesorin të flejë për një kohë të caktuar. Duhet vetëm një argument: koha në milisekonda për të fjetur. Në rastin tonë, kjo është 100 ms.

Ndërsa ne flemë, gjithçka mbetet ashtu siç është, d.m.th. LED vazhdon të ndizet. Sapo mbarojnë 100 ms, procesori zgjohet dhe kalon menjëherë në shprehjen tjetër. Në shembullin tonë, kjo është përsëri një thirrje për funksionin e njohur të integruar DigitalWrite. Vërtetë, këtë herë kalojmë vlerën LOW si argument të dytë. Kjo do të thotë, ne vendosim një zero logjike në pinin e 13-të, domethënë aplikojmë 0 volt, domethënë fikim LED.

Pasi të jetë shuar LED, ne vazhdojmë në shprehjen tjetër. Përsëri, kjo është një thirrje për funksionin e vonesës. Këtë herë ne flemë për 900 ms.

Pasi të përfundojë gjumi, funksioni i ciklit përfundon. Pas përfundimit, "diçka" e thërret menjëherë përsëri dhe gjithçka ndodh përsëri: LED ndizet, digjet, fiket, pret, etj.

Nëse përktheni atë që është shkruar në Rusisht, ju merrni algoritmin e mëposhtëm:

    I vumë zjarrin LED

    Flini 100 milisekonda

    Ne e fikim LED

    Flini 900 milisekonda

    Shkoni në pikën 1

Pra, ne morëm një Arduino me një fener që pulson çdo 100 + 900ms = 1000ms = 1 sekondë.

Çfarë mund të ndryshohet

Le të përdorim vetëm njohuritë e marra për të bërë disa variacione të programit në mënyrë që të kuptojmë më mirë parimin.

Mund të lidhni një LED të jashtëm ose pajisje tjetër që duhet të "pulsojë" me një kunj tjetër. Për shembull, në datën 5. Si duhet të ndryshojë programi në këtë rast? Ne duhet ta zëvendësojmë numrin me të 5-tin kudo që të kthehemi te kunja e 13-të:

Përpiloni, shkarkoni, testoni.

Çfarë duhet bërë që LED të pulsojë 2 herë në sekondë? Zvogëloni kohën e gjumit në mënyrë që totali të jetë 500 ms:

void setup() (pinMode(5, OUTPUT) ;) void loop() ( digitalWrite (5 , LARTË) ; vonesë (50 ) ; DigitalWrite (5 , LOW) ; vonesë (450 ) ; )

Si mund ta bëj LED-in të pulsojë dy herë me çdo "shkëlqim syri"? Duhet ta vini zjarrin dy herë me një pauzë të shkurtër midis përfshirjeve:

void setup() ( pinMode (5 , OUTPUT) ; ) void loop() ( digitalWrite(5 , HIGH) ; vonesë (50 ) ; digitalWrite (5 , LOW) ; vonesë (50 ) ; digitalWrite (5 , LARTË) ; vonesë (50 ) ; Shkrim dixhital (5 , I ULËT) ; vonesë (350 ) ;)

Si ta bëni pajisjen të ketë 2 LED që do të pulsojnë çdo sekondë në mënyrë alternative? Ju duhet të komunikoni me dy kunja dhe të punoni në një lak me njërën ose tjetrën:

void setup() ( pinMode (5 , OUTPUT) ; pinMode (6 , OUTPUT) ; ) void loop() ( digitalWrite(5 , HIGH) ; vonesë (100 ) ; digitalWrite (5 , LOW) ; vonesë (900 ) ; DigitalWrite (6 , I LARTË) ; vonesë (100 ) ; Shkrim dixhital (6 , E LAWT) ; vonesë (900 ) ;)

Si të bëni që pajisja të ketë 2 LED që do të kalojnë në mënyrën e një semafori hekurudhor: a do të ishte ndezur njëra apo tjetra? Thjesht nuk duhet të fikni LED-in që digjet pikërisht atje, por prisni momentin e ndërrimit:

setup void() (pinMode(5, OUTPUT) ; pinMode(6, OUTPUT) ;) void loop() ( digitalWrite(5 , LOW) ; digitalWrite (6 , LOW) ; vonesë (1000 ) ; DigitalWrite (5 , LOW) ; Shkrim dixhital (6 , I LARTË) ; vonesë (1000 ) ;)

Mos ngurroni të kontrolloni vetë idetë e tjera. Siç mund ta shihni, gjithçka është e thjeshtë!

Rreth hapësirës së zbrazët dhe kodit të bukur

Në C++, hapësirat, ndërprerjet e rreshtave dhe karakteret e skedave nuk kanë me rëndësi të madhe për përpiluesin. Ku ka një hapësirë, mund të ketë një ndërprerje të linjës dhe anasjelltas. Në fakt, 10 hapësira me radhë, 2 ndërprerje rreshtash dhe 5 hapësira të tjera janë të gjitha ekuivalenti i një hapësire.

Hapësira e bardhë është një mjet programuesi, me të cilin mund ta bëni programin të kuptueshëm dhe vizual, ose ta gjymtoni atë përtej njohjes. Për shembull, merrni parasysh programin për ndezjen e një LED:

setup void() (pinMode(5, OUTPUT) ;) void loop() (DixhitalWrite(5, LARTË) ; vonesë (100) ; DigitalWrite (5 , LOW) ; vonesë (900 ) ; )

Mund ta ndryshojmë si kjo:

konfigurimi i zbrazët ( ) ( modaliteti pin (5 , OUTPUT) ; ) cikli i zbrazët () ( Shkrimi dixhital (5 , LARTË) ; vonesa (100 ) ; Shkrimi dixhital (5 , ULËT) ; vonesa (900 ) ; )

Gjithçka që kemi bërë është të “punojmë” pak me hapësirën bosh. Tani mund të shihni qartë ndryshimin midis kodit të formësuar mirë dhe kodit të palexueshëm.

Për të ndjekur ligjin e pashprehur të dizajnit të softuerit, i cili respektohet në forume, kur lexohet nga njerëzit e tjerë, perceptohet lehtësisht nga ju, ndiqni disa rregulla të thjeshta:

1. Gjithmonë, në fillim të një blloku të ri midis ( dhe ), rrisni dhëmbëzimin. Zakonisht përdoren 2 ose 4 hapësira. Zgjidhni një nga vlerat dhe qëndroni në të gjatë gjithë kohës.

Keq:

void loop() ( digitalWrite (5 , LARTË) ; vonesë (100 ) ; digitalWrite (5 , LOW) ; vonesë (900 ) ;)

Mirë:

void loop() ( digitalWrite (5 , LARTË) ; vonesë (100 ) ; digitalWrite (5 , LOW) ; vonesë (900 ) ;)

2. Si në gjuhën e natyrshme: vendosni një hapësirë ​​pas presjeve dhe mos vendosni përpara.

Keq:

DigitalWrite (5 ,LARTË); digitalWrite(5 , LARTË) ; DigitalWrite (5 ,LARTË) ;

Mirë:

DigitalWrite (5 , LARTË);

3. Vendosni një karakter të fillimit të bllokut ( aktiv linjë e renivelin aktual indent ose në fund të asaj të mëparshme. Dhe karakteri i fundit të bllokut ) në një rresht të veçantë në nivelin aktual të dhëmbëzimit:

Keq:

setup void() ( pinMode(5, OUTPUT) ; ) void setup() (pinMode(5, OUTPUT) ;) void setup() (pinMode(5, OUTPUT) ;)

Mirë:

konfigurimi i zbrazët () ( pinMode (5 , OUTPUT) ; ) konfigurimi i zbrazët () ( pinMode (5 , OUTPUT) ; )

4. Përdorni linja boshe për të ndarë blloqet semantike:

Mirë:

Më mirë:

void loop() ( digitalWrite (5 , LARTË) ; vonesë (100 ) ; digitalWrite (5 , LOW) ; vonesë (900 ) ; digitalWrite (6 , LARTË) ; vonesë (100 ) ; digitalWrite (6 , LOW) ; vonesë ( 900) ;)

Rreth pikëpresjes

Ju mund të pyesni veten: pse ka një pikëpresje në fund të çdo shprehjeje? Këto janë rregullat e C++. Rregulla të tilla quhen sintaksë gjuhësore. Sipas simbolit; përpiluesi kupton se ku mbaron shprehja.

Siç u përmend tashmë, ndërprerjet e rreshtave për të janë një frazë boshe, kështu që ai fokusohet në këtë shenjë pikësimi. Kjo ju lejon të shkruani disa shprehje njëherësh në një rresht:

void loop() ( digitalWrite (5 , LARTË) ; vonesë (100 ) ; digitalWrite (5 , LOW) ; vonesë (900 ) ;)

Programi është i saktë dhe i barabartë me atë që kemi parë tashmë. Megjithatë, shkrimi i tillë është një formë e keqe. Kodi është shumë më i vështirë për t'u lexuar. Pra, nëse nuk keni një arsye 100% të mirë për të shkruar deklarata të shumta në të njëjtën linjë, mos e bëni.

Rreth komenteve

Një nga rregullat e programimit të mirë është: "Shkruani kodin në mënyrë që të jetë aq i qartë sa të mos ketë nevojë të shpjegohet". Është e mundur, por jo gjithmonë. Për të shpjeguar disa pika jo të dukshme në kod për lexuesit e tij: kolegët tuaj ose veten brenda një muaji, ekzistojnë të ashtuquajturat komente.

Këto janë dizajne në kodi i programit, të cilat janë injoruar plotësisht nga përpiluesi dhe janë të rëndësishme vetëm për lexuesin. Komentet mund të jenë me shumë rreshta ose me një rresht:

/* Funksioni i konfigurimit thirret i pari kur ndizet Arduino. Ky është një koment me shumë rreshta */ konfigurimi i zbrazët ()( // vendos pinin 13 në modalitetin e daljes pinMode(13, OUTPUT); ) void loop () ( digitalWrite (13 , LARTË) ; vonesë (100 ) ; // gjumë 100ms digitalWrite (13 , LOW) ; vonesë (900 ) ; )

Siç mund ta shihni, mund të shkruani sa më shumë rreshta komentesh që dëshironi midis karaktereve /* dhe */. Dhe pas sekuencës / /, gjithçka që vijon deri në fund të rreshtit konsiderohet koment.

Pra, shpresojmë që parimet më themelore të shkrimit të programeve të jenë bërë të qarta. Njohuritë e marra ju lejojnë të kontrolloni në mënyrë programore furnizimin me energji në kunjat Arduino sipas skemave të caktuara të kohës. Kjo nuk është aq shumë, por ende e mjaftueshme për eksperimentet e para.

C, të tilla si variablat statike dhe lokale, vargjet, treguesit, funksionet, etj., janë sa më afër arkitekturës kompjuterë të vërtetë. Pra, një tregues është vetëm një adresë memorie, një grup është një zonë e vazhdueshme e memories, variablat lokale janë variabla të vendosura në pirgun e harduerit, variablat statike janë në memorie statike. Një programues C gjithmonë ka një ide mjaft të mirë se si programi që ai shkruan do të funksionojë në ndonjë arkitekturë të veçantë. Me fjalë të tjera, gjuha C i jep programuesit kontroll të plotë mbi kompjuterin.

Fillimisht, gjuha C u konceptua si një zëvendësim i Assembler për shkrimin sistemet operative. Për shkak se C është një gjuhë e nivelit të lartë, arkitekturore-agnostike, kodi i sistemit operativ u dëshmua të jetë lehtësisht i lëvizshëm nga një platformë në tjetrën. Sistemi i parë operativ i shkruar pothuajse tërësisht në C ishte Sistemi Unix. Pothuajse të gjitha sistemet operative që përdoren sot janë të shkruara në C. Përveç kësaj, mjetet softuerike që sistemi operativ ofron zhvilluesit programet e aplikimit(i ashtuquajturi API - Application Program Interface), janë grupe funksionet e sistemit në gjuhën C.

Sidoqoftë, fushëveprimi i gjuhës C nuk ishte i kufizuar në zhvillimin e sistemeve operative. Gjuha C doli të ishte shumë e përshtatshme në programet e përpunimit të tekstit dhe imazhit, në llogaritjet shkencore dhe inxhinierike. Gjuhët e orientuara nga objektet e bazuara në C janë të shkëlqyera për programim në mjedise me dritare.

V këtë seksion do të jepen vetëm konceptet bazë të gjuhës C (dhe pjesërisht C++). Nuk zëvendëson leximin libër shkollor i plotë në C ose C++, për shembull, libra dhe .

Ne do të përdorim përpiluesin C++ në vend të C. Fakti është se gjuha C është pothuajse tërësisht e përfshirë në C ++, d.m.th. një program normal C është një program i vlefshëm C++. Fjala "normale" do të thotë se nuk përmban ndërtimet e pasuksesshme të mbetura nga versionet e hershme C dhe nuk përdoret aktualisht. Përpiluesi C++ preferohet mbi kompajlerin C sepse ka kontroll më të rreptë të gabimeve. Përveç kësaj, disa konstruksione C++ që nuk lidhen me programimin e orientuar nga objekti janë shumë të përshtatshëm dhe në fakt janë një përmirësim në gjuhën C. Këto janë, para së gjithash, komentet // , aftësia për të përshkruar variabla lokale në çdo pikë të programit, dhe jo vetëm në fillim të bllokut, dhe gjithashtu vendosja e konstantave pa përdorur operatorin #define të paraprocesorit. Ne do t'i përdorim këto veçori të C++ duke mbetur në thelb brenda fushëveprimit të gjuhës C.

Struktura e një programi C

Mjafton çdo program i madh në C (programuesit përdorin termin projekti) përbëhet nga skedarë. Skedarët përkthehen në mënyrë të pavarur nga përpiluesi C dhe më pas bashkohen nga programi i ndërtuesit të detyrave, duke rezultuar në një skedar me një program gati për t'u ekzekutuar. Skedarët që përmbajnë tekste të programit C thirren fillestare.

Në gjuhën C skedarët burimor janë dy llojesh:

  • header, ose h-skedarët;
  • skedarët e zbatimit, ose skedarët C.

Emrat e skedarëve të kokës kanë shtesën " .h". Emrat e skedarëve të zbatimit kanë shtesat " .c " për gjuhën C dhe " .cpp ", " .cxx " ose " .cc " për gjuhën C++.

Fatkeqësisht, ndryshe nga gjuha C, programuesit nuk kanë qenë në gjendje të bien dakord zgjatje e vetme emrat për skedarët që përmbajnë programe C++. Ne do të përdorim shtesën " .h " për skedarët e kokës dhe shtesën " .cpp " për skedarët e zbatimit.

skedarët e kokës përmban vetëm përshkrime. Para së gjithash, këto janë prototipe funksioni. Prototipi i funksionit përshkruan emrin e funksionit, llojin e kthimit, numrin dhe llojet e argumenteve të tij. Vetë teksti i funksionit nuk gjendet në skedarin h. Gjithashtu, skedarët h përshkruajnë emrat dhe llojet e variablave të jashtëm, konstantet, llojet e reja, strukturat, etj. Në përgjithësi, skedarët h përmbajnë vetëm ndërfaqet, d.m.th. informacioni i nevojshëm për të përdorur programe të shkruara tashmë nga programues të tjerë (ose nga i njëjti programues më parë). Skedarët e kokës ofrojnë informacion vetëm për programet e tjera. Gjatë përkthimit të skedarëve të kokës, si rregull, nuk krijohen objekte. Për shembull, në një skedar header nuk mundeni përcaktojnë variabël globale. Vargu i përshkrimit

përcaktimi i një ndryshore të plotë x është një gabim. Në vend të kësaj, përdorni përshkrimin

që do të thotë se ndryshorja x është përcaktuar diku në skedarin e zbatimit (i cili është i panjohur). Fjala e jashtme (e jashtme) është vetëm raporton informacion për një variabël të jashtëm, por nuk e përcakton atë variabël.

Skedarët e zbatimit, ose skedarët C, përmbajnë tekste funksionesh dhe përkufizime të variablave globale. Për ta thënë thjesht, skedarët C përmbajnë vetë programet, ndërsa skedarët h përmbajnë vetëm informacione rreth programeve.

Përfaqësimi Kodi i burimit në formën e skedarëve të kokës dhe skedarëve të zbatimit është e nevojshme të krijohen projekte të mëdha duke pasur strukturë modulare. Skedarët e kokës përdoren për të kaluar informacionin midis moduleve. Skedarët e zbatimit janë modulet individuale, të cilat zhvillohen dhe përkthehen në mënyrë të pavarur nga njëra-tjetra dhe kombinohen për të krijuar një program të ekzekutueshëm.

Skedarët e zbatimit mund të përfshijnë përshkrime të përfshira në skedarët e kokës. Vetë skedarët e kokës mund të përdorin gjithashtu skedarë të tjerë të kokës. skedari i kokës përfshihet duke përdorur direktivën #include paraprocessor. Për shembull, përshkrimet karakteristika standarde I/O aktivizohet me një varg

#përfshi

(stdio - nga fjalët standarde hyrje / dalje). Emri i skedarit h shkruhet në kllapa këndore nëse kjo h-

Artikujt kryesorë të lidhur