C! Loppukurssin järjestelyt 29.3.2018
Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista?
Aikatauluista 10. kierroksen määräaika è ti 3.4. Viikolla 2.4. 6.4. ei harjoituksia (tenttiviikko) Sen jälkeen kaksi viikkoa harjoituksia 9.4. 20.4. Apua ohjelmointitehtävään Ohjelmointitehtävän deadline: pe 20.4. klo 23:59
Kunniamainintoja Dani Korpela Jaakko Majuri Eeli Susan
Ohjelmointitehtävä Aihe valittu satunnaisesti Toteuta kokonainen ohjelma tyhjästä Palauta ohjelma TIM:iin Yksi.h otsaketiedosto ja yksi.c - lähdetiedosto Ohjelma testataan TIM-järjestelmässä (Ubuntu 16.04) Kehitä kuitenkin ohjelma omalla tai koulun koneella Arviointi pisteytyksellä 0 10 pistettä Kriteerit tehtävänannon yhteydessä Vähintään 5 pistettä vaaditaan Arviointi ihmisvoimin: myös tyyli ratkaisee
Ohjelmointikoe Järjestetään joukossa mikroluokkia 3.5. 9.5. Muista ilmoittautua! Osallistuminen muuten mahdotonta Säännöt kuten muissakin tenteissä Kesto kolme tuntia Poistua saa ensimmäisen tunnin jälkeen Tunnin jälkeen koetta ei saa enää aloittaa
Ohjelmointikoe Tehdään selaimella TIM-systeemiin Kysymykset valitaan satunnaisesti Koneet tenttimoodissa: Ei kotihakemistoja Mikroluokasta yhteydet maailmalle blokattu, paitsi Harjoitustentti: https://tim.aalto.fi/view/elec-a7100/kokeet/harjoituskoe Ei automaattista arviointia Voit testata ohjelmia järjestelmässä itse
Esikääntäjä Käsittelee lähdekoodia ennen varsinaista käännösvaiheetta Tuotos pysyy tekstimuotoisena Esimerkiksi: #include tiedostojen sisällön liittäminen ohjelmaan Kommenttien poisto Erikoismerkkien käsittely (esim. \n ) Esikäännöksen direktiivit alkavat # - merkillä Rivin alusta rivin loppuun ei puolipistettä Pelkän esikäännöksen voi ajaa gcc E komennolla 8
#include Sisällyttää toisen tiedoston osaksi lähdekoodia Funktiorajapintojen määrittelyt Tietotyyppien, vakioiden, ym. määrittelyt #include <tiedosto> Käytetään standardikirjaston otsikkotiedostoihin #include tiedosto Käytetään omiin otsikkotiedostoihin Periaatteessa minkä tahansa tiedoston voi sisällyttää Eivät saa sisältää funktioiden toteutuksia.h - nimeämiskäytäntö 9
#define Määrittelee esikääntäjämakron joka korvataan annetulla tekstillä #define NIMI arvo Esim: #define NULL ((void *)0) Yleinen käytäntö: makrojen nimet isoilla kirjaimilla #include <string.h> #define MAXSTRING 80 int main(void) { char str[maxstring]; strncpy(str, "string", MAXSTRING - 1); } ( arvo voisi olla myös joku merkkijono) 10
#define-makrot parametreilla Makroon voi myös määrätä parametreja Korvautuvat annetulla sisällöllä esikäännösvaiheessa #include <stdio.h> #define PLUS(x,y) (x + y) Huomaa sulkujen käyttö int main(void) { int a = 2 * PLUS(3,4); printf( %d\n", a); } Tulostaa 14 11
#if, #else, #elif #endif Esikäännösvaiheen ehtorakenteet Ehtolausekkeet ja totuusarvot toimivat kuten normaalisti #elif tarkoittaa else if Esimerkiksi kaksi erilaista versiota rajapinnasta #if (VERSION == 1) #include "hdr_ver1.h" #elif (VERSION == 2) #include "hdr_ver2.h" #else #error "Unknown version" #endif #error aiheuttaa käännösvirheen Suoritettavaa ohjelmaa ei tällöin synny 12
Ehto-operaattori Vaihtoehto if-else rakenteelle Kolmiosainen operaattori Muoto: a > b? x : y; Operaattorin tulos on joko x tai y
Parametrilistat Eli: miten printf ja scanf on toteutettu?
Virtuaalimuistin rakenne mm. paikalliset muuttujat 0xFFFF FFFF FFFF FFFF Dynaamisesti varattu muisti Koodi ja vakiomerkkijonot 0x0000 0000 0000 0000 15
Funktio-osoittimet Osoitin voi viitata myös funktioon (eli koodiin) Funktiota voi tällöin kutsua osoittimen kautta Funktio-osoittimen tyyppi koostuu useasta osasta Paluuarvon tyyppi Parametrien tyypit Formaatti: paluuarvo (*nimi)(ptyyppi1, ptyyppi2, ) nimi on muuttujan nimi, johon funktion osoite talletetaan ptyyppi1, jne. Funktion parametrien tyypit Paluuarvo ja parameterit voivat olla myös void 16
Funktio-osoittimien määrittely #include <stdlib.h> int funcadd(int a) { return a + 1; } int main(void) { // The following declares four variables for function pointers int (*add_one)(int) = funcadd; void* (*varaa)(size_t); void (*vapauta)(void *); void* (*varaa_uudestaan)(void *, size_t); // above pointers are now uninitialized } // set the pointers to the addresses of functions in C library varaa = malloc; vapauta = free; varaa_uudestaan = realloc; 17
Funktio-osoittimen käyttö Funktio-osoitinta voi käyttää kuten mitä tahansa muuttujaa Funktion parametreina Funktion paluuarvona Paikallisena muuttujana Osana rakenteista tietotyyppiä Määrittely voi olla syntaktisesti hankalaa joissain yhteyksissä Esim. funktion paluuarvona Funktion kutsu tapahtuu muuttujan nimen kautta (esimerkki verkkomateriaalissa) 18
Esimerkki funktio-osoittimesta parametrina: qsort qsort funktio on määritelty stdlib.h otsakkeessa Järjestää taulukon annettua järjestysfunktiota käyttäen Toimii millä tahansa tietotyypillä (myös rakenteisilla tyypeillä) Järjestysfunktio pitää määritellä itse void qsort (void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 19
Luolapeli ja Makefile Make: työkalu, jolla voidaan ohjata käännösprosessia Makefilessä voidaan esimerkiksi määritellä erilaisia esikäännösmakroja tilanteen / tietokoneympäristön mukaan Isoissa projekteissa makefile generoidaan (esim. Cmakella) Käännösohjeet määritelty Makefilessä
Lisää C:tä (ja C++:aa)? ELEC-A7150 C++ Programming Periodit I - II ELEC-C7241 Tietokoneverkot Periodit III IV ELEC-C7310 Sovellusohjelmointi Periodit I II CS-C3100 Computer Graphics Periodit I II (Varmaan joitain muitakin)
Eli: Viikolla 2.4. 6.4. ei harjoituksia (tenttiviikko) Sen jälkeen kaksi viikkoa harjoituksia 9.4. 20.4. Apua ohjelmointitehtävään 10. kierroksen deadline 3.4. Ohjelmointitehtävän deadline 20.4. Kokeet 3.5. 9.5. Jos osasuoritteita puuttuu kokeen jälkeen, ota yhteyttä Älä jätä kurssia ensi vuodelle roikkumaan!