Permalänk

Binärsökning bug

Hej jag har ett problem med min sökning det är nån typ utav bug och alla listor hittas inte, programmet går helt enkelt bara inte igenom alla listor med vet inte riktigt hur jag ska lösa detta.

string söka;
Console.Clear();

if (lista.Count > 0)
{

Console.WriteLine("Sök efter en titel på ditt inlägg");

söka = Console.ReadLine();
int left = 0;
int right = lista.Count - 1;
int middle;
while (left <= right)

{
middle = (left + right) / 2;
int copyList = söka.CompareTo(lista[middle][0].ToString());
element
if (copyList == 0)

{
foreach (var item in lista[middle])

{
Console.WriteLine("--------------------------------------------------");
Console.WriteLine(item.ToString());

}
Console.WriteLine("Din sökning hittades");
break;

{
left = middle + 1; // kollar vänster efter en matchning
}

else //så länge coopylist är mindre än 0 fortsätt att söka

{
right = middle - 1; //kollar höger efter en matchning
}

}
if (left > right)
Console.WriteLine("Sökningen hittades inte");

}

else
Console.WriteLine("bloggen är tom, försök att göra ett inlägg");

Permalänk
Medlem

Gör det läsbart först. Varför står det t.ex. "element" mitt i din kod? och använd inte åäö utanför strängar.

Permalänk

Console.WriteLine("Skriv in ett sökord");

string soka;

Console.Clear();

if (lista.Count > 0)

{

Console.WriteLine("Sök efter en titel på ditt inlägg");

soka = Console.ReadLine();

int left = 0;

int right = lista.Count - 1;

int middle;

while (left <= right)

{

middle = (left + right) / 2;

int copyList = soka.CompareTo(lista[middle][0].ToString());

if (copyList == 0)

{

foreach (var item in lista[middle])

{

Console.WriteLine(item.ToString());

}

Console.WriteLine("Din sökning hittades");

break;

}

if (copyList > 0)

{

left = middle + 1;

}

else

{

right = middle - 1;

}

}

if (left > right)

Console.WriteLine("Sökningen hittades inte");

}

else

Console.WriteLine("bloggen är tom, försök att göra ett inlägg");

Permalänk

vet inte riktigt hur man kan göra en kod mer lätt läst än detta?

Permalänk
Medlem
Skrivet av holykaigrenne:

vet inte riktigt hur man kan göra en kod mer lätt läst än detta?

Vettig indentering hjälper mycket för att förbättra läsbarheten.
Om frågan bara gäller forumet så sätt [ code] [ /code] runt (utan mellanslagen)

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av holykaigrenne:

vet inte riktigt hur man kan göra en kod mer lätt läst än detta?

Indentering gör koden mycket mer lättläst.
Det är helt enkelt lätt att se vart satser börjar och slutar.
Beroende på vilken IDE du använder, om du använder en IDE så kan det finnas funktionalitet för att genom ett knappkommando automatiskt uppdatera indenteringen.
När jag använde Code::Blocks för en massa år sedan fick man funktionaliteten genom att ladde ner ett plugin för denna funktion.

IDE = Integrated development environment. Ex. Visual Studio, Code::Blocks, med mera.

Notera att inget ska vara ändrat i denna kod mot ditt tidigare inlägg, det ska endast vara indenterat samt blankrader borttagna.

Console.WriteLine("Skriv in ett sökord"); string soka; Console.Clear(); if (lista.Count > 0) { Console.WriteLine("Sök efter en titel på ditt inlägg"); soka = Console.ReadLine(); int left = 0; int right = lista.Count - 1; int middle; while (left <= right) { middle = (left + right) / 2; int copyList = soka.CompareTo(lista[middle][0].ToString()); if (copyList == 0) { foreach (var item in lista[middle]) { Console.WriteLine(item.ToString()); } Console.WriteLine("Din sökning hittades"); break; } if (copyList > 0) { left = middle + 1; } else { right = middle - 1; } } if (left > right) Console.WriteLine("Sökningen hittades inte"); } else Console.WriteLine("bloggen är tom, försök att göra ett inlägg");

Permalänk

while (left <= right){ middle = (left + right) / 2; int copyList = soka.CompareTo(lista[middle][0].ToString()); if (copyList == 0){ foreach (var item in lista[middle]){ Console.WriteLine(item.ToString()); } Console.WriteLine("Din sökning hittades"); break; } if (copyList > 0){ left = middle + 1; } else{ right = middle - 1; } }

Du bryter din loop så snart du får en matchning på söktermen.

Permalänk
Medlem

Ja nu är det läsbart. Som Philoslothical säger kommer du enbart få ett resultat. Men sen vet vi inte vad du har för input. T.ex. måste ju listorna vara sorterade på lista[n][0] (vad jag antar är titeln på inlägget) eftersom det är mot den jämförelsen görs.

Permalänk
Medlem

Använd debuggern och kolla om middle = (left + right) / 2; verkligen får de värden du tänkt dig.