Kako postaviti pametne telefone i računala. 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, vrijedi shvatiti da se program ne može čitati i pisati kao knjiga: od korice do korice, od vrha do dna, redak po redak. Svaki program sastoji se od zasebnih blokova. Početak bloka koda u C/C++ označen je lijevom vitičastom zagradom ( , njegov kraj desnom vitičastom zagradom ).

Postoje blokovi različiti tipovi a koji će se kada izvršiti ovisi o vanjskim uvjetima. U primjeru minimalni program možete vidjeti 2 bloka. U ovom primjeru blokovi su pozvani definiranje funkcije. Funkcija je samo blok koda sa dati ime, koje onda netko može koristiti izvana.

U u ovom slučaju imamo 2 funkcije pod nazivom setup i loop. Njihova prisutnost obavezna je u svakom C++ programu za Arduino. Ne smiju ništa raditi, kao u našem slučaju, ali moraju biti napisani. U suprotnom, dobit ćete pogrešku u fazi kompilacije.

Klasik žanra: trepćući LED

Ajmo sada dopuniti naš program da se barem nešto dogodi. Na Arduinu, LED je spojen na pin 13. Može se kontrolirati, što ćemo i učiniti.

void setup() ( pinMode(13 , OUTPUT) ; ) void loop() ( digitalWrite(13 , HIGH) ; delay(100 ) ; digitalWrite(13 , LOW) ; delay(900 ) ; )

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

Svaki izraz je naredba procesoru da nešto učini. Izrazi unutar jednog bloka izvršavaju se jedan za drugim, strogo po redu, bez ikakvih pauza ili prebacivanja. Odnosno, ako govorimo o jednom određenom bloku koda, on se može čitati od vrha do dna da bi se razumjelo što se radi.

Sada shvatimo kojim redoslijedom se izvršavaju sami blokovi, tj. funkcije podešavanja i petlje. Ne brinite još o tome što konkretni izrazi znače, samo se pridržavajte redoslijeda.

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

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

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

Ako numeriramo izraze redoslijedom kako se izvršavaju, dobivamo:

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

Podsjećamo vas još jednom da cijeli program ne pokušavate sagledati čitajući odozgo prema dolje. Čita se samo sadržaj blokova odozgo prema dolje. Općenito možemo promijeniti redoslijed deklaracija postavljanja i petlje.

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

Rezultat ovoga se neće promijeniti ni za mrvicu: nakon kompilacije dobit ćete apsolutno ekvivalentnu binarnu datoteku.

Što rade izrazi

Pokušajmo sada shvatiti zašto napisani program na kraju uzrokuje treptanje LED-a.

Kao što znate, Arduino pinovi mogu raditi i kao izlazi i kao ulazi. Kada želimo nešto kontrolirati, odnosno izdati signal, potrebno je prebaciti kontrolni pin u izlazno stanje. U našem primjeru, mi kontroliramo LED na 13. pinu, tako da 13. pin mora biti izlaz prije upotrebe.

To se radi pomoću izraza u funkciji postavljanja:

PinMode(13, IZLAZ) ;

Izrazi mogu biti različiti: aritmetika, deklaracije, definicije, uvjeti itd. U ovom slučaju implementiramo u izraz poziv funkcije. Zapamtiti? Imamo njihov funkcije postavljanja i petlje, koje poziva nešto što smo nazvali "nešto". Pa sada Mi nazivamo funkcije koje su već negdje zapisane.

Konkretno, u našem postavu pozivamo funkciju koja se zove pinMode. Postavlja pin određen brojem u set način rada: ulaz ili izlaz. O kojem pinu i kojem modu je riječ označavamo u zagradama, odvojenim zarezima, odmah iza naziva funkcije. U našem slučaju, želimo da 13. pin djeluje kao izlaz. OUTPUT znači izlaz, INPUT znači ulaz.

Pozivaju se kvalificirajuće vrijednosti kao što su 13 i OUTPUT argumenti funkcije. Uopće nije nužno da sve funkcije moraju imati 2 argumenta. Koliko argumenata funkcija ima ovisi o suštini funkcije i načinu na koji ju je autor napisao. Mogu postojati funkcije s jednim argumentom, tri, dvadeset; funkcije uopće ne mogu imati argumente. Da bi ih pozvali, zagrade se otvaraju i odmah zatvaraju:

Bez prekida() ;

Zapravo, možda ste primijetili da naše funkcije postavljanja i petlje također ne prihvaćaju nikakve argumente. A misteriozno "nešto" ih na isti način poziva s praznim zagradama u pravom trenutku.

Vratimo se našem kodu. Dakle, budući da planiramo zauvijek treptati LED diodom, kontrolni pin treba jednom napraviti izlaz i onda se toga ne želimo sjećati. To je ono za što je funkcija postavljanja ideološki namijenjena: postavljanje ploče po potrebi i rad s njom.

Prijeđimo na funkciju petlje:

void loop() ( digitalWrite(13, HIGH) ; delay(100) ; digitalWrite(13, LOW) ; delay(900) ; )

Kao što je navedeno, poziva se odmah nakon postavljanja. I zove se opet i opet čim završi. Funkcija petlje naziva se glavna petlja programa i ideološki je dizajnirana za obavljanje korisnog rada. U našem slučaju koristan rad- trepćući LED.

Prođimo redom kroz izraze. Dakle, prvi izraz je poziv ugrađene funkcije digitalWrite. Dizajniran je za primjenu logičke nule (LOW, 0 V) ​​ili logičke jedinice (HIGH, 5 V) na dani pin. Dva argumenta prosljeđuju se funkciji digitalWrite: broj pina i logička vrijednost. Kao rezultat toga, prva stvar koju radimo je upaliti LED na 13. pinu, primjenjujući 5 volti na njega.

Čim se to učini, procesor odmah prelazi na sljedeći izraz. Za nas je ovo poziv funkciji kašnjenja. Funkcija odgode je, opet, ugrađena funkcija koja tjera procesor da 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 jest, tj. LED dioda ostaje upaljena. Čim istekne 100 ms, procesor se budi i odmah prelazi na sljedeći izraz. U našem primjeru, ovo je opet poziv poznatoj ugrađenoj funkciji digitalWrite. Istina, ovaj put prosljeđujemo vrijednost LOW kao drugi argument. Odnosno, postavljamo logičku nulu na 13. pin, odnosno dovodimo 0 volti, odnosno gasimo LED.

Nakon što se LED dioda ugasi, prelazimo na sljedeći izraz. Ovo je još jednom poziv funkciji kašnjenja. Ovaj put zaspimo 900 ms.

Nakon završetka spavanja, funkcija petlje se gasi. Po završetku, “nešto” ga odmah ponovno poziva i sve se ponavlja: LED svijetli, svijetli, gasi se, čeka itd.

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

    Paljenje LED diode

    Spavajte 100 milisekundi

    Isključivanje LED-a

    Spavamo 900 milisekundi

    Idemo na točku 1

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

Što se može promijeniti

Iskoristimo samo znanje koje smo stekli da napravimo nekoliko varijacija programa kako bismo bolje razumjeli princip.

Možete spojiti vanjsku LED diodu ili neki drugi uređaj koji treba "treperiti" na drugi pin. Na primjer, 5. Kako bi se program trebao promijeniti u ovom slučaju? Moramo zamijeniti broj s 5. gdje god smo pristupili 13. pinu:

Kompajlirajte, preuzmite, testirajte.

Što treba učiniti da bi LED bljeskao 2 puta u sekundi? Smanjite vrijeme spavanja tako da ukupno bude 500 ms:

void setup() ( pinMode(5 , OUTPUT) ; ) void loop() ( digitalWrite(5 , HIGH) ; delay(50 ) ; digitalWrite(5 , LOW) ; delay(450 ) ; )

Kako mogu natjerati LED lampicu da zatreperi dva puta svaki put kad zatreperi? Trebate ga upaliti dva puta s kratkom pauzom između uključivanja:

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

Kako mogu napraviti da uređaj ima 2 LED diode koje naizmjence trepću svake sekunde? Morate komunicirati s dva pina i raditi u petlji s jednim ili drugim:

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

Kako osigurati da uređaj ima 2 LED diode koje se prebacuju kao željeznički semafor: prvo jedna pa druga svijetli? Samo ne trebate odmah ugasiti upaljenu LED diodu, već pričekati trenutak uključivanja:

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

Slobodno sami provjerite ostale ideje. Kao što vidite, jednostavno je!

O praznom prostoru i lijepom kodu

U C++, razmaci, prijelomi redaka i tab znakovi nemaju od velike važnosti za sastavljača. Gdje postoji razmak, može postojati prijelom retka i obrnuto. Zapravo, 10 razmaka u nizu, 2 prijeloma retka i još 5 razmaka ekvivalent su jednog razmaka.

Prazan prostor je programersko oruđe s kojim program možete učiniti razumljivim i vizualnim ili ga unakaziti do neprepoznatljivosti. Na primjer, sjetite se programa za treptanje LED-a:

void setup() ( pinMode(5 , OUTPUT) ; ) void loop() ( digitalWrite(5 , HIGH) ; delay(100 ) ; digitalWrite(5 , LOW) ; delay(900 ) ; )

Možemo ga promijeniti ovako:

void setup( ) ( pinMode(5 , OUTPUT) ; ) void loop () ( digitalWrite(5 ,HIGH) ; delay(100 ) ; digitalWrite(5 ,LOW) ; delay(900 ) ; )

Samo smo malo radili s praznim prostorom. Sada možete jasno vidjeti razliku između skladnog koda i nečitljivog koda.

Kako biste slijedili neizgovoreni zakon programskog dizajna, koji se poštuje na forumima, kada ga drugi ljudi čitaju, a vi ga lako percipirate, slijedite nekoliko jednostavnih pravila:

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

Loše:

void loop() ( digitalWrite(5 , HIGH) ; delay(100 ) ; digitalWrite(5 , LOW) ; delay(900 ) ; )

Fino:

void loop() ( digitalWrite(5 , HIGH) ; delay(100 ) ; digitalWrite(5 , LOW) ; delay(900 ) ; )

2. Baš kao u prirodnom jeziku: stavite razmak iza zareza i ne stavljajte ispred.

Loše:

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

Fino:

DigitalWrite(5 , HIGH) ;

3. Postavite simbol početka bloka ( na nova linija na Trenutna razina uvlačenje ili na kraju prethodnog. I znak za kraj bloka ) u zasebnom retku na trenutnoj razini uvlačenja:

Loše:

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

Fino:

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

4. Koristiti prazne linije za odvajanje semantičkih blokova:

Fino:

Bolje:

void loop() ( digitalWrite(5 , HIGH) ; delay(100 ) ; digitalWrite(5 , LOW) ; delay(900 ) ; digitalWrite(6 , HIGH) ; delay(100 ) ; digitalWrite(6 , LOW) ; delay( 900) ;)

O točkama i zarezima

Možda se pitate zašto na kraju svakog izraza stoji točka-zarez? Ovo su pravila C++-a. Takva se pravila nazivaju jezična sintaksa. Po simbolu; prevodilac razumije gdje izraz završava.

Kao što je već spomenuto, prijelomi redaka za njega su prazna fraza, pa se usredotočuje na ovaj interpunkcijski znak. To vam omogućuje pisanje više izraza u jednom redu:

void loop() ( digitalWrite(5 , HIGH) ; delay(100 ) ; digitalWrite(5 , LOW) ; delay(900 ) ; )

Program je korektan i ekvivalentan onome što smo već vidjeli. Međutim, ovako pisati je loš oblik. Kod je mnogo teže čitati. Dakle, osim ako nemate 100% dobar razlog za pisanje više izraza u istom retku, nemojte to činiti.

O komentarima

Jedno od pravila dobrog programiranja je: "napišite kod tako da bude toliko jasan da ne treba objašnjenje." To je moguće, ali ne uvijek. Kako biste čitateljima objasnili neke neočigledne točke kodeksa: svojim kolegama ili sebi za mjesec dana, postoje takozvani komentari.

Ovo su dizajni u programski kod, koje kompilator potpuno zanemaruje i važni su samo čitatelju. Komentari mogu biti višeredni ili jednoredni:

/* Funkcija postavljanja poziva se prva kada se napajanje priključi na Arduino. A ovo je višeredni komentar */ void setup() ( // postavi pin 13 na izlazni mod pinMode(13, IZLAZ) ; ) void loop() ( digitalWrite(13 , HIGH) ; delay(100 ) ; // mirovanje 100 ms digitalWrite(13 , LOW) ; delay(900 ) ; )

Kao što vidite, između simbola /* i */ možete napisati onoliko redaka komentara koliko želite. A nakon niza / / sve što slijedi do kraja retka smatra se komentarom.

Dakle, nadamo se da su najosnovniji principi pisanja programa postali jasni. Stečeno znanje omogućuje vam da programski upravljate napajanjem Arduino pinova prema određenim vremenskim shemama. Ovo nije toliko, ali ipak dovoljno za prve pokuse.

Sam C++ program je tekstualna datoteka koja sadrži konstrukcije i operatore ovog jezika redoslijedom koji je odredio programer. U samom jednostavan slučaj ova tekstualna datoteka može sadržavati sljedeće informacije:

Ispis 1.1. Primjer jednostavnog programa.

/* Primjer jednostavnog programa */
#uključi
int main()
{
printf(“ Pozdrav svijete!”);
povratak 0;
}

i obično ima cpp ekstenziju, na primjer "ex1.cpp".

Sljedeći korak je kompajliranje izvornog koda. Kompilacija se odnosi na proces kojim sadržaj tekstualna datoteka pretvaraju u izvršni strojni kod koji može razumjeti računalni procesor. Međutim, prevoditelj ne stvara program spreman za izvođenje, već samo objektni kod (datoteku s nastavkom *.obj). Ovaj kod je međukorak u stvaranju gotov program. Činjenica je da stvoreni program može sadržavati funkcije standardnih biblioteka jezika C++, čije su implementacije opisane u objektnim datotekama biblioteka. Na primjer, sljedeći program koristi funkciju printf(). standardna knjižnica"stdio.h". To znači da će objektna datoteka ex1.obj sadržavati samo upute za pozivanje ove funkcije, ali kod same funkcije neće biti tamo.

Kako bi do finala izvršni program sadrži sve potrebne implementacije funkcija, koristi se linker objektnog koda. Linker je program koji kombinira objektne kodove u jednu izvršnu datoteku kreiran program, objektni kodovi implementacija funkcija knjižnice i standardni kod pokretanje za dati operativni sustav. Kao rezultat toga, i objektna datoteka i izvršna datoteka sastoje se od instrukcija strojnog koda. Međutim, objektna datoteka sadrži samo rezultat prijevoda u strojni jezik tekst programa koji je kreirao programer, a izvršna datoteka također je strojni kod za korištene standardne bibliotečke rutine i za kod za pokretanje.

Pogledajmo pobliže primjer programa u Ispisu 1.1. Prvi red navodi komentare, tj. komentare koji će vam pomoći da bolje razumijete program. Oni su samo za čitanje i kompajler ih zanemaruje. Drugi redak sadrži direktivu #include, koja upućuje pretprocesor jezika C++ da umetne sadržaj datoteke 'stdio.h' umjesto ovog retka tijekom kompilacije. Treći redak definira funkciju koja se zove main koja vraća cijeli broj ( int tip) i ne prima nikakve argumente (tip void). Funkcija main() obavezna je funkcija za sve C++ programe, a bez nje se u fazi kompilacije pojavljuje poruka o pogrešci koja ukazuje na nepostojanje ove funkcije. Ova funkcija je obavezna jer je to ulazna točka u program. U ovom slučaju, ulazna točka je funkcija s kojom program počinje i završava. Na primjer, kada pokrenete exe datoteku, funkcija main() se aktivira, svi iskazi uključeni u nju se izvršavaju i program završava. 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 zaslonu monitora, a zatim se izvršava naredba return, koja vraća nulta vrijednost. Taj broj sama main() funkcija vraća operativnom sustavu i znači uspješan završetak programa. Vitičaste zagrade () koriste se za definiranje početka i kraja tijela funkcije, tj. sadrže sve mogućih operatora, koji opisuju rad ove funkcije. Treba napomenuti da iza svakog operatora u jeziku C++ stoji simbol ‘;’. Dakle, navedeni primjer pokazuje opću strukturu C++ programa.

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

Primjer strukture jednostavnog C programa:

Opći obrazac

Primjer

direktive pretprocesora

#uključi

# definiraj N 10

naziv glavne funkcije

početak tijela glavne funkcije

deklaracije varijabli i nizova

int x=1; char str[N];

programske izjave

stavlja("Unesi Ime");

dobiva(str);

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

Kraj glavnog tijela funkcije

      1. Direktive pretprocesora

Dio prevoditelja je program tzv predprocesor. Pretprocesor radi prije nego što se program prevede s jezika visoka razina u strojni jezik, izvodeći njegovu preliminarnu konverziju. Svaka direktiva pretprocesora počinje znakom # (broj) i proteže se cijelim redom. Naredbe koje ne stanu u jedan red mogu se nastaviti u sljedećem retku. Znak nastavka retka je znak obrnute kose crte (\) u retku koji se nastavlja.

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

# uključiti < Ime>

Gdje Ime– naziv datoteke uključen u programski tekst.

Ova direktiva se zove supstitucijska direktiva . Nalaže kompajleru da smjesti datoteku na svoje mjesto Ime. Datoteka Ime nazvano zaglavlje. Sadrži deklaracije podataka i funkcija koje se koriste u programu. Na primjer, uključivanje direktive u program

# uključiti < matematika. h>

omogućit će vam korištenje standardnih matematičkih funkcija u programu, kao što su sin x, cos x, ln x itd. U nastavku će biti dan popis standardnih matematičkih funkcija.

Direktiva

# uključiti < stdio. h>

omogućuje korištenje standardnih ulazno/izlaznih funkcija u programu.

Još jedna često korištena direktiva je direktiva definicije

#definiraj S1 S2

Gdje S1, S2– znakovni nizovi.

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

# definirati P printf

omogućuje upisivanje slova na tipkovnici P umjesto riječi printf.

Ova se zamjena ne izvodi unutar tekstualnih nizova (literala), znakovnih konstanti i komentara, tj. radnja direktive # definirati ne odnosi se na tekstove odvojene navodnicima, apostrofima i one unutar komentara.

      1. Glavna funkcija

Svaki C program mora sadržavati deklaraciju funkcije glavni(), koja se naziva glavna funkcija . Obično ova funkcija nema parametre i ne vraća nikakvu vrijednost. Za označavanje ove činjenice koristi se riječ poništiti. Dakle, linija s nazivom glavne funkcije obično izgleda ovako:

void glavni (praznina)

void main()

      1. Varijable i nizovi

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

a – z, A – Z, 0 – 9,_(podcrtano),

Štoviše, prvi znak ne može biti broj. Mala slova i velika slova Latinica se percipira kao različiti znakovi. Funkcijske riječi jezika C ne mogu se koristiti kao ime varijable ili polja. Glavne funkcijske riječi jezika C dane su u Dodatku.

Elementi niza se razlikuju po svojim brojevima (indeksima). Indeks može prihvatiti samo nenegativne vrijednosti cijelog broja. Indeks se upisuje nakon naziva niza uglate zagrade. Može postojati nekoliko indeksa. U tom slučaju svaki indeks se piše u svojim uglatim zagradama.

Varijable i nizovi mogu se koristiti u C jeziku različite vrste. Svaka vrsta podataka zauzima određeni broj bajtova memorije i može poprimiti vrijednosti iz određenog raspona. Volumen ove memorije i, sukladno tome, raspon prihvaćenih vrijednosti u različitim implementacijama jezika C može varirati. Broj bajtova memorije koje zauzima varijabla određenog tipa za određenu implementaciju jezika C može se odrediti pomoću operacije veličina(tip). Na primjer, možete odrediti količinu memorije dodijeljenu varijabli tipa cjelobrojnog tipa ovako:

k = sizeof(int);

printf(“Pod varijablom tipaintDodijeljeno je %d bajtova memorije”,k);

Ove smjernice govore o tri glavne vrste varijabli i nizova i daju tipične vrijednosti za količinu zauzete memorije i raspon vrijednosti (Tablica 1):

stol 1

Specifikator tipa (ključna riječ)

Značenje

Veličina

memorija (bajt)

Raspon vrijednosti

Cijeli broj

32768 . . . +32767

2147483648 . . . +2147483647

Valjano

Pravi broj

3.4ּ10 -38. . . 3.4ּ10 38

(modulo)

Simboličan

128 . . . +127

Pogledajmo pobliže varijablu tipa char. Kao što se vidi iz tablice. 1, varijabla tipa char zauzima jedan bajt memorije. Jedan bajt memorije može sadržavati cijeli broj bez predznaka iz raspona ili cijeli broj s predznakom iz raspona [–128, 127]. Ovaj broj je kod za jedan od 256 znakova. Znak koji odgovara danom kodu određen je korištenom tablicom kodova. Dakle, vrijednost varijable poput char može se tretirati ili kao cijeli broj ili kao znak čiji je kod jednak tom broju.

C, kao što su statičke i lokalne varijable, nizovi, pokazivači, funkcije itd., što je moguće bliže arhitekturi prava računala. Dakle, pokazivač je samo memorijska adresa, niz je kontinuirano područje memorije, lokalne varijable su varijable smještene na hardverskom stogu, statičke varijable su u statičkoj memoriji. Programer koji piše u C-u uvijek ima prilično točnu ideju o tome kako će program koji kreira raditi na bilo kojoj specifičnoj arhitekturi. Drugim riječima, jezik C daje programeru potpunu kontrolu nad računalom.

Jezik C izvorno je zamišljen kao zamjena za asemblerski jezik za pisanje operativnih sustava. Budući da je C jezik visoke razine koji ne ovisi o određenoj arhitekturi, tekst operativnog sustava bio je lako prenosiv s jedne platforme na drugu. Prvi operacijski sustav napisan gotovo u potpunosti u C-u bio je Unix sustav. Trenutno su gotovo svi operativni sustavi koji se koriste napisani u C-u. Osim toga, alati za programiranje koji operacijski sustav pruža programere aplikacijski programi(tzv. API - Application Program Interface) su skupovi funkcije sustava u C jeziku.

Međutim, doseg jezika C nije bio ograničen samo na razvoj operacijskih sustava. Jezik C se pokazao vrlo praktičnim u programima za obradu teksta i slika, u znanstvenim i inženjerskim izračunima. C-temeljeni objektno orijentirani jezici izvrsni su za programiranje u prozorskim okruženjima.

U ovaj odjeljak Dati će se samo osnovni koncepti jezika C (i djelomično C++). Ovo nije zamjena za čitanje. kompletan udžbenik u C ili C++, na primjer, knjige i .

Koristit ćemo C++ kompajler umjesto C-a. Činjenica je da je jezik C gotovo u potpunosti uključen u C++, tj. normalan program napisan u C-u je valjani C++ program. Riječ "normalno" znači da ne sadrži neuspjele konstrukcije preostale od ranije verzije Si i trenutno nije u upotrebi. C++ prevodilac je poželjniji od C prevodioca jer ima strožu kontrolu grešaka. Osim toga, neke C++ konstrukcije koje nisu povezane s objektno orijentiranim programiranjem vrlo su prikladne i zapravo su poboljšanje jezika C. To su, prije svega, komentari // , mogućnost opisivanja lokalnih varijabli u bilo kojem trenutku u programu, a ne samo na početku bloka, te također postavljanje konstanti bez korištenja #define operatora pretprocesora. Koristit ćemo ove značajke C++-a dok ćemo u biti ostati unutar jezika C.

Struktura C programa

Dovoljno je bilo koje veliki program u C-u (programeri koriste termin projekt) sastoji se od datoteka. Datoteke neovisno prevodi C prevodilac, a zatim ih kombinira program za izradu zadataka, što rezultira datotekom s programom spremnim za izvođenje. Datoteke koje sadrže tekstove C programa nazivaju se izvornik.

U C jeziku izvorne datoteke postoje dvije vrste:

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

Imena datoteka zaglavlja imaju nastavak ".h". Nazivi implementacijskih datoteka imaju nastavak ".c" za jezik C i ".cpp", ".cxx" ili ".cc" za jezik C++.

Nažalost, za razliku od jezika C, programeri se nisu uspjeli dogovoriti jednostruki nastavak imena za datoteke koje sadrže C++ programe. Koristit ćemo ekstenziju ".h" za datoteke zaglavlja i ekstenziju ".cpp" za implementacijske datoteke.

Datoteke zaglavlja sadrže samo opise. Prije svega, ovo su prototipovi funkcija. Prototip funkcije opisuje naziv funkcije, vrstu povrata, broj i vrste njenih argumenata. Sam funkcijski tekst nije sadržan u h-datoteci. Također, h-datoteke opisuju nazive i vrste vanjskih varijabli, konstanti, nove vrste, strukture itd. Općenito, h-datoteke sadrže samo sučelja, tj. informacije potrebne za korištenje programa koje su već napisali drugi programeri (ili prethodno isti programer). Datoteke zaglavlja pružaju samo informacije o drugim programima. Prilikom prevođenja datoteka zaglavlja u pravilu se ne stvaraju objekti. Na primjer, u datoteci zaglavlja ne možete definirati globalna varijabla. Redak opisa

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

što znači da je varijabla x definirana negdje u implementacijskoj datoteci (koja je nepoznata). Samo riječ extern (vanjski). javlja informacije o vanjskoj varijabli, ali ne definira tu varijablu.

Implementacijske datoteke, ili C datoteke, sadrže funkcijske tekstove i definicije globalnih varijabli. Pojednostavljeno rečeno, C datoteke sadrže same programe, dok H-datoteke sadrže samo informacije o programima.

Izvođenje izvorni tekstovi u obliku datoteka zaglavlja i implementacijskih datoteka potrebno je stvoriti velike projekte imajući modularna struktura. Datoteke zaglavlja koriste se za prijenos informacija između modula. Implementacijske datoteke su pojedinačni moduli, koji su razvijeni i prevedeni neovisno jedan o drugom i kombinirani za stvaranje izvršnog programa.

Implementacijske datoteke mogu uključivati ​​opise sadržane u datotekama zaglavlja. Same datoteke zaglavlja također mogu koristiti druge datoteke zaglavlja. Datoteka zaglavlja uključena je pomoću direktive pretprocesora #include. Na primjer, opisi standardnih I/O funkcija uključeni su pomoću linije

#uključi

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

Molimo obustavite AdBlock na ovoj stranici.

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

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

Ispunit ćemo jednostavna karta. Na ovaj trenutak Znamo da programi postoje, ali ne znamo kako su interno strukturirani. Stoga će naša karta izgledati ovako.

Slika 1 Karta "Struktura programa u jeziku C." Prva razina.

Tijekom tečaja vraćat ćemo se ovoj karti, razjašnjavati je i nadopunjavati novim elementima i blokovima.

Sad pažnja. Nemojte se bojati! Ispod je izvorni kod tri jednostavna programa. Vaš zadatak je da ih pažljivo pogledate i pokušate pronaći nekakav obrazac u njihovom kodu (nešto uobičajeno što svaki program ima).

Ispis 1. Program 1. Ispisuje "Hello, World!"

#uključi

Ispis 2. Program 2

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

Ispis 3. Program 3

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

Odvojite vrijeme i pogledajte nastavak lekcije i točan odgovor na ovaj zadatak. Prvo pokušajte sami sebi odgovoriti. Nakon toga kliknite gumb "Gledaj nastavak!".

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

Ispis 4. Glavna funkcija svakog C programa je glavna funkcija.

Int main(void) ( return 0; )

Kakav je ovo dizajn? Ovo je deklaracija glavne funkcije. Svaki program napisan u C-u mora imati takvu funkciju.Bilo da je program velik ili mali, računalna igra ili program "Hello, World!", koji ste napisali vi ili Bill Gates - ako je program napisan u C-u - ima glavnu funkciju. To je to za reći glavna funkcija naš program. Kada pokrećemo program, možemo o tome razmišljati kao o pokretanju glavne funkcije programa.

Stanimo na trenutak. Čini se da smo već 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 jeziku C."

Slika 2 Karta "Struktura programa u C jeziku." Glavna funkcija.

Sad nam karta ne smeta svojom zjapećom prazninom. Nastavimo istraživanje.

Reći ću vam nešto o glavnoj funkciji i općenito o funkcijama.

Ispred naziva funkcije stoji int, što je skraćenica za riječ integer, koja se s engleskog prevodi kao “cjelina”. Ova notacija znači da kada glavna funkcija završi svoj posao, treba vratiti neki cijeli broj pozivnom programu (u našem slučaju operativnom sustavu). Tipično, za glavnu funkciju ovo je broj nula, koji obavještava operativni sustav: "Sve je u redu. Nije se dogodilo nikakav incident."

Jeste li ikada vidjeli poruke o pogrešci na zaslonu računala? Obično napišu nešto poput "Program je neuobičajeno prekinut... bla bla bla... Šifra -314." Ovo je otprilike isto. Razlika je u tome što kada se pojave problemi, operativni sustav nas o tome obavijesti, a kada je sve u redu, više nam ne smeta.

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

Unutar vitičastih zagrada nalazi se opis glavne funkcije, tj. upravo ono što ova funkcija treba raditi.

Prije zatvarajuće vitičaste zagrade vidimo naredbu return. Upravo je ova naredba odgovorna za vraćanje vrijednosti iz funkcije. Oni. pogledajte, ako je program došao do ove točke, onda je sve bilo u redu i nije se pojavila nikakva greška, što znači da možete vratiti vrijednost nula.

Možete se zapitati zašto baš nula? A vrag ga zna! Upravo tako obično rade. Možete, u principu, vratiti neki drugi cijeli broj, na primjer 100 ili -236. Kad bi barem bio cijeli broj. Sjećate li se int? Stoga cjelina.

Tako smo shvatili glavnu funkciju. Još jedna stvar. 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šem prvom programu "Zdravo, svijete" i vidimo što je što.

Ispis 5. Program Hello, World

#uključi int main(void) ( printf("Zdravo, svijete!\n"); return 0; )

Sada razumijemo nešto u ovom programu. Samo su dva retka ostala nejasna, idemo redom.

Ispis 6. uključiti direktivu

#uključi

Ovaj redak je poruka kompajleru. Ove poruke, koje počinju simbolom #, nazivaju se direktivama prevoditelja. Doslovno: "spojite datoteku stdio.h." Tijekom kompilacije, sadržaj datoteke stdio.h bit će umetnut umjesto ove linije. Razgovarajmo sada malo o ovoj datoteci. stdio.h (od engleskog STanDart Ulaz izlaz) Ovo datoteka zaglavlja, opisuje razne standardne funkcije povezane s ulazom i izlazom.

Postavlja se razumno pitanje: "Zašto moramo pisati ovaj redak? Zašto smo uopće morali umetnuti ovu datoteku ovdje?" Ovo je neophodno kako bismo u našem programu mogli koristiti standardna funkcija izlaz na ekran printf().

Evo u čemu je stvar. Prije nego što možemo bilo što koristiti u našem programu, prvo to moramo opisati. Zamislite situaciju: zamoljeni ste da donesete kandelabar, ali ne znate što je to. Nije jasno što učiniti.

Isto tako i kompajler. Kada naiđe na funkciju, traži njen opis (tj. što bi trebala raditi i što znači) na početku programa (od samog početka do trenutka kada se koristi u programu). Dakle, funkcija printf() opisana je u datoteci stdio.h. Zato ga povezujemo. Ali kad ga spojimo, kompajler će moći pronaći funkcija printf(), inače će izbaciti pogrešku.

Usput, vrijeme je da dopunimo našu kartu znanja. Prije glavne funkcije dodat ćemo još jedan blok, blok za povezivanje datoteka zaglavlja.

Slika 3 Karta "Struktura programa u C jeziku." Blok za povezivanje datoteka zaglavlja.

Nastavljamo s našim programom.

Ispis 7. funkcija printf().

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

U ovom retku pozivamo standardnu ​​funkciju printf(). U ovom najjednostavnijem slučaju prosljeđujemo mu jedan parametar, string napisan pod navodnicima koji se treba prikazati na ekranu, u našem slučaju to je Hello, World! \n. Ali čekaj, što je ovo\n? Nije bilo \n na ekranu kada je program pokrenut. Zašto smo onda ovo napisali ovdje? Ovaj niz je poseban znak, koji je naredba kojoj treba ići sljedeći redak. To je kao klikanje u MS Wordu Enter tipka. Takav posebni znakovi nekoliko, svi su napisani pomoću znaka "\" - obrnute kose crte. Ovi posebni znakovi nazivaju se kontrolni znakovi. Onda ću ti ih opet pokazati. U suprotnom će se na ekranu pojaviti ono što ste napisali pod dvostrukim navodnicima.

Usput, imajte na umu da svaka naredba jezika C završava simbolom “;” (točka i zarez). To je kao točka na kraju rečenice na ruskom. U običnom jeziku rečenice odvajamo točkom, a u programskom jeziku C točkom i zarezom odvajamo naredbe jedne od drugih. Stoga je korištenje točke i zareza obavezno. Inače će se prevodilac žaliti i izbaciti pogrešku.

Da biste pozvali funkciju, trebate napisati njezin naziv i navesti parametre koji su joj proslijeđeni zagrade. Funkcija može imati jedan ili više parametara. Ili možda uopće nema parametara, u kojem slučaju nema potrebe pisati ništa u zagradama. Na primjer, gore smo pozvali funkciju printf() i proslijedili joj jedan parametar - niz koji treba prikazati.

Usput, koristan savjet. Budući da svaki program mora imati glavnu funkciju, a doslovno u svakom programu ćemo morati prikazati nešto na ekranu, preporučam da odmah napravite datoteku sa sljedećim predloškom, kako ne biste pisali svaki put isto.

Listing 8. Standardni predložak za programe u C jeziku.

#uključi int main(void) ( return 0; )

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

Najvažnija stvar u ovoj lekciji je, naravno, opća struktura programa. Ali osim toga, naučili smo prikazati slobodan tekst. Čini se kao da nisu baš ništa naučili, ali i ovo je dovoljno da, primjerice, majci poklonite mali poklon za 8. mart.


Izvorni kod programa za razglednice nalazi se u arhivi s izvorni kodovi ovu lekciju. Eksperiment! Uspjet ćeš.

Najbolji članci na temu