Följ Black Week på SweClockers
Permalänk

Skriv ut betyget

Hej på er!

Jag håller på med en ny uppgift men jag kör fast.
Jag får till att användaren matar in alla poäng på olika ämnen, hur många av de olika betyg det finns och total antal poäng. Det jag inte får till är BETYGET för de olika ämnen baserat på hur många poäng de har fått per ämne.

Är det en av er som kan hjälpa mig och ser vart felet befinner sig?

/Danique

using System; namespace Betyg { class Program { static void Main(string[] args) { string[] ämnen = { "Matematik", "Svenska", "Engelska", "Historia", "Fysik" }; int[] poäng = new int[5]; char[] betyg = { '-', '-', '-', '-', '-' }; läsPoäng(ämnen, poäng); omvandlaPoäng(ämnen, poäng, betyg); skrivUtBetyg(ämnen, betyg); Console.ReadLine(); } static void läsPoäng(string[] ämnen, int[] poäng) { bool rättSumma = true; int poangen; do { for (int i = 0; i < ämnen.Length; i++) { Console.Write("Mata in poängen mellan 0-100 för " + ämnen[i] + ": "); poangen = Convert.ToInt32(Console.ReadLine()); poäng[i] = poangen; if (poäng[i] > 100 || poäng[i] < 0) { rättSumma = false; Console.WriteLine("Ogiltig poängsumma. Poängen ska vara mellan 0-100."); break; } else { rättSumma = true; } } } while (!rättSumma); } static void omvandlaPoäng(string[] ämnen, int[] poäng, char[] betyg) { int betyga = 0; int betygb = 0; int betygc = 0; int betygd = 0; int betyge = 0; int betygf = 0; int statistik = 0; for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyga++; else if (poäng[i] > 80) betygb++; else if (poäng[i] > 70) betygc++; else if (poäng[i] > 60) betygd++; else if (poäng[i] >= 50) betyge++; else if (poäng[i] >= 0) betygf++; else betyg[i] = '!'; } Console.WriteLine("antal A: " + betyga); Console.WriteLine("antal B: " + betygb); Console.WriteLine("antal C: " + betygc); Console.WriteLine("antal D: " + betygd); Console.WriteLine("antal E: " + betyge); Console.WriteLine("antal F: " + betygf); for (int i = 0; i < poäng.Length; i++) { statistik = statistik + poäng[i]; } Console.WriteLine("totala poäng: " + statistik); } static void skrivUtBetyg(string[] ämnen, char[] betyg) { Console.WriteLine("\n"); for (int i = 0; i < ämnen.Length; i++) Console.WriteLine("Betyg för ämnet " + ämnen[i] + " : " + betyg[i]); } } }

Permalänk
Medlem

Du behöver skriva in betyget i betyg-listan när du tagit reda på vilken "grad" betyget ska ha. Du gör det endast om man ska ha "!" i betyg just nu.

Permalänk
Skrivet av Penguin:

Du behöver skriva in betyget i betyg-listan när du tagit reda på vilken "grad" betyget ska ha. Du gör det endast om man ska ha "!" i betyg just nu.

Tack för hjälpen!!

Jag har ändrat nu, dock får jag inte till hur många A, B, C, D, E, F betyg det är..?

static void omvandlaPoäng(string[] ämnen, int[] poäng, char[] betyg) { int betyga = 0; int betygb = 0; int betygc = 0; int betygd = 0; int betyge = 0; int betygf = 0; int statistik = 0; for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyg[i] = 'A'; else if (poäng[i] > 80) betyg[i] = 'B'; else if (poäng[i] > 70) betyg[i] = 'C'; else if (poäng[i] > 60) betyg[i] = 'D'; else if (poäng[i] >= 50) betyg[i] = 'E'; else if (poäng[i] >= 0) betyg[i] = 'F'; else betyg[i] = '!'; } Console.WriteLine("antal A: " + betyga); Console.WriteLine("antal B: " + betygb); Console.WriteLine("antal C: " + betygc); Console.WriteLine("antal D: " + betygd); Console.WriteLine("antal E: " + betyge); Console.WriteLine("antal F: " + betygf); for (int i = 0; i < poäng.Length; i++) { statistik = statistik + poäng[i]; } Console.WriteLine("totala poäng: " + statistik); } static void skrivUtBetyg(string[] ämnen, char[] betyg) { Console.WriteLine("\n"); for (int i = 0; i < ämnen.Length; i++) Console.WriteLine("Betyg för ämnet " + ämnen[i] + " : " + betyg[i]); }

Permalänk
Medlem
Skrivet av DKarlsson:

Tack för hjälpen!!

Jag har ändrat nu, dock får jag inte till hur många A, B, C, D, E, F betyg det är..?

Du har massor med variabler för att hålla koll på hur många av varje betyg du delar ut, men du ändrar aldrig variablerna

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Skrivet av GLaDER:

Du har massor med variabler för att hålla koll på hur många av varje betyg du delar ut, men du ändrar aldrig variablerna

Menar du att jag har för många?

Permalänk
Medlem
Skrivet av DKarlsson:

Menar du att jag har för många?

Nej, han menar att du behöver använda variablerna i fråga.

Permalänk
Skrivet av Erik_T:

Nej, han menar att du behöver använda variablerna i fråga.

Tack så mycket..
Nu har jag ändrat igen och nu är det felet att han inte skriver hur många av de olika betyg det är. Han räknar poäng och ge betyg. Dvs. att statistiken inte stämmer nu.....?

static void omvandlaPoäng(string[] ämnen, int[] poäng, char[] betyg) { int betyga = 0; int betygb = 0; int betygc = 0; int betygd = 0; int betyge = 0; int betygf = 0; int statistik = 0; for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyg[i] = 'A'; else if (poäng[i] > 80) betyg[i] = 'B'; else if (poäng[i] > 70) betyg[i] = 'C'; else if (poäng[i] > 60) betyg[i] = 'D'; else if (poäng[i] >= 50) betyg[i] = 'E'; else if (poäng[i] >= 0) betyg[i] = 'F'; else betyg[i] = '!'; } Console.WriteLine("antal A: " + betyga); Console.WriteLine("antal B: " + betygb); Console.WriteLine("antal C: " + betygc); Console.WriteLine("antal D: " + betygd); Console.WriteLine("antal E: " + betyge); Console.WriteLine("antal F: " + betygf); for (int i = 0; i < poäng.Length; i++) { statistik = statistik + poäng[i]; } Console.WriteLine("totala poäng: " + statistik); } static void skrivUtBetyg(string[] ämnen, char[] betyg) { Console.WriteLine("\n"); for (int i = 0; i < ämnen.Length; i++) Console.WriteLine("Betyg för ämnet " + ämnen[i] + " : " + betyg[i]); } } }

Permalänk
Medlem
Skrivet av DKarlsson:

Tack så mycket..
Nu har jag ändrat igen och nu är det felet att han inte skriver hur många av de olika betyg det är. Han räknar poäng och ge betyg. Dvs. att statistiken inte stämmer nu.....?

T.ex på raden

Console.WriteLine("antal A: " + betyga);

var har du satt variablen "betyga" till rätt värde? (Ledtråd: Det har du inte.)

Permalänk
Medlem

Mer generellt tips när någon variabel inte är vad tycker att den borde vara, är att söka på alla ställen i koden där den modifieras, kolla så det ser rätt ut, sedan följa alla variabler den i sin tur beror på motsvarande sätt.

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Skrivet av Erik_T:

T.ex på raden

Console.WriteLine("antal A: " + betyga);

var har du satt variablen "betyga" till rätt värde? (Ledtråd: Det har du inte.)

Nä det har jag inte för att jag har satt den på = 0. Men när jag vill ändra till > 90 && <= 100 då säger den att det inte går heller. Borde jag skriva in betyg a någonstans i det här..:

int A = 0; int B = 0; int C = 0; int D = 0; int E = 0; int F = 0; int statistik = 0; for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyg[i] = 'A'; else if (poäng[i] > 80) betyg[i] = 'B'; else if (poäng[i] > 70) betyg[i] = 'C'; else if (poäng[i] > 60) betyg[i] = 'D'; else if (poäng[i] >= 50) betyg[i] = 'E'; else if (poäng[i] >= 0) betyg[i] = 'F'; else betyg[i] = '!';

Permalänk
Skrivet av e1m1:

Mer generellt tips när någon variabel inte är vad tycker att den borde vara, är att söka på alla ställen i koden där den modifieras, kolla så det ser rätt ut, sedan följa alla variabler den i sin tur beror på motsvarande sätt.

Tack. Jag ser ju att de där variabler med betyga, betygb osv bara kommer tillbaka när det blir utskrivit hur många betyg A, B, C, D det är. Därav kommer det förmodligen att det är 0. För att jag har gjort de som variabel betyga = 0 osv. Dock får jag inte in en beräkning både där eller där man matar in antal poäng.... Känns som att jag är helt ute och cyklar.

Permalänk
Medlem
Skrivet av DKarlsson:

Tack. Jag ser ju att de där variabler med betyga, betygb osv bara kommer tillbaka när det blir utskrivit hur många betyg A, B, C, D det är. Därav kommer det förmodligen att det är 0. För att jag har gjort de som variabel betyga = 0 osv. Dock får jag inte in en beräkning både där eller där man matar in antal poäng.... Känns som att jag är helt ute och cyklar.

Variablerna initieras till 0, för i början av funktionen har du ju inte delat ut några betyg än. Vad du sen vill göra är att öka respektive räknare varje gång du delar ut ett betyg. Så när du delar ut ett A så vill du öka betyga med 1, när du delar ut ett B så vil du öka betygb, o.s.v.

Tillägg: Ett problem som kanske uppstår är att du inte skrivit ut { } i dina if-satser. Det gör att endast den nästkommande satsen tillhör if-satsen, så om du lägger till en till kodrad så fungerar det inte som det ska längre. D.v.s.:

if (villkor) sats1; sats2;

är egentligen samma sak som:

if (villkor) sats1; sats2;

D.v.s. sats2 hör inte till if-satsen alls här. Och när du sen har else if så blir det helt fel.

Slutsatsen är alltså att alltid skriva ut { } så att det blir:

if (villkor) { sats1; sats2; }

Det blir lite mer att skriva, men det kommer undvika mycket problem över tid.

Permalänk
Skrivet av perost:

Variablerna initieras till 0, för i början av funktionen har du ju inte delat ut några betyg än. Vad du sen vill göra är att öka respektive räknare varje gång du delar ut ett betyg. Så när du delar ut ett A så vill du öka betyga med 1, när du delar ut ett B så vil du öka betygb, o.s.v.

Tack. Men om jag matar in typ poängvärden där när jag vill initiera de olika betygen då säger den ifrån att det inte kan med int. för att det är en boolean.

Permalänk
Skrivet av perost:

Variablerna initieras till 0, för i början av funktionen har du ju inte delat ut några betyg än. Vad du sen vill göra är att öka respektive räknare varje gång du delar ut ett betyg. Så när du delar ut ett A så vill du öka betyga med 1, när du delar ut ett B så vil du öka betygb, o.s.v.

Tillägg: Ett problem som kanske uppstår är att du inte skrivit ut { } i dina if-satser. Det gör att endast den nästkommande satsen tillhör if-satsen, så om du lägger till en till kodrad så fungerar det inte som det ska längre. D.v.s.:

if (villkor) sats1; sats2;

är egentligen samma sak som:

if (villkor) sats1; sats2;

D.v.s. sats2 hör inte till if-satsen alls här. Och när du sen har else if så blir det helt fel.

Slutsatsen är alltså att alltid skriva ut { } så att det blir:

if (villkor) { sats1; sats2; }

Det blir lite mer att skriva, men det kommer undvika mycket problem över tid.

Oke.. Men jag förstår ändå inte. Pratar vi nu om att initierar mina betyg jag har satt? För att det är ju där det går fel? När jag ska räkna statistiken om hur många av de olika betyg det är satt?

Permalänk
Medlem
Skrivet av DKarlsson:

Tack. Men om jag matar in typ poängvärden där när jag vill initiera de olika betygen då säger den ifrån att det inte kan med int. för att det är en boolean.

Försöker du skriva t.ex. int betyga = poäng > 90 && poäng <= 100? Så fungerar det inte. Du ska initiera dessa variabler til 0, så långt är det rätt. Men sen måste du öka variablerna varje gång du delar ut ett betyg inne i for-loopen. D.v.s. när du säger betyg[i] = 'A' så har du lagt till ett A, då måste du även öka betyga med 1.

Permalänk
Medlem

I din första version så gick du igenom alla poäng i arrayen, och inkrementerade betyga, betygb osv. Då fick du ut antal av varje betyg, men inte betyget.
Sedan gjorde du om så att du sparade betyget när du gick igenom poängen, men du tog bort inkrementeringen av betyga, betygb osv.

Jag förstår inte riktigt vad du menar när du vill ändra till > 90 && <= 100, eller vilket fel du fick. Men du har redan löst problemet med att räkna antal av varje betyg, i din första version av koden. Sen ändrade du till att spara betygen i din betyg array istället, vilket löste ditt problem med att visa betygen, men du räknar inte antal längre. Så du har redan löst bägge problemen var för sig, nu behöver du bara kombinera dina två lösningar så att du både räknar ut antal betyg och sparar betyget.

Visa signatur

AsRock Z790 PG Riptide | i7 13700k | Noctua NH-D15 | 32 GB DDR5 @ 6000 Mhz | Gigabyte AORUS RTX 2070 Super 8GB | OS@1TB Samsung 970 EVO Plus | 1+4 TB SSD/HDD | Corsair RM750X V2 750W | Fractal Design Define C | 1x Alienware AW3423DW 34" 21:9 | 1x LG 27UL850 27" 16:9 | Razer DeathAdder Elite | Gigabyte Osmium Aivia MX Red & Ducky Shine6 MX Brown | Steelseries Arctis Nova 7

Permalänk
Skrivet av perost:

Försöker du skriva t.ex. int betyga = poäng > 90 && poäng <= 100? Så fungerar det inte. Du ska initiera dessa variabler til 0, så långt är det rätt. Men sen måste du öka variablerna varje gång du delar ut ett betyg inne i for-loopen. D.v.s. när du säger betyg[i] = 'A' så har du lagt till ett A, då måste du även öka betyga med 1.

Skrivet av mrape:

I din första version så gick du igenom alla poäng i arrayen, och inkrementerade betyga, betygb osv. Då fick du ut antal av varje betyg, men inte betyget.
Sedan gjorde du om så att du sparade betyget när du gick igenom poängen, men du tog bort inkrementeringen av betyga, betygb osv.

Jag förstår inte riktigt vad du menar när du vill ändra till > 90 && <= 100, eller vilket fel du fick. Men du har redan löst problemet med att räkna antal av varje betyg, i din första version av koden. Sen ändrade du till att spara betygen i din betyg array istället, vilket löste ditt problem med att visa betygen, men du räknar inte antal längre. Så du har redan löst bägge problemen var för sig, nu behöver du bara kombinera dina två lösningar så att du både räknar ut antal betyg och sparar betyget.

Får jag gråta?

Permalänk
Skrivet av mrape:

I din första version så gick du igenom alla poäng i arrayen, och inkrementerade betyga, betygb osv. Då fick du ut antal av varje betyg, men inte betyget.
Sedan gjorde du om så att du sparade betyget när du gick igenom poängen, men du tog bort inkrementeringen av betyga, betygb osv.

Jag förstår inte riktigt vad du menar när du vill ändra till > 90 && <= 100, eller vilket fel du fick. Men du har redan löst problemet med att räkna antal av varje betyg, i din första version av koden. Sen ändrade du till att spara betygen i din betyg array istället, vilket löste ditt problem med att visa betygen, men du räknar inte antal längre. Så du har redan löst bägge problemen var för sig, nu behöver du bara kombinera dina två lösningar så att du både räknar ut antal betyg och sparar betyget.

Det har jag ju gjort här:

for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyga++; else if (poäng[i] > 80) betygb++; else if (poäng[i] > 70) betygc++; else if (poäng[i] > 60) betygd++; else if (poäng[i] >= 50) betyge++; else if (poäng[i] >= 0) betygf++; else betyg[i] = '!';

Men problemet är att jag får antingen fram vilka betyg det är eller statistiken. När jag vill kombinera de då får jag ett fel. För att jag kan ju inte ändra något där jag har deklarerat variablerna?

Permalänk
Medlem
Skrivet av DKarlsson:

Men problemet är att jag får antingen fram vilka betyg det är eller statistiken. När jag vill kombinera de då får jag ett fel. För att jag kan ju inte ändra något där jag har deklarerat variablerna?

Du behöver inte ändra hur du deklarerat variablerna, du behöver ändra koden du visar.

Permalänk
Skrivet av perost:

Du behöver inte ändra hur du deklarerat variablerna, du behöver ändra koden du visar.

Oke.. Då är den frågan borta.. Men jag har ju haft 2 olika här:

for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyga++; else if (poäng[i] > 80) betygb++; else if (poäng[i] > 70) betygc++; else if (poäng[i] > 60) betygd++; else if (poäng[i] >= 50) betyge++; else if (poäng[i] >= 0) betygf++; else betyg[i] = '!';

och:

for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyg[i] = 'A'; else if (poäng[i] > 80) betyg[i] = 'B'; else if (poäng[i] > 70) betyg[i] = 'C'; else if (poäng[i] > 60) betyg[i] = 'D'; else if (poäng[i] >= 50) betyg[i] = 'E'; else if (poäng[i] >= 0) betyg[i] = 'F'; else betyg[i] = '!'; }

Vad ska jag kombinera? För att den ena ger statisktiken och den andra ger betyget. Jag ser skogen inte längre..

Permalänk
Medlem
Skrivet av DKarlsson:

Vad ska jag kombinera? För att den ena ger statisktiken och den andra ger betyget. Jag ser skogen inte längre..

Du kan helt enkelt placera den ena loopen efter den andra. Men du kan också slå ihop dem till en loop så blir det mindre kod, eftersom det enda som skiljer är vad de gör inne i if-satserna.

Permalänk
Skrivet av perost:

Du kan helt enkelt placera den ena loopen efter den andra. Men du kan också slå ihop dem till en loop så blir det mindre kod, eftersom det enda som skiljer är vad de gör inne i if-satserna.

Tack. Jag kör den ena efter den andra. Min hjärna ser inte en lösning längre. Dock är det knepigt fortfarande för om när jag kör programmet nu och matar in 100 poäng på alla då säger den fortfarande att jag har ett betyg F någonstans.

Permalänk
Medlem
Skrivet av DKarlsson:

Får jag gråta?

Ja det är helt okej, det är en brant inlärningskurva att lära sig programmering, men det blir lättare med tiden

Visa signatur

AsRock Z790 PG Riptide | i7 13700k | Noctua NH-D15 | 32 GB DDR5 @ 6000 Mhz | Gigabyte AORUS RTX 2070 Super 8GB | OS@1TB Samsung 970 EVO Plus | 1+4 TB SSD/HDD | Corsair RM750X V2 750W | Fractal Design Define C | 1x Alienware AW3423DW 34" 21:9 | 1x LG 27UL850 27" 16:9 | Razer DeathAdder Elite | Gigabyte Osmium Aivia MX Red & Ducky Shine6 MX Brown | Steelseries Arctis Nova 7

Permalänk
Skrivet av mrape:

Ja det är helt okej, det är en brant inlärningskurva att lära sig programmering, men det blir lättare med tiden

Hahaha tack för omtanken. Jag har en lärare som bara säger: du får göra ditt bästa och lämna in så får du feedback. Tack för det. Men jag vill ju veta VAD jag gör fel och hur jag kan bli bättre medan jag gör en uppgift. Inte i efterhand.

Jag tycker ju att det är roligt att programmera. Men det känns att nivån på c# är ganska så högt när man är nybörjare och det gör att jag egentligen inte vill fortsätta. Tänk om min hjärna gör så mycket ont livet ut pga mitt jobb. Kan inte direkt säga att jag är dum för jag har ju studerat tidigare. Men det här är något utöver de hälsosamma enligt mig.

Permalänk
Skrivet av DKarlsson:

Tack. Jag kör den ena efter den andra. Min hjärna ser inte en lösning längre. Dock är det knepigt fortfarande för om när jag kör programmet nu och matar in 100 poäng på alla då säger den fortfarande att jag har ett betyg F någonstans.

Obs. det sist nämnde har jag fixat!

Permalänk
Medlem
Skrivet av DKarlsson:

Oke.. Då är den frågan borta.. Men jag har ju haft 2 olika här:

for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyga++; else if (poäng[i] > 80) betygb++; else if (poäng[i] > 70) betygc++; else if (poäng[i] > 60) betygd++; else if (poäng[i] >= 50) betyge++; else if (poäng[i] >= 0) betygf++; else betyg[i] = '!';

och:

for (int i = 0; i < poäng.Length; i++) { if (poäng[i] > 90 && poäng[i] <= 100) betyg[i] = 'A'; else if (poäng[i] > 80) betyg[i] = 'B'; else if (poäng[i] > 70) betyg[i] = 'C'; else if (poäng[i] > 60) betyg[i] = 'D'; else if (poäng[i] >= 50) betyg[i] = 'E'; else if (poäng[i] >= 0) betyg[i] = 'F'; else betyg[i] = '!'; }

Vad ska jag kombinera? För att den ena ger statisktiken och den andra ger betyget. Jag ser skogen inte längre..

De två olika versionerna löser vars ett problem, men du vill lösa bägge.
Så om poäng[i] > 90 && poäng[i] <= 100 så vill du både spara 'A' i betyg[i] och inkrementera betyga.
Som @perost skrev tidigare så behöver du använda måsvingar om du vill göra mer än en grej i en if-sats.

edit: uppdaterade poäng till poäng[i] för tydlighet

Visa signatur

AsRock Z790 PG Riptide | i7 13700k | Noctua NH-D15 | 32 GB DDR5 @ 6000 Mhz | Gigabyte AORUS RTX 2070 Super 8GB | OS@1TB Samsung 970 EVO Plus | 1+4 TB SSD/HDD | Corsair RM750X V2 750W | Fractal Design Define C | 1x Alienware AW3423DW 34" 21:9 | 1x LG 27UL850 27" 16:9 | Razer DeathAdder Elite | Gigabyte Osmium Aivia MX Red & Ducky Shine6 MX Brown | Steelseries Arctis Nova 7