Programmering 1- bubble sort- Hjälp!

Trädvy Permalänk
Medlem
Plats
Västkusten
Registrerad
Jul 2015

Programmering 1- bubble sort- Hjälp!

Suttit tre kvällar nu och försökt få koden att fungera men lyckas inte. Vänder mig nu till er!

Uppgift: Skapa två listor. En osorterad och en sorterad. Listorna ska innehålla fyra personen och tillslut listas i åldersordning med den yngsta först. En rad ska även skrivas ut som talar om var den sökta (förutbestämda) personen ligger på listan.

Problem: Jag får fram båda listorna. Dock så försvinner den äldsta personen i den sorterade listan. Och sista raden talar om var personen ligger i den osorterade listan, det ska vara i den sorterade!

Kod så här långt:

#include <iostream> #include <string> #include <vector> using namespace std; const int n = 3; class person // Klass: Innehåller en person { public: string name; int age; void print() { cout << name << ", " << age << " \x8Fr." << endl; // Talar om vad som ska skrivas ut } void setInfo(string _name, int _age) // Sätter den info som krävs { name = _name; age = _age; } }; void bubblesort(person p[], int n) { int i = 0; for (i = 0; i < n; i++) // Yttre loop söker igenom hela listan { int nrLeft = n - i; // Inre loop, element för element for (int j = 0; j < nrLeft; j++) { if (p[j].age> p[j + 1].age) // Jämför elementen { // Byter plats person temp = p[j]; p[j] = p[j + 1]; p[j + 1] = temp; } } } } int linsok(person p[], int n, int a) // Linjär sökning av ålder { for (int i = 0; i < n; i++) // Går igenom hela listan { if (p[i].age == a) // Hittar det vi söker efter eller... { return i; } } return -1; // ... så hittas inte personen }; int main() { //Skapar en lista med personer - namn/ ålder cout << "-- Osorterad lista --" << endl << endl; // Skriver ut titel person family[4]; family[0].setInfo("Vilfred", 5); // Person 1. Börja från 0! family[0].print(); // Anropar void print() family[1].setInfo("Finn", 7); family[1].print(); family[2].setInfo("Eliot", 9); family[2].print(); family[3].setInfo("Hjalmar", 3); family[3].print(); cout << endl << "-- Sorterad lista --" << endl << endl; // Skriver ut titel bubblesort(family, n); //Anropar funktionen bubblesort för att sortera vektorn Familj. for (int i = 0; i < n; i++) //Den sorterade listan skrivs ut cout << family[i].name << ", " << family[i].age << " \x8Fr." << endl; // Berättar vad som ska skrivas ut int index = linsok(family, 3, 5); //Söker efter en viss person i vektorn Familj som innehåller 4 element och ska vara 5 år gammal if (index == -1) cout << "Personen hittas ej!"; // Antingen hittas inte personen eller... else cout << endl << family[index].name << " finns p\x86 rad " << index << " i index."; // ... så hittar programmet personen och info skrivs ut. cin.get(); return 0; }

RESULTAT

Citat:

-- Osorterad lista --
Vilfred, 5 år.
Finn, 7 år.
Eliot, 9 år.
Hjalmar, 3 år.

-- Sorterad lista --
Hjalmar, 3 år.
Vilfred, 5 år.
Finn, 7 år.

Vilfred finns på rad 1 i index.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Skrivet av Karl Eliot:

Problem: Jag får fram båda listorna. Dock så försvinner den äldsta personen i den sorterade listan. Och sista raden talar om var personen ligger i den osorterade listan, det ska vara i den sorterade!

Kanske borde du skriva ut både den osorterade och den sorterade listan på samma sätt för att lättare kunna felsöka? Kanske är det bara den här definitionen som ställer till det:

Skrivet av Karl Eliot:

const int n = 3;

Hjälper det att öka till fyra?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Dec 2009

Index 1 är ju rätt svar då det är 0-räkning.
Du anropar linsok med 3 istället för 4 så du skriver bara ut 3 stycken.

/GC

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Maj 2009

for (int i = 0; i < n; i++)
du låter den söka där i 0,1,2. du skippar alltså 3an

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Trädvy Permalänk
Medlem
Registrerad
Maj 2012

Är du säker på att utskriften om vilken position är fel?
Kolla i din sökfunktion, vilken position börjar du med? Vilken är den "korrekta" startsiffran? Dvs, vilken siffra får du tillbaka för personen som är först?

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Västkusten
Registrerad
Jul 2015
Skrivet av Elgot:

Kanske borde du skriva ut både den osorterade och den sorterade listan på samma sätt för att lättare kunna felsöka? Kanske är det bara den här definitionen som ställer till det:
Hjälper det att öka till fyra?

Jag har haft n = 4 men då kommer inte någon i den sorterade listan upp.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Västkusten
Registrerad
Jul 2015
Skrivet av GeorgeCostanza:

Index 1 är ju rätt svar då det är 0-räkning.
Du anropar linsok med 3 istället för 4 så du skriver bara ut 3 stycken.

/GC

Skickades från m.sweclockers.com

När jag testar linsök 4 kommer ingen i den sorterade listan upp tyvärr.

Trädvy Permalänk
Medlem
Plats
Västkusten
Registrerad
Jul 2015

Eller fel av mig! Sitter på jobbet just nu så minns inte allt när jag använder n = 4 så ändras den äldsts personens ålder till 1.

[size="smaller"]Skickades från m.sweclockers.com[/size

Edit: Okej nu är jag hemma igen och jag hade visst rätt första påståendet
När jag ändrar n = 4 så dyker inte den sorterade listan upp.

Jag har löst det provisoriskt genom att ha kvar n = 3 och lägga till den fjärde personen manuellt:

bubblesort(family, n); //Anropar funktionen bubblesort för att sortera vektorn Familj. for (int i = 0; i < n; i++) //Den sorterade listan skrivs ut cout << family[i].name << ", " << family[i].age << " \x8Fr." << endl; cout << family[3].name << ", " << family[3].age << "\x8Fr." << endl << endl;

Utöver detta så blir fortfarande utskriften fel när den skall skriva ut var på listan personen är. Verkar som den utgår från den osorterade listan..

Även här har jag löst det provisoriskt men det skulle ju aldrig fungera om jag lät användare söka på egen hand

int index = linsok(family, 3, 7); if (index == -1) cout << "Personen hittas ej!"; else cout << endl << family[index].name << " finns p\x86 rad 3 i index.";

Sorry för flera poster!!!!

Tackar ödmjukast för er hjälp!

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Skrivet av Karl Eliot:

När jag ändrar n = 4 så dyker inte den sorterade listan upp.

Det är nog för att den n som du skickar in till bubblesort inte är samma n som du menar annars. I bubblesort verkar du titta på element n+1 i listan, så du bör nog skicka in n -1 istället.

Skrivet av Karl Eliot:

Utöver detta så blir fortfarande utskriften fel när den skall skriva ut var på listan personen är. Verkar som den utgår från den osorterade listan..

Nej, men index börjar som sagt på 0, så index 0 är rad 1, index 1 är rad två och så vidare. Addera ett om du vill ha "normala" radnummer.

Trädvy Permalänk
Medlem
Plats
Västkusten
Registrerad
Jul 2015
Skrivet av Elgot:

Det är nog för att den n som du skickar in till bubblesort inte är samma n som du menar annars. I bubblesort verkar du titta på element n+1 i listan, så du bör nog skicka in n -1 istället.
Nej, men index börjar som sagt på 0, så index 0 är rad 1, index 1 är rad två och så vidare. Addera ett om du vill ha "normala" radnummer.

Tack så jättemycket!!! Äntligen fungerar den! som jag har suttit och klurat i MÅNGA timmar !!