Permalänk
Medlem

C# uppgift, Behöver hjälp!!!

Min uppgift är att skapa en tippsmaskin som tipsar om böcker ur en textfil. Jag fick det att fungera men läraren menar att fileloader som min metod heter ska vara en importerings klass, jag har försökt att fixa detta men stöter på massa problem. Kanske kan någon trevlig som kan ge bra råd om hur jag kan lösa detta. Jag kan även lägga in texten när jag ändrar vilka fel jag får!

using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.IO; namespace Tipsmaskinen { public partial class Form1 : Form { List<Bok> Biblotek = new List<Bok>(); public Form1() { InitializeComponent(); Fileloader(); //anropar metod för att ladda upp från textfil } private void Button1_Click(object sender, EventArgs e) { Bok randomBok = getRandomBok(); TipsBox.Text = randomBok.ToString(); //i tipsbox returneras strängen } public Bok getRandomBok() { Random rand = new Random(); //skapar en random för att slumpa tal eller strängar return Biblotek[rand.Next(Biblotek.Count)]; //next slumpar enligt hur många element det finns i biblotek } public void Fileloader() { if (File.Exists("texter.txt")) { var itemSaver = new List<string>(); //Skapa lista där böcker ska sparas StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); switch (vektor[2]) { case "Novellsamling": Biblotek.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Roman": Biblotek.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": Biblotek.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } } } } private void TipsBox_TextChanged(object sender, EventArgs e) { } private void Tipsmaskinen(object sender, EventArgs e) { } private void Button2_Click(object sender, EventArgs e) { Application.Exit(); } } } public class Bok // Class Bok som har tre egenskaper { public string title; //titel public string author; //Författare public string typ; //Vilken typ protected Bok(string title, string author, string typ) //declarerar konstruktion i klassen { this.title = title; this.author = author; this.typ = typ; } public override string ToString() { return title + " " + author + " " + typ; } public string GetTitle() //Get metod för att returnera värde { return title; //returnerar titel } } class Novellsamling : Bok //Subclass Novellsamling som ärver från Mainclassen bok { public Novellsamling(string title, string author, string typ) : base(title, author, typ) { typ = "Novellsamling"; } public override string ToString() //override ger ett nytt beteende genom arv { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Novellsamlingar finns på hylla N."; } } class Roman : Bok //Subclass Roman som ärver egenskaper från Mainclassen Bok { public Roman(string title, string author, string typ) : base(title, author, typ) { typ = "Roman"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Roman böcker finns på hylla R."; } } class Tidskrift : Bok //subclass Tidskrift som ärver egenskaper från Mainclassen Bok { public Tidskrift(string title, string author, string typ) : base(title, author, typ) { typ = "Tidskrift"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Tidskrifter finns på hylla T."; ; } }

Permalänk
Medlem

Och vad är det för problem du får då?

Använd gärna code-taggar också:
[code]
kod här
[/code]

Annars förloras all indentering och koden blir väldigt svårt att läsa. Det verkar också blivit något knas när du klistrat in koden eftersom varannan rad är tom, lättare kod att läsa = fler som orkar läsa den

Permalänk
Medlem

Bibliotek*

Permalänk
Medlem
Skrivet av perost:

Och vad är det för problem du får då?

Använd gärna code-taggar också:
[code]
kod här
[/code]

Annars förloras all indentering och koden blir väldigt svårt att läsa. Det verkar också blivit något knas när du klistrat in koden eftersom varannan rad är tom, lättare kod att läsa = fler som orkar läsa den

Jag har försökt att göra fileloader till class istället för metod men blir förvirrad

namespace MinTipsMaskin { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { Bok randomBok = GetRandomBok(); TipsBox.Text = randomBok.ToString(); //i tipsbox returneras strängen } public Bok GetRandomBok() { Random rand = new Random(); //skapar en random för att slumpa tal eller strängar return Biblotek[rand.Next(Biblotek.Count)]; //next slumpar enligt hur många element det finns i biblotek } class FileLoader { List<Bok> Biblotek = new List<Bok>(); public FileLoader() { if (File.Exists("texter.txt")) { var itemSaver = new List<string>(); //Skapa lista där böcker ska sparas StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); switch (vektor[2]) { case "Novellsamling": Biblotek.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Roman": Biblotek.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": Biblotek.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } } } } } private void TipsBox_TextChanged(object sender, EventArgs e) { } private void Tipsmaskinen(object sender, EventArgs e) { } private void Button2_Click(object sender, EventArgs e) { Application.Exit(); } } } public class Bok // Class Bok som har tre egenskaper { public string title; //titel public string author; //Författare public string typ; //Vilken typ protected Bok(string title, string author, string typ) //declarerar konstruktion i klassen { this.title = title; //"this" nyckelordet kallas pekaren som representerar förekomst av en klass eller struktur, pekaren används inom icke-statiska metoder. this.author = author; //Pekaren andvänds även på dolda för att separera fält med parameterar this.typ = typ; } public override string ToString() { return title + " " + author + " " + typ; } public string GetTitle() //Get metod för att returnera värde { return title; //returnerar titel } } class Novellsamling : Bok //Subclass Novellsamling som ärver från Mainclassen bok { public Novellsamling(string title, string author, string typ) : base(title, author, typ) //base används för att få tillgång till medlemmar av basklassen { typ = "Novellsamling"; } public override string ToString() //override ger ett nytt beteende genom arv { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Novellsamlingar finns på hylla N."; } } class Roman : Bok //Subclass Roman som ärver egenskaper från Mainclassen Bok { public Roman(string title, string author, string typ) : base(title, author, typ) { typ = "Roman"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Roman böcker finns på hylla R."; } } class Tidskrift : Bok //subclass Tidskrift som ärver egenskaper från Mainclassen Bok { public Tidskrift(string title, string author, string typ) : base(title, author, typ) { typ = "Tidskrift"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Tidskrifter finns på hylla T."; ; } }

Permalänk

@Rimanda: Jag tolkar det som att din lärare vill att du flyttar all koddelar som inte måste vara i själva form delen till egen/egna filer.
Och att dessa sedan importeras in med ett using statement.

Som i din kod längst upp

using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.IO;

men att du har har en egen namespace och namn som du importerar

using DittNamn.Models

Och när du skapar en ny class i ditt program så lägger du den i en folder som heter Models då bör den få ett namespace liknade ovan

public namespace DittNamn.Models { public class FileUploader { public void Load() { //Koden för din filuppladdare här } } }

Sedan under Button1_Click (som du bör byta namn på så du vet vad den knappen gör, tex GetRandomBokTip_Click)

var fileUploader = new FileUploader(); fileUploader.Load();

Du skulle även kunna göra funktionen statisk så du slipper initiera den (new FileUploader()), men gissar att ni inte kommit så långt ännu varav detta bör fungera utmärkt så länge.

Hoppas detta hjälper dig en bit på vägen.

Permalänk
Medlem
Skrivet av JohanOlof:

@Rimanda: Jag tolkar det som att din lärare vill att du flyttar all koddelar som inte måste vara i själva form delen till egen/egna filer.
Och att dessa sedan importeras in med ett using statement.

Som i din kod längst upp

using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.IO;

men att du har har en egen namespace och namn som du importerar

using DittNamn.Models

Och när du skapar en ny class i ditt program så lägger du den i en folder som heter Models då bör den få ett namespace liknade ovan

public namespace DittNamn.Models { public class FileUploader { public void Load() { //Koden för din filuppladdare här } } }

Sedan under Button1_Click (som du bör byta namn på så du vet vad den knappen gör, tex GetRandomBokTip_Click)

var fileUploader = new FileUploader(); fileUploader.Load();

Du skulle även kunna göra funktionen statisk så du slipper initiera den (new FileUploader()), men gissar att ni inte kommit så långt ännu varav detta bör fungera utmärkt så länge.

Hoppas detta hjälper dig en bit på vägen.

Ska testa detta på en gång, tack för ditt råd.

Permalänk
Medlem
Skrivet av JohanOlof:

@Rimanda: Jag tolkar det som att din lärare vill att du flyttar all koddelar som inte måste vara i själva form delen till egen/egna filer.
Och att dessa sedan importeras in med ett using statement.

Som i din kod längst upp

using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.IO;

men att du har har en egen namespace och namn som du importerar

using DittNamn.Models

Och när du skapar en ny class i ditt program så lägger du den i en folder som heter Models då bör den få ett namespace liknade ovan

public namespace DittNamn.Models { public class FileUploader { public void Load() { //Koden för din filuppladdare här } } }

Sedan under Button1_Click (som du bör byta namn på så du vet vad den knappen gör, tex GetRandomBokTip_Click)

var fileUploader = new FileUploader(); fileUploader.Load();

Du skulle även kunna göra funktionen statisk så du slipper initiera den (new FileUploader()), men gissar att ni inte kommit så långt ännu varav detta bör fungera utmärkt så länge.

Hoppas detta hjälper dig en bit på vägen.

Fileloader ska vara en egen klass som innehåller en lista. En klass där alla böcker sparas och där man kan hämta ut böcker från. Vid knapptryck ska random koden vara men då hamnar listan utanför. Alltså om jag tar bort metoden och lägger hela random koden i knappen. Hur kan jag få listan att fungera? Tacksam om du vill ge mig förslag.

Skickades från m.sweclockers.com

Permalänk
Medlem

Ungefär så här ska det vara men vet inte hur jag ska komma åt listan

namespace MinTipsMaskin { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { Random rand = new Random(); //skapar en random för att slumpa tal eller strängar string objekt = Biblotek[rand.Next(Biblotek.Count)].ToString(); //next slumpar enligt hur många element det finns i biblotek TipsBox.Text = Convert.ToString(objekt); //i tipsbox returneras strängen } class FileLoader { private List<Bok> Biblotek; public FileLoader() { Biblotek = new List<Bok>(); if (File.Exists("texter.txt")) { var itemSaver = new List<string>(); //Skapa lista där böcker ska sparas StreamReader reader = new StreamReader("texter.txt", Encoding.Default, true); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } reader.Close(); foreach (string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); switch (vektor[2]) { case "Novellsamling": Biblotek.Add(new Novellsamling(vektor[0], vektor[1], vektor[2])); break; case "Roman": Biblotek.Add(new Roman(vektor[0], vektor[1], vektor[2])); break; case "Tidskrift": Biblotek.Add(new Tidskrift(vektor[0], vektor[1], vektor[2])); break; default: break; } } } } } private void TipsBox_TextChanged(object sender, EventArgs e) { } private void Tipsmaskinen(object sender, EventArgs e) { } private void Button2_Click(object sender, EventArgs e) { Application.Exit(); } } } public class Bok // Class Bok som har tre egenskaper { public string title; //titel public string author; //Författare public string typ; //Vilken typ protected Bok(string title, string author, string typ) //declarerar konstruktion i klassen { this.title = title; //"this" nyckelordet kallas pekaren som representerar förekomst av en klass eller struktur, pekaren används inom icke-statiska metoder. this.author = author; //Pekaren andvänds även på dolda för att separera fält med parameterar this.typ = typ; } public override string ToString() { return title + " " + author + " " + typ; } public string GetTitle() //Get metod för att returnera värde { return title; //returnerar titel } } class Novellsamling : Bok //Subclass Novellsamling som ärver från Mainclassen bok { public Novellsamling(string title, string author, string typ) : base(title, author, typ) //base används för att få tillgång till medlemmar av basklassen { typ = "Novellsamling"; } public override string ToString() //override ger ett nytt beteende genom arv { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Novellsamlingar finns på hylla N."; } } class Roman : Bok //Subclass Roman som ärver egenskaper från Mainclassen Bok { public Roman(string title, string author, string typ) : base(title, author, typ) { typ = "Roman"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Roman böcker finns på hylla R."; } } class Tidskrift : Bok //subclass Tidskrift som ärver egenskaper från Mainclassen Bok { public Tidskrift(string title, string author, string typ) : base(title, author, typ) { typ = "Tidskrift"; } public override string ToString() { return title + " " + "skriven av " + author + " " + " " + "(" + typ + ")." + " Tidskrifter finns på hylla T."; ; } }

Permalänk
Medlem

@Rimanda: Ett problem med din FileLoader-klass är att den just nu sköter både inläsning från fil samt att den representerar ditt "bibliotek". Men det är ju inte vad namnet på klassen säger att den ska göra, så det blir lite förvirrat gällande vilken klass som gör vad.

Jag skulle föreslå att du istället lägger till ytterligare en klass som representerar ett bibliotek, som har metoder för att lägga till och hämta ut böcker. FileLoader kan då enbart ta hand om inläsningen från fil, genom att den har en metod som konstruerar och returnerar ett bibliotek som lästs in från fil.

Det går förstås att kombinera allt i en klass genom att låta biblioteks-klassen sköta inläsningen själv, men det är mer flexibelt att implementera det som en separat klass så att man enkelt kan lägga till fler sätt att skapa bibliotek på om det skulle behövas.

Permalänk
Medlem
Skrivet av perost:

@Rimanda: Ett problem med din FileLoader-klass är att den just nu sköter både inläsning från fil samt att den representerar ditt "bibliotek". Men det är ju inte vad namnet på klassen säger att den ska göra, så det blir lite förvirrat gällande vilken klass som gör vad.

Jag skulle föreslå att du istället lägger till ytterligare en klass som representerar ett bibliotek, som har metoder för att lägga till och hämta ut böcker. FileLoader kan då enbart ta hand om inläsningen från fil, genom att den har en metod som konstruerar och returnerar ett bibliotek som lästs in från fil.

Det går förstås att kombinera allt i en klass genom att låta biblioteks-klassen sköta inläsningen själv, men det är mer flexibelt att implementera det som en separat klass så att man enkelt kan lägga till fler sätt att skapa bibliotek på om det skulle behövas.

Håller med.

@Rimanda
Läs på lite här https://sv.wikipedia.org/wiki/SOLID , S:et i solid är väldigt viktigt. Speciellt när man bygger mer komplexa system.

Du kan även tipsa din lärare om det

Permalänk

@Rimanda:
Tanken är att den enda koden som skall finnas under Button1_Click skall vara att en slumpmässig bok hämtas.
Så något följande:

private void Button1_Click(object sender, EventArgs e) { var fileLoader = new FileLoader(); string randomBook = fileLoader.GetRandomBook(); TipsBox.Text = Convert.ToString(randomBook); }

Då lägger du all logik i själva FileLoader klassen och det enda Button_Click behöver ha koll på är att initiera klassen, köra metoden GetRandomBook och veta att denna metod returnerar en sträng som sedan skall sparas ner i TipsBox.

Du kan förkorta det ännu mera:

private void Button1_Click(object sender, EventArgs e) { var fileLoader = new FileLoader(); TipsBox.Text = Convert.ToString(fileLoader.GetRandomBook()); }

I FileLoader behöver du nu lägga till GetRandomBook metoden, den skall hämta texter.txt, gå igenom dem och spara ner värdet i en lista med böcker och sedan returnera en slumpmässig bok.

Så din konstruktör bör enbart initiera din lista och inget annat

public FileLoader() { Biblotek = new List<Bok>(); }

Sedan gör du resten i metoden GetRandomBook.

Hoppas detta hjälper dig utan att det känns som jag löser problemet åt dig.
När du får ovan att fungera kan du sedan flytta ut hela FileLoader koden och lägga den i en egen fil.