Permalänk

Hjälp med programmering 1

Hejsan,

Jag har precis påbörjat programmering 1 på distans och har det väldigt tufft hittills måste jag säga. Jag är just nu på första uppgiften och ska lämna in arbetet här på tisdag.

Har en fråga kring uppgiften där man ska räkna ut pensionen. Så här ser min kod ut just nu:

string förnamn, efternamn, ålder; Console.WriteLine("Vad heter du i förnamn?"); förnamn = Console.ReadLine(); Console.WriteLine("Vad heter du i efternamn?"); efternamn = Console.ReadLine(); Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen."); Console.ReadKey(true);

Hur fixar jag detta om personen redan är pensionär och skriver in t.ex. 75?

Bör jag använda "If-Else-satsen"? Finns det någon bättre lösning på detta som jag redan nu bör veta?

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

Jag skulle säga använd IF sats, den kommer du behöva använda mycket framåt också.

Visa signatur

Win 10 maskin: Core 2500 | Integra M 550W | Ryzen 5 3600 | MSI B450 A Pro max | GTX 1060 6GB | Vengeance LPX 2x16GB
Win XP maskin: Core 1100 | 550W | AMD Athlon II | MSI GF615M-P33 | ATI HD5670 | 2x2GB
Laptop: Lenovo Flex 3-1580

Permalänk

@AReal_Human:

Vart ska jag sätta in IF här? Försökt pilla med det en stund, men får inte till det. Bör jag göra om allt istället?

Testade att lägga till detta i slutet:

if (ålder < 65) Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); else (ålder >=65) Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen.");

Utan framgång dock. Jag använder if och else på fel sätt förmodar jag.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
99:e percentilen

Du skulle kunna använda en if … else-sats. Det finns även syntax för villkorliga uttryck (conditional expressions). Uttryck är sådana bitar kod som har ett värde: true och x + 1 är exempel på uttryck. De kan tilldelas till en variabel eller skickas som argument till en funktion. if (true) { x++; } är istället en sats och har inget värde.

Exempel på hur villkorligt beteende kan uttryckas på två olika sätt:

Satsorienterat

string description; if (x > 0) { description = "positive"; } else { description = "not positive"; }

Uttrycksorienterat

string description = x > 0 ? "positive" : "not positive";

Jag föredrar helt klart det sistnämnda i detta fall, men i ditt program kan det mycket väl vara annorlunda.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
99:e percentilen
Skrivet av Pellefant:

@Mr_Enric:

Vart ska jag sätta in IF här? Försökt pilla med det en stund, men får inte till det. Bör jag göra om allt istället?

Testade att lägga till detta i slutet:

if (ålder > 65) Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); else (ålder < 65) Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen.");

Utan framgång dock. Jag använder if och else på fel sätt förmodar jag.

Ja. Du ska tänka att else betyder ”annars”, inte ”annars om”. Och sätt alltid måsvingar runt den kod du vill ska höra till if respektive else, annars kommer du åka på riktigt elaka buggar.

if (ålder < 65) { // … } else { // … }

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@Alling:

if (ålder < 65) { Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen."); } (ålder >= 65) >= 65 { Console.WriteLine("Du är redan pensionär, grattis"); } Console.ReadKey(true); }

Får inte alls ihop det, trots klämmorna.

Får väl två av dessa fel "Operator '<' cannot be applied to operands of type 'string' and 'int'
och en utav ";expected"

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

@Mr_Enric:

Vart ska jag sätta in IF här? Försökt pilla med det en stund, men får inte till det. Bör jag göra om allt istället?

Testade att lägga till detta i slutet:

if (ålder < 65) Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); else (ålder >=65) Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen.");

Utan framgång dock. Jag använder if och else på fel sätt förmodar jag.

Du har nu satt If satsen för tidigt, du vill egentligen ha det

if(ålder < 65){ Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen."); }

Sedan sätter du en else, och skriver ut vad du vill ha utskrivet ifall personen är över 65.

Kan skriva ihop koden själv sedan ifall du behöver.

Visa signatur

Win 10 maskin: Core 2500 | Integra M 550W | Ryzen 5 3600 | MSI B450 A Pro max | GTX 1060 6GB | Vengeance LPX 2x16GB
Win XP maskin: Core 1100 | 550W | AMD Athlon II | MSI GF615M-P33 | ATI HD5670 | 2x2GB
Laptop: Lenovo Flex 3-1580

Permalänk

@AReal_Human @Alling:

För att förtydliga: Så här ser min kod ut just nu:

{ string förnamn, efternamn, ålder; //Vilka namn jag ska använda. Console.WriteLine("Vad heter du i förnamn?"); förnamn = Console.ReadLine(); Console.WriteLine("Vad heter du i efternamn?"); efternamn = Console.ReadLine(); Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); if (ålder < 65) { Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen."); } else (ålder >= 65) { Console.WriteLine("Du är redan pensionär, grattis"); } Console.ReadKey(true); }

Jag får tre fel. På "rad if" ett fel och " rad else" två fel.

Sjukt tacksam för att ni tar er tid! Oerhört uppskattat!

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

Du får fel där för att du försöker göra om en string till en int. Du bör istället sätta "ålder" som en int istället för en string som du har nu.

Permalänk
Medlem

Ytterligare ett tips är att alltid namnge allt utifrån engelska.

Visa signatur

Fulburken:
| I9 9900K
| Gigabyte Aorus Z390 AORUS MASTER
| Asus RTX 3090 Strix OC

Permalänk
Medlem

När användaren skriver in ålder kan du istället köra:

ålder = Integer.parseInt(Console.nextLine());

Så slipper du hela delen som är

(65 - Convert.ToInt32(ålder))

Edit:
Såhär ska det se ut m.ao.

Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Integer.parseInt(Console.nextLine());

Permalänk
Medlem
Skrivet av Pellefant:

@Mr_Enric @Alling:

För att förtydliga: Så här ser min kod ut just nu:

{ string förnamn, efternamn, ålder; //Vilka namn jag ska använda. Console.WriteLine("Vad heter du i förnamn?"); förnamn = Console.ReadLine(); Console.WriteLine("Vad heter du i efternamn?"); efternamn = Console.ReadLine(); Console.WriteLine("Hejsan " + förnamn + " " + efternamn + "! " + "Hur gammal är du?"); ålder = Console.ReadLine(); if (ålder < 65) { Console.WriteLine(förnamn + " " + efternamn + " du har " + (65 - Convert.ToInt32(ålder)).ToString() + " år kvar tills pensionen."); } else (ålder >= 65) { Console.WriteLine("Du är redan pensionär, grattis"); } Console.ReadKey(true); }

Jag får tre fel. På "rad if" ett fel och " rad else" två fel.

Sjukt tacksam för att ni tar er tid! Oerhört uppskattat!

Du får felet för en sträng kan inte jämföras med en int, ett ord kan inte vara mindre än 65.

Det du måste göra är att konvertera din input till en int, där kommer du också att behöva felhantering, om användaren skriver bokstäver kommer programmet att smälla i och med konverteringen misslyckades.

Enklast nu är dock att bara få det att rulla, så googla på int.Parse(), int.TryParse() och Convert.ToInt32() och se vilken du tror passar bäst.

Sen skulle jag rekommendera att skriva variabler på engelska, gör det en vana redan nu.
Samt deklarera dina variabler där de ska användas, finns ingen anledning att deklarera upp alla i toppen i detta fall.

Skickades från m.sweclockers.com

Permalänk

@Giuffria,@Slapinator, @zaibuf:

string firstname; Console.WriteLine("Vad heter du i förnamn?"); firstname = Console.ReadLine(); string lastname; Console.WriteLine("Vad heter du i efternamn?"); lastname = Console.ReadLine(); Console.WriteLine("Hejsan " + firstname + " " + lastname + "! " + "Hur gammal är du?"); int age = int.Parse((Console.ReadLine())); if (age < 65) { Console.WriteLine(firstname + " " + lastname + " du har " + (65 - age) + " år kvar tills pensionen."); } else (age >= 65) { Console.WriteLine("Du är redan pensionär, grattis!"); } Console.ReadKey(true);

Så här ser min kod ut just nu. Jag har testat era förslag, men jag får det inte och fungera. Testade att skriva int age; direkt, men det gav fel. Har sen ändrat till string age; istället och ändrat så att den konverterar istället genom Convert.ToInt32(age);.

Det vill sig dock inte.

Operator '<' cannot be applied to operands of type 'string' and 'int'
"

EDIT: Fick det nog att fungera genom att koden ser ut så här.

Dock ger den mig ; expected på raden med else (age >= 65) {

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

@Giuffria,@Mustaf, @zaibuf:

string firstname; Console.WriteLine("Vad heter du i förnamn?"); firstname = Console.ReadLine(); string lastname; Console.WriteLine("Vad heter du i efternamn?"); lastname = Console.ReadLine(); string age; Console.WriteLine("Hejsan " + firstname + " " + lastname + "! " + "Hur gammal är du?"); age = Console.ReadLine(); Convert.ToInt32(age); if (age < 65) { Console.WriteLine(firstname + " " + lastname + " du har " + age + " år kvar tills pensionen."); } else (age >= 65) { Console.WriteLine("Du är redan pensionär, grattis!"); } Console.ReadKey(true);

Så här ser min kod ut just nu. Jag har testat era förslag, men jag får det inte och fungera. Testade att skriva int age; direkt, men det gav fel. Har sen ändrat till string age; istället och ändrat så att den konverterar istället genom Convert.ToInt32(age);.

Det vill sig dock inte.

Operator '<' cannot be applied to operands of type 'string' and 'int'
"

Du hanterar fortfarande åldern fel. När du deklarerar en variabel, "age", som en sträng, så kommer den för alltid att vara en sträng. Vill du ha den som en annan typ (int) så måste du skapa en ny variabel.
Så din rad "Convert.ToInt32(age)" gör i praktiken ingenting, eftersom du inte sparar resultatet av konverteringen från sträng till int. Alltså, när du sedan använder "age" igen så är det fortfarande en sträng.

Ett tips är att låta "age" alltid vara en int (eftersom en ålder aldrig behöver innehålla ord i din applikation), så fokusera istället på att direkt vid inläsning spara åldern som endast siffror.

Edit: En ELSE har aldrig något villkor. Villkoret sätter man i IF-satsen, om det inte är sant så går den automatiskt till ELSE.

Permalänk

@Alling @mmolder @Blomman90:

Redigerade inlägget som du kan se ovan. Nu verkar det som att jag gör som ni menar. Dock ger den mig fel på en rad.

EDIT: Ska testa det du skrev i din edit.

EDIT2: Jag tackar så oerhört mycket! Nu fungerar det och nu använder jag else if else korrekt. else har inget villkor, vilket jag gjorde fel. Jag snappade inte upp på hur man använder else korrekt.

En bonus att kanske lägga in är hur man gör om man skriver trettiotre istälet för 33? Hur kan man fixa det eller blir det kanske lite överkurs för mig som redan tycker det är svårt?

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

@Pellefant: Som andra redan har skrivit så kan man inte använda ett else-uttryck med ett villkor. Till detta används "else if (villkor)". Eftersom du redan har en if som undersöker om "age" är mindre än 65 så vet du ju att om det inte uppfylls så innebär det att "age" är större än eller lika med 65. Din kod bör fungera om du tar bort parentesen med villkoret efter "else" dvs:

if (age <65) { ... } else (age >= 65){ ... }

(Du har även tagit bort uträkningen av hur många år det är kvar till pensionen som du hade i din printout i början av inlägget).

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
99:e percentilen
Skrivet av Pellefant:

Dock ger den mig ; expected på raden med else (age >= 65) {

Som jag skrev tidigare: Du ska tänka att else betyder "annars", inte "annars om".

if (ålder < 65) { // … } else { // … }

Fördjupning

Det finns egentligen inget som heter else if. Det finns bara if och if … else.

Skrivet av C# 6.0 draft specification:

selection_statement : if_statement | switch_statement ; if_statement : 'if' '(' boolean_expression ')' embedded_statement | 'if' '(' boolean_expression ')' embedded_statement 'else' embedded_statement ; https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/statements#selection-statements

En if … else-sats behöver två satser: en för if och en för else. Praktiskt nog är en if-sats, som namnet antyder, en sats och kan således användas i else-fallet:

if (a) stmIfA else if (b) stmIfB

Det är anledningen till att vi kan skriva till exempel så:

if (a) { // … } else if (b) { // … } else if (c) { // … } else { // … }

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

Bifogar min slutgiltiga kod, istället för att redigera inlägget ovan.

string firstname; Console.WriteLine("Vad heter du i förnamn?"); firstname = Console.ReadLine(); string lastname; Console.WriteLine("Vad heter du i efternamn?"); lastname = Console.ReadLine(); Console.WriteLine("Hejsan " + firstname + " " + lastname + "! " + "Hur gammal är du?"); int age = int.Parse((Console.ReadLine())); if (age < 65) { Console.WriteLine(firstname + " " + lastname + " du har " + (65 - age) + " år kvar tills pensionen."); } else { Console.WriteLine("Du är redan pensionär, grattis!"); } Console.ReadKey(true);

Återigen, stort tack för hjälpen!!

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
99:e percentilen
Skrivet av Pellefant:

Bifogar min slutgiltiga kod, istället för att redigera inlägget ovan.

string firstname; Console.WriteLine("Vad heter du i förnamn?"); firstname = Console.ReadLine(); string lastname; Console.WriteLine("Vad heter du i efternamn?"); lastname = Console.ReadLine(); Console.WriteLine("Hejsan " + firstname + " " + lastname + "! " + "Hur gammal är du?"); int age = int.Parse((Console.ReadLine())); if (age < 65) { Console.WriteLine(firstname + " " + lastname + " du har " + (65 - age) + " år kvar tills pensionen."); } else { Console.WriteLine("Du är redan pensionär, grattis!"); } Console.ReadKey(true);

Återigen, stort tack för hjälpen!!

Fler förbättringar du kan göra:

Konsekvent indentering

Det normala är att låta satser på samma "djup" i koden ha samma indentering.

string firstname; - Console.WriteLine("Vad heter du i förnamn?"); - firstname = Console.ReadLine(); + Console.WriteLine("Vad heter du i förnamn?"); + firstname = Console.ReadLine();

Undvik magiska tal och "våt" kod

Helt plötsligt dyker det upp 65 mitt i koden. Vad är det för något? Det är inte svårt att lista ut baserat på sammanhanget i det här fallet, men i allmänhet kan sådan kod ge upphov till riktigt otäcka buggar. Definiera istället pensionsåldern endast en gång och använd sedan det namnet:

const int RETIREMENT_AGE = 65;

Då arbetar du också inom ramarna för den mycket viktiga principen Don't Repeat Yourself (DRY). Du vill undvika att skriva kod så att du behöver ändra på flera ställen för att ändra en sak. Till exempel, om pensionsåldern ändras till 70, vad behöver du göra för att uppdatera ditt program? Ändra alla 65 till 70? Men alla 65 i koden kanske inte står för pensionsåldern. Och pensionsåldern kanske även förekommer "förklädd", till exempel genom att du testar om någon har minst 10 år kvar till pensionen: if (age < 55) { … }. Bättre då att skriva det du egentligen menar: if (age < RETIREMENT_AGE - 10) { … }

Att försöka skriva vad man menar är en väldigt bra tumregel inom programmering.

Tilldelning på samma rad

I allmänhet kan du gott ha en hel tilldelning på en och samma rad:

int age = int.Parse(Console.ReadLine());

Konsekvent formatering

Det finns åtminstone två olika sätt att placera måsvingar:

if (a) { // … } else { // … }

if (a) { // … } else { // … }

Inget av dem är rätt eller fel, men var konsekvent genom koden. (Jag föredrar det förstnämnda.)

Deklarera och initiera samtidigt

Ofta är det lämpligt att initiera en variabel samtidigt som man deklarerar den. Och om du inte ska skriva över variabelns värde senare kan du berätta det explicit, så behöver ingen undra och du kan inte heller råka skriva över den. Då vet jag när jag läser och/eller redigerar din kod att jag kan lita på variabeln i fråga.

readonly string firstname = Console.ReadLine();

Med ovanstående förslag skulle man kunna tänka sig något likt följande:

const int RETIREMENT_AGE = 65; Console.WriteLine("Vad heter du i förnamn?"); readonly string firstname = Console.ReadLine(); Console.WriteLine("Vad heter du i efternamn?"); readonly string lastname = Console.ReadLine(); Console.WriteLine("Hejsan " + firstname + " " + lastname + "! " + "Hur gammal är du?"); readonly int age = int.Parse(Console.ReadLine()); if (age < RETIREMENT_AGE) { Console.WriteLine(firstname + " " + lastname + " du har " + (RETIREMENT_AGE - age) + " år kvar tills pensionen."); } else { Console.WriteLine("Du är redan pensionär, grattis!"); } Console.ReadKey(true);

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

Har en fråga till kring arbetet. Stort tack igen!

Vi har fått tre uppgifter och den andra gick mycket bättre. Den tredje har gått väldigt bra hittills, men får inte riktigt ihop det i slutet.

Random randomerare = new Random(); int slump_tal = randomerare.Next(1, 101); string numuserstring; int numuser; do { Console.WriteLine("Skriv en siffra mellan 1 och 100"); numuserstring = Console.ReadLine(); numuser = int.Parse(numuserstring); if (numuser > slump_tal) { Console.WriteLine("Ditt tal är större än den slumpade siffran"); } else (numuser < slump_tal) { Console.WriteLine("Ditt tal är mindre än den slumpade siffran"); } } while (slump_tal == numuser); Console.WriteLine("Du gissade rätt siffra"); Console.ReadLine();

Får ett fel på raden med

} else (numuser < slump_tal) {

Den förväntar sig ett ";" där. Varför och vart ska den sättas?

EDIT:
Glömde att nämna att uppgiften är att användaren ska gissa ett tal som slumpats fram mellan 1-100. Man ska använda dessa fyra:
1. Slumptal
2. Heltal
3. Loop med do och while
4. Villkor med if och else

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

@AReal_Human

Skrivet av Alling:

Ja. Du ska tänka att else betyder ”annars”, inte ”annars om”.

if (ålder < 65) { // … } else { // … }

Dvs. om raden ska bli giltig får du antingen slänga in en if efter else eller slopa parentesen.

Observera, slopar du parentesen så kommer ditt program att felaktigt påstå att numuser är mindre än det slumpade talet även om de är lika.

Om du istället lägger till if så kommer programmet inte säga något alls om värdena är lika. Detta är gissningsvis det du vill ha.

Permalänk
Medlem
Skrivet av Pellefant:

Får ett fel på raden med

} else (numuser < slump_tal) {

Den förväntar sig ett ";" där. Varför och vart ska den sättas?

} else if (numuser < slump_tal) {

kommer att kompilera.

Permalänk

@suzieq , @KAD

Ser att jag har en del kvar att jobba med.

Funkar med "else if". Måste vara mer nogrann med när jag ska använda vilket. Den här videon jag har kikat på medans har nästan gjort det mer förvirrande.

Koden stannar ju och går ur loopen oavsett. Har nog en del kvar att arbeta med ändå. Trodde den skulle börja om loopen när (slump_tal == numuser) var falskt. Får ta en kik på det imorgon igen och får återkomma då. Tack för hjälpen.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

@Pellefant: Det är för att du tänker lite bak å fram. Loopen kommer fortsätta så länge "slump_tal == numuser" är sant. Så om det är falskt så kommer loopen sluta.

Pseudo:
MEDAN (While) slump_tal == numuser
HOPPA TILL DO.

Edit: Så jag antar att du alltså vill att loopen ska fortsätta när slump_tal INTE är numuser. Jag har faktiskt inte kollat din övriga kod men såg bara att du tänkte lite fel på den där saken när jag läste din kommentar ovan så jag antar bara nu att det är vad du vill!

Permalänk
99:e percentilen
Skrivet av Forsgren:

@dengudomlige: Det är för att du tänker lite bak å fram. Loopen kommer fortsätta så länge "slump_tal == numuser" är sant. Så om det är falskt så kommer loopen sluta.

Pseudo:
MEDAN (While) slump_tal == numuser
HOPPA TILL DO.

Edit: Så jag antar att du alltså vill att loopen ska fortsätta när slump_tal INTE är numuser. Jag har faktiskt inte kollat din övriga kod men såg bara att du tänkte lite fel på den där saken när jag läste din kommentar ovan så jag antar bara nu att det är vad du vill!

Rekommenderar taggarna [cmd] och [code]. Med Better SweClockers slipper man skriva dem manuellt också.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

Jag ville bara tacka så mycket för hjälpen. Tycker inte att den boken vi ska läsa under denna distansutbildning har varit särskilt bra. Har nästan lärt mig mer av att googla fram diverse saker.

Har ni några rekommendationer för nybörjare? De rekommenderade en youtubekanal där man kan lära sig också. Tänkte jag ska kika lite där och kolla om den ger mig något mer istället. Har ni några rekommendationer för folk som läser programmering 1?

Är detta också rätt forum att fråga om man behöver hjälp med diverse saker eller finns det andra forum som man bör vända sig till? Tycker att det varit väldigt hjälpsamt, men undrar väl bara om det är passande eller accepterat på detta forum.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk

Hej igen,

Det var dags för att lämna in uppgift 2 "bastun" och ja koden fungerar, men inte som jag vill. Jag vill att den ska loopa tillbaka om temperaturen inte är 73-77 grader, men just nu hoppar den ur loopen oavsett. Jag har lagt till while (c < cmin && c > cmax); för att den ska endast hoppa ur om detta ej uppfylls. Är det där det har blivit fel?

Bifogar koden här nedan och undrar vart det har blivit fel i koden. Tack igen på förhand!

namespace Amerikanaren { class Program { public static double FToC(double fahrenheit) { return Math.Round((fahrenheit - 32) * 5 / 9,1); } public static void Main(string[] args) { double cstart = 0; double cmin = 73; double cmax = 77; double c; double f; do { Console.Write("Please enter the desired temperature: "); while (true) { try { f = double.Parse(Console.ReadLine()); break; } catch (Exception) { Console.WriteLine("\nError, only enter digits"); Console.Write("Please enter the desired temperature: "); } } c = FToC(f); if (c <= cstart) { Console.WriteLine("\nThe sauna is not active. Please enter a higher value"); } else if (c < cmin) { Console.WriteLine("\nThe sauna is not hot enough. Please enter a higher value {0}°C.", c); } else if (c > cmax) { Console.WriteLine("\nThe sauna is too hot. Please enter a lower value {0}°C", c); } }while (c < cmin && c > cmax); Console.WriteLine("The value that you have entered is acceptable. The temperature is {0}°C. Enjoy the sauna!", c); Console.WriteLine("Press any key to exit"); Console.ReadKey(); } } }

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

Hej igen,

Det var dags för att lämna in uppgift 2 "bastun" och ja koden fungerar, men inte som jag vill. Jag vill att den ska loopa tillbaka om temperaturen inte är 73-77 grader, men just nu hoppar den ur loopen oavsett. Jag har lagt till while (c < cmin && c > cmax); för att den ska endast hoppa ur om detta ej uppfylls. Är det där det har blivit fel?

Bifogar koden här nedan och undrar vart det har blivit fel i koden. Tack igen på förhand!

namespace Amerikanaren { class Program { public static double FToC(double fahrenheit) { return Math.Round((fahrenheit - 32) * 5 / 9,1); } public static void Main(string[] args) { double cstart = 0; double cmin = 73; double cmax = 77; double c; double f; do { Console.Write("Please enter the desired temperature: "); while (true) { try { f = double.Parse(Console.ReadLine()); break; } catch (Exception) { Console.WriteLine("\nError, only enter digits"); Console.Write("Please enter the desired temperature: "); } } c = FToC(f); if (c <= cstart) { Console.WriteLine("\nThe sauna is not active. Please enter a higher value"); } else if (c < cmin) { Console.WriteLine("\nThe sauna is not hot enough. Please enter a higher value {0}°C.", c); } else if (c > cmax) { Console.WriteLine("\nThe sauna is too hot. Please enter a lower value {0}°C", c); } }while (c < cmin && c > cmax); Console.WriteLine("The value that you have entered is acceptable. The temperature is {0}°C. Enjoy the sauna!", c); Console.WriteLine("Press any key to exit"); Console.ReadKey(); } } }

Med "c < cmin && c > cmax" så säger du att om c samtidigt är mindre än cmin och större än cmax så ska den fortsätta, detta kriterium kommer aldrig uppfyllas så det är bara första do som kommer köras. Istället för && (och) så kan du testa || (eller).

Permalänk

@SanyaIV: Stort tack, har stirrat mig blind på det och inte hittat felet.

Nu ska jag finslipa koden. Sedan också försöka lösa om användaren skriver in 0 istället för att slumpa fram en siffra. Återkommer ifall jag inte får ihop det.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

Hej igen,

Det var dags för att lämna in uppgift 2 "bastun" och ja koden fungerar, men inte som jag vill. Jag vill att den ska loopa tillbaka om temperaturen inte är 73-77 grader, men just nu hoppar den ur loopen oavsett. Jag har lagt till while (c < cmin && c > cmax); för att den ska endast hoppa ur om detta ej uppfylls. Är det där det har blivit fel?

Bifogar koden här nedan och undrar vart det har blivit fel i koden. Tack igen på förhand!

namespace Amerikanaren { class Program { public static double FToC(double fahrenheit) { return Math.Round((fahrenheit - 32) * 5 / 9,1); } public static void Main(string[] args) { double cstart = 0; double cmin = 73; double cmax = 77; double c; double f; do { Console.Write("Please enter the desired temperature: "); while (true) { try { f = double.Parse(Console.ReadLine()); break; } catch (Exception) { Console.WriteLine("\nError, only enter digits"); Console.Write("Please enter the desired temperature: "); } } c = FToC(f); if (c <= cstart) { Console.WriteLine("\nThe sauna is not active. Please enter a higher value"); } else if (c < cmin) { Console.WriteLine("\nThe sauna is not hot enough. Please enter a higher value {0}°C.", c); } else if (c > cmax) { Console.WriteLine("\nThe sauna is too hot. Please enter a lower value {0}°C", c); } }while (c < cmin && c > cmax); Console.WriteLine("The value that you have entered is acceptable. The temperature is {0}°C. Enjoy the sauna!", c); Console.WriteLine("Press any key to exit"); Console.ReadKey(); } } }

Vidare så är det starkt rekommenderat att aldrig någonsin använda "While(true)". Anledningen är att man till While-loopen anger under vilket condition loopen ska sluta köras. Med "While(true)" så säger man per definition att denna loop aldrig ska sluta köras, alltså en evighetsloop.

Du ser dessutom ut att ha dubbla While-loopar, så fråga dig varför du väljer att loopa på detta sätt och om det finns en bättre lösning?