Permalänk
Medlem

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;

Permalänk
Medlem

@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.

Permalänk
Hedersmedlem

@afram94 *Tråd flyttad*

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

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Medlem

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.

Permalänk
Medlem

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

Permalänk
Medlem

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

Permalänk
Medlem

@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;

Permalänk
Medlem

@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.

Permalänk
Medlem

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å.

Permalänk
Medlem

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

Permalänk
Medlem

@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.

Permalänk
Medlem

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?

Visa signatur

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

Permalänk
Medlem

@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;

Permalänk
Medlem

@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

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem

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;

}
}
}
}
}
}

Permalänk
Medlem

@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.

Permalänk
Medlem

@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

Permalänk
Medlem

Hej igen!
kan nogån hjälpa mig på den här.
int a;
int b = 5;
int c = a + b;

Beskriv vad som händer i koden ovan, rad för rad, och vad resultatet av koden är. Finns det några problem med koden?

Permalänk
Medlem
Skrivet av afram94:

Hej igen!
kan nogån hjälpa mig på den här.
int a;
int b = 5;
int c = a + b;

Beskriv vad som händer i koden ovan, rad för rad, och vad resultatet av koden är. Finns det några problem med koden?

Prova skapa en console applikation och skriv in koden, se vad som händer. Du kan även göra det direkt online här