Programmering 1, banksimulator med switch-sats (ännu en Noob)

Permalänk
Medlem

Programmering 1, banksimulator med switch-sats (ännu en Noob)

God kväll
Jag håller på att läsa programmering 1 och har kört fast stenhårt.
Meningen är att jag ska skapa en banksimulator som låter användaren sätta in och ta ut cash och kunna se sitt saldo tills hen väljer avsluta.
för att kunna göra detta så måste jag loopa skiten, och det är där mitt främsta problem uppstår (ev, andra problem har jag inte kunnat se än, eftersom jag knappt förstår språket och inte ser sådant förrän felet uppstår när programmet körs).

Det här är iaf min kod..... Hilfe! :

{

int saldo = 500;

do

Console.WriteLine("[I]nsättning" ); // - På den här raden säger programmet 'Syntax error' och att den förväntar sig 'while' och '(' .
Console.WriteLine("[U]ttag");´// - Här säger den att den "cannot convert void to bool"
Console.WriteLine("[S]aldo");
Console.WriteLine("[A]vsluta");
string val = Console.ReadLine(); // - När jag testade att ta bort alla console.write förutom den första så står det "invalid expression term 'string' "

switch (val)
{
case "I":
case "i":
{
Console.WriteLine("välj belopp att sätta in: ");
int saldoin = Console.Read();
saldoin = saldo;
saldo += saldoin;
}
break;

case "U":
case "u":
{
Console.WriteLine("välj belopp att ta ut: ");
int saldout = Console.Read();
saldout = saldo;
saldo -= saldout;
}
break;

case "S":
case "s":

{
Console.WriteLine("Ditt saldo är: ");
Console.WriteLine(saldo + " kr");
Console.ReadLine();
}
break;

default:
Console.WriteLine("det var fel alternativ");
break;

}
while (val != "A" || val != "a") ;

}

Permalänk
Medlem

Du har helt enkelt glömt en { efter do, resten av felen är bara kompilatorn som blivit förvirrad av det första felet (nybörjartips: börja alltid med att lösa det första felet, kompilera om, upprepa om det fortfarande finns fel).

Ett litet tips när du skriver kod här på forumet, använd code-taggar ([code]kod här[/code]), annars blir koden svår att läsa.

Permalänk
Medlem

@perost:

åh men herregud! Tack så jättemycket, känner mig hyfsat dum nu.
Jag har stirrat på den där skiten i en hel dag utan att komma på vad felet var. xD

Tack för tipset om hur jag skriver koden här, good to know.

Nu ska jag bara lösa resten av problemen för jag verkar inte ha gjort något rätt öht.

Permalänk
Medlem

@ondurdis:

Om du inte väldigt ofta känner dig riktigt dum när du lär dig programmera är du antingen ett riktigt geni eller så har du extremt mycket tur

Skulle också rekommendera att använda indragningar (såvida de inte bara försvunnit när du postade kod utan kodtaggar här).

Permalänk
Medlem

Tack, det där kände jag att jag behövde höra innan jag grottar ner mig i självförakt över att jag inte kan allt än.

Nu löste sig det mesta faktiskt, jag ska bara komma på hur jag får programmet att avsluta istället för att loopa när jag väljer att avsluta. Och att jag inte ska bli loopad tillbaka till menyn igen efter varje grej jag sedan gör i switchen.
ev. få int att också kunna tolka bokstäver med när jag ändå håller på, så jag kan använda "avsluta" som ett sätt att återgå till menyn när jag är klar i själva switchen.

Wish me luck.

Permalänk
Medlem
Skrivet av ondurdis:

Tack, det där kände jag att jag behövde höra innan jag grottar ner mig i självförakt över att jag inte kan allt än.

Nu löste sig det mesta faktiskt, jag ska bara komma på hur jag får programmet att avsluta istället för att loopa när jag väljer att avsluta. Och att jag inte ska bli loopad tillbaka till menyn igen efter varje grej jag sedan gör i switchen.
ev. få int att också kunna tolka bokstäver med när jag ändå håller på, så jag kan använda "avsluta" som ett sätt att återgå till menyn när jag är klar i själva switchen.

Wish me luck.

För att avbryta en loop så undersök break. Den hoppar helt enkelt ur närmaste loop.
Sedan så är ju val redan en string i din kod. Att jämföra en bokstav, som du gör nu, eller flera är samma förfarande. Så typ
if(val=="a") eller if(val=="abc").

Då kan du alltså köra loopen i oändlighet och använda break för att avsluta loopen när användaren vill det

Skickades från m.sweclockers.com

Permalänk
Medlem

Tips: Istället för att göra dubbla cases för varje bokstav t.ex. "A" "a" så kan du i din switch() göra val.ToLower(), på så vis gör du alla bokstäver lowercase och då räcker det att du jämför mot små bokstäver.
Oftast när man ska jämföra strängar eller filtrera en lista efter en sökning så brukar man göra det case insensetive, finns lite olika sätt att göra det på.
Man vill ju gärna att "Hej" ska matcha "hej" också Utan att behöva göra 5 olika cases för varje sätt ett ord kan skrivas, användaren kanske råkar mata in "hEj" eller "heJ".

Permalänk
Medlem

arrays(vektorer)

Istället för att skapa en ny tråd tänkte jag fortsätta på den jag redan har, ser tillräckligt många forumpostar från människor som läser samma distanskurs som mig.
Jag får iaf väldigt fattig feedback från min "lärare".

Jag har iaf fastnat i det här med arrays (vektorer som läromaterialet kallar det). Vad jag har läst mig till är det lite krångligt med dessa men det krävs av oss att vi arbetar med dom.

Jag har en array som jag har fyllt med fem stycken namn, och när dessa har blivit inlagda av användaren så skrivs de ut.
Nästa uppgift är att användaren ska kunna välja ett index och ersätta namnet där med ett nytt namn och så ska alla namn, inklusive det nya skrivas ut.

hur i hela friden löser jag detta?
jag har provat olika grejer på måfå men eftersom jag inte riktigt vet vad jag letar efter så blir det liksom inge bra.

Ska väl tillägga att användaren ska kunna avsluta om det trycker på Q ,men det löser jag sen.

static void Main(string[] args) { string[] namnvektor = new string[5]; for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("Ange namn för person nummer {0}: ",i); string namn = Console.ReadLine(); namnvektor[i] = namn; } Console.WriteLine("\n"); for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("{0}. {1}", i, namnvektor[i]); } }

ändrat i koden.
Permalänk
Medlem
Skrivet av ondurdis:

Istället för att skapa en ny tråd tänkte jag fortsätta på den jag redan har, ser tillräckligt många forumpostar från människor som läser samma distanskurs som mig.
Jag får iaf väldigt fattig feedback från min "lärare".

Jag har iaf fastnat i det här med arrays (vektorer som läromaterialet kallar det). Vad jag har läst mig till är det lite krångligt med dessa men det krävs av oss att vi arbetar med dom.

Jag har en array som jag har fyllt med fem stycken namn, och när dessa har blivit inlagda av användaren så skrivs de ut.
Nästa uppgift är att användaren ska kunna välja ett index och ersätta namnet där med ett nytt namn och så ska alla namn, inklusive det nya skrivas ut.

hur i hela friden löser jag detta?
jag har provat olika grejer på måfå men eftersom jag inte riktigt vet vad jag letar efter så blir det liksom inge bra.

Ska väl tillägga att användaren ska kunna avsluta om det trycker på Q ,men det löser jag sen.

{ string[] namnvektor = new string[5]; for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("Ange namn för person nummer {0}: ",i); string namn = Console.ReadLine(); namnvektor[i] = namn; } for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine(namnvektor[i]); }

Du har redan inmatning som du lagrar i arrayen i din forsats. På plats i lagrar du det användaren matar in.

Jag hade låtit användaren mata in ett tal mellan 1-5 för att ta reda på vilket värde i arrayen som ska bytas ut.

Sedan hade jag subtraherat 1(för array går 0-4 om den har fem element).

Sedan hade jag frågat användaren vilket nytt namn som ska in. Kanske även visat vilket som kommer tas bort innan det tas bort och en "är du säker: ja/nej".

Sist hade jag bara satt namnet på användarens inmatade plats(minus ett) till namnet som blev inmatat. Detta är ju så enkelt som namnVektor[inmatadPlats-1] = inmatatNamn.

Att göra det jag nyss gjorde, försöka skriva om det man ska programmera till vanligt språk innan skriver om det till kod är ett bra sätt att förstå vad man ska göra. Även i framtida uppgifter

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av ondurdis:

Jag har iaf fastnat i det här med arrays (vektorer som läromaterialet kallar det).

Vektor är ett matematiskt begrepp, och kan representeras som en 1-dimensionell array. På samma sätt kan man se en 2-dimensionell array som en matris (t.ex. int[,] matrix = new int[3, 3]). Bara så du vet vart termen kommer ifrån

Skrivet av ondurdis:

Jag har en array som jag har fyllt med fem stycken namn, och när dessa har blivit inlagda av användaren så skrivs de ut.
Nästa uppgift är att användaren ska kunna välja ett index och ersätta namnet där med ett nytt namn och så ska alla namn, inklusive det nya skrivas ut.

hur i hela friden löser jag detta?

Du har redan en for-loop där användaren får sätta värdet på alla elementen i arrayen. Här ska du göra samma sak, fast istället för att loopa igenom hela arrayen så läser du in ett index från användaren istället. Om du vill dela upp det lite så kan du börja med att skriva kod som ändrar t.ex. det andra namnet i arrayen, och när det fungerar så kan du lägga till att användaren får mata in ett index istället.

Permalänk
Medlem
Skrivet av NisseG91:

Att göra det jag nyss gjorde, försöka skriva om det man ska programmera till vanligt språk innan skriver om det till kod är ett bra sätt att förstå vad man ska göra. Även i framtida uppgifter

Skickades från m.sweclockers.com

Det var ju lite dumt av mig att jag inte skrev, jag har ju kommit så långt att jag vet vad jag vill göra, det är bara det att jag faktiskt inte vet hur själva koden ska se ut.

Skrivet av perost:

Vektor är ett matematiskt begrepp, och kan representeras som en 1-dimensionell array. På samma sätt kan man se en 2-dimensionell array som en matris (t.ex. int[,] matrix = new int[3, 3]). Bara så du vet vart termen kommer ifrån

Du har redan en for-loop där användaren får sätta värdet på alla elementen i arrayen. Här ska du göra samma sak, fast istället för att loopa igenom hela arrayen så läser du in ett index från användaren istället. Om du vill dela upp det lite så kan du börja med att skriva kod som ändrar t.ex. det andra namnet i arrayen, och när det fungerar så kan du lägga till att användaren får mata in ett index istället.

Ja, jag läste ett av dina svar i en annan tråd som handlade om vektorer/arrays om just detta och antog att det var därför jag fick fram så lite information när jag sökte efter just vektorer.

Permalänk
Medlem

Det är så oerhört skönt att ha er som bollplank, ni gav mig tillräckligt mycket information för att jag skulle lösa det själv.
Helt jävla underbart.
Nu hoppas jag bara att ni tycker det ser rätt ut.

{ string[] namnvektor = new string[5]; for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("Ange namn för person nummer {0}: ",i+1); string namn = Console.ReadLine(); namnvektor[i] = namn; } Console.WriteLine("\n"); for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("{0}. {1} \n", i+1, namnvektor[i]); } Console.WriteLine("Välj en siffra där du vill byta ut namnet: 1-5"); int inmatadnr = int.Parse (Console.ReadLine()); Console.WriteLine("välj ett nytt namn på {0}",namnvektor [inmatadnr-1]); string nyttnamn = Console.ReadLine(); namnvektor[inmatadnr-1] = nyttnamn; Console.WriteLine("\n"); for (int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("{0}. {1}", i+1, namnvektor[i]); } }

Permalänk
Medlem
Skrivet av ondurdis:

Det är så oerhört skönt att ha er som bollplank, ni gav mig tillräckligt mycket information för att jag skulle lösa det själv.
Helt jävla underbart.
Nu hoppas jag bara att ni tycker det ser rätt ut.

{ string[] namnvektor = new string[5]; for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("Ange namn för person nummer {0}: ",i+1); string namn = Console.ReadLine(); namnvektor[i] = namn; } Console.WriteLine("\n"); for(int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("{0}. {1} \n", i+1, namnvektor[i]); } Console.WriteLine("Välj en siffra där du vill byta ut namnet: 1-5"); int inmatadnr = int.Parse (Console.ReadLine()); Console.WriteLine("välj ett nytt namn på {0}",namnvektor [inmatadnr-1]); string nyttnamn = Console.ReadLine(); namnvektor[inmatadnr-1] = nyttnamn; Console.WriteLine("\n"); for (int i = 0; i < namnvektor.Length; i++) { Console.WriteLine("{0}. {1}", i+1, namnvektor[i]); } }

Vad händer om du skriver 10 eller en bokstav?

Skickades från m.sweclockers.com

Permalänk
Medlem

@zaibuf:

då svär man lite och sedan skriver man in en try/catch för att undvika det.

Permalänk
Medlem
Skrivet av ondurdis:

@zaibuf:

då svär man lite och sedan skriver man in en try/catch för att undvika det.

Annars ser koden bra ut tycker jag. Försök börja använda engelska namn på variabler. Och börja använd camelCase(t.ex. int randomNumber istället för randomnumber) när det är lokala variabler.

Skickades från m.sweclockers.com

Permalänk
Medlem

välkänd uppgift, läskbacken.

Goddag på er.
Här kommer jag med nästa grej jag har lite svårt med att få till.
Det här handlar om ännu en uppgift som ni känner igen; läskbacken.

Jag har problem med att få till det så att programmet hanterar "null" och felaktiga inmatningar.

Försöker jag söka efter en drick som inte finns i backen så händer ingenting.
skriver jag en felaktig inmatning så krashar det.
Har försökt skriva det på ett par sätt men inget hanterar problemen och vissa alternativ ger mig en infinity-loop när jag försöker lösa felaktiga inmatningar med en "else if" eller en eller "try-catch" .
Så hur skriver jag/lägger jag upp det för att det hela ska fungera som det ska?

public void find_soda() { string drink_name; Console.WriteLine("\nSkriv namnet på drickan du letar efter:\n"); Console.WriteLine("[0] Avsluta"); drink_name = Console.ReadLine(); while (drink_name != "0") { for (var i = 0; i < nr_sodas; i++) { if (sodas[i].name == drink_name) { Console.WriteLine("Drycken finns i fack {0} i backen.", i + 1); } else if (sodas[i].name == null) { Console.WriteLine("Den drickan finns inte i backen."); } } }

Permalänk
Medlem

Vad händer om du ändrar din "else if" till bara "else"? Sedan vill du ju ha en koll att om drink_name är null så ska du inte gå in i while (eller vad du nu vill ska hända)

Permalänk
Medlem

@noMad17:

drink_name ska bara ta emot ett värde.
Detta värdet ska sedan jämföras med värdena i sodas[i].name .
Är det ett felaktigt värde så ska man få ett felmeddelande.
Finns värdet i index så ska de skrivas ut.
Finns inte värdet i index så ska man få ett meddelande om att det inte finns något sådant värde.
Efter det ska det loopas om om man inte väljer att återgå.

tar jag bort if i min else if så skrivs drickan ut som den ska men efter varvet är slut så får jag:

"System.NullReferenceException: 'Object reference not set to an instance of an object.'

sodas[] was null."

Permalänk
Medlem

@ondurdis: Vad är din tanke bakom while-loopen? Som det är nu kommer den bara loopa oändligt om drink_name inte är "0", eftersom drink_name aldrig ändras inne i loopen.

Sen vill du inte skriva ut meddelandet om att drickan inte finns i backen inne i for-loopen, för då kommer du ju skriva ut ett meddelande för varje dricka i backen som inte matchar inmatningen. Eftersom du har allt i en separat metod så kan du bara köra ett return; när du hittat en matchande dryck för att direkt hoppa ur metoden, och så kan du skriva ut meddelandet om att ingen dricka hittades efter att du gått igenom hela backen.

När det gäller null så finns det ingen större mening med att kolla om t.ex. sodas[i].name är null, för det är inget problem att jämföra strängar som är null. Problemet inträffar snarare när sodas[i] är null, då kommer programmet krascha om du försöker komma åt sodas[i].name. D.v.s. null = "abc" fungerar, null.name = "abc" fungerar inte.

Men om sodas[i] skulle vara null så har du ett större problem, för nr_sodas bör ju hålla koll på hur många element du lagt till i backen så att du inte försöker komma åt element som inte fått något värde än.

Skrivet av ondurdis:

tar jag bort if i min else if så skrivs drickan ut som den ska men efter varvet är slut så får jag:

"System.NullReferenceException: 'Object reference not set to an instance of an object.'

sodas[] was null."

Det felet pekar på att hela sodas är null, har du initialiserat den variabeln med new? Men det är möjligt att det egentligen är ett element i sodas det syftas på, jag kan inte C# så jag har dålig koll vad felmeddelandena egentligen menar.

Permalänk
Medlem

Vilken utvecklingsmiljö använder du?

Jag kan verkligen rekommendera att du ägnar lite tid åt att lära dig använda debuggern. Den kommer spara dig otroligt mycket tid vid felsökning då du kan:

- följa (och ändra) programmets väg genom din kod
- kontrollera värden på variabler under tiden programmet körs
- sätta brytpunkter (break points) på kodrader du vill undersöka

med mera...

Till exempel i detta fall skulle du kunna sätta en brytpunkt vid din if/else sats för att se vad som händer.

Skickades från m.sweclockers.com

Permalänk
Medlem

Denna jävla banksimulator

Och nu var det min tur att göra den här psykbrytande uppgift.

Något jag inte förstår mig på är hur jag i en switch-sats inuti en do-loop kan få fram ett saldo där jag helt enkelt tar int-variabeln för vad hen satt in och subtraherar med int-variabeln hen har tagit ut. Någon som har koll på sånt där?

Permalänk
Medlem
Skrivet av kodtrollet:

Och nu var det min tur att göra den här psykbrytande uppgift.

Något jag inte förstår mig på är hur jag i en switch-sats inuti en do-loop kan få fram ett saldo där jag helt enkelt tar int-variabeln för vad hen satt in och subtraherar med int-variabeln hen har tagit ut. Någon som har koll på sånt där?

Har du börjat med uppgiften? Då kikar vi nog gärna på koden så vi kan hjälpa på ett schysst sätt.