Programering 1 Linjär sökning i bloggen

Permalänk

Programering 1 Linjär sökning i bloggen

https://www.dropbox.com/s/hyfxb4kec95ytqh/IMG_7464.HEIC?dl=0
Ny på forumet och ny på programering
Just nu ser min kod ut så här utan kommentarer
För att gå direkt på sak så håller jag på försöker lära mig linjär sökning i case 3
jag vet att jag gjort fel och vet vad felet pekar på men min fråga är så här.
borde jag skriva eller kanske t.o.m. måste skriva en ny class för en linjär sökning av detta
jag kan få fram de sparade inläggen i visa menyval 1 (case 1) men i sökningen har ja hittils bara fått fram titeln och inte själv inlägget. Jag tror detta går att lösa att skapa en ny class och anropa den via menyval 3 i and FOR LOOPEN.
Är ca 4-5 h in på uppgiften och har lagt ner lite tid på att skriva en Pseudokod på sidan av inför redovisning.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace loggboken { class Program { static void Main(string[] args) { bool running = true; List<string[]> Titel = new List<string[]> { }; List<string[]> Inlägg = new List<string[]> { }; // skapar en ny lista för att spara alla inlägg while (running) { Console.WriteLine("\n Välkommen till Bloggen !" + " Gör et menyval 1-4"); Console.WriteLine("\n\t1. Visa inlägg"); Console.WriteLine("\t2. Skriv nytt inlägg"); Console.WriteLine("\t3. Sök efter inägg"); Console.WriteLine("\t4. Avsluta programmet Bloggen"); Console.WriteLine("\tVälj här : "); int menyval = 0; try { menyval = Convert.ToInt32(Console.ReadLine()); } catch { Console.WriteLine("Var god använd bara siffror !"); Console.ReadLine(); } if (menyval > 4) { Console.WriteLine("Ange nummer mellan 1 och 4 "); Console.ReadLine(); } switch (menyval) { case 1: { Console.Clear(); Console.WriteLine("Sparade Bloggar"); foreach (var item in Titel) { foreach (var s in item) Console.WriteLine(s); Console.ReadLine(); } break; } case 2: { string[] myList = new string[5]; Console.Write("Titel : "); myList[0] = Console.ReadLine(); Titel.Add(myList); Console.WriteLine("Inlägg : "); myList[1] = Console.ReadLine(); Inlägg.Add(myList); break; } case 3: { Console.WriteLine("Skriv ner titel : "); string input = Console.ReadLine(); for (int i = 0; i < Titel.Count; i++) { Console.Clear(); Console.WriteLine("Inlägg hittades !"); Console.WriteLine("Titel : " + Titel[0]); Console.ReadLine(); } for (int i = 0; i < Inlägg.Count; i++) { Console.WriteLine("Inlägg : " + Inlägg[0]); Console.ReadLine(); } if (Titel.Count() == 0) { Console.WriteLine("Inlägg hittades inte gör nytt meny val"); } break; } case 4: { running = false; Console.ReadLine(); break; } } } } } }

Permalänk
Medlem

Du måste inte skriva en klass, men skulle kunna. Datat är nu representerat som två listor, en med titlar och en med inlägg, och rimligtvis hör Titel[0] ihop med Inlägg[0], men det kanske inte är självklart för alla som läser koden. Du skulle kunna göra en blogg klass som har en titel och ett inlägg och sen representera datat med en lista blogg objekt istället. Det kanske skulle vara snyggare men är inte det minsta nödvändigt, det har inte heller något med linjärsökning att göra.

Det uppenbara problemet jag ser är att du inte göra några jämförelser i din sökning. Varje loop steg borde jämföra den inlästa titeln med en titel i titel listan. Om de matchar kan inlägget skrivas ut i samma loop steg, så du borde inte behöva två loopar.

I en for loop behöver du använda loop variabeln manuellt, pröva att arbeta med Inlägg[i] och Titel[i] istället för [0]

Permalänk
Skrivet av smurfzg:

Du måste inte skriva en klass, men skulle kunna. Datat är nu representerat som två listor, en med titlar och en med inlägg, och rimligtvis hör Titel[0] ihop med Inlägg[0], men det kanske inte är självklart för alla som läser koden. Du skulle kunna göra en blogg klass som har en titel och ett inlägg och sen representera datat med en lista blogg objekt istället. Det kanske skulle vara snyggare men är inte det minsta nödvändigt, det har inte heller något med linjärsökning att göra.

Det uppenbara problemet jag ser är att du inte göra några jämförelser i din sökning. Varje loop steg borde jämföra den inlästa titeln med en titel i titel listan. Om de matchar kan inlägget skrivas ut i samma loop steg, så du borde inte behöva två loopar.

I en for loop behöver du använda loop variabeln manuellt, pröva att arbeta med Inlägg[i] och Titel[i] istället för [0]

dina ord gjorde mig rätt mycke klarar i huvet om hur jag kan gå tillväga och fortsätta vidare på koden.
En sak till jag undrar över att skulle de bli enklare att ta bort Titel eller Inlägg separat om jag fördelar de i olika "class"
Det känns som att de skulle va en bra ide att dela upp allt så de inte blir för mycke i samma void.
Men jag ska göra några försök av de du föreslog låter som en bra ide att starta där.
återkommer med resultatet om 1 - 2 dagar om jag pallar koda i helgen också
Tack igen !!

Permalänk

Nu hittar den de jag söker efter och ger respons till det den inte hittar.

men de har dykt upp två nya problem
Programmet lyckas skriva ut själva inlägget och titeln på case 3 men den repeterar sig två gånger d.v.s. skriver ut samma sak två gånger och samma sak när den ska visa på case 1
Förstår inte riktigt varför den väljer och visa de två gånger och bara JUST TVÅ gånger.
Funderar på om man ska trycka in bool "knappar" för att programmet ska förstå att den kan hoppa vidare efter hittat rätt.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Bloggen { class Program { static void Main(string[] args) { bool running = true; List<string[]> Titel = new List<string[]> { }; // skapar en ny lista för att spara alla inlägg while (running) { Console.WriteLine("\n Välkommen till Bloggen !" + " Gör et menyval 1-4"); Console.WriteLine("\n\t1. Visa inlägg"); Console.WriteLine("\t2. Skriv nytt inlägg"); Console.WriteLine("\t3. Sök efter inägg"); Console.WriteLine("\t4. Avsluta programmet Bloggen"); Console.WriteLine("\tVälj här : "); int menyval = 0; try { menyval = Convert.ToInt32(Console.ReadLine()); } catch { Console.WriteLine("Var god använd bara siffror !"); Console.ReadLine(); } if (menyval > 4) { Console.WriteLine("Ange nummer mellan 1 och 4 "); Console.ReadLine(); } switch (menyval) { case 1: { Console.Clear(); Console.WriteLine("Sparade Bloggar"); foreach (var item in Titel) { foreach (var s in item) Console.WriteLine(s); Console.ReadLine(); } break; } case 2: { string[] myList = new string[5]; Console.Write("Titel : "); myList[0] = Console.ReadLine(); Titel.Add(myList); Console.WriteLine("Inlägg : "); myList[1] = Console.ReadLine(); Titel.Add(myList); break; } case 3: { Console.WriteLine("Skriv ner titel : "); string input = Console.ReadLine(); var entries = Titel.Where(entry => entry.Contains(input)); foreach (var entry in entries) { Console.WriteLine("Titel hittades !"); Console.WriteLine("" + entry[0] ); Console.WriteLine("" + entry[1] ); Console.ReadLine(); } if (entries.Count() == 0) { Console.WriteLine("Inlägget hittas inte gör nytt menyval"); Console.ReadLine(); } break; ; } case 4: { running = false; Console.ReadLine(); break; } } } } } }

Permalänk
Medlem

I case 2 lägger du till mylist till Titel två gånger, så du får dubbla uppsättningar titlar i din lista och då matchar sökningen två gånger i case 3.

Permalänk
Skrivet av smurfzg:

I case 2 lägger du till mylist till Titel två gånger, så du får dubbla uppsättningar titlar i din lista och då matchar sökningen två gånger i case 3.

En sån enkelt grej så fixat de nu tack för hjälpen !! nu ska jag jobba med kommentarer och pseudokod samt dokumentera mitt arbete.
Sen ska jag jobba vidare med sök funktioner ,ta bort loggar och försöka implantera sortering på någotvis.

Permalänk

Nu håller jag på med en mer avancerad sök funktion till mitt program och råkat fastna.
"Titel" är då listan som finns längst upp i koden (finns på andra inläggen)
Jag vet att problemet är de den säger Cannot implicitly convert type 'System.Collections.Generic.List<string[]>' to 'string'
men hur kan jag då komma åt listan med en linjär sökning via vektorerna ?
Kan detta bara göras med ett exempel.
"var entries = Titel.Where(entry => entry.Contains(userinput));

tillsammans med
"foreach (var bloggentry in entries)"

d.v.s. gämförelse ? (finns säkert andra sätt men jobbar just nu med att komma åt själv index i
List<string[]> Titel = new List<string[]> { };

Jag kan skapa en till lista med Vektorer men kan inte få allt å sparas i den med utan att röra till de rejält

Jag har även märkt att jag inte kan göra en "To.Upper" i "foreach lopen" och sök värdet måste vara exakt de samma som som är inskrivet i "Titel" listan men de jobbar jag på en annan gång.
Den skulle se ut så här
string[] Avsökning = new string[5];

och ja detta är en skoluppgift men den är redan klar och håller på med extra arbete för att lära mig.

Severity Code Description Project File Line Suppression State
Error CS0029 Cannot implicitly convert type 'System.Collections.Generic.List<string[]>' to 'string' Bloggen Examination

case 6: //avancerad sökning Console.WriteLine("Detta är en avnacerad sökning om du inte hittar inlägget"); string sökord = Console.ReadLine(); for (int i = 0; i < Titel.Count; i++) { if (sökord = Titel) //här dyker konverterings problemet upp { Console.WriteLine("inlägget hittades på indexplats" + i); Console.Read(); } } break;

Permalänk
Medlem

Istället för int i = 0. Skriv var i = 0 istället. Det gäller alla variabel deklarationer. Ser snyggare ut då

(sökord = Titel)

sökord är en string variabel. Du försöker jämföra den med en lista med strängar Titel. Det du ska ändra till: Titel[i]. Sen är det "==" och inte "=".

Visa signatur

Bättre än din.
Tagga mig för svar i trådar.

Permalänk
Skrivet av gwingis:

Istället för int i = 0. Skriv var i = 0 istället. Det gäller alla variabel deklarationer. Ser snyggare ut då

(sökord = Titel)

sökord är en string variabel. Du försöker jämföra den med en lista med strängar Titel. Det du ska ändra till: Titel[i]. Sen är det "==" och inte "=".

Jag får istället ett annat error medelande med detta.

Severity Code Description Project File Line Suppression State
Error CS0019 Operator '==' cannot be applied to operands of type 'string' and 'string[]'

Permalänk
Medlem
Skrivet av Squidling:

Jag får istället ett annat error medelande med detta.

Severity Code Description Project File Line Suppression State
Error CS0019 Operator '==' cannot be applied to operands of type 'string' and 'string[]'

variabeln "sökord" är en string variabel. Du försöker jämföra den med en lista med strängar "Titel". Det du ska ändra till: "Titel[i]".

Visa signatur

Bättre än din.
Tagga mig för svar i trådar.

Permalänk
Skrivet av gwingis:

variabeln "sökord" är en string variabel. Du försöker jämföra den med en lista med strängar "Titel". Det du ska ändra till: "Titel[i]".

Osäker på om jag förstår dig rätt men ska försöka vidare lite till.
så här har jag skrivit om den men får två error då.

Severity Code Description Project File Line Suppression State
Error CS0650 Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type.

och

Severity Code Description Project File Line Suppression State
Error CS0019 Operator '==' cannot be applied to operands of type 'string' and 'string[]'

case 6: //avancerad sökning Console.WriteLine("Detta är en avnacerad sökning om du inte hittar inlägget"); string sökord = Console.ReadLine(); for (var i = 0; i < Titel.Count; i++) { if (sökord == Titel[i]) //här dyker konverterings problemet upp { Console.WriteLine("inlägget hittades på indexplats" + i); Console.Read(); } } break; }

Permalänk
Medlem
Skrivet av Squidling:

Osäker på om jag förstår dig rätt men ska försöka vidare lite till.
så här har jag skrivit om den men får två error då.

Severity Code Description Project File Line Suppression State
Error CS0650 Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type.

och

Severity Code Description Project File Line Suppression State
Error CS0019 Operator '==' cannot be applied to operands of type 'string' and 'string[]'

case 6: //avancerad sökning Console.WriteLine("Detta är en avnacerad sökning om du inte hittar inlägget"); string sökord = Console.ReadLine(); for (var i = 0; i < Titel.Count; i++) { if (sökord == Titel[i]) //här dyker konverterings problemet upp { Console.WriteLine("inlägget hittades på indexplats" + i); Console.Read(); } } break; }

I din kod:

List<string[]> Titel = new List<string[]> { };

Här har du en lista innehållandes en array av strängar som du kallar Titel.

För att förklara:
Varje element i din Titel (alltså Titel[0], Titel[1] osv) är en array. En array är också en samling, som en lista ungefär, och kan därför i sin tur också innehålla flera element.

Detta är nog inte meningen, utan bara du som krånglat till det lite.

Prova ändra till

List<string> Titel = new();

då har du istället bara en lista där varje element innehåller en sträng.

Visa signatur

Äsch...

Permalänk
Medlem

@NisseG91 kollar jag hela koden nu så verkar List<string[]> Titel stämma, kolla case: 1.

Isåfall behöver TS dubbla for-loopar.

for (var i = 0; i < Titel.Count; i++) { for(var j = 0; j < Titel.[i].Count; j++) { //din kod } }

Men jag förstår inte varför TS gör det dock. TS sparar bara titeln som första element i en lista och sen lägger det i en lista.

Allt detta kan göras med en simpel lista med strängar.

Visa signatur

Bättre än din.
Tagga mig för svar i trådar.

Permalänk
Medlem

using System; using System.Collections.Generic; using System.Linq; namespace Bloggen { class Program { static void Main(string[] args) { var running = true; var flera_inlägg = new List<string>(); // skapar en ny lista för att spara alla inlägg while (running) { Console.WriteLine("\n Välkommen till Bloggen !" + " Gör et menyval 1-4"); Console.WriteLine("\n\t1. Visa inlägg"); Console.WriteLine("\t2. Skriv nytt inlägg"); Console.WriteLine("\t3. Sök efter inägg"); Console.WriteLine("\t4. Avsluta programmet Bloggen"); Console.Write("\tVälj här: "); var menyval = 0; try { menyval = Convert.ToInt32(Console.ReadLine()); } catch { Console.WriteLine("Var god använd bara siffror !"); Console.ReadLine(); } if (menyval > 4) { Console.WriteLine("Ange nummer mellan 1 och 4 "); Console.ReadLine(); } switch (menyval) { case 1: Console.Clear(); Console.WriteLine("Sparade Bloggar"); foreach (var inlägg in flera_inlägg) { Console.WriteLine(inlägg); } break; case 2: Console.Write("Titel : "); var nytt_inlägg = Console.ReadLine(); flera_inlägg.Add(nytt_inlägg); break; case 3: Console.WriteLine("Sök efter: "); var input = Console.ReadLine(); var entries = flera_inlägg.Where(entry => entry.Contains(input)); foreach (var entry in entries) { Console.WriteLine("Titel hittades !"); Console.WriteLine(entry); } if (entries.Count() == 0) { Console.WriteLine("Inlägget hittas inte gör nytt menyval"); Console.ReadLine(); } break; case 4: running = false; break; } } Console.Write("Bloggen avslutas."); } } }

Visa signatur

Bättre än din.
Tagga mig för svar i trådar.

Permalänk
Skrivet av gwingis:

using System; using System.Collections.Generic; using System.Linq; namespace Bloggen { class Program { static void Main(string[] args) { var running = true; var flera_inlägg = new List<string>(); // skapar en ny lista för att spara alla inlägg while (running) { Console.WriteLine("\n Välkommen till Bloggen !" + " Gör et menyval 1-4"); Console.WriteLine("\n\t1. Visa inlägg"); Console.WriteLine("\t2. Skriv nytt inlägg"); Console.WriteLine("\t3. Sök efter inägg"); Console.WriteLine("\t4. Avsluta programmet Bloggen"); Console.Write("\tVälj här: "); var menyval = 0; try { menyval = Convert.ToInt32(Console.ReadLine()); } catch { Console.WriteLine("Var god använd bara siffror !"); Console.ReadLine(); } if (menyval > 4) { Console.WriteLine("Ange nummer mellan 1 och 4 "); Console.ReadLine(); } switch (menyval) { case 1: Console.Clear(); Console.WriteLine("Sparade Bloggar"); foreach (var inlägg in flera_inlägg) { Console.WriteLine(inlägg); } break; case 2: Console.Write("Titel : "); var nytt_inlägg = Console.ReadLine(); flera_inlägg.Add(nytt_inlägg); break; case 3: Console.WriteLine("Sök efter: "); var input = Console.ReadLine(); var entries = flera_inlägg.Where(entry => entry.Contains(input)); foreach (var entry in entries) { Console.WriteLine("Titel hittades !"); Console.WriteLine(entry); } if (entries.Count() == 0) { Console.WriteLine("Inlägget hittas inte gör nytt menyval"); Console.ReadLine(); } break; case 4: running = false; break; } } Console.Write("Bloggen avslutas."); } } }

yes kan mycke möjligt vara jag som krånglat till koden =D . men är som sagt helt ny på de här och är ändå ganska imponerad över hur långt jag kommit =D
Tack för hjälpen igen !!
tycker sånt här är skit kul och för varje fel jag gör så lär jag mig något nytt
Trail and error they say

Permalänk
Medlem
Skrivet av Squidling:

yes kan mycke möjligt vara jag som krånglat till koden =D . men är som sagt helt ny på de här och är ändå ganska imponerad över hur långt jag kommit =D
Tack för hjälpen igen !!
tycker sånt här är skit kul och för varje fel jag gör så lär jag mig något nytt
Trail and error they say

Försök lära dig debuggern och stega genom koden med pause/continue. Då kommer du snabbt kunna se var det går tokigt och varför

Visa signatur

Äsch...

Permalänk
Skrivet av NisseG91:

Försök lära dig debuggern och stega genom koden med pause/continue. Då kommer du snabbt kunna se var det går tokigt och varför

Jo har gjort de med. men de är så att koden fungerar kanske bara inte är optimal för just sökning o.s.v. jag hoppas jag inkluderat allt som läraren vill ha med,inte fått det rättat än, jag tror nog de med tanke på att jag håller på med extra arbetet just nu + att de fan 38 grd här inne och har inge AC går fan inte att tänka. =D
Lyckades lösa med att spara datum och ta bort alla inlägg iaf så är halvägs med extra arbetet och nu har jag testat din kod lite och förstår vad du menar.
Borde va mycke enklare att lösa en binär sökning och sorterings "algorymth" genom detta.

Jag hör av mig igen när jag börjar med programmering 2 eller när jag vill leka lite med egna progamm =D