Binäärioperaatiot Tiedostot ja I/O

Samankaltaiset tiedostot
Binäärioperaatiot Tiedostot ja I/O

Moduli 5: Kehittyneitä piirteitä

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

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

Loppukurssin järjestelyt

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

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

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

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

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

Lyhyt kertaus osoittimista

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

Loppukurssin järjestelyt C:n edistyneet piirteet

Tietotyypit ja operaattorit

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

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

C-ohjelmointi, syksy 2006

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

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

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Ohjeet. Jaa vastauksesi konsepteille siten, etta:

Ohjelmoinnin perusteet Y Python

Rakenteiset tietotyypit Moniulotteiset taulukot

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

Harjoitustyö: virtuaalikone

Kappale 20: Kantaluvut

Tietueet. Tietueiden määrittely

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

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

9/20: Puhu mun stdinille

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

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

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

2. C-kieli ja ongelmanratkaisu

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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

Harjoitus 3 (viikko 39)

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Tietorakenteet ja algoritmit

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmointiharjoituksia Arduino-ympäristössä

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

13 Operaattoreiden ylimäärittelyjä

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Esimerkki luokkahierarkiasta: C++-kielen IOstream-kirjasto

Osoittimet ja taulukot

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto

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

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Ohjelmoinnin perusteet Y Python

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

Tietorakenteet ja algoritmit

C-ohjelmointi, kevät Merkkijonot Komentoriviparametrit. Luento

Merkkijonot Komentoriviparametrit

Tietorakenteet ja algoritmit

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

Ohjelmoinnin peruskurssi Y1

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

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

Java-kielen perusteet

Merkkijonot Komentoriviparametrit

Ohjelmoinnin perusteet Y Python

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 Taulukot ja merkkijonot

C-kurssi kevät Luennon sisältö

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

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

Luennon sisält. ltö. C-kurssi syksy ääreet: int ja char. Yksinkertaiset tyypit. Kokonaisluvut. Merkit

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

Tietorakenteet ja algoritmit

Ohjelmoinnin peruskurssi Y1

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

Osoittimet ja taulukot

3. Binääripuu, Java-toteutus

ATK tähtitieteessä. Osa 4 - IDL input/output. 19. syyskuuta 2014

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Harjoitus 6 (viikko 42)

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

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

12. Näppäimistöltä lukeminen 12.1

Transkriptio:

C! Binäärioperaatiot Tiedostot ja I/O 8.3.2018

Tiedotteita Viimeinen luento to 29.3. Ohjelmointitehtävä, ohjelmointikoe ja niiden järjestelyt Ohjelmointikokeeseen ilmoittautuminen auki 2

.c tiedostot ja.h - tiedostot C-ohjelman lähdekoodi kirjoitetaan.c päätteiseen tiedostoon Ohjelman käyttämät määrittelyt kirjoitetaan.h päätteiseen otsaketiedostoon Funktioiden esittelyt (mutta ei toteutuksia) Tietotyypit, tietorakenteet, jne Ohjelmakoodia tai funktioiden toteutuksia ei kirjoiteta.h tiedostoon.c - lähdetiedostoista viitataan.h - otsaketiedostoihin 3

Binääriluvut Laitteistolle luonnollinen tapa käsitellä tietoa Tietokone on (iso) sarja kytkimiä jotka ovat joko päällä tai pois Kaikki isommat lukuarvot rakentuvat biteistä Esim tietokoneen muistissa 10-järjestelmän 6 == 110 bitteinä Binäärilukuja ei voi suoraan esittää standardi C-kielellä (jotkut kääntäjät toteuttavat oman binäärivakio-esitysmuotonsa) Esitetään usein heksadesimaalivakioiden avulla Yksi heksadesimaalimerkki vastaa neljää binäärimerkkiä (bittiä) 4

Heksadesimaaliluvut 16-kantainen lukujärjestelmä Voidaan helposti muuntaa binääriluvuiksi (koska 16 == 2 4 ) Yksi heksadesimaalimerkki vastaa neljää bittiä Yksi tavu (= 8 bittiä) mahtuu kahteen heksamerkkiin C-kielessä heksavakiot esitetään 0x - alkuliitteellä 16 merkkiä: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 0xF == 15, 0x10 == 16, 0x1F == 31, 0x20 == 32, Printf ja scanf tulostusformaatti: %x tai %X Vaikka esitystapa vaihtuu, luku pysyy samana 74 == 0x4A == 10001010 == J 5

Lukujärjestelmien vertailua 6

Bittioperaattorit Lukujen bittisisällön käsittelyyn Vastaavat loogisia operaattoreita (AND, OR, NOT) Loogiset operaattorit (&&,,!) palauttavat kokonaisluvun 0 tai 1 Binäärioperaattorit (&,, ~, ^) muokkaavat lukua yksittäisten bittien tasolla Kaksi lukua käydään läpi bitti kerrallaan, tuloksena syntyy uusi luku kokonaisluvun arvoksi voi tulla muutakin kuin 0 tai 1 Vertailuehdoissa kannattaa olla tarkkana Esim. && vs. & Toimivat vain kokonaislukutyypeillä 7

Bittitason JA A & B: Jos sekä A- ja B-bitti ovat 1, tulos on 1. Muuten tulos on 0 8

Bittitason TAI A B: Jos joko A - tai B - bitti on 1, tulos on 1. Jos molemmat ovat 0, tulos on 0 9

Bittitason poissulkeva TAI A ^ B: Jos vain jompikumpi bitti on 1, tulos on 1. Jos molemmat bitit ovat samoja, tulos on 0 10

Bittitason EI ~A: Käännä bittien tila vastakkaisiksi: 0:sta tulee 1; 1:stä tulee 0 11

Esimerkki bittitason operaatioista int main(void) { unsigned char a = 0x69; // 01101001 unsigned char b = 0xca; // 11001010 printf("a & b = %x\n", a & b); unsigned char c = a b; } printf("a b = %x\n", c); b ^= a; // b = b ^ a printf("a ^ b = %x\n", b); printf("~a = %x\n", ~a); printf("~a & 0xff = %x\n", ~a & 0xff); Tulostuu: a & b = 48 a b = eb a ^ b = a3 ~a = ffffff96 ~a & 0xff = 96 12

Bittien siirtäminen >> operaattori siirtää bittejä oikealle Vastaa kahden potenssilla jakamista << - operaattori siirtää bittejä vasemmalle Vastaa kahden potenssilla kertomista Käytetään kokonaislukutyypin kanssa Arvoalueen ulkopuolelta siirtyvien bittien paikalle tulee 0 13

Bittien siirtäminen -- esimerkkejä 105 210 105 52 105 164 105 144 14

kahoot.it A) 0110 heksadesimaalimuodossa B) 0x37 binäärimuodossa C) 0xB3 binäärimuodossa D) 0101 & 1100 E) 0101 1100 F) 6 & 1 G) 0100 1100 << 2 H) 0x4C >> 4 source: eugbug.hubpages.com 15

kahoot.it 16

2 tavun paketti 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 A B 17

I/O virrat FILE *f = fopen("testfile", "w"); if (!f) { fprintf(stderr, "Opening file failed\n"); exit(exit_failure); } writestring(f, mystring); fclose(f); gcc /home/psarolah/file.txt /etc/httpd.conf 18

I/O - virta C-kielessä (tiedoston, terminaalin, ) luku ja kirjoitus tapahtuu I/O virtojen kautta Ohjelman liittymä ulkomaailmaan Ennen käyttöä virta pitää avata Muutama oletusvirta on valmiiksi avattuna Useita virtoja voi olla auki kerrallaan Toistaiseksi ollaan käytetty paria I/O operaatiota printf: muotoillun tekstin kirjoittaminen virtaan scanf: tietyn muotoisen syötteen lukeminen virrasta Nämä ovat kohdistuneet oletusvirtoihin, mutta muitakin on 19

Puskurointi Syöttö- ja tulostusvirrat ovat puskuroituja Puskuri on tietorakenne, joka taltioi tietoa tilapäisesti Voi näkyä viiveenä syötteen/tulostuksen toimituksessa 20

Puskurointi Syöttö- ja tulostusvirrat ovat puskuroituja Puskuri on tietorakenne, joka taltioi tietoa tilapäisesti Voi näkyä viiveenä syötteen/tulostuksen toimituksessa Erityyppisiä puskurointipolitiikkoja Käyttäjän syöte ja tuloste oletuksena rivipuskuroituja Data toimitetaan kun rivi vaihtuu I/O virran puskurin toimintaa voidaan ohjata Ei puskuria tai täysi puskurointi setvbuf funktio Lisäksi käyttöjärjestelmässä on muita puskureita Kaikkeen puskurointiin ei voi helposti vaikuttaa 21

I/O-virran käsittely: FILE* - tietotyyppi I/O virtaa käsitellään FILE* - tietotyypin kautta Vain siihen tarkoitettuja funktoita käyttäen I/O - toiminnallisuus määritelty stdio.h otsakkeessa I/O virta avataan fopen - kutsulla: FILE *fopen(const char *path, const char *mode) Path: esimerkiksi tiedoston nimi Mode: käsittelymoodi (luetaanko r, kirjoitetaanko w, jne.) I/O virta täytyy sulkea käytön jälkeen fclose(file *fp) Vapautetaan käytetyt resurssit Virtaa ei voi tämän jälkeen enää käyttää 22

I/O-virran avaaminen ja sulkeminen #include <stdlib.h> #include <stdio.h> int main(void) { char *mystring = "One line written to file\n"; } // open 'testfile' for writing (remove previous content) FILE *f = fopen("testfile", "w"); if (!f) { fprintf(stderr, "Opening file failed\n"); exit(exit_failure); } writestring(f, mystring); fclose(f); 23

Esimerkki: merkin kirjoitus int writestring(file *fp, const char *str) { while (*str) { // write characters until the end of string if (fputc(*str, fp) == EOF) return -1; // error in writing } } return 0; str++; Huom: stdio.h:ssa myös valmis funktio merkkijonon kirjoitukseen (fputs) 25

Standardi I/O - virrat Järjestelmässä on oletusarvoisesti auki kolme I/O-virtaa stdin käyttäjältä tuleva syöte Luetaan esim. scanf funktiolla stdout käyttäjälle menevä tuloste Esim. printf kutsun tuottama teksti stderr virheulostulo puskuroimaton: tuloste näkyy heti Oletuksena stdin ja stdout ovat rivipuskuroituja Oletusarvoisesti syötteet ja tulosteet ohjautuvat terminaali-ikkunaan (mutta voidaan ohjata muualle) 26

Eri tyyppisiä I/O - virtoja Putki Esim. terminaalisyöte ja tuloste (esim. stdin ja stdout) Rivipuskuroitu Ei ennalta määriteltyä loppua Syötettä ja tulostetta luetaan/kirjoitetaan koko ajan eteenpäin Tiedosto Täysin puskuroitu Tiedostolla on määritelty loppu Käytetään vakiota EOF: end-of-file Tiedoston käsittelyssä voidaan hypätä mielivaltaiseen kohtaan Ja esim. lukea sama kohta useaan kertaan 27

Tekstidata ja Binääridata Monet I/O virrat ovat tekstimuotoisia Lukemisen jälkeen voidaan käsitellä ja tulostaa kuten merkkijonoja Koostuu yleensä riveistä Funktiot fputs ja fgets kirjoittavat ja lukevat tekstisisältöä Olettavat sisällön merkkijonoiksi I/O-virta voi olla myös binäärimuotoinen Esim. Muistissa olevien tietorakenteiden sisältö sellaisenaan Virran arvoja ei voi tulkita tulostettavina merkkeinä Esim. Arvoilla 0 tai 10 (ASCII \n ) ei ole mitään erityismerkitystä Funktiot fwrite ja fread kirjoittavat ja lukevat binäärisisältöä 28

Fgets/fputs - esimerkki int main(void) { FILE *f; char buffer[100]; } f = fopen("test.c", "r"); // open file for reading if (!f) { fprintf(stderr, "Opening file failed\n"); return EXIT_FAILURE; } while (fgets(buffer, sizeof(buffer), f)!= NULL) { if (fputs(buffer, stdout) == EOF) { fprintf(stderr, "Error writing to stdout\n"); fclose(f); return EXIT_FAILURE; } } fclose(f); 29

Muotoiltu syöte ja tulostus fprintf: yleisempi muoto printf tulostuksesta Voidaan kirjoittaa mihin tahansa virtaan muotoilumääreitä käyttäen Esim. fprintf(stream, %d, luku); printf( %d, luku); on sama kuin fprintf(stdout, %d, luku); fscanf: yleisempi muoto scanf syötteen lukemisesta Lähteenä voi olla mikä tahansa virta Esim. fscanf(stream, %d, &luku); scanf( %d, luku); on sama kuin fscanf(stdin, %d, luku); 31

Merkkijonoon tulostus sprintf(char *merkkijono, muotoilu,.) tulostaa annetun muotoilun merkkijonoksi snprintf(char *merkkinono, size_t size, muotoilu, ) Kuten edellä, mutta rajaa merkkijonon enintään size pituiseksi 32