Oplossing opgave 2
Oplossing opgave
Oplossing hier met enum , maar dit had je uiteraard ook met een string (die dan de waarden "A","B","C" gaf) of een int (waarden 1,2,3) gewerkt.
enum Fases { A, B, C, Onbekend }
static void Main(string[] args)
{
Fases finalFase= Fases.Onbekend;
//Stap 1
Console.WriteLine("Zet de computer aan");
Console.WriteLine("Gaat de computer aan?");
string invoer = Console.ReadLine();
Console.Clear();
if (invoer == "ja") //Veronderstelt dat er enkel ja/nee correct wordt ingevoerd
{
Console.WriteLine("Zijn er fout boodschappen?");
invoer = Console.ReadLine();
Console.Clear();
if (invoer == "ja")
finalFase = Fases.A;
else
finalFase = Fases.B;
}
else
{
Console.WriteLine("Gaat het power light aan?");
invoer = Console.ReadLine();
Console.Clear();
if (invoer == "ja")
{
Console.WriteLine("Zet het computer scherm aan");
}
else
{
Console.WriteLine("Controleer de voedingskabel.");
}
Console.WriteLine("Probleem opgelost?");
invoer = Console.ReadLine();
Console.Clear();
if (invoer == "ja")
finalFase = Fases.B;
else finalFase = Fases.C;
}
//Stap 2 - fase A
if (finalFase == Fases.A)
{
Console.WriteLine("Geef de foutcode tussen 0 en 9");
int foutcode = Convert.ToInt32(Console.ReadLine());
if (foutcode >= 0 && foutcode <= 9)
{
double X = Math.Sqrt(foutcode * 3);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Gelieve je computer gedurende {X:F1} minuten af te zetten");
Console.ResetColor();
}
else
{
Console.WriteLine("Loes het dan zelf op he!");
}
}
//Stap 2 - fase B
else if (finalFase == Fases.B)
{
Console.WriteLine("Mooi zo, alles werkt.");
Random dobbel = new Random();
if (dobbel.Next(0, 4) == 0)
Console.WriteLine("En u wint ook nog eens 1 jaar gratis IT support!");
}
//Stap 2 - fase C
else if (finalFase == Fases.C) //mag ook gewone else zijn
{
int proccount = Environment.ProcessorCount;
bool bit64 = Environment.Is64BitOperatingSystem;
if (proccount == 1)
{
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine("1 processor");
Console.ResetColor();
}
else
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.BackgroundColor = ConsoleColor.Green;
Console.WriteLine($"{proccount} processor");
Console.ResetColor();
}
if (proccount >= 5)
Console.WriteLine("200 euro");
else
Console.WriteLine($"{proccount * 50} euro");
if (bit64)
{
Console.WriteLine("Hier een bon!");
}
}
}Zoek de fouten
Volgende bugs, fouten, minder goede oplossingen komen uit oplossingen van vaardigheidsproeven. Kan jij ontdekken wat er mis? De oplossingen staan achteraan dit document. (de code is hier en daar ingeperkt om de focus op de fout te leggen)
Opgaven
Oplossing
De tweede if is onafhankelijk van de eerste. Sowieso is het veiliger om met een
if..else ifte werken. In dit geval is nog beter om met eenif..elsete `werken daar de tweede if de coplementaire van de eerste is. Door deze nu alsnog 'voluit' te schrijven verhoog je de kans op bug doordat je bijvoorbeeld een getal aan de grens nu in beide ifs niet opvangt.Indien beide if'n zelfde code bevatten kan je deze allebei in if zetten. Zo hoef je maar op 1 plek aanpassingen te doen in de toekomst.
Je moet steeds de volledige logica uitschrijven. Wat moet in deze if kleiner zijn dan 10? De goede lezer weet wel dat het om
Foutcodexgaat, maar de compiler is zo dom als insert grappig dier/mens/idee.Ten eerste willen we geen string vergelijken, maar ints. Ten tweede: wat als alle getallen tussen 1 en 100 toegelaten werden?!
De
Math.Sqrtgeeft altijd eendoubleterug, dus deze moet niet geconverteerd worden naar eendouble.De tweede
else ifvervang je beter door eenelse.Waarom
+0.0? Ik vermoed om eendoubleaanSqrtte geven, wat niet hoeft, daarintautomatisch reeds naardoublezullen worden omgezet indien nodig.Deze if zal nooit uitgevoerd worden. Geen enkel getal kan zowel kleiner dan 0 zijn en tegelijkertijd groter dan 9.
ReadLinegeeft altijd eenstringterug, en moet dus niet geconverteerd worden naar eenstring.Een huzarenstukje, met aardig wat bug.
Een
ReadLinedirect na een vraag (viaWriteLine) moet je gebruiken om invoer van de gebruiker in te bewaren, niet om een enter op het scherm te plaatsen. De gebruiker zal een antwoord willen invoeren en niet verwachten dat hij eerst op enter moet duwen én dan pas zijn antwoord invoeren.De
ReadLinemethode geeft eenstringterug en moet dus niet geconverteerd worden.De variabele
lightheeft als scope de acolades binnen deelse if. Je kan deze dus niet gebruiken in de volgendeif.
De prijs is het resultaat van een berekening. Je kan dus voor
proccounttussen 1 en 3 werken metprijs = proccount*50. (Wat met 4 trouwens?)Indien je een lege
elsehebt kan je die ook beter gewoon weglaten.Iets subtieler: de zin
Mooi zo, alles werkt.komt in zowel deifals deelsevoor. Het is dus veiliger om deze zin VOOR de if..else structuur te zetten (zo hoef je hem maar op 1 plek aan te passen als deze in de toekomst anders moet zijn). Deelsevervalt op deze manier trouwens.Een klassieke fout. De
!(not) mag je niet dubbel plaatsen zoals&&en||. Twee maal not is gewoonnot not: beide nots neutraliseren mekaar (zelfde als zeggen 'min min vier' wat gewoo 'plus vier' is) waardoor er eigenlijk staat:if(!! Environment.Is64BitProcess)
Last updated
Was this helpful?