Permalänk
Medlem

Binär sökning C#

Hej!
Behöver akut hjälp..
Jag ska göra en uppgift i Programmering 1 C# där vi ska skapa en "blogg".
Jag ska tillämpa binär sökning och har sorterat inläggens titel i alfabetiska ordning, men den binära sökningen visar inte något resultat... Har jag missat något uppenbart?
Såååå tacksam för hjälp, ska lämna in idag och får panik på uppgiften nu.

Permalänk
Medlem

Vad får du för resultat?

Om du får resultatet "Det finns inga blogginlägg att söka efter, skriv ett nytt blogginlägg och återkom till sökfunktionen." så returnerar ju inte sökfunktionen något bra resultat.

Permalänk
Medlem

int left = 0; int right = myBlog.Count - 1; while (left <= right) { int middle = (left + right) / 2; string []copyList = myBlog[middle]; int copy = ord.CompareTo(copyList[1]); if (copy > 0) left = middle + 1; else if (copy < 0) right = middle - 1; else return middle; }

While har inte return, du måste använda break och bara ha variabeln middle initierad ovan den.
Edit: fel av mig tänkte fel språk men vet inte om den returnerar ett värde? C# har jag inte gjort mycket i.

Sedan är jag inte hundra på att det är ett problem en ser udda ut när du gör delningen på (left + right) / 2; detta blir sedan avrundat vilket kan ge upphov till problem med att det tillsammans med att du adderar ett, det kan bli en loop av att lägga till och tb ort.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

När jag skulle köra programmet så fick jag fel på den här raden:
Int32.TryParse(Console.ReadLine(), out int offgrid);

Jag testade att köra här: https://dotnetfiddle.net/

Permalänk
Medlem
Skrivet av Ferrat:

int left = 0; int right = myBlog.Count - 1; while (left <= right) { int middle = (left + right) / 2; string []copyList = myBlog[middle]; int copy = ord.CompareTo(copyList[1]); if (copy > 0) left = middle + 1; else if (copy < 0) right = middle - 1; else return middle; }

While har inte return, du måste använda break och bara ha variabeln middle initierad ovan den.
Edit: fel av mig tänkte fel språk men vet inte om den returnerar ett värde? C# har jag inte gjort mycket i.

Sedan är jag inte hundra på att det är ett problem en ser udda ut när du gör delningen på (left + right) / 2; detta blir sedan avrundat vilket kan ge upphov till problem med att det tillsammans med att du adderar ett, det kan bli en loop av att lägga till och tb ort.

När jag trycker enter efter att ha skrivit in sökordet (testade att söka på en titel som finns sparad) så händer ingen ting. Det blir en blank rad och sedan efter en till tryckning på enter kommer de sparade inläggen upp. Sedan återgår den till meyn..

Permalänk
Medlem

Jag blir osäker på hur min sökning söker .. om den krockar med min bubble sort.. Jag sorterar i alfabetisk ordning, måste sorteringen vara i ordningen enligt index för att den binära sökningen ska fungera?

Permalänk
Medlem

@csal: Har du använt debuggern för att stega igenom sökningen och se vad som faktiskt händer?

Permalänk
Medlem

Du har ju lite jobb när du ska testa av detta eftersom du måste skriva in en massa.

Jag har ett förslag: Gör ett till menyalternativ som automatiskt sätter in ett antal blogginlägg.
Då blir det samma testdata hela tiden och borde bli mycket lättare att återskapa felscenarion och liknande.

Med en sådan funktion så borde du kunna bygga dig lite automatik:
1. Sätta upp säg 10 inlägg först test (inmatade osorterat förstås)
2. Skriv ut alla inlägg
3. Radera ett specifikt inlägg
4. Skriv ut alla inlägg
5. Radera ett inlägg till
6. Skriv ut alla inlägg
7. Sortera alla inlägg
8. Skriv ut alla inlägg

Permalänk
Medlem
Skrivet av perost:

@csal: Har du använt debuggern för att stega igenom sökningen och se vad som faktiskt händer?

Hej! Jag provar igen! Har varit ganska tufft att köra denna kurs på distans, så att läsa och förstå vad debuggern säger har varit en utmaning. Tack för tipset , jag testar igen!
//Cajsa

Permalänk
Medlem

Det verkar som att när sökningen startar så går den aldrig in i loopen för att fortsätta söka utan går direkt till return -1...

Permalänk

Måste du ens tillämpa Bubblesort och binärsökning? Får du inte använda dig utav linq-expressions?

Permalänk
Medlem
Skrivet av csal:

Det verkar som att när sökningen startar så går den aldrig in i loopen för att fortsätta söka utan går direkt till return -1...

Jag kom till samma slutsats.

Jag ändrade utskriften efter sökning efter lite felsökning.

if (search != -1) { Console.WriteLine("\n\t\t\tHittade: " + sokningtitel); } else { Console.WriteLine("\n\t\t\tHittade ingenting!"); }

Finns det några regler kring input? Ska en titel endast bestå av ett ord, eller kan det vara flera ord?

För att kunna skapa lite testdata så skapade jag också följande

case 8: { Random randomizer = new Random(); DateTime dateTimeForEntry = DateTime.Now; for (int entryIndex = 0; entryIndex <= 9; entryIndex++) { bloggar = new string[3]; bloggar[0] = dateTimeForEntry.AddMinutes(randomizer.Next(2, 8)).ToString(); bloggar[1] = String.Format("Titel: {0}", randomizer.Next(1, 15)); bloggar[2] = String.Format("Detta är texten för inlägget med titeln '{0}'", bloggar[1]); PlaceraBlogg(myBlog, bloggar); } break; }

Edit: Så som du har implementerat din sökning så söker du ju efter exakt match på titel. Med min case 8 så kan ett inlägg t.ex. får titeln 'Titel 3'.

Det gör att jag måste söka på exakt 'Titel 3' för att din sökning ska hitta den.

Permalänk
Medlem
Skrivet av csal:

Det verkar som att när sökningen startar så går den aldrig in i loopen för att fortsätta söka utan går direkt till return -1...

Det borde inte kunna hända. Loop-villkoret är left <= right. left initieras till 0, så det enda sättet villkoret kan vara falskt från början är om right är negativ. Det kan bara hända om myBlog.Count är 0, d.v.s. listan är tom, men i meny-alternativet för att söka så kollar du att listan inte är tom innan du anropar sök-metoden.

Permalänk
Medlem

case 4: //Sök bland sparade inlägg på titel med binär sökmetod Console.Clear(); if (myBlog.Count > 0) { //int search; Console.WriteLine("\n\t\t\tHär kan du söka på inlägg som du skrivit i bloggen." + "\n\t\t\tVilken titel du önskar du söka efter: "); sokningtitel = Console.ReadLine(); int left = 0; int right = myBlog.Count - 1; int middle; while (left <= right) { middle = (left + right) / 2; int copyList = sokningtitel.CompareTo(myBlog[middle][1].ToString()); if (copyList > 0) { left = middle + 1; } else if (copyList < 0) { right = middle - 1; } else { Console.WriteLine("Titeln du sökt efter finns på index " + middle ); VisaBlogginläggen(myBlog); break; } } if (left > right) Console.WriteLine("Sökningen misslyckades."); } else Console.WriteLine("\n\t\t\tDet finns inga blogginlägg att söka efter, skriv ett nytt blogginlägg och återkom till sökfunktionen."); break;

Ingen metod längre...
Nu fungerar sökningen iaf, men som ni nämnt ovan måste sökningen vara exakt. Jag skulle kunna lägga in så att versaler inte behöver spela in på sökresultatet, men om antal ord vet jag inte hur man gör, tror inte att läraren kräver det heller..

Hade önskat att sökningen returnerade hela inlägget men lyckas bara med alla inlägg...

Permalänk
Medlem
Skrivet av csal:

Ingen metod längre...

Den stora skillnaden jag kan se är att du nu inte längre kör ToUpper() på ordet du vill söka efter. Sökningen fungerade tidigare bara om titlarna på inläggen också var inmatade med enbart stora bokstäver.

Om du vill jämföra strängar utan att ta hänsyn till små och stora bokstäver så kan du använda String.Compare(string1, string2, StringComparison.OrdinalIgnoreCase).

Permalänk
Medlem
Skrivet av csal:

Hade önskat att sökningen returnerade hela inlägget men lyckas bara med alla inlägg...

Det kan du väl fixa? Själva utskriften av en enda rad finns ju i metoden VisaBlogginläggen, men snyggast är ju att du skriver en metod som du anropar från båda ställen där den används.