Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Recenzije
  • Struktura konzolnog programa u c. Osnove jezika C: struktura C programa, osnovni tipovi i konstrukcija novih tipova, operacija i izraza

Struktura konzolnog programa u c. Osnove jezika C: struktura C programa, osnovni tipovi i konstrukcija novih tipova, operacija i izraza

Od čega se sastoji program

Za početak, trebali biste shvatiti da se program ne može čitati i pisati kao knjiga: od korice do korice, 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častom zagradom ( njegov kraj je označen desnom vitičastom zagradom).

Blokovi su različitih tipova i koji će od njih biti izvršen zavisi od spoljašnjih uslova. U primjeru minimalnog programa možete vidjeti 2 bloka. U ovom primjeru, blokovi su imenovani definicija funkcije... Funkcija je jednostavno blok koda sa datim imenom koji neko može koristiti izvana.

U ovom slučaju imamo 2 funkcije pod nazivom setup i loop. Njihovo prisustvo je potrebno u bilo kojem C++ programu za Arduino. Oni možda ne rade ništa, kao u našem slučaju, ali moraju biti napisani. U suprotnom, dobit ćete grešku u vrijeme kompajliranja.

Klasika žanra: trepćuće LED

Hajde sada da dodamo naš program da se barem nešto desi. Na Arduinu, LED je spojen na pin 13. Može se kontrolisati, što ćemo i uraditi.

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 LED na ploči treperi svake sekunde. 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, strogo po redu, bez ikakvih pauza ili prebacivanja. Odnosno, ako govorimo o jednom specifičnom bloku koda, on se može č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 o tome šta konkretni izrazi znače, samo pazite na redoslijed.

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

    Čim se podešavanje završi, nešto odmah poziva funkciju petlje.

    Čim se petlja završi, odmah "nešto" ponovo poziva funkciju petlje i tako redom do beskonačnosti.

Ako izraze numerišete redosledom kako se izvode, dobijate:

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

Podsjetimo još jednom da ne treba pokušavati da sagledate cijeli 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); ❺ ❾) podešavanje void () (pinMode (13, OUT) ); ❶)

Rezultat se neće promijeniti ni za jotu od ovoga: nakon kompilacije, dobićete apsolutno ekvivalentan binarni fajl.

Šta izrazi rade

Sada pokušajmo da shvatimo zašto napisani program na kraju treperi LED dioda.

Kao što znate, Arduino pinovi mogu djelovati kao izlazi i ulazi. Kada želimo nešto kontrolisati, odnosno dati signal, potrebno je da kontrolni pin stavimo u stanje rada na izlazu. U našem primjeru pokrećemo LED na pin 13, tako da pin 13 mora biti podešen na izlaz prije upotrebe.

To se radi izrazom u funkciji za postavljanje:

PinMode (13, IZLAZ);

Izrazi su različiti: aritmetički, deklaracije, definicije, kondicionali, itd. U ovom slučaju, mi u izrazu provodimo poziv funkcije... Sećaš se? Imamo njihov funkcije podešavanja i petlje, koje se nazivaju onim š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 određen brojem na specificirani način rada: ulaz ili izlaz. O kakvom pinu i o kom modu je reč, mi označavamo u zagradama, odvojeno zarezima, odmah iza naziva funkcije. U našem slučaju želimo da 13. pin radi kao izlaz. OUTPUT označava izlaz, INPUT označava ulaz.

Pozivaju se pojašnjavajuće vrijednosti kao što su 13 i OUTPUT argumenti funkcije... Uopšte 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. Zatim, da ih pozovete, zagrada se otvara i odmah zatvara:

NoInterrupts ();

Zapravo, možda ste primijetili da ni naše funkcije podešavanja i petlje ne uzimaju nikakve argumente. I tajanstveno "nešto" ih na isti način naziva praznim zagradama u pravom trenutku.

Vratimo se našem kodu. Dakle, pošto planiramo da LED lampica treperi zauvek, kontrolni pin mora biti jedan izlaz i onda ga ne želimo da pamtimo. Funkcija podešavanja ideološki je za to: konfigurišite ploču po potrebi, tako da možete kasnije da radite sa njom.

Pređimo na funkciju petlje:

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

Kao što je spomenuto, poziva se odmah nakon postavljanja. I poziva se iznova i iznova čim se završi. Funkcija petlje naziva se glavnom petljom programa i ideološki je dizajnirana da obavlja koristan posao. U našem slučaju, koristan posao je treptanje LED diode.

Prođimo redom kroz izraze. Dakle, prvi izraz je poziv ugrađenoj funkciji digitalWrite. Namijenjen je za isporuku logičke nule (LOW, 0 volti) ili logičke (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, napajajući mu 5 volti.

Kada se to uradi, procesor odmah prelazi na sljedeći izraz. Imamo ovaj poziv funkcije kašnjenja. Funkcija kašnjenja je, opet, ugrađena funkcija koja čini 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 je, tj. LED ostaje uključen. Čim prođe 100ms, 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 napajamo 0 volti, odnosno gasimo LED.

Nakon što je LED dioda isključena, prelazimo na sljedeći izraz. Opet, ovo je poziv funkcije odgode. Ovaj put idemo na spavanje 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 gori, pali, gasi, čeka itd.

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

    Palimo LED

    Spavanje 100 milisekundi

    Isključivanje LED-a

    Spavanje 900 milisekundi

    Idite na korak 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 i napravimo nekoliko varijacija programa kako bismo bolje razumjeli princip.

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

Sastavite, preuzmite, testirajte.

Šta treba učiniti da LED bljeska 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 natjerati LED da 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 trepere naizmjenično svake sekunde? 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 tako da uređaj ima 2 LED diode koje bi se prebacivale na način željezničkog semafora: da li bi jedna bila upaljena? Samo treba da ne ugasite upaljenu LED diodu tu, već sač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 možete provjeriti sami. Kao što vidite, sve je jednostavno!

O praznom prostoru i prekrasnom kodu

U C ++, razmaci, prijelomi redova i tabovi nisu važni za kompajler. Tamo gdje postoji razmak, može doći do prijeloma reda i obrnuto. Zapravo, 10 razmaka u nizu, 2 prijeloma reda i još 5 razmaka su svi ekvivalentni jednom razmaku.

Beli prostor je programerski alat pomoću kojeg možete ili učiniti program razumljivim i intuitivnim, ili ga unakaziti do neprepoznatljivosti. Na primjer, sjetimo se programa 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 loop () (digitalWrite (5, HIGH); kašnjenje (100); digitalWrite (5, LOW); kašnjenje (900);)

Sve što smo uradili je da smo malo pobrkali po praznom prostoru. Sada možete jasno vidjeti razliku između mršavog i nečitljivog koda.

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

1. Uvijek, kada započinjete novi blok između (i), povećajte uvlačenje. Obično se koriste 2 ili 4 razmaka. Odaberite jednu od vrijednosti i držite je se svuda.

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 i u prirodnom jeziku, koristite razmak iza zareza i ne stavljajte ga ispred.

Loše:

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

dobro:

DigitalWrite (5, HIGH);

3. Postavite početni znak bloka (na novu liniju na trenutnom nivou uvlačenja ili na kraj prethodnog. I znak za završetak bloka) u poseban red 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 redove da odvojite blokove značenja:

dobro:

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? Ovo su pravila C++. 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, loše je pisati ovako. Kod je mnogo teže pročitati. Stoga, ako nemate 100% dobar razlog da napišete nekoliko izraza u jednom redu, nemojte to činiti.

O komentarima

Jedno od pravila dobrog programiranja glasi: "napišite svoj kod tako da bude toliko razumljiv da ne treba objašnjenja." To je moguće, ali ne uvijek. Da bi razjasnili neke neočigledne tačke u kodu njegovim čitaocima: vašim kolegama ili vama samima za mesec dana, postoje takozvani komentari.

Ovo su konstrukcije u programskom kodu koje kompajler potpuno ignoriše i znače samo čitaocu. Komentari mogu biti višeredni ili jednoredni:

/ * Funkcija podešavanja se zove prva kada se Arduino uključi i ovo je komentar u više redaka * / void setup () ( // postaviti 13. pin u 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 simbola / * 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 sastavljanja 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.

Sam program C++ je tekstualna datoteka koja sadrži konstrukcije i operatore datog jezika u redoslijedu koji je odredio programer. U najjednostavnijem slučaju, ova tekstualna datoteka može sadržavati informacije poput ove:

Listing 1.1. Primjer jednostavnog programa.

/ * Primjer jednostavnog programa * /
#include
int main ()
{
printf ("Zdravo, svijet!");
return 0;
}

i obično ima cpp ekstenziju kao što je "ex1.cpp".

Sljedeći korak je kompajliranje izvornog koda. Kompilacija se odnosi na proces kojim se sadržaj tekstualne datoteke pretvara u izvršni mašinski kod, koji razume procesor računara. Međutim, kompajler ne kreira program spreman za pokretanje, već samo objektni kod (datoteka sa ekstenzijom * .obj). Ovaj kod je međukorak u kreiranju gotovog programa. Činjenica je da program koji se kreira može sadržavati funkcije standardnih C ++ biblioteka, čije su implementacije opisane u objektnim datotekama biblioteka. Na primjer, gornji program koristi funkciju printf () standardne biblioteke stdio.h. To znači da će objektna datoteka ex1.obj sadržavati samo instrukcije za pozivanje ove funkcije, ali kod same funkcije neće biti tamo.

Da bi konačni izvršni program sadržavao sve potrebne implementacije funkcija, koristi se povezivač objektnog koda. Linker je program koji kombinuje objektne kodove programa koji se kreira, objektne kodove implementacije bibliotečkih funkcija i standardni kod za pokretanje za dati operativni sistem u jednu izvršnu datoteku. Kao rezultat toga, i objektna datoteka i izvršna datoteka se sastoje od instrukcija strojnog koda. Međutim, objektna datoteka sadrži samo rezultat prijevoda na strojni jezik teksta programa koji je kreirao programer, a izvršna datoteka također sadrži strojni kod za standardne bibliotečke rutine koje se koriste i za startup kod.

Pogledajmo pobliže primjer programa u Listingu 1.1. Prvi red navodi komentare, tj. bilješke koje će vam pomoći da bolje razumijete program. Oni su samo za čitanje i kompajler ih ignoriše. Drugi red sadrži direktivu #include, koja nalaže C++ pretprocesoru da ubaci sadržaj 'stdio.h' datoteke umjesto ove linije tokom kompilacije. Treći red definira funkciju zvanu main koja vraća cijeli broj (tip int) i ne uzima argumente (tip void). Glavna () funkcija je obavezna funkcija za sve C ++ programe, a bez nje se u fazi kompilacije pojavljuje poruka o grešci, što ukazuje na nepostojanje ove funkcije. Ova funkcija je obavezna zbog činjenice da je ulazna tačka u program. U ovom slučaju, ulazna točka se odnosi na funkciju s kojom program počinje i završava. Na primjer, kada se pokrene exe datoteka, aktivira se funkcija main (), izvršavaju se svi izrazi uključeni u nju i program se prekida. Dakle, logika cijelog programa je sadržana u ovoj funkciji. U gornjem primjeru, kada se pozove funkcija main (), poziva se funkcija printf (), koja prikazuje poruku “Hello World!” na ekranu monitora, a zatim se izvršava naredba return koja vraća nultu vrijednost. Ovaj broj vraća sama funkcija main () operativnom sistemu i označava uspješan završetak programa. Vitičaste zagrade () se koriste za definiranje početka i kraja tijela funkcije, tj. sadrže sve moguće operatore koji opisuju rad ove funkcije. Treba napomenuti da se iza svakog operatora u jeziku C++ stavlja simbol ';'. Dakle, navedeni primjer pokazuje opštu strukturu C++ programa.

Svaki program napisan u jeziku C sastoji se od jedne ili više "funkcija", koje su glavni moduli od kojih je sastavljen.

Primjer strukture jednostavnog C programa:

Opšti oblik

Primjer

direktive predprocesora

# uključuje

# definirajte N 10

naziv glavne funkcije

početak tijela glavne funkcije

deklaracije varijabli i niza

int x = 1; char str [N];

programski operateri

stavlja ("Enter ime");

dobiva (str);

printf ("\ n% s, ti% d moj gost!", str, x);

Kraj tijela glavne funkcije

      1. Preprocesorske direktive

Kompajler sadrži program tzv pretprocesor... Predprocesor radi prije nego što prevede program sa jezika visokog nivoa u mašinski jezik, izvodeći njegovu preliminarnu transformaciju. Svaka direktiva pretprocesora počinje znakom # (broj) i proteže se kroz cijeli red. Smjernice koje se ne uklapaju u jedan red mogu se nastaviti u sljedećem redu. Znak za nastavak reda je znak obrnute kose crte (\) u redu koji se nastavlja.

Najčešće korištena direktiva je uključivanje datoteke u program

# uključiti < ime>

gdje ime- naziv datoteke uključene u tekst programa.

Ova direktiva se zove direktiva o supstituciji ... Kaže kompajleru da postavi datoteku na svoje mjesto ime... File ime zove zaglavlje. Sadrži deklaracije podataka i funkcija koje se koriste u programu. Na primjer, uključivanje direktive u program

# uključiti < math. h>

će vam omogućiti da koristite standardne matematičke funkcije u programu kao što su sin x, cos x, ln x, itd. Lista standardnih matematičkih funkcija će biti data u nastavku.

Direktiva

# uključiti < stdio. h>

omogućava korištenje standardnih I/O funkcija u programu.

Druga često korištena direktiva je direktiva o definiciji

#defini S1 S2

gdje S1, S2- znakovni nizovi.

Pretprocesor traži niz znakova u tekstu programa S1 i zamjenjuje ga nizom S2 ... Na primjer, uključivanje direktive u program

# definisati P printf

će vam omogućiti da ukucate slovo na tastaturi P umjesto riječi printf.

Ova zamjena se ne vrši unutar tekstualnih nizova (literala), karakternih konstanti i komentara, tj. direktivna akcija # definisati ne odnosi se na tekstove omeđene navodnicima, apostrofima i unutar komentara.

      1. Glavna funkcija

Svaki C program mora sadržavati deklaraciju funkcije main(), koja se zove glavna funkcija . Obično ova funkcija nema parametre i ne vraća nikakvu vrijednost. Da bi se ukazala na ovu činjenicu, korištena je riječ void. Dakle, red s imenom glavne funkcije obično izgleda ovako:

void main (void)

void main ()

      1. Varijable i nizovi

Niz je grupa varijabli istog tipa sa zajedničkim imenom. Ime varijable ili niza je identifikator - niz sastavljen od znakova:

a - z, A - Z, 0 - 9, _ (podvučeno),

a prvi znak ne može biti cifra. Mala i velika slova latinice percipiraju se kao različiti znakovi. Servisne riječi jezika C ne mogu se koristiti kao ime varijable ili niza. Glavne službene riječi jezika C date su u Dodatku.

Elementi niza se razlikuju po broju (indeksima). Indeks može prihvatiti samo nenegativne cjelobrojne vrijednosti. Indeks se piše iza imena niza u uglastim zagradama. Indeksa može biti nekoliko. U ovom slučaju, svaki indeks je napisan u svojim uglastim zagradama.

U jeziku C mogu se koristiti varijable i nizovi različitih tipova. Svaki tip podataka zauzima određenu količinu memorijskih bajtova i može uzeti vrijednosti iz određenog raspona. Količina ove memorije i, shodno tome, raspon prihvaćenih vrijednosti u različitim implementacijama jezika C može se razlikovati. Broj bajtova memorije koje zauzima varijabla određenog tipa za određenu implementaciju jezika C može se odrediti pomoću operacije sizeof(vrstu). Na primjer, možete odrediti količinu memorije koja je dodijeljena za varijablu cjelobrojnog tipa ovako:

k = sizeof (int);

printf(„Pod varijablom tipaintdodijeljen % d bajtova memorije ",k);

U ovim smjernicama razmatraju se tri glavna tipa varijabli i nizova, daju se tipične vrijednosti količine zauzete memorije i raspon vrijednosti (tabela 1):

Tabela 1

Specifikator vrste (ključna riječ)

Značenje

Veličina

memorija (bajt)

Raspon vrijednosti

Cijeli broj

32768 . . . +32767

2147483648 . . . +2147483647

Validan

Važeći broj tipa

3,4 ּ 10 -38. ... ... 3,4 ּ 10 38

(modulo)

karakter

128 . . . +127

Pogledajmo bliže varijablu tog tipa char... Kao što možete vidjeti iz tabele. 1, varijabla tipa char zauzima jedan bajt memorije. Jedan bajt memorije može pohraniti ili neoznačeni cijeli broj iz raspona ili cijeli broj s predznakom iz raspona [–128, 127]. Ovaj broj je kod za jedan od 256 znakova. Znak koji odgovara datom kodu je određen korištenom tablicom kodova. Dakle, vrijednost varijable tipa char može se smatrati ili kao cijeli broj ili kao znak čiji je kod jednak ovom broju.

C, kao što su statičke i lokalne varijable, nizovi, pokazivači, funkcije itd., su što je moguće bliži arhitekturi pravih računara. Dakle, pokazivač je samo memorijska adresa, niz je susjedno 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 tačnu ideju o tome kako će program koji kreira raditi na bilo kojoj određenoj arhitekturi. Drugim riječima, jezik C daje programeru potpunu kontrolu nad računarom.

Prvobitno, C je zamišljen kao zamena za Assembly za pisanje operativnih sistema. Pošto je C jezik visokog nivoa, neovisan o arhitekturi, tekst operativnog sistema se lako prenosio sa jedne platforme na drugu. Prvi operativni sistem, napisan skoro u potpunosti na C, bio je Unix sistem. Danas su skoro svi operativni sistemi koji se koriste napisani na C. Osim toga, programski alati koji operativni sistem pruža programerima aplikativnih programa (tzv. API - Application Program Interface) - skup sistemskih funkcija u jeziku C.

Međutim, opseg jezika C nije bio ograničen na razvoj operativnih sistema. Pokazalo se da je jezik C veoma pogodan u programima za obradu teksta i slike, u naučnim i inženjerskim proračunima. Objektno orijentisani jezici bazirani na C su odlični za programiranje u prozorskim okruženjima.

U ovom odeljku biće dati samo osnovni koncepti jezika C (i delimično C ++). Ne zamjenjuje čitanje kompletnog udžbenika C ili C ++, kao što su knjige i.

Mi ćemo koristiti C++ kompajler umjesto C kompajlera. Č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 loše konstrukcije preostale iz ranijih verzija C-a i koje se danas ne koriste. Prevodilac C ++ je poželjniji u odnosu na C kompajler jer ima strožiju kontrolu grešaka. Osim toga, neke C++ konstrukcije koje se ne odnose na objektno orijentirano programiranje su vrlo zgodne i, u stvari, predstavljaju poboljšanja jezika C. To su, prije svega, komentari //, mogućnost opisivanja lokalnih varijabli u bilo kojoj tački programa, a ne samo na početku bloka, kao i postavljanje konstanti bez korištenja operatora preprocesora #define. Koristićemo ove karakteristike C++, ostajući suštinski u okviru C jezika.

Struktura C programa

Bilo koji dovoljno veliki C program (programeri koriste termin projekat) se sastoji od datoteka. Datoteke kompajlira C prevodilac nezavisno jedan od drugog, a zatim ih kombinuje program za pravljenje zadataka, što rezultira datotekom sa programom koja je spremna za izvršenje. Pozivaju se datoteke koje sadrže tekstove C programa početni.

U jeziku C, izvorni fajlovi su dva tipa:

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

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

Nažalost, za razliku od jezika C, programeri nisu bili u mogućnosti da se dogovore oko jednog proširenja imena za datoteke koje sadrže C++ programe. Koristit ćemo ekstenziju ".h" za datoteke zaglavlja i ".cpp" ekstenziju za datoteke implementacije.

Fajlovi zaglavlja sadrže samo opise. Prije svega, ovo su prototipovi funkcija. Prototip funkcije opisuje ime funkcije, tip povratka, broj i tipove njenih argumenata. Tekst same 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 u pravilu se ne kreiraju objekti. Na primjer, u datoteci zaglavlja ne možete definisati globalna varijabla. Red opisa

definiranje cjelobrojne varijable x je greška. Umjesto toga treba koristiti opis

što znači da je varijabla x definirana negdje u implementacionom fajlu (što je nepoznato). Samo riječ extern (eksterna). saopštava informacije o vanjskoj varijabli, ali ne definira tu varijablu.

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

Prezentacija izvornih tekstova u obliku datoteka zaglavlja i implementacionih datoteka neophodna je za kreiranje velikih projekata sa modularnom strukturom. Datoteke zaglavlja koriste se za prijenos informacija između modula. Datoteke za implementaciju su zasebni moduli koji se razvijaju i prevode nezavisno jedan od drugog i kombinuju se da bi se kreirao izvršni program.

Datoteke implementacije mogu uključivati ​​opise sadržane u datotekama zaglavlja. Sami fajlovi zaglavlja mogu koristiti i druge datoteke zaglavlja. Datoteka zaglavlja je uključena pomoću direktive preprocesora #include. Na primjer, opisi standardnih I/O funkcija uključeni su u liniju

#include

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

Molimo obustavite AdBlock na ovoj stranici.

Nadam se da ste već instalirali neki IDE na svoj računar i naučili kako da kompajlirate programe u njemu. Ako ne, onda

Svi programi napisani u C-u imaju zajedničku strukturu. O čemu ćemo govoriti u ovoj lekciji. U tome će nam pomoći naš prvi program napisan u prethodnom koraku.

Popunićemo jednostavnu karticu. Trenutno znamo da postoje programi, ali kako su raspoređeni unutra ne znamo. Stoga će naša karta izgledati ovako.

Slika 1 Mapa "Struktura C programa." Prvi nivo.

Kroz kurs ćemo se vraćati na ovu mapu, usavršavati je, dopunjavati je novim elementima i blokovima.

Sada pažnja. Ne budite uznemireni! Ispod je izvorni kod za tri jednostavna programa. Vaš zadatak je da ih pažljivo pogledate i pokušate pronaći neki obrazac u njihovom kodu (nešto zajedničko što svaki program ima).

Listing 1. Program 1. Štampa "Hello, World!"

#include

Listing 2. Program 2

Int main (void) (int a, b, c; a = 5; b = 10; c = a + b; povratak 0;)

Listing 3. Program 3

#include int main (void) (FILE * fp; fp = fopen ("input.txt", "w"); fprintf (fp, "Ovo je Sparta!"); fclose (fp); return 0;)

Uzmite si vremena da pogledate ostatak lekcije i tačan odgovor na ovaj problem. Prvo pokušajte sami odgovoriti. Nakon toga pritisnite dugme "Gledaj nastavak!"

Dakle, odgovor: U svim gore navedenim programima prisutna je sljedeća konstrukcija:

Listing 4. Glavna funkcija bilo kojeg C programa je glavna funkcija.

Int main (void) (povratak 0;)

Kakav je ovo dizajn. Ovo je deklaracija glavne funkcije. Takva funkcija mora biti prisutna u svakom programu koji je napisan u C-u. Veliki ili mali program, kompjuterska igrica ili program "Zdravo, svijete!", koji ste napisali vi ili Bill Gates - ako je program napisan na C - ima glavnu funkciju... To je, da tako kažem, glavna funkcija našeg programa. Kada pokrećemo program, možemo misliti da pokrećemo glavnu funkciju ovog programa.

Zaustavimo se na sekund. Čini se da smo shvatili nešto o strukturi C programa. Svaki C program mora sadržavati glavnu funkciju. Prikažimo ovu činjenicu na našoj mapi znanja "Struktura programa u C jeziku."

Slika 2 Mapa "Struktura C programa." Glavni.

Sada nam karta ne smeta svojom prazninom koja zjapi. Nastavimo naše istraživanje.

Dozvolite mi da vam kažem nešto o glavnoj funkciji i funkcijama općenito.

Ime funkcije prethodi int, što je skraćenica za riječ integer, koja se sa engleskog prevodi kao "cjelina". Ova notacija znači da kada glavna funkcija završi svoj rad, ona mora vratiti neki cijeli broj pozivnom programu (u našem slučaju to je operativni sistem). Obično, za glavnu funkciju, ovo je broj nula, koji obavještava operativni sistem: "Kao, sve je u redu. Nije bilo incidenata."

Jeste li ikada vidjeli poruke o grešci na ekranu vašeg računara? Obično napišu nešto poput "Program je prekinut nenormalno ... bla bla bla ... Šifra -314." Ovo je otprilike isto. Razlika je u tome što kada dođe do problema, operativni sistem nas o tome obavijesti, a kada je sve u redu, više nam ne smeta.

Riječ void piše se u zagradama iza naziva funkcije. Općenito, argumenti funkcije se obično pišu u zagradama, ali u našem slučaju, kada pišu void u zagradama, to znači da funkcija nema argumente. Drugim riječima, da bi glavna funkcija počela raditi, nisu joj potrebni nikakvi dodatni podaci izvana. O svemu tome ćemo detaljnije, ali za sada samo zapamtite da riječ void umjesto argumenata funkcije znači da za ovu funkciju nisu potrebni argumenti.

Unutar vitičastih zagrada nalazi se opis glavne funkcije, tj. direktno šta bi ova funkcija trebala raditi.

Prije zatvaranja vitičaste zagrade, vidimo naredbu return. Ova naredba je odgovorna za vraćanje vrijednosti iz funkcije. One. pogledajte, ako je program dostigao ovu tačku, onda je sve bilo u redu i nije bilo grešaka, što znači da možete vratiti vrijednost nulu.

Zašto baš nula, pitate se? A đavo samo zna! Obično to rade samo tako. U principu možete vratiti neki drugi cijeli broj, na primjer 100, ili -236. Kad bi samo bio cijeli broj. Zapamtite int? Stoga cjelina.

Tako smo shvatili glavnu funkciju. Još jedan poen. Ono što je napisano u vitičastim zagradama obično se naziva "tijelo funkcije" (ili opis funkcije), a prvi dio, onaj prije vitičastih zagrada, naziva se zaglavlje funkcije.

Vratimo se sada na naš prvi program "Zdravo, svijete" i vidimo šta je šta.

Listing 5. Program "Zdravo, svijete".

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

Nešto već razumijemo u ovom programu. Samo dva reda ostaju nejasna, idemo redom.

Listing 6. Direktiva uključivanja

#include

Ova linija je poruka kompajleru. Ove poruke, koje počinju sa # znakom, nazivaju se direktivama kompajlera. Doslovno: "uključi stdio.h datoteku". U vrijeme kompajliranja, sadržaj stdio.h datoteke će biti umetnut umjesto ovog reda. Hajdemo sada malo o ovom fajlu. stdio.h (od engleskog STanDart Input Output) je datoteka zaglavlja, opisuje različite standardne funkcije vezane za ulaz i izlaz.

Postavlja se razumno pitanje: "Zašto trebamo pisati ovaj red? Zašto smo uopće trebali ubaciti ovaj fajl ovdje?" Ovo je neophodno kako bismo u našem programu mogli koristiti standardnu ​​funkciju printf () za izlaz na ekran.

Evo u čemu je stvar. Prije upotrebe bilo čega u našem programu, prvo to moramo opisati. Zamislite situaciju, zamoljeni ste da ponesete kandelabar, a vi ne znate šta je to. Nije jasno šta da se radi.

Kao i kompajler. Kada naiđe na funkciju, traži njen opis (tj. šta treba da radi i šta znači) na početku programa (od samog početka do trenutka kada se koristi u programu). Dakle, funkcija printf () je opisana u datoteci stdio.h. Stoga ga povezujemo. Ali kada ga povežemo, kompajler će moći pronaći funkciju printf (), inače će ispustiti grešku.

Usput, vrijeme je da dodamo našu mapu znanja. Prije glavne funkcije dodajte još jedan blok, blok za povezivanje datoteka zaglavlja.

Slika 3 Mapa "Struktura C programa." Blok povezivanja datoteka zaglavlja.

Nastavimo da se bavimo našim programom.

Listing 7. funkcija printf ().

Printf ("Zdravo, svijete! \ N");

U ovom redu zovemo standardnu ​​printf () funkciju prikaza. U ovom najjednostavnijem slučaju, prosljeđujemo mu jedan parametar, niz navodnika koji treba prikazati, u našem slučaju to je Hello, World! \ n. Ali čekaj, šta je ovo \ n? Nije bilo \ n na ekranu kada je program počeo. Zašto smo onda ovo napisali ovdje? Ovaj niz je poseban znak koji je naredba za prelazak na sljedeći red. To je kao da pritisnete tipku Enter u MS Wordu. Postoji nekoliko takvih specijalnih znakova, svi su napisani znakom "\" - obrnutom kosom crtom. Ovi specijalni znakovi se nazivaju kontrolni znakovi. Pokazat ću vam ih kasnije. U suprotnom, ekran će prikazati upravo ono što ste napisali u dvostrukim navodnicima.

Usput, imajte na umu da se svaka C naredba završava sa ";" (tačka-zarez). Izgleda kao tačka na kraju rečenice na ruskom. U običnom jeziku rečenice razdvajamo tačkom, a u programskom jeziku C naredbe odvajamo jednu od druge tačkom i zarezom. Stoga je tačka i zarez obavezna. U suprotnom, kompajler će opsovati i izbaciti grešku.

Da biste pozvali bilo koju funkciju, potrebno je da napišete njeno ime i naznačite parametre koji su joj prosleđeni u zagradama. Funkcija može imati jedan ili više parametara. Ili možda uopće nema parametara, u tom slučaju ne morate ništa pisati u zagradama. Na primjer, gore smo pozvali funkciju printf () i proslijedili joj jedan parametar niz koji će biti ispisan na ekranu.

Usput, koristan savjet. Pošto svaki program ima glavnu funkciju, a bukvalno u svakom programu treba nešto da prikažemo na ekranu, preporučujem da odmah kreirate fajl sa sledećim praznim da ne pišete svaki put isto.

Listing 8. Standardni stub za C programe.

#include int main (void) (povratak 0;)

Pa, izgleda da je to sve. Ova prva lekcija se može smatrati završenom. Iako ne, postoji još jedna stvar.

Najvažnija stvar u ovoj lekciji je, naravno, opšta struktura programa. Ali osim toga, naučili smo kako prikazati proizvoljan tekst na ekranu. Čini se da baš ništa ne znaju, ali i to bi bilo dovoljno da, na primjer, mami napravim mali poklon za 8. mart.


Izvorni kod za program razglednica nalazi se u arhivi izvornog koda za ovaj vodič. Eksperimentiraj! Uspjet ćeš.

Top srodni članci