Programmeerimiskeel C/Harjutused

Programmeerimist ei õpita raamatust, vaid õpitakse proovides ja lahendades reaalseid ülessandeid. Vahest ehk kõige paremini õpetavabki oma loodud vigane kood, mis saab pärast mõttetööd iseseisvalt lahendatud.

Sissejuhatus

muuda

See osa veel ei eelda otsest koodikirjutamise oskust, kuid tegemist on protseduuride/teadmistega mida peab valdama iga C programmeerija.

Harjutus 1

muuda
  • Loo kaust kuhu salvestada fail
  • Lisa sinna kausta fail tere.c, mille sisu on
#include <stdio.h>

int main(void) { 
  printf("Tere maailm!");
  return 0; 
}
  • Kompilleeri & käivita see fail

Harjutus 2

muuda
  • Küljenda antud koodilõik vastavalt C stiilile (selle hulgas kirjuta kommentaarid)
#include <stdlib.h>
#define XXX printf("\n");getchar();getchar();return 0

int main(void){int ex=3,nr=0,i=0,t=0,p=0;printf("Sisesta palju täisarve soovid sisestada: ");scanf("%d", &nr);
while(ex!=0 && ex!=1 && i!=nr){i++;printf("Sisesta täisarv: ");scanf("%d", &ex);switch(ex % 2){case 0: t++; break;
case 1: p++; break;default: ex=1; break;}} printf("Sisestasi %d paaris ja %d paaritut arvu.",t,p); XXX;}

Harjutus 3

muuda
  • Küljenda antud koodilõik vastavalt C stiilile (selle hulgas kirjuta kommentaarid ja prototüübid)
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define XXX printf("\n");getchar();getchar();return 0
#define VIGA printf("- Programmi töös ilmnes viga! -");
#define maxkirjed 20
typedef struct kaup{char nimetus[25];double hind;} KAUP;
int main(void){KAUP kirje[maxkirjed];int pole=0,i=0;if(taida_massiiv(kirje,&i)!=pole){if(i!=pole){kuva(kirje,i);
sordi(kirje,i);kuva2(kirje,i);}else{VIGA}}else{VIGA}XXX;}
int taida_massiiv(KAUP *kirje, int *j){FILE *andmed, *fopen();char andmefail[]="andmed.txt";int kkk;int i=0;
if ((andmed = fopen(andmefail, "r")) == NULL){printf("Andmefaili andmete laadimisel ilmes viga!\n");kkk=0;
}else{while(!feof(andmed) || i==maxkirjed){fscanf(andmed,"%s", kirje[i].nimetus);fscanf(andmed,"%lf", 
&kirje[i].hind);i+=1;}kkk=1;}*j=i-1;int fclose(FILE *andmed);return kkk;}
int kuva(KAUP *arvuti, int i){int j;double x;for(j=1;j<i;j++){printf("\nSee pakkumine on eelmisest ");
x=arvuti[j-1].hind-arvuti[j].hind;if(x>0){printf("soodsam %6.2lf EEKi",x);}else{printf(" kallim %6.2lf EEKi",-x);}}}
int sordi(KAUP *kirje, int i){int pass, counter,k=i;while(k--){for (pass = 0; pass < i-1;pass++){
if(kirje[pass].hind>kirje[pass+1].hind){vaheta(&kirje[pass],&kirje[pass+1]);}else{}}}}
int kuva2(KAUP *arvuti, int i){printf("\n\nParim pakkumine tehti ");printf("arvutiga %s hinnaga %6.2lf EEK.",
 arvuti[0].nimetus, arvuti[0].hind);printf("\nParimuselt 2 pakkumine tehti ");   
printf("arvutiga %s hinnaga %6.2lf EEK.", arvuti[1].nimetus, arvuti[1].hind);}
void vaheta (KAUP *v1, KAUP *v2){KAUP temp;temp= *v1;*v1 = *v2;*v2 = temp;}

Muutujad

muuda

Nimetamine

muuda
  1. Kas muutuja nimi võib alata numbriga?
  2. Kas muutuja nimi võib alata tüpograafilise sümboliga (nagu #, *, _)?
  3. Too mõni näide C muutja nimest mis ei oleks sobilik. Miks see ei ole sobilik?

Andmetüübid

muuda
  1. Nimeta vähemalt 3 andmetüüpi C's
    1. Kui palju sinu arvutil, igaüks neist mälu nõuab?
  2. Kas võime kasutada andmetüüpide nimetusi (nagu 'int', 'float') muutjate nimedena?

Väärtustamine

muuda
  1. Kuidas sa deklareeriksid ja väärtustaksid muutujale 3.14, kui muutuja nimi on pii?
  2. Too näide, kas on võimalik väärtustada int tüüpi väärtus otse tüübile double?
    1. Kas vastupidine on võimalik?

Refereerimine

muuda
  1. Sul on vaja muutuja "pi1" väärtusega väärtustada muutuja "pi2"?
    1. Milline oleks sellele korrektne koodisegment?
    2. Mida see tähendaks tagurpidi? Kas tegemist on lubatud/korrektse C koodisegmendiga? (isegi, kui see annab õige vastuse)?
    3. Mis oleks, kui sooviksid väärtustada muutuja "pi2" konstantse väärtusega (nagu 3.1415)
      a. Milline näeks korrektne koodisegment välja?
      b. Kas tagurpidi oleks tegemist lubatud või mitte lubatud C koodisegmendiga?