Kako podesiti pametne telefone i računare. Informativni portal

Struktura programa u C jeziku. Struktura C programa

Posljednje ažuriranje: 18.05.2017

C program se sastoji od skupa predprocesorskih direktiva, definicija funkcija i globalnih objekata. Preprocesorske direktive kontrolišu kako se tekst pretvara pre nego što se kompajlira. Globalni objekti definiraju podatke koji će se koristiti ili stanje programa. A funkcije definiraju ponašanje ili radnje programa. Najjednostavniji C program koji je definiran u prethodnim temama je:

#include int main(void) ( printf("Zdravo svijete! \n"); return 0; )

Instrukcije

Najjednostavniji gradivni blokovi C programa su izjave. Svaka instrukcija izvodi određenu radnju. C instrukcije završavaju tačkom i zarezom (;). Ovaj znak govori kompajleru da završi instrukciju. Na primjer:

printf("Zdravo svijet!");

Zovi printf funkcije, koji ispisuje string "Hello world!" na konzolu. je izjava i završava se tačkom i zarezom.

Skup instrukcija može predstavljati blok koda. Blok koda je formatiran sa vitičastim zagradama, a instrukcije koje čine tijelo ovog bloka smještene su između otvaranja i zatvaranja vitičastih zagrada:

( printf("Zdravo svijet!"); printf("Zbogom svijet!"); )

U ovom bloku koda postoje dvije upute. Obje instrukcije predstavljaju poziv funkcije printf() i ispisuju određeni string na konzoli.

Preprocesorske direktive

Gornji primjer koristi funkciju printf() za izlaz podataka na konzolu, ali da bismo koristili ovu funkciju, kako bi nam uopće postala dostupna u C programu, potrebno je uključiti datoteku zaglavlja stdio.h na početak datoteke izvornog koda koristeći direktivu uključivanja.

Direktiva uključivanja je direktiva pretprocesora. Pored ovog uključuje, postoji niz direktiva za pretprocesor, na primjer defini.

Svaka direktiva pretprocesora nalazi se na jednom redu. I za razliku obične upute C jezik, koji se završavaju tačkom i zarezom; , krajnji znak direktive preprocesora je novi red. Osim toga, direktiva mora početi znakom funte #.

Direktiva "include" definira u koje datoteke treba uključiti ovo mjesto u tekstu programa. Standardno možemo uključiti standardne datoteke iz direktorija takozvanih "header fajlova", koji se obično isporučuju sa standardne biblioteke kompajler. A datoteka "stdio.h" je samo jedna od ovih datoteka zaglavlja.

Općenito, pojam "header file" (header file) podrazumijeva uključivanje teksta datoteke na samom početku ili zaglavlju programa. Stoga su zaglavlje datoteke uključene, po pravilu, na početku izvornog koda. Dodatno, datoteka zaglavlja mora biti uključena prije pozivanja funkcija koje definira. To jest, na primjer, datoteka stdio.h pohranjuje definiciju printf funkcije, tako da ova datoteka mora biti uključena prije pozivanja funkcije printf.

Ali općenito, direktive pretprocesora ne moraju biti postavljene na početak datoteke.

Prilikom kompajliranja izvornog koda, prvo se pokreće pretprocesor, koji skenira izvor za redove koji počinju znakom #. Ove linije se tretiraju kao direktive od strane pretprocesora. I umjesto ovih direktiva, tekst je transformiran. Na primjer, umjesto direktive #include kod se ubacuje iz stdio.h datoteke.

glavna funkcija

Polazna tačka za bilo koji C program je funkcija main(). Sa ovom funkcijom počinje izvršavanje aplikacije. Njegovo glavno ime je fiksno i uvijek je isto za sve C programe.

Funkcija je također blok koda, pa je njeno tijelo uokvireno vitičastim zagradama, između kojih se nalazi skup instrukcija.

Treba napomenuti da se u različitoj literaturi i primjerima mogu naći modifikacije ove funkcije. Konkretno, umjesto gornje definicije, mogli bismo napisati drugačije:

#include void main() ( printf("Zdravo svijete!"); )

#include int main() ( printf("Zdravo svijete!"); return 0; )

Upotreba ovih definicija ne bi bila greška, a program bi takođe ispisao string "Hello world" na konzoli. I za većinu kompajlera, ovo bi bilo u redu.

Kasnije ćemo detaljnije pogledati definicije funkcija, ali evo još jednog aspekta koji treba imati na umu. Definicija funkcije u obliku int main(void) je fiksirana u standardu jezika C11. Kompajleri se prvenstveno rukovode standardom jezika, njegovom specifikacijom. Stoga, ako koristimo definiciju koja je data u jezičkom standardu, onda je veća šansa da će je podržati svi prevodioci. Iako, opet, ponavljam, u korištenju druge opcije ili int main () velika greška neću.

Potpuni najnoviji standard C11 možete pogledati na

Slika 1 Struktura programa u jeziku C.

Unutrašnja struktura programe

Izvršni program u C se sastoji od 4 dijela: komandno područje, područje statičkih podataka, područje dinamičkih podataka, područje steka. vidi sl.2.

1. Komandno područje sadrži strojne komande; instrukcije koje treba da izvrši mikroprocesor.

2. Područje statičkih podataka za pohranjivanje varijabli sa kojima program radi;

3. Područje dinamičkih podataka za postavljanje dodatnih podataka koji se pojavljuju tokom rada programa (na primjer, privremene varijable).

4. Stog se koristi za privremeno pohranjivanje podataka i vraćanje adresa iz funkcija.


tijelo funkcije/*funkcijsko tijelo*/

printf(" Zdravo svijete!");

1. red je direktiva koja uključuje standardni ulazno/izlazni fajl zaglavlja. Postoji nekoliko operatora u C-u, ali postoji biblioteka funkcija. Da biste ih koristili, morate ih povezati, što radi direktiva - 1. red programa. Simbol # označava da niz treba obraditi C preprocesor.



2. red - ime glavna funkcija main(), ova funkcija ne vraća nikakve parametre (o tome ću govoriti malo kasnije). C program uvijek ima funkciju main(). Počinje izvršavanje programa.

3rd line - početak tijela funkcije. () definirati tijelo funkcije (u Pascalu, to su početak i kraj)

4th line - komentar, nije sastavljen, već samo objašnjava šta se radi.

5th line - funkcija biblioteke - ispis na ekranu, izraz u zagradama na ovom redu je parametar funkcije, uvijek je naveden.

; - ovo je znak C operatora, dio je operatora, a ne separator operatora, kao u Pascalu.

Savjeti za čitljivost programa:

1) Odaberite smislena imena

2) Koristite komentare

3) Koristite prazni redovi odvojiti jedan dio funkcije od drugog

4) Stavite svaku izjavu u drugi red.

OSNOVNI ELEMENTI JEZIKA C

Razmislite potrebnih elemenata, uz pomoć kojih treba sastaviti C program:

1. Komentari se koriste za dokumentovanje programa. Svaki program treba da sadrži komentare: koji se algoritam koristi, šta program radi...

Ø 1 način: /* Tekst */ - bilo gdje u programu.

Čim kompajler naiđe na /**/, preskače ih. Kompajler ignoriše /* */ jer ne može interpretirati jezik koji nije C. To jest, ako želite da isključite neki red iz kompilacije, onda ga zatvorite u /**/.

Ø 2 way: ako je komentar velik, onda koristite ovaj tip

/* Red 1 - za komentar bilo koje dužine

niz 3*/

Ø 3 way: // - tekst do kraja reda.

2. Identifikator - ovo je ime koje se dodjeljuje nekom objektu (varijable). Mala slova i velika slova, brojevi i donja crta. Mala i velika slova se razlikuju. (U BASIC-u se ne razlikuju). Ako promenljivu nazovete imenom, Name ili NAME, onda će to biti različite varijable.

Identifikatori počinju slovom ili donjom crtom. Na primjer, _name. Ali nije preporučljivo početi sa _, jer se ovaj znak koristi za globalna imena cijelog C jezika.

AT moderno programiranječesto se koristi za kreiranje identifikatora mađarska notacija, gdje se određeni znakovi koriste za karakterizaciju identifikatora, na primjer:

b - bajt; ch je jednobajtni znak;

w je riječ; f - zastava;

l - duga reč; fn je funkcija;

u je nepotpisan; p je pokazivač;

c - brojač; d – razlika dva pre-x

cz - niz; itd.

3. Uslužne riječi - to su riječi sa kojima se određena semantička značenja strogo porede u jeziku i koje se ne mogu koristiti u druge svrhe. Ovo su imena operatora, bibliotečkih funkcija, naredbi pretprocesora itd. Ove riječi se ne mogu koristiti za kreiranje imena vaših funkcija, varijabli...

PODACI U C PROGRAMU

Svaki program radi sa podaci. Oni su prisutni u programu u obliku varijabli i konstanti.

Pozivaju se podaci koji se mogu promijeniti ili im se dodijeliti vrijednosti tokom izvršavanja programa varijable.

Podaci koji su postavljeni na određene vrijednosti i zadržavaju svoje vrijednosti kroz program, nazivaju se konstantama.

Konstante

Konstante su fiksne vrijednosti. Vrijednost, jednom postavljena, više se ne mijenja. Konstante dolaze u različitim vrstama. Vrste se razlikuju po principu smeštanja u memoriju računara, a kod osobe prema vrsti zapisa. U C-u se koristi 7 ključnih riječi različite vrste podaci: int, long, short, unsigned, char, float, double.

Konstantni tipovi :

a) Cijeli i dugi cijeli brojevi . Pisani su u decimalnim, oktalnim i heksadecimalnim sistemima brojeva. Mogu biti potpisani ili nepotpisani.

Decimalni sistem: cjelobrojne konstante okupirati 16 bit memoriju, i uzeti raspon vrijednosti: -32768 na +32767 (2 15) . Ako je konstanta bez predznaka, raspon se udvostručuje: 0 do 65535(zbog činjenice da se za broj koristi 15. cifra - znak). Da biste označili broj bez predznaka, koristite sufiks u (nepotpisano), na primjer 123u.

Ako je broj veći od 40000, kompajler će ga automatski konvertovati u negativan broj, tako da će sufiks u potrebno: 40000u. U primjeru 123u, kompajlera nije briga postoji li sufiks ili ne, jer je ovaj broj u rasponu 32767.

dugi cijeli broj uzima 32 bita , raspon vrijednosti

±2147483648 (potpisano dugo - dugo). Ako stavite sufiks l, tada će, uprkos broju, 32 bita biti zauzeta. Na primjer: -5326 l

0 – 4294967295 unsigned long- (dugo nepotpisano). Raspon se povećava za 31. bit. Koriste se sufiksi ul, na primjer, 32659ul.

Oktalni sistem :

Ako broj počinje sa 0, on se tumači kao oktalni broj

16 bita 0 ¸ 077777

0100000 ¸ 0177777u

32 bita 0200000 ¸ 01777777777l

020000000000 ¸ 037777777777ul

Heksadecimalni sistem :

Ako broj počinje znakom 0x, onda se tumači kao heksadecimalan

16 bita 0x0000 ¸ 0x7FFF

0x8000 - 0xEFFFu

32 bita 0x10000 ¸ 0x7FFFFFFFl

0x80000000 ¸ 0xFFFFFFFFul

b) Realne konstante. Ovo su brojevi s pomičnim zarezom. Da li je bitno frakcijski dio. Po defaultu, sve realne konstante su tipa double. duplo . Zauzeti u memoriji 8 bajtova (čak i ako je 0,0). Raspon vrijednosti ±1*10±307 , takođe se može upisati naučni oblik, na primjer: 0,5e+15 ili

1,2e-3 = 1,2 * 10 -8 = 0,0012.

Možete forsirati format da bude jednostruke preciznosti float . Broj će uzeti 4 bajta , koristi se sufiks f(5.7 f). Kao rezultat toga, raspon se sužava. ±1*10±37

Kao i povećana preciznost long double - 10 bajtova . (3.14L)

Znak + se može izostaviti. Dozvoljeno je izostaviti ili decimalni zarez ili eksponencijalni dio, ali ne oboje (.2; 4e16). Ne možete napisati razlomak ili cijeli broj, ali ne u isto vrijeme (100.; .8e-5)

c) Simboličke konstante. Ovo je skup simbola koji se koriste u računarima.

Podijeljeni su u 2 grupe: štampani i neštampani(kontrolni kodovi). Znakovna konstanta uključuje samo 1 znak, koji mora biti zatvoren u apostrofima i uzimama 1 bajt memorija.

Svaki simbol ima svoju dvostruku reprezentaciju ASCII tabela. U program se unose simboličke konstante jednostruki navodnici, prilikom kompajliranja u program, zamjenjuje se numerička vrijednost znakova iz ASCII. Jedan znak zauzima 1 bajt.

Znak "A" "a" " " "\n"

Njegov kod je 65 97 32 10

Kako ceo tip podatak "A"=0101 8 , 01000001 2 , 41 16 , 65 10 . Ne morate pamtiti kodove.

Kontrolni kodovi počinju sa \ i također su zatvoreni u apostrofe. Najčešći kontrolni kodovi su:

\n - novi red

\t - tabela (pomaknite kursor za neku fiksnu vrijednost)

\b - korak unazad (pomak za jednu poziciju unazad)

\r - povratak kočije (povratak na početak reda)

\f - ubacivanje obrasca (ubaci papir na 1 stranicu)

\' - apostrof

\" - navodnici

Posljednja tri lika mogu glumiti karakterne konstante, kao i da se koriste u funkciji printf(), tako da njihovo korištenje kao znakova može dovesti do greške. Na primjer, ako želimo prikazati string "Znak \ se zove kosa crta", tada bi izjava trebala izgledati ovako:

printf("Znak \\ se zove kosa crta");

a) String konstante - sadrže niz od 1 ili više znakova zatvorenih u " ". 1 bajt se troši za bilo koji znak + 1 bajt za takozvani nulti znak - znak kraja reda. Null karakter nije broj nula, to znači da broj znakova u nizu (N) mora biti 1 bajt više (N + 1) da bi označio kraj stringa (kompajler ga dodaje automatski). Na primjer: "red teksta" zauzima (13+1) bajtova;

"Svijet" -

Program napisan u C#-u sastoji se od sljedećih blokova:

  • deklaracija imenskog prostora (vrsta kontejnera);
  • deklaracija klase (glavna suština programa);
  • metode klase (potprogrami), barem metoda Main;
  • operatori i izrazi;
  • komentari.

Primjer jednostavnog programa

hajde da razmotrimo najjednostavniji program napisano u C#. Ovo će biti konzolna aplikacija koja prikazuje string "Hello World" (neka vrsta klasika, za prvi program u praksi programera). Kod za takav program je prikazan u nastavku, pogledajmo ga:

//Povezivanje prostora imena System koristeći System; //Deklaracija imenskog prostora imenski prostor ProgramStructure ( //Program deklaracije klase klase Program ( // Glavni metod programi static void Main(string args) ( //Izlazni niz Console.WriteLine("Hello World!"); //Pomoćni izraz Console.ReadKey(); ) ) )

Prvi red ovog programa je komentar. Komentari ni na koji način ne utiču na rad programa, potrebni su osobi koja će održavati programski kod (dovršiti ga, popraviti greške itd.).

Druga linija programa ( korištenje sistema;) je operator koji uključuje standardni prostor imena Sistem. U stvari, dobijamo pristup skupu klasa dostupnih u "kontejneru" Sistem. kao što se vidi, dati niz sastoji se od dvije riječi, prva ( ključna riječ koristeći) znači da želimo uključiti prostor imena, a drugi Sistem je ime željenog imenskog prostora.

Na kraju drugog reda nalazi se znak ";", koji označava kraj naredbe. Svaki programski izraz mora završiti takvim znakom.

Četvrti red programa je opet komentar, baš kao i redovi 7, 10, 13, 15. Komentari u C# počinju znakovima "//" (dvije kose crte, dvije kose crte) i traju samo do kraja reda .

C# takođe ima višelinijske komentare, ponekad je zgodnije koristiti ih, naići ćemo na njih kasnije.

U petoj liniji ( imenski prostor ProgramStructure) deklarira svoj vlastiti prostor imena, zove se "ProgramStructure". Imenski prostor je vrsta kontejnera, a omeđen je vitičastim zagradama (otvara se u redu 6 i zatvara u redu 19) iza njegovog imena. Dakle, sve između redova 6 i 19 pripada imenskom prostoru Struktura programa.

Linija 8 deklariše klasu koja se zove "Program", ovo je glavna i jedina klasa našeg programa. Kao što možete vidjeti, deklaracija klase koristi ključnu riječ klasa nakon čega slijedi naziv klase. U programu može biti ne jedna, već nekoliko klasa. Tipično, klasa se sastoji od skupa metoda koje definiraju takozvano ponašanje klase (funkcionalnost, ako želite). Granice klasa, kao i prostori imena, označeni su vitičastim zagradama (redovi 9 i 18). U našem slučaju, klasa ima samo jedan metod, to je metoda Main.

Red 11 samo deklarira metodu Main. Ova metoda je glavna u našem programu, takozvana ulazna tačka u program. To znači da kada se program pokrene, metoda će se prvo izvršiti. Main. Svaka metoda također ima granice, koje su također označene vitičastim zagradama (redovi 12 i 17).

Metoda Main naš program sadrži samo dvije izjave. Ove izjave se pojavljuju u redovima 14 i 16. Prva ispisuje poruku "Hello World!". A drugi je pomoćni, tera program da čeka na pritisak na tastaturi i ne dozvoljava mu da završi svoje izvršenje do tog trenutka (bez ovog operatora bi program prikazao red i brzo se zatvorio, tako da nismo čak imate vremena da pročitate šta je proizvelo).

Sada pokušajte da napravite i pokrenete ovaj program u Visual Studiju. Za ovo vam je potrebno:

  • pokrenuti Visual Studio;
  • stvoriti novi projekat konzolna aplikacija;
  • kopirajte redove 13-16 iz gornjeg primjera;
  • umetnite ove linije u metodu Main projekat kreiran u Visual Studiju;
  • pritisnite taster F5.

Detaljno sam govorio o tome kako kreirati projekt konzolne aplikacije u Visual Studionu u, savjetujem vam da ga pročitate.

Od čega se sastoji program

Za početak, vrijedno je razumjeti da se program ne može čitati i pisati kao knjiga: od korica do korica, od vrha do dna, red po red. Svaki program se sastoji od zasebnih blokova. Početak bloka koda u C/C++ označen je lijevom vitičastim zagradama ( , njegov kraj je desni vitičasta zagrada } .

Blokovi su različite vrste a koji će biti izvršen zavisi od spoljnih uslova. U primjeru minimalni program možete vidjeti 2 bloka. U ovom primjeru, blokovi su pozvani definicija funkcije. Funkcija je samo blok koda sa dato ime, koje neko onda može koristiti izvana.

AT ovaj slučaj imamo 2 funkcije pod nazivom setup i loop. Njihovo prisustvo je obavezno u bilo kom C++ programu za Arduino. Oni možda ne rade ništa, kao u našem slučaju, ali moraju biti napisani. U suprotnom, dobićete grešku u fazi kompilacije.

Klasični žanr: trepćuće LED

Hajde sada da završimo naš program da se barem nešto desi. Na Arduinu, LED dioda je spojena na 13. pin. Oni se mogu kontrolisati, što ćemo i učiniti.

void setup() ( pinMode(13, OUTPUT) ; ) void loop() ( digitalWrite(13, HIGH) ; kašnjenje (100) ; digitalWrite(13 , LOW) ; kašnjenje (900) ; )

Kompajlirajte, preuzmite program. Vidjet ćete da svake sekunde LED na ploči treperi. Hajde da shvatimo zašto ovaj kod dovodi do treptanja svake sekunde.

Svaki izraz je naredba procesoru da nešto uradi. Izrazi unutar jednog bloka se izvršavaju jedan za drugim, striktno po redu bez ikakvih pauza i prekidača. Odnosno, ako govorimo o jednom specifičnom bloku koda, može se čitati od vrha do dna da bi se razumjelo šta se radi.

Sada hajde da shvatimo kojim redosledom se izvršavaju sami blokovi, tj. funkcije podešavanja i petlje. Nemojte za sada razmišljati šta znače konkretni izrazi, samo pazite na redosled.

    Čim se Arduino uključi, treperi ili se pritisne dugme RESET, "nešto" poziva funkciju postaviti. To jest, prisiljava izraze u njemu da se izvrše.

    Jednom radna postavka završi, odmah "nešto" poziva funkciju petlje.

    Čim se rad petlje završi, odmah "nešto" ponovo poziva funkciju petlje i tako u nedogled.

Ako izraze numerišemo redosledom kojim se izvršavaju, dobijamo:

void setup() ( pinMode(13 , OUTPUT) ; ❶ ) void loop() ( digitalWrite(13 , HIGH) ; ❷ ❻ ❿ kašnjenje (100 ) ; ❸ ❼ … digitalWrite(13 , LOW) ; ❽ 0 kašnjenje) ; ; ❺ ❾ )

Još jednom vas podsećamo da ne pokušavate da sagledate ceo program čitajući od vrha do dna. Od vrha do dna čita se samo sadržaj blokova. Generalno možemo da promenimo redosled podešavanja i deklaracija petlje.

void loop() ( digitalWrite(13 , HIGH) ; ❷ ❻ ❿ kašnjenje (100 ) ; ❸ ❼ … digitalWrite(13 , LOW) ; ❹ ❽ kašnjenje (900 ) ; ❷ ❻ ❿ kašnjenje (100 ) ; ❸ ❼ … digitalWrite(13 , LOW) ; ❹ ❽ kašnjenje (900 ) ; ❺ ❻ ❿ pin(100 ) T void setup(1) ) ; ❶ )

Rezultat ovoga se neće promijeniti ni za jotu: nakon kompilacije, dobićete apsolutno ekvivalentnu binarnu datoteku.

Šta izrazi rade

Pokušajmo sada razumjeti zašto napisani program dovodi do treptanja LED-a.

Kao što znate, Arduino pinovi mogu raditi i kao izlazi i kao ulazi. Kada želimo nešto kontrolisati, odnosno izdati signal, trebamo prebaciti kontrolni pin u izlazno stanje. U našem primjeru pokrećemo LED na pin 13, tako da pin 13 mora biti izveden kao izlaz prije upotrebe.

To se radi izrazom u funkciji za postavljanje:

PinMode(13, IZLAZ) ;

Izrazi su različiti: aritmetički, deklaracije, definicije, uvjeti itd. U ovom slučaju implementiramo u izraz poziv funkcije. Sjećaš se? Imamo njihov funkcije podešavanja i petlje, koje se nazivaju nečim što smo nazvali "nešto". Pa sada mi pozivamo funkcije koje su već negdje napisane.

Konkretno, u našem podešavanju pozivamo funkciju koja se zove pinMode. Postavlja pin naveden brojem na unapred podešeni režim: ulaz ili izlaz. O kojem pinu i o kojem modu je riječ označavamo u zagradama, odvojene zarezom, odmah iza naziva funkcije. U našem slučaju želimo da 13. pin radi kao izlaz. OUTPUT znači izlaz, INPUT znači ulaz.

Pozivaju se kvalifikacione vrijednosti kao što su 13 i OUTPUT argumenti funkcije. Nije neophodno da sve funkcije imaju 2 argumenta. Koliko argumenata ima funkcija zavisi od suštine funkcije, od toga kako ju je autor napisao. Mogu postojati funkcije sa jednim argumentom, tri, dvadeset; Funkcije uopće ne mogu imati argumente. Onda da ih pozovem okrugli nosač otvara i zatim zatvara:

NoInterrupts() ;

Zapravo, možda ste primijetili da ni naše funkcije postavljanja i petlje ne uzimaju nikakve argumente. A tajanstveno "nešto" ih samo zove praznim zagradama u pravo vrijeme.

Vratimo se našem kodu. Dakle, pošto planiramo da LED lampica treperi zauvek, kontrolni pin treba jednom napraviti izlaz, a onda ga ne želimo da pamtimo. Funkcija podešavanja je ideološki osmišljena za to: postavite ploču po potrebi, kako biste s njom kasnije radili.

Pređimo na funkciju petlje:

void loop() (digitalWrite(13, HIGH) ; kašnjenje (100) ; digitalWrite(13, LOW) ; kašnjenje (900) ;)

Poziva se, kao što je spomenuto, odmah nakon postavljanja. I poziva se iznova i iznova čim se završi. Funkcija petlje naziva se glavna programska petlja i ideološki je dizajnirana da obavlja koristan posao. U našem slučaju koristan rad- treperi LED.

Prođimo redom kroz izraze. Dakle, prvi izraz je poziv ugrađenoj funkciji digitalWrite. Dizajniran je tako da daje logičku nulu (LOW, 0 volti) ili logičku (HIGH, 5 volti) na dati pin.2 argumenta se prosljeđuju funkciji digitalWrite: broj pina i logička vrijednost. Kao rezultat toga, prva stvar koju radimo je da upalimo LED na 13. pinu primjenom 5 volti na njega.

Čim se to učini, procesor odmah prelazi na sljedeći izraz. Za nas je ovo poziv funkcije odgode. Funkcija kašnjenja je, opet, ugrađena funkcija koja uzrokuje da procesor spava određeno vrijeme. Potreban je samo jedan argument: vrijeme u milisekundama za spavanje. U našem slučaju, to je 100 ms.

Dok spavamo, sve ostaje kako jeste, tj. LED nastavlja da svetli. Čim istekne 100 ms, procesor se budi i odmah prelazi na sljedeći izraz. U našem primjeru, ovo je opet poziv poznate ugrađene funkcije digitalWrite. Istina, ovaj put prosljeđujemo LOW vrijednost kao drugi argument. Odnosno, postavljamo logičku nulu na 13. pin, odnosno primjenjujemo 0 volti, odnosno gasimo LED.

Nakon što se LED dioda ugasi, prelazimo na sljedeći izraz. Opet, ovo je poziv funkcije odgode. Ovaj put spavamo 900ms.

Jednom kada se spavanje završi, funkcija petlje se završava. Po završetku, "nešto" ga odmah ponovo pozove i sve se ponovi: LED svijetli, gori, gasi se, čeka itd.

Ako prevedete ono što je napisano na ruski, dobit ćete sljedeći algoritam:

    Zapalili smo LED

    Spavanje 100 milisekundi

    Gasimo LED

    Spavanje 900 milisekundi

    Idite na tačku 1

Tako smo dobili Arduino sa farom koji treperi svakih 100 + 900 ms = 1000 ms = 1 sek.

Šta se može promijeniti

Iskoristimo samo stečeno znanje da napravimo nekoliko varijacija programa kako bismo bolje razumjeli princip.

Možete spojiti eksterni LED ili drugi uređaj koji treba da "treperi" na drugi pin. Na primjer, 5. Kako bi se program trebao promijeniti u ovom slučaju? Moramo zamijeniti broj sa 5. gdje god da smo okrenuli 13. pin:

Sastavite, preuzmite, testirajte.

Šta treba učiniti da LED dioda zatreperi 2 puta u sekundi? Smanjite vrijeme mirovanja tako da ukupno bude 500 ms:

void setup() ( pinMode(5 , OUTPUT) ; ) void loop() ( digitalWrite(5, HIGH) ; kašnjenje (50) ; digitalWrite(5 , LOW) ; kašnjenje (450 ) ; )

Kako mogu učiniti da LED dioda zatreperi dvaput sa svakim "namigvanjem"? Morate ga dva puta zapaliti uz kratku pauzu između uključivanja:

void setup() ( pinMode(5 , OUTPUT) ; ) void loop() ( digitalWrite(5, HIGH) ; kašnjenje(50) ; digitalWrite(5, LOW) ; kašnjenje (50) ; digitalWrite(5, HIGH) ; kašnjenje (50 ) ; digitalWrite (5 , LOW) ; kašnjenje (350 ) ; )

Kako napraviti da uređaj ima 2 LED diode koje bi treptale svake sekunde naizmjenično? Morate komunicirati s dvije igle i raditi u petlji s jednim ili drugim:

void setup() ( pinMode(5, OUTPUT) ; pinMode(6, OUTPUT) ; ) void loop() ( digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5, LOW) ; kašnjenje (900) ; digitalWrite (6, HIGH) ; kašnjenje (100 ) ; digitalWrite(6, LOW) ; kašnjenje (900 ) ; )

Kako napraviti da uređaj ima 2 LED diode koje bi se prebacivale na način željezničkog semafora: jedna ili druga bi gorjela? Samo ne trebate isključiti goruću LED diodu odmah tu, već pričekajte trenutak uključivanja:

void setup() ( pinMode(5, OUTPUT) ; pinMode(6, OUTPUT) ; ) void loop() ( digitalWrite(5, HIGH) ; digitalWrite(6, LOW) ; kašnjenje (1000) ; digitalWrite(5, LOW) ; digitalWrite (6 , HIGH) ; kašnjenje (1000 ) ; )

Ostale ideje slobodno provjerite sami. Kao što vidite, sve je jednostavno!

O praznom prostoru i prekrasnom kodu

U C++, razmaci, prijelomi reda i tabulatori nemaju od velikog značaja za kompajler. Tamo gdje postoji razmak, može doći do prijeloma reda i obrnuto. U stvari, 10 razmaka u nizu, 2 prijeloma reda i još 5 razmaka je sve ekvivalentno jednom razmaku.

Beli prostor je programerski alat, pomoću kojeg program možete učiniti razumljivim i vizuelnim, ili ga unakaziti do neprepoznatljivosti. Na primjer, razmotrite program za treptanje LED diode:

void setup() ( pinMode(5 , OUTPUT) ; ) void loop() ( digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5 , LOW) ; kašnjenje (900 ) ; )

Možemo ga promijeniti ovako:

void setup( ) ( pinMode(5 , OUTPUT) ; ) void petlja () ( digitalWrite(5, HIGH) ; kašnjenje (100 ) ; digitalWrite(5 ,LOW) ; kašnjenje (900 ) ; )

Sve što smo uradili je da malo "poradimo" sa praznim prostorom. Sada možete jasno vidjeti razliku između dobro oblikovanog koda i nečitljivog.

Da biste slijedili neizgovoreni zakon dizajna softvera, koji se poštuje na forumima, kada ga drugi ljudi čitaju, lako ga primijetite, slijedite nekoliko jednostavnih pravila:

1. Uvijek, na početku novog bloka između ( i ), povećajte uvlačenje. Obično se koriste 2 ili 4 razmaka. Odaberite jednu od vrijednosti i držite je se cijelo vrijeme.

Loše:

void loop() (digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5, LOW) ; kašnjenje (900) ;)

dobro:

void loop() (digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5, LOW) ; kašnjenje (900) ;)

2. Kao u prirodnom jeziku: stavite razmak iza zareza i ne stavljajte prije.

Loše:

DigitalWrite(5 ,HIGH) ; digitalWrite(5, HIGH) ; digitalWrite(5 ,HIGH) ;

dobro:

DigitalWrite(5, HIGH) ;

3. Postavite znak za početak bloka (uključeno nova linija na trenutni nivo uvlaka ili na kraju prethodne. I znak kraja bloka ) na zasebnom redu na trenutnom nivou uvlačenja:

Loše:

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

dobro:

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

4. Koristite prazne linije da odvojite semantičke blokove:

dobro:

Još bolje:

void loop() ( digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5, LOW) ; kašnjenje (900) ; digitalWrite(6, HIGH) ; kašnjenje (100) ; digitalWrite(6, LOW) ; kašnjenje( 900 ;)

O tački i zarezu

Možda se pitate: zašto postoji tačka-zarez na kraju svakog izraza? To su pravila C++-a. Takva pravila se zovu jezička sintaksa. Po simbolu; kompajler razume gde se izraz završava.

Kao što je već spomenuto, prijelomi reda za njega su prazna fraza, pa se fokusira na ovaj znak interpunkcije. Ovo vam omogućava da napišete nekoliko izraza odjednom u jednom redu:

void loop() (digitalWrite(5, HIGH) ; kašnjenje (100) ; digitalWrite(5, LOW) ; kašnjenje (900) ;)

Program je ispravan i ekvivalentan onome što smo već vidjeli. Međutim, ovakvo pisanje je loša forma. Kod je mnogo teže čitati. Dakle, osim ako nemate 100% dobar razlog da napišete više izjava u istom redu, nemojte.

O komentarima

Jedno od pravila dobrog programiranja glasi: "Pišite kod tako da bude toliko jasan da ga ne treba objašnjavati." Moguće je, ali ne uvijek. Da biste čitaocima objasnili neke neočigledne tačke u kodu: vašim kolegama ili sebi za mjesec dana, postoje tzv. komentari.

Ovo su dizajni u programski kod, koje kompajler potpuno ignoriše i relevantne su samo za čitaoca. Komentari mogu biti višeredni ili jednoredni:

/* Funkcija podešavanja se poziva prva kada se Arduino uključi. Ovo je komentar u više redaka */ void setup()( // postaviti pin 13 na izlazni mod pinMode(13, OUTPUT) ; ) void loop() ( digitalWrite(13, HIGH) ; kašnjenje(100) ; // spavanje 100ms digitalWrite(13, LOW) ; kašnjenje(900) ;)

Kao što vidite, između znakova /* i */ možete napisati koliko god želite redova komentara. A nakon niza / /, sve što slijedi do kraja reda smatra se komentarom.

Dakle, nadamo se da su najosnovniji principi pisanja programa postali jasni. Stečeno znanje vam omogućava da programski kontrolišete napajanje Arduino pinova prema određenim vremenskim šemama. Ovo nije toliko, ali ipak dovoljno za prve eksperimente.

C, kao što su statičke i lokalne varijable, nizovi, pokazivači, funkcije itd., su što je moguće bliži arhitekturi pravih kompjutera. Dakle, pokazivač je samo memorijska adresa, niz je neprekidno područje memorije, lokalne varijable su varijable koje se nalaze na hardverskom stogu, statičke varijable su u statičkoj memoriji. C programer uvijek ima prilično dobru ideju o tome kako će program koji napiše raditi na bilo kojoj određenoj arhitekturi. Drugim riječima, jezik C daje programeru potpunu kontrolu nad računarom.

U početku je jezik C bio zamišljen kao zamjena za asembler za pisanje operativni sistemi. Budući da je C jezik visokog nivoa, arhitektura agnostički, kod operativnog sistema se pokazao lako prenosivim sa jedne platforme na drugu. Prvi operativni sistem napisan skoro u potpunosti na C je bio Unix sistem. Gotovo svi operativni sistemi koji se danas koriste napisani su na C. Osim toga, softverski alati koji operativni sistem pruža programere aplikativni programi(tzv. API - Application Program Interface), su skupovi sistemske funkcije na C jeziku.

Međutim, opseg jezika C nije bio ograničen na razvoj operativnih sistema. Jezik C se pokazao veoma pogodnim u programima za obradu teksta i slika, u naučnim i inženjerskim proračunima. Objektno orijentirani jezici bazirani na C su odlični za programiranje u prozorskim okruženjima.

AT ovaj odeljak biće dati samo osnovni koncepti jezika C (i delimično C++). Ne zamjenjuje čitanje kompletan udžbenik u C ili C++, na primjer, knjige i .

Koristićemo C++ kompajler umesto C. Činjenica je da je jezik C skoro u potpunosti uključen u C++, tj. normalan C program je važeći C++ program. Riječ "normalno" znači da ne sadrži neuspjele konstrukcije preostale od rane verzije C i trenutno se ne koristi. C++ kompajler je poželjniji u odnosu na C prevodilac jer ima strožiju kontrolu grešaka. Osim toga, neke C++ konstrukcije koje se ne odnose na objektno orijentirano programiranje su vrlo zgodne i zapravo su poboljšanje jezika C. To su, prije svega, komentari // , mogućnost opisivanja lokalnih varijabli u bilo kojoj točki programa, a ne samo na početku bloka, kao i postavljanje konstanti bez korištenja #define operatora predprocesora. Koristićemo ove karakteristike C++-a, ostajući u suštini u okviru C jezika.

Struktura C programa

Bilo koji je dovoljan veliki program u C (programeri koriste termin projekat) se sastoji od datoteka. Datoteke nezavisno prevodi C kompajler, a zatim ih povezuje program za pravljenje zadataka, što rezultira datotekom sa programom spremnim za izvršavanje. Pozivaju se datoteke koje sadrže tekstove C programa početni.

Na jeziku C izvorne datoteke su dvije vrste:

  • zaglavlje ili h-datoteke;
  • implementacijske datoteke ili C datoteke.

Nazivi datoteka zaglavlja imaju ekstenziju ".h". Imena datoteka implementacije imaju ekstenzije ".c" za jezik C i ".cpp", ".cxx" ili ".cc" za jezik C++.

Nažalost, za razliku od C jezika, programeri se nisu mogli složiti oko toga jedan nastavak imena za datoteke koje sadrže C++ programe. Koristićemo ekstenziju ".h" za datoteke zaglavlja i ".cpp" ekstenziju za datoteke implementacije.

fajlovi zaglavlja sadrži samo opise. Prije svega, ovo su prototipovi funkcija. Prototip funkcije opisuje ime funkcije, tip povratka, broj i tipove njenih argumenata. Sam tekst funkcije nije sadržan u h-datoteci. Također, h-datoteke opisuju imena i tipove vanjskih varijabli, konstanti, novih tipova, struktura itd. Općenito, h-datoteke sadrže samo interfejsi, tj. informacije potrebne za korištenje programa koje su već napisali drugi programeri (ili isti programer prije). Datoteke zaglavlja pružaju samo informacije o drugim programima. Prilikom prevođenja datoteka zaglavlja po pravilu se ne kreiraju objekti. Na primjer, u datoteci zaglavlja ne možete definisati globalna varijabla. Opisni niz

definiranje cjelobrojne varijable x je greška. Umjesto toga, koristite opis

što znači da je varijabla x definirana negdje u implementacionom fajlu (što je nepoznato). Riječ ekstern (spoljašnji) je samo javlja informacije o vanjskoj varijabli, ali ne definira tu varijablu.

Fajlovi implementacije, ili C-fajlovi, sadrže tekstove funkcija i definicija globalnih varijabli. Jednostavno rečeno, C datoteke sadrže same programe, dok h datoteke sadrže samo informacije o programima.

Performanse izvorni kod u obliku datoteka zaglavlja i datoteka implementacije potrebno je kreirati velikih projekata vlasništvo modularna struktura. Datoteke zaglavlja koriste se za prijenos informacija između modula. Fajlovi za implementaciju su pojedinačni moduli, koji se razvijaju i prevode nezavisno jedan od drugog i kombinuju da bi stvorili izvršni program.

Datoteke implementacije mogu uključivati ​​opise sadržane u datotekama zaglavlja. Same datoteke zaglavlja također mogu koristiti druge datoteke zaglavlja. header fajl je uključen pomoću direktive preprocesora #include. Na primjer, opisi standardne karakteristike I/O su omogućeni nizom

#include

(stdio - od riječi standardni ulaz/izlaz). Ime h-datoteke piše se u uglatim zagradama ako je ovaj h-

Top Related Articles