Aflați obiectivul C Ziua 1

Bine ati venit la seria mea de a aborda cu minunata limbă care este Obiectiv-C. De-a lungul acestei serii mici de articole, scopul meu este de a vă lua de la nici o experiență anterioară cu Obiectiv-C la utilizarea cu încredere în propriile aplicații. Acesta nu este un loc de muncă - deci nu vă așteptați să treceți prin elementele de bază și să fiți departe - vom trece prin nu numai lucrurile esențiale, dar și cele mai bune practici pe care le puteți aplica pentru a vă asigura că codul dvs. este cel mai bun poate fi. Să mergem direct!

Ce este obiectivul C??

Dacă citiți această serie, atunci voi periclita o presupunere pe care deja o cunoașteți, dar pentru cei dintre voi care nu faceți asta, nu vă faceți griji, deoarece până la sfârșitul acestei părți veți ști ce este înapoi - în față și în interior.

Obiectivul C este un limbaj orientat pe obiecte, care se află în partea de sus a limbii C (dar pariez că ați ghicit acea parte!). Este folosirea primară în computerele moderne este pe Mac OS X ca pe un desktop și pe iPhone OS (sau cum se numește acum: iOS). Acesta a fost inițial limba principală pentru sistemul de operare NeXTSTEP, cunoscut și sub numele de sistemul de operare Apple cumpărat și coborât din Mac OS X, ceea ce explică de ce casa sa primară se află astăzi pe sistemele de operare Apple.

Deoarece obiectivul C este un superset strict al lui C, suntem liberi să folosim C într-un fișier Obiectiv-C și acesta se va compila bine. Deoarece orice compilator al Obiectului-C va compila, de asemenea, orice cod C drept trecut în el, avem toată puterea lui C împreună cu puterea obiectelor furnizate de Obiectiv-C.

Dacă sunteți puțin confuz în acest moment, gândiți-vă în acest fel: tot ce poate face C, obiectivul C poate face și el, dar nu invers.

Ce am nevoie?

De-a lungul acestei serii, nu ne vom concentra pe construirea de aplicații pentru iPhone. În schimb, ne vom concentra mai mult pe limbajul în sine și din acest motiv tot ce veți avea nevoie este un Mac cu un compilator, cum ar fi GCC. Dacă ați instalat instrumentele de dezvoltare de la Apple (Xcode, Interface Builder, etc), atunci GCC ar trebui deja instalat. Dacă nu, atunci mergeți la site-ul web al dezvoltatorului Apple și obțineți-vă o copie gratuită.

În ceea ce privește premisele, în timp ce nu mă aștept să aveți o experiență completă în domeniul informaticii, anumite cunoștințe de programare, în general, sau de C în special ar fi cu siguranță un bonus. Dacă nu aveți multă experiență de programare anterioară, nu vă faceți griji - o veți lua în cel mai scurt timp!

Dacă executați Windows (ceea ce este puțin probabil ca acest tutorial să vizeze dezvoltatorii iPhone), puteți încă să compilați obiectivul C pe sistemul dvs. folosind un compilator cum ar fi CygWin sau MinGW. Această serie de tutorial este oferită utilizatorilor de Mac, dar dacă utilizați Windows și întâmpinați probleme, asigurați-vă că lăsați un comentariu și văd dacă pot ajuta.

Compilarea codului

Înainte de a putea vedea codul în acțiune, trebuie să îl puteți compila în ceva executabil. Sperăm că acum aveți pregătită copia dvs. de GCC. Compilarea este foarte ușoară, o comandă simplă de o singură linie.

NOTĂ:
Compilarea este procesul de "traducere" a unui limbaj de computer la nivel înalt, cum ar fi Obiectiv-C sau PHP, într-un cod de mașină la un nivel scăzut care poate fi procesat de un computer atunci când programul este executat.

Toate programele pe care le vedem în sistemul nostru de operare Mac OS sunt concretizate într-o serie de instrucțiuni care ne sunt afișate vizual într-o interfață grafică sau într-o interfață grafică de utilizator. Spre deosebire de interacțiunea programului GUI cu un mouse pe care majoritatea dintre noi îl cunoaștem, este posibil să emităm comenzi direct în sistemul de operare printr-o interfață bazată pe text cunoscută sub numele de "terminal" sau "linie de comandă".

Aplicația de linie de comandă din Mac OS se numește Terminal și poate fi găsită în Aplicații -> Utilitare. Continuați și deschideți Terminal acum (puteți căuta și în Spotlight). Terminalul are mai multe comenzi de bază pe care ar trebui să le cunoașteți pentru a le utiliza în mod corespunzător. Una dintre cele mai importante comenzi pe care trebuie să le cunoaștem este CD, care reprezintă "directorul de schimbare". Această comandă ne permite să schimbăm locul în sistemul de fișiere de pe care Terminalul le citește. Nu putem doar să-i spunem Terminalului să ne compileze fișierul dacă nu arătăm unde este primul fișier! Pentru a comuta la un director dorit, puteți utiliza o cale completă, cum ar fi:

cd / Utilizatori / MyName / Desktop / Test

De asemenea, puteți utiliza căi relative, permițându-vă să tastați numai un singur nume de folder în unele cazuri. De exemplu, dacă sunteți deja în dosarul Desktop, puteți introduce pur și simplu:

cd Test

pentru a ajunge la dosarul Test.

Dacă vrei să vezi unde ești în prezent? Numele de directă a folderului este afișat înaintea promptului (bitul pe care îl introduceți). De exemplu, în cazul în care vă cere promptul Dan- Walkers-MacBook: Desktop iDemonix $ Pot să presupun că sunt în dosarul Desktop. Dacă nu sunteți sigur, puteți de asemenea să tastați PWD pentru a afișa calea de fișier absolută a locației curente.

Dacă doriți să listați fișierele și folderele din folderul curent, folosiți comanda listă: ls. În cele din urmă, dacă doriți să mergeți la un director într-un dosar părinte, tastați "CD… "Deci, dacă am fi în dosarul Test, care se află în dosarul Desktop, dar am vrut să mergem la dosarul Desktop, am putea scrie CD… pentru a merge la directorul părinte, Desktop. Dacă vrem să ajungem la directorul de acasă vom scrie cd ... / ... să urce două nivele. Ca alternativă, pentru a ajunge la directorul de domiciliu puteți să tastați cd ~ de oriunde.

Când utilizați aplicația Terminal, compilarea arată astfel:

gcc inputfile.m -o outputfile

Probabil ați ghicit deja cum funcționează: inputfile.m conține codul nostru (.m este extensia folosită pentru fișierele Objective-C) și -o spune gcc dorim ca executabilul nostru sa fie numit ceea ce vom specifica in continuare, ceea ce in exemplul de mai sus este fisier de iesire. Pentru a executa creația după compilare, pur și simplu tastați:

./fisier de iesire

Simplu.

Când compilați, compilatorul va genera orice erori, notificări sau avertismente legate de sintaxa codului dvs. Erori generate atunci când se compilează sunt denumite în mod obișnuit erori de compilare și aceasta este adesea cea mai stresantă parte din scrierea unei aplicații (mai ales atunci când codul nu se compilează pentru că ai pus un singur caracter în locul greșit sau ai uitat să încheiați o linie cu un semi-colon). Compilarea poate dura, de asemenea, timp când scrieți aplicații mari, compuse din mai multe fișiere, ceea ce reprezintă și un alt motiv pentru care compilarea poate fi o experiență obositoare. Acest fapt a dus la o glumă de programator omniprezentă adesea văzută pe tricourile bărbaților cu barbă neîngrijită: Nu codifică codul meu.

Cele elementare

Obiectivul C nu este greu de învățat. Odată ce vă veți ocupa de principiile de bază, puteți alege restul pe măsură ce mergeți destul de ușor. Totuși, trebuie să aveți o înțelegere a principiilor fundamentale ale programării C, și asta va acoperi restul tutorialului.

Să analizăm o aplicație de bază în C:

#include  int main () printf ("Hello World \ n"); retur 0; 

Toate aceste aplicații vor face atunci când rulați se afișează șirul "Hello World" în Terminal și ieșire.

NOTĂ:
Curios despre declarația "return 0"? Pentru că am spus compilatorului că funcția principal () va întoarce un întreg, vom întoarce valoarea constantă constantă "0" la sfârșitul funcției. Prin convenție, returnând semnalele "0" către programul de asteptare pe care programul nostru la terminat execuția fără erori.

Pentru a încerca acest lucru pentru dvs., incendiați Xcode și faceți o nouă clasă Obiectiv-C. Ștergeți tot codul Xcode vă oferă în mod implicit și lipiți codul de mai sus. Odată ce ați făcut acest lucru, îl puteți compila folosind Terminal. Deschideți Terminal și schimbați la locația în care este fișierul dvs., dacă ați salvat pe desktop, atunci pur și simplu tastați cd desktop astfel că Terminal citește acum de pe desktop. Apoi tastați această comandă:

Programul gcc1.m -o program1

Programul dvs. ar trebui să se compileze fără erori. Pentru ao rula, pur și simplu tastați:

./ program1

Apoi apăsați întoarcerea.

Minunat, deci ce sa întâmplat de fapt acolo? Ei bine, mai întâi am importat o bibliotecă numită stdio care gestionează funcțiile standard i / o (ieșire de intrare), cum ar fi printf (). Apoi vom crea o funcție numită principală care ar trebui să returneze un int sau un întreg care este în esență un număr fără punct zecimal. Apoi folosim funcția printf () pentru a scoate "Hello World" în terminal. \ N pe care le folosim, îi spune Terminalului să introducă o linie nouă după text. În cele din urmă, vom returna 0 (amintiți-ne că am spus că principalul ar trebui să returneze un număr întreg), care spune că sistemul de operare a făcut totul bine. Utilizăm numele principal, deoarece acesta este declanșat automat când programul este executat.

Până acum, totul ar trebui să fie destul de simplu: am vrut să scriem un text în Terminal, așa că am importat o bibliotecă cu o funcție de scriere a textului, apoi am folosit o funcție din acea bibliotecă pentru a scrie textul. Imaginați-vă că importul este o bibliotecă fizică, iar printf () este una dintre cărțile disponibile.

variabile

Soldat înainte, suntem acum la variabile. Unul dintre lucrurile fundamentale pe care trebuie să le putem face în aplicațiile noastre este stocarea temporară a datelor. Facem acest lucru folosind variabile, care sunt containere care pot conține diferite tipuri de date și pot fi manipulate în diverse moduri. Utilizăm variabilele pentru a stoca tot felul de date, dar mai întâi trebuie să spunem compilatorului ce vom stoca în el. Iată câteva dintre cele mai importante variabile despre care trebuie să știți pentru moment:

  • int - pentru stocarea numerelor întregi (numere fără punct zecimal)
  • carboniza - pentru stocarea unui personaj
  • pluti - pentru stocarea numerelor cu puncte zecimale
  • dubla - la fel ca un flotor, dar dublează acuratețea

Atunci când nu folosim variabilele, folosim adesea constante. O constantă nu se va schimba niciodată: întotdeauna știm ce va fi valoarea. Dacă combinăm constantele obținem o expresie constantă, pe care vom cunoaște întotdeauna rezultatul. De exemplu:

123 + 2 = 125

Aceasta este o expresie constantă, 123 + 2 va fi întotdeauna egală cu 125, indiferent de ce. Dacă am înlocuit o constantă pentru o variabilă, noua expresie ar arăta astfel:

123 + i = ?

Pentru că eu este o variabilă dinamică, nu știm cu certitudine rezultatul acestei ecuații. Putem schimba ceea ce vrem și obținem un rezultat diferit. Acest lucru vă va oferi o idee despre cum funcționează variabilele.

Un lucru pe care încă mai trebuie să-l cunoaștem este cum afișăm variabilele așa cum am arătat mai sus "Hello World"? Încă mai folosim funcția printf (), cu excepția faptului că se modifică puțin de data aceasta:

#include  int principală () int someNumber = 123; printf ("Numărul meu este% i \ n", someNumber); retur 0; 

Ceea ce am făcut aici este spus funcția printf () în care ne dorim să apară întregul nostru, atunci unde poate fi găsit. Acest lucru este diferit de multe limbi, cum ar fi PHP, unde puteți plasa variabila în text.

Nu suntem limitați doar la o singură variabilă în printf (). Funcția poate accepta mai mulți parametri separați prin virgule, astfel încât să putem trece cât mai multe semne de formatare în text. Mai sus folosim% i ca semn de formatare deoarece am inclus un număr întreg. Alte variabile au propriile specificatoare de format:

  • % i - întreg
  • % f - pluti
  • % e - dubla
  • % c - carboniza

Un lucru pe care vreau să-l ating, înainte de a merge mai departe, este tipul de caractere. O variabilă de tip char poate să se ocupe doar de un singur caracter, atunci când asta e tot ce avem nevoie, acest lucru este minunat, dar dacă avem nevoie de un șir de text, este destul de inutil. Pentru a obține acest lucru, folosim ceva numit matrice de caractere.

Imaginați-vă că aveți o propoziție de 11 caractere (cum ar fi Hello World - nu uitați să includeți spațiul), o matrice de caractere este ca și cum ați avea 11 caractere, dar toate lipite împreună. Aceasta înseamnă că valoarea matricei caracterului este "Hello World", dar char [0] este "H". În paranteze este caracterele pe care le urmărești, pentru că am pus 0 primim primul personaj. Nu uitați că numărarea în matrice începe de obicei de la 0, nu de la 1.

Condiționalele

Atunci când o aplicație trebuie să ia o decizie, folosim o condiție. Fără condiționări, de fiecare dată când îți fugi cererea, ar fi exact același lucru, ca și cum ai urmări un film. Prin luarea deciziilor bazate pe variabile, intrări sau orice altceva, putem face schimbarea aplicației - aceasta ar putea fi la fel de simplă ca și când un utilizator introduce un număr de serie sau apăsând un buton mai mult de 10 ori.

Există câteva tipuri diferite de condiționalități, dar deocamdată ne vom uita la cele mai comune și de bază: dacă afirmație. O declarație if face ceea ce pare, verifică dacă ceva este adevărat, apoi acționează în același fel. De exemplu:

#include  int main () if (1 == 1) // Aceasta este întotdeauna adevărată // Fă ceva aici return 0; 

Dacă 1 este egal cu 1, atunci orice este între paranteze este executat. S-ar putea să te întrebi de ce am folosit două semne egale în loc de unul. Folosind două semne egale este un operator de egalitate, care verifică dacă cele două sunt egale una cu cealaltă. Dacă folosim un singur semn egal, atunci încercăm să atribuim prima valoare valorii a doua.

Deasupra, deoarece 1 va fi întotdeauna același cu 1, orice ar fi în paranteze ar fi executat. Dacă am vrea să facem ceva dacă nu era adevărat? Aici este locul altfel vine in. Folosind altceva putem rula codul atunci cand conditional daca se intoarce false, cum ar fi:

int main () if (1 == 1) // Fă ceva aici.  altceva // Universul este spart!  retur 0; 

Desigur, în viața reală, nu am fi verificat pentru a ne asigura că 1 este același cu 1, dar punctul este făcut. Luați în considerare o aplicație care se închide dacă apăsați butonul de închidere de trei ori (enervant, dar relevant). Puteți verifica parantezele pentru a vedea de câte ori a fost împinsă. Dacă este mai mică de 3, atunci blocul altceva ar putea executa un cod pentru a spune utilizatorului cât de multe ori butonul trebuie să fie împins pentru a ieși.

Ne vom uita la conditiile mai mult atunci cand vom veni sa le folosim in aplicatiile noastre mai departe in serie.

buclele

Acum, să investigăm o buclă de programare. Buclele, după cum sugerează și numele, permiteți să bifăm o bucată de cod și să o executăm de mai multe ori. Acest lucru poate fi foarte util în situații cum ar fi popularea unei liste sau repetarea unei bucăți de cod până când o returnare condiționată este adevărată.

Există trei tipuri de bucle, în ordinea celor mai frecvente: pentru, in timp ce, și do. Fiecare dintre ele este folosit pentru a repeta executarea unui bloc de cod, dar acestea funcționează diferit. Iată câteva exemple pentru fiecare:

// dacă loop int principal () int i = 9; int x = 0; pentru (x = 0; x < i; x++) printf("Count is: %i\n", x);  return 0; 

Acest lucru ar putea părea puțin la început, dar într-adevăr nu este. În paranteze după după este inițiatorul, condiționată și acțiunea. Când buclă for începe, execută inițiatorul, care în cazul nostru de mai sus stabilește x la 0. De fiecare dată când buclă rulează (inclusiv prima dată), verifică condiționată, care este "este mai mică decât i?" În cele din urmă, după fiecare buclă prin cod, bucla execută acțiunea - care depășește incrementul x câte unul. Simplu. Din moment ce x crește cu câte o dată, x nu va mai fi în curând mai mică decât i și bucla se va termina și programul va continua să ruleze.

// în timp ce loop int main () int x = 0; în timp ce (x < 10) printf("Count is: %i\n", x); //Watch OUT! Something is missing.  return 0; 

Similar cu buclă for, buclă în timp va executa codul între paranteze până când condițional este falsă. Deoarece x este 0 și nu îl schimbăm în blocul de coduri, cele de mai sus se vor desfășura pentru totdeauna, creând o "buclă infinită". Dacă doriți să creștem x, atunci în cazul bucla noastră în timp ce ați face acest lucru între paranteze:

// în timp ce loop int main () int x = 0; în timp ce (x < 10) x++; printf("Count is: %i\n", x);  return 0; 

Buclei do este în esență buclele în timp ce, cu excepția rulajelor condiționale după blocul de cod. Ce înseamnă acest lucru atunci când utilizați o buclă do, codul este garantat să ruleze cel puțin o dată:

/ / do loop int () int x = 0; do x ++; printf ("Count este:% i \ n", x);  în timp ce (x < 10); return 0; 

pointeri

Pointerii pot provoca o mulțime de confuzie cu noii veniți la programare sau doar pentru cei care au venit în C. De asemenea, nu este clar pentru unii oameni cum sunt ele utile, dar veți învăța treptat acest lucru în timp. Deci, ce este un pointer?

După cum sugerează și numele, indicatorii indică o locație. În mod specific, locațiile din memoria calculatorului. Gândiți-vă la acest lucru, atunci când creăm o variabilă (să presupunem că este un număr numit'foo 'așa cum este atât de popular cu teoria programării) și să îi dau o valoare, de exemplu, 123, avem tocmai - o variabilă cu o valoare 123. Acum, dacă setăm un pointer la foo, atunci avem o modalitate de accesare indirectă a acestuia. Asta este, avem un pointer de tip int care indică la foo care deține valoarea "123". Acest lucru se va face în cod ca acesta:

 int foo = 123; // Aceasta este o variabila int int * ptr = &foo; // Acesta este un pointer la o variabilă întreg

Clar ca noroi? Nu-l transpirați. Indicatorii sunt greu - adesea considerat cel mai greu lucru de învățat atunci când iau limba C. Pointerii vor deveni în cele din urmă a doua natură pentru tine, totuși, și vor fi mai multe despre pointeri în cadrul obiectivului-C mai departe în această serie.

Înfășurarea în sus

Tocmai v-ați oferit o prezentare generală a cursurilor de impact asupra limbajului C în limba engleză. Această parte a seriei a fost destinată să fie un primar rapid pe C pentru a vă pregăti și pregăti pentru restul seriei și ar fi trebuit să fie util în special celor care sunt deja familiarizați cu programarea într-o altă limbă. Dacă sunteți nou în programare în general sau aveți încă îndoieli cu privire la orice element de bază al lui C, recitiți cele de mai sus și nu ezitați să lăsați întrebări în comentariile.

Înainte de data viitoare, asigurați-vă că încercați și compilați propriile programe folosind codul de mai sus. Stabiliți-vă mici provocări, cum ar fi executarea unei buclă de 10 ori și numărarea de fiecare dată prin buclă folosind printf. Nu este nici un rău în a încerca și a experimenta, în cazul în care merge prost, este, probabil, chiar mai bine, deoarece vă va duce pe calea cea bună dreptul de a vă depanarea propriul cod.

Provocare

Pentru această săptămână, vom termina o provocare simplă. Trebuie să creați trei programe care numără 10 la fiecare tip de buclă. Deoarece vom folosi buclele adesea în Obiectiv-C, este bine să învățați să le creați pe inimă. Acest lucru ar trebui să fie destul de ușor, așa că încercați să numărați de la 10 la 1 după aceea (dacă + + incremente de câte unul, care ar putea fi codul să scadă cu 1?).

Data viitoare

În următoarea tranșă a acestei serii, voi oferi o prezentare generală a modului în care funcționează obiectivul C. Vom analiza, de asemenea, programarea orientată pe obiecte și utilizările sale, precum și o analiză reală a claselor, instanțelor, metodelor, moștenirii și mai mult.

Săptămâna viitoare ar trebui să vă ajute cu adevărat să înțelegeți ce face Obiectiv-C o limbă atât de mare și de ce extinde cu adevărat limba C în multe moduri utile.

Alte intrebari

Dacă aveți întrebări, puteți să lăsați un comentariu de mai jos unde voi încerca și să continuați verificarea sau puteți să-mi împușcați un mesaj pe Twitter (http://www.twitter.com/iDemonix) unde voi reveni la vă ASAP.

Cod