Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Samankaltaiset tiedostot
Ohjeet. Jaa vastauksesi konsepteille siten, etta:

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Moduli 5: Kehittyneitä piirteitä

Tietueet. Tietueiden määrittely

Loppukurssin järjestelyt C:n edistyneet piirteet

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

Binäärioperaatiot Tiedostot ja I/O

Loppukurssin järjestelyt

Binäärioperaatiot Tiedostot ja I/O

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Rakenteiset tietotyypit Moniulotteiset taulukot

Lyhyt kertaus osoittimista

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

C-ohjelmointi, kevät Merkkijonot Komentoriviparametrit. Luento

C-ohjelmointi, syksy Merkkijonot Komentoriviparametrit. Luento C-ohjelmointi Syksy

Merkkijonot Komentoriviparametrit

Merkkijonot Komentoriviparametrit

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

Osoittimet ja taulukot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

TIETORAKENTEET JA ALGORITMIT

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Java-kielen perusteet

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

Tietorakenteet ja algoritmit

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

int puts(char *buff) Kirjoittaa puskurissa buff \0 :lla päätetyn merkkijonon standarditulostukseen. Formatoitu konsoli-i/o Tiedostot

ITKP102 Ohjelmointi 1 (6 op)

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Dynaaminen muisti Rakenteiset tietotyypit

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

Tietotyypit ja operaattorit

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Tiedosto on yhteenkuuluvien tietojen joukko, joka tavallisimmin sijaitsee kiintolevyllä, muistitikulla tai jollakin muulla fyysisellä tietovälineellä.

13 Operaattoreiden ylimäärittelyjä

3. Binääripuu, Java-toteutus

Metodien tekeminen Javalla

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Muuttujien roolit Kiintoarvo cin >> r;

Java-kielen perusteet

Harjoitustyö: virtuaalikone

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

13. Loogiset operaatiot 13.1

Ohjelmointiharjoituksia Arduino-ympäristössä

C-ohjelmointi: Osoittimet

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Java-kielen perusteita

5/20: Algoritmirakenteita III

Olio-ohjelmointi Syntaksikokoelma

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmointiparadigmat

Tietorakenteet ja algoritmit

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Table of Contents. T Olio-ohjelmointi C/C++ perusteita Jukka Jauhiainen OAMK Tekniikan yksikkö 2010, 2011

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

C-kurssi kevät Luennon sisältö

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

ITKP102 Ohjelmointi 1 (6 op)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Osoittimet ja taulukot

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

1. Omat operaatiot 1.1

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

ELEC-A4010 Sähköpaja Arduinon ohjelmointi. Jukka Helle

Luento 5. Timo Savola. 28. huhtikuuta 2006

Tietorakenteet ja algoritmit

12 Mallit (Templates)

13. Loogiset operaatiot 13.1

Tietorakenteet ja algoritmit

Rakenne. C-ohjelmointi: Tietorakenteita ja tyyppejä. Tyyppimuunnoksia aritmeettisten tyyppien välillä. Tyyppimuunnokset. & (bitti and) Bittioperaatiot

Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä.

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

Tietorakenteet ja algoritmit

Ohjausrakenteet. Valinta:

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Transkriptio:

AS-0.1103 C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti 15.05.2013, Raimo Nikkila Ohjeet Kaikki ohjelmointitehtavat tulee toteuttaa C-kielella hyvaa ohjelmointityylia noudattaen. Tentti arvostellaan asteikolla 0-25p ja kaikkien tehtavien painoarvo on sama (5 pistetta / tehtava). Vastaa viiteen vapaavalintaiseen tehtavaan. Tentissa saa kayttaa funktiolaskinta seka tentissa jaettua C-kielen standardikirjaston minireferenssia. Kaikki tentin tehtavat ovat tehtavissa minireferenssissa listatuilla funktioilla mutta kaikkia C-kielen standardikirjaston funktioita saa halutessaan kayttaa. Jaa vastauksesi konsepteille siten, etta: Tehtavat 1. ja 2. ovat omalla konseptillaan Tehtavat 3. ja 4. ovat omalla konseptillaan Tehtavat 5. ja 6. ovat omalla konseptillaan Tavussa (char).on a ina 8 bittia ja eniten merkitseva bitti on aina vasemmalla. Kurssipalautelomake on auki NG:ssa. Kurssipalautteen antamisesta saa yhden lisapisteen kurssiarvosteluun. Kirjoita edes opiskelijanumerosi selkealla kasialalla tenttipapereihin.

1. Tehtava Vastaa seuraaviin kysymyksiin annetun ohjelmakoodin perusteella. A) Funktio reversearray() tekee oletuksia parametreistaan. llmaise nama oletukset yhtena tai useampana assert 0-lausekkeena. B) Mitka olisivat seuraavien lausekkeiden arvot reversearray 0-funktiossa? 1) sizeof (array) ; II) sizeof (*array); Ill) sizeof (array [0]); C) Vaihtamalla pelkastaan funktion reversearrayo ensimmaisen parametrin tyypin, voisiko funktiolla kaantaa: I) Taulukon char arvoja? void reversearray(char* array, int size); II) Taulukon double arvoja? void reversearray(double* array, int size) ; Ill) Taulukon char* arvoja? void reversearray(char** array, int size); D) Mita funktio tekisi jos for-lauseesta poistettaisiin aaltosulut? f o r ( s i z e _ t i = 0 ; i < ( ( s i z e _ t ) s i z e ) I 2 ; i ++) SWAP ( a r ray [ i ], a r ray [ s i z e - i - 1] ) ; E) Mita funktio tekisi jos for-lauseen ehdosta poistettaisiin kahdella jakaminen? f o r ( s i z e _ t i = 0 ; i < ( s i z e _ t ) s i z e ; i ++) { SWAP(array[i], array[size - i - 1]); } 1 #include < stddef. h> 2 3 #define SWAP(L, R) int tmp = (L) ; (L) = (R) ; (R) tmp 4 5 void reve rsearray(int* array, int size) 6 { 7 8 9 10 11 } for ( s ize _t i = 0 ; i < (( size_t) size) I { SWAP(array[i], array[size - i - 1]); } 2 ; i++)

2. Tehtava Toteuta funktio sortbi ts (), joka jarjestaa unsigned int tyyppisen arvon bitit. Bitit jarjestetaan siten, etta 1-bitit tulevat arvon eniten merkitsevaan (vasempaan) paahan. Vastaavasti 0-bitit tulevat arvon vahiten merkitsevaan (oikeaan) paahan. Funktio palauttaa jarjestetyn arvon. unsigned int sortbits(unsigned int value): Esimerkkina funktion toiminnasta: sortbits(ox1248) palauttaa arvon OxFOOOOOOO

3. Tehtava Ohessa on funktioita jotka kasittelevat yksinkertaista yksisuuntaista listarakennetta. Funktioiden toteutus valitettavasti on kaukana parhaasta mahdollisesta ja niissa on muutamia virheita. Tunnista nama virheet ja kuvaile lyhyesti miten korjaisit ne. 1 #include < stdio. h> 2 #include < std I i b. h> 3 #include < assert. h> 4 5 6 7 8 typedef struct node { int value ; struct node * next ; 9 } Node ; 10 11 12 Node * listp r epend(node* list, 13 { 14 Node* new = malloc(sizeof(new)) ; 15 new->value = value ; 16 new-> ne x t = I is t; 17 return new ; 18 19 } 20 21 22 { 23 24 25 26 27 28 29 30 } 31 I* Lisaa uuden solmun listan ensimmaiseksi solmuksi. *I int value) I* Lisaa uuden solmun /istan viimeiseksi so/muksi. *I Node * listappend (Node * I ist, int value) if (!list) return listprepend(list, value); Node* p t r = J i s t ; while ( ptr) ptr = ptr->ne x t ; ptr->next = listprepend(list, value) ; return list; I* Poistaa listasta pelkastaan ensimmaisen * parametrina saatu arvo. *I 32 33 34 void listremove(node** list, int value) 35 { 36 assert( list) ; 37 while ( * list) 38 if (( * l i st)->value = value) 39 { 40 Node * tmp = ( * list)-> next; 41 free (*list) ; 42 * list = tmp ; 43 } 44 else 45 list = &(* list)-> next ; 46 } 47 48 49 50 { 51 52 53 54 55 56 57 58 59 } I * Laskee listan pituuden. *I s ize _t listlen(node* list) assert( l ist -:> ne xt) ; size _t n ; while (list) { l i st = list -> ne x t ; n++; } return n ; solmun jossa on

4. Tehtava Toteuta funktio strtransformo, joka suorittaa yksinkertaisen ehdollisen muutoksen merkkijonolle. Funktio ottaa kolme parametria: 1. Merkkijonon const char* tyyppisena. 2. Predikaattifunktion (funktio-osoittimen) joka ottaa parametrinaan yhden int tyyppisen merkin ja palauttaa totuusarvon (int). 3. Muutosfunktion (funktio-osoittimen) joka ottaa parametrinaan yhden int tyyppisen merkin ja palauttaa muutetun merkin int tyyppisena. Funktio palauttaa uuden dynaamisesti (malloc) varatun merkkijonon. Funktio muodostaa taman merkkijonon siten, etta niille parametrimerkkijonon merkeille joille predikaattifunktio on tosi, merkkijonoon sijoitetaan muutosfunktion merkille palauttama arvo. Vastaavasti ne parametrimerkkijonon merkit joille predikaattifunktio on epatosi, sijoitetaan sellaisenaan. Toteuta lisaksi yksinkertainen main() funktio, jossa muunnat strtransformo funktiota kayttaen jonkin merkkijonon kaikki pienet kirjaimet isoiksi kirjaimiksi. Voit olettaa etta malloc 0-, calloc 0- ja realloc 0-funktiot onnistuvat aina. Tehtavan funktio-osoittimet ovat yhteensopivia ctype.h funktioiden kanssa (minireferenssi).

5. TehUiva Selita lyhyesti ja korkeintaan kahdella lauseella mita nama funktiot tekevat. Ala kuvaa funktion sisaista toimintaa, vaan kerro mita funktio tekee syotteelleen tai millaisen arvon funktio laskee syotteistaan. 1 #inc I u de < s t d i o. h> 2 #include < std I i b. h> 3 #include < assert. h> 4 5 size _t function1(const char* p) 6 { 7 assert(p) ; 8 size _t n = 0 ; 9 while ( * (P++)) 10 n++; 11 return n ; 12 } 13 14 char * function2(file* in) 15 { 16 assert( in) ; 17 static char buffer[512] ; 18 size_ t n 0 ; 19 while (n < 511) 20 { 21 22 23 24 25 } int ch fgetc(in); if (ch = EOF II ch break ; buffer [n++] = ch ; 26 b u ff e r [ n ] = ' \ 0 ' ; 27 return buffer ; 28 } 29 ' \ n ') 30 void function 3 ( in h a, size _ t n, in t * p 1, in t * p2) 31 { 32 a sse r t (a && n && p 1 && p 2 ) ; 33 * P1 = * a ; 34 * P2 = * a ; 35 f o r ( s i z e _ t 0 ; i < n ; i ++) 36 { 37 if ( * a < * P1) 38 * P1 =* a ; 39 else if (*a > *P2) 40 * P2 *a ; 41 a++; 42 } 43 }

6. Tehtava T oteuta oheiset kolme funktiota, jotka kasittelevat taulukoita yksinkertaisia Entry tietueita. Entry on tietue jossa on kaksi kenttaa: nimi char* merkkijonona ja yksi int-tyyppinen arvo. 1 #include < std io. h> 2 #inc I u de < s t d de f. h> 3 4 struct Entry 5 { 6 chah name ; 7 int value ; 8 }; 9 I I Tietueen I I Tietueen n1m1 arvo 10 I* Tulo5taa taulukon Entry tietueita annettuun virtaan. 11 * Jokainen tietue tulo5tetaan omalle rivilleen muodo55a : 12 * n imi : arvo 13 * Parametrit jarje5tyk5e55a : 14 * Virta johon tietueet tulo5tetaan 15 * Taulukko Entry tietueita 16 * Tauluko55a olevien tietueiden lukumaara *I 17 void printentries(file * out, canst struct Entry* entries size_t n); 18 19 I* Et5ii tauluko5ta Entry tietueen annetun mmen peru5teella. 20 * P a Ia uttaa o5oitti men en5imma i5een tie tu ee5een j o II a on a nnettu n1m1. 21 * Palauttaa NULL mika li annetun nimi5ta tietuetta ei loydy tauluko5ta. 22 * P a r a m e t r it j a r j e 5 t y k 5 e 55 a : 23 * Tau I u k k o Entry tie t u e it a 24 * Tauluko55a olevien tietueiden lukumaara 25 * Haettavan tietueen nimi *I 26 canst struct Entry * findentry(const struct Entry* entries size_t n, 27 28 canst char* search); 29 I* Kopioi taulukon Entry tietueita. 30 * P a I a u t t a a I u o dun k o pion. 31 * Taulukko 5yvakopioidaan. eli e5imerkik5i alkuperai5en taulukon 32 * poi5taminen ei 5aa vaikuttaa kopioon mitenkaan. 33 * Par am e t r it jar j e 5 t y k 5 e 55 a : 34 * Tau I u k k o Entry tie t u e it a 35 * Tauluko55a olevien tietueiden lukumaara *I 36 s t r u c t Entry * copy Entries ( cons t s t r u c t Entry * e n t r i e s, s i z e _ t n ) ; Voit olettaa etta malloc 0-. calloc 0- ja realloc 0-funktiot onnistuvat a ina.

C99 minireferenssi Tentissa tarvittavat tietotyypit ja niiden koot Tyyppi Koko tavuina Lukualue 1/ 0 muotoilumaare char 1-127... 127 %c unsigned char 1 0... 255 %c int 4-2,147,483,647... 2,147,483,647 %d unsigned int 4 0... 4,294,967,295 %u %x %X long 8 Riittavan laaja (-2 63.. 2 63-1) %1d size_t 8 Riittavan laaja (0... 2 64-1) %zu double 8 Riittavan laaja %If void* 8 Kaikki ( objekti-)osoitinmuuttujat %p Operaattoripresedenssi korkeimmasta matalimpaan ja assosioituvuus () []. -t ++ -- ++ -- + - ~ (tyyppi) * & sizeof * I % + - << >> < <= > >= == ' = & - I && II?: = op= C99 varatut sanat auto break case char double else enum extern inline int long register sizeof static struct switch volatile while _Bool _Complex Tentissa tarvittavat standardikirjaston funktiot ctype.h int isalnum(int ch ); int ispunct(int ch ); int toupper(int ch ); math.h int isalpha(int ch); int isspace(int ch ); oikealta vasemmalle oikealta vasemmalle oikealta vasemmalle const float restrict typedef _Imaginary int isdigit(int ch); int isupper(int ch); continue for return union postfix ++ ja -- prefix ++ ja --, * ja &. muistioperaattorei na * aritmeettisena operaattorina &. loogisena operaattorina kaikki sijoitusoperaatiot pilkku operaattorina default goto short unsigned int islower(int ch); int tolower(int ch); do if signed void double pow(double base, double exponent); double sqrt(double value); stdio.h int printf( const char* format,... ); int sprintf(char* str, const char* format,... ); int fscanf(file* stream, const char* format,... ); FILE* fopen(const char* path, const char* mode); int getchar(void); int putchar(int ch); int puts(const char* str); char* fgets(char* str, int size, FILE* stream); stdlib.h int fprintf(file *stream, const char* format,... ); int scanf(const char* format,... ); int sscanf(const char* str, const char* format,... ); int fclose(file* fp); int fgetc(file *stream); int fputc(int ch, FILE* stream); int fputs( const char* str, FILE* stream); void* calloc(size_t nmemb, size_t size); void free(void* ptr); void abort(void); int abs(int); void* realloc(void* ptr, size_t size); void* malloc(size_t size); void exit(int); void qsort(void* base, size_t nmemb, size_t size, int (*cmp)(const void*, const void*)); string.h char* strcat( char* dest, const char* src); int strcmp(const char* str1, const char* str2); char *strstr(const char* haystack, const char* needle); size_t strxfrm( char* dest, const char* src, size_t n ); char* strchr( const char* str, int ch ); char* strcpy( char* dest, const char* src); size_t strlen( const char *str); void* memset(void* s, int c, size_t n);