Python - Beräkna egenskaper hos en fyrhörning givet ett urval av dem

Permalänk
Medlem

Python - Beräkna egenskaper hos en fyrhörning givet ett urval av dem

Hej!

Stor varning för okunnighet nedanför denna rad, du är varnad.

Jag går en kurs i python och tänker inte be er göra min uppgift åt mig, snarare skulle jag vilja ha någon slags direktiv om vad det egentligen är jag letar efter.

Min ambition är att jobba med olika geometriska figurer och givet några aspekter av dem kunna beräkna de övriga. Som en del av detta tänkte jag också försöka lära mig något om grunderna i hur klasser fungerar men det är sekundärt och inte ett krav på något sätt.

Mitt, egenskapade, problem är enligt nedan och är något jag önskar lösa för mitt avslutningsprojekt. Detta är alltså inte projektet i sin helhet utan ska sedan kopplas ihop med andra saker. Kan jag få ihop det ska jag sedan göra liknande saker för trianglar och cirklar också.

En fyrhörning har följande fyra egenskaper:

  • längd

  • bredd

  • area

  • omkrets

Givet någon/några av dessa, beräkna de övriga när så är möjligt. Jag började med att knappa ihop följande, vilket är mitt första försök någonsin på att använda klasser så tänk inte att jag kan/förstår allt.

class square: def __init__(self, l, w): self.length = l self.width = w def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width)

så långt fungerar det fin-fint och om jag för in l, w får jag de önskade resultaten.

Problemet är nu att jag också skulle vilja kunna föra in t.ex. w, och area och sedan beräkna exempelvis l. Mitt försök var då enligt nedan:

class square: def __init__(self, l=None, w=None, A=None): #They need to be something or a missing argument error is thrown self.length = l self.width = w self.area = A def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width) def length(self): return self.area / self.width

och i terminalen körde jag enligt nedan och får en traceback.

>>> my_square = square() >>> my_square.width = 5 >>> my_square.area = 30 >>> my_square.length() Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> my_square.length() TypeError: 'NoneType' object is not callable >>> my_square.length = my_square.length() Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> my_square.length = my_square.length() TypeError: 'NoneType' object is not callable

Min tanke var att det skulle vara skillnad på my_square.length() och my_square.length på något sätt men så verkar det inte vara. Sätter jag alla egenskaper till 0 istället får jag samma sak men int istället för None.

Jag har testat att söka runt lite och funderar nu på om det är function overloading jag är ute efter men det verkar mest beröra om jag t.ex. vill att något standardanrop som str() ska göra något speciellt i min klass fall?

Behöver jag lägga en if-logik i __init__ som tittar över vad jag får in och sedan agerar på det? Isåfall är det kanske väldigt onödigt att ha en klass över huvudtaget och jag borde bara köra en stor funktion som klurar ut en bunt variabler åt mig?

Vilken sorts sökord kan relatera till mitt problem? Har ni tips på relevanta StackOverflow frågor? Är jag ute på djupt vatten och borde testa mig på någon annan sorts lösning? Alla tankar är varmt välkomna

EDIT: Kom på att jag inte ska bumpa min egen tråd... Här är ett svar jag skrev av misstag nedanför:

Som vanligt kommer man fort framåt ibland...

class square: def __init__(self, l=None, w=None, A=None): self.width = w self.area = A self.length = l def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width) def calculate_length(self): return self.area / self.width

Gör följande möjligt:

>>> my_square = square() >>> vars(my_square) {'width': None, 'area': None, 'length': None} >>> my_square.width = 5 >>> my_square.area = 30 >>> my_square.length = my_square.calculate_length() >>> vars(my_square) {'width': 5, 'area': 30, 'length': 6.0}

Så glad i hågen tänkte jag att "AHA!" då borde nedan fungera:

class square: def __init__(self, l=None, w=None, A=None): self.width = w self.area = A if type(l) == None: self.lenght = calculate_length() else: self.length = l def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width) def calculate_length(self): return self.area / self.width >>> my_square = square(,5,30) SyntaxError: invalid syntax #Att sätta in ingenting som l fungerar inte >>> my_square = square(None,5,30) #Sätta in None som l fungerar >>> vars(my_square) {'width': 5, 'area': 30, 'length': None} #Tyvärr utförs inte beräkningen för l

Så kanske är jag tillbaka på ruta 1 igen? Jag hoppas det på något sätt framgår vad jag försöker åstadkomma i varje fall

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Du har stavat fel på "length" till "lenght" i första if-satsen.

Visa signatur

Moderkort: Gigabyte X570 Aorus Master | CPU: AMD Ryzen R9 5900X | CPU-kylare: Noctua NH-D15 chromax.black | RAM: Corsair Vengeance LPX 64 GB (4x16) DDR4-3600 CL18 | GPU: Gigabyte RTX 4080 Eagle OC | SSD: 2 x Samsung 970 EVO Plus 1 TB NVMe + Kingston A400 480 GB + Samsung QVO860 1 TB | PSU: EVGA SuperNOVA G2 1000 W Gold | Chassi: Lian Li O11 Dynamic XL | Skärm: BenQ PD3200U @ 3840x2160 + ASUS ROG Strix XG32VQ @ 2560x1440 | Tangentbord: Corsair K68 RGB Cherry MX Red | Mus: Logitech MX Master 2S

Permalänk
Medlem
Skrivet av cyklonen:

Du har stavat fel på "length" till "lenght" i första if-satsen.

Men det var då självaste... ibland så ångrar jag mitt val att skriva kod på engelska, även om jag förstått att det generellt är rekommenderat.

Åtgärdade det men problemet kvarstår tyvärr. Dock tacksam för att du uppmärksammade vad som högst troligen hade varit oerhört frustrerande i ett senare skede.

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Problemet du har är att vissa värden inte är definierade (None), det i sig är inget problem men du måste hantera det. Detta är förövrigt ett bra exempel på att lära dig hantera just error

Det du letar efter är
try:
except:

Det gör att du kan försöka göra saker och om något är fel/odefinierat kan du säga vad i except delen.

Du kan även t.ex. be användaren i den delen ge input på vad det ska vara eller om det är att du exempelvis saknar arean så räknar programmet ut den sedan försöker igen.

Anledningen till att uträkningen inte funkar är att du missat en self. på calculate_length() skulle jag tro utan att köra koden

edit:
Någon annan hitta visst en felstavning

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

Uppdatering:
Jag tyckte det såg lite konstigt ut med

if type(l) == None

så jag testade lite snabbt, det är här felet ligger (plus att det ska vara self. när du callar functioner inom en class

du ska ersätta det med

if not l: self.lenght = self.calculate_length() else: self.length = l

I detta fallet betyder just "if not" om l inte är definierat vilket det inte är om det är None.

class square: def __init__(self, l=None, w=None, A=None): self.width = w self.area = A if not l: self.lenght = self.calculate_length() else: self.length = l def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width) def calculate_length(self): return self.area / self.width

edit:
Om du vill kunna skriva in saker utan att sätta dem i ordning så kan du göra att när du skapar objektet så byter du ut

my_sq = square(None,5,30)

till

my_sq = square(w=4, A=50)

Det har att göra med att python inte förstår en tom input vilket det blir om du skriver
my_sq = square( , 5, 50) utan None, men om du istället ger objektet du skapar alla variabler du uttryckligen vill sätta som w=4 etc så kommer den se att l saknas och därmed sätta in ditt default värde till None som du satt i klassen

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem
Skrivet av Ferrat:

Uppdatering:
Jag tyckte det såg lite konstigt ut med

if type(l) == None

så jag testade lite snabbt, det är här felet ligger (plus att det ska vara self. när du callar functioner inom en class

du ska ersätta det med

if not l: self.lenght = self.calculate_length() else: self.length = l

I detta fallet betyder just "if not" om l inte är definierat vilket det inte är om det är None.

class square: def __init__(self, l=None, w=None, A=None): self.width = w self.area = A if not l: self.lenght = self.calculate_length() else: self.length = l def area(self): return self.length * self.width def circumference(self): return 2*(self.length + self.width) def calculate_length(self): return self.area / self.width

edit:
Om du vill kunna skriva in saker utan att sätta dem i ordning så kan du göra att när du skapar objektet så byter du ut

my_sq = square(None,5,30)

till

my_sq = square(w=4, A=50)

Det har att göra med att python inte förstår en tom input vilket det blir om du skriver
my_sq = square( , 5, 50) utan None, men om du istället ger objektet du skapar alla variabler du uttryckligen vill sätta som w=4 etc så kommer den se att l saknas och därmed sätta in ditt default värde till None som du satt i klassen

Tack!

Sitter här och hamrar på tangentbord och söker som en galning och så finns det någon hjälpsam själ som bara kan lösa det rakt av. Nu när du skrev att jag kan säga vad variablerna ska vara utan att köra ordningen de förväntas i känns det självklart och jag är rätt säker på att det är med i undervisningsboken också.

Nu återstår då att bygga logikträdet för alla eventuella kombinationer, vilket nog kommer vara en utmaning i sig själv men det behåller jag till morgondagen alt. helgen. En fundering är om det är värt att ha den sortens logik i sin egna funktioner i klassen men det räknar jag med att klura ut framgent när jag ser hur stort det faktiskt blir.

Sen rörande try-execpt så håller jag med om att det är lämpligt men variablerna som förs in kommer att hämtas genom ett tkinter gui och det är i den delen jag planerar att lägga in felhanteringen så att när det når fram hit ska (förhoppningsvis) allting vara rätt.

Återigen tack, du har gjort min kväll och öppnat dörren till ny förståelse

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

@Daz: Inga problem, det kan vara frustrerande med små fel, speciellt i början innan man lär sig se dem och tolka felmeddelanden m.m.
Du var så nära så det är förståeligt, det är ofta bra i början att överbygga klasser tills man lär sig hur man kan minimera etc, det är bra träning

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

När är det dags att ge upp? Var nöjd över att ha fått ihop den här klassen och en för cirklar men stötte självklart på patrull nu när jag ska använda mig av den.

Försöker nu fånga alla "edge-cases" när jag bara får area och omkrets givet, koden som fångar dessa är nu en oläslig röra på närmare 100 rader... vilket är mer än resten av klassen i sig själv.

Har i mångt och mycket använt mig av logiken nedan:

for l in range(area + 1): for w in range(perimeter + 1): if (l * w == area) and (2 * l + 2 * w == perimeter): return l

den ger mig längden l och givet den och att jag area/omkrets är det enkelt att räkna ut bredden w (som i width).

Problemet är ju att någon eller båda av de givna värdena för area och omkrets kan vara flyttal och/eller mindre än 1. Det senare har jag löst men sitter fast i hur jag ska göra när arean har fler decimaler än omkretsen och börjar misstänka att jag helt enkelt har börjat gå i fel riktning och nu inte kan se skogen för alla träd. Finns de fallen jag är oroad för ens?

Hur skulle ni lösa ett sånt här problem? Finns det någon gängse metod som jag helt enkelt inte har stött på? I början testade jag med andragradsekvationer baserat på kunskapen om att de två ekvationerna

A = l * w
P = 2*(l * w)

innehåller två okända. Detta gav oftast upphov till jobbiga flyttal som inte alls var lika enkla att hantera som de jag fått från den korta kodsnutten ovan.

För den masochistiska finns koden, så som den ser ut just nu, här men jag är nog mer intresserad av en annan lösning för att vara helt ärlig. Överväger just nu att helt enkelt inte tillåta decimaltal större än 1 för att slippa problemet men det irriterar mig oerhört att jag inte får till det.

Hör kanske den här frågan mer hemma i någon mattetråd?

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Jag förstår inte riktigt vad problemet är med flyttal? Om jag matar in längd 1.7936 och bredd 0.1463, så är det väl inte konstigare än om jag hade matat in längd 2 och bredd 1... Datorn räknar glatt både heltal och decimaltal!

Du kan ju, om du vill, begränsa svaren till heltal eller ett begränsat antal decimaler. I mitt första exempel blir arean 0.26240368, så kanske avrunda till samma antal decimaler som inputvärdet med minst antal (fyra i båda fallen här), och då få 0.2624.

Visa signatur

Moderkort: Gigabyte X570 Aorus Master | CPU: AMD Ryzen R9 5900X | CPU-kylare: Noctua NH-D15 chromax.black | RAM: Corsair Vengeance LPX 64 GB (4x16) DDR4-3600 CL18 | GPU: Gigabyte RTX 4080 Eagle OC | SSD: 2 x Samsung 970 EVO Plus 1 TB NVMe + Kingston A400 480 GB + Samsung QVO860 1 TB | PSU: EVGA SuperNOVA G2 1000 W Gold | Chassi: Lian Li O11 Dynamic XL | Skärm: BenQ PD3200U @ 3840x2160 + ASUS ROG Strix XG32VQ @ 2560x1440 | Tangentbord: Corsair K68 RGB Cherry MX Red | Mus: Logitech MX Master 2S

Permalänk
Medlem
Skrivet av cyklonen:

Jag förstår inte riktigt vad problemet är med flyttal? Om jag matar in längd 1.7936 och bredd 0.1463, så är det väl inte konstigare än om jag hade matat in längd 2 och bredd 1... Datorn räknar glatt både heltal och decimaltal!

Du kan ju, om du vill, begränsa svaren till heltal eller ett begränsat antal decimaler. I mitt första exempel blir arean 0.26240368, så kanske avrunda till samma antal decimaler som inputvärdet med minst antal (fyra i båda fallen här), och då få 0.2624.

Jag har inga problem alls med flyttal i längd och bredd. Däremot fungerar inte metoden jag använde mig av, som står med i mitt inlägg, för t.ex. rektangeln med arean 0.25 och omkretsen 2. Exemplet i fråga är en kvadrat (vilket ju egentligen bara är en rektangel där längd = bredd) med sidlängden 0.5. Just det exemplet har jag löst men sitter nu fast på scenarion där flyttalen är större än 1. Troligen har jag gjort en logisk vurpa någonstans och missat någon självklar metod.

Det är alltså när jag vill gå bakvägen och hitta värden på längd och bredd givet både area och omkrets. När jag bara får ett av de värdena antar jag, vilket överensstämmer med hur programmet kommer användas, att det är en kvadrat det gäller.

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem
Skrivet av Daz:

Jag har inga problem alls med flyttal i längd och bredd. Däremot fungerar inte metoden jag använde mig av, som står med i mitt inlägg, för t.ex. rektangeln med arean 0.25 och omkretsen 2. Exemplet i fråga är en kvadrat (vilket ju egentligen bara är en rektangel där längd = bredd) med sidlängden 0.5. Just det exemplet har jag löst men sitter nu fast på scenarion där flyttalen är större än 1. Troligen har jag gjort en logisk vurpa någonstans och missat någon självklar metod.

Det är alltså när jag vill gå bakvägen och hitta värden på längd och bredd givet både area och omkrets. När jag bara får ett av de värdena antar jag, vilket överensstämmer med hur programmet kommer användas, att det är en kvadrat det gäller.

Jo, men varför skulle det ha nån betydelse om det är heltal eller decimaltal? Formeln/matematiken är samma oavsett, och datorn klarar båda galant. Det är väl möjligen om du låter inmatningen bli en heltalsvariabel som det kanske blir problem (beror väl på språk - jag är ingen programmerare), men då är det ju bara att ställa in så att alla inmatade värden läggs i flyttalsvariabler.

Visa signatur

Moderkort: Gigabyte X570 Aorus Master | CPU: AMD Ryzen R9 5900X | CPU-kylare: Noctua NH-D15 chromax.black | RAM: Corsair Vengeance LPX 64 GB (4x16) DDR4-3600 CL18 | GPU: Gigabyte RTX 4080 Eagle OC | SSD: 2 x Samsung 970 EVO Plus 1 TB NVMe + Kingston A400 480 GB + Samsung QVO860 1 TB | PSU: EVGA SuperNOVA G2 1000 W Gold | Chassi: Lian Li O11 Dynamic XL | Skärm: BenQ PD3200U @ 3840x2160 + ASUS ROG Strix XG32VQ @ 2560x1440 | Tangentbord: Corsair K68 RGB Cherry MX Red | Mus: Logitech MX Master 2S

Permalänk
Medlem
Skrivet av Daz:

När är det dags att ge upp? Var nöjd över att ha fått ihop den här klassen och en för cirklar men stötte självklart på patrull nu när jag ska använda mig av den.

Försöker nu fånga alla "edge-cases" när jag bara får area och omkrets givet, koden som fångar dessa är nu en oläslig röra på närmare 100 rader... vilket är mer än resten av klassen i sig själv.

Har i mångt och mycket använt mig av logiken nedan:

for l in range(area + 1): for w in range(perimeter + 1): if (l * w == area) and (2 * l + 2 * w == perimeter): return l

den ger mig längden l och givet den och att jag area/omkrets är det enkelt att räkna ut bredden w (som i width).

Problemet är ju att någon eller båda av de givna värdena för area och omkrets kan vara flyttal och/eller mindre än 1. Det senare har jag löst men sitter fast i hur jag ska göra när arean har fler decimaler än omkretsen och börjar misstänka att jag helt enkelt har börjat gå i fel riktning och nu inte kan se skogen för alla träd. Finns de fallen jag är oroad för ens?

Hur skulle ni lösa ett sånt här problem? Finns det någon gängse metod som jag helt enkelt inte har stött på? I början testade jag med andragradsekvationer baserat på kunskapen om att de två ekvationerna

A = l * w
P = 2*(l * w)

innehåller två okända. Detta gav oftast upphov till jobbiga flyttal som inte alls var lika enkla att hantera som de jag fått från den korta kodsnutten ovan.

För den masochistiska finns koden, så som den ser ut just nu, här men jag är nog mer intresserad av en annan lösning för att vara helt ärlig. Överväger just nu att helt enkelt inte tillåta decimaltal större än 1 för att slippa problemet men det irriterar mig oerhört att jag inte får till det.

Hör kanske den här frågan mer hemma i någon mattetråd?

Du gör det verkligen extremt jobbigt för dig. Lös ekvationssystemet* och mata in formlerna du får ut för l och w. Det blir två rader kod totalt. Du får själv bestämma vad du tycker är bredd och vad som är höjd när det finns två möjliga fall och förslagsvis hanterar du fallen som inte är möjliga på något vis också.

*det är väl ingen matteuppgift, så håll till godo
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

@Daz: Du har två ekvationer och fyra variabler, så du behöver veta värdet på minst två av variablerna. Det ger dig 6 olika fall av variabler som saknas, t.ex.: {A, P}, {A, w}, {A, l}, {P, w}, {P, l}, {w, l}.

Sen är det bara att lösa ut varje par av variabler från ekvationerna så att du får ut ekvationerna för att beräkna de eftersökta variablerna i varje fall. Ekvationssystemet du visar är ju t.ex. för fallet när {w, l} saknas, så du behöver lösa ekvationerna för de övriga fem fallen.

Sen blir det nog enklare att vända på det och kolla vilka variabler som är definierade, snarare än vilka som saknas, eftersom man då enkelt kan hantera fallet med att bara en variabel saknas utan extra kod. D.v.s. om man t.ex. har l och w så kan man räkna ut både A och P, även om t.ex. A faktiskt redan har ett värde.

Permalänk
Medlem
Skrivet av cyklonen:

Jo, men varför skulle det ha nån betydelse om det är heltal eller decimaltal? Formeln/matematiken är samma oavsett, och datorn klarar båda galant. Det är väl möjligen om du låter inmatningen bli en heltalsvariabel som det kanske blir problem (beror väl på språk - jag är ingen programmerare), men då är det ju bara att ställa in så att alla inmatade värden läggs i flyttalsvariabler.

Problemet är att funktionen range() som jag använder mig av inte godtar flyttal och när det gällde tal mindre än 1 hittade jag ett sätt att lösa det men jag har inte lyckats applicera samma logik på större tal.

Lite googlande ger att numpys linspace verkar kunna hantera flyttal men då behöver jag ange antalet värden och kommer inte kunna garantera en träff på något bra sätt, som jag kan komma på i varje fall.

Skrivet av LemonIllusion:

Du gör det verkligen extremt jobbigt för dig. Lös ekvationssystemet* och mata in formlerna du får ut för l och w. Det blir två rader kod totalt. Du får själv bestämma vad du tycker är bredd och vad som är höjd när det finns två möjliga fall och förslagsvis hanterar du fallen som inte är möjliga på något vis också.

*det är väl ingen matteuppgift, så håll till godo

Jag gav mig på detta tidigare men körde fast då jag tyckte lösningen blev mer komplicerad än den enklare for-loopen, nu när jag plötsligt tänker på flyttal kanske det är enklare dock. Ska se vad jag kan göra.

Skrivet av perost:

@Daz: Du har två ekvationer och fyra variabler, så du behöver veta värdet på minst två av variablerna. Det ger dig 6 olika fall av variabler som saknas, t.ex.: {A, P}, {A, w}, {A, l}, {P, w}, {P, l}, {w, l}.

Sen är det bara att lösa ut varje par av variabler från ekvationerna så att du får ut ekvationerna för att beräkna de eftersökta variablerna i varje fall. Ekvationssystemet du visar är ju t.ex. för fallet när {w, l} saknas, så du behöver lösa ekvationerna för de övriga fem fallen.

Sen blir det nog enklare att vända på det och kolla vilka variabler som är definierade, snarare än vilka som saknas, eftersom man då enkelt kan hantera fallet med att bara en variabel saknas utan extra kod. D.v.s. om man t.ex. har l och w så kan man räkna ut både A och P, även om t.ex. A faktiskt redan har ett värde.

Har inte alls tänkt på att det går att resonera som så att det inte gör ont att räkna ut saker flera gånger, ska nog ta mig en titt på det tankesättet. Kanske kan rensa ut lite skräp någon annanstans också då.

EDIT:Svordomar också! Jag hittade felet nu, @LemonIllusion anledningen till att mitt förra försök med andragradsekvation inte fungerade var att jag tänkte att det var
L = O +-sqrt(O^2-A)

fick av någon anledning för mig att (O/2)/2 var O istället för O/4. Har en fungerande prototyp ny och ska köra in den blandat med @perost idé om att räkna om saker när så behövs. Tack!

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |