Një shembull i një programi të thjeshtë C. Një shembull i një programi të thjeshtë në gjuhën C Programet në C shembuj me shpjegim

Nga përkthyesi. Po kërkoja në internet një udhëzues të thjeshtë dhe lehtësisht të zbatueshëm për të shkruar programe në C++. Më pëlqeu një nga opsionet dhe vendosa ta përkthej dhe ta botoj. Nëse kjo temë pranohet mirë nga përdoruesit e Habra, unë mund të përkthej dokumente të tjera të lidhura, si dhe udhëzime për shkrimin e kodit nga kompani të tjera.

1. Hyrje

Ky dokument përmban udhëzime për të shkruar programe në C++.

Por ka disa arsye për shfaqjen e një liste tjetër rekomandimesh, përveç këtyre burimeve. Arsyeja kryesore është përgjithësimi i tepërt i tyre, pasi shpesh është e nevojshme të specifikohen rregullat private (veçanërisht rregullat e emërtimit). Ky dokument përmban komente, gjë që e bën më të përshtatshëm për t'u përdorur gjatë rishikimeve të kodit sesa dokumentet e tjera ekzistuese. Për më tepër, rekomandimet e programimit zakonisht përmbajnë përshkrime të problemeve të stilit dhe problemeve teknike, gjë që nuk është shumë e përshtatshme. Ky dokument nuk përmban asnjë këshillë teknike për C++, duke u fokusuar në çështjet e stilit.

Mjediset e disponueshme të zhvillimit mund të përmirësojnë lexueshmërinë e kodit duke shfaqur modifikuesit e aksesit, theksimin e kodit, formatimin automatik dhe më shumë, por programuesi nuk duhet të mbështetet në këto mjete. Kodi burimor duhet të konsiderohet përtej mjedisit të zhvillimit që përdoret dhe duhet të shkruhet për të maksimizuar lexueshmërinë pavarësisht nga mjedisi.

1.1 Formati i dokumentit
Rekomandimet grupohen sipas temës dhe numërohen në mënyrë që të mund të referohen gjatë rishikimeve të kodit. Rekomandimet ndahen sipas rëndësisë: të detyrueshme, shumë të rekomanduara dhe të përgjithshme. 1. Çdo shkelje e rekomandimeve lejohet nëse përmirëson lexueshmërinë.

2. Rregullat mund të shkelen nëse ka kundërshtime personale ndaj tyre.

Kjo është një përpjekje për të krijuar një sërë udhëzimesh të përgjithshme pa iu imponuar të gjithëve stil uniform. Programuesit me përvojë zakonisht e personalizojnë stilin që t'i përshtatet vetes gjithsesi. Të kesh një listë udhëzimesh si kjo në dorë (ose të paktën t'u kërkohet atyre ta shikojnë atë) ka tendencë t'i bëjë njerëzit të mendojnë për stilin e tyre të programimit dhe të vlerësojnë praktikat e tyre të programimit.

Nga ana tjetër, programuesit e rinj dhe të papërvojë zakonisht përdorin udhëzime stili për të kuptuar më mirë zhargonin e programimit.

3 Konventat e emërtimit

3.1 Marrëveshjet e Përgjithshme rreth emërtimit
3. Emrat që përfaqësojnë llojet duhet të shkruhen me shkronja të përziera, duke filluar me shkronja të mëdha.

Linja, Llogaria e Kursimeve

4. Emrat e variablave duhet të shkruhen me shkronja të përziera, duke filluar me shkronja të vogla.

Linja, Llogaria e Kursimeve
Praktikë e zakonshme në komunitetin e zhvilluesve të C++. Ju lejon të dalloni lehtësisht variablat nga llojet, parandalon përplasjet e mundshme të emrave, për shembull: Linja e linjës;

5. Konstantet e emërtuara (përfshirë vlerat e numërimit) duhet të shkruhen me shkronja të mëdha me nënvizat si ndarës.

MAX_ITERATIONS, COLOR_RED, PI
Praktikë e zakonshme në komunitetin e zhvilluesve të C++. Përdorimi i konstantave të tilla duhet të mbahet në minimum. Në shumicën e rasteve, zbatimi i vlerës si metodë është zgjidhja më e mirë:

Int getMaxIterations() // JO: MAX_ITERATIONS = 25 (kthimi 25; )
Kjo formë është më e lexueshme dhe garanton një ndërfaqe të vetme me vlerat e ruajtura në klasë.

6. Emrat e metodave dhe funksioneve duhet të jenë folje, të shkruara me shkronja të përziera dhe të fillojnë me shkronja të vogla.

GetName(), computeTotalWidth()
Njësoj si rregulli për variablat, por ndryshimi midis tyre qëndron në format e tyre specifike.

7. Emrat e hapësirave të emrave duhet të shkruhen me shkronja të vogla.

Model::analizator, io::iomanager, i zakonshëm:: matematikë::gjeometri
Praktikë e zakonshme në komunitetin e zhvilluesve të C++.

8. Emrat e tipit në shabllone duhet të emërtohen me një shkronjë të madhe.

shabllon ... shabllon ...
Praktikë e zakonshme në komunitetin e zhvilluesve të C++. Ju lejon të dalloni emrat e shablloneve nga emrat e tjerë të përdorur.

9. Shkurtesat dhe shkurtesat në emra duhet të shkruhen me shkronja të vogla.
exportHtmlSource(); // MOS: eksportoHTMLSource(); openDvdPlayer(); // NUK: openDVDPlayer();
Përdorimi i shkronjave të mëdha mund të rezultojë në konfliktin e emërtimit të përshkruar më sipër. Përndryshe, variablat do të quheshin dVD, hTML, etj., gjë që nuk është e lexueshme. Një problem tjetër tashmë është përshkruar më sipër; kur një emër lidhet me një tjetër, lexueshmëria zvogëlohet; fjala pas shkurtesës nuk bie në sy aq sa duhet.

10. Variablat globale duhet të përdoren gjithmonë me operatorin e zgjidhjes së fushës (::).

::mainWindow.open(), ::applicationContext.getName()
Përdorimi i variablave globale duhet të shmanget. Preferohet që të përdoren teke.

11. Anëtarët e klasës me një modifikues private duhet të caktohet një prapashtesë nënvizuese.

Klasa SomeClass ( private: int length_; )
Përveç emrit dhe llojit, shtrirja është vetia më e rëndësishme e një ndryshoreje. Specifikimi i qartë i modifikuesit të aksesit në formën e një nënvizimi eliminon konfuzionin midis anëtarëve të klasës dhe variablave lokale. Kjo është e rëndësishme sepse variablat e klasës janë më të rëndësishme se variablat e metodës dhe duhet të trajtohen me më shumë kujdes.

Një efekt shtesë i prapashtesës së nënvizimit është zgjidhja e problemeve të emërtimit në metodat dhe konstruktorët e vendosjes së vlerave:

Set i zbrazëtDepth (int thellësi) ( thellësi_ = thellësi; )
Problemi është se ekzistojnë dy mundësi për nënvizim - si prapashtesë dhe si parashtesë. Të dyja opsionet përdoren gjerësisht, por opsioni i parë rekomandohet sepse ofron lexueshmëri më të mirë. Duhet të theksohet se përcaktimi i modifikuesit të aksesit për variablat ndonjëherë është një çështje e diskutueshme. Edhe pse duket se praktika e rekomanduar po fiton ndjekës dhe po bëhet gjithnjë e më e zakonshme mes profesionistëve.

12. Variablave të personalizuar duhet t'u jepet i njëjti emër me llojin e tyre.

Seti i pavlefshëmTema(Tema* tema) // NUK: set i pavlefshëmTema(vlera e temës*) // JO: set i pavlefshëmTema(Tema* aTema) // NUK: set i pavlefshëmTema(Tema* t) lidhet i pavlefshëm(baza e të dhënave* bazës së të dhënave) // NUK : lidhja e pavlefshme (Baza e të dhënave* db) // JO: lidhja e pavlefshme (Baza e të dhënave* oracleDB)
Zvogëloni kompleksitetin duke zvogëluar numrin e termave dhe emrave të përdorur. Gjithashtu e bën më të lehtë njohjen e tipit thjesht nga emri i ndryshores.

Variablat jo të sintonizueshëm mund të emërtohen sipas qëllimit dhe llojit të tyre:

Pika e fillimit, Pika qendrore; Emri loginEmri;

13. Të gjithë emrat duhet të shkruhen në anglisht.

14. Variablat me shtrirje të madhe duhet të quhen emra të gjatë, kurse ato me shtrirje të vogël duhet të quhen emra të shkurtër.

Emrat e variablave të përkohshëm që përdoren për të ruajtur vlerat ose indekset e përkohshme janë më mirë të mbahen të shkurtër. Një programues që lexon variabla të tillë duhet të jetë në gjendje të supozojë se vlerat e tyre nuk përdoren përtej disa rreshtave të kodit. Zakonisht këto janë variabla i, j, k, l, m, n(për numrat e plotë), dhe gjithashtu c Dhe d(për simbolet).

15. Emrat e objekteve nuk janë specifikuar në mënyrë eksplicite, ju duhet të shmangni specifikimin e emrave të objekteve në emrat e metodave.

(Mungon klauzola nr. 16. - Shënim i përkthyesit.)

3.2 Rregulla të veçanta emërtimi
17. Fjalët marr/vendos duhet të përdoret kudo ku atributi aksesohet drejtpërdrejt.

Employee.getName(); punonjës.SetEmri(emri); matrica.getElement(2, 4); matrica.setElement(2, 4, vlera);
Praktikë e zakonshme në komunitetin e zhvilluesve të C++. Në Java, kjo konventë është bërë pak a shumë standarde.

18. Fjalë njehsoj mund të përdoret në metoda që llogaritin diçka.

ValueSet->computeAverage(); matricë->computeInverse()
Bëjini të qartë lexuesit menjëherë se ky është një operacion që kërkon kohë.

19. Fjalë Gjej mund të përdoret në metoda që kryejnë çdo kërkim.

Vertex.findNearestVertex(); matrica.findMinElement();
Njoftoni lexuesin menjëherë se kjo është një metodë e thjeshtë kërkimi që nuk kërkon shumë llogaritje.

20. Fjalë inicializoj mund të përdoret kur një objekt ose entitet është inicializuar.

Printer.initializeFontSet();
Duhet të preferohet versioni amerikan i fillestarit z e në vend të inicialit britanik s e. Shkurtesa init duhet të shmanget.

21. Variablave që përfaqësojnë GUI duhet t'u jepet një prapashtesë që korrespondon me emrin e tipit të komponentit.

Dritarja kryesore, Dialogu i pronave, Shkalla e gjerësisë, loginText, shiriti i lëvizjes së majtë, forma kryesore, menuja e skedarit, minLabel, butoni i daljes, yesToggle, etj.
Përmirëson lexueshmërinë sepse emri i jep përdoruesit një sugjerim të drejtpërdrejtë për llojin e ndryshores dhe për rrjedhojë burimet e objekteve.

22. Shumësi duhet të përdoret për të paraqitur grupe (koleksione) objektesh.

Vektor Pikat; vlerat int;
Përmirëson lexueshmërinë sepse emri i jep përdoruesit një sugjerim të drejtpërdrejtë për llojin e ndryshores dhe operacionet që mund të zbatohen në ato elemente.

23. Parashtesa n duhet të përdoret për të përfaqësuar numrin e objekteve.

NPikë, nLinja
Shënimi është marrë nga matematika, ku është një konventë e vendosur për të treguar numrin e objekteve.

24. Prapashtesa Nr duhet të përdoret për të treguar numrin e njësisë ekonomike.

Tabela nr, punonjësi nr
Shënimi është marrë nga matematika, ku është një konventë e vendosur për të treguar numrin e një entiteti.

Një alternativë tjetër e mirë është prefiksi i: iTable, iEmployee. E bën të qartë se ky është një përsëritës i emërtuar.

25. Variablat Iterator duhet të emërtohen i, j, k etj.

Për (int i = 0; i< nTables); i++) { : } for (vector::iterator i = list.fillim(); i != list.fund(); i++) (Elementi i elementit = *i; ...)
Shënimi është marrë nga matematika, ku është një konventë e vendosur për shënimin e përsëritësve.

Variabla me emra j, k etj. Rekomandohet të përdoret vetëm në sythe me fole.

26. Parashtesaështë duhet të përdoret vetëm për variablat dhe metodat Boolean.

IsSet, është e dukshme, është e përfunduar, është gjetur, është e hapur
Një praktikë e zakonshme në komunitetin e zhvillimit të C++, e përdorur ndonjëherë edhe në Java.

Përdorimi i kësaj parashtese shpëton nga emrat si statusi ose flamuri. ështëStatusi ose ështëFlamuri thjesht nuk përshtaten, dhe programuesi detyrohet të zgjedhë emra më kuptimplotë.

Në disa situata parashtesa ështëËshtë më mirë ta zëvendësoni me një tjetër: ka, mund ose duhet:

Bool hasLicense(); bool mundEvaluate(); bool shouldSort();

27. Emrat simetrik duhet të përdoren për veprimet e duhura.

Merr/vendos, shto/hiq, krijo/shkatërro, nis/ndalo, fut/fshi, shto/zvogëlon, e vjetër/e re, fillimi/mbarimi, e para/e fundit, lart/poshtë, min/maksimumi, tjetër/e mëparshme, e vjetër/ i ri, hap/mbyll, shfaq/fsheh, pezullo/rinisë etj.
Zvogëloni kompleksitetin përmes simetrisë.

28. Shkurtesat në emra duhet të shmangen.

Llogaritja mesatare(); // NUK: compAvg();
Le të shohim dy lloje fjalësh. Të parat janë fjalë të zakonshme të renditura në fjalorë që nuk mund të shkurtohen. Asnjëherë mos shkurto:

Cmd në vend të komandës cp në vend të kopjes pt në vend të pikës comp në vend të llogaritjes së initit në vend të inicializimit, etj.

Lloji i dytë janë fjalë specifike për një zonë të caktuar, të cilat njihen me shkurtesën/shkurtimin e tyre. Ato duhet të shkruhen shkurt. Asnjëherë mos shkruani:

HypertextMarkupLanguage në vend të html CentralProcessingUnit në vend të Cpu PriceEarningRatio në vend të pe, etj.

29. Emërtimi shtesë i treguesve duhet të shmanget.

Linja*; // NUK REKOMANDOHET: Linja* pLine; // NUK REKOMANDOHET: Linja* linePtr;
Shumë variabla në C/C++ janë tregues. Vetëm kur lloji i një objekti C++ është veçanërisht i rëndësishëm, emri duhet ta pasqyrojë atë.

30. Nuk mund t'u jepni emra variablave Boolean (logjike) që përmbajnë mohim.

Bool është Gabim; // E PAMUNDUR: isNoError bool isFound; // NUK: Nuk është gjetur
Problemi lind kur një emër i tillë përdoret në lidhje me një operator mohimi logjik, i cili përfshin një mohim të dyfishtë. Rezultati nuk duhet të jetë negativ !Nuk është gjetur.

31. Konstantet në enumeracione mund të kenë një parashtesë - emrin e përbashkët të tipit.

Ngjyrë numerike ( COLOR_KUQE, COLOR_GREEN, COLOR_BLU);
Kjo jep informacion shtesë se ku ndodhet deklarata, cilat konstante përshkruhen në një numërim dhe çfarë koncepti përfaqësojnë konstantat.

Një qasje tjetër është t'u referohemi konstanteve sipas llojit të tyre të përgjithshëm: Ngjyra:: KUQ, Linja ajrore:: AIR_FRANCE, etj.

Vini re se emri enum zakonisht shkruhet në njëjës, për shembull: enum Ngjyra (...). Emri i shumësit duket i mirë kur deklarohet, por nuk funksionon mirë në përdorim praktik.

32. Klasave me përjashtim duhet t'u jepet një prapashtesë Përjashtim .

Klasa AccessException ( : )
Klasat e përjashtimit nuk janë në të vërtetë pjesë e arkitekturës së programit dhe emërtimi i tyre në këtë mënyrë i ndan ato nga klasat e tjera.

33. Funksionet (metodat që kthejnë vlerat) duhet të emërtohen në varësi të asaj që kthejnë, dhe procedurat duhet të emërtohen në varësi të asaj që kryejnë (metodat void).

Përmirësoni lexueshmërinë. Ky emërtim e bën të qartë se çfarë bën dhe çfarë nuk bën metoda, dhe gjithashtu heq kodin nga efektet anësore të mundshme.

4 Skedarët

4.1 Skedarët burimor
34. Skedarët e kokës në C++ duhet t'i jepet zgjerimi.h (e preferuar) ose.hpp . Skedarët e kodit burim mund të kenë shtesa.c++ (rekomandohet).C , .cc ose.cpp .

MyClass.c++, MyClass.h
Këto janë shtesa të miratuara nga standardi C++.

35. Një klasë duhet të deklarohet në një skedar header dhe të përcaktohet (implementohet) në një skedar Kodi i burimit, emrat e skedarëve janë të njëjtë me emrin e klasës.

MyClass.h, MyClass.c++

E bën më të lehtë gjetjen e skedarëve të lidhur me klasën. Përjashtim i dukshëm janë klasat e shablloneve, të cilat duhet të deklarohen dhe përcaktohen në një skedar header.

36. Të gjitha përkufizimet duhet të jenë në skedarët e kodit burimor.

Klasa MyClass ( publike: int getValue () (vlera e kthimit_;) // JO! ... private: int value_; )
Skedarët e kokës deklarojnë ndërfaqen, skedarët e kodit burimor e zbatojnë atë. Nëse një programues duhet të gjejë një zbatim, ai duhet të jetë i sigurt se do ta gjejë atë në skedarin e kodit burimor.

37. Përmbajtja e skedarit nuk duhet të kalojë 80 kolona.

80 kolona është një rezolutë e përdorur gjerësisht për redaktorët, emuluesit e terminaleve, printerët dhe korrigjuesit; skedarët transferohen midis njerëzve të ndryshëm, kështu që ju duhet t'u përmbaheni këtyre kufizimeve. Ndërprerjet e duhura të rreshtave përmirësojnë lexueshmërinë kur bashkëpunoni për kodin burimor.

38. Karakteret speciale (të tilla si TAB) dhe ndërprerjet e faqeve nuk mund të përdoren.

Simbole të tilla shkaktojnë një sërë problemesh me redaktorët, emuluesit e terminaleve dhe korrigjuesit e përdorur në programet e zhvillimit bashkëpunues dhe mjediset ndër-platformë.

39. Paplotësia e vijave të thyera duhet të jetë e dukshme.

Shuma totale = a + b + c + d + e; funksioni (param1, param2, param3); setText("Ndarja e rreshtit të gjatë" "në dy pjesë."); për (int TabelaNo = 0; TabelaNr< nTables; tableNo += tableStep) { ... }
Ndërprerjet e rreshtave shfaqen kur shkelet kufiri prej 80 kolonash i përshkruar më sipër. Është e vështirë të jepen rregulla të vështira dhe të shpejta për ndarjen, por shembujt e mësipërm tregojnë parime të përgjithshme.

Në përgjithësi:

  • thyerje dhjetore;
  • pushim pas operatorit;
  • nivelim linjë e re me fillimin e shprehjes në rreshtin e mëparshëm.
4.2 Përfshirjet e skedarëve
40. Skedarët e kokës duhet të përmbajnë mbrojtje nga foleja.

#ifndef COM_COMPANY_MODULE_CLASSNAME_H #define COM_COMPANY_MODULE_CLASSNAME_H: #endif // COM_COMPANY_MODULE_CLASSNAME_H
Dizajni ju lejon të shmangni gabimet e përpilimit. Kjo konventë ju lejon të shihni pozicionin e skedarit në strukturën e projektit dhe parandalon konfliktet e emrave.

41. Direktivat e përfshirjes duhet të renditen (sipas vendit në hierarkinë e sistemit, niveli më i ulët - pozicioni më i lartë) dhe të grupohen. Lini një vijë të zbrazët midis grupeve.

#përfshi #përfshi #përfshi #përfshi #include "com/company/ui/PropertiesDialog.h" #include "com/company/ui/MainWindow.h"
Rrugët e përfshirjes nuk duhet të jenë absolute. Në vend të tyre duhet të përdoren direktivat e përpiluesit.

42. Përfshi direktivat duhet të vendosen vetëm në fillim të dosjes.

Praktikë e përgjithshme. Shmangni efektet anësore të padëshiruara që mund të shkaktojë një "i fshehur" i përfshirë diku në mes të një skedari të kodit burimor.

5 Shprehje

5.1 Llojet
43. Llojet lokale të përdorura në një skedar duhet të deklarohen vetëm në atë skedar.

Përmirëson fshehjen e informacionit.

44. Seksionet e klasës publike , të mbrojtura Dhe private duhet të renditet. Të gjitha seksionet duhet të specifikohen në mënyrë eksplicite.

Së pari duhet të ketë një seksion publike, e cila do t'i shpëtojë ata që dëshirojnë të njihen me klasën nga leximi i pjesëve i mbrojtur/privat.

45. Lloji i derdhjes duhet të jetë i qartë. Asnjëherë mos u mbështetni në hedhjen e tipit të nënkuptuar.

FloatValue = static_cast (inVlera); // NUK: floatValue = intValue;
Me këtë, programuesi tregon se është i vetëdijshëm për dallimin në lloje dhe se konfuzioni është i qëllimshëm.

5.2 Variablat
46. ​​Variablat duhet të inicializohen në vendin ku janë deklaruar.

Kjo siguron që variablat të jenë të përdorshëm gjatë gjithë kohës. Por ndonjëherë nuk është e mundur të bëhet kjo:

Int x, y, z; getCenter (&x, &y, &z);
Në këto raste, është më mirë t'i lini variablat të pa inicializuar në vend që t'u caktoni ndonjë vlerë.

47. Variablat nuk duhet të kenë kurrë kuptim të dyfishtë.

Përmirësoni lexueshmërinë duke siguruar që të gjitha konceptet e paraqitura të jenë të qëndrueshme. Zvogëloni mundësinë e gabimit për shkak të efekteve anësore.

48. Përdorimi i variablave globale duhet të shmanget.

Nuk ka asnjë arsye për të përdorur variabla globale në C++ (në fakt ka. - Shënimi i përkthyesit). E njëjta gjë vlen edhe për funksionet globale dhe variablat (statike), fushëveprimi i të cilave është i gjithë skedari.

49. Nuk duhet të deklaroni variablat e klasës si publike .

Këto variabla shkelin parimet e fshehjes dhe kapsulimit të informacionit. Në vend të kësaj, përdorni variabla me një modifikues private dhe funksionet përkatëse të aksesit. Përjashtim është një klasë pa sjellje, praktikisht një strukturë të dhënash (ekuivalente me strukturat e gjuhës C). Në këtë rast nuk ka kuptim të fshihen këto variabla.

Ju lutemi vini re se strukturat në C++ ruhen vetëm për pajtueshmëri me C; përdorimi i tyre dëmton lexueshmërinë e kodit. Përdorni klasa në vend të strukturave.

(Mungon klauzola nr. 50. - Shënim i përkthyesit.)

Float* x; // NUK REKOMANDOHET: float *x; ndër&y; // NUK REKOMANDOHET: int
Që një variabël është një tregues ose një referencë i referohet llojit të tij dhe jo emrit të tij. Programuesit C shpesh marrin një qasje të ndryshme, por në C++ është më mirë t'i përmbahemi këtij rekomandimi.

(Mungon klauzola nr. 52. - Shënim i përkthyesit.)

53. Duhet të shmanget krahasimi i nënkuptuar i variablave Boolean (logjikë) dhe treguesve me zero.

Nëse (nLinjat != 0) // NUK REKOMANDOHET: nëse (nLinjat) nëse (vlera != 0.0) // NUK REKOMANDOHET: nëse (vlera)
Standardi C++ nuk garanton që vlerat e variablave int dhe float të barabarta me zero do të përfaqësohen si 0 binare. Gjithashtu, me një krahasim të qartë, lloji që krahasohet është i dukshëm.

Do të ishte logjike të supozohet se treguesit gjithashtu nuk duhet të krahasohen në mënyrë implicite me zero, për shembull, nëse (rreshti == 0) në vend të if (vija). Kjo e fundit është një praktikë shumë e zakonshme në C/C++, ndaj mund të përdoret edhe.

54. Variablat duhet të deklarohen në një shtrirje sa më të vogël.

Kjo e bën më të lehtë kontrollin e efektit të variablit dhe efekteve anësore.

5.3 Ciklet
55. Ju nuk mund të përfshini shprehje në konstruktin for() që nuk janë të lidhura me kontrollin e ciklit.

Shuma = 0; // JO: për (i = 0, shuma = 0; i< 100; i++) for (i = 0; i < 100; i++) sum += value[i]; sum += value[i];
Përmirësoni mbështetjen dhe lexueshmërinë. Mbani kontrollin e ciklit rreptësisht të ndarë nga ajo që përmban.

56. Variablat që lidhen me ciklin duhet të inicializohen menjëherë përpara tij.

57. Do-while sythe mund të shmangen.

Të tilla sythe janë më pak të lexueshme sepse gjendja përshkruhet pas trupit. Lexuesit do t'i duhet të shikojë të gjithë ciklin për të kuptuar se si funksionon.

Sythet Do-while nuk janë rreptësisht të nevojshme. Çdo lak i tillë mund të zëvendësohet nga një lak i kohës ose për.

Më pak konstruksione të përdorura përmirësojnë lexueshmërinë.

58. Shmangni përdorimin thyej Dhe vazhdojnë në cikle.

Shprehje të tilla duhet të përdoren vetëm kur ato përmirësojnë lexueshmërinë.

(Mungon klauzola nr. 59. - Shënim i përkthyesit.)

60. Për unazat e pafundme duhet të përdorni formularin ndërsa (e vërtetë) .

Ndërsa (e vërtetë) (: ) për (;;) ( // JO! : ) ndërsa (1) ( // JO! : )
Testimi për një është i panevojshëm dhe i pakuptimtë. Forma për (;;) nuk është shumë e lexueshme; gjithashtu nuk është e qartë se cikli është i pafund.

5.4 Shprehjet me kusht
61. Shmangni rreptësisht frazat e ndërlikuara. Në vend të kësaj, futni variablat boolean.

Bool është e përfunduar = (elementi nr< 0) || (elementNo >maxElement); bool isRepeatedEntry = elementNo == Elementi i fundit; nëse (është Përfunduar || është Hyrja e Përsëritur) ( : ) // JO: nëse ((elementi Jo< 0) || (elementNo >maxElement)|| No element == Elementi i fundit) ( :)
Vendosja e variablave Boolean për shprehjet do të bëjë që programi të vetëdokumentohet. Dizajni do të jetë më i lehtë për t'u lexuar, korrigjuar dhe mirëmbajtur.

62. Pjesa e pritur duhet të vendoset në pjesën nëse , përjashtim - pjesërisht tjetër .

Bool isOk = readFile(filename); nëse (është në rregull) ( : ) tjetër ( : )
Kjo ndihmon për të siguruar që përjashtimet të mos errësojnë ekzekutimin normal. E rëndësishme për lexueshmërinë dhe performancën.

63. Kushti duhet të vendoset në një rresht të veçantë.

64. Shprehjet e ekzekutueshme në terma dhe kushte duhet të shmangen rreptësisht.

Skedari* fileHandle = hap (Emri i skedarit, "w"); nëse (!fileHandle) ( : ) // JO: nëse (!(fileHandle = hapur(emri i skedarit, "w"))) ( : )
Shprehjet e ekzekutueshme në kushte ndërlikojnë lexueshmërinë. Kjo është veçanërisht e vërtetë për fillestarët në C/C++.

5.5 Të ndryshme
65. Numrat “magjikë” në kod duhet të shmangen. Numrat e ndryshëm nga 0 ose 1 duhet të deklarohen si konstante të emërtuara.

Nëse numri në vetvete nuk ka kuptim të qartë, lexueshmëria përmirësohet duke futur një konstante të emërtuar. Një qasje tjetër është krijimi i një metode që mund të përdoret për të hyrë në konstante.

66. Konstantet me pikë lundruese duhet të shkruhen me një presje dhjetore dhe të paktën një shifër pas presjes dhjetore.

Totali i dyfishtë = 0,0; // NUK REKOMANDOHET: totali i dyfishtë = 0; shpejtësia e dyfishtë = 3.0e8; // NUK REKOMANDOHET: shpejtësia e dyfishtë = 3e8; shuma e dyfishtë; : shuma = (a + b) * 10.0;
Kjo nxjerr në pah qasjet e ndryshme kur punoni me numra të plotë dhe numra me pikë lundruese. Nga pikëpamja matematikore, këto dy modele janë krejtësisht të ndryshme dhe të papajtueshme.

Dhe gjithashtu (siç tregohet në shembullin e fundit më lart) theksi vihet në llojin e ndryshores (shumës) në një vend ku nuk është i dukshëm.

67. Konstantet me pikë lundruese duhet të shkruhen gjithmonë me të paktën një shifër para presjes dhjetore.

Sistemi C++ i numrave dhe shprehjeve rrjedh nga matematika, dhe ju duhet t'i përmbaheni shënimeve tradicionale sa herë që është e mundur. Ndër të tjera, 0.5 është më i lexueshëm se .5 (opsioni i parë nuk mund të ngatërrohet me numrin 5).

68. Funksionet duhet të specifikojnë llojin e vlerës së kthyer.

Int getValue() // JO: getValue() ( : )
Nëse nuk specifikohet në mënyrë eksplicite, C++ supozon se vlera e kthyer është e tipit int. Asnjëherë nuk duhet të mbështeteni në këtë pasi mund të ngatërrojë programuesit që nuk janë të njohur me të.

69. Nuk duhet të përdoret shkoj .

Ky operator shkel parimet programimi i strukturuar. Duhet të përdoret vetëm në raste shumë të rralla (për shembull, për të dalë nga një lak i vendosur thellë) kur opsionet e tjera do të dëmtonin qartë lexueshmërinë.

70. Në vend të "NULL" duhet të përdoret "0".

NULL është pjesë e bibliotekës standarde C dhe është e vjetëruar në C++.

6 Dizajni dhe komentet

6.1 Dizajni
71. Dhënia kryesore duhet të jetë dy hapësira.

Për (i = 0; i< nElements; i++) a[i] = 0;
Një hapje hapësire është mjaft e vogël për të pasqyruar strukturën logjike të kodit. Dhënia e më shumë se 4 hapësirave e bën kodin e futur thellë të palexueshëm dhe rrit gjasat që linjat të prishen. Opsionet me 2, 3 ose 4 hapësira janë të përhapura; dhe 2 dhe 4 - më gjerësisht.

72. Blloqet e kodit duhet të formatohen siç tregohet në shembullin 1 (rekomandohet) ose shembullin 2, por në asnjë rast siç tregohet në shembullin 3. Formatimi i funksioneve dhe klasave duhet të ndjekë shembullin 2.

Ndërsa (! bërë) (doSomething(); bërë = moreToDo(); )

Ndërsa (! bërë) (doSomething(); bërë = moreToDo(); )

Ndërsa (! bërë) (doSomething(); bërë = moreToDo(); )
Shembulli 3 përdor mbushje shtesë, e cila parandalon që ekrani të jetë i pastër strukturë logjike kodi.

73. Deklaratat e klasave

Klasa SomeClass: publike BaseClass ( publike: ... e mbrojtur: ... private: ... )
Një pasojë e veçantë e rregullit të përmendur më sipër.

74. Përkufizimet e metodave duhet të formatohen si më poshtë:

Void someMethod() (...)

75. Ndërtimi nese Tjeter duhet të formatohet si më poshtë:

Nëse (kushti) (deklarata; ) nëse (kushti) (deklarata; ) tjetër (deklarata; ) nëse (kushti) (deklarata; ) tjetër nëse (kushti) (deklarata; ) tjetër (deklarata;)
Pasojë e rregullit të përmendur më sipër. Për më tepër, duke shkruar tjetër në të njëjtën linjë si mbajtësja kaçurrelë mbyllëse e bllokut të parë nuk është e paligjshme:

Nëse (kushti) (deklarata; ) tjetër (deklarata;)
Është më mirë të vendosni secilën pjesë nëse-tjetër në një vijë të veçantë. Kjo e bën më të lehtë manipulimin e kodit, siç është lëvizja e një blloku tjetër.

76. Cikli për duhet të formatohet si më poshtë:

Për (inicializimi; kushti; përditësimi) ( deklarata; )
Pasojë e rregullit të përmendur më sipër.

77. Cikli për me një trup bosh duhet të formatohet si më poshtë:

Për (inicializimi; kushti; përditësimi) ;
I thekson lexuesit se trupi është bosh. Megjithatë, ciklet pa trup duhet të shmangen.

78. Cikli derisa duhet të formatohet si më poshtë:

Ndërsa (kushti) ( deklarata; )
Pasojë e rregullit të përmendur më sipër.

79. Cikli bej Nderkohe duhet të formatohet si më poshtë:

Do ( deklarata; ) while (kusht);
Pasojë e rregullit të përmendur më sipër.

80. Ndërtimi kaloni duhet të formatohet si më poshtë:

Ndërrimi (kushti) (rasti ABC: deklarata; // Mungon rasti "ndërprerje" DEF: deklarata; pushim; rasti XYZ: deklarata; thyerje; parazgjedhje: deklarata; thyerje; )
Ju lutemi vini re se çdo fjalë rast ka një dhëmbëzim në lidhje me të gjithë strukturën, gjë që ndihmon në nxjerrjen në pah të saj. Kushtojini vëmendje edhe hapësirave përpara zorrës së trashë. Nëse një fjalë kyçe mungon diku thyej, atëherë një koment duhet të shërbejë si një paralajmërim për këtë. Programuesit shpesh harrojnë të përfshijnë këtë fjalë, kështu që rasti i heqjes së qëllimshme të saj duhet të përshkruhet posaçërisht.

81. Ndërtimi provo-kap duhet të formatohet si më poshtë:

Provoni ( deklarata; ) kapni (Përjashtim& përjashtim) ( deklarata; )
Pasojë e rregullit të përmendur më sipër. Pyetje në lidhje me mbylljen e mbajtëseve kaçurrelë në një konstrukt nese Tjeter, aplikoni edhe këtu.

82. Nëse dizajni nese Tjeter përmban vetëm një shprehje në trup, mbajtëset kaçurrelë mund të hiqen.

Nëse deklarata (kushti); ndërsa deklarata (kushti); për (inicializimin; kusht; përditësimin) deklaratë;
Ende rekomandohet që të mos i lini mbajtëset me kaçurrela.

83. Lloji kthyes i një funksioni mund të vendoset mbi emrin e vetë funksionit.

Void MyClass::myMethod(void) ( : )
Në këtë mënyrë funksionet radhiten në një kolonë.

6.2 Hapësirat
84.

Operatorët duhet të ndahen me hapësira.
- Pas rezervimit fjalë kyçe në C++ duhet të përdorni një hapësirë.
- Hapësirat duhet të vendosen pas presjeve.
- Dy pikat duhet të ndahen me hapësira.
- Pas pikëpresjes në një lak për hapësirat duhet të përfshihen.

A = (b + c) * d; // NUK REKOMANDOHET: a=(b+c)*d ndërsa (e vërtetë) // NUK REKOMANDOHET: ndërsa (e vërtetë) (... doSomething(a, b, c, d); // NUK REKOMANDOHET: bëj diçka (a ,b,c,d rasti 100: // NUK REKOMANDOHET: rasti 100: për (i = 0; i);< 10; i++) { // НЕ РЕКОМЕНДУЕТСЯ: for(i=0;i<10;i++){ ...
Thekson pjesë të veçanta të shprehjeve. Përmirëson lexueshmërinë. Është e vështirë të japësh një grup të plotë rekomandimesh në lidhje me hapësirën e bardhë në C++. Rekomandimet e mësipërme duhet të tregojnë parime të përgjithshme.

85. Emrat e metodave mund të pasohen nga një hapësirë ​​nëse pason një emër tjetër.

DoSomething (File aktuale);
Thekson emrat individualë. Përmirëson lexueshmërinë. Nëse nuk ka emër tjetër, hapësira mund të hiqet (doSomething()).

Një qasje tjetër është të specifikoni një hapësirë ​​menjëherë pas kllapave hapëse. Njerëzit që e përdorin gjithashtu zakonisht vendosin një hapësirë ​​përpara kllapave mbyllëse: doSomething(currentFile);. Kjo lejon që emrat individualë të theksohen; Hapësira përpara kllapave mbyllëse duket e panatyrshme, por pa të shprehja duket asimetrike (doSomething(currentFile);).

86. Blloqet logjike në kod duhet të ndahen me një rresht bosh.

Matrica 4x4 = Matrica e re4x4(); dyfish cosAngle = Math.cos(kënd); dyfish sinAngle = Math.sin(kënd); matrix.setElement(1, 1, cosAngle); matrix.setElement(1, 2, sinAngle); matrica.setElement(2, 1, -sinAngle); matrix.setElement(2, 2, cosAngle); shumëzoj (matricë);
Përmirëson lexueshmërinë.

Kjo i lejon ata të dalin më mirë.

88. Variablat në deklarata mund të rreshtohen.

skedar AsciiFile*; int nPika; noton x, y;
Përmirëson lexueshmërinë. Çiftet duken më qartë tip - variabël.

89. Përdorni shtrirjen kudo që përmirëson lexueshmërinë.

Nëse (a == me vlerë të ulët) compueSomething(); ndryshe nëse (a == mediumValue) computeSomethingElse(); ndryshe nëse (a == me vlerë të lartë) computeSomethingElseYet(); vlera = (potencial * vaj Dendësia) / konstante1 + (thellësi * Dendësia e ujit) / konstante2 + (zVlera e koordinatave * Dendësia e gazit) / konstante3; minPozicioni = llogariturDistanca(min, x, y, z); mesatarePozicioni = llogariturDistanca (mesatare, x, y, z); ndërprerësi (vlera) (rasti PHASE_OIL: strcpy (fazë, "Vaj"); thyerje; rasti PHASE_WATER: strcpy (fazë, "Ujë"); thyerje; rasti PHASE_GAS: strcpy (fazë, "Gaz"); thyer; )
Ka shumë raste kur kodi mund të përafrohet më tej, edhe nëse shkel rregullat e përcaktuara më parë.

6.3 Komentet
90. Kodi kompleks i shkruar duke përdorur lëvizje të ndërlikuara nuk duhet të komentohet, por të rishkruhet!

Duhet të bëni sa më pak komente, duke e bërë kodin të vetëdokumentohet duke zgjedhur emrat e duhur dhe duke krijuar një strukturë të qartë logjike.

91. Të gjitha komentet duhet të shkruhen në anglisht.

Në një mjedis ndërkombëtar, anglishtja është gjuha e preferuar.

92. Përdorimi//për të gjitha komentet, duke përfshirë ato me shumë rreshta.
// Një koment që përfshin // rreshta të shumtë.
Nëse ndiqni këtë rekomandim, komentoni me shumë rreshta /* */ mund të përdoret për korrigjimin e gabimeve dhe qëllime të tjera.

Pas // ju duhet të vendosni një hapësirë, dhe vetë komenti duhet të fillojë me një shkronjë të madhe dhe të përfundojë me një pikë.

93. Komentet duhet të rregullohen në mënyrë që ato të lidhen me atë që po përshkruajnë.

94. Komentet mbi klasat dhe kokat e metodave duhet të ndjekin konventat e JavaDoc.

Programuesit Java marrin një qasje më të avancuar ndaj dokumentacionit falë mjetit standard të automatizuar Javadoc, i cili është pjesë e kompletit të zhvillimit dhe ju lejon të gjeneroni automatikisht dokumentacion HTML nga komentet në kodin tuaj.

Mjete të ngjashme ekzistojnë në C++. Ata ndjekin të njëjtat konventa sintaksore të etiketave si JavaDoc (shih për shembull Doc++ ose Doxygen).

7 lidhje

  • Kodi i plotë, Steve McConnell - Microsoft Press
  • Programimi në C++, Rregulla dhe Rekomandime, M Henricson, e. Nyquist, Ellemtel (telekom suedez):

Le të japim disa shpjegime. Në gjuhën C, çdo program përbëhet nga disa njësi programore dhe secila prej tyre është një funksion. Funksionet në C janë të ngjashme me funksionet ose nënprogramet në Fortran ose procedurat në Pascal. Emrat e funksioneve zgjidhen në mënyrë arbitrare (vetëm me shkronja latine), por njëri prej tyre kryesore, këtu fillon ekzekutimi i programit. Një funksion i tillë kryesor zakonisht thërret funksione të tjera që janë në të njëjtin skedar si programi kryesor ose janë marrë nga një bibliotekë funksionesh të trajnuara paraprakisht kryesore nuk ka argumente, kështu që lista e tij duket si kjo: () . Kllapa { } kornizë operatorët që zbatojnë vetë algoritmin. Këto kllapa janë të ngjashme me BEGIN - END në Pascal.
Linjë int a,b,c; shpall a,b,c variablat e tipit integer. Të gjitha variablat e përdorur në program duhet të deklarohen. Më pas vijnë operatorët e caktimit në a kuptimi 5 , dhe te b - 7 , Me- vlera e shumës së tyre. Shkruani vlerat e variablave ndër janë në rang [-32768; 32767]. Funksioni printf shfaq: SHUMË = 12.

Le të shqyrtojmë tani funksionin scanf projektuar për futjen e të dhënave të formatuara. Funksioni scanf përdor adresat e ndryshueshme dhe jo vlerat e tyre si parametra aktualë. Për ta bërë këtë, vendosni shenjën përpara parametrit përkatës & - simbol për marrjen e një adrese. Për shembull, &XL do të thotë "adresa e ndryshueshme XL", jo vlerën që ka aktualisht ndryshorja.

Vargu i formatit të funksionit scanf specifikon se cilat të dhëna priten si hyrje. Nëse një funksion ndeshet me shenjën në vargun e formatit % e ndjekur nga një karakter konvertimi, ai do të kapërcejë karakteret derisa të ndeshet me një karakter jo bosh.

Programi i mëparshëm vuan nga një pengesë: programi për llogaritjen e shumës është i përshtatshëm vetëm për një rast specifik, kur a=5, b=7. Le ta përmirësojmë atë duke zëvendësuar operatorët përkatës të caktimit me një thirrje funksioni scanf(shembulli 1.2):

Vargu i formatit specifikon funksionet scanf shkruani numrin dhjetor që do të vendoset në variabël a, më pas, të ndarë me një hapësirë, futni numrin e dytë dhjetor që duhet t'i caktohet ndryshores b Vini re se programi fillon me linjën commintarium: /* .. */ , përpiluesi kalon çdo karakter midis /* dhe */ dhe mund të përdoret për sqarim.

Etiketa: Programi i parë në C. Bazat Si Borland. Kodi C Gear. Si Embarcadero. C MS Visual Studio. C MS Express.

Ne po shkruajmë programin e parë në C

Së pari, duhet të instaloni softuerin. Në parim, nuk ka rëndësi se çfarë softueri përdorni, ashtu si sistemi operativ nuk është i rëndësishëm. Por gjatë gjithë kursit do të jap shembuj duke përdorur MS Visula Studio 2012 Express Edition. Visual Studio 2012 Express Edition është falas dhe mjafton për të studiuar të gjithë kursin. Për më tepër, siç ka treguar praktika, ai është shumë më i rreptë në lidhje me kodin dhe ofron një përshkrim më të plotë të gabimeve dhe paralajmërimeve. Kur mësoni një gjuhë, ju mund të përdorni Borland (aka CodeGEAR, aka Embarcadero, etj.), Dev Cpp, MinGW ose gcc, ose çfarëdo tjetër që dëshironi.

Shembull për MS Visual Studio

1. Hapni IDE, shkoni te File | Krijo një projekt...

2. Zgjidhni aplikacionin e konsolës dhe jepini një emër. Në këtë rast first_program

4. Kontrolloni kutinë "Empty project".

5. Pas së cilës marrim një strukturë të zbrazët të projektit. Shtoni një element të ri: kliko me të djathtën në dosje
"Skedarët e kodit burimor" | Shto | Krijo element...

Shtoni një skedar të ri cpp, por ruajeni me shtesën .c

Unë e quajta skedarin main.c Gjithçka është gati, ju mund të shkruani programin. hapa për platforma të tjera.

Borland

Unë kam të instaluar vetëm Code Gear C++Builder 2007, por në versionet e tjera (dhe të mëparshme) gjithçka bëhet njësoj.

1. Krijo një projekt të ri Skedar | E re | Të tjera...

2. Shto një aplikacion konsol

3. Zgjidhni gjuhën C

4. Marrim një projekt të përfunduar. Duhet ta ruani me emrin që dëshironi. Deri atëherë, vetë projekti dhe të gjithë skedarët do të kenë emra të paracaktuar. Ju mund të hiqni atë që Borland ka shkruar në tekstin e programit si parazgjedhje.

Shembull për cc/gcc për terminal

Hapni redaktuesin tuaj të preferuar të tekstit dhe kopjoni kodin e programit atje.

#përfshi int main (int argc, char* argv) ( printf ("Përshëndetje, Botë!"); scanf ("1"); kthimi 0; )

Nëse e keni ruajtur programin në një skedar të quajtur hello.c, atëherë shkruani komandën në terminal

Cc përshëndetje.c -o përshëndetje

Gcc përshëndetje -o përshëndetje

Në këtë rast, padyshim, duhet të jeni në dosjen me programin. gcc do të krijojë një ekzekutues të quajtur hello. Ekzekutoni atë dhe do të dalë Hello, World!

Ndonjëherë mund të ketë probleme me të drejtat e aksesit. Kontrolloni që keni një skedar të ekzekutueshëm, përndryshe jepini vetes leje për ta ekzekutuar atë.

Chmod 760 përshëndetje

Nëse keni disa skedarë, do t'ju duhet të renditni emrat e të gjithë skedarëve sipas radhës. Për shembull, nëse keni dy skedarë të tjerë simple.h dhe simple.c, atëherë duhet të shkruani

Cc përshëndetje.c thjeshtë.c -o përshëndetje

Kodi i programit

Është zakon që në programin e parë të shfaqet Hello, World! në ekran.

#përfshi #përfshi int main(int argc, char* argv) ( printf("Përshëndetje, Botë!"); _getch(); return 0; )

Ekzekutoni programin (Run | Run ose F9 për Borland, Build | Build Solution ose F5 për MS) Programi do të shfaqë Hello, World! dhe do të presë që ju të shtypni ndonjë çelës.

Le të shohim kodin në më shumë detaje. Dy rreshtat e parë

#përfshi #përfshi

direktivat për kompajlerin për lidhjen e bibliotekave standarde stdio (Dalja standarde e hyrjes) dhe conio (Dalja hyrëse e konsolës). Zgjatja .h tregon se këto janë skedarë kokë. Përpiluesi kopjon kodin e bibliotekave conio dhe stdio dhe bën të mundur përdorimin e funksioneve të përshkruara në këto biblioteka.

Int kryesore (int argc, char* argv)

Ky është funksioni kryesor. Ai ndryshon nga funksionet e tjera që mund të përcaktoni në atë që është një pikë hyrje - ekzekutimi i programit fillon prej tij.

Funksioni kryesor ka dy parametra - numrin e parametrave argc dhe grupin e parametrave të kaluar argv. Këto argumente janë opsionale, kështu që nuk keni nevojë t'i shkruani ato. Ne do të flasim për përdorimin e tyre më vonë.

#përfshi #përfshi int main() ( printf("Hello, World!"); _getch(); return 0; ) Funksioni kryesor duhet të kthejë një numër të plotë. Nëse është 0, atëherë funksioni funksionoi pa gabime. Në standardin modern C, nuk mund të ktheni 0, dhe ta përshkruani funksionin si void main. #përfshi #përfshi void main() ( printf("Përshëndetje, Botë!"); _getch(); ) Programi ynë tani duket shumë i thjeshtë. Linja printf ("Përshëndetje, botë!"); printon rreshtin Hello, World! në ekranin e monitorit. _getch() pret për një shtypje tasti.

Le të bëjmë diçka më të komplikuar për të mësuar se si të shtoni skedarë të rinj në program. Tani është e rëndësishme për ju të mësoni se si të shtoni skedarë të rinj nëse një pjesë e kodit mbetet e paqartë, nuk ka rëndësi.
1. Krijoni një skedar të ri të kokës në dosjen "Header files", quani atë simple.h
2. Krijo një skedar të ri simple.c në dosjen Source Files.
3. Shto në thjeshtë.h

#ifndef _SIMPLE_H_ #define _SIMPLE_H_ #include #përfshi void doSomething(); #përfundim

Këtu kemi deklaruar një funksion të ri doSomething. Nuk ka trup, do të përshkruhet në skedarin simple.c. Këtu përfshijmë gjithashtu bibliotekat stdio dhe conio
Shto në të thjeshtë .c

#include "simple.h" void doSomething() ( printf("Funksionon!"); _getch(); )

Ne përfshijmë një skedar header në simple.c. Është shkruar me thonjëza të dyfishta sepse nuk është një skedar standard i bibliotekës. Skedarët standardë të bibliotekës zakonisht ndodhen në dosjen e përfshirjes të vetë IDE. Nëse vendosim skedarët tanë atje, ato mund të deklarohen edhe në kllapa këndore. Ju gjithashtu mund të përdorni shtigjet absolute të skedarëve në thonjëza të dyfishta. Meqenëse ne kemi përfshirë tashmë bibliotekat conio dhe stdio në skedarin .h, ato janë "të dukshme" në skedarin .c.
Më pas, në kryesore.c