Användning av stack: evaluera uttryck i RPN

Relevanta dokument
Exempel ( )

Klassdeklaration. Metoddeklaration. Parameteröverföring

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??

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

Föreläsning 3: Booleans, if, switch

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Programmering A. Johan Eliasson

Symboliska konstanter const

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

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 3. Stack

Obligatorisk uppgift 5

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

TDIU01 - Programmering i C++, grundkurs

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Föreläsning 3. Stack

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

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

En kort text om programmering i C.

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

Parameteröverföring. Exempel. Exempel. Metodkropp

2 Pekare och dynamiska variabler.

Programmeringsteknik med C och Matlab

Heltalsrepresentation. Fler byggstenar. Overflow och Underflow. TvŒ-komplement. FlyttalsvŠrden. Fyra heltalstyper. Tecken-bit

Pekare ( )

3 Listor. 3.1 Envägslistor

Obligatorisk uppgift 5: Symbolisk kalkylator

Abstrakta datastrukturer

Tecken & Strängar. Kapitel 7

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

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Programmering i C, 7,5 hp

Föreläsning 13. Träd

Imperativ programmering. Föreläsning 2

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Tentamen i Programmeringsteknik MN

Enkla datatyper minne

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

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

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

public boolean containskey(string key) { return search(key, head)!= null; }

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

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

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

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

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Obligatorisk uppgift 5: Symbolisk kalkylator

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

Pekare och arrayer. Indexering och avreferering

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

TDDC76 - Programmering och Datastrukturer

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Introduktion C-programmering

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

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.

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Programmering grundkurs och Programmering C

Villkor och tester. Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser. Ett program består i princip av: selektioner (val)

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

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

Repetition C-programmering

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

C++-programmets beståndsdelar

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

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

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

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

C++ Lektion Tecken och teckenfält

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Rekursion och induktion för algoritmkonstruktion

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

C++ - En introduktion

Våra enkla funktioner eller procedurer

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?

3 Styrning av programflöde. Här exekveras satserna enligt först sats1 sedan sats2 och sist sats3.

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

Tentamen ges för: Tentamensdatum: Tid:

LÖSNINGSFÖRSLAG TENTAMEN

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

Skizz till en enkel databas

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

C++ - En introduktion

kind spelling Scanning

Variabler och konstanter

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

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Heltal(int) Programmeringsteknik 54

Skapar en tom kö Sätter in elementet v sist i kön Testar om kön är tom Ger värdet av första elementet i kön Tar bort första elementet v från kön

Transkript:

(28 september 2010 T9.1 ) Användning av stack: evaluera uttryck i RPN /* rpn.c */ #include "stack.h" /** Eget interface till stackmekanismen för att få en stack med double */ static Stack operands; // Global "privat" stack # define topval() *(double *)top(operands) void pushval(double x) { double *dp = malloc(sizeof(double)); *dp = x; push(dp, operands); double popval() { double *p = top(operands); double r = *p; pop(operands); free(p); return r; /* slut på stackinterface */

(28 september 2010 T9.2 ) Användning av stack: evaluera uttryck i RPN forts /** IO-interface */ int next() { /* Returnerar nästa icke-blanka tecken UTAN att konsumera det dvs nästa inputoperation kommer att börja med detta tecken */ int c; while ((c=getchar())== ); ungetc(c,stdin); // "Lägg tillbaka" return c; /* slut på IO-interface */

(28 september 2010 T9.3 ) Användning av stack: evaluera uttryck i RPN forts void perform(int c) { /* Utför operation c på den globala stacken */ double y = popval(); // Obs: ordningen double x = popval(); if ( c== + ) pushval(x+y); else if ( c== - ) pushval(x-y); else if ( c== * ) pushval(x*y); else if ( c== / ) pushval(x/y); else assert(0); // Fel...

Användning av stack: evaluera uttryck i RPN forts int main() { int c; operands = newstack(); // Initiera stacken while (1) { c = next(); if (isdigit(c)) { // Om tal så läs in och lagra det double x; scanf("%lf", &x); pushval(x); else { // annars kommando eller operator getchar(); // Läs förbi if ( c== \n ) printf("%f\n", topval()); else if ( c== q ) return 0; else { perform(c); return 0; (28 september 2010 T9.4 )

(28 september 2010 T9.5 ) En villkorssats till: switch int daysinmonth(int month) { int days; switch(month) { case 11: // november case 4: // april case 6: // juni case 9: // och september days = 30; // 30 dar har break; case 2; days = 28; // februari 28 allen break; default: days = 31; // alla övriga 31 return days; Glöm inte break (när den skall vara med)!

(28 september 2010 T9.6 ) Exempel: Evaluering av uttryck i infix notation Aritmetiska uttryck i vanlig, infix, notation kan (bl a) evalueras med den s k järnvägsalgoritmen. Den är baserad på två stackar - en för operatorer och en för operander. Algoritmskiss: Om tal Pusha talet på operandstacken. annars om slut på uttryck Poppa operatorstacken och utför varje operation tills operatorstacken tom. Skriv ut det enda kvarvarande värdet på stacken. annars om vänsterparentes Lägg den på stacken. annars om högerparentes Poppa och utför operationerna tills vänsterparentes hittas annars om operator Poppa operatorstacken och utför operationerna tills operatorn på stacktoppen har lägre prioritet än den aktuella operatorn. Pusha operatorn på stacken. annars fel

(28 september 2010 T9.7 ) Exempel: Evaluering av uttryck i infix notation /* calc.c - Kalkylator för aritmetiska uttryck i infix (vanlig) notation. Använder två stackar: en med flyttal för operander och en med heltal (tecken) för operatorer. OBS: Ingen vettig felhantering. Förutsätter att varje rad i indata innehåller ett syntaktiskt korrekt uttryck. */ #include <stdio.h> #include <stdlib.h> #include "stack.h" /** Interface till stackarna */ int topoperator() { return *(int *) top(operators); void pushoperator(int oper) {... int popoperator() {... void pushoperand(double x) {... double popoperand() {... /** IO-interface */ int next() {...

(28 september 2010 T9.8 ) Exempel: Evaluering av uttryck i infix notation forts /** Räknaren */ void perform(int c) {... // Som i RPN-exemplet int priority(int c) { /* Returnerar operatorns proritet Pre : c - teckenkod för en giltig operator Retunerar: operatorns prioritet (när den ligger på stacken) */ switch (c) { case ( : return 0; case + : case - : return 1; case * : case / : return 2; // Fel... assert(0);

(28 september 2010 T9.9 ) Exempel: Evaluering av uttryck i infix notation forts int main() { /* Parsar och evaluerar aritmetiska uttryck med järnvägsalgoritmen */ operands = newstack(); // Initiera operandstacken operators = newstack(); // Initiera operatorstacken while (1) { int oper; int c = next(); if (isdigit(c)) { // Om tal så lagra double x; scanf("%lf", &x); pushoperand(x); else { // annars

(28 september 2010 T9.10 ) Exempel: Evaluering av uttryck i infix notation forts else { // annars getchar(); // Läs förbi if ( c== \n ) { // slut på uttryck? while (!isempty(operators)) { perform(popoperator(operators)); printf("%f\n", popoperand()); else if ( c== q ) { // eller quit? return 0; else if ( c== ( ) { // eller ( pushoperator(c); else if ( c== ) ) { // eller ) while ( (oper = popoperator())!= ( ) { perform(oper); else { // eller operator

(28 september 2010 T9.11 ) Exempel: Evaluering av uttryck i infix notation forts else { // eller operator while (!isempty(operators) && priority(c) <= priority(topoperator())) { perform(popoperator()); pushoperator(c); return 0;