Permalänk

C# Räkna antal specifika objekt

Jag har nu försökt ett bra tag att komma på hur jag ska räkna antal specifika objekt i en lista. i detta fallet är det fem olika ämnen (Matematik, Svenska, Engelska, Historia, Fysik ) där man har ombetts att skriva in betyg(A-F) för var och ett av ämnena. Nu är mitt problem att jag ska skriva ut "statistik" om betygen. Alltså räkna antal A, antal B osv. Jag kommer inte på hur jag ska göra. Om det underlättar så har man i ett tidigare skede skrivit in betygen som poäng (0-100) istället. 
Jag skäms för vilket skick min kod är i just nu men jag bifogar den iaf

using System; namespace Moment3 { class Program { static void lasPoang (string[] ämnen, int[] poäng) { int poängen; for (int i = 0; i < ämnen.Length; i++) { Console.WriteLine("Mata in poängen mellan 0-100 för " + ämnen[i] + ": "); poängen = Convert.ToInt32(Console.ReadLine()); poäng[i] = poängen; } } static void Af (string[] ämnen, int[] poäng, char[] betyg) { for (int i = 0; i < ämnen.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(ämnen[i] +"= " + betyg[i]); } } static void stat(string[] ämnen, int[] poäng, char[] betyg) { //vad gör jag här? } static void Main (string[] args) { string[] ämnen = { "Matematik", "Svenska", "Engelska", "Historia", "Fysik" }; int[] poäng = new int[5]; char[] betyg = new char[6]; lasPoang(ämnen, poäng); bool avsluta = false; while (!avsluta) { Console.Write("[A]skriv betyg i A-F\n"); Console.Write("[B]statistik\n"); Console.Write("[C]skriv ut betyg\n"); Console.Write("[D]avsluta\n"); Console.WriteLine("\nDitt val: "); char menyVal; menyVal = Console.ReadLine()[0]; switch (menyVal) { case 'a': case 'A': Af (ämnen, poäng, betyg); break; case 'b': case 'B': stat(ämnen, poäng, betyg); break; case 'c': case 'C': //nått här med ja break; case 'd': case 'D': Console.WriteLine("Hejdå"); avsluta = true; break; default: Console.WriteLine("Någonting gick fel. Hejdå"); avsluta = true; break; //välkomstmeddelande //v metod som ska omvandla poängen till betyg enligt skalan A-F. //Skriv en metod skrivUtBetyg som gör utskriften av betygen. } } } } }

Här följer hela uppgiften:

Deklarera alla variabler och skriv ett välkomstmeddelande.
Använd följande fält (array) i ditt program.string[] ämnen = { "Matematik", "Svenska", "Engelska", "Historia", "Fysik" };
int[] poäng = new int[5];
char[] betyg = new char[6];Skriv en metod LäsPoäng för att läsa elevens betygspoäng i de olika ämnena.Poängen ska du spara i en array, vektor eller lista.
När metoden anropas så ska användaren få mata in ett antal betygspoäng.
Vilka betygspoäng som ska matas in styrs avinnehållet i fältet ämnen.
static void lasPoang(string[] amnen, int[] poang, int n)
{
   //Metoden tar med sig arrayerna ämnen och string
   int poangen;

   for (int i = 0; i < n; i++)
   {
      Console.WriteLine("Mata in poängen mellan 0-100 för " + amnen[i] + ": ");
      poangen = Convert.ToInt32(Console.ReadLine());
      poang[i] = poangen;
   }
}

Skriv en metod som ska omvandla poängen till betyg enligt skalan A-F.
Betyget A motsvarar 100 poäng. Betygen ska du lagra i ett fält (array, vector eller list).

Betygets skala:90 < poäng <= 100 = 'A'

80 < poäng <= 90 = 'B'
70 < poäng <= 80 = 'C'
60 < poäng <= 70 = 'D'
50 <= poäng <= 60 = 'E'
poäng <= 50 = 'F'

Skriv en metod skrivUtBetyg som gör utskriften av betygen.Skriv en metod Statistik som ska beräkna antal "A", "C" och "F" betyg och totalt antal betygspoäng.

Jag har varit inne på den här tråden:
https://www.sweclockers.com/forum/trad/1039122-c-rakna-antal-...

Men den har inte hjälpt mig. Vet inte om jag varit fel ute. Tack så mycket på förhand!!

Permalänk

Har du listan betyg kan du iterera över den och precis som i din switch räkna varje a, b ,c.... Skulle även avråda från att använda å, ä, ö i dina variabler (eller svenska över huvud taget i din kod)

Permalänk
Hedersmedlem

Gör en array med ett element för varje betyg. Loopa genom alla betygen och räkna upp rätt element i arrayen för varje betyg.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Medlem

Eftersom att du i metoden Af (välj gärna ett mer beskrivande namn på metod nästa gång) matar in alla betyg i vektorn betyg så har du redan gjort det mesta av jobbet, nu behöver du bara på ett smart sätt räkna hur ofta de olika betygen matas in (och alltså totala antalen betygspoäng)

Permalänk
Medlem

En Dictionary<string, int> betygMap hade ju passat utmärkt
Använd betygMap.ContainsKey(betyg); för att kolla om du sett betyget än, i så fall, öka värdet som betygMap[betyg] innehåller. Om du inte sett betyget, skapa ny key i din dictionary

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem

Om du kör med linq och bara vill räkna saker med vissa värden kan du köra

var listaMedBetyg = ...
var antalBetygMedA = listaMedBetyg.Count(betyg => betyg.poäng > 90);

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Skrivet av Dodogreen:

Har du listan betyg kan du iterera över den och precis som i din switch räkna varje a, b ,c.... Skulle även avråda från att använda å, ä, ö i dina variabler (eller svenska över huvud taget i din kod)

Bra tips! Skulle man kunna få lite konkretare tips om hur det här skulle kunna fungera?

Skrivet av giplet:

Gör en array med ett element för varje betyg. Loopa genom alla betygen och räkna upp rätt element i arrayen för varje betyg.

Yes precis det här hade jag tänk. Men jag har inte fått nån kod att fungera. Tänker på nått likt det här:

if (poäng[i] > 90 && poäng[i] <= 100) betygA + 1;

Skrivet av Wefod:

Eftersom att du i metoden Af (välj gärna ett mer beskrivande namn på metod nästa gång) matar in alla betyg i vektorn betyg så har du redan gjort det mesta av jobbet, nu behöver du bara på ett smart sätt räkna hur ofta de olika betygen matas in (och alltså totala antalen betygspoäng)

Hallå Af är ju kort för A-F, duh. Jag vill ju göra som du säger att räkna hur ofta de olika betygen mattas in men jag har inte lyckats. Det känns lite som att lösningen är mitt framför mig och därför känner jag mig lite dum.

Skrivet av Pamudas:

En Dictionary<string, int> betygMap hade ju passat utmärkt
Använd betygMap.ContainsKey(betyg); för att kolla om du sett betyget än, i så fall, öka värdet som betygMap[betyg] innehåller. Om du inte sett betyget, skapa ny key i din dictionary

Det här låter ju onekligen bra. Ska se om jag får det att fungera.

Skrivet av Haptic:

Om du kör med linq och bara vill räkna saker med vissa värden kan du köra

var listaMedBetyg = ...
var antalBetygMedA = listaMedBetyg.Count(betyg => betyg.poäng > 90);

Jag får inte en count att fungera. Vad gör jag för fel?

Permalänk
Medlem

Du har vektorn betyg. Betyg är fylld med alla betyg A-F, ett exempel skulle kunna vara 4 A, 2 B, 3 C, 1 E. Istället för att skriva ut betygen så vill du räkna dem. Du kan loopa igenom betyg, och för varje char i betyg inte skriva ut betyget, utan istället kolla vilket betyg det är (Exempel: om det är ett A eller ett F). För varje iteration av loopen öka på en int (typ int A) med ett som räknar antalet av just A. Gör likadant för alla andra betyg och printa ut int a, b ,c osv efter du har iteretat genom hela betygsvektorn i så har du statistiken

Permalänk
Medlem
Skrivet av Hultapajk:

Jag får inte en count att fungera. Vad gör jag för fel?

Om du vill använda Count(); från LINQ-biblioteket måste du inkludera System.Linq namespacet högst upp i din fil.

D.v.s

using System.Linq;

System.Linq's .Count(x => x < 5); kan skrivas som .Where(x => x < 5).Count; där båda då returnerar antal element där x är mindre än 5.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk

Hörni hörni! Jag klarade det! Nu ska jag bara snygga till lite sen är det GOD JUL!
Tack så mycket för all hjälp.

static void stat(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 poängtot = 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++) { poängtot = poängtot + poäng[i]; } Console.WriteLine("totala poäng: " + poängtot);

Permalänk
Medlem

Snyggt jobbat! Ett litet tips här är att ta vara på den forloopen som redan finns i koden, så slipper du iterera över vektorn flera gånger! Tänk attribut