C! Perusteet 19.1.2015
Työkaluista Perinteinen: komentorivi + tekstieditori Editori: esimerkiksi Kate, Notepad++, Aquamacs (Emacs) Ohjelman kääntäminen ja suorittaminen komentoriviterminaalissa TMC - komentorivityökalu Integroitu kehitysympäristö (IDE) Kaikki toiminnot yhdessä paketissa Netbeansiin saatavilla TMC-plugin tehtävien palauttamiseen Netbeans vaatii JDK 7:n toimiakseen Aallon Linux-järjestelmissä valmiiksi asennettuna Ohjeita: https://src.aalto.fi/c/instructions/ 2
Komentorivikomentoja ls näytä nykyisen hakemiston sisältö cd <hakemisto> siirry annettuun hakemistoon cd.. takaisin ylempään hakemistoon pwd näytä mikä on uusi hakemisto emacs <tiedosto> editoi tiedostoa käyttäen emacsia rm <tiedosto> poista annettu tiedosto Kätevää: TAB täydentää tiedoston/hakemiston nimen 3
emacs komentoja (erittäin lyhyt versio) Ctrl+x ja Ctrl+s Tallenna tiedosto Ctrl+x ja Ctrl+c Sulje emacs 4
tmc.py -- työkalu (katso tmc.py - asennus ohjeista, myös Aallon koneet) tmc configure valitse kurssi, anna käyttäjätunnus tmc select valitse tehtävä Editoi (esim. emacs)-> sen jälkeen make make run-main testaa käyttäen src/main.c tiedostoa tmc test aja testit paikallisesti tmc submit lähetä palvelimelle tmc submit --paste laita pastebiniin 5
Muuttujat ja niiden esittely C-kielessä muuttujat pitää esitellä ennen käyttöönottoa Määritellään muuttujan tietotyyppi Kääntäjä varaa muuttujalle tarvittavan tilan muistista Muuttujaa ei voi käyttää ennenkuin se on esitelty Muuttujan nimi koostuu kirjaimista, numeroista ja alaviivasta Nimen alettava kirjaimella muuttuja ja Muuttuja ovat kaksi eri nimeä int var_a;! int muuttuja = 10;! double value1, value2; 6
Kokonaislukutietotyypit 8 bittiä = 1 tavu char -127 127 unsigned char 0 255 16 bittiä = 2 tavua short -32767 32767 unsigned short 0 65535 32 bittiä = 4 tavua int -2 31 2 31 unsigned int 0 2 32 long unsigned long 64 bittiä = 8 tavua...... -2 63 2 63 0 2 64 7
Kokonaislukuvakioista Voidaan käyttää eri lukujärjestelmiä 10-lukujärjestelmä: int number = 66;! 16-lukujärjestelmä (arvo alkaa 0x-etuliitteellä) int number = 0x42;! 8-lukujärjestelmä (arvo alkaa numerolla 0) int number = 0102;! Myös merkkivakioita voidaan käyttää int number = B ;! Vastaavat jotain numeroa (konvertoituu merkistön mukaan) A Z peräkkäisillä numeroarvoilla (ASCII: 65-90) 0 9 peräkkäisiä (ASCII: 48 57) 8
ASCII merkistö (+ vähän muutakin) 9
Liukulukutyypit Voidaan käyttää desimaalilukujen, tai suurten lukujen käsittelyyn Sisäisesti koostuu kolmesta komponentista Merkkibitti, eksponentti, mantissa (-1) merkkibitti * 1.mantissa * 2 eksponentti Kaksi eri kokoista tyyppiä float: 32 bittiä (1 + 23 + 8) double: 64 bittiä (1 + 52 + 11) Kaikkia lukuja ei voi esittää Liukuluku on jotain sinne päin 10
Laskuoperaatiot +, -, *, /, % käytetään kuten useimmissa muissa ohjelmointikielissä Samoin sulkeet lisää yhdellä tai vähennä yhdellä Postfix-operaattori: muuttuja++ ja muuttuja--! Prefix-operaattori: ++muuttuja ja --muuttuja! Ero: saako lauseke uuden vai vanhan arvon Lisäksi sijoitusoperaattori muuttuja -= 2 on sama kuin muuttuja = muuttuja - 2 Sama toimii myös muille yllämainituille operaattoreille 11
Mikä tyyppi? 7:n kertotaulun läpikäyminen luvuilla 1 10? Nopeusmittari? Verkkokaupan tuotteiden varastosaldo? Ulkolämpötilan mittaaminen? Suomalaisten aakkosten läpikäyminen ja tulostaminen? Kiinalaisten merkkien luetteloiminen ja tulostaminen? char unsigned char short unsigned short int unsigned int long unsigned long float double 12
13
Tiedon tulostus ja syöttäminen 14
Printf ja muotoilumääritteet Koodi: #include <stdio.h>! int main(void)! {! int numa = 10;! float numb = 2.54;! float numc = 0.000001;! printf("the following is at least five characters long: [%5d]\n", numa);! printf("the length is six, but just one decimal shown: [%6.1f]\n", numb);! printf("another floating point number, aligned left: [%-10.2e]\n", numc);! printf("number with leading zeros: [%05d]\n", ++numa);! }! Tuloste: The following field is at least five characters long: [ 10]! The length is six, but just one decimal shown: [ 2.5]! Another floating point number, aligned left: [1.00e-06 ]! Number with leading zeros: [00011]! 15
Syötteen lukeminen scanf - funktiolla Formaatti näyttää samalta kuin printf:n kanssa Pitkälti samat muotoilumääreet (mutta pieniä eroja) Scanf ei palauta luettua arvoa Paluuarvo: onnistuneesti luettujen kenttien lukumäärä Useimmissa tapauksissa välilyönnit ja rivinvaihdot sivuutetaan Poikkeus: yhden merkin (%c) lukeminen Scanf poistuu heti kun tarpeellinen määrä on luettu Jos käyttäjä syötti enemmän, seuraava scanf-kutsu nappaa ne Huomaa & - operaattori (address-of) 16
Scanf - esimerkki #include <stdio.h>! int main()! {! int a;! float b, c;! char onechar;! int ret_a, ret_b;!! ret_a = scanf("%d", &a);! ret_b = scanf("%f,%f", &b, &c);!! if (ret_b < 2) {! /* reading failed, show error */! }! if (scanf("%c", &onechar) < 1) {! /* reading failed, show error */! }! }! 17
Tehdään ohjelma, joka Kysyy käyttäjältä kaksi lukualuetta (kokonaisluvuilla): Min x, max x, Min y, max y Tulostaa kaksiulotteisen kertotaulun näiden välillä Tehdään omaksi funktiokseen Kukin kertotaulussa tulostettu numero vie neljä merkkiä tilaa Palauttaa tulostettujen numeroiden määrän 18
Ehtolausekkeet 19
Loogiset operaattorit <, <=, >, >= käytetään kuten yleensä == yhtä suuri kuin!= eri suuri kuin Looginen JA, TAI, EI &&: looginen JA (a < 5 && b < 5) on tosi jos sekä a ja b ovat < 5 looginen TAI (a < 5 b < 5) on tosi, jos jompi kumpi on < 5! Looginen EI --!(a < 5) on tosi jos a ei ole pienempi kuin 5 Tuottavat arvon 0 (epätosi) tai 1 (tosi) C:ssä ei erillisiä tosi ja epätosi arvoja Esimerkiksi sijoitus muuttujaan on mahdollinen: int result = (a == 5); // lopputulos 0 tai 1! 20
If else rakenne Kun if - ehto toteutuu, suoritetaan seuraava lauseke tai lohko Muussa tapauksessa hypätään sen yli if (lauseke) toteutuu kun lauseke on jotain muuta kuin 0 (eli tosi ) if (!lauseke) toteutuu vain kun lauseke on 0 Voidaan käyttää muuttujan arvon testaamiseen tai loogisten operaatioiden yhteydessä else haara optionaalinen Vaihtoehtoinen toiminta, mikäli if ei toteudu Mahdollista lisätä useita else if - haaroja 21
If else esimerkki int days, years;! scanf("%d %d", &days, &years);! if (days > 365)! {! years = years + 1;! days = days - 365;! }! else! printf("%d days remaining until the next year\n", 365 - days);!! /* No curly braces in else branch --! this part of code is executed in both cases */! printf("days: %d years: %d\n", days, years);! 22
Toistolausekkeet 23
While - lauserakenne Vähän kuin if, mutta lauseke tai lohko toistuu kunnes ehto on epätosi If suorittaa lausekkeen vain kerran, mikäli ehto on tosi Toistuu kymmenen kertaa: int a = 0;! while (a < 10)! {! printf("value of a is now %d\n", a);! a++;! }! 24
While ja do while Ei suorita lohkon sisältöä lainkaan: int a = 20;! while (a < 10)! {! printf("value of a is now %d\n", a);! a++;! }! Suorittaa yhden kerran: int a = 20; do { printf("value of a is now %d\n", a); a++; } while (a < 10);! 25
While ja For expression_1; while (expression_2) { statement expression_3; } on sama kuin: for (expression_1; expression_2; expression_3) statement (toki kaarisulkuja voi käyttää for:in kanssa) 26
While ja For int a = 0;! while (a < 10)! {! printf("value of a is now %d\n", a);! a++;! }! on sama kuin: int a; for (a = 0; a < 10; a++) { printf("value of a is now %d\n", a); } Ikuinen silmukka: for (;;) { } 27
Break Sisimmästä toisto- tai switch-rakenteesta suoraan poistuminen Suoritus jatkuu rakennetta seuraavalta riviltä int a; for (a = 0; a < 10; a++) { printf("value of a is now %d\n", a); if (a == 5) break; } Toistolauseke keskeytyy kun a:n arvo on 5 28
Continue Suoritus siirtyy toistolausekkeen seuraavan kierroksen alkuun For-lausekkeen muutosehto suoritetaan int a; for (a = 0; a < 10; a++) { if (a % 2 == 1) continue; printf("value of a is now %d\n", a); } Tulostaa vain parilliset numerot 29
Funktiot 30
Funktiot Funktiot muodostavat ohjelman rakenteen Käytännössä välttämättömiä vähänkään isommissa ohjelmissa Funktiolla on neljä osaa Nimi, paluuarvo, parametrit ja runko Nimen oltava uniikki: vain yksi saman niminen funktio per ohjelma int add(int para, int parb)! {! int result = para + parb;! return result;! }! 31
Funktion paluuarvo Funktiolla voi palauttaa paluuarvon tuloksenaan Voidaan käyttää osana lausekkeita void paluuarvona tarkoittaa että paluuarvoa ei ole Paluuarvo palautetaan return lauseella Muoto: return paluuarvo;! Funktion suoritus päättyy tähän Paluuarvottomassa (void) funktiossa paluuarvoa ei anneta Return voidaan kutsua ilman paluuarvoa Funktion suoritus voi päättyä myös ilman return-lausetta Paluuarvo määrittelemätön (yleensä virhe) Poikkeuksena main funktio (paluuarvo tällöin 0) 32
Funktion parametrit Parametrit välitetään arvoina Kopioidaan kutsuvasta koodista Muutokset funktion sisällä eivät näy kutsuvassa koodissa Eräänlainen poikkeus: osoittimet ja taulukot (Moduli 2) Funktiokutsussa annettava oikea määrä parametreja Mikäli parametreja ei ole, on hyvä käyttää void määrettä parametrilistassa Esim. void funktio(void)! Jos parametrilista on tyhjä, kääntäjä ei tarkista mitä parametreja kutsu käyttää 33
Esimerkki funktion käytöstä #include <stdio.h> double mypower(double base, int exp) { double result = 1.0; while (exp--) result *= base; return result; } int main(void) { double res = mypower(3, 3); printf("%f\n", res); printf("4^5 = %f\n", mypower(4, 5)); return 0; } 34
Aikataulu Ti 26.1. -- asiaa osoittimista Pe 29.1. ensimmäinen kierros kiinni Ti 2.2. debugaustyökaluista, ym. Pe 12.2. 2. kierros kiinni ( jatkuu 4 periodilla ) 35