Trädvy Permalänk
Medlem
Registrerad
Mar 2016

Hjälp med en uppgift i C++

Jag har hållit på nu ett tag med en uppgift jag har fått gällande C++. Jag tror att allt fungerar förutom koden för bubblesort.

Programmet körs, så jag har inga felmeddelanden. Men resultatet är inte vad jag önskar.

Här nedan kommer koden jag har. Och under koden även en bild av resultatet.

Resultatet jag vill ha är att först ska familjen skrivas ut, osorterad. Denna del fungerar som den ska. Sen skall bubblesort sortera familjen efter ålder och skriva ut den nya listan. Detta fungerar inte som det ska.

Sen skall, genom en sökning, en person som är 5 år gammal skrivas ut, samt på vilken plats denna personen finns i en sorterade listan. Även detta fungerar inte som det ska.

Skulle vara evigt tacksam om jag kunde få hjälp med detta.

Tack på förhand.

#include <iostream> #include <string> #include <vector> using namespace std; class Person { public: string namn; int alder; //METOD: Sätter den info som behövs. void SetInfo(string _namn, int _alder) { namn = _namn; alder = _alder; } //FUNKTION: Som anropas i vektorn Familj för att skriva ut namn & ålder. void SkrivUt () { cout << namn << ", " << alder << endl; } }; // Nedanstående funktion står med i uppgiften att man kan använda sig av. // Jag förstår dock inte hur. //void byt(Person &p, Person &q) //{ // Person temp; // temp.namn = p.namn; // temp.alder = p.alder; // p.namn = q.namn; // p.alder = q.alder; // q.namn = temp.namn; // q.alder = temp.alder; //} //FUNKTION: Sorteringsalgoritm void bubblesort(Person p[], int n) { int i = 0; //Den yttre loopen, går igenom hela listan. for (i = 0; i < n; i++) { //Den inre, går igenom element för element. int nrLeft = n - i; //För att se hur många som redan gåtts igenom for (int j = 0; j < nrLeft; j++) { if (p[j].alder > p[j + 1].alder) //Jämför elementen. { //Byt plats! int temp = p[j].alder; p[j].alder = p[j + 1].alder; p[j + 1].alder = temp; } } } } int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { for (int i = 0; i < n; i++) //Söker igenom hela array:n. { if (p[i].alder == a) //Om p[i] är lika med sökt värde så returneras i. { return i; } } return -1; //Annars returneras -1. }; //FUNKTION: Main, programmet startas. int main() { cout << "Osorterade familjen:" << endl; //Skapar en lista med personer i min familj och ger dom även deras ålder. Person familj[4]; familj[0].SetInfo("Andreas", 37); familj[0].SkrivUt(); familj[1].SetInfo("Pia", 39); familj[1].SkrivUt(); familj[2].SetInfo("Ella-My", 5); familj[2].SkrivUt(); familj[3].SetInfo("Emil", 3); familj[3].SkrivUt(); cout << "Sorterade familjen:" << endl; bubblesort(familj, 4); //Anropar funktionen bubblesort för att sortera vektorn Familj. //Den sorterade listan skrivs ut for (int i = 0; i < 4; i++) cout << familj[i].namn << ", " << familj[i].alder << endl; int index = linsok(familj, 4, 5); //Söker efter en viss person i vektorn Familj som innehåller 4 element och ska vara 5 år gammal //Skriv ut resultatet if (index == -1) cout << "Personen hittades ej!"; else cout << "Personen du s\x94ker heter " << familj[index].namn << " och finns p\x86 plats " << index << " i listan."; cin.get(); return 0; }

Trädvy Permalänk
Medlem
Registrerad
Nov 2006

Du byter bara plats på ålder, du vill nog byta plats på hela personobjektet?:

Typ: Person temp = p[j] istället för p[j].alder

Trädvy Permalänk
Medlem
Registrerad
Mar 2016
Skrivet av Kiane:

Du byter bara plats på ålder, du vill nog byta plats på hela personobjektet?:

Typ: Person temp = p[j] istället för p[j].alder

Ja, men titta! Så fort ungen här bredvid har somnat så ska jag testa det där. Kan det även förklara varför det har blivit en ny/till ålder också? 1 år istället för 39?

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Okt 2011
Skrivet av therdny:

Jag har hållit på nu ett tag med en uppgift jag har fått gällande C++. Jag tror att allt fungerar förutom koden för bubblesort.

Programmet körs, så jag har inga felmeddelanden. Men resultatet är inte vad jag önskar.

Här nedan kommer koden jag har. Och under koden även en bild av resultatet.

Resultatet jag vill ha är att först ska familjen skrivas ut, osorterad. Denna del fungerar som den ska. Sen skall bubblesort sortera familjen efter ålder och skriva ut den nya listan. Detta fungerar inte som det ska.

Sen skall, genom en sökning, en person som är 5 år gammal skrivas ut, samt på vilken plats denna personen finns i en sorterade listan. Även detta fungerar inte som det ska.

Skulle vara evigt tacksam om jag kunde få hjälp med detta.

Tack på förhand.

#include <iostream> #include <string> #include <vector> using namespace std; class Person { public: string namn; int alder; //METOD: Sätter den info som behövs. void SetInfo(string _namn, int _alder) { namn = _namn; alder = _alder; } //FUNKTION: Som anropas i vektorn Familj för att skriva ut namn & ålder. void SkrivUt () { cout << namn << ", " << alder << endl; } }; // Nedanstående funktion står med i uppgiften att man kan använda sig av. // Jag förstår dock inte hur. //void byt(Person &p, Person &q) //{ // Person temp; // temp.namn = p.namn; // temp.alder = p.alder; // p.namn = q.namn; // p.alder = q.alder; // q.namn = temp.namn; // q.alder = temp.alder; //} //FUNKTION: Sorteringsalgoritm void bubblesort(Person p[], int n) { int i = 0; //Den yttre loopen, går igenom hela listan. for (i = 0; i < n; i++) { //Den inre, går igenom element för element. int nrLeft = n - i; //För att se hur många som redan gåtts igenom for (int j = 0; j < nrLeft; j++) { if (p[j].alder > p[j + 1].alder) //Jämför elementen. { //Byt plats! int temp = p[j].alder; p[j].alder = p[j + 1].alder; p[j + 1].alder = temp; } } } } int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { for (int i = 0; i < n; i++) //Söker igenom hela array:n. { if (p[i].alder == a) //Om p[i] är lika med sökt värde så returneras i. { return i; } } return -1; //Annars returneras -1. }; //FUNKTION: Main, programmet startas. int main() { cout << "Osorterade familjen:" << endl; //Skapar en lista med personer i min familj och ger dom även deras ålder. Person familj[4]; familj[0].SetInfo("Andreas", 37); familj[0].SkrivUt(); familj[1].SetInfo("Pia", 39); familj[1].SkrivUt(); familj[2].SetInfo("Ella-My", 5); familj[2].SkrivUt(); familj[3].SetInfo("Emil", 3); familj[3].SkrivUt(); cout << "Sorterade familjen:" << endl; bubblesort(familj, 4); //Anropar funktionen bubblesort för att sortera vektorn Familj. //Den sorterade listan skrivs ut for (int i = 0; i < 4; i++) cout << familj[i].namn << ", " << familj[i].alder << endl; int index = linsok(familj, 4, 5); //Söker efter en viss person i vektorn Familj som innehåller 4 element och ska vara 5 år gammal //Skriv ut resultatet if (index == -1) cout << "Personen hittades ej!"; else cout << "Personen du s\x94ker heter " << familj[index].namn << " och finns p\x86 plats " << index << " i listan."; cin.get(); return 0; }

rdny.se/programmeringsfel.jpg

Säkert inte hela problemet, men var det inte personerna du skulle sortera. Just nu byter du bara plats på deras åldrar i din bubblesort. Så om det inte blivit något mer fel hade du fått ut:

Andreas 3
Pia 5
Ella-My 37
Emil 39

Och då Pia som yngst och nummer 1 i listan.

Corsair Vengeance LPX 2x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)