Programmeerimiskeel C/Stiil

C struktuur ja stiil muuda

See 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 muuda

Jä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 muuda

Reeglid:

  • 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 muuda

Kood 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 muuda

Kommentaarid, 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 muuda

Võ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 muuda

Konstandid muuda

Muutuja nimetused muuda

Kuigi 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 muuda

Viited muuda