IN 147 Program og maskinvare

Like dokumenter
Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Programmeringsspråket C

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Vektorer. Dagens tema. Deklarasjon. Bruk

Dagens tema INF1070. Vektorer (array-er) Tekster (string-er) Adresser og pekere. Dynamisk allokering

Dagens tema. Kort repetisjon om rutiner. Programmering i C Variable og adresser. Vektorer. Tekster. Preprosessoren. Separat kompilering

Dagens tema: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

Dagens tema. Rutiner i LC-2 Og her er tilsvarende kode for LC-2: Funksjoner i C Her er det samme programmet i C: Kort repetisjon om rutiner

Velkommen til INF2100. Bakgrunnen for INF2100. Hva gjør en kompilator? Prosjektet. Jeg er Dag Langmyhr

Datamaskinen LC-2. Dagens tema. Tall i datamaskiner Hvorfor kan LC-2 lagre tall i intervallet ? Hvorfor er det akkurat celler i lageret?

Dagens tema. Datamaskinen LC-2 En kort repetisjon. Binære tall Litt om tallsystemer generelt. Binære tall. Heksadesimale og oktale tall

Programmeringsspråket C Del 2

Offentlig utvalg for punktskrift, OUP Norsk standard for 8-punktskrift punktskrift 24. oktober 2004 sist endret

Digital representasjon

Digital representasjon

Kapittel 1 En oversikt over C-språket

Del 1 En oversikt over C-programmering

Velkommen til INF2100

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

ISO Dagens tema. Tegn. Uttrykk. I Minila lagres kun heltall, men de kan tolkes som tegn. Det siste om Minila.

Programmeringsspråket C

Digital representasjon

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

IN 147 Program og maskinvare

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Programmeringsspråket C

Dagens tema C, adresser og pekere

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Dagens tema. Oppsummering om assemblerspråk. Programmering i C. Bakgrunn. Et minimalt eksempel med forklaring. Datatyper i C.

Dagens program. Operativsystemer Prosesser og systemkall i UNIX Hente prosessens nummer Starte prosesser Vente på prosesser Utføre programmer

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Oppgavene 1, 2, 4, 5, 6, 9, 12 og 13 passer best til å løses ved en datamaskin.

Programmeringsspråket C Del 3

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Forelesning inf Java 5

Forelesning inf Java 5

UNIVERSITETET I OSLO

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Betinget eksekvering og logiske tester i shell

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Del 4 Noen spesielle C-elementer

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Programmering Høst 2017

2 Om statiske variable/konstanter og statiske metoder.

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Eksamensoppgaver 2014

Velkommen til INF2100 Jeg er Dag Langmyhr

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

INF1000 : Forelesning 1 (del 2)

Læringsmål og pensum. Oversikt

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

INF1000 Eksamen 2014 (modifisert)

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

TDT4110 IT Grunnkurs Høst 2016

Transkript:

Dagens tema Mer om C Et eksempel til (med diverse forklaringer) Representasjon av tegn og logiske verdier Vektorer Statusverdi Innhenting av definisjoner Inkrementering og dekrementering av variable for-setningen Lesing fra og skriving til filer Et siste eksempel Ark 1 av 25 Forelesning 24.1.2001

Oversikt over kurset Kurset IN 147 Program- og maskinvare dreier seg om grensesnittet mellom programmer og datamaskinen: Idé Lag et program som... Java p=newelem(4); C *pi++=&a; Assemblerspråk addi $7,$0,3 Maskinkode 001010 1000 11100... Forelesning 24.1.2001 Ark 2 av 25

Om programmeringsspråk Et program er et sett instruksjoner til datamaskinen om hva den skal gjøre. Dette kan skrives i ulike språk: Java, Simula, C,... Både Java, Simula og C er imperative språk og har derfor svært mange elementer felles, selv om utseendet (syntaksen) kan variere: Java Simula C System.out.print("?"); OutText("?"); printf("?"); Java og Simula er objektorienterte språk og har klasser med tilhørende muligheter; det har ikke C. C er Java uten klasser (nesten)! Dag Langmyhr Java og C ligner svært på hverandre når det gjelder setninger, uttrykk og bruk av enkle variable. Derfor vil vi bruke Simula i sammenligningene når C- og Java-koden er lik eller nesten lik. Forelesning 24.1.2001 Ark 3 av 25

Et litt større eksempel #include <stdio.h> /* Hvor mange hele fot utgjør disse tommene? */ int finn_fot(int tommer) { return tommer/12; /* Hvor mange rene tommer er det i dette målet? */ int rene_tommer(int tommer) { int fot = tommer/12; return tommer - 12*fot; int main(void) { int tom; printf("angi et mål i tommer: "); scanf("%d", &tom); while (tom!= 0) { if (tom > 0 && tom <= 999) printf("%5d tommer = %d fot %d tommer\n", tom, finn_fot(tom), rene_tommer(tom)); else printf("programmet godtar kun verdier 0-999!\n"); printf("gi et nytt mål i tommer (0 for avslutning): "); scanf("%d", &tom); Forelesning 24.1.2001 Ark 4 av 25

Kommentarer Kommentarer omgis av /* og */. De kan stå hvor som helst. Java C // Lurt! /* Lurt! */ Deklarasjon av variable Variable kan deklareres først i en funksjon eller mellom funksjonene. En deklarasjon består av tre deler: Variabelens type. Variabelens navn. Flere variable kan deklareres, adskilt av komma. En initialverdi for sistnevnte variabel; kan droppes. En variabel uten angitt initialverdi får en tilfeldig startverdi. Simula C integer a, b, c; int a, b, c; real x; float x = 3.14; x := 3.14; Forelesning 24.1.2001 Ark 5 av 25

Predefinerte typer Disse typene er alltid definert i C: Simula C char Små tall ( 128 til 127) integer int Større tall ( 32768 til 32767) long integer long Kjempetall real float Flyt-tall long real double Store flyt-tall Innlesning Til innlesning brukes scanf. Første parameter angis hva som skal leses inn: %c for tegn, %d for heltall og %f for flyt-tall. Simula a := InInt; x:=inreal;y:=inreal; C scanf("%d", &a); scanf("%f%f", &x, &y); Legg merke til & foran variabelnavnet; den må være der. Forelesning 24.1.2001 Ark 6 av 25

Setninger Tilordning I C og Java brukes = for tilordning. Simula a:=5; C a=5; If-setninger If-setninger er som de fleste andre språk. Simula C ifa<0then if (a < 0) a:=-a; a=-a; ifa<0then if (a < 0) b:=-1 b=-1; else else b:=1; b=1; Legg merke til at det skal stå parenteser rundt testen, og at det skal være ; foran else. Forelesning 24.1.2001 Ark 7 av 25

While-løkker While-løkker er også som i de fleste andre språk: Simula C while a > 0 do while (a > 0) begin { b := b*a; a := a-1 b = b*a; a = a-1; end; I C og Java avsluttes alle setninger med ; (unntatt etter ). Sammensatte setninger Flere setninger kan slås sammen til én med { og i C og Java. Simula C begin...end {... Forelesning 24.1.2001 Ark 8 av 25

Diverse småtterier Sammenligning Verdier sammenlignes med følgende Simula C = eller == == = <> eller =/=!= < < < <= <= > > > >= >= Logiske operasjoner Disse skrives slik: Simula C not! and && or Forelesning 24.1.2001 Ark 9 av 25

Lagring av tegn C har ingen egen type for å lagre tegn (som char i Java eller character i Simula). I stedet benyttes heltall. Java C char c; int c;?? 63 Hvilken koding som brukes, vil variere fra én maskin til en annen. I den vestlige verden brukes stort sett nå ISO 8859-1, ogsåkjent som ISO LATIN-1. På neste ark er vist en oversikt over hvilke tegn som finnes i Latin-1. I øvre venstre hjørne står verdien som brukes til å representere tegnet. (I to andre hjørner står den oktale og heksadesimale verdien. De omtales i onsdagens forelesning.) Forelesning 24.1.2001 Ark 10 av 25

0 000 00 1 001 01 2 002 02 3 003 03 4 004 04 5 005 05 6 006 06 7 007 07 8 010 08 9 011 09 10 012 0A 11 013 0B 12 014 0C 13 015 0D 14 016 0E 15 017 0F 16 020 10 17 021 11 18 022 12 19 023 13 20 024 14 21 025 15 22 026 16 23 027 17 24 030 18 25 031 19 26 032 1A 27 033 1B 28 034 1C 29 035 1D 30 036 1E 31 037 1F ISO 8859 1 32 0! " # $ % & ( ) * +,. / 0 1 2 3 4 5 6 7 8 9 : ; < = >? 04 20 33 041 @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ a b c d e f g h i j k l m n o p q r s t u v w x y z { ~ 21 41 61 34 042 66 102 98 142 22 42 62 35 043 67 103 99 143 23 43 63 36 044 68 104 100 144 24 44 64 37 045 69 105 101 145 25 45 65 38 046 70 106 102 146 26 46 66 39 047 71 107 103 147 27 47 67 40 050 72 110 104 150 28 48 68 41 051 73 111 105 151 29 49 69 42 052 74 112 106 152 2A 4A 6A 43 053 75 113 107 153 2B 4B 6B 44 054 76 114 108 154 2C 4C 6C 45 055 77 115 109 155 2D 4D 6D 46 056 78 116 110 156 2E 4E 6E 47 057 79 117 111 157 2F 4F 6F 48 060 80 120 112 160 30 50 70 49 061 81 121 113 161 31 51 71 50 062 82 122 114 162 32 52 72 51 063 83 123 115 163 33 53 73 52 064 84 124 116 164 34 54 74 53 065 85 125 117 165 35 55 75 54 066 86 126 118 166 36 56 76 55 067 87 127 119 167 37 57 77 56 070 88 130 120 170 38 58 78 57 071 89 131 121 171 39 59 79 58 072 90 132 122 172 3A 5A 7A 59 073 91 133 123 173 3B 5B 7B 60 074 92 134 124 174 3C 5C 7C 61 075 93 135 125 175 3D 5D 7D 62 076 94 136 126 176 3E 5E 7E 63 077 95 137 127 177 3F ª «- ± ² ³ µ ¹ º» ¼ ½ ¾ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß 64 100 96 140 128 200 160 240 192 300 40 60 65 101 97 141 5F 7F 80 129 201 81 130 202 82 131 203 83 132 204 84 133 205 85 134 206 86 135 207 87 136 210 88 137 211 89 138 212 8A 139 213 8B 140 214 8C 141 215 8D 142 216 8E 143 217 8F 144 220 90 145 221 91 146 222 92 147 223 93 148 224 94 149 225 95 150 226 96 151 227 97 152 230 98 153 231 99 154 232 9A 155 233 9B 156 234 9C 157 235 9D 158 236 9E 159 237 9F A0 161 241 Denne tabellen finnes på /local/lib/ps/iso8859-table.ps. à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ A1 C1 E1 162 242 194 302 226 342 A2 C2 E2 163 243 195 303 227 343 A3 C3 E3 164 244 196 304 228 344 A4 C4 E4 165 245 197 305 229 345 A5 C5 E5 166 246 198 306 230 346 A6 C6 E6 167 247 199 307 231 347 A7 C7 E7 168 250 200 310 232 350 A8 C8 E8 169 251 201 311 233 351 A9 C9 E9 170 252 202 312 234 352 AA CA EA 171 253 203 313 235 353 AB CB EB 172 254 204 314 236 354 AC CC EC 173 255 205 315 237 355 AD CD ED 174 256 206 316 238 356 AE CE EE 175 257 207 317 239 357 AF CF EF 176 260 208 320 240 360 B0 D0 F0 177 261 209 321 241 361 B1 D1 F1 178 262 210 322 242 362 B2 D2 F2 179 263 211 323 243 363 B3 D3 F3 180 264 212 324 244 364 B4 D4 F4 181 265 213 325 245 365 B5 D5 F5 182 266 214 326 246 366 B6 D6 F6 183 267 215 327 247 367 B7 D7 F7 184 270 216 330 248 370 B8 D8 F8 185 271 217 331 249 371 B9 D9 F9 186 272 218 332 250 372 BA DA FA 187 273 219 333 251 373 BB DB FB 188 274 220 334 252 374 BC DC FC 189 275 221 335 253 375 BD DD FD 190 276 222 336 254 376 BE DE FE 191 277 223 337 255 377 BF 224 340 C0 E0 193 301 225 341 DF FF April 1995, DFL, Ifi/UiO Forelesning 24.1.2001 Ark 11 av 25

Lagring av logiske verdier C har heller ingen type for å lagre logiske verdier (som boolean i Java og Simula). Her benyttes også heltall: Verdi Betydning 0 usann (= false) 0 sann (= true) Dette betyr at testen i if- ogwhile-setninger tester på 0 og 0. Det er derfor det samme om vi skriver if (a!= 0)... if (a)... De fleste synes imidlertid at det første er lettere å lese. Forelesning 24.1.2001 Ark 12 av 25

Statusverdi Hvorfor er main en int-funksjon? I mange operativsystemer (deriblant UNIX) kan et program fortelle systemet hvorledes kjøringen gikk. UNIX benytter følgende kode: Verdi Betydning 0 OK 1 255 Feil (De ulike feilverdiene kan fortelle hva slags feil det er snakk om.) Funksjonen main returnerer programmets statusverdi. Funksjonen exit Enhver funksjon kan avslutte kjøringen og angi programmets statusverdi med funksjonen exit, for eksempel exit(1); Forelesning 24.1.2001 Ark 13 av 25

Bruk av statusverdi Statusverdien som kommer fra et program kan brukes på ulike måter. I vår standard kommandotolker (bash) kan man skrive program 1 && program 2 Da blir program 2 kun utført hvis program 1 gikk bra. Likeledes kan man skrive program 1 program 2 Da blir program 2 kun utført hvis program 1 feilet (dvs returnerte status > 0). Forelesning 24.1.2001 Ark 14 av 25

Vektorer I C deklarerer man vektorer (matriser, «array-er») ved å angi antall elementer i hakeparenteser etter variabelnavnet. Simula C integer array A(1:10); int a[10]; real array B(-1:1); float b[3]; A(2) := 17; a[1] = 17; B(0) := B(-1)+B(1); b[1] = b[0]+b[2]; Java C int a[] = new int[10]; int a[10]; float b[] = new float[3]; float b[3]; a[1] = 17; a[1] = 17; b[1] = b[0]+b[2]; b[1] = b[0]+b[2]; Nedre grense er alltid 0 i C (som i Java)! Det er opp til oss som programmerere å foreta omregningen. Forelesning 24.1.2001 Ark 15 av 25

Vektorer som parametre Når en parameter er en vektor, trenger man ikke oppgi antallet elementer: void null_ut(int v[], int n) { /* Nuller ut en vektor med n elementer. */ int i = 0; while (i < n) { v[i] = 0; i = i+1; Forelesning 24.1.2001 Ark 16 av 25

Definisjonsfiler I C bruker man ofte programpakker, og da må man hente inn de nødvendige definisjoner. Dette gjøre med direktivet #include. Simula external class Xx; C #include <xx.h> Java import Xx; C #include <xx.h> (Merk at #-tegnet må stå helt til venstre på linjen! Det skal heller ikke være noe ; til slutt.) De to vanligste pakkene er stdio.h («standard I/O») definerer alt som har med lesing og skriving å gjøre. stdlib.h («standard library») definerer de vanligste C-funksjonene, for eksempel exit. Vi skal siden benytte andre pakker. I C-boken til Kernighan & Ritchie står en oversikt over de viktigste pakkene. Forelesning 24.1.2001 Ark 17 av 25

Inkrementering og dekrementering Siden det å øke eller senke en variabel med 1 er så vanlig, har C en egen notasjon for dette: ++a og a samt a++ og a. Hvis ++ eller står foran variabelen, økes variabelen før vi får dens verdi. Hvis ++ eller står etter variabelen, økes variabelen etter at vi får dens verdi. Følgende program tester det: #include <stdio.h> int main(void) { int a = 5; printf(" ++a er %d\n", ++a); printf("nå er a %d\n", a); printf(" a++ er %d\n", a++); printf("nå er a %d\n", a); return 0; Resultatet er ++a er 6 Nå er a 6 a++ er 6 Nå er a 7 Forelesning 24.1.2001 Ark 18 av 25

Andre former for oppdatering C (og Java) har også en annen variant som gjør programmene mer kompakte: a op= uttrykk gjør det samme som a=aop uttrykk Eksempler Simula A:=A+2; a+=2; A[4*X+Y] := A[4*X+Y]/2; a[4*x+y] /= 2; C Forelesning 24.1.2001 Ark 19 av 25

For-setningen C (og Java) har en annen løkke i tillegg til while-løkken: Simula for I := 1 step 1 until N do for (i=1; i<=n; ++i) Sum := Sum+I; sum += i; for I := A step -1 until B do for (i=a; i>=b; i) X(I) := X(I-1); x[i] = x[i-1]; Denne løkken er egentlig mer generell. Løkken for ( initiering ; test ; oppdatering ) kropp er en kompakt skrivemåte for initiering ; while ( test ) { kropp ; oppdatering ; Den første løkken er altså egentlig i=1; while (i <= n) { sum += i; ++i; C Forelesning 24.1.2001 Ark 20 av 25

Lesing fra fil Man må gjøre følgende når man skal lese fra fil: Deklarere fil-variabelen som FILE *. Åpne filen med funksjonen fopen med filnavn og "r" (for «read») som parametre. Hvis filen ikke finnes, returneres NULL. Lese fra filen med fscanf (som virker som scanf) eller fgetc (som leser ett og ett tegn). Lukke filen med fclose. #include <stdio.h> int main(void) { FILE *f; int a, b; f = fopen("2tall","r"); if (f == NULL) { printf("umulig å lese filen 2tall.\n"); return 1; fscanf(f, "%d%d", &a, &b); fclose(f); printf("%d + %d = %d\n", a, b, a+b); return 0; Forelesning 24.1.2001 Ark 21 av 25

Skriving til fil Skriving til fil er tilsvarende lesing fra fil. Man må gjøre følgende: Deklarere fil-variabelen som FILE *. Åpne filen med funksjonen fopen med filnavn og "w" (for «write») som parametre. Hvis filen ikke lar seg åpne, returneres NULL. Skrive til filen med fprintf (som virker som printf). Lukke filen med fclose. #include <stdio.h> int main(void) { FILE *f; int i; f = fopen("potens.tab","w"); if (f == NULL) { printf("umulig å skrive til potens.tab\n"); return 1; fprintf(f, " n n² n³\n"); for (i = 0; i <= 10; ++i) { fprintf(f, "%2d %3d %4d\n", i, i*i, i*i*i); fclose(f); return 0; Forelesning 24.1.2001 Ark 22 av 25

Dette gir følgende resultat: maskin navn> more potens.tab n n² n³ 0 0 0 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 Forelesning 24.1.2001 Ark 23 av 25

Et avsluttende eksempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *f; int nc[256], i, c; for (i = 0; i <= 255; ++i) nc[i] = 0; f = fopen("min.fil","r"); if (f == NULL) { printf("kan ikke lese min.fil!\n"); exit(1); c = fgetc(f); while (c!= EOF) { ++nc[c]; c = fgetc(f); fclose(f); for (i = 0; i <= 255; ++i) { if (nc[i] > 0) { if ((32<=i && i<=126) 161<=i) printf(" %c ", i); else printf("%3d", i); printf(":%4d\n", nc[i]); return 0; Forelesning 24.1.2001 Ark 24 av 25

Programmet på forrige ark leser en fil min.fil tegn for tegn. Så skriver det ut hvor mange forekomster det er av hvert tegn. Bruker vi det på seg selv, får vi følgende resultat: 10: 32 : 131! : 2 " : 12 # : 2 % : 3 & : 2 : 3 ( : 17 ) : 17 * : 1 + : 6, : 6. : 4 0 : 5 1 : 4 2 : 5 3 : 2 4 : 1 5 : 5 6 : 3 : : 1 ; : 18 < : 7 = : 14 > : 3 E : 2 F : 2 I : 1 K : 1 L : 3 N : 1 O : 1 U : 1 [ : 5 \ : 2 ] : 5 : 1 a : 2 b : 1 c : 16 d : 7 e : 14 f : 21 g : 2 h : 3 i : 37 k : 2 l : 9 m : 3 n : 21 o : 6 p : 5 r : 9 s : 5 t : 12 u : 3 v : 1 w : 1 x : 1 { : 5 : 2 : 5 Forelesning 24.1.2001 Ark 25 av 25