Permalänk

Hjälp med C#-uppgift

Sitter och försöker få rätt på en uppgift jag har fått. Jag ska göra ett program där man med hjälp av en while-sats låter användaren mata in ett obestämt antal nummer och när användaren matar in nummret "0" så ska alla tal adderas med varandra.

private void ReadInputAndSumNumbers() { double num = 0.0; bool done = false; while (!done); { WriteProgramInfo(); ReadInput(); if (num == 0) { done = true; } } }

Finns det något uppenbart fel i texten ovan? När jag kör programmet så skriver den ut vad den ska, alltså funkar WriteProgram-metoden. Men efter det så fryser det, man kan inte mata in mer än ett tal...

private double ReadInput() { sum += int.Parse((Console.ReadLine())); return sum; }

Självklart vill jag lära mig, så istället för att lösa hela uppgiften kanske nån godhjärtad själ peka mig åt rätt håll?

Permalänk
Inaktiv

Du get aldrig num ett värde. Sen är sum i ReadInput en int (int.Parse()...) men du försöker returnera en double.

Permalänk
Skrivet av anon150287:

Du get aldrig num ett värde. Sen är sum i ReadInput en int (int.Parse()...) men du försöker returnera en double.

Tack! Har fixat returvärdet i ReadInput nu, slarvfel ^^

Hur gör jag lättast för att få if-satsen att läsa av vad användaren matar in? Kan jag göra num till en global variabel och skriva (inuti ReadInputAndSumNumbers) num = sum?

Ber om ursäkt för min okunskap

EDIT:

double num = 0.0;

private void ReadInputAndSumNumbers() { bool done = false; num = sum; while (!done); { WriteProgramInfo(); ReadInput(); if (num == 0) { done = true; } } }

private double ReadInput() { num += double.Parse((Console.ReadLine())); return num; }

Permalänk
Inaktiv

Nej,

ReadInput returnerar ett värde. För att "fånga" det måste något ta emot värdet, tex:

int lol; lol = Method();

Integern lol tar emot värdet som returneras av Method().

Permalänk
Skrivet av anon150287:

Nej,

ReadInput returnerar ett värde. För att "fånga" det måste något ta emot värdet, tex:

int lol; lol = Method();

Integern lol tar emot värdet som returneras av Method().

private void ReadInputAndSumNumbers() { double num; num = ReadInput(); bool done = false; while (!done); { WriteProgramInfo(); ReadInput(); if (num == 0) { done = true; } } }

Så? Nu kom programmet ett steg längre! Dock kan jag bara mata in ett värde, sen fryser det.

Permalänk
Inaktiv

Du kör ju ReadInput mer än en gång
Du behöver dessutom inte ge num värdet av ReadInput första gången då det ändå kommer skrivas över i while loopen innan det kör i if satsen.

Permalänk
Medlem

WriteInfo vill du göra utanför loopen, annars skrivs den ut varje vända, eller vill du ha den varje gång?

Permalänk
Inaktiv
Skrivet av maximm:

private void ReadInputAndSumNumbers() { WriteProgramInfo(); var num = ReadInput(); while (num != 0); { num += ReadInput(); } } }

Nu ville han ju dock inte ha ett färdigt program utan ville bara ha hint så han kan lära sig själv.

Permalänk
Medlem

Inte säker på att det gör någon skillnad alls i C#.

Men skall det verkligen stå:

while (!done);

och inte

while (!done)

Dvs inget semikolon på while satsen?

Permalänk
Medlem

while() har inga semikolon.

while(){dostuff;}
eller
while() dostuff;
eller
while()
dostuff;

Permalänk
Medlem

private void ReadInputAndSumNumbers()
{
double summa = 0;

while (true)
{
WriteProgramInfo();
double num = ReadInput();
//räkna ut summa under programmets gång
summa += num;
if (num == 0)
{
break;
//skriv ut summa
}
}
}

Permalänk
Medlem

Det problemet du har är att du tar aldrig och tar emot numret som användaren ger dig då du struntar i return värdet av ReadInput.

Det jag skulle göra är (skrivet med pseudokod):

create vars sum, input and done while not done read user input into num add num to sum check if num meets exit criteria done

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Medlem

Steg:
Läs in och spara värdet.
Valbart, kontrollera att värdet är ett nummer (tips, använd Char.isnumerical för varje tecken)
Kasta om värdet från string till int.
Spara i en arraylista eller dylikt som kan hålla okännt antal värden.
Kontrollera om senaste värdet är 0, isf addera och mata ut, annars gå till första steget.

Permalänk
Skrivet av anon150287:

Du kör ju ReadInput mer än en gång
Du behöver dessutom inte ge num värdet av ReadInput första gången då det ändå kommer skrivas över i while loopen innan det kör i if satsen.

Gaah, är helvirrig. Huvudvärken dunkar!

Kör programmet "ReadInput()" när jag hämtar värdet av num i början?

Tanken jag har är att ReadInputAndSumNumbers() först ska skriva ut vad som står i WriteProgramInfo, sen ska den köra ReadInput() och där ska den hämta och addera värdet av num tills användaren matar in siffran "0" och då ska den skriva ut det sammanlagda värdet av det som användaren matade och skicka det till ShowResults() som variablen sum. Borde kanske förklara det i en punktlista för att göra det mer överskådligt ^^

EDIT: Jäklar vad med svar haha! Ska kolla igenom vad ni har skrivit. Jag är verkligen ny på detta och har i princip bara fått lära mig hur man skriver objektorienterat med en massa olika klasser, hur man deklarerar variabler och skriver if-satser. Håller på att lära mig for, while och do-while nu.

Permalänk
Skrivet av maximm:

WriteInfo vill du göra utanför loopen, annars skrivs den ut varje vända, eller vill du ha den varje gång?

Tack! Det vill jag ju inte

EDIT: När jag la den utanför while-satsen så skrevs den ut ännu en gång. Hur kommer det sig?

private void ReadInputAndSumNumbers() { double num; num = ReadInput(); bool done = false; WriteProgramInfo(); while (!done); { ReadInput(); if (num == 0) { done = true; } } ShowResults(); }

Permalänk
Medlem

Det ska den inte göra, hur ser det ut när du anropar ReadInputAndSumNumbers()?

Permalänk
Medlem

en loop, while satsen i ditt fall upprepas tills jämförelsen
!done
är false eller om
break;
kallas innom loopen, WriteProgramInfo() ligger utanför loopen och kommer därför inte att upprepas

Permalänk
Medlem
Skrivet av Constant3831:

Tack! Det vill jag ju inte

EDIT: När jag la den utanför while-satsen så skrevs den ut ännu en gång. Hur kommer det sig?

private void ReadInputAndSumNumbers() { double num; bool done = false; WriteProgramInfo(); while (!done) { num += ReadInput(); if (num == 0) { done = true; } } ShowResults(); }

Har aldrig jobbar med C# men det där ser rätt ut för mig iaf. Testa vetja.
Annars får du se över din ReadInput.

Edit: jag ändrade i Citatet till "rätt kod enligt mig".

Permalänk
Medlem

Det är väl först när du skriver "0" som talen ska adderas, inte under tiden.

Permalänk
Medlem

private double ReadInput()
{
num += double.Parse((Console.ReadLine()));
return num;

}

den metoden vet inte vad num är för något, man måste lokala variabler per metod.

private double ReadInput()
{
return double.Parse((Console.ReadLine()));
}

Så läser den in en siffra och skickar tillbaks den.

alternativt att du skickar med num

private double ReadInput(double num)
{
num += double.Parse((Console.ReadLine()));
return num;
}

Så kallar du på den med ReadInput(num);

Permalänk

Du verkar inte ha koll på: logiska uttryck, funktioner, skillnaden mellan double och int.
Läs på.

Min lösning kanske kan ge lite ledtrådar om hur det fungerar:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace scUppgift
{
class Program
{
static void Main(string[] args)
{

double someNum, sum = 0;
Console.Write("Skriv ett tal: ");
someNum = Convert.ToDouble(Console.ReadLine());

while (someNum != 0)
{
sum += someNum;
Console.Write("Skriv ett tal: ");
someNum = Convert.ToDouble(Console.ReadLine());
}
Console.WriteLine("Summa: " + sum);
Console.ReadLine();
}
}
}

eller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace scUppgift
{
class Program
{
static void Main(string[] args)
{

double someNum = getNum(), sum = 0;

while (someNum != 0)
{
sum += someNum;
someNum = getNum();

}
Console.WriteLine("Summa: " + sum);
Console.ReadLine();
}

static double getNum()
{
Console.Write("Skriv ett tal: ");
return Convert.ToDouble(Console.ReadLine());
}
}
}

Permalänk
Medlem

Om du vill skippa den första inläsningen av someNum för att korta ner det ännu mer kan du använda en
do{}
while(), så slipper du ge uttrycket i while-satsen ett första värde M4st3rSh4k3

Permalänk
Medlem

Du kan korta ner det hela lite genom att både anropa din funktion för att mata in ett nummer och assigna detta nummer i ett svep.

Så typ något i stil med

static double getNum() { Console.Write("Skriv ett tal: "); return Convert.ToDouble(Console.ReadLine()); } static void Main(string[] args) { double num, sum = 0; while ((num = getNum()) != 0) { sum += num; } Console.WriteLine("Summa: " + sum.ToString()); Console.ReadLine(); }

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P

Permalänk

Tack för all hjälp! Ska se om jag kan lösa det!