Hej! Bra jobbat, du verkar ju ha något som fungerar, men trots att din kod fungerar så gör den bara det av en slump. Du har en rätt allvarlig bugg som gömmer sig.
I funktionen GorOmPoangTillBetyg()
så läser du aldrig in värden i arrayen poang
. När du sedan läser variabler därifrån så hittar den bara vad som råkade vara på den minnesplatsen förut. Av en slump så kan det i vissa implementationer av C++ råka bli så att det blir rätt ändå, eftersom arrayen läggs på samma minnesadress som motsvarande array i LasPoang()
. Detta för att du har samma uppsättningar variabler i båda funktionerna, inte returnerar något, utan bara kör funktionerna utan parametrar direkt efter varandra.
Att förklara exakt hur detta funkar ändå innebär att gå in på hur "stacken" fungerar och det tror jag är lite överkurs för dig just nu, det räcker nog för att du ska förstå att det inte funkar. Testa t.ex. att kasta om ordningen i vilken du deklararer dina variabler så bör du nog se att det går sönder.
Utöver detta så formaterade jag upp koden nedan och har lagt till en del stilistiska kommentarer på mindre grejer som du kunde gjort "bättre" även om din approach funkar.
#include <iostream>
using namespace std;
void LasPoang() {
// Den här listen repeteras om och om igen i din kod. Generellt är det bra
// att inte upprepa sig i kod, för om man ändrar på ett ställe är det lätt
// hänt att man glömmer ändra på ett annat.
string amnen[5] = {
"Matematik",
"Svenska",
"Engelska",
"Historia",
"Fysik"
};
// Du bör även ha en konstant istället för att hårdkoda en 5:a överallt för
// "antal ämnen", av samma anledning, det är lätt att det blir fel om man ska
// ändra på många ställen.
int poang[5];
int InskrivnaPoang; // Varför är detta plötsligt stort I i början?
// Variabelnamn i C++ inleds normalt med liten bokstav.
for (int i = 0; i < 5; i++) {
cout << "Ange betyg i " << amnen[i] << endl;
// Du skulle kunna skriva in poängen direkt in i poang[i] genom att skriva:
// cin >> poang[i];
cin >> InskrivnaPoang;
poang[i] = InskrivnaPoang;
}
}
void GorOmPoangTillBetyg() {
string amnen[5] = {
"Matematik",
"Svenska",
"Engelska",
"Historia",
"Fysik"
};
int poang[5]; // Oj! Den här arrayen initieras aldrig! Var kommer värdena in
// i den här funktionen? Att detta ens funkar beror på slumpen.
int InskrivnaPoang; // Den här variabeln används inte ens i den här
// funktionen?
char betyg[6]; // Oj! Varför är denna 6 lång? Detta är exakt vad jag menade
// när jag sade att det är bra att ha konstanter. :-)
for (int i = 0; i < 5; i++) {
if (poang[i] >= 100) {
betyg[i] = 'A';
cout << amnen[i] << " " << betyg[i] << endl;
// Alla dessa continue-satser... varför inte bara köra if/else if
// istället? Det blir betydligt renare, t.ex. om du vill lägga in
// kod i slutet av blocket.
continue;
}
if (poang[i] <= 99 && poang[i] >= 90) {
// Du behöver inte kolla poang[i] är högst 99 här, du vet redan att
// poang[i] inte är 100 eller högre, för hade poang[i] varit så högt
// så hade du ju hamnat i if-stasen ovan och gått igenom loopen med
// continue.
betyg[i] = 'B';
// Kod i slutet, som till exempel denna rad, denna är ju identisk i
// alla lägen förutom för betyg F.
cout << amnen[i] << " " << betyg[i] << endl;
continue;
}
if (poang[i] <= 89 && poang[i] >= 80) {
betyg[i] = 'C';
cout << amnen[i] << " " << betyg[i] << endl;
continue;
}
if (poang[i] <= 79 && poang[i] >= 70) {
betyg[i] = 'D';
cout << amnen[i] << " " << betyg[i] << endl;
continue;
}
if (poang[i] <= 69 && poang[i] >= 51) {
betyg[i] = 'E';
cout << amnen[i] << " " << betyg[i] << endl;
continue;
}
if (poang[i] <= 50 && poang[i] >= 0); {
betyg[i] = 'F';
cout << amnen[i] << " " << betyg[i] << "Underkänd" << endl;
continue;
}
// Här nere skulle du kunna skriva ut ämnet, betyget, och huruvida det är
// underkänt, istället för att upprepa den koden om och om igen i varje
// if-sats. Men det bygger ju på att du kör if/else if istället för att ha
// en continue.
}
}
int main() {
LasPoang();
GorOmPoangTillBetyg();
return 0;
}
Till sist rekommenderar jag att du alltid kompilerar din källkod med varningar aktiverade. Sannolikt kom det varningar när din kod kompilerade som klagar just på att du försöker lära en array som aldrig någonsin skrivs, men antingen var varningar inte aktiverade i din kompilator, eller så struntade du helt enkelt i dem.