Programmering i C. Lektion 4. 5. december 2008



Relaterede dokumenter
Videregående Programmering for Diplom-E Noter

Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Programmering i C Intro og grundlæggende C 5. marts 2007

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

Abstrakte datatyper C#-version

Kursus 02199: Programmering. Kontrol af programudførelsen. afsnit if (indkomst > ) topskat = (indkomst ) * 0.

Introduktion til C programmering

// Definition af porte og funktioner

Kursus navn: Indledende programmering Kursus nr

C++ Programmering V

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet)

Kursusarbejde 3 Grundlæggende Programmering

Programmering for begyndere Lektion 2. Opsamling mm

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

JavaScript. nedarvning.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Skriftlig eksamen i Datalogi

Arduino kursus lektion 3:

Programmering i C. Kurt Nørmark 2005 Institut for Datalogi, Aalborg Universitet. Sammendrag

19 Hashtabeller. Noter. PS1 -- Hashtabeller. Hashing problemet. Hashfunktioner. Kollision. Søgning og indsættelse.

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

Fra programmering til mikroprocessor

Bits, bit operationer, integers og floating point

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

BRP Kursusintroduktion og Java-oversigt

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET

DM536. Rapport og debug

Noter til C# Programmering Selektion

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

Start på Arduino og programmering

2) Det er let at være produktiv med Python, da Python som regel kun har mellem 67 og 80% færre linier end tilsvarende C eller Java kode.

Virkefeltsregler i Java

18 Multivejstræer og B-træer.

// inkluder library kode: #include <LiquidCrystal.h> #include <Serial.h> // Initialiser display LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Kursusarbejde 2 Grundlæggende Programmering

Specialeforsvar: Fundamentet for et fleksibelt container bibliotek

Lektion 2. Grundlæggende programmering i VR

Kursuskatalog 2012 TwinCAT Basic og Extended

Projekt arbejde til kurset Advanced Models and Programs, SASP-AMP 2008 Poul Brønnum, IT Universitetet i København, Maj Indholdsfortegnelse

Klasser og nedarvning

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

SWC eksamens-spørgsmål. Oversigt

Programmering i C Programmering af microcontroller i C (4 af 4) 12. april 2007

Et alfabet er en ordnet mængde af bogstaver og andre tegn

Kursuskatalog 2013 TwinCAT Basic og Extended

Løsning af skyline-problemet

Lær Python dag 1 - modul 1

Alt elektronik heri er købt via og arduino udviklingssoftware er hentet fra

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Forelæsning Uge 2 Mandag

Dynamisk programmering

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0.

DM507 Algoritmer og datastrukturer

Dokumentation af programmering i Python 2.75

VLAN. VLAN og Trunks. Region Syd Grundlæggende netværk

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET

Transkript:

Programmering i C Lektion 4 5. december 2008

Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel

Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void ) ; void u d s k r i v ( i n t a ) ; 4 char b l a b l a ( char c ) ;... 7 / main f u n k t i o n e n / i n t main ( i n t argc, char argv ) {... 10 / f u n k t i o n s d e f i n i t i o n e r / i n t i n d l a e s ( void ) { 13... void u d s k r i v ( i n t a ) { 16...

Funktioner Eksempel Hvorfor: Opdeling i mindre enheder Genbrug Top-down-programmering Abstraktion

Funktioner Eksempel Skriv et program der faktoriserer et heltal i primfaktorer. i n t main ( void ) { unsigned i n t x, f ; g r e e t i n g ( ) ; x= readposint ( ) ; p r i n t f ( "%u = ", x ) ; while ( x!= 1) { f = f i n d F a c t o r ( x ) ; p r i n t f ( "%u ", f ) ; x= x / f ; Funktions-prototyper: void g r e e t i n g ( void ) ; unsigned i n t readposint ( void ) ; unsigned i n t f i n d F a c t o r ( unsigned i n t x ) ; p r i n t f ( " 1\ n " ) ; return 0;

Funktioner Eksempel Funktioner: void g r e e t i n g ( void ) { p r i n t f ( " \nwe f a c t o r a p o s i t i v e i n t e g e r \ i n t o primes. \ n " ) ; unsigned i n t readposint ( void ) { unsigned i n t i n p u t ; p r i n t f ( " Enter a p o s i t i v e i n t e g e r : " ) ; scanf ( "%u ", &i n p u t ) ; return i n p u t ;

Funktioner Eksempel Funktioner: unsigned i n t f i n d F a c t o r ( unsigned i n t x ) { unsigned i n t i ; i n t found_one= 0; for ( i = 2; i <= ( i n t ) s q r t ( x ) ; i ++) { i f ( x% i == 0) { found_one= 1; break ; i f ( found_one ) { return i ; else { return x ; Hele programmet: factor.c

Typer Typekonvertering Arrays Datatyper 3 Typer 4 Typekonvertering 5 Arrays

Typer Typekonvertering Arrays C er et programmeringssprog med statisk, svag typning: hver variabel har en bestemt type typen skal deklareres explicit og kan ikke ændres ved kompilering efterses om der er type-fejl mulighed for implicitte typekonverteringer også mulighed for eksplicitte typekonverteringer. En variabels type bestemmer hvilke værdier den kan antage i hvilke sammenhænge den kan bruges

Typer Typekonvertering Arrays Typer i C: void, den tomme type skalære typer: aritmetiske typer: heltalstyper: short, int, long, char!; enum kommatals-typer: float, double, long double pointer-typer sammensatte typer: array-typer struct [typer.c]

Typer Typekonvertering Arrays #include < s t d i o. h> typedef struct { unsigned i n t a l d e r ; i n t penge ; char navn ; Person ; i n t main ( void ) { / s t r u c t. c / Person p1 ; p1. a l d e r = 30; p1. penge = 300; p1. navn = " U l r i k Nyman" ; p r i n t f ( "%s er %d år og har %d penge ", p1. navn, p1. penge, p1. penge ) ; return ( 0 ) ;

Typer Typekonvertering Arrays Type Bytes Bits Range short int 2 16-32,768 -> +32,767 (32kb) unsigned short int 2 16 0 -> +65,535 (64Kb) unsigned int 4 32 0 -> +4,294,967,295 ( 4Gb) int 4 32-2,147,483,648 -> +2,147,483,647 ( 2Gb) long int 4 32-2,147,483,648 -> +2,147,483,647 ( 2Gb) signed char 1 8-128 -> +127 unsigned char 1 8 0 -> +255 float 4 32 double 8 64 long double 12 96

Typer Typekonvertering Arrays implicitte konverteringer: integral promotion: short og char konverteres til int widening: en værdi konverteres til en mere præcis type narrowing: en værdi konverteres til en mindre præcis type. Information går tabt! [conversions.c] eksplicitte konverteringer: ved brug af casts for ( i = 2; i <= ( i n t ) s q r t ( x ) ; i ++) {

Typer Typekonvertering Arrays Et array er en tabel af variable af samme type der kan tilgås via deres indeks. i n t t a l [ 3 ] ; t a l [ 0 ] = 5 ; t a l [ 1 ] = 4 ; 0 1 2 5 0 1 2 5 4 0 1 2 t a l [ 2 ] = t a l [ 0 ] + t a l [ 1 ] ; 5 4 9 et array skal deklareres med angivelse af type, og helst også størrelse: type a[n] laveste indeks er 0, højeste er N 1 indgangene lagres umiddelbart efter hinanden

Typer Typekonvertering Arrays Pas på! C ser ikke efter om et indeks man forsøger at tilgå ligger indenfor arrayets grænser: #include < s t d i o. h> i n t main ( void ) { / array bad. c / i n t a [ 3 ] ; / Menigsløst r e s u l t a t / p r i n t f ( "%d \ n ", a [ 3 ] ) ; / FARLIGT! / / a [ 3]= 17; / return 0; Programmet skriver i et hukommelsesområde det ikke har reserveret! I bedste tilfælde er det kun programmet der crasher...

Scope Storage class Memorisering Scope 6 Scope 7 Storage class 8 Memorisering

Scope Storage class Memorisering Scope ( virkefelt ) af en variabel er de dele af programmet hvor variablen er kendt og tilgængelig. I C: Scope af en variabel er den blok hvori den er erklæret Variable i en blok skygger for variable udenfor der har samme navn huller i scope! #include < s t d i o. h> i n t main ( void ) { / blok. c / i n t a=5; p r i n t f ( " Før : a==%d \ n ", a ) ; Eksempel fra lektion 2: { / en blok / i n t a=7; / d e k l a r a t i o n / p r i n t f ( " I : a==%d \ n ", a ) ; p r i n t f ( " E f t e r : a==%d \ n ", a ) ; return 0;

Scope Storage class Memorisering Storage class af variable medvirker til at bestemme deres scope. auto (default): lokal i en blok static: lokal i en blok, men bibeholder sin værdi fra én aktivering af blokken til den næste. Eksempel: #include < s t d i o. h> i n t nextsquare ( void ) { s t a t i c i n t s= 0; s ++; return s s ; i n t main ( void ) { i n t i ; for ( i = 1; i <= 10; i ++) p r i n t f ( "%d \ n ", nextsquare ( ) ) ; return 0;

Scope Storage class Memorisering Tilbage til Fibonaccital: f 1 = 1 f 2 = 1 f n = f n 1 + f n 2 unsigned long f i b o ( i n t n ) { switch ( n ) { case 1: case 2: return 1; break ; default : return f i b o ( n 1)+ f i b o ( n 2 ) ; Problem: kører meget langsomt pga. utallige genberegninger Løsning: Husk tidligere beregninger vha. et static array ( dynamisk programmering )

Scope Storage class Memorisering Memoriseret udgave af fibo: unsigned long f i b o ( i n t n ) { unsigned long r e s u l t ; s t a t i c unsigned long memo[ MAX] ; / t h i s gets i n i t i a l i s e d to 0! / switch ( n ) { case 1: case 2: return 1; break ; default : r e s u l t = memo[ n ] ; i f ( r e s u l t == 0) { / need to compute / r e s u l t = f i b o ( n 1)+ f i b o ( n 2 ) ; memo[ n ]= r e s u l t ; return r e s u l t ; [fibo2.c]

Udseende Kommentarer Symbolske konstanter Programmeringsstil 9 Udseende 10 Kommentarer 11 Symbolske konstanter

Udseende Kommentarer Symbolske konstanter C er et programmeringssprog i fri format, dvs. stor frihed mht. formatering: mellemrum, tabs og linieskift kan indsættes (og udelades) næsten overalt. eget ansvar at koden er letlæselig! indentér! brug mellemrum omkring operatorer sæt afsluttende på deres egen linie inddel koden i logiske enheder vha. tomme linier en masse andre (og til dels modsigende!) konventioner find din egen stil!

Udseende Kommentarer Symbolske konstanter Sætning: Kode er sværere at læse end at skrive. brug mange kommentarer. / en kommentar der f y l d e r 2 l i n i e r / (Det er ikke kun andre der skal kunne forstå din kode; måske er det dig selv der 4 uger efter forsøger at finde ud af hvad det her program gør.) kommentér hver enkelt funktion indsæt programmets navn i en kommentar skriv en kommentar om hvad det her program gør (medmindre programmet selv fortæller det) hvis en kodelinie tog specielt lang tid at skrive, er den nok også svær at forstå. Skriv en kommentar. fortæl hvad variablene betyder

Udseende Kommentarer Symbolske konstanter Hvis der er en konstant i dit program der ikke er lig 0 eller 1, vil du sandsynligvis lave den værdi om senere. definér konstanten symbolsk vha. præprocessoren: # define SVAR 42 og referér til det symbolske navn i koden: p r i n t f ( " The answer i s %d ", SVAR ) ; Præprocessoren erstatter, som det første skridt, inden kompilering, alle forekomster af SVAR i koden med 42, undtagen hvis SVAR står som del af en streng. Eksempel på god programmeringsstil: dag2.c