Permalänk
Medlem

ADA, 2000 buggfix.

procedure Birthday is
Datum : String(1..10); --Dagens datum
Birthday: String(1..10); --Personnummer
Ar:Integer; --Antel år du fyller
Da:Integer; --Årtalet i datumet
Bir:integer; --Årtalet i personnummret

package Print_Integer is new Integer_Io(Integer);
use Print_Integer;

package Print_Float is new Float_Io(Float);
use Print_Float;

package Math is new generic_Elementary_Functions(Float);
use Math;

begin
Put("Ange dagens datum (åååå-mm-dd):");
Get(Datum); --Tar emot dagens datum
Put("Ange ditt personnummer (ååmmddxxxx):");
Get(Birthday); --Tar emot ditt personnummer
if Datum(6..7)=Birthday(3..4) and Datum(9..10)=Birthday(5..6) then --Om månaden i datumet är samma i personnummret och dagen i datumer är samma som i personnummret så:
Da:=((Character'Pos(Datum(3)) - 48)*10)+(Character'pos(datum(4)) - 48); --Sparar datumets årtal i integern Da
Bir:=((Character'Pos(Birthday(1)) - 48)*10)+(Character'Pos(Birthday(2)) - 48); --Sparar personnummrets årtal i integern Bir
if Da<10 then --Fixar med 2000-buggen
Da:=Da+100;
end if;
if Bir mod 10 =0 then --Fixar med 2000-buggen
Bir:=Bir+100;
end if;
Ar:=Da-Bir; --Räknar ut hur många år du är!
Put("Grattis! Du fyller "); --Skriver den ut grattis
Put(Ar,Width=>0);
Put(" år!");
else --Annars om du inte fyller år:
Put("Du fyller inte år idag!"); -- Skriver den att du inte fyller år!
end if; -- If-satsen tar slut
end Birthday; --Programmet tar slut

Programmet är från en kompis som jag inte kan få tag på. Jag tog det till hjälp när jag skulle lämna in en skoluppgift. Det jag inte fattar är hur han fixar 2000 buggen. Vad betyder t.ex. mod i if satsen? Vad menar han med 10=0 then?

Permalänk
Medlem

Inom [code] och [/code], tack!

Visa signatur

Scud: The other day, in the park, I was wondering why frisbees look bigger and bigger as they get closer to you
Scud: And then it hit me

Permalänk
Medlem

[if Da<10 then --Fixar med 2000-buggen
Da:=Da+100;
end if;]

och

[if Bir mod 10 =0 then --Fixar med 2000-buggen
Bir:=Bir+100;
end if;]

Så eller?
Hur funkar det rent matematiskt och vad är mod?

Permalänk
Medlem

Du missförstod mig lite tror jag.
Saxat från FAQ:
Om du vill klistra in källkod i ditt inlägg skall du inkapsla din kod med [code]-taggar (t.ex. [code]din kod här[/code]).

Angående hur mod fungerar så kan du kolla det här inlägget av mounte:
http://forum.sweclockers.com/showthread.php?s=&postid=5171476...
Fast byt ut "%" mot "mod".

Visa signatur

Scud: The other day, in the park, I was wondering why frisbees look bigger and bigger as they get closer to you
Scud: And then it hit me

Permalänk

"if Bir mod 10 = 0 then" betyder "om Bir är jämt delbart med 10 så"

Permalänk
Medlem

Re: ADA, 2000 buggfix.

Citat:

Ursprungligen inskrivet av job86

procedure Birthday is Datum : String(1..10); --Dagens datum Birthday: String(1..10); --Personnummer Ar:Integer; --Antel år du fyller Da:Integer; --Årtalet i datumet Bir:integer; --Årtalet i personnummret package Print_Integer is new Integer_Io(Integer); use Print_Integer; package Print_Float is new Float_Io(Float); use Print_Float; package Math is new generic_Elementary_Functions(Float); use Math; begin Put("Ange dagens datum (åååå-mm-dd):"); Get(Datum); --Tar emot dagens datum Put("Ange ditt personnummer (ååmmddxxxx):"); Get(Birthday); --Tar emot ditt personnummer if Datum(6..7)=Birthday(3..4) and Datum(9..10)=Birthday(5..6) then --Om månaden i datumet är samma i personnummret och dagen i datumer är samma som i personnummret så: Da:=((Character'Pos(Datum(3)) - 48)*10)+(Character'pos(datum(4)) - 48); --Sparar datumets årtal i integern Da Bir:=((Character'Pos(Birthday(1)) - 48)*10)+(Character'Pos(Birthday(2)) - 48); --Sparar personnummrets årtal i integern Bir if Da<10 then --Fixar med 2000-buggen Da:=Da+100; end if; if Bir mod 10 =0 then --Fixar med 2000-buggen Bir:=Bir+100; end if; Ar:=Da-Bir; --Räknar ut hur många år du är! Put("Grattis! Du fyller "); --Skriver den ut grattis Put(Ar,Width=>0); Put(" år!"); else --Annars om du inte fyller år: Put("Du fyller inte år idag!"); -- Skriver den att du inte fyller år! end if; -- If-satsen tar slut end Birthday; --Programmet tar slut

Programmet är från en kompis som jag inte kan få tag på. Jag tog det till hjälp när jag skulle lämna in en skoluppgift. Det jag inte fattar är hur han fixar 2000 buggen. Vad betyder t.ex. mod i if satsen? Vad menar han med 10=0 then?

så nu var det gjort

Visa signatur

Sempron 3100+ GF3ti200 1024MB RAM WinXP
XP1600+ "A7V8X" 512MB ram FX5200(GF5) Debian Testing (Openbox)
Acer XP1800+ (bärbar)Debian Gnome

Permalänk
Medlem

Det har gör är som sisåhär... först kollar han Da för att se om dagens datum är efter år 2000. Vilket kanske är lite onödigt.

Sedan kör han Bir mod 10 vilket returnerar 0 om personens födelse år är under 10, d.v.s. personen är född efter år 2000. Eller innan 1910 iofs, men det verkar inte progget ta hänsyn till.

Säg t.ex. att dagens årtal är 2005, och personen är född 2001. Isf så:
Da = 05
Bir = 01

I det här fallet kan vi ignorera hela problemet, eftersom 05 - 04 = 3 mao rätt ålder.

Men någon som är född 1999?
Da = 05
Bir = 99

05 - 99 är inte 6. Därför addar gör vi Da:=Da+100 om dagens årtal är över 2000 så att resultatet blir 05+100 = 105. 105 - 99 = 6, d.v.s. rätt svar.

Där ligger förklaringen till den första if-satsen. Den andra if-satsen kör Bir mod 10, d.v.s. kollar resten om du dividerar Bir med 10. Om någon är född 1999 blir det alltså 99 mod 10 = 9. Men om någon är född 2003 blir det 03 mod 10 = 0. Och i sådant fall lägger vi på 100 på Bir och får (återigen med 2005 som dagens årtal):
Ar = 105-103=2, d.v.s. rätt resultat.

Edit: Det finns en mängd hiskeliga stav- och grammatikfel ovan, men jag har skrivit en hemtenta på 6000 ord på ett par dar nu och pallar fan inte rätta till dom. Tror jag gör mig förstådd ändå

Visa signatur

Give a man a fire and he'll be warm for a night. Set a man on fire and he'll be warm for the rest of his life.