Har 1 problem med min Windows Forms kod. Lite hjälp skulle uppskattas.

Permalänk

Har 1 problem med min Windows Forms kod. Lite hjälp skulle uppskattas.

Så min kod funkar nästan helt och hållet som det ska bara 1 problem.
Man ska få ut text från en fil (som jag redan har lagt till) i denna fil finns det böcker Titel, skribent, typ (Roman...), och om boken finns i lager men i filen så finns det 2 böcker som inte finns och där kommer mitt problem.
Som koden är just nu så kommer bara finns eller finns inte beroende på vad jag skriver i mina bool längst ned i koden.
Undrar om någon vet hur jag ska skriva för att få ut både finns och finns inte eftersom böckerna som i nuläget inte finns finns enligt koden.

namespace windows_forms_uppgift { public partial class Form1 : Form { List<Bok> BigList = new List<Bok>(); List<string[]> SmallList = new List<string[]>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FileLoader(); } public void FileLoader() { if (File.Exists("texter.txt")) { List<string> itemSaver = new List<string>(); StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); SmallList.Add(vektor); switch (vektor[2]) { case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public Bok(string titel, string författare, string typ) { this.typ = typ; this.titel = titel; this.författare = författare; } public override string ToString() { return titel + ". " + författare + ". " + typ; } public string GetTitel() { return titel; } } public class Roman : Bok { bool InStock = true; public Roman(string titel, string författare, string typ) : base(titel, författare, typ) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Novellsamling : Bok { bool InStock = true; public Novellsamling(string titel, string författare, string typ) : base(titel, författare, typ) { } public override string ToString() { typ = "Novellsamling"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Tidskrift : Bok { bool InStock = true; public Tidskrift(string titel, string författare, string typ) : base(titel, författare, typ) { } public override string ToString() { typ = "Tidskrift"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " "+ status; } } }

Permalänk
Medlem

Svårt att tyda vad det är du vill göra egentligen... Men om jag förstår dig rätt så innehåller din fil information om huruvida det litterära verket finns i lager?

Du har ju nu hårdkodat bool InStock = true;
Du behöver läsa in information om lagerstatus från filen och omvandla det till ett booelskt värde. D.v.s. precis som du gör med övrig information.

Nu vet inte jag hur informationen i filen ser ut, men hjälper det om jag säger att 0 kan omvandlas till false och 1 kan omvandlas till true?

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Förstår inte varför du krånglar till det med massa arv då alla ser exakt likadana ut? Override på ToString har du kopierat i tre klasser nu och den skriver ut samma information i alla, förutom att typen är hårdkodad i respektive utskrift.

Som ovan nämner så är InStock satt till true i alla klasserna, detta värde bör du läsa in från filen och sätta via konstruktorn då du skapa dina klasser. Svårt att veta utan att se innehållet i filen.

Permalänk

Det här är några exempel från filen.

Pippi Långstrump###Astrid Lindgren###Roman###true En komikers uppväxt###Jonas Gardell###Roman###true Ondskan###Jan Guillou###Roman###false

Permalänk
Citat:

noMad17
Svårt att tyda vad det är du vill göra egentligen... Men om jag förstår dig rätt så innehåller din fil information om huruvida det litterära verket finns i lager?

Du har ju nu hårdkodat bool InStock = true;
Du behöver läsa in information om lagerstatus från filen och omvandla det till ett booelskt värde. D.v.s. precis som du gör med övrig information.

Nu vet inte jag hur informationen i filen ser ut, men hjälper det om jag säger att 0 kan omvandlas till false och 1 kan omvandlas till true?

Citat:

zaibuf
Förstår inte varför du krånglar till det med massa arv då alla ser exakt likadana ut? Override på ToString har du kopierat i tre klasser nu och den skriver ut samma information i alla, förutom att typen är hårdkodad i respektive utskrift.

Som ovan nämner så är InStock satt till true i alla klasserna, detta värde bör du läsa in från filen och sätta via konstruktorn då du skapa dina klasser. Svårt att veta utan att se innehållet i filen.

Jag undrar om det är på detta sätt som ni menar eller om jag uppfattade det ni skrev helt fel.

public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ, bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = true || false; }

Permalänk
Medlem
Skrivet av Galaxfararen:

Jag undrar om det är på detta sätt som ni menar eller om jag uppfattade det ni skrev helt fel.

public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ, bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = true || false; }

Det fetmarkerade ser galet ut, det bör istället vara this.InStock = InStock.
Viktigt också att poängtera att du inte kan läsa in en bool från en fil rakt av, utan behöver göra en typomvandling från string.
Du kan läsa mer om det här.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Det fetmarkerade ser galet ut, det bör istället vara this.InStock = InStock.
Viktigt också att poängtera att du inte kan läsa in en bool från en fil rakt av, utan behöver göra en typomvandling från string.
Du kan läsa mer om det här.

Just nu så har jag detta text som felmeddelande.

Error CS7036 There is no argument given that corresponds to the required formal parameter 'InStock' of 'Roman.Roman(string, string, string, bool)' windows forms uppgift

Eftersom jag har lagt i till min kod så här just nu.

switch (vektor[2]) { case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ; } public string GetTitel() { return titel; } } public class Roman : Bok { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } }

så vad jag uppfattar det felmeddelandet så behöver jag som du säger convertera boolean till string eller string till boolean.
Jag undrar bara vart man skulle lägga in den eller om jag skulle behöva skapa en ny class som i sidan som du visade

https://docs.microsoft.com/en-us/dotnet/api/system.convert.to..._

Permalänk
Medlem
Skrivet av Galaxfararen:

Just nu så har jag detta text som felmeddelande.

Error CS7036 There is no argument given that corresponds to the required formal parameter 'InStock' of 'Roman.Roman(string, string, string, bool)' windows forms uppgift

Eftersom jag har lagt i till min kod så här just nu.

switch (vektor[2]) { case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ; } public string GetTitel() { return titel; } } public class Roman : Bok { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } }

så vad jag uppfattar det felmeddelandet så behöver jag som du säger convertera boolean till string eller string till boolean.
Jag undrar bara vart man skulle lägga in den eller om jag skulle behöva skapa en ny class som i sidan som du visade

https://docs.microsoft.com/en-us/dotnet/api/system.convert.to..._

Gör typomvandlingen från string till bool där du läser in från filen och anropa sedan konstruktorn precis som du gör nu.

bool inStock = Convert.ToBoolean(vektor[3]);

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Gör typomvandlingen från string till bool där du läser in från filen och anropa sedan konstruktorn precis som du gör nu.

bool inStock = Convert.ToBoolean(vektor[3]);

Jag undrar vad du menar med (vektor[3]); ska jag liksom lägga till den så här

case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], vektor[3])); break;

eller ska den in på något annat sätt;

Permalänk
Medlem
Skrivet av Galaxfararen:

Jag undrar vad du menar med (vektor[3]); ska jag liksom lägga till den så här

case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], vektor[3])); break;

eller ska den in på något annat sätt;

Du splittar varje rad i din fil på separatorn "###" vilket enligt ditt exempel ger dig en array med fyra element varav det sista är din lagerstatus (true/false).
vektor[3] refererar till det sista elementet och i mitt exempel ovan visar jag hur du gör för att typomvandla det till en bool. Den variabeln skickar du sedan med till konstruktorn när du skapar t.ex. en ny Roman.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Du splittar varje rad i din fil på separatorn "###" vilket enligt ditt exempel ger dig en array med fyra element varav det sista är din lagerstatus (true/false).
vektor[3] refererar till det sista elementet och i mitt exempel ovan visar jag hur du gör för att typomvandla det till en bool. Den variabeln skickar du sedan med till konstruktorn när du skapar t.ex. en ny Roman.

Jag har testat med att skicka variabeln till konstruktorn men inget har funkat så jag måste ha missat något i din förklaring.
Förmodligen vart man ska ha (bool InStock = Convert.ToBoolean(vektor[3]); ) liggandes någonstans.

Permalänk
Medlem
Skrivet av Galaxfararen:

Jag har testat med att skicka variabeln till konstruktorn men inget har funkat så jag måste ha missat något i din förklaring.
Förmodligen vart man ska ha (bool InStock = Convert.ToBoolean(vektor[3]); ) liggandes någonstans.

Förslagsvis precis innan din switch-sats i FileLoader.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Förslagsvis precis innan din switch-sats i FileLoader.

Koden ser ut så här om jag lägger dit (bool InStock = Convert.ToBoolean(vektor[3]); ) innan min switch-sats men felmeddelandena.

Error CS1503 Argument 4: cannot convert from 'string' to 'bool'

Finns fortfarande och vet inte vad som krånglar i så fall, jag vill ju att programmet ska skriva ut detta

var status = InStock ? "Boken finns" : "Boken finns inte";

beroende på vad det fjärde elementet är (True/False)

namespace windows_forms_uppgift { public partial class Form1 : Form { List<Bok> BigList = new List<Bok>(); List<string[]> SmallList = new List<string[]>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FileLoader(); } public void FileLoader() { if (File.Exists("texter.txt")) { List<string> itemSaver = new List<string>(); StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); SmallList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]); switch (vektor[2]) { case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2], vektor[3])); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2], vektor[3])); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], vektor[3])); break; default: break; } Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ + ". " + InStock; } public string GetTitel() { return titel; } } public class Roman : Bok { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Novellsamling : Bok { public Novellsamling(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Novellsamling"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Tidskrift : Bok { public Tidskrift(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Tidskrift"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " "+ status; } } }

Permalänk
Medlem
Skrivet av Galaxfararen:

Koden ser ut så här om jag lägger dit (bool InStock = Convert.ToBoolean(vektor[3]); ) innan min switch-sats men felmeddelandena.

Error CS1503 Argument 4: cannot convert from 'string' to 'bool'

Finns fortfarande och vet inte vad som krånglar i så fall, jag vill ju att programmet ska skriva ut detta

var status = InStock ? "Boken finns" : "Boken finns inte";

beroende på vad det fjärde elementet är (True/False)

namespace windows_forms_uppgift { public partial class Form1 : Form { List<Bok> BigList = new List<Bok>(); List<string[]> SmallList = new List<string[]>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FileLoader(); } public void FileLoader() { if (File.Exists("texter.txt")) { List<string> itemSaver = new List<string>(); StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); SmallList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]); switch (vektor[2]) { case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2], vektor[3])); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2], vektor[3])); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], vektor[3])); break; default: break; } Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ + ". " + InStock; } public string GetTitel() { return titel; } } public class Roman : Bok { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Novellsamling : Bok { public Novellsamling(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Novellsamling"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Tidskrift : Bok { public Tidskrift(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Tidskrift"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " "+ status; } } }

Du ska skicka InStock till konstruktorn, inte vektor[3]. Det är ingen direkt vits med att göra typomvandlingen om man sedan inte använder den

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Du ska skicka InStock till konstruktorn, inte vektor[3]. Det är ingen direkt vits med att göra typomvandlingen om man sedan inte använder den

Programmet funkar nu men tydligen behövdes min kod kompletteras.
Just nu så laddas alla böckerna in varje gång man ska trycka på tipsa knappen och han vill att man ska ladda in 1 bok varje gång och jag vet inte hur jag ska göra det nu när programmet funkar.

namespace windows_forms_uppgift { public partial class Form1 : Form { List<Bok> BigList = new List<Bok>(); //Här skapas 2 listor för att hålla böcker & strängar List<string[]> SmallList = new List<string[]>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) //Här är "tipsa mig" knappen som när man trycker på så tas man till { // "FileLoader" eller resten av programmet. FileLoader(); } public void FileLoader() { if (File.Exists("texter.txt")) //Här kollas det om filen existerar med namnet i parantesen. { List<string> itemSaver = new List<string>(); StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); SmallList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]); //Här typomvandlas strängar till bool. switch (vektor[2]) { //Här tas alla titlar, skribenter, boktyper och om de har True eller False i slutet. case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2], InStock)); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2], InStock)); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], InStock)); break; default: break; } Random random = new Random(); //Här är kodstycket som slumpar fram böckerna. string obj = BigList[random.Next(BigList.Count)].ToString(); //Här slumpas böckerna från listan. textBox1.Text = Convert.ToString(obj); } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { //Här är konstruktorn this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ + ". " + InStock; } public string GetTitel() { return titel; } } public class Roman : Bok //Här är en underclass som skriver ut alla böcker av boktypen Roman. { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; //Om boken har en True eller False i slutet visas en av texterna från denna rad. return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Novellsamling : Bok { public Novellsamling(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Novellsamling"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Tidskrift : Bok { public Tidskrift(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Tidskrift"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " "+ status; } } }

Permalänk
Medlem
Skrivet av Galaxfararen:

Programmet funkar nu men tydligen behövdes min kod kompletteras.
Just nu så laddas alla böckerna in varje gång man ska trycka på tipsa knappen och han vill att man ska ladda in 1 bok varje gång och jag vet inte hur jag ska göra det nu när programmet funkar.

Jag skulle gissa att han menar att du bara ska läsa in från filen en enda gång (förslagsvis när programmet startar) och att du sedan slumpar fram en bok ur din array varje gång du trycker på knappen.

Detta är ditt flöde just nu:

  1. Programmet startar

  2. Klick på "Tipsa"

  3. Läs in alla böcker från fil till array och slumpa fram en bok som skrivs ut

Ändra istället till något liknande detta:

  1. Programmet startar och läser in alla böcker från fil till array

  2. Klick på "Tipsa"

  3. Slumpa fram en bok ur din array och skriv ut

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Jag skulle gissa att han menar att du bara ska läsa in från filen en enda gång (förslagsvis när programmet startar) och att du sedan slumpar fram en bok ur din array varje gång du trycker på knappen.

Detta är ditt flöde just nu:

  1. Programmet startar

  2. Klick på "Tipsa"

  3. Läs in alla böcker från fil till array och slumpa fram en bok som skrivs ut

Ändra istället till något liknande detta:

  1. Programmet startar och läser in alla böcker från fil till array

  2. Klick på "Tipsa"

  3. Slumpa fram en bok ur din array och skriv ut

Och hur skulle man se till så att de läses in från min array när programmet startar i så fall.

Redigerad
Det här är vad läraren skrev

Citat:

Just nu laddas alla böcker in varje gång man trycker på tipsknappen. Det är inte en god struktur. Gör istället så att böckerna laddas in en enstaka gång när programmet startar, eller att det finns en separat knapp som laddar in böckerna. Tipsknappen ska bara plocka fram ett tips från boklistan.

Permalänk
Medlem
Skrivet av Galaxfararen:

Och hur skulle man se till så att de läses in från min array när programmet startar i så fall.

T.ex. lägger du anropet till FileLoader i konstruktorn för Form1 direkt efter anropet till InitializeComponent.

Separera logiken som läser in från fil och logiken som slumpar fram och skriver ut en bok så är det "bara" att anropa din slump/utskriftsmetod vid klick på "Tipsa" istället.

Ett annat tips är att du ändrar så att din SmallList accepterar Bok istället för string[].

Skulle inte vara Bok[]
Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
T.ex. lägger du anropet till FileLoader i konstruktorn för Form1 direkt efter anropet till InitializeComponent.

Separera logiken som läser in från fil och logiken som slumpar fram och skriver ut en bok så är det "bara" att anropa din slump/utskriftsmetod vid klick på "Tipsa" istället.

Ett annat tips är att du ändrar så att din SmallList accepterar Bok[] istället för string[].

Så om jag uppfattar det du säger rätt så ska jag T.ex. ta all kod från

public void FileLoader()

och få in den i konstruktorn

Permalänk
Medlem
Skrivet av Galaxfararen:

Så om jag uppfattar det du säger rätt så ska jag T.ex. ta all kod från

public void FileLoader()

och få in den i konstruktorn

Njae, behåll metoden, men banta ner den så att den bara sköter inläsning från fil till array. Sedan skapar du en ny metod som sköter själva tipsandet.

Pseudokod:

FileLoader: För varje rad i filen: Skapa en "bok" av rätt typ och lägg till i SmallList SlumpaTips: Slumpa fram en bok ur SmallList Skriv ut bokens information

Anropa FileLoader i konstruktorn för Form1 och anropa sedan SlumpaTips i "klickhanteraren".

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Njae, behåll metoden, men banta ner den så att den bara sköter inläsning från fil till array. Sedan skapar du en ny metod som sköter själva tipsandet.

Pseudokod:

FileLoader: För varje rad i filen: Skapa en "bok" av rätt typ och lägg till i SmallList SlumpaTips: Slumpa fram en bok ur SmallList Skriv ut bokens information

Anropa FileLoader i konstruktorn för Form1 och anropa sedan SlumpaTips i "klickhanteraren".

Min kod ser ut så här just nu kan jag vara på rätt spår eller behöver jag göra på ett annat sätt ?

namespace windows_forms_uppgift { public partial class Form1 : Form { List<Bok> BigList = new List<Bok>(); //Här skapas 2 listor för att hålla böcker & strängar List<string[]> SmallList = new List<string[]>(); public Form1() { InitializeComponent(); FileLoader(); } private void button1_Click(object sender, EventArgs e) //Här är "tipsa mig" knappen som när man trycker på så tas man till { // "FileLoader" eller resten av programmet. Random random = new Random(); string obj = BigList[random.Next(BigList.Count)].ToString(); //Här slumpas böckerna från listan. textBox1.Text = Convert.ToString(obj); } public void FileLoader() { if (File.Exists("texter.txt")) //Här kollas det om filen existerar med namnet i parantesen. { List<string> itemSaver = new List<string>(); StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); SmallList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]); //Här typomvandlas strängar till bool. switch (vektor[2]) { //Här tas alla titlar, skribenter, boktyper och om de har True eller False i slutet. case "Roman": BigList.Add(new Roman(vektor[0], vektor[1], vektor[2], InStock)); break; case "Novellsamling": BigList.Add(new Novellsamling(vektor[0], vektor[1], vektor[2], InStock)); break; case "Tidskrift": BigList.Add(new Tidskrift(vektor[0], vektor[1], vektor[2], InStock)); break; default: break; } /*Random random = new Random(BigList.Count); //Här är kodstycket som slumpar fram böckerna. string obj = BigList[random.Next(BigList.Count)].ToString(); //Här slumpas böckerna från listan. textBox1.Text = Convert.ToString(obj); */ } } } } public class Bok { public string typ; public string titel; public string författare; public bool InStock; public Bok(string titel, string författare, string typ,bool InStock) { //Här är konstruktorn this.typ = typ; this.titel = titel; this.författare = författare; this.InStock = InStock; } public override string ToString() { return titel + ". " + författare + ". " + typ + ". " + InStock; } public string GetTitel() { return titel; } } public class Roman : Bok //Här är en underclass som skriver ut alla böcker av boktypen Roman. { public Roman(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Roman"; var status = InStock ? "Boken finns" : "Boken finns inte"; //Om boken har en True eller False i slutet visas en av texterna från denna rad. return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Novellsamling : Bok { public Novellsamling(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Novellsamling"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " " + status; } } public class Tidskrift : Bok { public Tidskrift(string titel, string författare, string typ, bool InStock) : base(titel, författare, typ, InStock) { } public override string ToString() { typ = "Tidskrift"; var status = InStock ? "Boken finns" : "Boken finns inte"; return "\"" + titel + "\" " + "av " + författare + ". (" + typ + ")" + " "+ status; } } }

Permalänk
Medlem
Skrivet av Galaxfararen:

Min kod ser ut så här just nu kan jag vara på rätt spår eller behöver jag göra på ett annat sätt ?

Ja, du ser ut att vara på rätt spår. Dock ser det ut som att du kan ta bort SmallList helt och hållet då du aldrig gör något med den. Jag hade missat att du hade BigList som ju innehåller de inlästa böckerna.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Ja, du ser ut att vara på rätt spår. Dock ser det ut som att du kan ta bort SmallList helt och hållet då du aldrig gör något med den. Jag hade missat att du hade BigList som ju innehåller de inlästa böckerna.

Så jag ska ta bort small list och skriva dit BigList där SmallList finns för om jag gör på det viset så funkar inte vektorn i detta kodstycke

foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); BigList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]);

eller ska den (Vektor) kodstycket bort

Permalänk
Medlem
Skrivet av Galaxfararen:

Så jag ska ta bort small list och skriva dit BigList där SmallList finns för om jag gör på det viset så funkar inte vektorn i detta kodstycke

foreach (string b in itemSaver) { string[] vektor = b.Split(new string[] { "###" }, StringSplitOptions.None); BigList.Add(vektor); bool InStock = Convert.ToBoolean(vektor[3]);

eller ska den (Vektor) kodstycket bort

Det enda du gör med SmallList är att spara vektorn, vilket är helt onödigt. Om du tar bort den raden bör det inte påverka programmet ö.h.t.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Citat:

noMad17
Det enda du gör med SmallList är att spara vektorn, vilket är helt onödigt. Om du tar bort den raden bör det inte påverka programmet ö.h.t.

Då vet jag det, men i nuläget vet jag inte skulle jag skapa en ny public kodblock utanför den public fileloadern jag har och ska jag använda mig av en next metod för att få böckerna 1 och 1 eller har du någon annan ide ?

Permalänk
Medlem
Skrivet av Galaxfararen:

Då vet jag det, men i nuläget vet jag inte skulle jag skapa en ny public kodblock utanför den public fileloadern jag har och ska jag använda mig av en next metod för att få böckerna 1 och 1 eller har du någon annan ide ?

Som jag har tolkat uppgiften borde det duga som det är nu, men det är väl en bra övning att skapa en metod för att hämta böckerna och istället anropa den när du klickar på knappen.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W