Trädvy Permalänk
Medlem
Registrerad
Maj 2019

Programmering 2, Guldkortet

Hej!

Jag håller på med en uppgift i Virtual studio (C#) som jag inte blir klok på, och jag får ingen guidning av min lärare som gör att jag förstår vad jag missar.

Tanken är att jag ska skapa ett server-program som kan ta emot en sträng från ett klient-program och dela upp strängen och kolla så att två externa txt-filer med strängar, som ska läggas in i listklasser i serverprogrammet, stämmer överens med den sträng som klient-programmet skickat.

Har hållit på med eländet hela dagen och stirrat mig blind på koden. Jag vill bara förstå vad jag gör fel och hur jag ska få programmet att korrekt jämföra om den inskickade strängen matchar med strängarna i listorna från txt-filerna. Som det är nu så blir det i textboxen upprepade felmeddelanden "Kundnumret hittas ej!" även om kundnumret ska finnas i listan över kundnumren...

Tacksam för all hjälp...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Guldkortet2
{
public partial class Guldkortet : Form
{
// Skapar en anslutning mellan detta program, servern, och programmet NOS_Export, klienten
TcpClient klient = new TcpClient();
TcpListener lyssnare;
// Centraldatorns portnummer
int port = 12345;

// Skapar en lista med Kunder-klassen
List<Kunder> kundListan = new List<Kunder>();
List<string> sparadeKunder = new List<string>();

// Skapar en lista med Kort-klassen
List<Kort> kortListan = new List<Kort>();
List<string> sparadeKort = new List<string>();

// Initierar texten som ska visas i textrutan
string nosMeddelande;

public Guldkortet()
{
// Laddar den kompilerade sidan av komponenten
InitializeComponent();

string kund = "";
string kort = "";

// Skapar en stränglista dit alla inlägg i kundlista.txt-filen skall hamna
List<string> kundSträngLista = new List<string>();
// Skapar en stränglista dit alla inlägg i kortlista.txt-filen skall hamna
List<string> kortSträngLista = new List<string>();

// Om kundlista.txt-filen finns i samma mapp som programmet så läggs alla inlägg till i stränglistan
// annars talar programmet om att listan inte kan hittas
if (File.Exists("kundlista.txt"))
{
// Skapar en streamreader-klass som läser in värdena från kundlista.txt-filen
StreamReader kundReader = new StreamReader("kundlista.txt", Encoding.Default, true);

// Medan det finns olästa värden i kundlista.txt-filen så läggs varje rad till i stränglistan
while ((kund = kundReader.ReadLine()) != null)
sparadeKunder.Add(kund);

// Strängvariablerna för kundnummer, namn och stad
// separeras utifrån tecknena ### och läggs till en och en i en strängvektor
foreach (string sparadKund in sparadeKunder)
{
string[] kundVektor = sparadKund.Split(new string[] { "###" }, StringSplitOptions.None);

kundListan.Add(new Kunder(kundVektor[0], kundVektor[1], kundVektor[2]));

// Om kortlista.txt-filen finns i samma mapp som programmet så läggs alla inlägg till i stränglistan
// annars talar programmet om att listan inte kan hittas
if (File.Exists("kortlista.txt"))
{
// Skapar en streamreader-klass som läser in värdena från kortlista.txt-filen
StreamReader kortReader = new StreamReader("kortlista.txt", Encoding.Default, true);

// Medan det finns olästa värden i kortlista.txt-filen så läggs varje rad till i stränglistan
while ((kort = kortReader.ReadLine()) != null)
sparadeKort.Add(kort);

// Strängvariablerna för kortnummer och korttyp
// separeras utifrån tecknena ### och läggs till en och en i en strängvektor
// för varje Kort-underklass dvs korttyp Dunderkatt, Kristallhäst, Överpanda eller Eldtomat
foreach (string sparatKort in sparadeKort)
{
string[] kortVektor = sparatKort.Split(new string[] { "###" }, StringSplitOptions.None);

if (kortVektor[1] == "Dunderkatt")
{
kortListan.Add(new Dunderkatt(kortVektor[0], kortVektor[1]));
}

else if (kortVektor[1] == "Kristallhäst")
{
kortListan.Add(new Kristallhäst(kortVektor[0], kortVektor[1]));
}

else if (kortVektor[1] == "Överpanda")
{
kortListan.Add(new Överpanda(kortVektor[0], kortVektor[1]));
}

else if (kortVektor[1] == "Eldtomat")
{
kortListan.Add(new Eldtomat(kortVektor[0], kortVektor[1]));
}

else
{
Console.WriteLine("Något har gått snett. Kontakta supporten.");
}
}
}
}
}
else
{
Console.WriteLine("\nAnvändarlistan står inte att finna. Kontakta supporten.");
}
}

// Knappen för att ansluta till klienten NOS_Export
private void btnStartaServer_Click(object sender, EventArgs e)
{
try
{
lyssnare = new TcpListener(IPAddress.Any, port);
lyssnare.Start();
}
catch (Exception error)
{
MessageBox.Show(error.Message, Text);
return;
}
btnStartaServer.Enabled = false; // Det ska inte gå att starta mer än en gång

StartaMottagning();
}

// Den asynkrona metoden för att starta anslutningen
public async void StartaMottagning()
{
try
{
// exekveringen returneras när operationen påbörjats
// när operationen är klar återupptas exekveringen
klient = await lyssnare.AcceptTcpClientAsync();
}
catch (Exception error)
{
MessageBox.Show(error.Message, Text);
return;
}

StartaLäsning(klient);
}
// Startar läsning av NOS_Export-programmets skickade meddelande
public async void StartaLäsning(TcpClient k)
{
byte[] buffert = new byte[1024];

int n = 0;
try
{
n = await k.GetStream().ReadAsync(buffert, 0, buffert.Length);
nosMeddelande = Encoding.Unicode.GetString(buffert, 0, n);

// Delar meddelandet efter bindestrecket och skapar en stränglista
string[] nosVektor = nosMeddelande.Split('-');
List<string> nosLista = new List<string>();

// Lägger in varje del av meddelandet som en egen sträng i stränglistan
foreach (string nosMeddelande in nosVektor)
{
nosLista.Add(nosMeddelande);
}

// För varje sträng i listan över kunder där kundnumret är samma som
// första delen av meddelandet från NOS_Export, alltså kundnumret
// Och för varje sträng i listan över kort där kortnumret är samma
// som andra delen av meddelandet från NOS_Export, alltså kortnumret
// Så skrivs ett gratulationsmeddelande ut i textboxen
// Annars talar programmet om att kund- eller kortnumret ej stod att finna
foreach (string kundNummer in sparadeKunder)
{
if (nosLista[0] == kundNummer)
{
foreach (string kortNummer in sparadeKort)
{
if (nosLista[1] == kortNummer)
{
tbxMeddelande.AppendText("Grattis till ditt guldkort!");
}
else
{
tbxMeddelande.AppendText("Detta är inte ett guldkort!");
}
}
}
else
{
tbxMeddelande.AppendText("Kundnumret hittas ej!");
}
}
}
catch (Exception error)
{
MessageBox.Show(error.Message, Text);
return;
}
StartaLäsning(k);
}

private void tbxMeddelande_TextChanged(object sender, EventArgs e)
{

}

private void pictureBox1_Click(object sender, EventArgs e)
{

}
}

// ===========================================KLASS========================================
// Kunder, en klass av sträng-objekt, med tillhörande kundnummer, namn och stad
// ========================================================================================

public class Kunder
{
public string KundNummer;
public string Namn;
public string Stad;

// ======================================KONSTRUKTOR=========================================
// Ser till att alla kunder har en, av kundlistan definierad, kundnummer, namn och stad
// ==========================================================================================

public Kunder(string inDataKundNummer, string inDataNamn, string inDataStad)
{
KundNummer = inDataKundNummer;

Namn = inDataNamn;

Stad = inDataStad;
}

public override string ToString()
{
return KundNummer + ' ' + Namn + ' ' + Stad;
}
}

// ===========================================KLASS========================================
// Kort, en klass av sträng-objekt, med tillhörande kortnummer och korttyp
// ========================================================================================

public class Kort
{
public string KortNummer;
public string KortTyp;

// ======================================KONSTRUKTOR=========================================
// Ser till att alla kort har en, av kortlistan definierad, kortnummer och korttyp
// ==========================================================================================

public Kort(string inDataKortNummer, string inDataKortTyp)
{
KortNummer = inDataKortNummer;
KortTyp = inDataKortTyp;
}
}

// =====================================UNDERKLASS========================================
// Det finns fyra sorters kort som kortlistan kan mata in i kort-klassen, Dunderkatt,
// Kristallhäst, Överpanda eller Eldtomat. De innehåller även ärvda konstruktorer från
// Kort-klassen
// =======================================================================================

class Dunderkatt : Kort
{
public Dunderkatt(string inDataKortNummer, string inDataKortTyp) :
base(inDataKortNummer, inDataKortTyp)
{
inDataKortTyp = "Dunderkatt";
}
public override string ToString()
{
return base.ToString();
}
}
class Kristallhäst : Kort
{
public Kristallhäst(string inDataKortNummer, string inDataKortTyp) :
base(inDataKortNummer, inDataKortTyp)
{
inDataKortTyp = "Kristallhäst";
}
public override string ToString()
{
return base.ToString();
}
}
class Överpanda : Kort
{
public Överpanda(string inDataKortNummer, string inDataKortTyp) :
base(inDataKortNummer, inDataKortTyp)
{
inDataKortTyp = "Överpanda";
}
public override string ToString()
{
return base.ToString();
}
}
class Eldtomat : Kort
{
public Eldtomat(string inDataKortNummer, string inDataKortTyp) :
base(inDataKortNummer, inDataKortTyp)
{
inDataKortTyp = "Eldtomat";
}
public override string ToString()
{
return base.ToString();
}
}
}

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

Att posta kod på så här många rader och säga fixa problemet är ungefär som att ta bild på en bilmotor och säga "den startar inte".
Sedan hjälper det inte att koden inte är i formateringtaggar eller identeradad.

Då du suttit med koden och hållt på så hade det underlättat om du enbart delat den kodraden/metoden som felar tillsammans med vad du testat, vad som händer och vad du förväntar dig ska hända.
Det underlättar för de som vill hjälpa dig i rätt riktning.

Att posta kod som är orelevant till problemet förvirrar bara.

Edit:
Om du inte vet hur man använder debuggen är det dags att lära dig.
Jag rekommenderar dig att sätta en breakpoint i metoden som felar, t.ex innan loopen där kundnummer ska jämförs.
Starta med debuggern F5, kör det du ska göra. Programmet kommet att pausa och du kan stega igenom din kod med F11 och kolla vad variablerna har för värden, har de fel värden så börjar felet innan anropet. Sätt en ny breakpoint där och kolla varför variablerna är fel, fortsätt bakåt på detta vis tills du hittar vart buggen är.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Dec 2015
Skrivet av themforests:

Har hållit på med eländet hela dagen och stirrat mig blind på koden.

Du ska inte stirra på koden, du ska debugga den. Sätt en breakpoint där strängen kommer från klienten och stega igenom koden och se varför jämförelsen inte fungerar.

Är nosMeddelande korrekt?

Är sparadeKunder korrekt?

Är sparadeKort korrekt?

Koden är extremt svårläst, men det ser ut som om strängarna i sparadeKunder kommer direkt från textfilen och därmed aldrig kommer att vara lika med första elementet i nosLista.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019
Skrivet av KAD:

Du ska inte stirra på koden, du ska debugga den. Sätt en breakpoint där strängen kommer från klienten och stega igenom koden och se varför jämförelsen inte fungerar.

Är nosMeddelande korrekt?

Är sparadeKunder korrekt?

Är sparadeKort korrekt?

Koden är extremt svårläst, men det ser ut som om strängarna i sparadeKunder kommer direkt från textfilen och därmed aldrig kommer att vara lika med första elementet i nosLista.

Hej, ja jag märkte det till slut. Men hur kan jag skapa en metod som söker genom kundListan och matchar första elementet i nosLista? Såsom jag har skrivit söker den genom fel lista, dvs strängarna direkt från textfilen.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019
Skrivet av zaibuf:

Att posta kod på så här många rader och säga fixa problemet är ungefär som att ta bild på en bilmotor och säga "den startar inte".
Sedan hjälper det inte att koden inte är i formateringtaggar eller identeradad.

Då du suttit med koden och hållt på så hade det underlättat om du enbart delat den kodraden/metoden som felar tillsammans med vad du testat, vad som händer och vad du förväntar dig ska hända.
Det underlättar för de som vill hjälpa dig i rätt riktning.

Att posta kod som är orelevant till problemet förvirrar bara.

Edit:
Om du inte vet hur man använder debuggen är det dags att lära dig.
Jag rekommenderar dig att sätta en breakpoint i metoden som felar, t.ex innan loopen där kundnummer ska jämförs.
Starta med debuggern F5, kör det du ska göra. Programmet kommet att pausa och du kan stega igenom din kod med F11 och kolla vad variablerna har för värden, har de fel värden så börjar felet innan anropet. Sätt en ny breakpoint där och kolla varför variablerna är fel, fortsätt bakåt på detta vis tills du hittar vart buggen är.

Skickades från m.sweclockers.com

Jag vet inte hur en indenterar kod i tråden. Annars hade jag gärna gjort det.
Jag satte en breakpoint, tack för tips, och märkte att det var ett inkorrekt värde som jämfördes. Mitt problem nu är att försöka komma åt kundlistan som jag har skapat utifrån textfilen och jämföra det första elementet i kundklassen med första elementet i nosLista och sen göra samma med kortklassen och andra elementet i nosLista.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av themforests:

Jag vet inte hur en indenterar kod i tråden. Annars hade jag gärna gjort det.
Jag satte en breakpoint, tack för tips, och märkte att det var ett inkorrekt värde som jämfördes. Mitt problem nu är att försöka komma åt kundlistan som jag har skapat utifrån textfilen och jämföra det första elementet i kundklassen med första elementet i nosLista och sen göra samma med kortklassen och andra elementet i nosLista.

Du sätter din kod innanför [ code ] [ / code] taggar. Sen kan du kolla så att det ser läsbart ut, lägga till lite tabbar där det behövs.

Bra att du hittat felet! Då är ju halva problemet löst, för att komma åt kundlistan får du då 1) sätta den som en property i classen du skapat en instans och jobbar i. 2) Skicka in som en parameter i en metod.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019
Skrivet av zaibuf:

Du sätter din kod innanför [ code ] [ / code] taggar. Sen kan du kolla så att det ser läsbart ut, lägga till lite tabbar där det behövs.

Bra att du hittat felet! Då är ju halva problemet löst, för att komma åt kundlistan får du då 1) sätta den som en property i classen du skapat en instans och jobbar i. 2) Skicka in som en parameter i en metod.

Tack för att du svarar mig! Förlåt, jag vet inte hur jag sätter kundlistan som property... misstänker att det där är pudelns kärna.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

Posta din kod igen och använd [ code ] [ / code]