Följande, ur problemsynpunkt enkla uppgifter, är till för att nöta in dagens teori.



Relevanta dokument
Enkla uppgifter. Uppgift 1. Uppgift 2

3.3 for-satsen. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 3

Uppgifter att lösa 1,1,2,3,5,8,13,21...

Belopp Belopp > procent

Fråga 11. Vad skrivs ut? Fråga 12. Vad skrivs ut? Fråga 13. Vad skrivs ut? x=x+y; y=x-y; x=x-y;

UPPGIFT 1 V75 FIGUR 1.

Programmering i C, 7,5 hp

Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001)

Loopar och datatyper. Föreläsning 3

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Detta är andra problemlösningsföreläsningen, vi diskuterar problemen ur Problem II.

kvoten mellan två på varandra följande tal i en talföljd är konstant alltid lika stor.

a = a a a a a a ± ± ± ±500

1,3,5,7,9,...,99. Skriv ett program som genererar en multiplikationstabell med följande utseende

UPPGIFT 1 EURO. Utdata: Två rader, som för indata ovan, ser ut som följer: Före resan: bank 1 Efter resan: bank 3

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

Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Nu till dagens ämne: Vi rekapitulerar det första problemet ur ProblemI:

STYRANDE SATSER. 1) Skriv ett program som räknar ut hur många år du har till pensionen. Vi räknar här med att man pensioneras det år man fyller 65 år.

3, 6, 9, 12, 15, 18. 1, 2, 4, 8, 16, 32 Nu är stunden inne, då vill vill summera talen i en talföljd

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Loopar och datatyper. Föreläsning 3

En sammansatt sats eller block är en sekvens av satser, sammanslagna till en enhet med hjälp av ett matchande par av klamrar, { }.

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, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

52 = Vi kan nu teckna hur mycket pengar han har, just när han har satt in sina 280 kr den tredje måndagen

Programmering Grundkurs (HI1900) Teoridel

TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15. Tisdagen 26 april Tentamen består av 8 sidor

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

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

Pseudokod. Arbetets gång

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

Låt eleverna lösa uppgifterna med huvudräkning och sedan jämföra med resultatet av ett program, t.ex. print(6 + 4 * 3)

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

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

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

Fråga 5. Vad krävs av funktionen undersok(a) för att b ska ökas med 1 respektive minskas med 1?

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

Lektion Kapitel Uppgift Lösning med programmering

Blandat. Föreläsning 5

ÖVNINGSTENTAMEN. HF1002, 6H3120, 6H3117 Diskret Matematik. Skrivtid 10:15-13:15. Torsdagen 20 maj Tentamen består av 4 sidor.

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

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

Lotto. Singla slant. Vanliga missuppfattningar vad gäller slumpen. Slumpen och hur vi uppfattar den - med och utan tärning

Spelregler. 2-6 deltagare från 10 år. En svensk spelklassiker

STOCKHOLMS UNIVERSITET MATEMATISKA INSTITUTIONEN Avd. Matematisk statistik Anders Björkström

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

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

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

1, 2, 3, 4, 5, 6,...

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

Funktioner och programstruktur. Föreläsning 5

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Data, typ, selektion, iteration

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

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

Sidor i boken f(x) = a x 2 +b x+c

Enkla datatyper minne

TENTAMEN. HF1002, 6H3120, 6H3117 Diskret Matematik. Skrivtid 8:15-13:15. Måndag 8 juni Tentamen består av 4 sidor.

Datoraritmetik. Från labben. Från labben. Några exempel

Klassdeklaration. Metoddeklaration. Parameteröverföring

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Föreläsning 10. Pekare (Pointers)

Fråga 15. Följande deklarationer är givna

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

EXTRA UPPGIFTER I C++ PROGRAMMERING-A

Dynamisk Programmering

Funktioner och programstruktur. Föreläsning 5

1 Iteration. 1.1 for-satsen

TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15. Fredagen 14 januari Tentamen består av 8 sidor

Inledande programmering med C# (1DV402) Summera med while"-satsen

C++ Slumptalsfunktioner + switch-satsen

Uppgifter 6: Kombinatorik och sannolikhetsteori

Antal ögon Vinst (kr) Detta leder till följande uttryck E(x) = x x p X(x) x f X(x)dx

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Högstadiets matematiktävling 2016/17 Finaltävling 21 januari 2017 Lösningsförslag

Grunderna i stegkodsprogrammering

Trepoängsproblem. Kängurutävlingen 2012 Junior

JAVAUTVECKLING LEKTION 4

kl Tentaupplägg

"if"-satsen. Inledande programmering med C# (1DV402)

Objektorienterad programmering Föreläsning 2

Repetera snabbt vad du lärde dig förra veckan. Du är nu redo att kasta dig in i nästa fas, teorin om villkor.

Lösningsförslag till övningsuppgifter till föreläsning 6 Funktioner

Föreläsning 1 & 2 INTRODUKTION

Uttryck och villkor. Föreläsning 2

Problemlösning (3/5) Lösningar

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

Innehåll. Förord 1. Kapitel Så kommer du igång Övningsuppgifter Lösningsförslag Eftersnack...

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

KOKBOKEN. Håkan Strömberg KTH STH

Lösningsförslag till övningsuppgifter till föreläsning 6 Funktioner

Explorativ övning 5 MATEMATISK INDUKTION

Tentamen ges för: Tentamensdatum: Tid:

Uttryck och villkor. Föreläsning 2

Kontroll 13. Uppgift 1. Uppgift 2. Uppgift 3. Uppgift 4. Uppgift 5. Uppgift 6. Uppgift 7

Ett enkelt Kalkylexempel - Fruktaffären

Programexempel: tärningsspel. Programexempel: tärningsspel Kasta tärning tills etta. Klassen Die Specifikation. Slumptalsgenerator Klassen Random

Transkript:

Problem Nivå 1 Följande, ur problemsynpunkt enkla uppgifter, är till för att nöta in dagens teori. Problem 1 Skriv ett program som tar reda på hur många termer man måste ta med i serien för att summa ska bli > 3 2 Antal termer är 7 Summan är då 1.51180 1+ 1 4 + 1 9 + 1 16 +...+ 1 n 2 +... Problem 2 Talföljden 0,1,1,2,3,5,8,13,21,... kallas Fibonacci talföljd. Nästa tal i följden får man genom att summera de två föregående. Till exempel genom 13+21 = 34 får vi nästa tal i följden ovan. De två första talen i följden, 0 och 1 är givna. Skriv ett program som tar reda på det 40:e talet i denna följd. Det 40:e talet är 63245986 Problem 3 Ett primtal n är ett tal som endast har 1 och talet själv som delare (för inget annat p,1 < p < n går divisionen n jämnt upp). p Skriv ett program som tar reda på vilka av talen som är primtal. 7919, 1299711, 2750159 Tal att testa? 4256233 4256233 är primtal Talen 7919 och 2750159 är primtal. Dock inte 1299711. Observera hur snabbt datorn hinner utföra till exempel 2750157 divisioner! Håkan Strömberg 1 STH KTH

Problem 4 1 januari 2010 tänker du sätta in 1000 kr på banken till 4% årlig ränta. Ta reda på hur många år det kommer att dröja innan du är miljonär. Efter 177 år Problem 5 Skriv ett program som vänder på ett inmatat fyrsiffrigt tal Talet? 1235 Talet vänt 5321 Problem 6 Skriv ett program som tar reda på hur många minuter det är mellan två klockslag. Ett klockslag, till exempel 12 : 35 skriv i in programmet in som ett flyttal 12.35. Vi antar att de två klockslagen är från samma dygn. Från? 12.36 Till? 17.12 276 minuter Problem Nivå 2 Slantsingling Två spelare A och B singlar slant. Båda satsar inledningsvis, i varje omgång, en krona. A håller alltid på KRONA och B på KLAVE. Kommer KRONA upp vinner A potten i annat fall vinner B. Skriv ett program som simulerar detta spel där A alltid startar med 100 kronor och B med ett belopp 100 kronor och där spelet fortsätter tills någon av spelarna är utan pengar. Programmet ska bestämma sannolikheten att A blir den slutlige segraren och i medeltal hur många spel som krävs innan omgången är slut. Programmet ska, för att få en god approximation på denna sannolikhet, simulera 10000 omgångar. Vilket belopp har B vid starten: 50 I genomsnitt kommer en omgång att vara i 4854 spel A kommer att vinna 66.67% av omgångarna Håkan Strömberg 2 STH KTH

Enarmad bandit En enarmad bandit har tre hjul. På varje hjul finns siffrorna 1..9 precis en gång. Spelaren stoppar in en krona i banditen och drar i armen. De tre hjulen sätts igång, men stannar efter en stund. Nu kan resultatet avläsas i form av tre siffror. Har spelaren tur så blir det vinst. Här är vinstlistan, de belopp som maskinen kommer att spotta ut: 1 Alla siffror lika ger utdelningen 30 kronor. 2 Tre siffror i följd, dock nödvändigtvis inte i rad, till exempel 5,7,6, ger 1 kronor (alltså pengarna tillbaka) 3 Två siffror (men ej tre) lika, ger utdelningen 2 kronor Nu visar det sig att med den här vinstlistan, kommer ägaren till maskinen att i långa loppet gå med förlust. Hjälp honom därför, att med ett program, prova ut en ny passande vinstlista. Låt spelaren starta med 200 kronor och se till att sannolikheten för att spelaren ska bli bankrutt är ungefär lika stor som att han ska nå en vinst på 200 (nå upp till 400). Låt ditt program varje gång köra 1000 omgångar, där varje omgång avbryts av att spelaren, har slut på pengar eller uppnått minst 200 kronor i vinst. Utdelning vid vinst 1 : 30 Utdelning vid vinst 2 : 1 Utdelning vid vinst 3 : 2 Spelaren vinner 68.4 % av de 1000 omgångarna Prislistan kan dock konstrueras, så att resultatet kommer närmare 50%. Seven Eleven När Leif Eriksson var i Amerika senast, närmare bestämt i New York, smet han in i en SevenEleven-butik och köpte bananer, apelsiner, päron och äpplen. När han skulle till att betala kom den snabbtänkte vikingen på, att både summan och produkten av priserna på de fyra frukterna var $7.11. Skriv ett program som bestämmer fyra priser på frukterna sådana att villkoren ovan är uppfyllda (1 dollar = 100 cent). Håkan Strömberg 3 STH KTH

Lösningsförslag Nivå 1 Problem 1 double sum=0.0; int n=0; while(sum<3.0/2.0){ n++; sum=sum+1.0/(n*n); printf("antal termer är %d\n",n); printf("summan är då %.5f\n",sum); Problem 2 int f1=0,f2=1,f3,i; for(i=1;i<=38;i++){ f3=f1+f2; f1=f2; f2=f3; printf("det 40:e talet är %d\n",f3); Problem 3 int i,tal,ok=1; printf("tal att testa? "); scanf("%d",&tal); for(i=2;i<=tal-1;i++) if(tal%i==0) ok=0; if(ok==1) printf("%d är primtal\n",tal); else printf("%d är inte primtal\n",tal); Håkan Strömberg 4 STH KTH

Problem 4 int ar=0; float belopp=1000.0; while(belopp<1000000.0){ ar++; belopp=belopp*1.04; printf("eter %d år\n",ar); Problem 5 int tal,t,h,d,e,vtal; printf("talet? "); scanf("%d",&tal); t=tal/1000; h=tal%1000/100; d=tal%100/10; e=tal%10; vtal=e*1000+d*100+h*10+t; printf("talet vänt %d\n",vtal); Problem 6 float t1,t2,m1,m2,sm; printf("från? "); scanf("%f",&t1); printf("till? "); scanf("%f",&t2); m1=(t1-(int)t1)*100; t1=(int)t1; m2=(t2-(int)t2)*100; t2=(int)t2; if(m1>m2){ t2--; sm=60+m2-m1; else sm=m2-m1; sm=sm+(t2-t1)*60; printf("%.0f minuter\n",sm); Håkan Strömberg 5 STH KTH

Lösningsförslag Nivå 2 Slantsingling #include <conio.h> int b,s,n,tot=0,i,s1,bv=0; srand(time(0)); printf("hur många kr har spelaren från början: "); scanf("%d",&s); for(i=1;i<10000;i++){ b=100; s1=s; n=0; while(b>0 && s1>0){ n++; if(rand()%2==1){ s1++; b--; else { s1--; b++; if (s1==0) bv++; tot=tot+n; printf("en omgång räcker i genomsnitt %.2f spel\n",tot/10000.0); printf("banken vinner %.2f %% av spelen\n",bv/100.0); getch(); Håkan Strömberg 6 STH KTH

Enarmad bandit #include <conio.h> int belopp,r1,r2,r3,tmp,i,vinst=0; int v1,v2,v3; srand(time(0)); printf("utdelning vid vinst 1 : "); scanf("%d",&v1); printf("utdelning vid vinst 2 : "); scanf("%d",&v2); printf("utdelning vid vinst 3 : "); scanf("%d",&v3); for(i=1;i<=1000;i++){ belopp=200; while(belopp>0 && belopp<400){ belopp--; r1=rand()%9+1; r2=rand()%9+1; r3=rand()%9+1; if(r1>r2) {tmp=r1; r1=r2; r2=tmp; if(r1>r3) {tmp=r1; r1=r3; r3=tmp; if(r2>r3) {tmp=r2; r2=r3; r3=tmp; if(r1==r3)// Alla lika (1) belopp=belopp+v1; else if(r1==r2 r2==r3) // Två lika (3) belopp=belopp+v3; if(r1+1==r2 && r2+1==r3) // Ordningsföljd (2) belopp=belopp+v2; if (belopp>=400) vinst++; printf("sannoliketen för vinst är %.3f%%\n",vinst/10.0); getch(); Håkan Strömberg 7 STH KTH

Seven Eleven Ett första försök int a,b,c,d; float p,s; for(a=1;a<=711;a++) for(b=1;b<=711;b++) for(c=1;c<=711;c++) for(d=1;d<=711;d++){ p=a*b*c*d/1000000.0; s=a+b+c+d/1000000.0; if(p==7.11 && s==7.11) printf("%d %d %d %d\n",a,b,c,d); Trots att programmet teoretiskt är korrekt konstruerat fungerar det inte som väntat. Vi har en loop med 4 kapslade for-satser. Hur många exekveras de tre satserna inuti loopen? 711 4 = 353360102481. Hur lång tid det kommer att ta beror förstås på hur snabb dator den körs på. Vid ett tillfälle kommer datorn att försöka beräkna 771 4 och lagra i ett heltal med 32-bitar som maximalt kan lagra ett tal 2147483647. Observera att datorn inte meddelar när det sker overflow. Ett nytt försök: int bananer,applen,apelsiner,paron; double prod; for(bananer=1;bananer<=711;bananer++) for(paron=bananer;paron<=711;paron++) for(applen=paron;applen<=711;applen++){ apelsiner=711-bananer-paron-applen; if(apelsiner>=applen){ prod=bananer/100.0*paron/100.0*applen/100.0*apelsiner/100.0; if(prod==7.11) printf("%d %d %d %d\n",bananer,paron,applen,apelsiner); printf("*** KLAR ***"); För det första behöver vi bara tre for-loopar. Priset för apelsinerna kan vi räkna ut eftersom vi känner priset på de andra tre frukterna och och summan av priserna. Håkan Strömberg 8 STH KTH

Dessutom kan startvärdet för varje for-loop sättas till aktuellt värde hos tidigare loop-variabel. Detta leder till att satsen inuti for-loopen endast behöver exekveras 60 157 236 gånger. Genom att skriva tilldelningssatsen som här undviker vi att få overflow. Med denna version får vi resultatet 1.20, 1.25, 1.50, 3.16 efter mindre än en sekund. I denna kurs behöver vi inte tänka så mycket på effektivitet hos våra program. Exemplet visar dock att det finns gränser för hur ineffektiva program vi får skriva! Håkan Strömberg 9 STH KTH