Grunnleggende programmering i C

Like dokumenter
Kapittel 1 En oversikt over C-språket

Del 1 En oversikt over C-programmering

Programmeringsspråket C

Programmeringsspråket C

Programmeringsspråket C

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Del 4 Noen spesielle C-elementer

IN 147 Program og maskinvare

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

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

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

Velkommen til INF1060. Introduksjon til operativsystemer og datakommunikasjon

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

IN 147 Program og maskinvare

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Anbefalt litteratur: Pensum-bøker: Forelesere: Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

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

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

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

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

Repetisjon fra sist - 1: Plan for dagen. Repetisjon fra sist 2: Hva jeg glemte sist: Nyttige Kommandoer

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

IN 147 Program og maskinvare

Cs preprosessor. Dagens tema. Betinget kompilering

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

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

INF1000 : Forelesning 1 (del 2)

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

IN 147 Program og maskinvare. Velkommen til IN 147. Program- og maskinvare

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

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

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

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

IN 147 Program og maskinvare

Programmering i C++ Administrativ info. Litteratur. Forelesning 1 Innføring i det grunnleggende. Forelesninger: Eksamen. Pensum:

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

INF1000 (Uke 4) Mer om forgreninger, While-løkker

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

GJØVIK INGENIØRHØGSKOLE

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Programmeringsspråket C Del 2. Michael Welzl

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

INF1000 : Forelesning 3

Programmeringsspråket C Del 3

Lynkurs i shellprogrammering under Linux

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

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

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

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Betinget eksekvering og logiske tester i shell

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Læringsmål og pensum. Oversikt

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

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

Del 3. Pekere RR 2016

Øvingsforelesning 5 Python (TDT4110)

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

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

UNIVERSITETET I OSLO

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Øvingsforelesning 5 Python (TDT4110)

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

Programmering Høst 2017

Vektorer. Dagens tema. Deklarasjon. Bruk

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre,

156C. Algoritmer og maskinspråk. IT1101 Informatikk basisfag. Maskinspråk: det maskinen forstår. Assembler / assemblerspråk

Hvordan en prosessor arbeider, del 1

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

Eksempel: Body Mass Index (BMI)

IN 147 Program og maskinvare. Dagens tema

Del 2 Tabeller, arrays, strenger

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

Dagens tema: Datastrukturer

C# (.Net) Tema: Loops (Løkker) Leksjon 7 Kap 18

JAVA CHRISTOFFER MARTINSEN

Transkript:

Grunnleggende programmering i C

Hvorfor lære enda et nytt programmeringsspråk? C brukes mye, til å programmere alt: Hele operativsystemer, f.eks. Linux Regneark og tekstbehandlere Tungregneprogrammer for f.eks. værvarsling Ekspertsystemer for beslutningsstøtte C-kompilatorer finnes for alle maskiner og OS

Hvorfor er C så populært? Standard C-programmer er 100% portable Godt utvalg av programvarebibliotek Elegant og presis syntaks Lett tilgang til maskinvaren når det er nødvendig C-kompilatorer lager svært rask og effektiv kode: Mye raskere enn Java bytecode Nesten like effektivt som å kode på lavnivå

Mellomnivå programmeringsspråk Java er et høynivåspråk: Har ferdige API for alt Stor avstand til hardware, koder for virtuell maskin Lavnivåspråk / assemblere: Gir bare direkte tilgang til maskinens instruksjonssett C er på mellomnivå: Inneholder ikke like mye ferdig kode som høynivå Men har alle byggestenene som trengs for å lage alt Og gir i tillegg mulighet for lavnivå tilgang til maskinen

Ulemper(?) ved C Kortfattet syntaks, laget av eksperter, for eksperter For å skrive effektiv kode kreves (litt) kjennskap til hvordan OS og maskinvare egentlig fungerer Ikke objektorientert, tilbyr ikke klasser (C++) Lett å lage bugs som kan være vanskelige å finne Lite egnet (?) som første programmeringsspråk

1969/70: Første versjon av UNIX, Ken Thompson, AT&T Bell Labs Thompson laget også et nytt portabelt språk, B, for UNIX B er inspirert av språket BCPL (Cambridge, 1966) 1972: 1973: Thompson og Ritchie skriver UNIX i C, første portable OS 1978: Dennis Ritchie, Bell Labs, lager C, bygger direkte på B The C Programming Language av Kernighan & Ritchie 1988: ANSI C (American National Standards Institute)

Tegnsettet i C C-kode kan skrives bare med disse tegnene: A Z a z 0 9 space., : ; ' $ " # % &! _ {} [] () < > +-/*=

Nøkkelordene i C ANSI C har bare 32 reserverte nøkkelord: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Merk at det ikke er egne nøkkelord for I/O Mange operasjoner som f.eks. I/O ligger i egne bibliotek som inkluderes i koden og linkes sammen med kompilert kode til kjørbart program

Strukturen i et C-program pre processor directives global declarations main() { local variables; statements; } f1() { local variables; statements; } f2() { local variables; statements; } f3() { local variables; statements; } etc...

Paranteser og semikolon {} brukes til å markere start og slutt på blokker med setninger som hører sammen, f.eks. koden som hører til en funksjon () brukes bl.a. til parameterlisten for en funksjon C har fritt format setninger avsluttes med ; Vanlig begynnerfeil å glemme semikolon Manglende semikolon vil kunne gi kryptiske feilmeldinger ved kompilering, knyttet til linjer langt unna der det mangler semikolon

Preprosessor-direktiver cpp The C Preprocessor cpp gjør automatisk en preprosessering av programkoden før selve kompileringen utføres cpp utfører direktiver i programkoden Vanligste direktiver er include og define Alle direktiver må starte med # først på en egen linje i programkoden, avsluttes ikke med ;

Inkludering av headerfiler #include <filnavn.h> #include "filnavn.h" En headerfil inneholder beskrivelse av funksjoner, typisk fra standardbibiliotek, i form av prototyper: Hvilke parametre funksjonen har Hvilken type funksjonen returnerer Gir kompilatoren nok informasjon til å kunne kompilere programmet som bruker funksjonene Ferdig kompilert kode for funksjoner fra bibliotekene linkes oftest inn i programmet etter kompilering

Hello World! #include <stdio.h> main() { printf("hello World!\n"); }

Enkel kompilering og kjøring i Linux cc C-kompilatoren (oftest en link til gcc ) cc hello.c Produserer en eksekverbar fil a.out, som kan kjøres med:./a.out For å angi navnet på eksekverbart program: cc o hello hello.c./hello

Kommentarer i C-programmer #include <stdio.h> /* Her begynner hovedprogrammet */ main() { /* Kommentarer kan ligge overalt */ printf("hello World!\n"); /* Og de kan gå over flere linjer */ }

Datatyper i C Grunnleggende datatyper : int Heltall long Dobbel lengde heltall float Flyttall ( kommatall ) double Dobbel-presisjon flyttall char Ett enkelt tegn (eg. en enkel byte) void Spesialtype som er tom /uten verdi Størrelsen avhenger av maskin og kompilator (!) sizeof kan benyttes til å finne datatypens størrelse

Størrelsen på datatyper #include <stdio.h> main() { printf("int %ld\n", printf("long %ld\n", printf("float %ld\n", printf("double %ld\n", printf("char %ld\n", printf("void %ld\n", } sizeof(int)); sizeof(long)); sizeof(float)); sizeof(double)); sizeof(char)); sizeof(void));

Boolske data C har ingen egen datatype for true / false Variable av typen int brukes til å representere bolske verdier. I C tolkes heltallsverdien 0 (null) som false og alle andre heltallsverdier som true Kan gi opphav til bugs som er vanskelige å finne, må være nøye med logiske tester

Deklarasjon av variable Alle variable må deklareres før de brukes Alle deklarasjoner skal ligge først i en funksjon Variabelnavn kan bestå av opp til 31 tegn Lovlige tegn er bokstaver, tall og _ (underscore) Må starte med en bokstav eller underscore

Initialisering av variable Variable initialiseres ikke automatisk! Kompilatoren gir ingen feilmelding eller advarsel hvis variabel brukes før initialisering En ny variabel får bare verdien som ligger på den plassen i minnet som reserveres for den Det er derfor god programmeringskikk i C å initialisere alle variable når de deklareres Eksempel: deklarasjoner.c

Tilordning Enkelt likhetstegn brukes for å gi en variabel verdi: A = 10; B = 4 * A; Merk at = ikke skal brukes i logiske tester: For å sammenligne to verdier brukes == Men kompilatoren godtar også at det brukes = Svært vanlig årsak til bugs i C!

Tallregning / aritmetikk Aritmetiske operatorer i C: + * / % ++ Vanlige presedensregler gjelder, paranteser kan brukes til å gruppere deler av regneuttrykk Ved tilordning av flyttallsverdi til heltall, fjernes bare desimalene (!) Ved beregning av flyttallsuttrykk konverteres først heltall til flyttall Eksempel: aritmetikk.c

Utskrift Funksjonen printf skriver til standard utenhet Kan ta en eller flere parametere, prototypen er: int printf ( char * streng, ); Første parameter er alltid strengen som skrives ut Strengen kan i tillegg til tegnene som skal skrives ut, inneholde formatkoder Strengen etterfølges av null eller flere parametere med verdier som skrives ut som del av strengen Enkle eksempler: ut_1.c ut_2.c

% formatkoder til printf Formatkoder som begynner med tegnet % refererer til listen med verdier etter strengen Første % brukes for første verdi i listen, andre % for andre verdi, etc. Specifier: En bokstav etter % som forteller printf hvordan verdien skal konverteres til tegn som skal skrives ut

Vanlig brukte % specifiers %c single character %d signed integer %e float or double exponential format %f float or double signed decimal %s string / sequence of characters Feil formatkode for en datatype kan gi merkelige resultater: feil_formatkode.c

Formatering av utskrift Utskrift formateres med en modifier som skrives mellom % og specifier Modifier har tre deler, alle kan utelates: fw.p w width total bredde på feltet p precision antall siffer etter komma / antall tegn f flag et tegn som justerer plassering: ventrejustér feltet + skriv alltid ut fortegn på tall space skriv ut en space hvis det ikke er fortegn 0 legg inn nuller foran tall for å fylle feltet

Kontrollkoder i utskrift Legges inn i første streng-parameter til printf Skriver ut et spesial- eller kontrolltegn Vanlig brukte kontrollkoder: \n linjeskift \t horisontal tabulator \' single quote \" double quote \\ backslash Eksempel, formatering og koder: format_ctrl.c

Innlesing av data Funksjonen scanf leser fra standard innenhet Har lignende parametere som printf, prototype: int scanf ( char * streng, ); Første parameter beskriver en streng med data som skal leses inn, med formateringskoder Strengen etterfølges av null eller flere parametere som er adressene i primærhukommelsen til variablene som skal lagre de innleste dataene

Bruk av scanf Eksempel: scanf("%d %f", &i, &f); Første parameter angir at det skal leses inn et heltall og et flyttall, skilt med space formatkodene er stort sett de samme som for printf Operatoren '&' i C returnerer adressen til en variabel i minnet alle funksjoner som skal endre innholdet i en variabel må ha variabeladressen som parameter Eksempel: scanf_test.c

Kontrollstrukturer i C vs. Java Syntaksen for seleksjon og iterasjon i C er svært lik den som brukes i Java: Seleksjon i C: if Iterasjon i C: To tydelige forskjeller: if else while switch do while for Kan ikke deklarere løkkevariabel lokalt i toppen av for løkker i C Logiske tester håndteres ulikt i C og Java

Logiske tester i C Sammenligning av verdier: == < > <= >= Logiske operatorer: &&!=! () Syntaks, enkel if - test: if ((a == b) &&!(c < d)) { setninger; } Eksempel: les_tall.c

Håndtering av true og false Heltallsverdier brukes for boolske verdier i C Et logisk uttrykk antar verdien 0 (null) hvis det er false og en verdi ikke lik 0 hvis det er true Kan også teste direkte på verdien av variable eller regneuttrykk: int a; scanf("%d", &a); if (a) printf("a er ikke lik null\n");

Den store bug-generatoren Man mener å skrive: if (a == 10.0) Men skriver i stedet: if (a = 10.0) Dette er lovlig i C, testen er true fordi a 0! For å unngå dette, er det vanlig i stedet å skrive: if (10.0 == a)

De tre løkketypene i C while (condition) { statement(s); } do { statement(s); } while ( condition ); for ( init; condition; increment ) { statement(s); }

break og continue i løkker break Avslutter den innerste løkken der break setningen forekommer Eksekvering fortsetter med første setning etter løkken continue Avslutter nåværende gjennomløp av løkken Eksekvering fortsetter med løkketesten før et evt. nytt gjennomløp Eksempel: break_cont.c

Eksempel med if - tester og løkker Bruker skal gjette et tall mellom 1 og 100 Bruker tilfeldige tall til å lage riktig svar For hver gang bruker gjetter feil tall, gis det informasjon om tallet er for høyt eller for lavt To løkker inne i hverandre: Et helt spill i hver iterasjon av ytre løkke Indre løkke går inntil bruker har gjettet riktig Kode: guess_number.c

switch setningen switch(expression) { case constant1: statement(s); break; case constant2: statement(s); break; case constant3: statement(s); break;... default: statement(s); break; } Mer kompakt skrivemåte for flergrenet if -test Tester oftest innholdet av en variabel mot en heltalls- eller tegnkonstant Passer for tilfeller der det skal velges én verdi fra en liste med mange verdier Eksempel: kalkulator.c

Litt nerdemoro: Obfuscated C-code Obfuscated code er programkode som bevisst er skrevet slik at den skal være vanskelig å forstå Gjøres bl.a. for å skjule hva et program egentlig gjør, eller for å forhindre reverse engineering C egner seg spesielt godt til obfuscation pga. lavnivåtilgangen til minnet Ekstremt eksempel *: The Twelve Days of Christmas *: Vinner av International Obfuscated C Code Contest i 1988