Inlägg

Inlägg som micke_mj har skrivit i forumet
Av micke_mj
Skrivet av elBenko:

@micke_mj: Börja med att skriva om uppgiften med array först, fila lite på det. Såg precis att jag läst fel i din kod och uppfattat "lista" och "föremål" som samma, fel av mig där (skyller på klockslaget) ;D Så du kan bortse från mitt yrande om Add() i tidigare poster.

Förslag:

Skapa en array med längden 5 i början, men sätt inte tomma strängar som värden i alla elementen, låt dem vara så defaultar dem till null som du kan använda i kontroller sen när du kollar efter ledig plats i din "lägg till"-metod.

I din "lägg till"-metod loopar du igenom hela arrayen och letar upp första lediga plats, dvs. första värdet som är null, och lagrar inmatningen här. Detta gör du för att när användaren sen tar bort ett specifikt element så blir det "hål" i arrayen.

"ta bort"-metoden, om du ska tillåta användaren att ta bort specifika element, tar en inmatning i form av 1-5 för vilket element som ska tas bort. Detta element sätts därefter till null. Ska du bara rensa hela arrayen så sätt alla element till null direkt.

i "visa innehåll"-metoden får du även där loopa genom arrayen, men kör där en if för varje iteration som kollar efter element som inte är null, och printar dessa.

blir bara mer o mer förvirrad:) men tack ändå

Av micke_mj
Skrivet av elBenko:

@micke_mj: Vad jag menar är att du just nu skapar fem tomma element i din lista redan i början av programmet, vilket innebär att när du sen kör Add() så lägger du till _fler_ element i slutet av listan, därför får du fler än 5 element.

Så antingen skippar du att sätta en storlek på listan samt sätta nollvärden, som du gör nu, och kör med Add() i din case-sats, men se då till att ha en if som kollar så listan inte redan har 5 element. Eller så kör du som du gör nu, men skippar Add() och Clear() och jobbar direkt mot de befintliga elementen när du sätter dina värden - precis så som du gör i början av programmet när du sätter nollvärden.

Förstår du hur jag menar?

Edit: Sen för övrigt så printar ditt program "Lägg till _ett_ föremål", men du tvingar användaren att mata in 5 på stört, räcker det inte att ta emot ett åt gången?

Enligt uppgiften ska vi jobba med Arrays och har ju nu en Lista så borde ändra det och använda mig av string [] föremål istället.

Och Nej jag förstår inte vad du menar............ blir fucking galen på detta.
Så antingen skippar du att sätta en storlek på listan samt sätta nollvärden, som du gör nu, och kör med Add() i din case-sats, men se då till att ha en if som kollar så listan inte redan har 5 element. Eller så kör du som du gör nu, men skippar Add() och Clear() och jobbar direkt mot de befintliga elementen när du sätter dina värden - precis så som du gör i början av programmet när du sätter nollvärden.

Av micke_mj
Skrivet av elBenko:

TryParse godkänner ju inmatningen "5" därför fångar den inte ett fel där. Vad du kan göra är att lägga till en default i din switch-sats, så den avslutar på allt annat än 1-4.

switch (nr) { // dina case här default: Console.WriteLine("Felaktigt menyalternativ"); break; }

Edit:

TS, en lista, till skillnad från en vanlig array, expanderar, även om du satt en ursprunglig _minsta_ storlek, så när du kör Add() läggs ett nytt element till i slutet på listan (praktiskt taget så tror jag att listan kopieras till en ny lista).

I din switch-sats lägger du alltså till 5 nya element utöver de 5 tomma elementen du skapar i början av programmet.

Så antingen får du sluta använda Add() och Remove(), och arbeta direkt med elementen, dvs. sätta värden i case 1 och sätta tomma värden i case 2, eller så får du ha lite fler kontroller som t.ex. kolla om listan har 5 element innan du lägger till ett osv.
Förslagsvis är det inte fel att skriva metoder för alla funktioner som ditt program ska utföra. som att lägga till och/eller ta bort element, som du sen anropar i switch-satsen, så blir programmet mer överskådligt.

Vad menar du med att sätta värden i case 1 och tomma värden i case 2?
Jag vill ju att man ska lägga till 5 egna föremål.

Av micke_mj
Skrivet av micke_mj:

Hej, behöver hjälp med TryParse.
Jag vill att programmet skall fånga upp om man skriver något annat än 1, 2, 3 eller 4 så ska FEL VAL! skrivas ut.
Nu skrivs bara FEL VAL! ut om man väljer bokstav eller trycker ENTER. Om man skriver in siffran 5 så händer inget. Vill alltså att då oxå FEL VAL! skall skrivas ut.

{ List<string> lista = new List<string> { }; string[] föremål = new string[5]; //föremål[0] = ""; //föremål[1] = ""; //föremål[2] = ""; //föremål[3] = ""; //föremål[4] = ""; bool loop = true; //Skapa loopen while (loop) { Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till ett föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); string menyVal = Console.ReadLine();// Skapa sträng för varibel "menyval" int nr = 0; { //TryParse - skriver ut FEL VAL om bokstav eller enter väljs bool resultat = Int32.TryParse(menyVal, out nr); if (!resultat) { Console.WriteLine("FEL VAL!"); } } //Nedan förslag på TRY CATCH istället som oxå funkar /*try { nr = Convert.ToInt32(menyVal);//Convertera sträng till int(nr) } catch (Exception e) { Console.WriteLine(" Fel val!" + e); }*/ switch (nr) { case 1: Console.WriteLine("Lägg till högst 5 föremål i ryggsäcken: "); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in lista) Console.WriteLine(item); break; case 3: lista.Clear(); Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: loop = false; Console.WriteLine("HejDå!"); break; } Console.ReadLine(); }

Sen undrar jag oxå varför jag kan skriva in 6 föremål i ryggsäcken?
lista.Add(Console.ReadLine()); Finns det ju bara 5 av?

Av micke_mj

Ryggsäcken

Hej, behöver hjälp med TryParse.
Jag vill att programmet skall fånga upp om man skriver något annat än 1, 2, 3 eller 4 så ska FEL VAL! skrivas ut.
Nu skrivs bara FEL VAL! ut om man väljer bokstav eller trycker ENTER. Om man skriver in siffran 5 så händer inget. Vill alltså att då oxå FEL VAL! skall skrivas ut.

{ List<string> lista = new List<string> { }; string[] föremål = new string[5]; //föremål[0] = ""; //föremål[1] = ""; //föremål[2] = ""; //föremål[3] = ""; //föremål[4] = ""; bool loop = true; //Skapa loopen while (loop) { Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till ett föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); string menyVal = Console.ReadLine();// Skapa sträng för varibel "menyval" int nr = 0; { //TryParse - skriver ut FEL VAL om bokstav eller enter väljs bool resultat = Int32.TryParse(menyVal, out nr); if (!resultat) { Console.WriteLine("FEL VAL!"); } } //Nedan förslag på TRY CATCH istället som oxå funkar /*try { nr = Convert.ToInt32(menyVal);//Convertera sträng till int(nr) } catch (Exception e) { Console.WriteLine(" Fel val!" + e); }*/ switch (nr) { case 1: Console.WriteLine("Lägg till högst 5 föremål i ryggsäcken: "); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in lista) Console.WriteLine(item); break; case 3: lista.Clear(); Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: loop = false; Console.WriteLine("HejDå!"); break; } Console.ReadLine(); }

Av micke_mj
Skrivet av anon81912:

Blir det klarare såhär?

string isNotNumber = "inte ett nummer"; string isNumber = "1337"; try { double.Parse(isNotNumber); Console.WriteLine("Jag kommer inte att skrivas ut då double.parse kaster exception!"); } catch (Exception) { Console.WriteLine("Jag skrivs ut, exceptionen är hanterad!"); } try { double number = double.Parse(isNumber); Console.WriteLine("Jag kommer skrivas ut, parsningen gick bra!"); Console.WriteLine($"Numret är: {number}"); } catch (Exception) { Console.WriteLine("Jag skrivs inte ut, ingen exception"); }

Vad händer om du kör koden, stegar igenom detta?

Tack!
Hittade en annan lösning oxå.

double decimaltal = 0; bool loop = true; do { string tal; Console.WriteLine("Mata in ett tal med flera decimaler: "); tal = Console.ReadLine(); try { decimaltal = double.Parse(tal); loop = false; } catch (Exception e) { Console.WriteLine("Vafan, skriv ett decimaltal!"); Console.WriteLine(e.Message); } }while (loop) ; Console.WriteLine("{0} ---> {1}", decimaltal, Math.Round(decimaltal, 2)); Console.ReadLine(); }

Av micke_mj
Skrivet av anon81912:

Då hjälper jag dig med den första.

En exception kan kastas av metoder, närsomhelst, och "bubblar" därefter uppåt tills någon fångar den. Fångas den aldrig kraschar programmet.

try { MethodThatThrows(); } catch (Exception e) { Console.WriteLine(e.Message); }

Exempelvis skulle man kunna använda detta för att hantera att double.Parse(string number) inte lyckas parsa strängen och därmed kastar en exception.

Du kan garanterat lösa 2. Googla på "throw exception c#". Det är exakt precis frågan och första träffen kommer beskriva det i detalj.
Gillar du inte att söka på internet kan du börja här och leta dig vidare https://docs.microsoft.com/en-us/dotnet/csharp/programming-gu...
Delen om just exceptions förklarar det mesta för dig.

Klarar du inte av att söka på minsta lilla eller slå upp i din bok, där det står direkt så kommer du garanterat misslyckas med kursen och ingen här kommer vilja hjälpa dig mer.

Annars får du fråga din lärare eller dylikt.

Lyckas du lösa fråga 2 kan jag tänka mig att hjälpa dig på traven med fråga 3 och 4.

Det tragiska är att jag har fortfarande inte löst 1an som du ansåg du hjälpte mig med:D
Inte den blekast hur det ska skrivas och vad som skall vara där du skrev MethodThatThrows. Möjligtvis double.Parse(tal). Men det fungerar ändån inte. Aja tack iaf

Av micke_mj
Skrivet av ZalamanderRelic:

@micke_mj: med säkerhet

static void Main(string[] args) { Random rand = new Random(); int randNumber = rand.Next(1, 21); while (true) { Console.WriteLine("Gissa talet mellan 1 och 20"); int userInput; if (!int.TryParse(Console.ReadLine(),out userInput)) { Console.WriteLine("Du måse skriva in siffror"); continue; } if(userInput < randNumber) { Console.WriteLine("Du gissade för lågt"); } else if(userInput > randNumber) { Console.WriteLine("Du gissade för högt"); } else if(userInput == randNumber) { Console.WriteLine("Du gissade rätt"); break; } } Console.ReadKey(); } } }

Nu är jag väldigt tacksam att du hjälper mig men programmet fungerande inte klockrent när jag testade det.
Andra gången man gissar hinner man bara trycka på 1 tangent innan den går vidare?

Av micke_mj
Skrivet av ZalamanderRelic:

Du behöver inte skapa en variabel bool spela räcker med att skriva while(true) och sen använda break; när tal == speltal

Tar jag bort bool spela = true; och skriver while (true) samt avslutar med break i sista kodblocket så måste jag fortfarande trycka enter 1 gång extra för att få gissa igen

Av micke_mj
Skrivet av waswasd:

Jag tror en viktig fråga här är, vill du lära dig, eller vill du ha svaret?

Berättigat

Av micke_mj
Skrivet av anon81912:

Hur tror du att du ska göra? Här är några frågor du kan börja fundera på:

1. Hur fångar man en exception?
2. Hur kastar man en exception?
3. Vad händer när double.Parse misslyckas?
4. Vad returnerar double.TryParse och vad händer om den misslyckas?

googlat sönder nätet, men kommer ej fram till en lösning.
Vet det är superlätt men jag är så sjukt jevla dålig på programmering )))

Av micke_mj
Skrivet av snajk:

Jag hade nog lagt upp det så att du ställer frågan först utanför loopen och sen kör while (input != svaret)...

Sen if-satser i loopen för de olika alternativen, för stort, litet osv. med ny fråga på slutet förstås.

Står att man inte kan ha != när bool används?
while (spela != speltal)
{

Av micke_mj
Skrivet av kundun:

Jo du har lite tankefel i hur den kollar talet.

Kolla igenom flödet:
För varje körning i while ska den ju kolla om det är ett tal mellan 1-20. Om det är så ska den berätta om talet är för stort/litet eller rätt. Om det inte är så ska den säga det och börja om igen.

Sen vill du ju inte kolla om ett tal är mindre än speltalet om den redan gått in i if-satsen där den är större an.
Kolla på if(){}else if(){}

Skickades från m.sweclockers.com

Sorry men fattar 0

Av micke_mj

C# Avrunda flyttal

Hej,

Återigen en enkel övn som är för svår för en annan...
Den funkar som jag vill nu, men hur får jag in undantagshantering? TryCatch, TryParse etc? Hilfe!!!
Ok att skriva om den helt om det finns bättre sätt.

static void Main(string[] args) { string tal; Console.WriteLine("Mata in ett tal med flera decimaler: "); tal = Console.ReadLine(); double decimaltal = double.Parse(tal); Console.WriteLine("{0} ---> {1}", decimaltal, Math.Round(decimaltal,2)); Console.ReadLine(); }

Av micke_mj
Skrivet av kundun:

START SÅ LÄNGE Tills användaren gissar rätt tal Skriv ut ” Gissa på ett tal mellan 1-20 OM Användaren skriver ett tal Gissa igen? Här vill man kanske kolla om gissningen var rätt eller fel! ANNARS Användaren skriver bokstav Informera att tal måste skrivas OM tal är för litet Tal för litet, gissa igen OM tal är för stort Tal för stort, gissa igen SLUT OM rätt tal Rätt gissat

Tänk på att du kan nästla OM(if):
If(){
if(){
}
}

Skickades från m.sweclockers.com

Den funkar inte riktigt klockrent.
Nu blir det så här
Gissa på ett tal
12
Det inmatade talet är för stort, försök igen
11

Gissa på ett tal mellan 1 och 20!

Varför? Sista vill jag att den säger Det inmatade talet är för stort/litet, försök igen.

Av micke_mj

Och detta blev pseudokoden

START SÅ LÄNGE Tills användaren gissar rätt tal Skriv ut ” Gissa på ett tal mellan 1-20 OM Användaren skriver ett tal Gissa igen ANNARS Användaren skriver bokstav Informera att tal måste skrivas OM tal är för litet Tal för litet, gissa igen OM tal är för stort Tal för stort, gissa igen SLUT OM rätt tal Rätt gissat

Av micke_mj

Så här fick ja det till iaf

{ Random slumpat = new Random(); // skapar ett random objekt int speltal = slumpat.Next(1, 20); // Använder Next för att slumpa tal mellan 2 angivna tal bool spela = true; // Variabel för att fortsätta tills rätt siffra skrivits in while (spela) //Tog bort ! <-- { int tal; Console.WriteLine("\n\tGissa på ett tal mellan 1 och 20: "); bool ombokstav = Int32.TryParse(Console.ReadLine(), out tal);//Använder TryParse, om bokstav skrivs in tas det som en nolla if (tal < speltal) { if (ombokstav) { } else { Console.WriteLine("Du måste skriva ett tal"); } } { Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen."); Console.ReadLine(); } if (tal > speltal) { Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");// + <-- fattades Console.ReadLine(); } if (tal == speltal) // Ett = fattades { Console.WriteLine("\tGrattis, du gissade rätt!"); Console.ReadLine(); // La till ReadLine då programmet avslutades direkt spela = false; } } } // la till } <--

Av micke_mj
Skrivet av kundun:

Om du inte använder TryParse() kan du använda try/catch för att hantera den exception som kan komma från Parse():

try{ tal = int32.Parse(Console.ReadLine()); }catch{ Console.WriteLine("Du måste skriva in ett tal!"); }

Du kan alltid kolla vad metoderna du använder returnerar. TryParse() returnerar antingen true eller false och genererar inga exceptions, så den behöver inte hanteras i en try/catch. Parse() gör däremot det.

TryParse() metoden kan du tänka dig såhär:

public int TryParse(string s){ try{ return int32.Parse(s); }catch{ return 0; } }

Tacksam för hjälp men fattar inte var jag lägger in detta i befintligt program/kod.

Av micke_mj

Ny övn =)

Hej, kan någon vänlig själ säga hur man postar koden läslig här?:)

Iaf, jag behöver hjälp med att få in try catch i nedan kod.

Hur får jag den att fungera?

// Deklaration av variabler Random slumpat = new Random(); // skapar ett random objekt int speltal = slumpat.Next(1, 20); // anropar Next metoden för att skapa ett slumptal mellan 1 och 20 // Gräns mellan minsta och största värde saknades bool spela = true; // Variabel för att kontrollera om spelet ska fortsätta köras while (spela) //Tagit bort ! från (spela) { int tal; Console.WriteLine("\n\tGissa på ett tal mellan 1 och 20: "); //int tal = Convert.ToInt32(Console.ReadLine()); Int32.TryParse(Console.ReadLine(), out tal);//försökte med TryParse för att undvika Format Exceptions. if (tal < speltal) try { Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen."); Console.ReadLine(); } catch (Exception) { Console.WriteLine("DU måste skriva in ett tal mellan 1-20"); } if (tal > speltal) { Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");// + tecken saknades Console.ReadLine(); } if (tal == speltal) // = tecken saknades { Console.WriteLine("\tGrattis, du gissade rätt!"); //Program avslutas utan att berätta svaret Console.ReadLine(); spela = false; }

Av micke_mj
Skrivet av anon81912:

Lite mer modulärt

void Main() { var persons = new List<string>(); var personsToRead = 3; for (int i = 0; i < personsToRead; i++) { persons.Add(ReadPerson(i)); } Console.WriteLine($"Story about {string.Join(", ", persons.Take(persons.Count() - 1))} and {persons.Last()}"); Console.WriteLine("Bacon ipsum...."); } public string ReadPerson(int i) { Console.WriteLine($"Person {i}: "); return Console.ReadLine(); }

Tänk på att det du skriver är program, som består av kod, när du pratar om det. Det låter som himla knasigt annars.
"Jag skall skriva en kod som..." -> "Jag skall skriva ett program som"

Får följande meddelande "Program does not contain a static 'Main' method suitable for an entry point"! Why?=)