9 svar
50 visningar
Ellenjernstrom 4
Postad: 18 dec 2021 15:10

Skapandet av en blogg

Hej hej, hoppas allt är bra med er!

Jag är nybörjare i programmering, jag arbetar med C# och har fått en uppgift att skapa en blogg. 

Dessa är kriterierna som behövs uppnås för att bloggen skall vara godkänd:

  • Bloggen ska vara en lista som kan spara strängvektorer. Varje enskilt blogginlägg ska vara en strängvektor. Vektorerna ska innehålla minst två element. OBS: Du får inte ersätta vektorlistan med en klass. 
  • En fungerande meny med val för programmets funktionalitet, använd SWITCH.
  • Åtgärder för att förhindra körtidsfel.
  • Möjlighet att skriva ut inlägg från bloggen.
  • Möjlighet att spara nya inlägg i bloggen, med åtminstone titel och meddelande.
  • Möjlighet att söka inlägg i bloggen, på exempelvis postens titel. 
    Din sökning ska utgå från en jämförelse mellan ett sökord och varje inläggs titel. Andra former av sökningar får inkluderas som alternativ, eller för att visa att du kan hantera mer avancerade verktyg, men det måste finnas med en grundläggande sökning som jämför varje inläggs titel med ett sökord.
  • Väl kommenterad kod som förklarar och motiverar val av datatyper, kontrollstrukturer, metoder, datastrukturer och algoritmer.

Mitt problem just nu är den linjära sökningen i Case 3. Jag lyckas endast att hitta sökningen på den första titeln som har sparats med tillhörande ”meddelande/text/själva inlägget". Men när jag söker på de andra sparade titlarna så får jag ingen träff. Jag kan få fram alla titlarna och inläggen i Case 2 där jag skriver ut, så då bör ju titlarna och inläggen vara sparade?

Jag har varit i kontakt med min lärare om mitt problem och jag försökte lösa det genom att använda containers men jag fick inte göra det. Hon sa åt mig att bara använda en vanlig linjär sökning med jämlikhetsoperatorer.

Jag kommer att infoga min kod för den vänliga själen som vill ta sig tid för att hjälpa mig. Jag har tillbringat många timmar/dagar på detta och jag kan bara inte hitta vad som orsakar problemet.

Vad gör jag för fel?


using System;
//Jobbar med listor och då behöver vi lägga in följande kod för att komma åt list-klassen.
using System.Collections.Generic;

namespace Bloggen.komplettering
{
    class Program

    {
        static void Main(string[] args)
        {
            //Deklarera min lista så användaren senare skall kunna söka efter sina inlägg i arkivet vid menyval 3.
            List<string[]> archive = new List<string[]>();

            //Sant eller falsk variabel som kommer ge mig mer kontroll i när programmet körs eller inte.
            bool ellensBool = true;

            // Skriver ut en hälsning på skärmen till användaren.
            Console.WriteLine("\n\tHej och välkommen till din egna blogg!\n\t");
            //Avskärmare av avsikt för ren estetik
            Console.WriteLine("_______________________________________" + "\n\t");

            //Loppen börjar.
            while (ellensBool)
            {
                //Tar bort onödig text för varje gång loopen börjar om.
                Console.Clear();
                //Skapar min meny
                Console.WriteLine("\tVänligen gör ett av följande menyval: ");
                Console.WriteLine("\t[1]Skriv ett nytt blogginlägg: ");
                Console.WriteLine("\t[2]Skriv ut dina sparade blogginlägg");
                Console.WriteLine("\t[3]Sök efter dina sparade blogginlägg i arkivet");
                Console.WriteLine("\t[4]Stäng ner bloggen och avsluta programmet!");
                Console.Write("\nVälj: ");

                //Deklarerar menyvals variabeln.
                int menyVal;

                //Här la jag in TryParse för att snappa upp eventuella fel inmatningar från användaren utan att programmet kraschar.
                Int32.TryParse(Console.ReadLine(), out menyVal);


                switch (menyVal)
                {
                    //Case 1 skapar användaren sina blogginlägg genom att mata in rubrik/titel och därefter inlägget.
                    case 1:
                        //Sparar nya inlägg genom att skapa en ny vektor med plats för 2 element för varje gång.
                        string[] posts = new string[2];
                        //Ber användarens mata in vad hen vill kalla inlägget.
                        Console.WriteLine("\nSkriv in titeln på ditt blogginlägg: \n");
                        //Sparar titeln på första elementet.
                        posts[0] = Console.ReadLine();
                        //Ber användaren att mata in texten på själva inlägget
                        Console.WriteLine("\nSkriv ett inlägg: ");
                        //Sparar inlägg i andra elementet.
                        posts[1] = Console.ReadLine();
                        //Sparar blogginlägget och skriver ut det på skärmen till användaren. // Vi sparar inlägg i listan 
                        archive.Add(posts);
                        Console.WriteLine("\n\tDitt blogginlägg är nu sparat!" + "\n\t");
                        Console.WriteLine("\n" + "_______________________________________" + "\n\t");
                        break;

                    //Case 2 tar fram alla inlägg som har skrivits med sin rubrik/titel och innehåll.
                    case 2:
                        //Skriver ut de sparade inläggen på användarens skärm.
                        Console.WriteLine("\nHär är dina sparade inlägg som finns i arkivet, se nedan:  ");
                        //For loopen hjälper oss att bläddra genom varje element
                        for (int i = 0; i < archive.Count; i++)
                        {
                            Console.WriteLine("\nTitel: " + archive[i][0] + "\n\n" + archive[i][1]);
                            //Avskärmare av avsikt för ren estetik
                            Console.WriteLine("\n" + "_______________________________________" + "\n\t");
                            Console.ReadLine();
                        }

                        break;

                    // Case 3 kan användaren söka bland sina sparade inlägg i arkivet
                    case 3:
                        //Ber användaren att göra en sökning.
                        Console.WriteLine("Skriv in titeln på det blogginlägg du söker \n");
                        //Skapar en ny sträng variabel som blir sökningen som matas in av användaren.
                        string searchWord = Console.ReadLine();
                        //skapar ytterligare en bool för att göra det enklare för programmet att söka i listan efter det inmatade sökordet.
                        bool sökning = false;
                        //For loopen hjälper oss att bläddra genom varje element.
                        for (int i = 0; i < archive.Count; i++)
                        {   //Använder mig utav en jämförelseoperator. 
                            if (archive[i][0].ToUpper() == searchWord.ToUpper())
                            {
                                //Matchar sökordet och listan så får användaren följande meddelande utskrivet på skärmen.
                                Console.WriteLine("Vi kunde hitta ditt inlägg i arkivet " + archive[i][0], archive[i][1]);
                                Console.WriteLine("\nVänligen göra ett nytt menyval.");
                                Console.WriteLine("\n" + "_______________________________________" + "\n\t");
                                sökning = true;
                            }
                            //Om sökordet inte matchar med listan så får användarens följande utskrivet på sin skärm.
                            if (!sökning)
                            {
                                Console.WriteLine("\nDin söknining gav tyvärr inget resultat. " + "\n" + "Antingen har du sökt på ett inlägg som inte finns sparat i arkivet eller så har det blivit fel i inmatningen, vänligen gör ett nytt försök!");
                                break;
                            }
                        }
                        break;

                    //Case 4, Användaren avslutar programmet
                    case 4:
                        //Tackar och bockar, på återseende till användaren.
                        Console.WriteLine("Du har valt att stänga ner programmet, bloggen avslutas. \n\n Ha en fortsatt fin dag så ses vi snart igen!");
                        //Loppen slutar här.
                        ellensBool = false;
                        break;


                    //Om användaren skriver in något som snappas upp av tryparse så vill jag skicka ut ett felmeddelande till användaren för att göra det tydligt hur programmet fungerar.
                    default:
                        Console.WriteLine("ERROR! Vänligen skriv in en siffra mellan 1, 2, 3 och 4 för att göra ett menyval" + "\n" + "För att programmet skall fungera så behöver du försöka igen med en siffra här nedan: " + "\n");
                        break;
                }
            }
            //Vi vill inte att programmet skall stängas ner direkt när den kör igenom programmet så vi anger Console.ReadLine för att ge användaren det aktiva valet att gå vidare i programmet och avsluta när så önskas.
            Console.ReadLine();
        }


    }
}
Lindehaven 771 – Lärare
Postad: 18 dec 2021 15:19

Flytta dessa kodrader utanför for-loopen så att sökningen får fortsätta genom hela listan:

if (!sökning) {

    Console.WriteLine("\nDin söknining gav tyvärr inget resultat. " + "\n" + "Antingen har du sökt på ett inlägg som inte finns sparat i arkivet eller så har det blivit fel i inmatningen, vänligen gör ett nytt försök!");

    break;

}

Ellenjernstrom 4
Postad: 18 dec 2021 16:33

Hej, tack för att du tar dig tid till att försöka hjälpa mig.

Jag gjorde följande ändring som jag förstod det utifrån ditt tips


case 3:
                        //Ber användaren att göra en sökning.
                        Console.WriteLine("Skriv in titeln på det blogginlägg du söker \n");
                        //Skapar en ny sträng variabel som blir sökningen som matas in av användaren.
                        string searchWord = Console.ReadLine();
                        //skapar ytterligare en bool för att göra det enklare för programmet att söka i listan efter det inmatade sökordet.
                        bool sökning = false;
                        //For loopen hjälper oss att bläddra genom varje element.
                        for (int i = 0; i < archive.Count; i++)
                        {   //Använder mig utav en jämförelseoperator. 
                            if (archive[i][0].ToUpper() == searchWord.ToUpper())
                            {
                                //Matchar sökordet och listan så får användaren följande meddelande utskrivet på skärmen.
                                Console.WriteLine("Vi kunde hitta ditt inlägg i arkivet " + archive[i][0], archive[i][1]);
                                Console.WriteLine("\nVänligen göra ett nytt menyval.");
                                Console.WriteLine("\n" + "_______________________________________" + "\n\t");
                                sökning = true;
                                break;
                            }

                        }
                        break;

                        //Om sökordet inte matchar med listan så får användarens följande utskrivet på sin skärm.
                        if (!sökning)
                        {
                            Console.WriteLine("\nDin söknining gav tyvärr inget resultat. " + "\n" + "Antingen har du sökt på ett inlägg som inte finns sparat i arkivet eller så har det blivit fel i inmatningen, vänligen gör ett nytt försök!");
                            break;
                        }

Nu får jag en varning som tyder på 'unreachable code detected’  och när jag kör koden så skrivs inget ut efter jag försöker söka.

Skriver jag in en titel som är sparad så är det blankt. 

Laguna Online 17496
Postad: 18 dec 2021 16:58

Det där 'break' efter for-loopen gör att man hoppar ur en yttre loop där och inte kör det som står nedanför.

Ellenjernstrom 4
Postad: 18 dec 2021 17:12

Hej, väldigt snällt av dig också att lägga ner tid på att hjälpa mig. 

Jättebra tips, jag tog bort break och varningen försvann pga det. 

Dock återstår samma problem som jag haft med att nu skrivs ingenting ut när jag söker. Varken på rätt sökning eller felsökning. 

Såhär ser det ut: 

Är det någon av er som vet varför det blir så det kommer inte fram några error eller varningar. Jag har heller inte som ni ser lagt in något som skulle ta bort texten i utskriften till användaren... 

Programmeraren 2191
Postad: 18 dec 2021 17:25

Lite saker du kan prova:

Skriv ut seachWord och archive[i][0] innan jämförelsen så du är säker på att du jämför rätt saker (när det funkar tar du bort utskriften).

Testa att sätta searchWord till något fast värde så att du vet att jämförelsen fungerar, t ex "aaa". Mata in inlägg med titeln "aaa" och prova.
Du kan också göra tvärtom, låta programmet skapa ett inlägg med en känd titel som du söker efter.

Kanske snällare mot användaren att endast matcha början av titeln mot searchWord:
if (archive[i][0].ToUpper().StartsWith(searchWord.ToUpper())

Laguna Online 17496
Postad: 18 dec 2021 17:34

Det verkar vara så i C# som i en del andra språk, att == är sann bara om objekten är på samma plats i minnet, och här lär det vara två olika objekt, fast de har samma innehåll. String.compare() är det man ska använda om jag förstår det rätt.

Ellenjernstrom 4
Postad: 18 dec 2021 17:43 Redigerad: 18 dec 2021 18:16

Ni har varit till stor hjälp allihopa. 

Jag har gjort lite finjusteringar eller vad jag nu ska kalla det och jag har tagit till mig alla tips. Med er hjälp har jag lyckats att få koden att fungera som den ska.

jämförelseoperatorn == var inte problemet, det blanka orsakades av att jag hade lagt Console.Clear precis i början av boolen och när jag flyttade på den så fungerade utskriften av resultatet i Case 3 precis som den ska.

Nu när jag kör programmet så fungerar det utan error, varningar eller andra problem.

TACK! till er alla, ha en fortsatt fin kväll och resterande helg! 

Programmeraren 2191
Postad: 18 dec 2021 17:43
Laguna skrev:

Det verkar vara så i C# som i en del andra språk, att == är sann bara om objekten är på samma plats i minnet, och här lär det vara två olika objekt, fast de har samma innehåll. String.compare() är det man ska använda om jag förstår det rätt.

Jag googlade också men kom fram till att == funkar:
https://www.tutorialsteacher.com/articles/compare-strings-in-csharp

Har du länken till det du hittade?

Laguna Online 17496
Postad: 18 dec 2021 17:51

Antagligen hittade jag något som behandlade ett annat språk, eftersom det fungerar nu.

Svara Avbryt
Close