%% 10  While-satser i Matlab
%% 10.1  Fixa tjôt med while
% Takeaways
% While-satser är användbar om man vill repeterar kod så länge ett visst villkor gäller.
% Ofta är detta villkor det motsatta till det man vill uppnå.
% While-satser ska följa ett visst schema. Se nedan.
% Ibland råkar man oavsiktligt ut för att villkoret i While-satsen alltid är uppfyllt. Då slutar inte koden att köras utan fortsätter till man med kraft själv avbryter. Det kan man göra genom att i kommandofönstret skriva  ctrl+C,  ctrl+Break, eller Command+ (Mac) med tangentbordet.
% Ett så kallat standardgränsvärde är att
% \arctan(x)\to\pi/2\,, när x\to\infty\,.
% Du vet att \arctan x är en strängt växande funktion. Av nån anledning vill du veta hur stort x måste vara för att för att avståndet mellan \arctan x och \pi/2 ska vara högst 1\mathrm{e}\!-\!7\,,dvs 10^{-7}\,.
% Vi testar med Matlab med att sätta x  till ett stort tal och se vad avståndet är:



% Det räckte ju inte på långa vägar. Vi kan fortsätta test med större tal, t.ex. 1000, 10000, etc . Efter ett lite tjatigt testande hittar vi ett stort tal som fungerar (10 miljoner verkar OK).
% Detta blir ju en repetitiv procedur. Såna kan man ju undvika med en For-sats, men då måste man från börja veta hur många repetitioner man vill göra. Skillnaden här är att vi inte vet det, utan istället vill uppnå ett visst resultat (som vi kanske aldrig kommer att uppnå). I den situationen ska man använda en så kallad While-sats istället. Den fungerar i princip som en For-sats, men med den skillnaden att kommandon upprepas så länge ett visst  villkor gäller (och inte tills värdena på ett visst index är uttömda). Lite lurigt är det här för det villkor man använder i While-satsen är ofta det motsatta till det man vill uppnå.
% Den allmänna strukturen för en While-sats i Matlab är:
%     while villkor
%         ...
%         kommandon som ska utföras
%                  ...
%     end
% De kommandon som ska repteras är inkapslade mellan nyckeorden  while  och  end . När Matlab kommer till första raden kollas om villkoret är uppfyllt. Är det inte det hoppar Matlab vidare till koden efter  end . Om villkoret är uppfyllt körs den inkapslade koden tills Matlab kommer till  end . Då återgår utföradet till raden med  while och proceduren startar om.
%
% Vi prövar på det inledande exemplet



%
% Detta ger att 10 miljoner är ett heltal N sånt att |\pi/2 - \arctan(x)|<10^{-7}\,, när x>N\,. Vi vet ju inte att det är det minsta heltalet med denna egenskap. Men vi har en otrolig tur. Prövar vi med 10 miljoner minus 1, duger det inte:



% Ett problem med While-loopar är att man oavsiktligt kan råka utför att
% villkoret i loppen alltid uppfyllt, så att loopen forstätter evigt.
% det krävs ett så stort antal upprepningar (iterationer) att tålamodet tryter och man hellre vill pröva nåt annat.
% Genom att med tangentbordet skriva
% ctrl+C,  ctrl+Break, eller Command+. (Mac)
% kan man få Matlab att avbryta körning av kod.
%
% Man kan visa att funktionen  f(x) = ( 1 + x )^{1/x} har ett gränsvärde när x\to 0^+\,. Gränsvärdet är inte kvot mellan två heltal och har heller inte en avslutad (dvs ändlig) decimalutveckling. Man inför en särskild symbol för detta gränsvärde :
% \mathrm{e} = \lim_{x\to 0^+} (1 + x)^{1/x}\, .
% Talet kallas ibland Eulers tal (Eulers konstant är nåt annat), men vanligen bara talet e. Matlab har ingen särskil symbol för detta tal, men man kommer åt (Matlabs approximation av)  det med
% e = exp(1)
% Uppgift 10.1
% Hur stort måste heltalet  n  vara för att  |f(1/n) -\mathrm{e}|  ska vara mindre än 1e-5 ?
% Lösnign



%
%% 10.2 While och input från användare
% Takeaways
% Med kommandot  input( 'text' ) kan man avbryta körningen av ett skript tills användaren reagerar genom att skriva nåt i kommandotfönstret.
% text skrivs ut i kommandofönstret och användaren ska reagera på det meddleandet.
% Det användaren skriver kan sparas i skriptet genom t.ex.  svar = input( 'text' ).  Variabeln  svar får då det användren skrivit i kommandofönstret som värde.
% Matlab kan fås att vänta på input från användaren i utförandet av kod, med kommandot
% input( 'text' )
% ('text'kommer att visas i Matlabs kommandofönster och inte i Live Scriptet. Användaren ska skriva där också.)
% Uppgift 10.2
% Skriv kod som ger användaren möjlighet att ge Matlab ett tal, som sen multiplceras med 10.
% Lösning



%
% Uppgift 10.3
% Skriv kod som ger användaren möjlighet att gissa ett dolt tal mellan 10 och 20. När gissningen är fel, ska en ny chans ges. När den är korrekt ska man få veta det.
% Lösning



%
% Villkoret att  a  inte är samma som  b  skrivs i Matlab
% a ~= b
% Villkoret att  a  är samma som  b  skrivs
% a == b
% Pröva nu om 2 är samma som 3 och om 2 inte är samma som 3



% Om ett påstående är sant ger Matlab det värdet (logiskt) 0, är det falskt får det värdet (logiskt) 1.
% Kommandot
% disp
% kan användas för att få Matlab att göra en utskrift. Tänk display.
% Uppgift 10.4
% Skriv kod som uppfyller målen i uppgift 10.3, men där man vid korrekt gissning också får reda på hur många försök man gjort.
% Lösning



% I lösningen har vi försett while-satsen med en räknare som kallas   antal . Det är ett vanligt sätt att hålla reda på hur många "varv" en while-loop snurrat. Observera att räknaren måste ha ett värde innan While-satsen för att det ska fungera. Ibland har man användning för en räknare även i For-satser, trots att man då på förhand vet hur många gånger de kommer att snurra.