C! C-ohjelmoinnin peruskurssi Pasi Sarolahti 11.1.2018
Palautteita Tällä kierroksella oli erittäin hyviä ja valaisevia tehtäviä. Hyvä ensimmäinen kierros. Ympäristön valmisteleminen vaatii aikaa ja vaivaa. Windows ja C eivät sovi yhteen, varsinkaan Valgrindin suhteen... Hankalaa oli se, että C-kielen syntaksi eroaa varsin paljon muista aiemmin oppimistani ohjelmointikielistä." Liukuvan luvun ymmärtäminen oli hieman haastavaa, sillä tietoa piti ettiä muistakin lähteistä. Myös printf-fuktion rakenne jäi epäselväksi, erityisesti %d %u tapauksissa. Muuten tekstin rakenne ja opetusjärjestys oli johdonmukainen, selkeä ja motivoiva. TIM järjestelmä oli minulle uusi, mutta se ei haitannut sillä se on tosi looginen ja intuitiivisesti interaktiivinen. Hieman olisi enemmän voinut kertoa eri ohjelmointiympäristöjen eduista ja miten ne soveltuu tälle kurssille. Jäi esimerkiksi epäselväksi,että toimiiko python1-kurssilta tuttu ja aloittelijalle hyväksitodettu Eclipse C-ohjelmoinnissa? 2
Toiveeni / Tavoitteeni kurssille Mitä haluan saavuttaa kurssilla? Voiko kurssista olla jotain hyötyä itselleni tulevaisuudessa? presemo.aalto.fi/c18 3
Mikä C? 4
Ken Thompson & Dennis Ritchie http://www.computerhistory.org/fellowawards/hall/bios/ken,thompson/ 5
C vs Python Python friends = ['john', 'pat', 'gary', 'michael'] for i, name in enumerate(friends): print "iteration {iteration} is {name}".format(iteration=i, name=name) C #include <stdio.h> int main(void) { const char *friends[] = { "john", "pat", "gary", "michael" }; for (int i = 0; i < 4; i++) { printf("iteration %d is %s\n", i, friends[i]); } } 6
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 7
C vs. Python - eroja Muotoilu C-kielessä sisennyksillä tai rivinvaihdoilla ei (teknisesti ottaen) väliä - Äärimmillään koko ohjelman voi kirjoittaa (melkeinpä) yhdelle riville - Käytännössä ohjelma pitää muotoilla selkeästi 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 Yms. 8
Mikä C? Pieni yksinkertainen 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 9
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 10
Työskentelytavat Ohjelmoimaan oppii parhaiten ohjelmoimalla Paljon ohjelmointiharjoituksia Palautus automaattiselle tarkistimelle Materiaali verkossa 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ä 11
Aikataulu (katso tarkemmat tiedot MyCoursesista) Kymmenen osiota & tehtäväkierrosta Määräajat pääsääntöisesti viikon välein Arviointiviikoilla tauko Ajoittuvat periodeille III ja IV Max. 1000 pistettä jaossa / 100 pistettä per kierros Periodi V: ohjelmointitehtävä ja ohjelmointikoe Määräajat perjantaisin klo 23:59 Ensimmäinen: pe 19.1. 12
Ruuhkaa? 13
Luennot Torstaisin klo 12:15 Joinain viikkoina ei luentoja, seuraa tiedotteita Alkupään luennot ja tilaisuudet To 18.1. käydään läpi työkaluja ja esimerkkejä To 1.2. Osoittimet ja merkkijonot To 2.2. Debugaustyökalut 14
Arviointi 40% Ohjelmointiharjoituksista Saatava vähintään 500 pistettä Vähintään 7 kierroksesta saatava 50 pistettä tai enemmän 20% Ohjelmointitehtävästä 40% Kokeesta Vähintään 50% tehtäväpisteistä saatava Koe tehdään koneella ja järjestetään toukokuun alkupuolella Kustakin osa-arvosana, josta painotettu keskiarvo => arvosana 15
Maarintalon harjoitukset (Ensisijaisesti Maari-A, tarvittaessa Maari-C) Mahdollisuus saada apua ongelmiin Toimintaohjeita: 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 kokeessa) Järjestelmälliseen kopiointiin puututaan Assarit paikalla Ma 10 12 To 14 18 Svenska: Ti 14 16, Fr 10-12 Maari-C Ti 14 16 Pe 10 14 Ke 12 16 16
Assarit (kts. MyCourses) 17
Kurssimateriaali Verkossa: https://tim.aalto.fi/ Tehtävät upotettu materiaalin sekaan Tehtäväpalautus samassa Rekisteröidy ensin aalto-sähköpostiosoitteella 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 18
Palaute Joka kierroksen lopussa pieni palautekysely 5 pistettä Palautteita käsitellään luennoilla Yhteenveto ilmestyy myös kunkin kierroksen loppuun määräajan jälkeen Lisäksi kysellään hyvää tyyppiä Onko joku ollut erityisen avulias tehtävien kanssa? Assari / toinen opiskelija / muu kaveri /. Pieniä palkintoja luvassa 19
Keskustelukanavat Suositeltu: Slack Liity: https://aalto-c.slack.com/signup Erityisesti kätevä pastebin toiminnon kanssa Voit jakaa ohjelmasi ja kysyä siihen liittyen apua 20
C - ohjelman tuottaminen
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 22
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 23
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ä 24
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 (tarkistin sakottaa näistä) Ilmoituksissa rivinumero ongelman paikantamiseksi 25
Yksinkertainen esimerkki #include <stdio.h> int main(void) { /* The following line will print out some text */ printf( hello, world\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 27
Mitä C-ohjelmalle tapahtuu? ASM global _main extern _printf section.text main: push message call _printf add esp, 4 ret message: db hello, world', 10, 0 https://excelwithbusiness.com/blog/say-hello-world-in-28-different-programming-languages/ 28
Mitä C-ohjelmalle tapahtuu? Konekieli b8 21 0a 00 00 #moving "!\n" into eax a3 0c 10 00 06 #moving eax into first memory location b8 6f 72 6c 64 #moving "orld" into eax a3 08 10 00 06 #moving eax into next memory location b8 6f 2c 20 57 #moving "o, W" into eax a3 04 10 00 06 #moving eax into next memory location b8 48 65 6c 6c #moving "Hell" into eax a3 00 10 00 06 #moving eax into next memory location b9 00 10 00 06 #moving pointer to start of memory location into ecx ba 10 00 00 00 #moving string size into edx bb 01 00 00 00 #moving "stdout" number to ebx b8 04 00 00 00 #moving "print out" syscall number to eax cd 80 #calling the linux kernel to execute our print to stdout b8 01 00 00 00 #moving "sys_exit" call number to eax cd 80 #executing it via linux sys_call https://excelwithbusiness.com/blog/say-hello-world-in-28-different-programming-languages/ 29
Palautteita Tällä kierroksella oli erittäin hyviä ja valaisevia tehtäviä. Hyvä ensimmäinen kierros. Ympäristön valmisteleminen vaatii aikaa ja vaivaa. Windows ja C eivät sovi yhteen, varsinkaan Valgrindin suhteen... Hankalaa oli se, että C-kielen syntaksi eroaa varsin paljon muista aiemmin oppimistani ohjelmointikielistä." Liukuvan luvun ymmärtäminen oli hieman haastavaa, sillä tietoa piti ettiä muistakin lähteistä. Myös printf-fuktion rakenne jäi epäselväksi, erityisesti %d %u tapauksissa. Muuten tekstin rakenne ja opetusjärjestys oli johdonmukainen, selkeä ja motivoiva. TIM järjestelmä oli minulle uusi, mutta se ei haitannut sillä se on tosi looginen ja intuitiivisesti interaktiivinen. Hieman olisi enemmän voinut kertoa eri ohjelmointiympäristöjen eduista ja miten ne soveltuu tälle kurssille. Jäi esimerkiksi epäselväksi,että toimiiko python1-kurssilta tuttu ja aloittelijalle hyväksitodettu Eclipse C-ohjelmoinnissa? 30
Työkaluista Perinteinen: komentorivi + tekstieditori Editori: esimerkiksi Kate, Emacs, Vi, Notepad++ Ohjelman kääntäminen ja suorittaminen komentoriviterminaalissa Integroitu kehitysympäristö (IDE) Kaikki toiminnot yhdessä paketissa Netbeans, Eclipse, Vistual Studio, Xcode Esim. Debuggerin käyttö helpompaa Ohjeita MyCoursesissa 31
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-tilanne on hyvä jos Win 10 käytössä Asenna Ubuntu-paketti, Asetuksista Windows subsystem for Linux Myös Visual Studio mahdollinen, mutta kääntäjässä joitain eroja kurssilla käytettyyn 32