C! C-ohjelmoinnin peruskurssi Pasi Sarolahti 12.1.2016
Mikä C? 2
Ken Thompson & Dennis Ritchie http://www.computerhistory.org/fellowawards/hall/bios/ken,thompson/ 3
Mikä C? Pieni kieli, vain muutamia kielen avainsanoja Toiminnallisuus funktioissa, data muuttujissa Ei olioita Melko matalan tason kieli Osoittimien avulla päästään tietokoneen muistin tasolle Staattinen tyypitys muuttujien tyyppi päätetään kiinteästi käännösaikana I/O, merkkijonojen käsittely, ym. monimutkaiset operaatiot toteutettu kirjastoissa Funktioita, joita kutsutaan, eivät kielen ominaisuuksia 4
Kurssin tavoitteet C-kielen perusteiden hallinta, mm. Perusrakenteet, tietotyypit ja syntaksi Osoittimet Muistinhallinta Bittien käsittely Kyky toteuttaa itsenäisesti lyhyitä C-ohjelmia Kyky löytää ja korjata virheitä omasta (ja toisten) koodista Tarvittavien koodaus- ja debugaustyökalujen tunteminen C-guruksi tullaan ohjelmoimalla ja kokemuksen kautta 5 op:n kurssi on vain alkusysäys 5
Työskentelytavat Ohjelmoimaan oppii parhaiten ohjelmoimalla Paljon ohjelmointiharjoituksia Palautus automaattiselle tarkistimelle Materiaali verkossa Myös Vinkkiwiki Vähän luentoja Tarkoitus ei toistaa verkkomateriaalin asioita sellaisenaan Ota luennolla esiin epäselviksi jääneitä asioita Voidaan tarkastella myös ajankohtaisia harjoitustehtäviä 6
Aikataulu (katso tarkemmat tiedot MyCoursesista) Kuusi modulia / kuusi tehtäväkierrosta Kukin kaksi viikkoa Per III: Kaksi kierrosta + tauko Per IV: Kaksi kierrosta + tauko Per V: Kaksi kierrosta + tentti 16.5. Määräajat perjantaisin klo 23:59 Kierros 1: pe 29.1. Kierros 2: pe 12.2. Jne 7
Ruuhkaa? 8
Luennot Tiistaisin Mutta ei joka viikko Alkupään luennot Ti 19.1. käydään läpi työkaluja ja esimerkkejä Ti 26.1. Osoittimet ja taulukot (Joel) Ti 2.2. Debugaustyökalut Tämän jälkeen n. 1 per moduli Aikataulu päivittyy MyCoursesiin, seuraa sieltä 9
Arviointi 50% Ohjelmointiharjoituksista 84 tehtäväkohtaa, yksi piste kustakin - 14 tehtäväkohtaa per kierros Vähintään 7 pistettä per kierros saatava - Yhden kierroksen saa jättää tekemättä tai vajaaksi Vähintään 42 pistettä yhteensä 50% Tentistä C-koodin luku- ja kirjoitustehtäviä, ehkä esseetehtävä Tentistä saatava vähintään 15 pistettä (max. 30) Tarkempi kuvaus MyCoursesissa 10
Maarintalon harjoitukset (Ensisijaisesti Maari-A, tarvittaessa Maari-C) Mahdollisuus saada apua ongelmiin Toimintaohjeita: Alussa saatetaan järjestäytyä tehtävien mukaisesti: varaudu vaihtamaan paikkaa Ei kannata odottaa käsi pystyssä, assarit kiertävät salia järjestyksessä Kannattaa tarkistaa mitä naapuri tekee, odottaessa tehtäviä voi miettiä yhdessä Kaveria saa neuvoa Koodin kopioiminen ei ole hyödyllistä auttamista (kostautuu tentissä) Järjestelmälliseen kopiointiin puututaan Assarit paikalla Ma 10 12 To 12 16 Svenska: Ti 14-16, To 14-16, Maari-C Ti 14 16 Pe 10 14 Ke 12 16 11
Assarit (kts. MyCourses) 12
Kurssimateriaali Verkossa: http://src.aalto.fi/c/home/ Tehtävät upotettu materiaalin sekaan Myös kirjallisuutta kannattaa käyttää Hyvä perinteinen kirja: Kernighan, Ritchie: The C Programming Language, 2 nd edition. Prentice Hall. - C is not a big language, and it is not well served by a big book Netissä paljon tietoa Vinkkiwiki https://wiki.aalto.fi/display/c/ 13
Tehtäväpalautus: TestMyCode (TMC) https://src.aalto.fi/tmc/ Rekisteröidy aluksi käyttäen opiskelijanumeroa käyttäjätunnuksena Jos sinulla on jo tunnus, käytä sitä Käytä myös Aalto-sähköpostiosoitetta Kurssi: C-spring-2016 Eri tapoja palauttaa tehtäviä: Komentorivityökalu Suoraan Netbeans-käyttöliittymästä Zip-pakettina web-selaimen kautta 14
IRC Kurssilla on IRC kanava #aalto.c (IRCnet) Esim. Kysymyksiä harjoituksiin liittyvistä ongelmista Suositus: käytä irssiä Ensimmäisellä kerralla: ssh <username>@kosh.aalto.fi screen irssi /connect irc.cs.hut.fi /join #aalto.c Seuraavilla kerroilla ssh <username>@kosh.aalto.fi screen rd Enemmän ohjeita Vinkkiwikissä Hyödyllinen pastebin-toiminnan kanssa 15
C - ohjelman tuottaminen
C vs. Python C-lähdekoodi Python-koodi C-kääntäjä Ohjelmabinääri Käyttöjärjestelmä Tietokone Python-tulkki Käyttöjärjestelmä Tietokone 17
C vs. Python - eroja Muotoilu C-kielessä sisennyksillä tai rivinvaihdoilla ei väliä - Äärimmillään koko ohjelman voi kirjoittaa (melkeinpä) yhdelle riville - Käytännössä käytetään koodia selkeyttämään Muuttujat C:ssä staattinen tyypitys: tyyppi määritellään käännösaikana Muuttujien yhteydessä niiden tyyppi on aina määriteltävä Syntaksi Puolipiste lopettaa aina lauseen: unohtaminen aiheuttaa virheen Lohkorakenteet merkitään aaltosuluilla Muistinhallinta Sekä muita (vinkkiwikissä laajempi katsaus) 18
C-ohjelmoinnin vaiheet 1. Kirjoitetaan ohjelmakoodi tekstieditorilla Ohjelmatiedostot nimetään.c päätteellä Suuret ohjelmistot koostuvat useista lähdetiedostoista 2. Käännetään ohjelmakoodi Esikäännös: koodin alkuprosessointi Käännös: c-koodista objektitiedostoksi (yksi per.c tiedosto) Linkkaus: koostetaan objektitiedostot suoritettavaksi ohjelmaksi Mikäli varoituksia tai virheitä, mennään kohtaan 1 ja korjataan 3. Testataan ohjelmaa Mikäli virheitä, mennään kohtaan 1 ja korjataan 19
C-kehityksessä käytetyt tiedostot.c päätteiset tiedostot sisältävät lähdekoodin Suurempi ohjelma voi sisältää näitä useita Yhdistetään yhdeksi ohjelmaksi linkkausvaiheessa.h päätteiset tiedostot ovat otsakkeita Tietotyyppien ja funktioiden määrittelyt Viittaukset.c tiedostoista #include - komennolla Tarvitaan, jotta lähdekoodi voi käyttää ulkopuolisia määrittelyjä Makefile ohjeistus make-työkalulle Kertoo mitkä tiedostot ohjelmaan kuuluvat Sisältää ohjeet ohjelman kääntämiseksi Sekä mahdollisesti muita kehityksessä tarvittavia toimintoja 20
Ohjelman kääntäminen Usein käytetään GNU C (gcc) kääntäjää Yksinkertaisimmillaan komentorivillä: gcc <lähdetiedosto.c>! Tuottaa a.out nimisen tiedoston, joka suorittaa ohjelman Jos ohjelma koostuu useasta lähdetiedostosta, kaikki.c tiedostot listataan komentorivillä.h tiedostoja ei listata tässä TMC-tehtävissä tulee mukana Makefile Skripti ohjelman kääntämiseksi (gcc:tä käyttäen) make <komento> komentorivillä riittää 21
Kääntämisen tulos Jos kaikki sujuu hyvin: ei tulostetta Kurssin ohjelmissa syntyy src/main ja test/test - tiedostot Käännösvirheet Kääntäjä ei pysty tuottamaan suoritettavaa binääritiedostoa Tutki virheilmoitukset, ja yritä korjata koodi niiden mukaan Varoitukset Kääntäjä tuottaa suoritettavan koodin ja binääritiedosto syntyy Koodissa on hyvin todennäköisesti vikaa Varoitukset syytä aina korjata Ilmoituksissa rivinumero ongelman paikantamiseksi 22
Yksinkertainen esimerkki #include <stdio.h> int main(void) { /* The following line will print out some text */ printf("hey! How are you?\n"); } #include sisällyttää stdio-kirjaston ohjelmaan (printf funktio on määritelty täällä) int main määrittelee ohjelman aloittavan main-funktion /*.. */ on kommentti: se saa sisältää mitä vaan Printf tulostaa annetun tekstin 23
Työkaluista Perinteinen: komentorivi + tekstieditori Editori: esimerkiksi Kate, Emacs, Vi, Notepad++ 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 - Web-selaimen käyttäminen ja zippaaminen ei tarpeen Netbeans vaatii JDK 7:n toimiakseen Ohjeita: https://src.aalto.fi/c/instructions/ 24
Työkalut eri järjestelmille Linuxissa hyvä kehitystuki Tarvittavat ohjelmat usein asennettu oletusarvoisesti Paras tuki ohjelmien analysoimiseen ja debugaukseen Mac OS X XCode-ohjelmointiympäristön mukana tarvittavat työkalut - Asenna lisäksi komentorivityökalut - XCode IDE:n käyttö havaittu epäkäteväksi kurssilla Kääntäjä ja debuggeri eroavat Linuxista Valgrind ei välttämättä toimi Windows tarvitsee hieman lisäasennuksia Esim. Cygwin ohjelmistolla saadaan komentorivillä toimivat työkalut Valgrind analysointi ei onnistu 25