Programmeerimiskeel C/Stiil
C struktuur ja stiil
muudaSee osa tutvustab põhitõdesid effektiivse koodistruktuuri kirjutamisel Programmeerimisekeeles C. Kirja on pandu põhitõed liigendamisest, kommentaaridest, ja teistest elementidest, mis muudavad C koodi paremini loetavaks. Selle lugemiseks pole vajalik omada eelteadmisi Programmeerimisekeelest C.
Uustulnukad võivad kirjutada oma koodi oma suva järgi, sest lõppudelõpuks on kompillaatori asi koodi tõlkida - see on vale. Hästi disainitud koodi on kogenud programeeriatel kergem lugeda ja redigeerida. Kui luuakse tarkvara, siis tihti mitte ainult effektiivset, vaid esmalt dünaamilist(muudatusi on kerge implementeerida) ja arusaadavat.
Sissejuhatus
muudaJärgnevad kaks koodiblokki on pärast preprotsessori läbikäimist võrdväärsed: Mõlemad sisaldavad täpselt sama koodi, ning pärast kompilleerimist, saab neist täpselt sama programm. Siisiki ühel puhul on eiratud pea kõiki C struktuuri ja stiili reegleid.
Tegemist on võrdlemisi lühikese programmiga, kuid ta annab ülevaate milline vahe võiks olla oma suva järgi küljendatud koodil, ning antud reeglite põhjal kirjutatud koodi, kui seda loeb elukutseline programmeerija
Reegleid eirates:
#include <stdlib.h>
#include <time.h>
int juhuslikArv(void){return rand()%80 + 1;}
int main(void){int i, j;int massiiv[N];srand(time(0));for(i=0;i<20;i++){massiiv[i]=0;}for(i=0;i<20;i++){massiiv[i]=
juhuslikArv();j=i;while(j--){if(massiiv[i]==massiiv[j]){i--;}}}printf("Keno loto numbrid on %d",massiiv[0]);
for(i=1;i<20;i++){printf(",%d",massiiv[i]);}printf("\n");getchar();getchar();return 0;}
Reegleid jälrgides
/*
Nimi: Harjutus ülessanne 5
Autor: Margus Martsepp
Kuupäev: 23.05.07 02:20
Tööpõhimõte:
Koostatud programm, mis pakub välja numbrid osalemaks Keno Lotos. Numbrid on
vahemikus vahemikus 1-80, ning ei kordu. Väljastatakse 20 numbrit.
*/
//teegid
#include <stdlib.h>
#include <time.h>
//defineeringud
#define XXX printf("\n");getchar();getchar();return 0
#define MAXgenS 80 //tagatatavate numbrite ülempiirang
#define N 20 //tagastatavate numbrite arv
//prototüüp
int juhuslikArv(void);
//prefunktsioon
int main(void){
int i,j;
int massiiv[N];
srand(time(0)) ;
for(i=0;i<N;i++){//massiivi initsialiseerimine
massiiv[i]=0;
}
for(i=0;i<N;i++){//massiivi väärtustamine
massiiv[i]=juhuslikArv();
j=i;
while(j--){//kordus, mis tagab, et arvud ei korduks
if(massiiv[i]==massiiv[j]){i--;}
}
}
printf("Keno loto numbrid on %d",massiiv[0]);
for(i=1;i<N;i++){
printf(",%d",massiiv[i]);
}
XXX;//MS windowsi IDE keskonnas kompilleerides, et programm ei sulguks liiga varakult
}
//teised funktsioonid
int juhuslikArv(void){
// funktsioon tagastab suvalise täisarvu vahemikus 1-MAXgenS
return rand()%MAXgenS + 1;
}
Teises koodiplokis on kasutatud:
- liigendamist ja rea vahesid, mis märgatavalt koodi loetavust; ilma igasuguse koodi effektiivsuse erinevuseta.
- kommentaare, mis annavad mõista mida on teha üritatud / tehtud.
- prototüübe, mis aitavad mõista nii arvutil kui ka inimesel, mis funktsioone ja selle parameetreid on kasutatud ülessande lahendamiseks (ülikiire moodus ülevaate saamiseks).
- Konstandid võimaldavad muuta koodi parameetreid kiiresti ja mugavalt. Üle pingutades võivad nad hoopis muuta koodi lugemise keeruliseks.
Lisaks:
- Ka muutujate nimetused mängivad suurt rolli koodist arusaamisel, kuigi ta otseselt reegel ei ole, tuleks nimetada muutujad arusaadavalt.
- Osad koodiredaktorid juba vaikeväärtustena võimaldavad koodikirjutamist/redigerimist lihtsustada (NT: koodivõtmesõnade värvimine, struktuuride/funktsioonide pakkumine, liigendamine "{" ja "}" märkide põhjal, koodilühendid, veapakkujad jne.)
Järgnevalt seletataksegi need täpsemalt lahti. Tuleks tähele panna, et siin kasutatud kood on vaid küljendamise eesmärgil, ning selle sisust ei pea veel aru saama.
Liigendamine
muudaReeglid:
- iga funktsiooni tüüp algab rea vasakust servast
- "{" on viimane märk reas
- järgmine rida algab ühe "tabulatsiooni" või 4 tühiku vahega võrreldes eelmisest reast eespool
- "}" on esimene märk reas
- kui talle ei järgne "else", siis järgnev koodisegment algab uuelt realt
- ta algab ühe "tabulatsiooni" või 4 tühiku vahega võrreldes eelmisest reast tagapool
- ";" lõpetab rea
- Erandiks on tingimused nt: for korduses
Seega:
#include <stdio.h>
int main(){int i=0;printf("Tere Maailm!");for(i=0;i<1;i++){printf("\n");break;}return(0);}
- saab:
#include <stdio.h>
int main(){
int i=0;
printf("Tere Maailm!");
for(i=0;i<1;i++){
printf("\n");
break;
}
return(0);
}
Lisaks
- Paljud koodiredaktorid liigendavad ainult "enteri" vajutuse peale juba, kuigi tihti pole protses täisautomaatne, aitab see märgatavalt kaasa.
Reavahed
muudaKood jaotub osadeks ja nende osade vahele on sobilik panna ka tühikud. Korrektne oleks ka kommenteerida iga osa (nt: mis tehakse, mida deklareeritakse, mis kogumikuga on tegemist jne.).
Koodist:
#include <stdio.h>
int main(){
int i=0;
printf("Tere Maailm!");
for(i=0;i<1;i++){
printf("\n");
break;
}
return(0);
}
- saab:
#include <stdio.h>
int main(){
int i=0;
printf("Tere Maailm!");
for(i=0;i<1;i++){
printf("\n");
break;
}
return(0);
}
Kommentaarid
muudaKommentaarid, jagunevad oma ülessannetelt mitmeks. Koodi tuleks võtta kui tehnilist ettekannet, kus kommentaarid on seletav tekst.
Üherealised
muudaÜherealised kommentaarid märgivad koodibloki algust, ning peamiselt kirjeldavad muutujate ja kordajate kasutusviise.
Märgistus:
- // - tähistab üherealise kommentaari algust reas
- Kuni koodirea lõpuni on tegemist kommentaariga
Koodist:
#include <stdio.h>
int main(){
int i=0;
printf("Tere Maailm!");
for(i=0;i<1;i++){
printf("\n");
break;
}
return(0);
}
- saab:
//vajalikud teegid
#include <stdio.h>
//peafunktsioon
int main(){
//deklareerin muutujad
int i=0; //universaalne tsükli kordaja
printf("Tere Maailm!");
//tsüklel, mis väljastab reavahetusi ekraanile
for(i=0;i<1;i++){
printf("\n");
break; //pärast esimest reavahetuse väljutakse
}
//väljun programmist
return(0);
}
Mitmerealised
muudaVõimalus pikemalt kirjeldada, mida programm/funktsioon teeb. Pole harv juhus, kui korraliku kommentaari kirjutamisele kulub rohkem aega, kui pärst seda kulub programmi/funktsiooni koostamisele. Mis veelkord näitab, kui vajalik on neid kirjutada. Koodi tähtsamad kommentaarid ümbriteksetakse tärni(*) kastiga, mille parem pool on avatud.
Märgistus:
- /* - tähistab mitmerealise kommentaari algust
- */ - tähistab mitmerealise kommentaari lõppu
- kõik koodisegmendid ja tekst, mis vahele jääb on kommentaar
Kood:
//vajalikud teegid
#include <stdio.h>
//peafunktsioon
int main(){
//deklareerin muutujad
int i=0; //universaalne tsükli kordaja
printf("Tere Maailm!");
//tsükel, mis väljastab reavahetusi ekraanile
for(i=0;i<1;i++){
printf("\n");
break; //pärast esimest reavahetuse väljutakse
}
//väljun programmist
return(0);
}
- pärast:
/*******************************************************************************
*
* Nimi: Näiteülessane 1 (n2ide_1.c)
* Autor: Margus Martsepp
* Kuupäev: 10.06.07 19:37
* Tööpõhimõte:
* Tuua näide ühest lihtsast funktsioonist, mis lõpuks saab korralikult
* küljendatud.
* Funktsioon kuvab ekraanile stringi "Tere Maailm", läbib korduse, millest
* kuvatakse ekraanile reavahetus. Pärast seda lõpetab programm oma töö.
*
*******************************************************************************/
//vajalikud teegid
#include <stdio.h>
//peafunktsioon
int main(){
//deklareerin muutujad
int i=0; //universaalne tsükli kordaja
printf("Tere Maailm!");
//tsükel, mis väljastab reavahetusi ekraanile
for(i=0;i<1;i++){
printf("\n");
break; //pärast esimest reavahetuse väljutakse
}
//väljun programmist
return(0);
}
Prototüübid
muudaKonstandid
muudaMuutuja nimetused
muudaKuigi nüüd omavad muutujad kommentaare oma kasutusviisidest, siis siiski oleks soovitatav nimetada muutujad ja massiivid võimalikult nende kasutusala järgi.
Näiteks:
int g; //Eksami hinne 1-10 palli skaalal
int z; //Eksami katse, arv mis sümboliseerib, mitu korda on seda eksamit tehtud
- võiks soovitatavalt olla:
int eksam_hinne; //Eksami hinne 1-10 palli skaalal
int eksam_katse; //Eksami katse, arv mis sümboliseerib, mitu korda on seda eksamit tehtud
Ülessanded
muudaViited
muuda- Aladdin's C coding guidelines - (en:) Juhend
- C/C++ Programming Styles (en:) GNU ja Linux'i Koodikirjutamise stiil