sitter och försöker komma på det här med struct´s, försöker mig på ett databas liknande program, där man ska kunna lägga in en namn och poäng tex. sen vill jag kunna sortera dem efter poängen när jag skriver ut dem, den ska bara kunna innehålla 5 namn så om man inte skriver in ett högre poäng än som redan finns på listan ska det inte läggas till, och om man gör det ska resten flyttas neråt osv Tja, det beror ju lite på. okey, vi börjar högst upp i din förklaring då! Skippa konstruktorn tills vidare. Ta bort den raden helt, och kolla vad du får för fel. tog bort ovanstående rad och då får jag Okej, jag var nog lite otydlig. Vad jag menar är att du ska köra med din ursprungliga kod och byta en sak i taget. Byt först strängen till string istället för char[] (och mina nya namnförslag om du vill det). det var precis det jag gjorde denna kod har jag just nu Nu använder du konstruktorn utan att ha definierat den. Niklas skrev att du skulle definiera konstruktorn utan att använda den, tvärtom alltså. vad jag tror är att eftersom det är en ganska så nybörjar aktig kurs och en uppgift i den så ska man inte blanda in för mycket komplicerade saker, för att göra den bästa koden! Utan använda sig av de saker man lärt sig! och det är i princip enkla cout och cin, if, elseif, else, do, while, for och lite structs och arrays har vi pricis börjat med! Ja, du skrev ju inte att det var en skoluppgift, det jag gav var ju vettig kod... =) jag tror dig :) men eftersom jag inte kommit så långt ännu, så är det nog simplast att försöka bygga upp det med det som jag bör/ska ha lärt mig hittills! Så enkel kod som möjligt utan saker som inte ingått i kursen än så länge. Nu är det iofs svårt för dig att veta vad jag kan och inte kan, men nu har du ju uppgiften så kanske det är lite enklare att se vad jag är ute efter Ja, det är helt klart vettigt, men det svåra är ju just steg 3. Det är det jag beskrev i förra inlägget. Vi kanske skulle kunna gå igenom koden från början till slut, ett steg i taget och få det att fungera, om vi börjar så här (nu skriver jag utav kunskaper jag har än så länge, sen är antagligen inte det de allra bästa sättet, men kommentera gärna och ge tips Javisst funkar array, även om ni borde ha lärt er vector före... Okej, jag lade mig nog på lite för hög nivå här. Förstår du den koden du själv skickade? ja men om man inte skriver "entry list[4]" och bara "list[4]" så har den ju ingen koppling alls till entry Okej, känner du till begreppen deklaration och definition? tappade bort mig någonstans där i mitten ;) Okej, vi tar det i steg. Skriv all kod, kopiera inte bara, utan för över det nya jag skriver, säg sen till var du inte förstår. yeah jag har koll på det nu, nästa steg borde vara att välja ja/nej för att lägga in ett nytt namn har börjat få det att fungera lite som jag ska nu, men behöver lite hjälp med själva sorteringen! Ja, en swap är alltid vettig om man ska byta plats (och använd gärna den inbyggda, std::swap). sitter och läser om och om igen här och försöker fundera ut hur jag ska kunna lösa det! Jepp, den tar alla typer. Det kallas "templates", mallar. har kommit en bit på vägen, men får inte själva algoritmen att funka som det ska, tänker kanske snurrigt? Den sorterar till viss del men stannar upp innan den e klar! inte lätt att vara nybörjare, ska lägga mig och läsa igenom lite av sorterings kapitlen men kommentera gärna! missar en "for" där i koden och jag förstår att det är därför den inte fortsätter löste det! :P weee Grattis! nu följer jag inte riktigt, du får nog förklara vad som är fel http://en.wikipedia.org/wiki/Bubble_sort jag har kikat på några olika exempel på bubbelsortering och enda skillnaden jag kan se från deras kod och min är att jag hade skrivit max_hiscore-1 på båda for:sen, tog bort på den översta och det funkade fortfarande, på den andra dock så hängde det sig och jag fick trycka break i vs vad jag menar är att du ska kunna skriva okey jag ändrade lite i koden, och har lagt till en temp för att kunna lägga in nya namn/poäng, dessutom har jag lagt till funktioner för att både sortera och skriva ut Det börjar bli bra, men prova att ändra funktionen till jag har läst några veckor på powerhouse, och detta är första övningsuppgiften, är rätt ny i c++ som du säkert ser :) Ganska lite. Du måste ändra alla deklaration av arrayerna. från entry[] x; och entry *x till ska läsa igenom lite mera om vectors och se om jag kan få det att fungera! okey, om du bortser från det med vectorn nu och kollar på övrig kod, finns det nåt du skulle ändra på? tex mitt sätt att mata in namn och poäng och hur jag sparar dem? Har dessutom fått en kommentar från läraren angående mitt sätt att sortera? "Det ser bra ut, precis så är det tänkt att fungera. Jag är inte helt säker på att sorterings-funktionen är korrekt, testa med en omvänd sorterad lista och se om den fungerar //Jimmy" 1. Gör option till string också, då får du tydligare jämförelser; 1. får det inte att funka med string, har försökt! Men skriver jag tex "dsako" så stängs programmet ner efter loopen, och skriver jag yes, sen namn och poäng så stängs det nere efter. <b>>1. får det inte att funka med string, har försökt! Men skriver jag tex "dsako" så stängs programmet ner efter loopen, och skriver jag yes, sen namn och poäng så stängs det nere efter.</b> <b>>5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?</b>structar och sortering
#include <iostream>
using namespace std;
struct Hiscore
{
char name[20];
int points;
};
int main()
{
// fyller listan
Hiscore listan[4];
strcpy( listan[0].name, "Robbin" );
listan[0].points = 1000;
strcpy( listan[1].name, "Annelie" );
listan[1].points = 800;
strcpy( listan[2].name, "Magnus" );
listan[2].points = 600;
strcpy( listan[3].name, "Carro" );
listan[3].points = 400;
strcpy( listan[4].name, "David" );
listan[4].points = 200;
int i = 0;
for (i = 0; i < 5; i++)
{
cout << listan[i].name << "\t" << listan[i].points << endl;
}
cout << "Do you want to enter a new name? (yes/no): ";
system("pause");
return 0;
så långt har jag kommit, dock vet jag inte riktigt hur jag ska göra för att kunna lägga in nya namn och sortera dem riktigt, eller ja lägga in kan jag men sen då?
Sv: structar och sortering
Först några kommentarer om hur du skriver kod:
För det första. Använd hellre string än char[], det underlättar enormt.
För det andra, lägg gärna in en konstruktor till struct:en, så blir det lite snyggare.
För det tredje, försök var noga med hur du döper saker. Jag skulle kalla Hiscore för "entry". Undvik svenska namn, det blir alltid krystat.
Då får man;#include <iostream>
using namespace std;
struct entry
{
entry(string n="", int p=0) : name(n), points(p) {}
string name;
int points;
};
int main()
{
// fyller listan
entry list[4];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 800);
//...
int i = 0;
for (i = 0; i < 5; i++)
{
cout << list[i].name << "\t" << list[i].points << endl;
}
cout << "Do you want to enter a new name? (yes/no): ";
system("pause");
return 0;
}
Nu till själva problemet. Det är ju helt enkelt så att du får tänka ut hur det ska funka.
Om man skriver in ett poäng som är lägre än det sämsta är det bara att strunta i den nya posten.
Om man skriver in ett poäng som är högre än det sämsta så får man gå igenom listan för att ta reda på var det ska läggas in, ta bort sista, och sen skjuta ner alla som är lägre än det talet man har.
Om du gör så här så blir det alltid sorterat. Nu finns det problem med det och det är att du måste göra mycket manuellt. I C++ finns bättre alternativ än arrayer. Den enklaste är vector, och då kan du sortera lättare. Det här kanske är grejer som du inte har kollat på än, men du kan ju kika på det.
Då får du
vector<entry> the_list;
the_list.push_back(entry("Robbin", 1000));
the_list.push_back(entry("Annelie", 800));
//...
//Sen lägger du till en ny genom
the_list.push_back(entry(name, points));
//till sist sorterar du med
sort(the_list);
//detta kan du göra massor av gånger, det viktiga är att du bara visar de fem första när du presenterar det. (om man nu inte tillåter listan att växa)
for(int i=0; i<5; i++)
std::cout << the_list.at(i).name << ": " << the_list.at(i).points;
}
För att sort ska fungera måste du definiera en <-operator (och eventuellt några andra också, typ ==), de gör du som:
struct entry{
//...
bool operator<(entry e) { return points < e.points; }
//...
} ;
Detta går att fixa på andra sätt också, men det här är nog enklast som första försök.
Det bästa är att inte trassla med sortering själv alls, utan använda en lagringsstruktur som hanterar det själv. Det finns en sån inbyggd, priority_queue. Där måste också < vara definierad. Då får du istället:
priority_queue<entry> the_list;
the_list.push(entry("Robbin", 1000));
//...
//Lägg in nya mha
the_list.push(entry(name, points));
//Så fort du ska ha ut de fem högsta använder du
for(int i=0; i<5; i++){
std::cout << the_list.front();
the_list.pop();
}
//Detta kommer dock innebära att listan blir tom, och om du vill skriva över flera gånger kan du köra med:
std::vector<entry> backup;
for(int i=0; i<5; i++){
std::cout << the_list.front();
backup.push_back(the_list.front());
the_list.pop();
}
for(int i=0; i<5; i++){
the_list.push(backup.back());
backup.pop_back();
}
Detta kanske ser krångligare ut men är egentligen väldigt enkelt. Återkom om du har några frågor!
Sv:structar och sortering
Jag antar att jag lär lägga till #include <string> för att kunna använda det istället för char?
so far so good,
ändrat i stucten, lagt till alla posterna som ska vara där från början, då kör vi
FATAL ERROR... _VALIDATE_RETURN_ERRCODE(sizeInBytes >= count, ERANGE);
BREAK...
Visual Studio har gjort en felaktig åtgärd, kommer nu att stängas
Varför får jag det meddelandet?
det är nåt som inte stämmer riktigt, tar jag bort <string> så komplierar den med ett error i just den delen självklart, så jag antar att det ligger någonstans i
entry(string n="", int p=0) : name(n), points(p) {}
Sv: structar och sortering
Sv:structar och sortering
hiscore.cpp(18) : error C2661: 'entry::entry' : no overloaded function takes 2 argumentsSv: structar och sortering
Funkar det?
Nästa steg är att bara lägga till en konstruktor men inte använda den, och testa att det funkar. Sen börja använda den, osv. Undvik alltid stora ändringar i program.Sv:structar och sortering
#include <iostream>
#include <string>
using namespace std;
struct entry
{
string name;
int points;
};
int main()
{
// fyller listan
entry list[4];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 800);
list[2] = entry("Magnus", 600);
list[3] = entry("Carro", 400);
list[4] = entry("David", 200);
int i = 0;
for (i = 0; i < 5; i++)
{
cout << list[i].name << "\t" << list[i].points << endl;
}
cout << "Do you want to enter a new name? (yes/no): ";
system("pause");
return 0;
}
Sv: structar och sortering
Sv:structar och sortering
så att blanda in massa överkurs grejer för att lösa denna uppgift är ingenting för mig tror jag!
Så här ser uppgiften ut:
Du ska göra en Hi-Score lista. Listan ska rymma namn och poäng för 5 spelare. Listan ska vara sorterad på något sätt, t.ex. med s.k. bubbelsortering. Sorteringsalgoritmen fungerar så här:
så_länge_som( listan_inte_är_sorterad ){
för_varje_element_i_listan_utom_det_sista
om( nuvarande_element < elementet_till_höger )
{
byt_plats_på( nuvarande_element, elementet_till_höger );
}
}
Tips: att kolla att "listan_inte_är_sorterad" är samma sak som att man kan löpa igenom den utan att behöva byta plats på några element.
Du får välja en annan sorteringsalgoritm om du vill. Det viktiga är att highscorelistan är sorterad.
Programmet ska fråga efter namn och poäng. Varje gång som man matat in dem ska programmet visa listan, sorterad (och helt presenterad på något snyggt sätt). Därefter ska programmet fråga om man vill mata in ett nytt namn. Om man väljer 'nej' ska programmet avslutas, annars ska programmet forsätta. Man ska alltså kunna mata in hur många namn som helst, och varje gång ska det nya namnet och poängen sorteras in på rätt ställe.Sv: structar och sortering
Poängen är att man inte vill skriva kod som redan finns i systemet.
Principen för att göra allt själv är enkel, men det är nog det här du borde komma på.
Det finns två olika varianter som är bra (och en hel rad dåliga):
Variant 1 (fulast):
1. Ha plats för 6 element i listan.
2. Lägg till det sista på plats 6 (skriv över vad som än var där innan).
3. Sortera listan.
4. Presentera alltid bara de 5 första.
Variant 2 (på många sätt snyggare):
1. Se till att listan alltid är sorterad.
2. Leta reda på punkten där den nya posten ska sättas in, flytta ner de andra. Du är då fortfarande garanterad att den är sorteradSv:structar och sortering
Så vad jag tänker är, att bygga upp det på detta vis
1. skapa en struct och fylla den med några namn
2. skapa början till koden som skriver ut listan och frågar om man vill lägga in ett nytt namn
där ska finnas 3 olika utfall
*ja - nytt namn
*nej - avslutar programmet
*felaktig inmatning - får skriva in ja/nej igen
3. om ja, skriva in namn/poäng, sortera in det på rätt plats och skriva ut nya listanSv: structar och sortering
Uppfattade inte om du hade någon fråga nu?Sv:structar och sortering
vi börjar från början:
#include <iostream>
using namespace std;
int main()
{
return 0;
}
sen skapar jag själva structen för mina namn och poäng och lägger in string
#include <iostream>
#include <string>
using namespace std;
struct entry
{
string name;
int points;
};
int main()
{
return 0;
}
nästa steg är ju att fylla den med värden som är standard och då antar jag att en array skulle funka?
#include <iostream>
#include <string>
using namespace std;
struct entry
{
string name;
int points;
};
int main()
{
entry list[4];
list[0] = entry("Robbin",1000);
// osv...
return 0;
}
då får jag fel i komplieringen
hiscore.cpp(17) : error C2661: 'entry::entry' : no overloaded function takes 2 arguments
Sv: structar och sortering
Problemet är att du skriver
list[0] = entry("Robbin",1000);
Men för att kunna göra det måste du ha en konstruktor i structen "entry". Vi kan skippa det just nu, och då skriver du bara precis som förut (förutom att strängarna blir enklare):
list[0].name = "Robbin"
list[0].points = 1000;Sv: structar och sortering
Det här är ju precis samma sak men char[] är utbytt mot string.
list är nu en "array av entry".
det betyder att list[0] är en "entry"
och då vet kompilatorn att list[0].name är en "string"
är du med?Sv:structar och sortering
jag har lärt mig att man kan skriva ungefär så här, dock är det ingen array då men det är ungefär samma sak när man gör det
entry list = {"robbin", 1000}
och då är list kopplad till structen entrySv: structar och sortering
När det kommer till variabler är det i stort sett samma sak.
När vi skriver
entry list[4];
Så betyder det att "list är en array med fyra element, varje element är av typen 'entry'".
Efter detta vet kompilatorn att "list" har denna typ, och förväntar sig operationer som den klarar. Vad gäller "array av ..." så betyder det att den klarar av [i]-operationer. Så fort vi anger list[0] efter detta så syftar vi på den första av alla våra "entry".
Vi skulle i princip kunna skriva
entry list0, list1, list2, list3;
och sen använda varje av dem istället för list[0], osv.
Alltså: Varje variabel måste deklareras. När man gör det berättar man vad den har för typ, då blir list "kopplad" till en struct. (Även om det är helt fel terminologi.)
Skulle du vilja deklarera variabeln som list[4] så skulle du få fel, där måste man berätta typ. Däremot ska man <b>inte</b> ange typen någon annanstans.Sv:structar och sortering
så VAD ska jag använda mig av? vektor? array? string eller chars?
kod exempel på båda skulle vara nice, hur man deklarerar och definerar, och jo jag känner till det ;)Sv: structar och sortering
1.
int main()
{
}
2.
#include<string>
#include<iostream>
using namespace std; //denna vill vi egentligen inte ha här, men nu gör vi så för enkelhets skull
int main()
{
string name="Robbin";
int points=1000;
std::cout << name << ": " << points ;
}
3.
#include<string>
#include<iostream>
using namespace std;
struct entry{
string name;
int points;
};
int main()
{
entry e;
e.name = "Robbin";
e.points = 1000;
cout << e.name << ": " << e.points;
}
4.
#include<string>
#include<iostream>
using namespace std;
struct entry{
string name;
int points;
};
int main()
{
entry e0, e1, e2;
e0.name = "Robbin";
e0.points = 1000;
e1.name = "Annelie";
e1.points = 800;
e2.name = "Erik";
e2.points = 600;
cout << e0.name << ": " << e0.points;
cout << e1.name << ": " << e1.points;
cout << e2.name << ": " << e2.points;
}
5.
#include<string>
#include<iostream>
using namespace std;
struct entry{
string name;
int points;
};
int main()
{
entry e[3];
e[0].name = "Robbin";
e[0].points = 1000;
e[1].name = "Annelie";
e[1].points = 800;
e[2].name = "Erik";
e[2].points = 600;
cout << e[0].name << ": " << e[0].points;
cout << e[1].name << ": " << e[1].points;
cout << e[2].name << ": " << e[2].points;
}
Är allt klart så långt?
Sv:structar och sortering
Sv:structar och sortering
som jag skrev ovanför så är uppgiften att använda sig av en så kallad bubbelsortering!
jag sparar ner min nya information i en temp
och sen vill jag lista igenom hela listan med något likande:
for (i = 0; i > 5; i++)
om (temp > lista[i])
sätt in och flytta alla ett steg till höger
vet inte hur jag ska lösa det smidigt utan att behöva kopiera all text om och om igen
om den till exempel hamnar högst upp måste jag juh kopiera temp till 0, 0 > 1, 1 > 2 osv
kanske är där någon form av swap funktion kanske skulle passa?Sv: structar och sortering
<b>>vet inte hur jag ska lösa det smidigt utan att behöva kopiera all text om och om igen
om den till exempel hamnar högst upp måste jag juh kopiera temp till 0, 0 > 1, 1 > 2 osv
</b>
Vad ser du som problemet - att det blir mycket kod, att det tar lång tid?
Blir det mycket kod har du tänkt fel. Att det tar lång tid spelar ingen roll eftersom:
1. Det är på en dator, då är det inte mycket saker som tar lång tid.
2. Det är bara ett experiment/en kurs (?), då är prestandan oväsentlig.
3. Det vanligaste sättet att optimera är att byta algoritm. Bubble sort fungerar precis som du beskriver, så om du gör på något annat sätt får du en annan algoritm.
Med reservation för hur du har tänkt att det ska funka. Bubble sort är märkligt nog en av de mest missförstådda algoritmerna.Sv:structar och sortering
hur fungerar den inbyggda swapen? tar den emot flera typer än int tex? eftersom jag som tidigare använder mig utav arrays av en struct med string och int i sammaSv: structar och sortering
Du kan alltså göra:
swap(din_array[i], din_array[j]);
Men sen är det ju kanske inte mycket svårare att använda:
temp = din_array[i];
din_array[i] = din_array[j];
din_array[j] = temp;
Så häng inte upp dig på det.Sv:structar och sortering
entry list[5];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 300);
list[2] = entry("David", 600);
list[3] = entry("Carro", 1200);
list[4] = entry("Magnus", 700);
//så_länge_som( listan_inte_är_sorterad )
for (int i = 0; i < 3; i++)
if(list[i].points < list[i+1].points)
{
swap(list[i], list[i+1]);
}
Sv: structar och sortering
#include <string>
#include <iostream>
using namespace std;
//Skapar en struct
struct entry
{
entry(string n="", int p=0) : name(n), points(p) {}
string name;
int points;
};
int main()
{
const int max_hiscore = 5; // Hur många som ska visas i hiscore listan
//Skapar och fyller hiscore listan
entry list[max_hiscore];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 300);
list[2] = entry("David", 600);
list[3] = entry("Carro", 1200);
list[4] = entry("Magnus", 700);
//Sorterar
for (int sort=0; sort<max_hiscore-1; sort++)
for(int i=0; i < max_hiscore-1; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);
//Skriver ut
for (int i = 0; i < max_hiscore; i++)
cout << list[i].name << "\t" << list[i].points << endl;
system("pause");
return 0;
}
Nu återstår bara att lägga in de sista funktionerna, så beware! Jag kommer nog med flera frågor ska du se, men lär säga att jag börjar förstå mera och mera
Sv:structar och sortering
Nu är det bara en grej att tänka på, och det är att algoritmen egentligen inte är riktigt rätt. =)
Försök fundera ut hur du kan optimera den, kolla på nätet efter bubblesort. Du har gjort rätt i
swap(list[i], list[i+1]);
och det är ovanligt. Men det är en detalj kvar. =)Sv: structar och sortering
dessutom har jag en liten fråga angående funktioner, försökte bygga en funktion utav sorteringen men då uppkom lite problem med arraysen och structen! står att den måste vara av en class/union/struct eller nåt likande i felmeddelandet, lite kod exempel skulle vara nice du har juh min kod som den är just nu ovanförSv:structar och sortering
Du vet att den största (eller minsta, beroende på hur du har skrivit det) alltid kommer hamna på rätt plats. Då räcker det att antingen börja från 2 eller sluta på n-1 nästa runda (beroende på upplägget), osv.
Principen för att skicka en array är:
void fun(type *array, int size)
{
array[1].apa = ...;
}
Men det är onödigt krångligt, och mycket bättre att bara köra med vector istället.Sv: structar och sortering
Sv:structar och sortering
for (int sort=0; sort<max_hiscore-1; sort++)
for(int i=0; i < max_hiscore-1-sort; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);
Efter sort=0-rundan så ser du att det minsta elementet kommer att ligga sist, eller hur?
Då behöver du inte jämföra med det sista nästa gång.Sv: structar och sortering
#include <string>
#include <iostream>
using namespace std;
//Skapar en struct
struct entry
{
entry(string n="", int p=0) : name(n), points(p) {}
string name;
int points;
};
//Funktion för att sortera hiscore listan
void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
for(int i=0; i < max_hiscore; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);
}
//Funktion för att skriva ut Hiscore listan
void PrintHiscore(entry list[], int max_hiscore)
{
cout << "-- HISCORE --"<< endl;
for (int i = 0; i < max_hiscore; i++)
cout << list[i].points << "\t" << list[i].name << endl;
}
int main()
{
const int max_hiscore = 5; // Hur många som ska visas i hiscore listan
//Skapar och fyller hiscore listan
entry list[6];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 300);
list[2] = entry("David", 600);
list[3] = entry("Carro", 1200);
list[4] = entry("Magnus", 700);
//Test input som ej skall vara med sen
string tempn;
int tempp;
cin >> tempn; cin >> tempp;
list[5] = entry(tempn, tempp);
SortHiscore(list, max_hiscore);
PrintHiscore(list, max_hiscore);
system("pause");
return 0;
}
Sv:structar och sortering
void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
for(int i=0; i < max_hiscore - sort; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);
}
Så ska den gå ungefär dubbelt så snabbt (inte för att det spelar någon roll med så här små arrayer, men ändå).
Gör du det till ett skolarbete eller vill du ha mer tips på hur du kan förbättra programmet?
Steg 1 är i så fall att byta ut arrayen till std::vector.
Sv: structar och sortering
hur mycket ändringar måste göras för att få det att funka med std::vector?Sv:structar och sortering
vector<entry> x(5);
för deklarationen av själva typen,
vector<entry> x;
i funktionsdeklarationen om du bara ska läsa från vectorn (som i print-funktionen).
eller
vector<entry> &x;
i funktionsdeklarationen om du ska ändra vektorn (som i sort-funktionen).
Utöver det så behöver du inte längre använda max_sort utan det räcker med x.size() för att få fram storleken. Om du får det att funka har du lärt dig ett bättre sätt att arbeta på. (Sen finns det några saker med ovanstående som man bör göra lite annorlunda, men det är en annan sak.)Sv: structar och sortering
Sv:structar och sortering
#include <string>
#include <iostream>
using namespace std;
//Skapar en struct
struct entry
{
entry(string n="", int p=0) : name(n), points(p) {}
string name;
int points;
};
//Funktion för att sortera hiscore listan
void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
for(int i=0; i < max_hiscore - sort; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);
}
//Funktion för att skriva ut Hiscore listan
void PrintHiscore(entry list[], int max_hiscore)
{
cout << endl << "Sorted Hiscore:" << endl << endl;
for (int i = 0; i < max_hiscore; i++)
cout << list[i].points << "\t" << list[i].name << endl;
}
int main()
{
const int max_hiscore = 5; //Hur många som ska visas i hiscore listan
char option[10]; //För att välja yes/no
string temp_name; //Här sparas det temporära namnet
int temp_points; //Här sparas den temporära poängen
//Skapar och fyller hiscore listan
entry list[6];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 300);
list[2] = entry("David", 600);
list[3] = entry("Carro", 1200);
list[4] = entry("Magnus", 700);
//Sorterar och skriver ut listan
SortHiscore(list, max_hiscore);
PrintHiscore(list, max_hiscore);
do {
cout << endl << "Do you want to add a new name? (yes/no): "; cin >> option;
if(strcmp(option, "yes") == 0)
{
cout << "Enter new name: "; cin >> temp_name;
cout << "Enter Score: "; cin >> temp_points;
list[5] = entry(temp_name, temp_points);
SortHiscore(list, max_hiscore);
PrintHiscore(list, max_hiscore);
}
else
cout << "Please enter yes or no!";
}while (strcmp(option, "no") != 0);
return 0;
}
Sv: structar och sortering
if(strcmp(option, "yes") == 0)
blir
if(option == "yes")
2. Det sätt du skriver loopen på kommer leda till att "please enter..." visas en gång även om man skriver "no".
3. yes/no är trevligt att få skriva in med stora bokstäver om man vill, och gärna bara med första bokstaven. Det gör man _inte_ genom att skriva varje tänkbar kombination av text, utan genom att först konvertera hela strängen till lower- eller upper-case.
4. Du får problem med highscorelistan eftersom du hela tiden skriver över entry nr 5. Vad du kan göra är att skriva över nr 6, och alltid visa 1-5. men inte skriva över 5.
5. Angående lärarens kommentar så är jag osäker på vad han syftar på. Antingen på max_hiscore-sort eller på swap(list[i], list[i+1]). Hur som helst så är det exakt så som bubblesort är definierad, och det är lite märkligt att han inte känner till det.
Du kan övertyga dig själv om att den är rätt. Första varvet kommer "i" gå rakt igenom hela listan. Det största av i och i+1 kommer hamna i position i+1. Det leder direkt till att det största talet kommer hamna allra längst till höger i första iterationen, alltså behöver man aldrig mer kolla på det sista talet. Du kan ju hänvsia
Men för all del, testa funktionen, det ska man alltid göra.Sv:structar och sortering
2. Förstår nu när du säger det att loopen visar "please enter..." men hur ska jag lösa det för att den inte skall göra det? finns ett gammal utryck som lyder, det man inte ser/vet, mår man inte dåligt av! Är inte detta ett ypperligt exempel på att bruka det utrycket :P så länge man har en tillräckligt snabb dator så hinner man nog aldrig se det haha
3. Jag har en exempel exe som visar hur det ska fungera, dock finns det juh alltid plats för förbättringar! I exemplet har jag provat allt det du skrev, om stora bokstäver och så och det fungerar som min, om man skriver YES så står det försök igen, så det är ju en sak jag kan utveckla på det till det bättre.
4. jag skriver ju över 6:an i arrayen 0,1,2,3,4 innehåller listan, 5an swappar väl plats med någon av dem när man skriver in namn/poäng?
5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?Sv: structar och sortering
Det ska inte påverka. Problemet skulle kunna vara att du har ett radbryt liggande kvar. Du skulle då kunna använda cin.flush() efteråt.
<b>>2. Förstår nu när du säger det att loopen visar "please enter..." men hur ska jag lösa det för att den inte skall göra det? finns ett gammal utryck som lyder, det man inte ser/vet, mår man inte dåligt av! Är inte detta ett ypperligt exempel på att bruka det utrycket :P så länge man har en tillräckligt snabb dator så hinner man nog aldrig se det haha</b>
Det är inte helt snyggt bara. Det kan du lösa genom att sätta en ifsats på rätt ställe, till exempel.
<b>>3. Jag har en exempel exe som visar hur det ska fungera, dock finns det juh alltid plats för förbättringar! I exemplet har jag provat allt det du skrev, om stora bokstäver och så och det fungerar som min, om man skriver YES så står det försök igen, så det är ju en sak jag kan utveckla på det till det bättre.</b>
Ja, om du vill lära dig programmera och inte bara följa exempel är det typiskt en bra grej att göra. Kolla på "string to lower case c++" på google.
<b>>4. jag skriver ju över 6:an i arrayen 0,1,2,3,4 innehåller listan, 5an swappar väl plats med någon av dem när man skriver in namn/poäng?</b>
Sorry, mitt fel. Men se till att du alltid skriver ut de fem första, och inte den sista med.
<b>>5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?</b>
Det där förstod jag inte?Sv:structar och sortering
Det där förstod jag inte?
Jo han bad mig kolla om det fungerade baklänges, och NÄR jag gör det så skriver den ut helt knasigt... du kan juh prova med min kod ovan om du har tid och ändra så for går baklänges istället.
ska kolla vidare på det programmet under dagen så jag lär nog posta lite här igen snart