Permalänk
Medlem

Rookie på C# Programmering 1

Ja, vart ska man börja.
Fått för mig att äntligen börja plugga igen efter 30 år i byggbranschen.
Systemutvecklare låter skoj, eller?

Skruva isär och sätta ihop datorer och lösa div. mjukvarurelaterade problem funkar ju fint.
Hur svårt kan det vara att lära sig koda?

Antagligen väldigt mycket lättare om man hade en riktig lärare. Läsa programmering på distans var inte som man hade tänkt sig.

Sambon pluggade på högskolan och hade kurser online och inspelade lektioner.
Vad får man på komvux?
Köp 2 böcker och uppgifter att lösa.
Går igenom Microsoft learn kursen samtidigt, både på webben samt youtube. Det får väl vara min lektioner.

Har dock knåpat ihop min första uppgift.
Handlar ju om växelkassan som behandlats här tidigare.
Jag ville inte bara ha "mata in pris, betalning och här får du tillbaks."
Jag ville se så att allt matats korrekt. inga bokstäver så programmet krashar osv.

Extremt mycket onödig kod som jag ska försöka förkorta, men ville se vad ni andra tycker.
Jag vill väldigt gärna lära mig detta riktigt, och inte halvdant från början.
Läste precis om
try
catch
kanske man ska skriva om för detta?
Dock ska uppgiften in på fredag och jag har pseudokod kvar samt flödesschema att göra.

Var inte för snälla utan säg verkligen hur mycket fel jag gjort.

using System; using System.Collections.Generic; using System.Diagnostics.Eventing.Reader; using System.Linq; using System.Text; using System.Threading.Tasks; namespace växelkassa3 { internal class Program { static void Main(string[] args) { //variabler för att kontrollera så att inmatmingarna är korrekta. bool inmatning = false; double totalCost = 0; double totalPay = 0; //Välkomsthälsning Console.WriteLine("Välkommen till den bästa kassaapparaten i världen!\nDu kommer få skriva in varans/varornas totalpris och jag räknar ut växel samt valörer åt dig." + "\nTänk på att handla för minst 1 krona. Du kan testa med mindre och se om det funkar."); //Vad varorna kostar samt en kontroll så att man bara skriver in siffror do { Console.WriteLine("\nVad kostar varorna du handlat? "); inmatning = double.TryParse(Console.ReadLine(), out totalCost); if (!inmatning) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Tyvärr fungerar endast siffror i denna kassaapparaten.\nVar vänlig försök igen."); Console.ForegroundColor = ConsoleColor.White; } } while (!inmatning); //Ser så du handlar för minimibeloppet 1 krona inmatning = false; while (totalCost < 1) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du måste tyvärr handla för minst 1 krona, annars går vi back."); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Vad kostar varorna du handlat?"); inmatning = double.TryParse(Console.ReadLine(), out totalCost); if (!inmatning) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Tyvärr fungerar endast siffror i denna kassaapparaten.\nVar vänlig försök igen."); Console.ForegroundColor = ConsoleColor.White; } } //Ser hur mycket du betalat samt sifferkontroll inmatning = false; while (!inmatning) { Console.WriteLine("\nHur mycket har du betalat för dina varor? "); inmatning = double.TryParse(Console.ReadLine(), out totalPay); if (!inmatning) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Tyvärr fungerar endast siffror i denna kassaapparaten.\nVar vänlig försök igen."); Console.ForegroundColor = ConsoleColor.White; } } //Ser så man inte betalat för lite inmatning = false; while (totalCost > totalPay && !inmatning) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du behöver tyvärr betala minst hela summan det kostar.\nVar vänlig försök igen."); Console.WriteLine("Hur mycket har du betalat?"); Console.ForegroundColor = ConsoleColor.White; inmatning = double.TryParse(Console.ReadLine(), out totalPay); } // Räknar ut växeln. 2 variablar för att skriva ut både total samt avrundat till närmaste hel eller halv. double totChangeBack = totalPay - totalCost; double changeBack = totalPay - totalCost; //Avrundar växel til närmaste hel eller halv. Hittat exemplet online changeBack = Math.Round(changeBack * 2.0d) / 2.0d; //Skriver ut växel att få tillbaks Console.WriteLine("\nVäxel tillbaks \t\t" + totChangeBack +" kr.\nAvrundat \t\t" + changeBack + " kr."); //Räknar ut antal sedlar och mynt med hjälp av modulus. Då int automatiskt avrundas när man konverterar från en double så använder jag (Math.Floor) för att alltid avrunda neråt till närmaste heltal. int thousand = Convert.ToInt32(Math.Floor(changeBack / 1000)); changeBack %= 1000; int fiveHundred = Convert.ToInt32(Math.Floor(changeBack / 500)); changeBack %= 500; int twoHundred = Convert.ToInt32(Math.Floor(changeBack / 200)); changeBack %= 200; int hundred = Convert.ToInt32(Math.Floor(changeBack / 100)); changeBack %= 100; int fifty = Convert.ToInt32(Math.Floor(changeBack / 50)); changeBack %= 50; int twenty = Convert.ToInt32(Math.Floor(changeBack / 20)); changeBack %= 20; int ten = Convert.ToInt32(Math.Floor(changeBack / 10)); changeBack %= 10; int five = Convert.ToInt32(Math.Floor(changeBack / 5)); changeBack %= 5; int one = Convert.ToInt32(Math.Floor(changeBack % 5)); //För att få ut decimalen och veta om man ska få tillbaks 50 öre eller ej double fiftyOre = changeBack % 1; //Mellanrad Console.WriteLine(); if (thousand > 0) Console.WriteLine("Tusenlapp \t\t" + thousand + "st"); if (fiveHundred > 0) Console.WriteLine("Femhundralapp \t\t" + fiveHundred + "st"); if (twoHundred > 0) Console.WriteLine("Tvåhundralapp \t\t" + twoHundred + "st"); if (hundred > 0) Console.WriteLine("Hundralapp \t\t" + hundred + "st"); if (fifty > 0) Console.WriteLine("Femtiolapp \t\t" + fifty + "st"); if (twenty > 0) Console.WriteLine("Tjugolapp \t\t" + twenty + "st"); if (ten > 0) Console.WriteLine("Tiokrona \t\t" + ten + "st"); if (five > 0) Console.WriteLine("Femkrona \t\t" + five + "st"); if (one > 0) Console.WriteLine("Enkrona \t\t" + one + "st"); if (fiftyOre > 0.25 && fiftyOre < 0.75) Console.WriteLine("Femtiöring \t\t" + "1st"); Console.WriteLine("\nHoppas du är nöjd och Välkommen Åter!"); Console.ReadLine(); } } }

Stavfel
Permalänk
Medlem

oops

//Ser så man inte betalat för lite inmatning = false; while (totalCost > totalPay || !inmatning) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du behöver tyvärr betala minst hela summan det kostar.\nVar vänlig försök igen."); Console.WriteLine("Hur mycket har du betalat?"); Console.ForegroundColor = ConsoleColor.White; inmatning = double.TryParse(Console.ReadLine(), out totalPay); }

Märkte direkt ett fel där man kunde få tilbaks mer än man betalat

Permalänk
Medlem

ett tips är att fråga chatgpt sånt här

Det är fantastiskt att höra att du är intresserad av att lära dig systemutveckling efter en lång karriär inom byggbranschen! Att gå från bygg till kodning kan vara en stor förändring, men det är definitivt möjligt och kan vara väldigt givande.

När det gäller din kod finns det några saker att ta hänsyn till:

Kommentarer och läsbarhet: Bra jobbat med att kommentera din kod och göra den läsbar. Det är viktigt att andra och du själv kan förstå vad koden gör.

Felhantering: Du har gjort en del felhantering med att kontrollera inmatning av siffror, vilket är bra. Men du kan förbättra det genom att använda try-catch-block för att hantera specifika typer av fel.

Struktur: Din kod är ganska lång och upprepar sig vissa delar, vilket kan göra den svårare att underhålla och förstå. Att bryta ner den i mindre funktioner kan göra den mer läsbar och underhållbar.

Namngivning: Försök att använda mer beskrivande variabelnamn. Exempelvis totalCost och totalPay är bra namn, men inmatning kan vara mer beskrivande, som isValidInput eller liknande.

Kodupprepning: Du upprepar viss kod för att kontrollera inmatning av siffror. Detta kan abstraheras till en separat funktion för att göra koden mer DRY (Don't Repeat Yourself).

Avrundning: I din kod avrundar du växel till närmaste halvkrona, men du kanske vill överväga om det är mer lämpligt att avrunda till närmaste öre istället, eftersom svenska valörer oftast är i ören.

Här är ett förslag på hur du kan förbättra din kod:

Använd try-catch-block för felhantering.
Skapa funktioner för att hantera olika delar av koden, t.ex. en funktion för att kontrollera inmatning av siffror.
Använd mer beskrivande variabel- och funktionsnamn för att göra koden lättare att förstå.
Undvik upprepning av kod genom att abstrahera gemensam funktionalitet till funktioner.
Överväg att använda andra avrundningsmetoder beroende på dina behov.

Permalänk
Medlem
Skrivet av klockish:

ett tips är att fråga chatgpt sånt här

Det är fantastiskt att höra att du är intresserad av att lära dig systemutveckling efter en lång karriär inom byggbranschen! Att gå från bygg till kodning kan vara en stor förändring, men det är definitivt möjligt och kan vara väldigt givande.

När det gäller din kod finns det några saker att ta hänsyn till:

Kommentarer och läsbarhet: Bra jobbat med att kommentera din kod och göra den läsbar. Det är viktigt att andra och du själv kan förstå vad koden gör.

Felhantering: Du har gjort en del felhantering med att kontrollera inmatning av siffror, vilket är bra. Men du kan förbättra det genom att använda try-catch-block för att hantera specifika typer av fel.

Struktur: Din kod är ganska lång och upprepar sig vissa delar, vilket kan göra den svårare att underhålla och förstå. Att bryta ner den i mindre funktioner kan göra den mer läsbar och underhållbar.

Namngivning: Försök att använda mer beskrivande variabelnamn. Exempelvis totalCost och totalPay är bra namn, men inmatning kan vara mer beskrivande, som isValidInput eller liknande.

Kodupprepning: Du upprepar viss kod för att kontrollera inmatning av siffror. Detta kan abstraheras till en separat funktion för att göra koden mer DRY (Don't Repeat Yourself).

Avrundning: I din kod avrundar du växel till närmaste halvkrona, men du kanske vill överväga om det är mer lämpligt att avrunda till närmaste öre istället, eftersom svenska valörer oftast är i ören.

Här är ett förslag på hur du kan förbättra din kod:

Använd try-catch-block för felhantering.
Skapa funktioner för att hantera olika delar av koden, t.ex. en funktion för att kontrollera inmatning av siffror.
Använd mer beskrivande variabel- och funktionsnamn för att göra koden lättare att förstå.
Undvik upprepning av kod genom att abstrahera gemensam funktionalitet till funktioner.
Överväg att använda andra avrundningsmetoder beroende på dina behov.

Tack för ett väldigt bra svar.

Har gjort detta nu för att kontrollera inmatning. Har förkortat ner allt avsevärt.
kommer jobba vidare på denna under morgon dagen.

Avrundningen är bara för att läraren ville ha det avrundat till närmaste hel eller halv krona.
uträkningen på sedlar och mynt stämmer iaf i alla scenarion jag testat.

Och nu är man en bit på vägen med inmatningskontroll oxå.
Funktioner ska jag absolut kolla på, dock ej hunnit dit i boken än.
Roligare med trial and error än läsa, Men kommer komma dit under morgondagen hoppas jag.
Läser så mycket jag hinner på raster på jobbet.

double totalCost = 0; double totalPay = 0; bool isValid = true; do { Console.Write("Vad kostar varorna du handlat idag? "); string cost = Console.ReadLine(); Console.Write("Hur mycket har du betalat för dina varor? "); string pay = Console.ReadLine(); try { totalCost = Convert.ToDouble(cost); totalPay = Convert.ToDouble(pay); isValid = false; if (totalCost>totalPay) { Console.Write("Du behöver tyvärr betala minst hela summan det kostar.\nVar vänlig försök igen."); isValid = true; } } catch { Console.WriteLine("Tyvärr fungerar endast siffror i denna kassaapparaten.\nVar vänlig försök igen."); } } while (isValid); double changeBack=totalPay-totalCost; Console.WriteLine("Växel tillbaka " + changeBack + "kr");

Permalänk
Medlem

När du räknar ut sedlar så skulle du kunna ha en lista med olika valörer

[1000, 500, 200, ...] o.s.v. och loopa över den listan. Då försvinner många rader.

Om du dessutom endera lägger till ett sätt att göra uppslag mellan siffra och textrepresentation eller helt enkelt genom att skriva 1000-lapp istället och samtidigt inser att datorn gör beräkningarna snabbt så kan du få in utskriften också direkt efteråt om värdet är större än noll. Då sparar du många flera rader.

Permalänk
Medlem
Skrivet av MickeBoy:

När du räknar ut sedlar så skulle du kunna ha en lista med olika valörer

[1000, 500, 200, ...] o.s.v. och loopa över den listan. Då försvinner många rader.

Om du dessutom endera lägger till ett sätt att göra uppslag mellan siffra och textrepresentation eller helt enkelt genom att skriva 1000-lapp istället och samtidigt inser att datorn gör beräkningarna snabbt så kan du få in utskriften också direkt efteråt om värdet är större än noll. Då sparar du många flera rader.

Tack för värdefull input.
Listor fick vi inte använda oss av så har inte riktigt satt mig in dem än.
Men har förstått att de skulle gjort det hela mycket enklare.

Det sista med uppslag hänger jag inte riktigt med på. Men kommer googla mig fram till detta. Eller har du tips?
Även om uppgiften är inlämnad så kan man ju fortfarande förbättra och lära sig mer.
Var tvungen att lämna in idag då jag ej kommer ha tid imorgon.
Är även ungdomstränare i innebandy och medgrundare samt syrelsemedlem i ViskaforsBygdens Teknik-, Elektronik- och Spelförening
ViskaforsBygdens Teknik-, Elektronik- och Spelförening
och jobbar 100% så tiden är knapp

Detta var vad jag lämnade in idag. Vet ju med mig om att det är en del onödig kod
Men för att vara första programmet nånsin i C# så är jag nöjd.
Jag eftersträvar att återkomma till detta under utbildningen och skriva om det när jag lär mig nya saker och andra sätt att göra det på.
Det är väl så utvecklare gör

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace växelkassa4 { internal class Program { static void Main(string[] args) { //Välkomsthälsning Console.WriteLine("Välkommen till den bästa kassaapparaten i världen!\nDu kommer få skriva in varans/varornas totalpris och jag räknar ut växel samt valörer åt dig." + "\nTänk på att handla för minst 1 krona. Du kan testa med mindre och se om det funkar.\nVar vänlig och skriv bara in siffor. Gärna ören också om det behövs."); //Deklarerade variabler för att kunna kontrollera inmatning av tal, minsta köp samt att man betalat tillräckligt. double totalCost = 0; double totalPay = 0; bool isValid = true; bool isValid2 = true; bool isValid3 = true; //Vad varorna kostar samt en kontroll så att man bara skriver in siffror. Blir det fel så tar Catch över och man börjar om. do { Console.Write("\nVad kostar varorna du du lagt i din korg idag? "); string cost = Console.ReadLine(); Console.Write("Hur mycket vill du betala? Helst mer än vad de kostar. "); string pay = Console.ReadLine(); try { totalCost = Convert.ToDouble(cost); //Gör om string till double så man kan använda ören totalPay = Convert.ToDouble(pay); //Gör om string till double så man kan använda ören isValid = false; isValid2 = false; isValid3 = false; if (totalCost < 1) //Kontrollerar så man handlat för minst 1 kr annars kommer detta upp och man börjar om { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du måste handla för minst 1 krona.\nVar vänlig försök igen.\n"); Console.ForegroundColor = ConsoleColor.White; isValid2 = true; } if (totalCost > totalPay) //Kontrollerar så man betala tillräckligt. Är totalCost mer än totalPay kommer detta upp och man börjar om { Console.ForegroundColor = ConsoleColor.Red; Console.Write("Du behöver tyvärr betala minst hela summan det kostar.\nVar vänlig försök igen.\n"); Console.ForegroundColor = ConsoleColor.White; isValid3 = true; } } catch //om konvertering till double ej går igenom på ena eller andra så kommer detta upp och man börjar om { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Tyvärr fungerar endast siffror i denna kassaapparaten.\nVar vänlig försök igen.\n"); Console.ForegroundColor = ConsoleColor.White; } } while (isValid || isValid2 || isValid3); // Räknar ut växeln. 2 variablar för att användas ned i avrundning samt modulus uträkningen double totChangeBack = totalPay-totalCost; double changeBackRound = totalPay - totalCost; //Avrundar total växel till 2 decimaler. totChangeBack=Math.Round(totChangeBack, 2); //Avrundar växel til närmaste hel eller halv. Hittat exemplet online Används i modulus uträkningen changeBackRound = Math.Round(changeBackRound * 2.0d) / 2.0d; //Skriver ut växel att få tillbaks Console.WriteLine("\nVäxel tillbaks \t\t" + totChangeBack + "kr."); //Räknar ut antal sedlar och mynt med hjälp av modulus. Då int automatiskt avrundas uppåt, ifall vår avrundning blev en halv, när man konverterar så använder jag (Math.Floor) för att alltid avrunda neråt till närmaste heltal. int thousand = Convert.ToInt32(Math.Floor(changeBackRound / 1000)); changeBackRound %= 1000; int fiveHundred = Convert.ToInt32(Math.Floor(changeBackRound / 500)); changeBackRound %= 500; int twoHundred = Convert.ToInt32(Math.Floor(changeBackRound / 200)); changeBackRound %= 200; int hundred = Convert.ToInt32(Math.Floor(changeBackRound / 100)); changeBackRound %= 100; int fifty = Convert.ToInt32(Math.Floor(changeBackRound / 50)); changeBackRound %= 50; int twenty = Convert.ToInt32(Math.Floor(changeBackRound / 20)); changeBackRound %= 20; int ten = Convert.ToInt32(Math.Floor(changeBackRound / 10)); changeBackRound %= 10; int five = Convert.ToInt32(Math.Floor(changeBackRound / 5)); changeBackRound %= 5; int one = Convert.ToInt32(Math.Floor(changeBackRound % 5)); //För att få ut decimalen och veta om man ska få tillbaks 50 öre eller ej double fiftyOre = totChangeBack % 1; //Mellanrad Console.WriteLine(); //Skriver ut antal av varje valör om valör > 0 if (thousand > 0) Console.WriteLine("Tusenlapp \t\t" + thousand + "st"); if (fiveHundred > 0) Console.WriteLine("Femhundralapp \t\t" + fiveHundred + "st"); if (twoHundred > 0) Console.WriteLine("Tvåhundralapp \t\t" + twoHundred + "st"); if (hundred > 0) Console.WriteLine("Hundralapp \t\t" + hundred + "st"); if (fifty > 0) Console.WriteLine("Femtiolapp \t\t" + fifty + "st"); if (twenty > 0) Console.WriteLine("Tjugolapp \t\t" + twenty + "st"); if (ten > 0) Console.WriteLine("Tiokrona \t\t" + ten + "st"); if (five > 0) Console.WriteLine("Femkrona \t\t" + five + "st"); if (one > 0) Console.WriteLine("Enkrona \t\t" + one + "st"); if (fiftyOre > 0.24 && fiftyOre < 0.75) Console.WriteLine("Femtiöring \t\t" + "1st"); Console.WriteLine("\nHoppas du är nöjd och Välkommen Åter!"); Console.ReadLine(); } } }

Permalänk
Medlem
Skrivet av kruille:

Tack för värdefull input.
Listor fick vi inte använda oss av så har inte riktigt satt mig in dem än.
....

Med uppslag tänkte jag mig en metod som tar in ett värde, t.ex. 1000 och ger tillbaka textuell output "tusenlapp".

Men om ni inte får använda listor, så tänker jag att metoder kanske inte heller är tillåtet. Och om du inte får använda listor så förstår jag att koden ser ut som den gör.