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

Relevanta dokument
Pekare ( )

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

*Pekarvärden *Pekarvariabler & *

Pekare och arrayer. Indexering och avreferering

2 Pekare och dynamiska variabler.

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

TDIU01 - Programmering i C++, grundkurs

#include <stdio.h> #include <string.h>

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

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

Tentamen *:58/ID100V Programmering i C Exempel 3

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

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

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

Programmeringsteknik med C och Matlab

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Tecken & Strängar. Kapitel 7

6.1 Kompilering och lite grundläggande information

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

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

4 Sammansatta datatyper

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

Hantering av textsträngar och talsträngar. William Sandqvist

Föreläsning 10. Pekare (Pointers)

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Strängar. Strängar (forts.)

TDDC76 - Programmering och Datastrukturer

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

Programmeringsteknik med C och Matlab

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Minnestilldelning (allokering) och frigörande (avallokering) av minne

HI1024 Programmering, grundkurs TEN

Poster ( structar ) Postdeklarationer

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

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

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

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

TDIU01 - Programmering i C++, grundkurs

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Innehåll. Pekare Exempel

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Föreläsning 11. Strängar

Innehåll. Pekare Exempel

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Det finns många flaggor till g++,

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

Föreläsning 13. In- och utmatning

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

Filer och structer Del 2

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

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Uppgifter till praktiska tentan, del A. (7 / 27)

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Enkla datatyper minne

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Föreläsning 5: Introduktion av pekare

Föreläsning 12. struct

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tommy Färnqvist, IDA, Linköpings universitet

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Avancerad SSL-programmering II

Föreläsning 3-4 Innehåll

Tentamen i Programmering grundkurs och Programmering C

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

F5: Högnivåprogrammering

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

TDDC76 - Programmering och Datastrukturer

Lämna in en ifylld kursvärdering tillsammans med tentan! Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

F5: Högnivåprogrammering

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Föreläsning 6: Introduktion av listor

Introduktionslaboration

Att använda pekare i. C-kod

Exempel ( )

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Tentamen i Programmering grundkurs och Programmering C

Introduktionslaboration

Typkonvertering. Java versus C

Föreläsning 6 pekare och pekare tillsammans med arrayer

Introduktion C-programmering

TDIU01 - Programmering i C++, grundkurs

Tentamen i Programmering grundkurs och Programmering C

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

4 Sammansatta datatyper

Transkript:

(9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver i w. * * Förvillkor: * 1) n > 0 * 2) w har plats för minst n tecken * * Eftervillkor: * 1) w innehåller en NULL-terminerad sekvens av bokstäver * 2) inputströmmen positionerad till tecknet omedelbart efter ordet * * Returnerar: -1 om filslut påträffades, * 1 om ett helt ord lästs, * 0 om ordet i indata är längre än n-1 tecken */ #include <stdio.h> #include <ctype.h>

(9 september 2010 T4.2 ) Fortsättning readword int readword(char w[], int n) { int c; int i; while ((c=getchar())!=eof &&!isalpha(c)) ; if (c==eof) // Leta första bokstav return -1; // Signalera EOF i = 0; while(i<n-1 && isalpha(c)) { // Så länge bokstäver och plats w[i++] = c; c = getchar(); ungetc(c, stdin); w[i] = \0 ; if (isalpha(c)) return 0; else return 1; // Lägg tillbaka sist lästa i inströmmen // så att inga tecken oavsiktligt tappas // Bokstav som inte fick plats // Signalera att ordet forsätter // Signaler att helt ord lästs

(9 september 2010 T4.3 ) Pekare Varje variabel har en adress En variabels adress ges av den unära adressoperatorn &. Adresser hanteras kan lagras i variabler ( pekarvariabel ). Exempel Den unära avrefereringsoperatorn * används dels vid deklaration av pekarvariabler och dels för att komma åt det som pekaren refererar Det går att utföra aritmetik med pekare Pekarkonstant NULL (som alltid är 0)

(9 september 2010 T4.4 ) Exempelr void swap( int *x, int *y ) { int temp = *x; *x = *y; *y = temp; Anrop: int a, b;... swap( &a, &b);

(9 september 2010 T4.5 ) Exempel: int x = 1, y = 2; int a[] = {4, 3, 2, 1; int *ip, *jp; ip = &x; // ip pekar till x y = *ip; // som y = x *ip = 3; // som x = 3 jp = ip; // jp pekar också till x *jp = *jp + 5; // som x = x + 5 (*ip)++; // som x++ jp = NULL; // nullreferens. Samma som jp = 0 *jp = 2; // illegalt! ip = &a[0]; // pekar till första elementet i a jp = ip + 1; // pekar till andra elementet i a *jp = 0; // som a[1] = 0 *(ip+3) = *(ip+1) + 2; // som a[3] = a[1] + 2 ip = a; // som ip = &a[0]

(9 september 2010 T4.6 ) Arrayer som parametrar - igen int strlen( char s[] ) { int n=0; while ( s[n]!= \0 ) n++; return n; int strlen( char *s ) { int n=0; while ( s[n]!= \0 ) n++; return n; int strlen( char *s ) { int n=0; while ( *s!= \0 ) { s++; n++; return n; int strlen( char *s ) { char *p = s; while ( *p!= \0 ) p++; return p - s; OBS 1: Anropas på samma sätt! OBS 2: Ingen information om storleken på arrayen!

(9 september 2010 T4.7 ) Fyra versioner av strängkopiering void strcpy( char *s, char *t ) { int i = 0; while ((s[i] = t[i])!= \0 ) i++; void strcpy( char *s, char *t ) { while ((*s = *t)!= \0 ) { s++; t++; void strcpy( char *s, char *t ) { while ((*s++ = *t++)!= \0 ) ; void strcpy( char *s, char *t ) { while (*s++ = *t++) ;

(9 september 2010 T4.8 ) Arrayer med pekare int main( int argc, char *argv[] ) { int i; for ( i = 0; i < argc; i++ ) printf( "%s%s", argv[i], (i < argc-1)? "_" : "" ); printf( "\n" ); return 0; (Notera villkorsuttrycket u 1? u 2 : u 3 ) Om programmet sparas på en fil med namnet eka så kan en testkörning se ut som $ eka My God, it is full of stars! eka_my_god,_it_is_full_of_stars! $

(9 september 2010 T4.9 ) Pekare som funktionsvärde char *findblank(char *s) { /* Letar första blanktecken i en sträng Pre: s - första tecken i en \0 -terminerad sträng Returns: adressen till första blanka tecken eller NULL om strängen inte innehåller blanka. */ while ( *s!= && *s!= \0 ) s++; if ( *s == \0 ) return NULL; else return s; Vad får p för värde efter nedanstående kod? char a[] = { a, b, c ; char *p = findblank(a);

(9 september 2010 T4.10 ) Varningar Felaktig av pekare är en mycket vanlig orsak till svårupptäckta fel! Några vanliga fel: Försök att följa NULL-pekaren Användning av odefinerade pekare Användning av pekare till utrymme som är återlämnat Flera pekare som oavsiktligt refererar samma objekt

(9 september 2010 T4.11 ) Definiera egna typer: typedef Exempel typedef float Real; typedef unsigned char Digit; typedef char String[100]; typedef int * IntPointer; Real x; String name, adress; IntPointer ip, jp; typedef definierar en egen datatyp Syntaxen är exakt som en variabeldeklaration Ger möjlighet att lätt byta datatyp Använd typedef!

(9 september 2010 T4.12 ) Sammansatta datatyper: struct Exempel struct Point { double x, y; ; // Observer semikolon! typedef struct Point Point; typedef struct Triangle {// Kan göras direkt Point a, b, c; Triangle; Point p1 = {0, 0; Point p2; Triangle t; p2.x = 1.; p2.y = 0.; t.a = p1; t.b = p2; t.c.x = p1.x + 2; t.c.y = t.a.x + 1;

(9 september 2010 T4.13 ) Dynamiska variabler: malloc och free Exempel #include <stdlib.h> #include <stdio.h> int i, n, *buffer; printf( "Hur många tal vill du kunna behandla? "); scanf( "%d", &n ); buffer = (int *) malloc( sizeof(int)*n ); for ( i = 0; i < n; i++ ) { buffer[i] = i*i;... free(buffer);

(9 september 2010 T4.14 ) Observera Operatorn sizeof som returnerar storleken i bytes av en godtycklig typ malloc returnerar NULL om det inte fanns tillräckligt med minne Typkastningen (int *) malloc returnerar typen void * Minne återlämnas med free ingen automatisk GBC Arraynotationen Alla möjligheter att göra fel...

(9 september 2010 T4.15 ) Övningar 1. Skriv en funktion void printreversed(char *s) som skriver ut strängen s baklänges. 2. Skriv en funktion som löser andragradsekvationen Lösningen ges av ax 2 + bx + c = 0 x 1,2 = b ± b 2 4ac 2a Koefficienterna a, b och c skall skickas till funktionen. Skriv tre olika varianter för att returnera lösningen: a) via två parametrar, b) som en post (funktionsvärde) och c) som en pekare till en post. Skriv också ett huvudprogram som testar funktionen med en följd av inlästa koefficienter.

3. Skriv en funktion char *readtoken() som läser in och returnerar nästa tok, lagrar den i en lagom stor array och returnerar en pekare till strängen. En tok definieras här som en följd av ickeblanka tecken (radslut och tabulatortecken räknas som blanka). OK att förutsätta en viss (stor) maxlängd. Returnera NULL vid EOF. 4. Följande post är avsedd att lagra ett varierande antal heltal typedef struct container { int *buffer; /* Pekare till lagringsarea */ int size; /* Allokerad storlek */ int number; /* Aktuellt antal */ container; Skriv en funktion int store(int data, container *c) som lagrar data på första lediga plats och returnerar dess index. Om behållaren är full (dvs om size==number) så skall en ny, dubbelt så stor buffer anskaffas och innehållet i den gamla flyttas över till den nya. Skriv också en funktion som returnerar talet som är lagrat på en viss plats. Hur bör parametrarna till denna funktion se ut? 5. Samma problem som ovan men med lagring av textsträngar i stället för heltal. (9 september 2010 T4.16 )