Programmering 1, sökningsalgoritm

Permalänk

Programmering 1, sökningsalgoritm

Tja,

hur ska jag gå tillväga att koda en sökalgoritm? Jag tänkte mig binär sökning eftersom listan är sorterad, och helst i en ny metod. Några ledtrådar?

using System; using System.Collections.Generic; using System.Threading; // fick lägga till dessa kataloger för att sortera vektorerna namespace ConsoleApp3 { class Program { // detta är en statisk metod med en int som ett returvärde // metoden tar en parameter i form av ett random objekt av // randomklassen static int RullaTärning(Random slumpObjekt) { // här ska du skapa kod som slumpar fram ett tal // mellan 1 och 6, så att metoden "rullar" en 6 sidig // tärning när vi kallar på den // Metoden ska sedan returnera det rullade värdet int tal = slumpObjekt.Next(1, 7); return tal; } static void Main(string[] args) { Random slump = new Random(); // Skapar en instans av klassen Random för vårt slumptal List<int> tärningar = new List<int>(); // listan för att spara våra rullade tärningar Console.WriteLine("\n\tVälkommen till tärningsgeneratorn!"); bool kör = true; while (kör) { Console.WriteLine("\n\t[1] Rulla tärning\n" + "\t[2] Kolla vad du rullade\n" + "\t[3] Avsluta"); Console.Write("\tVälj: "); int val; int.TryParse(Console.ReadLine(), out val); switch (val) { case 1: Console.Write("\n\tHur många tärningar vill du rulla?: "); bool inmatning = int.TryParse(Console.ReadLine(), out int antal); if (inmatning) { for (int i = 0; i < antal; i++) { // här kallar vi på metoden RullaTärning // och sparar det returnerade värdet i // listan tärningar tärningar.Add(RullaTärning(slump)); } tärningar.Sort(); // Jag lade till Sort-metoden som sorterar listan efter nummerordning } break; case 2: int summa = 0; // Skapar en int som ska innehålla medelvärdet av alla tärningsrullningar. if (tärningar.Count <= 0) { Console.WriteLine("\n\tDet finns inga sparade tärningsrull! "); } else { Console.WriteLine("\n\tRullade tärningar: "); foreach (int tärning in tärningar) { Console.WriteLine("\t" + tärning); summa = summa + tärning; // Menar ni så här? } // Här ska medelvärdet skrivas ut Console.WriteLine("\n\tMedelvärdet på dina kast: " + Dividera(summa, tärningar.Count)); Console.ReadLine(); Console.WriteLine("\n\tVill du ta bort de sparade tärningarna? j/n"); Console.Write("\tSvar: "); string svar = Console.ReadLine(); if (svar == "j" || svar == "J") { tärningar.Clear(); //Använder detta för att rensa bort kasten i listan Console.WriteLine("\n\tDu har nu rensat bort dina sparade tärningar.\n"); } else break; } break; case 3: Console.WriteLine("\n\tTack för att du rullade tärning, vi ses snart igen!"); Console.ReadLine(); kör = false; break; default: Console.WriteLine("\n\tVälj 1-3 från menyn."); break; } } } // static double Dividera(double summa, double antal) { double svar = summa / antal; return svar; } } }

Permalänk
Tangentbordskonnässör

Koden du har lagt upp har ju ingenting med sökning att göra?

Vad är det du ska söka på ?

Permalänk

Programmering 1 c#

Här så blir det konstigt, jag har stirrat mig blind på det här nu men finner inget fel, [0] är titeln och [1] är inlägg men när jag namnger båda så får båda två den den undre blogginläggets titel, hur ska jag göra?

foreach (string[] inlägg in Bloggen) { // skriver ut alla inlägg Console.WriteLine("\n\tBloggarna sparades " + "\n\tTitel: " + inlägg[0] + " \n\tInlägg: " + inlägg[1] + "\n"); }

Hela koden:

using System; using System.Collections.Generic; namespace Bloggen { class Program { static void Main(string[] args) { int menyVal; bool minBool = true; // programmet körs tills användaren avslutar List<string[]> Bloggen = new List<string[]>(); // skapar listan som håller arrays string[] blogg = new string[3]; // vektorn innehåller 3 element, två för initiering av titel och inlägg // och ett tredje element för initiering dagens datum och tid blogg[0] = "Titel"; blogg[1] = "Inlägg"; blogg[2] = DateTime.Now.ToString(); // här ville jag hälsa användaren välkommen genom att skapa en strängvektor med 2 platser // istället för att deklarera många olika strängvariabler string[] namn = new string[2]; DateTime time = DateTime.Now; // metod för dagens datum och tid Console.WriteLine("\tDate: " + time.ToShortDateString()); // skriver ut dagens datum Console.WriteLine("\tTime: " + time.ToShortTimeString()); // skriver ut dagens tid Console.Write("\n\tVar god skriv in ditt förnamn: "); namn[0] = Console.ReadLine(); Console.Write("\tVar god skriv in ditt efternamn: "); namn[1] = Console.ReadLine(); Console.WriteLine("\n\tVälkommen till Bloggen," + " " + namn[0] + " " + namn[1] + "!"); Console.WriteLine("\tVar vänlig ange en siffra mellan 1-5"); while (minBool) { Console.WriteLine("\n\t[1]Skriv nytt inlägg i bloggen"); Console.WriteLine("\t[2]Visa sparade blogginlägg"); Console.WriteLine("\t[3]Sök bland inläggen i bloggen"); Console.WriteLine("\t[4]Ta bort dina inlägg i bloggen"); Console.Write("\t[5]Avsluta programmet" + "\n\t\n\t"); // Try.Parse hindrar även att programmet kraschar vid felaktig inmatning Int32.TryParse(Console.ReadLine(), out menyVal); switch (menyVal) { case 1: string[] Blogg = new string[2]; // Sparar nya inlägg genom att främst skapa en array för varje inlägg for (int i = 0; i < Blogg.Length; i++) // denna kommmer att returnera våra 3 vektorer, så länge 0 är mindre än blogg.Length så kommer loopen köras { Console.Write("\n\tNamnge ditt inlägg: "); // sparar titeln i index 0 blogg[0] = Console.ReadLine(); Console.Write("\tSkriv ditt blogginlägg: "); // sparar inlägg i index 1 blogg[1] = Console.ReadLine(); Bloggen.Add(blogg); // sparar blogginlägget Console.WriteLine("\n\tDitt blogginlägg är sparat!"); } break; case 2: Console.WriteLine("\n\tNedan kan du se dina sparade blogginlägg:"); foreach (string[] inlägg in Bloggen) { // skriver ut alla inlägg Console.WriteLine("\n\tBloggarna sparades " + "\n\tTitel: " + inlägg[0] + " \n\tInlägg: " + inlägg[1] + "\n"); } break; case 3: Console.Write("\tSkriv in ett ord för att söka bland dina inlägg: "); string sökord = Console.ReadLine(); for (int s = 0; s < Bloggen.Count; s++) { if (blogg[s].ToLower() == sökord.ToLower()) { Console.WriteLine("\tInlägget du sökte efter hittades!" + " " + blogg[s]); } else { Console.Write("\n\tDitt inlägg hittades inte, kontrollera stavningen och försök igen"); } break; } break; // break avbryter varvet case 4: Bloggen.Clear(); Console.WriteLine("\tDina inlägg är raderade, lägg till nya!"); break; case 5: minBool = false; //avbryter loopen Console.WriteLine("\n\tHa en fin dag, vi ses snart igen!"); Console.ReadLine(); break; default: // default läser in alla värden Console.WriteLine("\n\tDu kan bara välja mellan 1 och 5!"); Console.ReadLine(); break; } } } } }

Permalänk
Medlem

Bloggen.Add(blogg) lägger till en referens till arrayen som blogg pekar på i listan. Så när du sen skriver över värdena i blogg så återspeglas det även i listan. Du måste alltså skapa en ny array varje gång du vill lägga till ett nytt inlägg.

Notera också att blogg och Blogg är olika variabler i din kod, C# gör skillnad på små och stora bokstäver. Du bör nog se över vad du egentligen använder Blogg till också.

Permalänk

Jag har försökt att skapa en ny likadan Array

string[] Blogg = new string[2]; // Sparar nya inlägg genom att främst skapa en Array för varje inlägg for (int i = 0; i < Blogg.Length; i++) // denna kommmer att returnera våra 3 vektorer, så länge 0 är mindre än blogg.Length så kommer loopen köras { Console.Write("\n\tNamnge ditt inlägg: "); // sparar titeln i index 0 blogg[0] = Console.ReadLine(); Console.Write("\tSkriv ditt blogginlägg: "); // sparar inlägg i index 1 blogg[1] = Console.ReadLine(); Bloggen.Add(blogg); // sparar blogginlägget Console.WriteLine("\n\tDitt blogginlägg är sparat!"); } break;

men ingenting fungerar. Eller du kanske inte ens menar så här?

Permalänk
Medlem

@Field_trip: Blogg och blogg är som sagt två helt olika variabler, det enda du använder Blogg till just nu är att avgöra hur många inlägg som ska läggas till (varför?).

Permalänk
Medlem

Du måste deklarera en ny array i varje loop. (Se nedan) Detta beror ju på att listan annars innehåller en referens till samma array. Som ju får ett nytt värde i andra loopen.

Sen kan det vara värt att påpeka det som ovanstående har nämnt. När du använder samma namnsättning så ersätts förnamnet och efternamnet man först i början av programmet mot den nya arrayen som innehåller inlägg.

switch (menyVal) { case 1: for (int i = 0; i < 2; i++) // denna kommmer att returnera våra 3 vektorer, så länge 0 är mindre än blogg.Length så kommer loopen köras { string[] Blogg = new string[2]; // Sparar nya inlägg genom att främst skapa en array för varje inlägg Console.Write("\n\tNamnge ditt inlägg: "); // sparar titeln i index 0 Blogg[0] = Console.ReadLine(); Console.Write("\tSkriv ditt blogginlägg: "); // sparar inlägg i index 1 Blogg[1] = Console.ReadLine(); Bloggen.Add(Blogg); // sparar blogginlägget Console.WriteLine("\n\tDitt blogginlägg är sparat!"); } break;

Visa signatur

AMD Ryzen 7 5800X3D | EVGA GeForce RTX 3080 10GB FTW3 ULTRA | ASUS ROG Strix B450-F Gaming | Corsair RM750X V2 | Crucial Ballistix Sport LT 3200MHz 16GB | Samsung 980 Pro 1TB | Crucial MX500 2TB | NZXT H500

Permalänk
Medlem
Skrivet av Field_trip:

Jag har försökt att skapa en ny likadan Array

string[] Blogg = new string[2]; // Sparar nya inlägg genom att främst skapa en Array för varje inlägg for (int i = 0; i < Blogg.Length; i++) // denna kommmer att returnera våra 3 vektorer, så länge 0 är mindre än blogg.Length så kommer loopen köras { Console.Write("\n\tNamnge ditt inlägg: "); // sparar titeln i index 0 blogg[0] = Console.ReadLine(); Console.Write("\tSkriv ditt blogginlägg: "); // sparar inlägg i index 1 blogg[1] = Console.ReadLine(); Bloggen.Add(blogg); // sparar blogginlägget Console.WriteLine("\n\tDitt blogginlägg är sparat!"); } break;

men ingenting fungerar. Eller du kanske inte ens menar så här?

Varför har du din for-loop där? Bloggär en array med två element. Din for-loop kommer iterera över dessa två element vilket leder till att du skapar två inlägg.

Att du sedan återanvänder samma array blogg när du skapar ett inlägg, leder bara till att värdet ändras på blogg. Det är en referens, eller en koppling, till blogg som läggs i din lista över alla inlägg. Om du ändrar på ett inlägg (blogg) så kommer alla andra referenser/kopplingar mot den arrayen också förändras.

string[] blogg = new string[2]; blogg[0] = "Hej"; blogg[1] = "Då"; List<string[]> Bloggar = new List<string[]>(); Bloggar.Add(blogg); // Lägger till en referens till blogg ([0]: Hej, [1]: Då) Bloggar.Add(blogg); // Lägger till en referens till blogg ([0]: Hej, [1]: Då) // -- Bloggar = [0]: blogg ( [0]: Hej, [1]: Då ), [1]: blogg ( [0]: Hej, [1]: Då ) blogg[0] = "Hejsan"; // Uppdaterar variabeln. Ändrar index 0 till "Hejsan". // Alla referenser till blogg kommer också ändras: // -- Bloggar = [0]: blogg ( [0]: Hejsan, [1]: Då ), [1]: blogg ( [0]: Hejsan, [1]: Då )

Det du måste göra är att skapa en ny array varje gång du ska spara ett inlägg i din lista. Inte återanvända en befintlig array.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

Tack alla, uppskattar det verkligen! Jag raderade for loopen och skrev bara blogg = new string[3] (alltså så som ni menade)

Permalänk
Skrivet av perost:

Notera också att blogg och Blogg är olika variabler i din kod, C# gör skillnad på små och stora bokstäver. Du bör nog se över vad du egentligen använder Blogg till också.

Jag skulle rekommendera att du inte inför variabler med alltför lika namn. Blogg och blogg är väldigt lika och det finns risk att man blandar ihop dem och använder den ena när man tänkt sig att använda den andra. Ungefär som att man behöver ett namn på en variabel, så man kallar den för apa. Behöver man några till, får de heta apa2, apa3 och så vidare. Lite senare: "Hm, var det apa35 eller apa53 jag skulle ha här?" Man blir förvirrad och av misstag använder man till slut fel variabel någonstans.