Programmering 1 c# - Avrundaren

Permalänk

Programmering 1 c# - Avrundaren

Hej! Har en uppgift i skolan där man skall avrunda ett valfritt decimaltal. Både med ett tal man själv valt och ett förbestämt.
Har löst biten där man själv får välja hur många decimaler man vill ha kvar. Men inte biten där man har ett förbestämt tal, t.ex 3 decimaler.

Min kod ser ut såhär just nu, och allt fungerar.

string tal;
double tal1;
string antal;
int antal1;

Console.WriteLine("Hej! Skriv in ett valfritt decimaltal:");
tal = Console.ReadLine();
tal1 = double.Parse(tal);

Console.WriteLine("Skriv in antal decimaler du vill ha:");
antal = Console.ReadLine();
antal1 = int.Parse(antal);

Console.WriteLine("Nu avrundar vi ditt tal till:");
Console.WriteLine(Math.Round( decimaltal1, antal1 ));

Tack på förhand!

Permalänk
Medlem
Skrivet av littymcnitty:

Hej! Har en uppgift i skolan där man skall avrunda ett valfritt decimaltal. Både med ett tal man själv valt och ett förbestämt.
Har löst biten där man själv får välja hur många decimaler man vill ha kvar. Men inte biten där man har ett förbestämt tal, t.ex 3 decimaler.

Min kod ser ut såhär just nu, och allt fungerar.

string tal;
double tal1;
string antal;
int antal1;

Console.WriteLine("Hej! Skriv in ett valfritt decimaltal:");
tal = Console.ReadLine();
tal1 = double.Parse(tal);

Console.WriteLine("Skriv in antal decimaler du vill ha:");
antal = Console.ReadLine();
antal1 = int.Parse(antal);

Console.WriteLine("Nu avrundar vi ditt tal till:");
Console.WriteLine(Math.Round( decimaltal1, antal1 ));

Tack på förhand!

Förbestämt är väl bara att hårdkoda in något antal och göra samma sak med det talet som du gör nu?

Skickades från m.sweclockers.com

Permalänk
Medlem

@littymcnitty: Console.WriteLine(Math.Round( decimaltal1, 17 ));

Permalänk
99:e percentilen

Hej @littymcnitty!

När du klistrar in kod på forumet är det bra att omge den med [code]-taggar, så att den blir lättare att läsa. Det finns ingen knapp för det om du inte använder Better SweClockers, men så här gör du:

[code]
Console.WriteLine("Hello!");
[/code]

Resultat:

Console.WriteLine("Hello!");

I det här fallet gick det bra ändå, men större program med flera indenteringsnivåer och dylikt är nästan hopplösa att läsa utan sådan formatering.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Permalänk

@Alling: Skall göra det i framtiden, tack!

Permalänk

@zaibuf: Japp, började koda igår så förstår inte så mycket ännu!

Permalänk
Medlem
Skrivet av littymcnitty:

@zaibuf: Japp, började koda igår så förstår inte så mycket ännu!

Förstår. Lite märkligt bara, att man får börja med att ta inputs från användaren istället för att lära sig instansiera variabler, t.ex. int antal = 3;

Permalänk
99:e percentilen
Skrivet av littymcnitty:

string tal; double tal1; string antal; int antal1; Console.WriteLine("Hej! Skriv in ett valfritt decimaltal:"); tal = Console.ReadLine(); tal1 = double.Parse(tal); Console.WriteLine("Skriv in antal decimaler du vill ha:"); antal = Console.ReadLine(); antal1 = int.Parse(antal); Console.WriteLine("Nu avrundar vi ditt tal till:"); Console.WriteLine(Math.Round( tal1, antal1 ));

Ett råd jag skulle ge är att tänka på hur du namnger variabler. tal och tal1 hade inte jag valt som namn: De gör det inte uppenbart vad respektive variabel representerar eller varför båda finns. Jag hade hellre valt till exempel inmatadText och parsatTal – de kommunicerar programmerarens (din) intention bättre. Bra variabelnamn är dokumentation!

Det kan också vara värt att notera att de intermediära variablerna inte är nödvändiga och att variabler inte heller måste deklareras högst upp. Följande program är ekvivalent med ditt:

Console.WriteLine("Hej! Skriv in ett valfritt decimaltal:"); double tal = double.Parse(Console.ReadLine()); Console.WriteLine("Skriv in antal decimaler du vill ha:"); int antal = int.Parse(Console.ReadLine()); Console.WriteLine("Nu avrundar vi ditt tal till:"); Console.WriteLine(Math.Round( tal, antal ));

Angående att använda svenska variabelnamn så gör man inte det i allmänhet. Däremot tycker jag det kan vara väldigt lämpligt att göra det som nybörjare, eftersom det kan underlätta att se skillnad på identifierare (namn programmeraren kan välja, t ex antal) och nyckelord (som är huggna i sten i språkets grammatik, t ex while). Man ska bara vara medveten om att man bör gå över till engelska namn så snart man börjar känna sig bekväm i språket i fråga.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@Alling: Men eftersom det är text så måste jag väll använda "string tal" först för att sedan omvandla det till "double tal1"?

Permalänk
Medlem

@littymcnitty: Som du ser så lagras aldrig det inmatad utan det används direkt. Så hoppa över det du. Bättre att du gör som du gjorde från början och lagrar in variabler istället för att börja förkorta nu precis i början. Det är sådant du kan börja med när du vet vad du gör.

Permalänk
Medlem
Skrivet av littymcnitty:

Men eftersom det är text så måste jag väll använda "string tal" först för att sedan omvandla det till "double tal1"?

Nej, t.ex. Console.ReadLine returnerar ett sträng-värde. Du kan lagra detta värde i en string-variabel så som du gör i din kod, eller så kan du skicka vidare det direkt till t.ex. double.Parse som Alling visar.

Vilket sätt du väljer att använda är upp till dig, inget av dem är direkt fel. Gör du som Alling visar så slipper du namnge strängarna som läses in och koden blir lite kortare. Nackdelen är att du inte kan använda strängarna som läses in till något annat, vilket i det här fallet inte behövs. Koden kan också bli lite svårläst om man nästlar många funktionsanrop i varandra, så i mer komplicerade funktionsanrop är det oftast bäst att undvika det.

Permalänk
99:e percentilen
Skrivet av littymcnitty:

@Alling: Men eftersom det är text så måste jag väll använda "string tal" först för att sedan omvandla det till "double tal1"?

Nja. string respektive double ”omvandlar” ingenting. När du deklarerar en variabel av en viss typ, till exempel string x;, berättar du bara för kompilatorn att du lovar att bara tilldela värden av den typen (string) till den variabeln (x), och att kompilatorn ska säga ifrån om du bryter det löftet (till exempel om du skriver x = 5).

En sats som string tal = Console.ReadLine(); accepteras bara av typcheckaren om uttrycket Console.ReadLine() har typen string – och det har det. Det betyder att du kan ha Console.ReadLine() överallt där du kan ha en string. Ett ställe där string är en lämplig typ är som argument till double.Parse. Det här är du bekant med:

string inmatadText = Console.ReadLine(); double parsatTal = double.Parse(inmatadText);

Det enda kravet på argumentet till double.Parse (markerat ovan) är att det har typen string. Uttrycket Console.ReadLine() har som sagt den typen, så det går lika bra att använda det:

double parsatTal = double.Parse(Console.ReadLine());

Men som påtalats tidigare i tråden: Inget av sätten är fel.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

@Alling: Tänk bara på att det är dag 2 som personen programmerar så kanske inte ska gå in alltför mycket på "genvägar" utan göra det lite omständliga och lite klarare sättet för att få en förståelse och en bra grund först. Bara en liten tanke. Lösningen som du gav är som sagt var absolut inte fel men som sagt var, dag 2 med programmering.

Permalänk
99:e percentilen
Skrivet av ToddTheOdd:

@Alling: Tänk bara på att det är dag 2 som personen programmerar så kanske inte ska gå in alltför mycket på "genvägar" utan göra det lite omständliga och lite klarare sättet för att få en förståelse och en bra grund först. Bara en liten tanke. Lösningen som du gav är som sagt var absolut inte fel men som sagt var, dag 2 med programmering.

Du tar upp en väldigt bra poäng. Balansgången är ibland svår; tanken med mitt inlägg var inte att förespråka ”genvägar” (kortare kod) i sig, utan att ge TS en chans att förstå hur det egentligen fungerar där jag tyckte mig ana en missuppfattning (angående nyckelorden string och double samt typer i allmänhet).

Visa signatur

Skrivet med hjälp av Better SweClockers