Programmeerimiskeel C/Harjutused
Ilme
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]- Kas muutuja nimi võib alata numbriga?
- Kas muutuja nimi võib alata tüpograafilise sümboliga (nagu #, *, _)?
- Too mõni näide C muutja nimest mis ei oleks sobilik. Miks see ei ole sobilik?
Andmetüübid
[muuda]- Nimeta vähemalt 3 andmetüüpi C's
- Kui palju sinu arvutil, igaüks neist mälu nõuab?
- Kas võime kasutada andmetüüpide nimetusi (nagu 'int', 'float') muutjate nimedena?
Väärtustamine
[muuda]- Kuidas sa deklareeriksid ja väärtustaksid muutujale 3.14, kui muutuja nimi on pii?
- Too näide, kas on võimalik väärtustada int tüüpi väärtus otse tüübile double?
- Kas vastupidine on võimalik?
Refereerimine
[muuda]- Sul on vaja muutuja "pi1" väärtusega väärtustada muutuja "pi2"?
- Milline oleks sellele korrektne koodisegment?
- Mida see tähendaks tagurpidi? Kas tegemist on lubatud/korrektse C koodisegmendiga? (isegi, kui see annab õige vastuse)?
- 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?