Programmeringsteknik för ingenjörer. Programmeringsteknik för ingenjörer 1

Relevanta dokument
Heltal(int) Programmeringsteknik 54

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

TDIU01 - Programmering i C++, grundkurs

Repetition C-programmering

Introduktion C-programmering

Enkla datatyper minne

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programmeringsteknik med C och Matlab

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

översiktskurs (5DV031)

Programmering A. Johan Eliasson

F4. programmeringsteknik och Matlab

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Lathund. Pacific C för MS-DOS

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Lathund. C för inbyggda system

TDIU01 - Programmering i C++, grundkurs

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Loopar och datatyper. Föreläsning 3

Loopar och datatyper. Föreläsning 3

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

C-programmering, föreläsning 1 Jesper Wilhelmsson

Föreläsning 1 & 2 INTRODUKTION

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Programmering i C, 7,5 hp

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Data, typ, selektion, iteration

C-programmering. Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Parameteröverföring. Exempel. Exempel. Metodkropp

Lathund. C för inbyggda system

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

SMD 134 Objektorienterad programmering

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

En kort text om programmering i C.

GPT- föreläsning 10. För en vecka sedan Problemlösning på lägre nivå kan sortera funktioner Förra gången

TDDC77 Objektorienterad Programmering

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

DD1314 Programmeringsteknik

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Variabler och konstanter

Programmering för språkteknologer I, VT2012. Rum

Planering Programmering grundkurs HI1024 HT 2014

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Variabler använder man sig av för att under programkörningen spara data eller information i primärminnet. En variabel har typ, namn och värde.

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Föreläsning 7. Nyckelord I Java. Uttryck. Uttryck, Operatorer Och Kontrollflöden

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Tentamen i Programmering grundkurs och Programmering C

Objektorienterad programmering Föreläsning 4

Användarhandledning Version 1.2

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Språket Python - Del 1 Grundkurs i programmering med Python

Övning från förra gången: readword

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Uttryck och villkor. Föreläsning 2

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Föreläsning 1 & 2 INTRODUKTION

Objektorienterad Programmering (TDDC77)

Uttryck och villkor. Föreläsning 2

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Värmedistribution i plåt

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Några småsaker. switch break, continue, goto Kommentarer

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar.

C++-programmets beståndsdelar

6.1 Kompilering och lite grundläggande information

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Visual Basic, en snabbgenomgång

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

C++ - En introduktion

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Imperativ programmering. Föreläsning 2

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsning 8: Aritmetik och stora heltal

Transkript:

Programmeringsteknik för ingenjörer Programmeringsteknik för ingenjörer 1

Johan Eliasson (föreläsare,grupptimmar) Rum: D415, johane@cs.umu.se Fredrik Dahlin (gruppövningar, handledning) dahlin@cs.umu.se Anna Öhlund (gruppövning, handledning), Rum: D420 loreli@cs.umu.se Kursens hemsida http://www.cs.umu.se/kurser/tdba39/ht01/di/ Programmeringsteknik för ingenjörer 2

MIT plan 4 Programmeringsteknik för ingenjörer 3

Mål Kursens mål är: Att orientera om användning av datorn i naturvetenskapliga och tekniska tillämpningar. Att ge kännedom om ett datorsystems uppbyggnad och funktion. Att ge kunskaper och färdigheter i programkonstruktion och organisation av programsystem. Att orientera om datastrukturer och algoritmer Programmeringsteknik för ingenjörer 4

Kursinnehåll Problemlösning: Programmering som problemlösning. Problemspecifikation. Grundläggande byggstenar (sekvens, val, iteration), abstraktion, funktioner, algoritmer, iteration, rekursion. Programmering i C: Styrstrukturer, funktioner, parameter överföring, enkla och strukturerade datatyper, filhantering. Programmeringsmetodik och programutveckling: Strukturering av program och data, stegvis förfining, modularisering, abstraktionsnivåer, testning, avlusning och dokumentation, programmeringsstil och programkvalitet Programmeringsteknik för ingenjörer 5

Kursinnehåll Undervisningsformer Föreläsningar, gruppövningar (i datorsal och lektionssal), datorintroduktion. Examination Teoridel(3p): Skriftlig tentamen Laborationsdel (2p): Fyra obligatoriska datorlaborationer. Kurslitteratur Kelley, A.L., Pohl, I.: A Book on C 4th edition, Addison-Wesley, 1998. ISBN 0-201-18399-4. Programmeringsteknik för ingenjörer 6

Datorintroduktion Datorintroduktion Datoranvändning och systemkännedom: Användning av kompilatorer, editorer och andra programutvecklingsmedel, e-post & diverse annat som kan vara nyttigt att känna till. Grupp 2.1 Tisdag17/1 8.15-10.00 Grupp 2.2 Tisdag17/1 10.15-12.00 Grupp 1.1 Torsdag 31/1 8.15-10.00 Grupp 1.2 Torsdag 31/1 10.15-12.00 Programmeringsteknik för ingenjörer 7

Laborationer Fyra laborationer: Stryktips Söka nollställe för en ekvation Bildbehandling Maze De tre första ska lösas enskilt! Maze labben får lösas i grupper bestående av max 2 st studenter! Frågor om laborationerna besvaras av handledarna. Första laborationen ska vara inlämnad på onsdag 19/9! Sista datum för att få labbarna godkända (7/11) Annars blir det uppsamlingslabbar vid terminsstart. Programmeringsteknik för ingenjörer 8

Historisk översikt Ken Thompson från Bell Labs designade programmerings-språket B 1970 för det första UNIX-systemet. En utökning gjordes av Dennis Ritchie och fick namnet C. C var ursprungligen ett högnivå assemblerspråk och många konstruktioner i språket reflekterar därför tidiga maskininstruktioner. Programmeraren måste lägga stor vikt vid minnesallokering och design av datastrukturer. Programmeringsteknik för ingenjörer 9

Varför C? Fördelar Litet språk Används i UNIX (Linux) Portabelt (någorlunda) Elegant Modulärt Bas för C++ och Java Effektivt Nackdelar Komplicerad syntax Hanterar vektorer dåligt Flera olika användningsområden av symboler som * och =. Programmeringsteknik för ingenjörer 10

ANSI C ANSI ( American National Standards Institute ) En standard för C skapades 1988. Specificerar hur program kan se ut och hur de ska tolkas. Syftet är att förbättra portabilitet, stabilitet, underhållbarhet och effektiv exekvering av C- program på olika slags datorer. Nästan alla kompilatorer följer numera ANSI C standarden Programmeringsteknik för ingenjörer 11

Algoritm En algoritm är en noggrann plan, en metod för att stegvis göra något som har följande kännetecken Ändlighet Algoritmen måste kunna garanteras bli färdig efter ett ändligt antal steg (d.v.s. terminera) Bestämdhet Varje steg i algoritmen måste vara entydigt och precist definierat Indata En algoritm har noll eller flera indata, dvs värden som man ger den innan algoritmen startar. Programmeringsteknik för ingenjörer 12

Algoritm Utdata En algoritm har ett eller flera utdata, dvs värden som beräknas av algoritmen och som har bestämda relationer till indata Effektivitet Varje steg i algoritmen måste vara så elementärt att det i princip kan utföras exakt, och inom en ändlig tidsrymd, av en människa som arbetar med papper och penna Programmeringsteknik för ingenjörer 13

Makaronkokning Slå på plattan på 6:an. Om ingen kastrull är ren Rengör kastrullen. Fyll kastrull med vatten, salta och ställ den på plattan. Medan vattnet inte kokar Se på TV. Lägg i makaronerna och skruva ned plattan till 4:an. Upprepa Se på TV några minuter. Smaka makaron tills makaronen känns färdig. Häll av vattnet. Programmeringsteknik för ingenjörer 14

Algoritmer Satser utförs sekventiellt, en rad i taget. Raderna numreras och indenteras Exempel: 1. Läs in tal 1 2. Läs in tal 2 3. Beräkna tal 1 + tal 2 4. Skriv ut summan Programmeringsteknik för ingenjörer 15

Val och villkor Ett val definierar två möjliga vägar för algoritmen att ta beroende på ett villkor. Ett villkor är ett uttryck som kan besvaras med sant eller falskt. 1. Läs in tal 1 2. Läs in tal 2 3. Om tal 2 0 3.1 Beräkna tal 1 / tal 2. 3.2 Skriv ut kvoten 4. Annars 4.1 Skriv ut felmeddelande. 4.2 Avsluta Programmeringsteknik för ingenjörer 16

Upprepning Vid upprepning, upprepas en eller flera satser alltmedan ett villkor är uppfyllt. 1. läs in tal 1 2. läs in tal 2 3. så länge som tal 2 = 0 3.1 skriv ut Tal 2 får inte vara 0 3.2 läs in tal 2 4. beräkna tal 1 / tal 2 5. skriv ut kvoten Programmeringsteknik för ingenjörer 17

Från källkod till program Källkod är en textrepresentation av ett program som kan läsas av en människa. Ett speciellt program, kompilatorn, översätter källkoden till maskinkod som datorn kan läsa och förstå. Programmeringsteknik för ingenjörer 18

Kompilatorn Kompilatorn består egentligen av tre program: Preprocessorn Bearbetar källkodsfilen innan kompileringen. Kompilatorn Översätter källkodsfiler till maskinkod i s.k. objektfiler. Länkaren Sätter ihop flera objektfiler till ett färdigt program. Programmeringsteknik för ingenjörer 19

Utskrift till skärm Ett program behöver ibland kommunicera med användaren. Kommandot (funktionen) printf skriver text på skärmen. För att kunna använda printf så måste man inkludera stdio.h i sitt program. Den filen innehåller nödvändiga definitioner till kompilatorn. Programmeringsteknik för ingenjörer 20

Första programmet #include <stdio.h> int main(void) { /* Skriver ut "Hello world!" på skärmen*/ printf("hello world!\n"); } Förklaring #include <stdio.h> Preprocessordirektiv. Preprocessorn uppmanas att inkludera innehållet i stdio.h som innehåller bl.a. definitionen av printf. int main(void) { } Deklaration av huvudfunktionen. Allt mellan { och } kommer att utföras när programmet körs. /*... */ Allt mellan /* och */ kallas kommentarer. Dessa tas bort av preprocessorn innan koden kompileras. printf(); Skriver ut strängen Hello world! till skärmen. \n innebär att vi även gör en radbrytning. Varje sats avslutas med ;. Programmeringsteknik för ingenjörer 21

Källkodsfiler Källkodsfiler består av: Preprocessordirektiv (#define, #include) preprocessorn. Deklarationer av variabler, funktioner och datatyper. Det finns ingen krav på i vilken ordning olika deklarationer ska ske, förutom att: Generellt ska en deklaration av en variabel, funktion eller datatyp ske före användning Varje program måste ha precis en deklaration av funktionen main() som utgör startpunkten i ett program. Programmeringsteknik för ingenjörer 22

C Fri syntax där mellanslag och nyradstecken inte är viktiga. C är case-sensitive, dvs gemener och versaler spelar roll. Programmeringsteknik för ingenjörer 23

Variabler En variabel är ett namngivet utrymme i datorns minne som används för att lagra data. Som man kan gissa av namnet, kan innehållet variera, d.v.s. värdet kan ändras medan programmet körs. Användandet av variabler är en fundamental del av programmering. Utan variabler skulle alla program vara statiska (oföränderliga). En variabel är av en viss datatyp. heltal (int) decimaltal (float, double) tecken (char) Innan man kan använda en variabel måste man deklarera variabeln och därmed ange vilken datatyp variabeln ska ha. Programmeringsteknik för ingenjörer 24

Inläsning från tangentbord För att läsa från tangentbordet används scanf. Fungerar liknande som printf. #include <stdio.h> int main(void) { int x; /* Uppmanar användaren att skriva ett tal */ printf("skriv ett tal: "); /* läser in ett tal som användaren skriver */ scanf("%d",&x); /* Skriver ut talet i kvadrat */ printf("talet i kvadrat är: %d\n ", x*x); return 0; } Programmeringsteknik för ingenjörer 25

Styrmekanismer Beroende på vilka omständigheter programmet befinner sig i (t.ex. variabelvärden) så kan ett program välja olika programkod att exekvera (köra). En grundläggande styrmekanismen heter if. Om ett uttryck är sant kommer delen som hör ihop med if-satsen att exekveras. En valfri del av if-satsen är else-satsen. Om uttrycket i if-satsen är falsk så kommer else-satsen att utföras. Exempel: if (a == b) { printf("a och b är lika.\n"); } else { printf("a och b är olika.\n"); } Programmeringsteknik för ingenjörer 26

Loopar Om man vill upprepa vissa satser finns tre olika metoder man kan använda. int x = 5; /* deklaration och initiering */ while-satser while (x > 0) { x = x - 1; } do-while-satser do { x = x - 1; } while (x > 0) for-satser for (x=1; x<5; x++) { printf("x= %d\n", x); } Programmeringsteknik för ingenjörer 27

Funktioner Om man har en uppgift som ska utföras på flera ställen i programmet, kan man ofta skriva detta som en funktion. (Varför återuppfinna hjulet flera gånger?) Man kan tänka sig en funktion som ett byggblock i programmet. Vi har redan sett exempel på en funktion, nämligen main-funktionen. Ett program måste minst bestå av en funktion (main). Andra funktioner anropas från main och från varandra. En funktion måste precis som en variabel deklareras innan den kan användas. Programmeringsteknik för ingenjörer 28

Exempel #include <stdio.h> /* Deklaration av funktionen square */ float square(float f) { return f*f; /* Returnerar f i kvadrat */ } int main(void) { float a = 4; /* Deklarerar och Initierar a */ float b; /* Deklarerar b */ /* Anropar funktionen square */ b = square(a); /* Skriver ut värdet på a och b */ printf("a=%f b=%f\n"); return 0; } Programmeringsteknik för ingenjörer 29

Språket C Eftersom C är ett språk, har det ett alfabet och regler för hur bokstäverna kan bilda ord och hur olika strukturella enheter skiljs åt. Detta kallas språkets syntax. Kompilatorn kollar att syntaxen i programmet är korrekt. För en människa är en C-källkod en tvådimensionell struktur, men för en kompilator är det en följd av bokstäver som övers ätts till objektkod, som i sin tur blir översatt till maskinkod för den aktuella maskinen. Efter att preprocessorn är klar, samlas bokstäverna i programmet till tokens. Programmeringsteknik för ingenjörer 30

Tokens I ANSI C, som är standarden för hur C-program får se ut, finns det sex olika typer av tokens. Dessa är nyckelord, identifierare, konstanter, sträng konstanter, operatorer och avslutare. Kompilatorn ser till att de olika tokens formar en korrekt sträng enligt språkets syntax. Kompilator kräver att texten är helt korrekt syntaxiskt. Programmeringsteknik för ingenjörer 31

Kommentarer För att underlätta att läsa ett program och för att kunna lägga in små förklaringar varför man gör som man gör, finns det i C möjlighet att lägga in kommentarer. En kommentar börjar med /* och slutar med */. Allt däremellan ignoreras av kompilatorn då preprocessorn plockar bort kommentarerna. /* a comment */ /* another comment */ /*********/ /* * yet another comment */ Programmeringsteknik för ingenjörer 32

Kommentarer om kommentarer Kommentarer är mycket viktiga och ska inte lämnas som ett sista steg! Kommentarer ska skrivas samtidigt som resten av programmet. Det lätt att strunta i att kommentera eller att de blir väldigt kortfattade. Kommentarerna ska indikera strukturen på ett program och bidra till ett programs korrekthet. Programmeringsteknik för ingenjörer 33

Identifierare Identifierare används till namn på bl.a. variabler och funktioner. En identifierare består av en sekvens av bokstäver, siffror och/eller det speciella tecknet _(eng. underscore). Identifierare får inte inledas med siffror. Exempel på identifierare: a, id och identifier_2. Dessa är inte identifierare: not#me, 101_south eller -plus. C skiljer mellan små och stora bokstäver, d.v.s. temp är inte samma variabel som Temp eller temp o.s.v. Programmeringsteknik för ingenjörer 34

Exempel int variable_1; int variable_2; void print_function(int v) { printf("v has value: %d", v); } Programmeringsteknik för ingenjörer 35

Nyckelord Vissa ord är reserverade och kan inte användas som t.ex. variabelnamn auto do goto signed unsigned break double if sizeof void case else int static volatile char enum struct long while const extern register switch typedef default short for union Programmeringsteknik för ingenjörer 36

Konstanter Det finns olika typer av konstanter i C: heltalskonstanter som t.ex. 0 och 17 flyttalskonstanter som t.ex. 1.0 och 3.14159. teckenkonstanter som t.ex. a, b eller + Vissa teckenkonstanter som \n (newline) har en speciell mening. Trots att de skrivs med två tecken (\ och n) så representerar de ett enda tecken i C. Programmeringsteknik för ingenjörer 37

Konstanter Exempel på heltalskonstanter är 0, 77 och 1234567890. 017 är inte samma sak som 17, därför att heltal som börjar med 0 tolkas som skrivna med basen 8, d.v.s. oktala. Man kan också ange tal i hexadecimal form (bas 16), t.ex. Ox10 (16) eller Ox1A (26 = 16+10). Negativa tal (t.ex. -33) räknas också som konstanta uttryck. Programmeringsteknik för ingenjörer 38

Strängkonstanter En sekvens tecken omslutna av citationstecken (") räknas som en strängkonstant. Senare kommer vi att se att strängar lagras som en endimensionell vektor med tecken. Strängar med en bokstav är inte samma sak som tecken, d.v.s. "a" (sträng) är inte samma sak som a (tecken). Om man vill ha med " eller \ i en sträng så måste den förekommas av en \, d.v.s. de skrivs \" respektive \\. Exempel på strängar är "text", "" (tomma strängen), "/* not a comment */" och "\"hej\"". Däremot är t.ex. /* "text" */ inte en sträng. Programmeringsteknik för ingenjörer 39

Operatorer De aritmetiska operatorerna är + (addition), - (subtraktion), * (multiplikation), / (division), % (modulus). Normalt så skriver man a + b (mellanslag för att öka läsligheten) men det är tillåtet att skriva a+b. Vissa symboler har olika betydelse i olika sammanhang. T.ex. så har % olika betydelser i printf("%d", a); och i a = b % 7;. Parenteser, krullparenteser, komman och semikolon fungerar som avdelare. Parenteser kan bestämma prioriteten vid beräkningar. Programmeringsteknik för ingenjörer 40

Prioritet och associativitet Det finns regler för vilken prioritet (ordning operatorerna utförs) och associativitet (om man kollar på vänster eller höger sida om operatorn först) olika operatorer har. Eftersom uttryck inom parenteser utvärderas först kan parenteser användas för att ändra eller klargöra i vilken ordning operationer utförs. 3 * 2 + 5 (3 * 2) + 5 3 * (2 + 5) 1 * 2-3 * 5 (1 * 2) - (3 * 5) 1 * (2-3) * 5 Programmeringsteknik för ingenjörer 41

Prioritet och associativitet Operatorer Associativitet () ++ (postfix) -- (postfix) vänster till höger + (unary) - (unary) ++ (prefix) -- (prefix) höger till vänster * / % vänster till höger + - vänster till höger = += -= *0 /= höger till vänster Programmeringsteknik för ingenjörer 42

Öka/minska-operatorer Vissa operationer är så vanliga att speciella operatorer har skapats. Dessa operatorer är ofta implementerade som endast en maskininstruktion väldigt snabba. ++ operatorn ökar värdet på en variabel med 1 och -- operatorn minskar värdet med 1. Båda operatorerna kan användas som postfix eller prefix operatorer. Om du använder postfix (a++), så ökas värdet först efter satsen är utförd, medan prefix (++a) ökar värdet innan satsen är utförd. Programmeringsteknik för ingenjörer 43

Exempel Programmet #include<stdio.h> int main(void) { int a = 4; int b = 4; printf("a = %d b = %d", a++, ++b); printf("a = %d b = %d", a, b); return 0; } ger utskriften a = 4 b = 5 a = 5 b = 5 Programmeringsteknik för ingenjörer 44

Tilldelning Tilldelning är också en operator i C. = har låg prioritet och är höger-vänster associativ. b = 3; c = 2; a = b + c; a = (b = (c = 0)); a = b = c = 0; a = (b = 3) + (c = 2); k = k + 2; Observera att tilldelning inte är samma sak som lika med (==). Programmeringsteknik för ingenjörer 45

Tilldelnings-operatorer Det finns också kombinationer av tilldelning och beräkningsoperatorer. = += -= *= /= Om int i = 1; int j = 2; int k = 3; Uttryck Ekvivalent Ekvivalent Värde i+=j+k i+=(j+k) i=(i+(j+k)) 6 i*=j-k+5 i*=(j-k+5) i=(i*(j-k+5)) 4 Programmeringsteknik för ingenjörer 46

Block Block finns mellan två krullparenteser { och }. Ett block består av eventuella deklarationer och satser. Ett block kan vara tomt. Block kan vara nästlade. { int a = 3; { printf("a = %d\n", a); } { } } Programmeringsteknik för ingenjörer 47

Variabeldeklarationer Variabler och konstanter måste vara deklarerade före de används. Deklarationer måste göras först inom varje block. Början på ett program kan se ut såhär #include <stdio.h> int main(void) { int a, b; /* deklaration */ float c = 1.3; /* deklaration och initiering */ printf("%f\n", c); /* funktionsanrop */ a = b + c; /* tilldelning */ return 0; } Programmeringsteknik för ingenjörer 48

Variabler Genom att varje variabel har en datatyp så vet kompilatorn hur mycket minne som ska reserveras för att lagra variabelns värde. Vissa operationer, t.ex. addition, kommer att utföras på olika sätt beroende på de variabler som är inblandade. (För datorn så är det är stor skillnad på att addera två heltal och att addera två flyttal). Programmeringsteknik för ingenjörer 49

Uttryck Ett uttryck är en giltig kombination av konstanter, variabler, operationer och funktionsanrop. En konstant, variabel eller funktionsanrop kan ensam också anses vara ett uttryck. Exempel på uttryck: a + b sqrt(7.534) 5.0 * x + tan(1.43 / x) Programmeringsteknik för ingenjörer 50

Uttryck/satser Nedanstående uttryck är ett exempel på ett tilldelningsuttryck i = 7 Hela uttrycket har värdet 7. När ett uttryck följs av ett semikolon kallas det för en sats. i = 7; printf("värdet på i är: %d", i); Följande satser är också semantiskt korrekt men gör ingen nytta. a + b; 1.344; Programmeringsteknik för ingenjörer 51

Tilldelningar Tilldelningsuttryck följt av ett semikolon bildar en tilldelningssats med följande generella form. variable = expression; Först beräknas uttrycket till höger, expr, vars värde därefter tilldelas variable. Detta värde blir också hela satsens värde. Tilldelningsuttryck kan likna matematiska ekvationer, men de båda begreppen är helt olika. Ekvationen x+2=x blir inte ett tilldelningsuttryck genom att skriva x + 2 = x. Vi kan inte ha ett uttryck till vänster om en variabel. Uttryck kan inte tilldelas ett värde. Programmeringsteknik för ingenjörer 52

Datatyper C har flera inbyggda datatyper: char signed char unsigned char int short long unsigned unsigned short unsigned long float double long double Viktigt att vara medveten om respektive typs begränsningar. Generellt sker deklarationer av variabler enligt type identifier {, identifier } 0+ float price, tax; int no_items; Programmeringsteknik för ingenjörer 53

Heltal(int) Datatypen int används tillsammans med char, short int och long int för att lagra heltal i C. Matematisk sett finns det oändligt många heltal. På en dator måste det införas en begränsning på hur stora heltalen kan bli. Normalt sparas ett heltal i ett maskin-ord, oftast 4 byte (4 * 8 = 32 bitar). I limits.h så finns definitioner på hur stora värden man kan lagra i int. Programmeringsteknik för ingenjörer 54

Heltal forts. Om int lagras som 4 bytes, betyder det att den kan anta 2 32 olika värden. Hälften av värdena används för att lagra negativa heltal och hälften för att lagra positiva heltal. Om i är en variabel av typen int, kan i anta heltalsvärden inom intervallet [-2 31,2 31-1]. Eftersom variabler har begränsad lagringskapacitet kan man drabbas av overflow, t.ex. om man försöker multiplicera två variabler vars produkt blir större än det maximala värdet som en variabel kan lagra. Programmeringsteknik för ingenjörer 55

Övriga heltalstyper short lagras oftast med 2 byte (vanligen mindre intervall än int). long lagras oftast med 4 eller 8 byte. (vanligen större intervall än int). unsigned framför en heltalstyp (ex. unsigned int) innebär att enbart positiva tal kan lagras. Detta innebär också att intervallet för tal (positiva) som kan lagras fördubblas. Programmeringsteknik för ingenjörer 56

Heltalsexempel void main(void) { int i; unsigned shot us; long l; i = 4; us = -1 /* VARNING!! Ger konstigt resultat. */ l = 3067825167823; } Programmeringsteknik för ingenjörer 57

Tecken Tecken lagras i C som tal, där varje tecken motsvaras av ett heltal. Normal använder man char för lagra tecken men i C kan tecken representeras av variabler av vilken heltalstyp som helst. ASCII är en standard för vilka tecken som motsvarar vilket tal. Tecken är inte bara de skrivbara (t.ex. a, b,...) utan även kontrolltecken som används för att byta skrivrad (return), ljudsignal, tabulatortecken osv. Programmeringsteknik för ingenjörer 58

Tecken Att tecken har en motsvarighet i siffror kan ses i följande exempel: #include <stdio.h> void main(void) { printf("%c %c %d %d\n", A, 65, A, 65); } Vilket ger utskriften: A A 65 65 Programmeringsteknik för ingenjörer 59

Specialtecken Name Written in C Integer value null character \0 0 alert \a 7 backspace \b 8 horizontal tab \t 9 newline \n 10 vertical tab \v 11 formfeed \f 12 carriage return \r 13 double quote \ 34 single quote \ 39 backslash \\ 92 Programmeringsteknik för ingenjörer 60

Flyttal(reella tal) Det finns tre flyttalstyper: float, double och long double. Variabler av denna typ kan innehålla reella värden som 0.001, 2.0 eller 3.14159. Hur stor precision en variabel av float, double eller long double har är systemberoende. Oftast är precisionen för en double bättre än en float och long double bättre än double. Programmeringsteknik för ingenjörer 61

Flyttalskonstanter Vi kan lagra heltal som flyttalskonstanter men vi måste ange dom i formen 1.0 och 2.0. 3 däremot är en heltalskonstant. Flyttal kan också anges som 1.234567e5 vilket motsvarar 1.234567 10 5 Ett suffix kan läggas till som anger vilken typ konstanten är. f eller F anger att konstanten är float och l eller L anger att den är long double. Ett flyttal utan suffix är av typen double. T.ex. 3.7F säger att vi har en flyttalskonstant av typen float. Programmeringsteknik för ingenjörer 62

Övriga flyttal En float har vanligtvis en ungefärlig precision av 6 signifikanta siffror och ett ungefärlig omfång (range) på 10-38 till 10 38. Representationen i maskinen blir (i bas 10 i.s.f. 2): 0.d 1 d 2 d 3 d 4 d 5 d 6 10 n där 38<n<38. En double har vanligtvis en precision av 15 signifikanta siffror och ett omfång på 10-308 till 10 308. x i satsen double x = 123.45123451234512345 /* 20 signifikant digits */ resulterar att x blir tilldelat ett värde som lagras enlig 0.123451234512345 10 3 (15 signifikanta siffror) Programmeringsteknik för ingenjörer 63

Exempel Att reella tal inte lagras exakt kan ge upphov till vissa problem. Om vi antar att vår dator kan lagra en float med maximalt 5 signifikanta siffror. float x = 12345F; float y = 1e-1F; float z = 0 / (x + y - 0.12345e5F); /*problem*/ När uttrycket i nämnaren skall evalueras måste exponenten av de tre talen vara av samma storlek. x=0.12345e5 y=0.00000e5 x+y- 0.12345e5==0 Programmeringsteknik för ingenjörer 64

Typdeklarationer, typdef Med typedef kan en datatyp associeras med en identifierare. typedef unsigned int coord_t; typedef double temp_t; Variabler kan därefter deklareras med identifieraren. coord_t x, y; temp_t inside, outside; Fördelarna är kortare typdeklarationer, men framför allt att datatypen antyder den avsedda användningen av variabler. Programmeringsteknik för ingenjörer 65

Typstorlek, sizeof Operatorn sizeof används för att veta hur många bytes som krävs för att lagra ett objekt. Objekt kan vara en datatyp (float), ett uttryck (a+b), en vektor, eller en struktur (se senare kap.). sizeof(int) sizeof(a+b) sizeof returnerar ett heltal som anger hur många bytes som krävs för lagringen. C är flexibelt när det gäller storlekarna på datatyper vilket kan leda till dålig portabilitet av kod. Användandet av sizeof kan delvis undvika detta problem. Programmeringsteknik för ingenjörer 66

Lagring Följande gäller alltid på alla system. sizeof(char) == 1 sizeof(unsigned) == sizeof(signed) == sizeof(int) sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) sizeof(float) <= sizeof(double) <= sizeof(long double) Enlig definitionen kan alltså en long vara lagrad med 1 byte (256 olika värden), men oftast lagras en long med 8 byte (2 64 olika värden). Programmeringsteknik för ingenjörer 67

getchar() och putchar() getchar() och putchar() är makron (används som funktioner) definierade i stdio.h som läser tecken från tangentbordet respektive skriver tecken till skärmen. getchar() returnerar en int och putchar() tar en int som argument. I minnet så lagras en char som 1 byte och en int lagras oftast som 4 byte. Därför kan en int lagra alla värden som en char kan. Vi kan tänka oss char som en liten heltalstyp och int som en stor teckentyp. Vi kan alltså lagra tecken i int lika gärna som i char. Programmeringsteknik för ingenjörer 68

double_out.c #include <stdio.h> /* i stdio.h finns raden #define EOF (-1) */ int main(void) { int c; while ((c = getchar())!= EOF) { putchar(c); putchar(c); } return 0; } Programmeringsteknik för ingenjörer 69

capitalize.c #include <stdio.h> int main(void) { int c; while ((c = getchar())!= EOF) { if (c >= a && c <= z ) putchar( A + c - a ); else putchar(c); } return 0; } Programmeringsteknik för ingenjörer 70

Matematiska funktioner Det finns inga inbyggda matematiska funktioner i C utan de tillhandahålls via matematikbiblioteket math.h. Alla matematikfunktioner (förutom pow()) tar ett enda argument av typen double och returnerar en double. Observera att absolutbeloppsfunktionen, abs(), tar heltal som argument, medan fabs() tar flyttal som argument. Detta leder till vanliga fel, speciellt då kompilatorn sällan ger varningar. Programmeringsteknik för ingenjörer 71

Exempel #include <math.h> void main(void) { double a = 4.5; double b = 5.1; double c; c = sin(a + b) / fabs(cos(a)); } Programmeringsteknik för ingenjörer 72

Konvertering Ett uttryck som x+y har både ett värde och en datatyp. Om både x och y är av typen int, så får x+y typen int. Däremot, om både x och y är av typen short, så kommer x+y att få typen int. Detta på grund av att short alltid konverteras till int. En char eller short (signed eller unsigned) kan användas där en int eller unsigned int förväntas. Ex. Om en funktion tar en int som argument, kan man skicka en char istället. Om däremot funktionen returnerar en int, så bör man inte ta emot det i en char. Programmeringsteknik för ingenjörer 73

Aritmetiska konverteringar Om operanderna till en binär operator är av olika typ så kan en av dom konverteras. Anta att i är int och f är float. I uttrycket i+f så konverteras i till en float och hela uttrycket får typen float. Vid tilldelningar kan också konvertering ske. Om vi antar att i är av typen int och d är av typen double, kommer värdet av d = i att konverteras till double och hela uttrycket bli double. En utökning av en variabel, som sker i fallet med d = i går ofta bra men däremot i = d kan orsaka problem. Decimaldelen av d kommer att försvinna och i kommer att tilldelas heltalsdelen. Programmeringsteknik för ingenjörer 74

Explicita konverteringar Explicita konverteringar (eng. casts) låter programmeraren byta typ på ett uttryck. Om vi antar att i är av typen int så kommer (double)i att konvertera värdet av i så att uttrycket har typen double. Variabeln i påverkas inte av konverteringen utan är fortfarande av typen int Ex. (long)( A +1.0) f = (float)((int)d + i) d = (double) i/3; (double)(x = 77) Programmeringsteknik för ingenjörer 75

Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekventiell flödeskontroll. Ofta är det dock nödvändigt att modifiera flödet om ett villkor är uppfyllt eller om vi vill upprepa flera satser. Med if, if-else och switch-satser så kan ett val bland alternativ göras. Med while, for och do-while så kan vi åstadkomma upprepningar i vårt program. Programmeringsteknik för ingenjörer 76

Relation, likhet och logiska operatorer Relationsoperatorer < mindre än > större än <= mindre än eller lika med >= större än eller lika med == lika med!= inte lika med Logikoperatorer! negation && logiskt och logiskt eller Programmeringsteknik för ingenjörer 77

Relationsoperatorer Alla relationsoperatorer är binära, d.v.s. de tar två uttryck som operander. Som resultat av operatorerna får vi int värdet 0 (falskt) eller 1 (sant). Exempel: a < 3 a > b -1.3 >= (x - -1.2) a < b < 3 /* syntaktiskt rätt, men oväntat resultat, Varför? */ Felaktiga: a =< b /* Fel ordning på = och < */ a < = b /* Mellanslag ej tillåtet */ a >> b /* bitvis skiftning (se senare kap.) */ Programmeringsteknik för ingenjörer 78

Likhetsoperatorer Likhetsoperatorerna är == och!=. Exempel: c == A k!= -2 x + y == 3 * z -7 Felaktiga a = b /* tilldelning */ a = = b /* mellanslag ej tillåtet */ (x + y) =! 44 /* syntax fel: samma som (x + y) = (!44) */ Programmeringsteknik för ingenjörer 79

Logiska operatorer Logiska operatorer är!, && och. Exempel:!a!(x+ 7.7)!(a < b c < d) a && b a b Felaktiga a && /* operand saknas */ a b /* extra mellanslag */ a & b /* bitvis operation (se kap 7) */ & b /* minnesadressen till b */ Programmeringsteknik för ingenjörer 80

Semantik expr1 expr2 expr1 && expr2 expr1 expr2 noll noll 0 0 noll icke noll 0 1 icke noll noll 0 1 icke noll icke noll 1 1 Programmeringsteknik för ingenjörer 81

Kortslutning När datorn utvärderar sanningen i ett uttryck så slutar evalueringen så snart utkomsten är känd. Om vi har expr1 && expr2, så kommer inte expr2 att utvärderas om expr1 är falskt. int cnt = 0; while (++cnt < = 3 && (c = getchar())!= EOF) { /* something */ } När uttrycket ++cnt <= 3 är falsk kommer inte nästa tecken att läsas från stdin. Programmeringsteknik för ingenjörer 82

Block Ett block är en mängd deklarationer eller uttryck som är omgivna av krullparenteser {}. Där man kan sätta in ett uttryck så är det tillåtet att lägga in ett block. Blocket är i sig själv ett uttryck. Block används är i samband med if, switch, for, do och while. int a = 1, b = 2; if (a > b) { printf("a is bigger than b\n") } Programmeringsteknik för ingenjörer 83

if och if-else Generella formen är if (expr) statement Satsen statement utförs endast om uttrycket expr är icke noll, d.v.s. sant. Exempel: if (score >= 75) printf("grattis!\n"); printf("du har fått %d poäng på tentan.\n", score); Grattis skrivs ut endast om grade har ett värde större än 75. Programmeringsteknik för ingenjörer 84

if och if-else En if-else-sats ser ut som if (expr) then-statement else else-statement Satsen then-statement utförs endast om uttrycket expr är icke noll, d.v.s. sant. Satsen else-statement utförs endast om uttrycket expr är noll, d.v.s. falskt. Programmeringsteknik för ingenjörer 85

if och if-else Exempel: printf("du har "); if (score >= 50) printf("godkänt "); else printf("underkänt "); printf("på tentan med %d poäng!\n", score); Beroende på om studenten nått upp till 50 poäng skrivs antingen Du har godkänt på tentan med xx poäng eller Du har underkänt på tentan med xx poäng ut. Programmeringsteknik för ingenjörer 86

if och if-else if (y!= 0.0) z = x/y; if (j < min) min = j; /* är detta rätt eller? */ if (a < b) if (a < c) printf(" a < b && a < c\n"); else printf(" a < b && a >= c\n"); Ha för vana att använda {} vid nästlade if-satser. Om antalet nivåer med if-sateser börjar bli stort (>4) fundera på att bryta upp dem i flera separata if-satser istället Programmeringsteknik för ingenjörer 87

while Repetition av sekvenser är en av fördelarna med datorer. En dator blir, till skillnad från en människa, aldrig less på att upprepa samma saker hela tiden. Den generella formen är while (expr) statement Satsen statement utförs endast om och alltmedan uttrycket expr är sant. i = 1; while(i < n) factorial = factorial * i++; while ((c = getchar())!= EOF) { if (a >= a && a <= z ) lower_cont++; } total_cnt++; Programmeringsteknik för ingenjörer 88

for for-satsens generella form for(expr1; expr2; expr3) statement next statement är semantiskt ekvivalent med expr1 while(expr2) { statement expr3 } next statement Programmeringsteknik för ingenjörer 89

Exempel for (i = 1; i < n; i++) factorial = factorial * i; for (i = 2; i < k/2; i++) { if (i % k == 0) printf("%d is a divisor of %d\n", i, k); } Felaktig syntax: for (i = 0, i < 5, i+=3) {/*semikolon saknas!!*/ sum += i; } Programmeringsteknik för ingenjörer 90

i = 1; sum = 0; for (; i < 10; ) sum += i++; är ekvivalent med sum = 0; for (i = 1; i < 10; i++) sum += i; Exempel Programmeringsteknik för ingenjörer 91

Kommaoperatorn Lägst prioritet av alla operatorer i C har kommaoperatorn, Den är vänster-höger associativ, så i ett uttryck av formen expr1, expr2 kommer expr1 att utvärderas först och sedan utvärderas expr2 En vanlig användning av kommaoperatorn är i for-loopar for (i = 1, sum = 1; i < 10; i++) sum += i; /* samma som ovan */ for (i = 1, sum = 1; i < 10; sum += i, i++) ; /* EJ samma som ovan */ for (i = 1, sum = 1; i < 10; i++, sum += i) ; Programmeringsteknik för ingenjörer 92

do-while Istället f ör att göra test i början som while, gör do-while sitt test i slutet. int age = -1; do { fflush(stdin); printf("ange din ålder: "); scanf("%d", &age); } while (age < 0); En do-while kommer alltid att utföras minst en gång. Programmeringsteknik för ingenjörer 93

switch switch är en multi-konditions if. Syntax switch ( uttryck ) { case värde1 : satslista1 case värde2 : satslista2 case värde3 : satslista3... default: satslistan } Programmeringsteknik för ingenjörer 94

Exempel if (a == 1) printf("a är 1\n"); else if (a == 3) printf("a är 3\n"); else printf("a är inte 1 eller 3\n"); är ekvivalent med: switch (a) { case 1: printf("a är 1\n"); break; case 3: printf("a är 3\n"); break; default: printf("a inte 1 eller 3\n"); } Programmeringsteknik för ingenjörer 95

break och continue För att bryta det normala flödet, kan break och continue användas. break bryter den innersta loopen eller en switchsats. continue hoppar ur ett loop-block och påbörjar nästa varv i loopen. while(1) { scanf("%lf", %x) if (x < 0.0) break; printf("%lf\n", sqrt(x)); } Programmeringsteknik för ingenjörer 96

Villkorsoperatorn Villkorsoperatorn? : är ovanlig då den är en tertiär operator (den tar tre uttryck som operatorer). if (a < b) x = a; else x = b; kan skrivas som x = a < b? a : b; Om uttrycket före? är sant returneras uttrycket mellan? och :, annars returneras uttrycket efter :. Programmeringsteknik för ingenjörer 97