Binär Sökning list<int>, list<string> C#

Permalänk
Medlem

Binär Sökning list<int>, list<string> C#

Hej,
behöver hjälp med binär sökning. Case 3 skriver ut mer än en rad vid "else" satsen som säger vilken Index den sökta siffran har. Case 6 funkar bara "Sökning misslyckades!", den funkade nästan felfritt förut men nu funkar det ej längre.
Är till en uppgift i Programmering 1 C# och suttit nu i snart 4 sömnlösa nätter pga av detta.

case 3: // Här ska användaren kunna söka bland siffrorna med en binärsökning. (BINÄRSÖKNING AV SIFFROR)
Console.Clear();
if (sifferLista.Count > 0)
{
if (intSortering)
{
Console.WriteLine("\n\tVilken siffra vill du söka på?");
Int32.TryParse(Console.ReadLine(), out int key); // Tar emot användarens sökning
if (key < 0) key = 0; // Ser till att sökningen är på ett positivt tal

int mellan;
int första = 0;
int sista = sifferLista.Count - 1;

while (första <= sista)
{
mellan = (första + sista) / 2;

if (key > sifferLista[mellan])
första = mellan + 1;

else if (key < sifferLista[mellan])
sista = mellan - 1;

else
Console.WriteLine("\tIndex för den sökta siffran är: " + mellan);
break;
}
if (första >= sista) // Meddelande att sökningen misslyckades.
Console.WriteLine("\tSökningen misslyckades!");

SifferUtskrift(sifferLista); // Skriver ut hela listan med vår metod.
}
else
{
Console.WriteLine("\n\tSiffrorna i din lista behöver sorteras. Kör en sortering innan sökningen."); // Användaren behöver göra en sortering.
}
}
else
{
Console.WriteLine("\n\tDet saknas inlägg i sifferlistan. Generera lite siffror först."); // Användaren har inte genererat något värde till listan.
}
MenyAvslut(); // Kallar på vår standardiserade menyavslutning.
break;

case 6: // Här ska användaren kunna söka på första bokstaven av våra nonsensord i ordLista. (BINÄRSÖKNING AV BOKSTÄVER)
Console.Clear();
if (ordLista.Count > 0)
{
if (bokstavSortering)
{
Console.WriteLine("\n\tVilken bokstav ska sökningen börja på?");
string key = Console.ReadLine(); ; // Tar emot användarens sökning
if (key.Length <= 0) key = "a"; // Ser till att sökningen alltid är något, i det här fallet "a"

int första = 0;
int sista = ordLista.Count - 1;

while (första <= sista)
{
int mellan = (första + sista) / 2;
int sök = key.CompareTo(ordLista[mellan]);

if (sök > 0)
{
första = mellan + 1;
}

else if (sök < 0)
{
sista = mellan - 1;
}

else
{
Console.WriteLine(mellan);
}
}
if (första > sista) // Meddelande att sökningen misslyckades.
Console.WriteLine("\tSökningen misslyckades!");

Korta ner koden till de jag behöver hjälp med
Permalänk
Medlem

Några råd.

1. Använd [code]-taggar. (Tryck citera på mitt inlägg för att se hur jag gjort nedan.)

func main() { return 0 }

2. Gör inte copy-paste på hela din kod och dumpa i ett foruminlägg. Jag är gärna med och hjälper dig komma fram till ditt svar, men jag tänker inte lägga tid på att läsa igenom hela din kodbas. Du nämner Case 3 och Case 6 i början på ditt inlägg, så det borde räcka att posta dem.

3. Sitt inte och programmera på sömnlösa nätter. Gör det istället när du är pigg och har en kaffe till hands att smutta på när du filurar.

EDIT:
Jag provade att skicka in din kod i en beautifier för att kunna läsa den. Scrollade till case 3 och såg att du har en break i slutet på din while-loop. Nu kodar inte jag C#, och har ingen miljö att testa din kod i, men torde inte detta göra att du bara loopar ett varv?

Råd nummer 4. Posta bara den kod som behövs postas, och se till att den är körbar på det sätt du förväntar dig.

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem
Skrivet av GLaDER:

Några råd.

1. Använd [code]-taggar. (Tryck citera på mitt inlägg för att se hur jag gjort nedan.)

func main() { return 0 }

2. Gör inte copy-paste på hela din kod och dumpa i ett foruminlägg. Jag är gärna med och hjälper dig komma fram till ditt svar, men jag tänker inte lägga tid på att läsa igenom hela din kodbas. Du nämner Case 3 och Case 6 i början på ditt inlägg, så det borde räcka att posta dem.

3. Sitt inte och programmera på sömnlösa nätter. Gör det istället när du är pigg och har en kaffe till hands att smutta på när du filurar.

EDIT:
Jag provade att skicka in din kod i en beautifier för att kunna läsa den. Scrollade till case 3 och såg att du har en break i slutet på din while-loop. Nu kodar inte jag C#, och har ingen miljö att testa din kod i, men torde inte detta göra att du bara loopar ett varv?

Råd nummer 4. Posta bara den kod som behövs postas, och se till att den är körbar på det sätt du förväntar dig.

Tog dina råd att korta ner koden, alltid sömnlös på nätterna och sover på dagen. Jobbar och pluggar på kvällarna/nätterna.

Har jag inte break; med i while-loopen kommer det vara en evighets-loop, hade fått case 6 att fungera och kommit lika långt som case 3, men något hände. Annars går den flera varv, men den skriver ut för varje siffra som jag genererat. Så har jag genererat 3 siffror skriver den ut ("Index för den sökta siffran är: " + mellan) 3 gånger. Funkade inte alls med en bool heller

Permalänk
Vila i frid

Blir lite fundersam, lär man inte ut att använda en debugger vid felsökning längre? Absolut skitenkla saken att se vad som händer - och inte händer. Det låter avancerat att programmera med qutrit, "den funkade nästan felfritt förut".

Permalänk
Medlem
Skrivet av hasenfrasen:

Blir lite fundersam, lär man inte ut att använda en debugger vid felsökning längre? Absolut skitenkla saken att se vad som händer - och inte händer. Det låter avancerat att programmera med qutrit, "den funkade nästan felfritt förut".

Det är ju klart man har debugger, men när det inte visar något fel eller hur jag ska koda så det blir rätt .

Permalänk
Vila i frid

"Kod gör som tok skrev". Medans du debuggar, lägg till en "watch" på inblandade variabler så kan du stega dig igenom koden och se varför saker sker - eller inte. En lat form av "systemering", i efterhand. Se till att kunna formulera i ord det du vill att programmet skall utföra. Så längre du inte själv kan berätta vad som skall hända är det svårt att skriva kod för det. Att programmera på måfå är tyvärr dömt att misslyckas. Att köra med debuggern och kika på variablers värden i olika steg brukar nästan alltid skapa aha-upplevelser - såvida du inte upptäcker en bugg i debuggern. T.ex. Visual Studio har ett antal buggar som bara uppträder i debug-läget men inte i release-läget. Som t.ex:

object op = Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); newPlugin.Instance = (INewDialogPlugin)op;

Permalänk
Medlem
Skrivet av hasenfrasen:

"Kod gör som tok skrev". Medans du debuggar, lägg till en "watch" på inblandade variabler så kan du stega dig igenom koden och se varför saker sker - eller inte. En lat form av "systemering", i efterhand. Se till att kunna formulera i ord det du vill att programmet skall utföra. Så längre du inte själv kan berätta vad som skall hända är det svårt att skriva kod för det. Att programmera på måfå är tyvärr dömt att misslyckas. Att köra med debuggern och kika på variablers värden i olika steg brukar nästan alltid skapa aha-upplevelser - såvida du inte upptäcker en bugg i debuggern. T.ex. Visual Studio har ett antal buggar som bara uppträder i debug-läget men inte i release-läget. Som t.ex:

object op = Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); newPlugin.Instance = (INewDialogPlugin)op;

Det har jag märkt, använder mig av debuggarn ofta för kontrollera och se vad som händer i programmet. Nu har jag bara stött på problem jag har svårt att lösa, för inte den binära sökningen funka som jag vill

Permalänk
Medlem

@GLaDER har redan givit dig lösningen och den lösningen borde varit uppenbar om du faktiskt kört debuggern.

En bra buggrapport innehåller inte bara bra beskrivnigar av:
- Vad förväntar jag mig ska hända
- Vad händer i stället
utan även vad man gör när det oväntade inträffar, till exempel vilken indata man använde/vilka förutsättningar som fanns. Lite av grejen med ett program är ju att det ska kunna bete sig olika beroende på vilken indata man kör med.

Ett minimalt körbart exempel på din kod skulle kunna se ut så här:

using System; class HelloWorld { static void Main() { System.Collections.Generic.List<int> sifferLista = new System.Collections.Generic.List<int>() { 1, 1, 2, 3, 5, 8, 13 }; int key = 5; int mellan; int första = 0; int sista = sifferLista.Count - 1; while (första <= sista) { mellan = (första + sista) / 2; if (key > sifferLista[mellan]) första = mellan + 1; else if (key < sifferLista[mellan]) sista = mellan - 1; else Console.WriteLine("\tIndex för den sökta siffran är: " + mellan); break; } if (första >= sista) // Meddelande att sökningen misslyckades. Console.WriteLine("\tSökningen misslyckades!"); } }