Permalänk
Medlem

C# skoluppgift

Har precis börjat med C# i skolan men nu har jag fastnat totalt på en uppgift och hoppas någon här kan hjälpa mig.

Uppgift: Skriv ett program där man upprepat kan mata in heltal ända tills det inmatade talet är = 0. Då ska summan
av alla inmatade tal visas.

Min kod just nu ser ut på följade sett

int x=1;
while (x != 0)
{
Console.WriteLine("Mata in ett tal: ");
x = int.Parse(Console.ReadLine());
}

if (x == 0)
{
Console.WriteLine("Summan av talen: " + x);
Console.ReadLine();
}

Är jag inne på rätt spår eller är jag helt ute och cyklar?

Permalänk
Medlem

Ja, lägg bara till en ny variabel som sparar alla tal som matats in och skriv ut den när x = 0.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem

Hur skriver man en sån variabel då?

Permalänk
Hedersmedlem

Jag är inte jätteerfaren inom programmering, och har aldrig skrivit något i C#, men det ser ut som att du inte summerar alla talen som matas in? Du skulle kunna göra det med hjälp av ytterligare en int-variabel inne i loopen.

Den andra if-satsen borde inte vara nödvändig, då du vill fortsätta läsa in tal tills x == 0, då kommer programmet gå vidare automatiskt. Varför Console.ReadLine i slutet? Jag kan som sagt inte C#, men det verkar onödigt att läsa in något igen?

Permalänk
Hedersmedlem

*Tråd rensad*

Inga färdiga svar, tack. Det är okej att hjälpa - men inte att ge färdig kod!

Permalänk
Medlem

Borde räcka att lägga till ett tecken på raden

x = int.Parse(Console.ReadLine());
bör det stå
x += int.Parse(Console.ReadLine());

Det är samma sak som att skriva x = x + int.Parse(Console.ReadLine());

Sedan bör x deklareras som = 0 inte = 1.

Permalänk
Medlem
Skrivet av LinuC:

Borde räcka att lägga till ett tecken på raden

x = int.Parse(Console.ReadLine());
bör det stå
x += int.Parse(Console.ReadLine());

Det är samma sak som att skriva x = x + int.Parse(Console.ReadLine());

Sedan bör x deklareras som = 0 inte = 1.

Och hur ska man då veta när användaren skrivit in 0 tänkte du?

Nej det här är ingen vidare lösning.

Permalänk
Medlem

Såhär hade jag tänkt vid denna uppgiften

Behöver en variabel för att summera alla tal som matas in.
Efter jag har matat in ett tal skall jag kolla ifall det talet är 0 eller inte.
Ifall det är 0 så skriver jag ut variablen där jag har summerat mina tal
Ifall det inte är 0 så lägger jag till mitt tal i summa varaiblen.

Permalänk
Medlem

Du bör deklarera en variabel till för att summera alla värden i.
Sedan så behöver du inte den andra if satsen då den har samma villkor som din loop så det du skriver i if satsen kan du skriva ut efter loopen.

du kan använda operatorn += för att addera något till summan
Ex y += 7 // nu kommer du att addera 7 till y

Permalänk
Medlem

När jag började med programmering så tog ett tag för mig att komma över att uttryck som följande faktiskt är giltiga:
int a = 4;
int b = 50;
b = b + a; // Det är dock snyggare att använda uttrcyket +=, och skrivs isf. ut: b += a;

Genom att hålla flera räknare i luften, där en räknares värde beror av en annan räknares, så kommer ni att kunna lösa uppgiften.

Visa signatur

Asus M5A99X EVO | AMD PhenomII x6 1100T @3.3GHz | Hyper 212+ EVO | Corsair DDR3 1600MHz @16GB | Asus GeForce GTX 1060 @1GB | Crucial M4 SSD @128GB | OCZ Solid 3 SSD @60GB | Seagate barracuda HDD @2TB | Corsair TX650 @650W | benQ 24" @2ms | Logitech X-540 @70W 5.1-surround | Corsair Gaming K95 RGB

Permalänk
Medlem
Skrivet av Craxx:

Du bör deklarera en variabel till för att summera alla värden i.
Sedan så behöver du inte den andra if satsen då den har samma villkor som din loop så det du skriver i if satsen kan du skriva ut efter loopen.

du kan använda operatorn += för att addera något till summan
Ex y += 7 // nu kommer du att addera 7 till y

Första gången jag någonsin använder mig utav en while loop så känner mig inte riktigt hemma än. Men nu har jag ändrat lite i min kod och den fungerar nästan som den ska. Men nu är felet att koden lägger till 2 hela tiden dvs om jag skriver in 50 och sedan avslutar loopen så kommer det stå att summan blir 52.

såhär ser den ut nu:

int x=1;
int y=x;

while (x != 0 )
{
y += x;
Console.WriteLine("Mata in ett tal: ");
x = int.Parse(Console.ReadLine());

}
Console.WriteLine("Summan av talen: " + y);

Så varför adderar min kod alltid 2??

Permalänk
Medlem
Skrivet av kriffä:

Första gången jag någonsin använder mig utav en while loop så känner mig inte riktigt hemma än. Men nu har jag ändrat lite i min kod och den fungerar nästan som den ska. Men nu är felet att koden lägger till 2 hela tiden dvs om jag skriver in 50 och sedan avslutar loopen så kommer det stå att summan blir 52.

såhär ser den ut nu:

int x=1;
int y=x;

while (x != 0 )
{
y += x;
Console.WriteLine("Mata in ett tal: ");
x = int.Parse(Console.ReadLine());

}
Console.WriteLine("Summan av talen: " + y);

Så varför adderar min kod alltid 2??

Jag har aldrig programmerat i C# men jag ska se om jag kan hjälpa dig.
Du får 2 eftersom att x = 1, y = x. 1+1 = 2. Jag skulle göra så att jag använde lokala variabler, och sen returnerar ett värde i funktionen och skriver ut det.

Permalänk
Medlem

Kompilera koden i ditt huvud och gå igenom allting steg för steg. Rad 1 och rad 2 är varsitt statement. Sedan kommer vi till din while-loop (while x != 0) som din 3:e kodrad, och den är ju alltid sann i och med att du redan definerat att int x = 1. Det betyder att koden alltid kommer att gå in i din while-loop och öka y med 1. Därefter skriver konsollen ut att den vill få ett heltal. Det tidigare kända "x=1" skrivs då över och tilldelas ett nytt tal, men ditt y är fortfarande y = 2. Försök skriva upp för dig själv i pseudokod vad du vill att koden ska göra så tror jag du kommer få bättre koll på det här. Spalta upp i ord (och gör det här på papper, jag lovar det ger en annan tankeverksamhet och kreativitetskänsla att scribbla på hederliga pappersark än att doodla i paint/notepad). Få ordningen klar för dig i hur du vill att sakerna ska följa och ske.

Visa signatur

Asus M5A99X EVO | AMD PhenomII x6 1100T @3.3GHz | Hyper 212+ EVO | Corsair DDR3 1600MHz @16GB | Asus GeForce GTX 1060 @1GB | Crucial M4 SSD @128GB | OCZ Solid 3 SSD @60GB | Seagate barracuda HDD @2TB | Corsair TX650 @650W | benQ 24" @2ms | Logitech X-540 @70W 5.1-surround | Corsair Gaming K95 RGB

Permalänk
Medlem

Tack för alla svar. Min uppgift är nu löst och fungerar som den ska.

Permalänk
Medlem
Skrivet av kriffä:

Första gången jag någonsin använder mig utav en while loop så känner mig inte riktigt hemma än. Men nu har jag ändrat lite i min kod och den fungerar nästan som den ska. Men nu är felet att koden lägger till 2 hela tiden dvs om jag skriver in 50 och sedan avslutar loopen så kommer det stå att summan blir 52.

såhär ser den ut nu:

int x=1;
int y=x;

while (x != 0 )
{
y += x;
Console.WriteLine("Mata in ett tal: ");
x = int.Parse(Console.ReadLine());

}
Console.WriteLine("Summan av talen: " + y);

Så varför adderar min kod alltid 2??

Först rekommenderar jag att du byter namn på x och y till tal och summa. Din kod blir då följande:

int tal=1; int summa=tal; while (tal != 0 ) { summa += tal; Console.WriteLine("Mata in ett tal: "); tal = int.Parse(Console.ReadLine()); } Console.WriteLine("Summan av talen: " + summa);

Ser du problemet? Du börjar med att sätta summa till tal och sedan lägger du tal till summa ännu en gång, oavsett om användaren väljer att avsluta programmet direkt genom att mata in 0.

För att lösa uppgiften:

  • summan ska börja på 0

  • användaren ska mata in ett tal innan det läggs till summa

Fast, egentligen är det "fel" att använda en while-loop här. Fel med extra feta citationstecken, för det är något jag personligen tycker och inte uppfattningen av den breda massan.

Man kan lösa uppgiften utan att använda en while-loop med så kallad rekursion. Rekursioner ger ofta snyggare lösningar men det tar ett tag att lära sig se mönstret i dem.

int SummeraTills0() { var tal = int.Parse(Console.ReadLine()); return tal + (tal != 0 ? SummeraTills0() : 0); } Console.WriteLine("Summan är: " + SummeraTills0());

Visa signatur

Kom-pa-TI-bilitet

Permalänk

istället för att sätta x till det som skrivs in lägg på det som skrivs in

idiotiska uppgifter med inget syfte

Visa signatur

CPU: i7 3930k Moderkort: Rampage IV Extreme Kylare: Corsair H100i RAM: 64 GB Corsair Dominator Platinum 1600mhz Grafikkort: EVGA GTX 780 SC (SLI planerat) SSD: Samsung 840 Pro 256 gb Övrig lagring: WD black 2 TB x 2 Chassi: 900D PSU: Corsair 1200i Skärmar: 2x GW2750HM 1x GL2750HM

Permalänk
Medlem

Typ? Lite mycket kod dock.

Din kod innehåller småfel som att if(x == 0), behövs inte eftersom while kommer köra tills den är 0 och sen gå vidare.
x kan bara definieras en gång, fylls alltså aldrig på med nya värden, utan blir bara ett nytt värde.

ReadKey anser jag är bättre än ReadLine för att avbryta applikationen.

Skrivet av kriffä:

Har precis börjat med C# i skolan men nu har jag fastnat totalt på en uppgift och hoppas någon här kan hjälpa mig.

Uppgift: Skriv ett program där man upprepat kan mata in heltal ända tills det inmatade talet är = 0. Då ska summan
av alla inmatade tal visas.

Min kod just nu ser ut på följade sett

int x=1;
while (x != 0)
{
Console.WriteLine("Mata in ett tal: ");
x = int.Parse(Console.ReadLine());
}

if (x == 0)
{
Console.WriteLine("Summan av talen: " + x);
Console.ReadLine();
}

Är jag inne på rätt spår eller är jag helt ute och cyklar?

Dold text

Int64 result = 0, input = -1; bool keep_going = true; do { input = Convert.ToInt64(Console.ReadLine()); switch(input) { case 0: keep_going = false; break; default: result += input; break; } } while (keep_going); Console.ReadKey();

Dold text
Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Typ? Lite mycket kod dock.

Din kod innehåller småfel som att if(x == 0), behövs inte eftersom while kommer köra tills den är 0 och sen gå vidare.
x kan bara definieras en gång, fylls alltså aldrig på med nya värden, utan blir bara ett nytt värde.

ReadKey anser jag är bättre än ReadLine för att avbryta applikationen.

Switch-casen och keep_going kan ersättas med en enda rad:

if (input == 0) break;

eller så loopar man tills input är noll..
Listan fyller ingen funktion alls. Det är bra att veta att man kan använda listor naturligtvis

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Switch-casen och keep_going kan ersättas med en enda rad:

if (input == 0) break;

eller så loopar man tills input är noll..
Listan fyller ingen funktion alls. Det är bra att veta att man kan använda listor naturligtvis

Stämmer. Även listan kan bytas ut mot en variabel, säg Int64 x som inkrementeras med det nya värdet genom: x += Convert.ToInt64(Console.ReadLine());.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Problem: Fråga om input (heltal) tills användaren matar in 0 ---------------------------------------------------------------- Ett första försök brukar ofta se ut på detta vis: int input; Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); while (input != 0) { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } Sedan inser man att man har dubblerat viss kod, och löser det med en falsk input enligt följande: int input = 1337; // Skilt från 0, talet är i sig betydelselöst, syftet = "bluffa" villkoret så loopen körs minst en gång. while (input != 0) { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } Istället kan man då använda en do-while-loop, vilken alltid körs en gång innan villkoret utvärderas: int input; do { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } while (input != 0); Alltså, Skall loopen köras 0+ gånger, använd while Skall loopen köras 1+ gånger, använd do-while

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

Problem: Fråga om input (heltal) tills användaren matar in 0 ---------------------------------------------------------------- Ett första försök brukar ofta se ut på detta vis: int input; Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); while (input != 0) { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } Sedan inser man att man har dubblerat viss kod, och löser det med en falsk input enligt följande: int input = 1337; // Skilt från 0, talet är i sig betydelselöst, syftet = "bluffa" villkoret så loopen körs minst en gång. while (input != 0) { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } Istället kan man då använda en do-while-loop, vilken alltid körs en gång innan villkoret utvärderas: int input; do { Console.WriteLine("Mata in ett tal: "); input = int.Parse(Console.ReadLine()); } while (input != 0); Alltså, Skall loopen köras 0+ gånger, använd while Skall loopen köras 1+ gånger, använd do-while

Dold text

Jag personligen skulle mer uppskatta ett sånt här upplägg:

Console.Write("Mata in heltal, när du är nöjd skriv en nolla"); do { input = Convert.ToInt64(Console.ReadLine()); switch(input) { case 0: keep_going = false; break; default: result += input; break; } } while (keep_going); Console.ReadKey();

Dold text

Att hela tiden få bli promptad att mata in, lite jobbigt. Switchen gör att man sen kan bygga på och jag vantrivs med if-satser, gå segare att skriva och blir fult. Inte fullt säker på om keep_going krävs men det är ju en escape så.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Du behöver inte ha en if-sats heller

do { ... } while {input != 0}

Det är bra mycket tydligare än att dölja exit-kriteriet bakom en boolean.
Switch cases i all ära, det ser ganska fult ut i mitten av en loop.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av freddyfresh:
Dold text

Jag personligen skulle mer uppskatta ett sånt här upplägg:

Console.Write("Mata in heltal, när du är nöjd skriv en nolla"); do { input = Convert.ToInt64(Console.ReadLine()); switch(input) { case 0: keep_going = false; break; default: result += input; break; } } while (keep_going); Console.ReadKey();

Dold text

Att hela tiden få bli promptad att mata in, lite jobbigt. Switchen gör att man sen kan bygga på och jag vantrivs med if-satser, gå segare att skriva och blir fult. Inte fullt säker på om keep_going krävs men det är ju en escape så.

Absolut ett alternativ. Om texten skrivs ut en eller flera gånger beror ju bara på om man lägger Console.Write innanför eller utanför loopen. Det jag syftade till att visa med mitt inlägg var skillnaden mellan while (0+ ggr) och do-while (1+ ggr), inte att ge (vad jag tycker är) snyggast möjliga lösning.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Avstängd

Ni blandar allihopa presentationslogik med domänlogik. Ska ni lära stackarn saker gör det rätt

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Ni blandar allihopa presentationslogik med domänlogik. Ska ni lära stackarn saker gör det rätt

TS har precis börjat lära sig de grundläggande funktioner språket erbjuder och du vill redan dra in programdesign!? Var sak har sin tid.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD