Trädvy Permalänk
Medlem
Registrerad
Mar 2019

programmering 1, loggboken

Hej jag har en fråga om loggboken uppgift.
jag har en uppgift '' loggboken'' som jag har kodat två gånger och min lärare skickade det tillbaka. den sista gången var idag och han skickade till mig en kommentar. jag vill bara vara säker om jag har fixat problemmet eller inte. dessutom har jag en fråga om sökning men jag hoppas att ni kan svara om det här först.

// min lärare kommentar
- Just nu sparas samma vektor om och om igen. Det gör att vi inte kan spara flera vektorer, då vi sparar samma referens och den ersätter sig själv. Deklarera vektorn "post" inom menyval 1 istället, så vi skapar en ny vektor som vi sedan sparar. Kom ihåg; vi ska arbeta mot loggboken i första hand, så vi behöver inte referera till "post" utanför menyval 1.

// det här min gamla kod

static void Main(string[] args) { List<string[]> loggBok = new List<string[]> { }; //skapar en lista för att spara alla inlägg string[] post = new string[3]; post[0] = "titel"; post[1] = "inlägg"; post[2] = "tid"; DateTime tiden = DateTime.Now; // DateTime metod Console.WriteLine(tiden); // Datum skrivas ut bool isRunning = true; // Skapa loop så att man återvänder till meny och kan avsluta programmet while (isRunning) { { //Ber användaren göra ett val Console.WriteLine("\nVälkommen till loggboken!"); Console.WriteLine("[1] Skriv nytt inlägg i loggboken"); Console.WriteLine("[2] Skriv ut alla loggar"); Console.WriteLine("[3] Sök inlägg i loggboken"); Console.WriteLine("[4] Avsluta programmet"); Console.Write("\nGör ett val i menyn: "); int Menyval; int.TryParse(Console.ReadLine(), out Menyval); //Läser av valet och fångar uppp felaktig inmatning. //Undantagshantering TryParse switch (Menyval) { case 1: //sparar titeln i index 0 i vektorn "post" Console.WriteLine("Skriv en titel till ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 tiden = DateTime.Now; //hämtar tid och datum just nu string nu = Convert.ToString(tiden); //skapar en stringvariabel att kunna spara konverterad tid i post[2] = nu; //sparar tiden för skapat inlägg loggBok.Add(post); // spara alla inlägg i loggboken break;

// och det här efter att jag har fixat den.

static void Main(string[] args) { List<string[]> loggBok = new List<string[]> { }; //skapar en lista för att spara alla inlägg string[] post = new string[3]; string titel = ""; string inlägg = ""; DateTime tiden = DateTime.Now; // DateTime metod Console.WriteLine(tiden); // Datum skrivas ut bool isRunning = true; // Skapa loop så att man återvänder till meny och kan avsluta programmet while (isRunning) { { //Ber användaren göra ett val Console.WriteLine("\nVälkommen till loggboken!"); Console.WriteLine("[1] Skriv nytt inlägg i loggboken"); Console.WriteLine("[2] Skriv ut alla loggar"); Console.WriteLine("[3] Sök inlägg i loggboken"); Console.WriteLine("[4] Avsluta programmet"); Console.Write("\nGör ett val i menyn: "); int Menyval; int.TryParse(Console.ReadLine(), out Menyval); //Läser av valet och fångar uppp felaktig inmatning. //Undantagshantering TryParse switch (Menyval) { case 1: string[] loggbok = new string[3]; Console.Write("Skrivitel på ditt inlägg: "); titel = Console.ReadLine(); Console.WriteLine("Skriv ditt inlägg: "); Console.WriteLine(tiden); Console.WriteLine(titel); inlägg = Console.ReadLine(); post[0] = titel; post[1] = inlägg; post[2] = Convert.ToString(tiden); loggBok.Add(post); break;

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@afram94: Problemet är detta:

List<string[]> loggBok = new List<string[]> { }; string[] post = new string[3]; post[0] = "Titel 1"; post[1] = "Inlägg 1"; post[2] = "Tid 1"; loggBok.Add(post); // Lägger endast till en referens till post i loggBok-listan! post[0] = "Titel 2"; // Första inlägget i loggboken kommer nu vara {"Title 2", "Inlägg 1", "Tid 1"}.

D.v.s. när du kör Addpost så läggs endast en referens till datan som post pekar på till i listan, inte en kopia. Så varje gång du lägger till ett nytt inlägg så ändras i praktiken alla inlägg i listan till det inlägget, eftersom listan bara kommer innehålla en massa referenser till samma data.

Din lärare har redan talat om för dig hur du ska lösa problemet, d.v.s. flytta deklarationen av post till att vara under case 1 i din menykod. Då skapas en ny post-variabel varje gång du kommer dit:

{ // <- Nytt block string[] post = new string[3]; } // Här slutar blocket, och post slutar existera.

D.v.s. en variabel "lever" bara inom sitt block, när blocket tar slut så försvinner variabeln. Så länge som det finns referenser till datan som variabeln pekade på så kommer dock datan att finnas kvar, men själva variabeln som pekar på datan kommer inte längre existera.

Trädvy Permalänk
Forumledare
Kent
Registrerad
Jan 2005

@afram94 *Tråd flyttad*

Flyttade tråden till rätt forumdel och la till [code][/code]-taggar.

Synpunkter eller frågor gällande modereringen? Då kan du kontakta mig eller moderatorerna.
Danskjävel så stavar som en kratta..

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

tack för svaret!

@perost:
förlåt jag är ny på programmering och mitt språk hjälper mig inte så mycket men jag vill bara fråga om du har kollat på både kodar som jag har skickat. jag tror att den andra kod är rätt eftersom jag jag flyttade post under case 1.
dessutom kan du svara på en annan fråga vad gäller sökning om du har tid.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@screamin-daemon: förlåt mig för detta. det är den första gången som jag skapar en tråd

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@afram94: Jag kan inte se att du flyttat på post i din nya kod, deklarationen ligger fortfarande kvar i börjav av Main.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@perost:
case 1:
string[] loggbok = new string[3];

Console.Write("Skrivitel på ditt inlägg: ");
titel = Console.ReadLine();
Console.WriteLine("Skriv ditt inlägg: ");
Console.WriteLine(tiden);
Console.WriteLine(titel);

inlägg = Console.ReadLine();
post[0] = titel;
post[1] = inlägg;
post[2] = Convert.ToString(tiden);
loggBok.Add(post);

break;

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@afram94: Ja, du verkar ha deklarerat en ny variabel loggbok som inte används någonstans, och som dessutom har ett väldigt förvirrande namn eftersom du redan har loggBok. Deklarationen av post har du inte ändrat på alls.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

tack nu förstår jag, kan du svara på den här frågan också är du snäll.

@perost:
// den här är min sökning kod
// Söker i loggboken
Console.Write("Skriv in ett sökord: "); // Skriver ut texten "Skriv in ett sökord"
string sökOrd = Console.ReadLine(); // Deklarerar ordet sökOrd
for (int i = 0; i < post.Length; i++) // Söker igenom alla inlägg
{
if (post[i].ToUpper() == sökOrd.ToUpper())
{
Console.WriteLine(post[i]); // visa innehållet som användaren har skrivit
break;
}
else
{
Console.WriteLine("Ordet finns ej"); // om ordet finns inte i loggboken så skriv ut '' ordet finns ej''
}
}
break;

// men jag förstår inte min lärarens kommentar=>
- Sökningen ser bättre ut, men då den utgår från vektorn och inte loggboken så blir det fel. Se till att sökningen går igenom loggbokens alla vektorer, och testar varje vektors titel mot ett sökord.
jag kommer att bli väldigt tacksam om du svarar på den här frågan också.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@afram94: Som läraren skriver så söker du just nu igenom post, inte loggBok.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@perost: när jag söker igenom loggbok så blir det fel i koden.
men tack iallafall för hjälpen det var snällt av dig att hjälpa mig, jag ska försöka lite själv.

Trädvy Permalänk
Medlem
Plats
Ystad
Registrerad
Jul 2002

static void Main(string[] args)
{
List<string[]> loggBok = new List<string[]> { }; //skapar en lista för att spara alla inlägg

DateTime tiden = DateTime.Now; // DateTime metod
Console.WriteLine(tiden); // Datum skrivas ut
bool isRunning = true; // Skapa loop så att man återvänder till meny och kan avsluta programmet
while (isRunning)

{
{
//Ber användaren göra ett val
Console.WriteLine("\nVälkommen till loggboken!");

Console.WriteLine("[1] Skriv nytt inlägg i loggboken");
Console.WriteLine("[2] Skriv ut alla loggar");
Console.WriteLine("[3] Sök inlägg i loggboken");
Console.WriteLine("[4] Avsluta programmet");

Console.Write("\nGör ett val i menyn: ");

int Menyval;
int.TryParse(Console.ReadLine(),
out Menyval); //Läser av valet och fångar uppp felaktig inmatning. //Undantagshantering TryParse

switch (Menyval)
{
case 1:
//sparar titeln i index 0 i vektorn "post"
Console.WriteLine("Skriv en titel till ditt inlägg: ");

string[] newLoggInsert = new string[3];
newLoggInsert[0] = Console.ReadLine();

//sparar inlägget i index 1
Console.WriteLine("Skriv ditt inlägg:");
newLoggInsert[1] = Console.ReadLine();

//sparar tiden i index 2
tiden = DateTime.Now; //hämtar tid och datum just nu
string
nu = Convert
.ToString(tiden); //skapar en stringvariabel att kunna spara konverterad tid i
newLoggInsert[2] = nu; //sparar tiden för skapat inlägg

loggBok.Add(newLoggInsert); // spara alla inlägg i loggboken
break;
}

Console.WriteLine(loggBok.Count);
}
}
}

Ser du skillnaden på var deklarationen av vektorn sker?

E6700@3,1 Ghz, 4 GB, 8800GT@720/1050, 750 GB , Windows XP
3dmark06 : 12600

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@IamPoFFo:
ja jag har sett skillnaden och jag gjorde såhär innan du skickar ditt meddelande, kan du säga till om jag har gjort rätt.
jag adderade Console.WriteLine(loggBok.Count); av din kod

static void Main(string[] args)
{
List<string[]> loggBok = new List<string[]> { }; //skapar en lista för att spara alla inlägg

DateTime tiden = DateTime.Now; // DateTime metod
Console.WriteLine(tiden); // Datum skrivas ut
bool isRunning = true; // Skapa loop så att man återvänder till meny och kan avsluta programmet
while (isRunning)

{
{
//Ber användaren göra ett val
Console.WriteLine("\nVälkommen till loggboken!");

Console.WriteLine("[1] Skriv nytt inlägg i loggboken");
Console.WriteLine("[2] Skriv ut alla loggar");
Console.WriteLine("[3] Sök inlägg i loggboken");
Console.WriteLine("[4] Avsluta programmet");

Console.Write("\nGör ett val i menyn: ");

int Menyval;
int.TryParse(Console.ReadLine(),
out Menyval); //Läser av valet och fångar uppp felaktig inmatning. //Undantagshantering TryParse

switch (Menyval)
{
case 1:
//sparar titeln i index 0 i vektorn "post"
Console.WriteLine("Skriv en titel till ditt inlägg: ");

string[] post = new string[3];
post[0] = Console.ReadLine();

//sparar inlägget i index 1
Console.WriteLine("Skriv ditt inlägg:");
post[1] = Console.ReadLine();

//sparar tiden i index 2
tiden = DateTime.Now; //hämtar tid och datum just nu
string
nu = Convert.ToString(tiden); //skapar en stringvariabel att kunna spara konverterad tid i
post[2] = nu; //sparar tiden för skapat inlägg

loggBok.Add(post); // spara alla inlägg i loggboken
Console.WriteLine(loggBok.Count);
break;

Trädvy Permalänk
Medlem
Plats
Ystad
Registrerad
Jul 2002

@afram94: Ja nu kan din kan loggbok hålla flera posts, detta kan du ju nu bekräfta eftersom loggBok.Count ökar med ett för varje nytt inlägg som du gör

E6700@3,1 Ghz, 4 GB, 8800GT@720/1050, 750 GB , Windows XP
3dmark06 : 12600

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@IamPoFFo:
tack så jätte mycket för hjälpen, det var snällt av dig

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

min lärare sa att jag behöver skriva min sökning utan att använda First och Last; de är genvägar baserade i en LINQ-struktur. Använd indexering istället.
Uppgiften öppnas för komplettering.
jag har givit upp faktiskt. om någon kan hjälpa mig på den så jag kommer att vara väldiggt tacksam.

static void Main(string[] args)
{

List<string[]> loggBok = new List<string[]> { }; //skapar en lista för att spara alla inlägg

DateTime tiden = DateTime.Now; // DateTime metod
Console.WriteLine(tiden); // Datum skrivas ut

bool isRunning = true; // Skapa loop så att man återvänder till meny och kan avsluta programmet

while (isRunning)

{
{
//Ber användaren göra ett val
Console.WriteLine("\nVälkommen till loggboken!");

Console.WriteLine("[1] Skriv nytt inlägg i loggboken");
Console.WriteLine("[2]Skriv ut alla loggar");
Console.WriteLine("[3] Sök inlägg i loggboken");
Console.WriteLine("[4] Avsluta programmet");

Console.Write("\nGör ett val i menyn: ");

int Menyval;
int.TryParse(Console.ReadLine(), out Menyval); //Läser av valet och fångar uppp felaktig inmatning. //Undantagshantering TryParse

switch (Menyval)
{
case 1:

string[] post = new string[3];
post[0] = "titel";
post[1] = "inlägg";
post[2] = "tid";

Console.WriteLine("Skriv en titel till ditt inlägg: ");

post[0] = Console.ReadLine();

tiden = DateTime.Now; //hämtar tid och datum just nu
string nu = Convert.ToString(tiden); //skapar en stringvariabel att kunna spara konverterad tid i
post[1] = nu; //sparar tiden för skapat inlägg

Console.WriteLine("Skriv ditt inlägg:");
post[2] = Console.ReadLine();

loggBok.Add(post); // spara alla inlägg i loggboken
Console.WriteLine("du har " + loggBok.Count + " inlägg i loggboken");
break;

case 2:
foreach (string[] text in loggBok) // foreach loop
{
Console.WriteLine("\nHär är dina inlägg i loggboken:\n ");
Console.WriteLine("{0}", text); // skriv ut första inlägg från första index
Console.WriteLine("{1}", text); // skriv ut andra inlägg från andra index
Console.WriteLine("{2}", text); // skriv ut tredje inlägg från tredje index
}
break;

case 3:
Console.WriteLine("Enter part of title:");
string sökord = Console.ReadLine();

for (int i = 0; i < loggBok.Count; i++)
{
if (loggBok[i].First() == sökord)
Console.WriteLine("Titel: " + loggBok[i].First() + "\nText: " + loggBok[i].Last());
}
Console.ReadLine();
break;

case 4:
isRunning = false; // avsluta programmet
break;

default:
Console.WriteLine("Försök igen"); // fel meddelande om användaen väljer en meny som inte finns
break;

}
}
}
}
}
}

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@afram94: Du kan använda [] för att indexera allt som går att indexera, inklusive element i en lista. D.v.s. eftersom loggBok är en lista av string-arrayer så ger loggBok[0] dig den första arrayen i listan. Om du vill få ut den första strängen i den arrayen så är det bara att indexera igen, d.v.s. (loggBok[0])[0], eller loggBok[0][0] som man normalt brukar skriva det.

Ett annat sätt att lösa det på är att spara elementet du vill använda i en temporär variabel:

string[] logg = loggBok[i]; if (logg[i] == sökord) { ... }

Jag hade använt en temporär variabel i det här fallet, eftersom koden blir mindre rörig då. Men det spelar ingen större roll vilken lösning du väljer.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@perost: Tack så jätte mycket nu funkar det som det ska. jag försökte att göra så förut men jag hade ett problem med att lägga ''=='' på if-satsen, men nu efter att jag har använt temporär variabel så blir det möjligt. Dessutom har du lärt mig en ny sak på c#
Tack igen