Permalänk
Medlem

c++ byta plats på två element

Hej.

Jag håller på att bli tokig!

Håller på med en uppgift som lyder:

"Skriv en funktion för linjär sökning i en vektor p med Person-objekt.
int linsok(Person p[], int n, int a)
Funktionen ska söka igenom vektorn p efter en person med åldern a och returnera index för den personen. Om ingen person hittas returneras -1. Variabeln n är antalet element i vektorn.
Skriv också en funktion som sorterar en Person-vektor efter ålder (yngst först).
void bubblesort(Person p[], int n)
Se pseudokoden för bubblesort och exempel 15.3 på sidan134 i kursboken. För att förenkla kodningen lite grann, använd gärna nedanstående funktion för att byta plats på två element

void byt(Person p, Person q)
{ Person temp;
temp.name = p.name;
temp.age = p.age;
p.name = q.name;
p.age = q.age;
q.name = temp.name;
q.age = temp.age;
}

Alltså vill uppgiften att jag skall sortera familjen efter ålder. Och när jag använder funktionen bubblesort så sorteras åldrarna i rätt ordning. Men jag vill att även namnet skall flyttas med åldern vilket funktionen "byt" skall göra men jag förstår inte hur jag skall använda den... Vore väldigt tacksam för hjälp!

postar min kod nedan:

#include <iostream> #include <string> using namespace std; class Person { public: string name; int age; public: setInfo(string _name, int _age) { name = _name; age = _age; } }; int linsok(Person p[], int n, int a) { for (int i = 0; i < n; i++) if (p[i].age == a) { return i; } return -1; } void bubblesort(Person p[], int n) { for (int i = 0; i < n; i++) { int nrLeft = n - i; for (int j = 0; j < nrLeft; j++) { if (p[j].age > p[j + 1].age) { int temp = p[j].age; p[j].age = p[j + 1].age; p[j + 1].age = temp; } } } } void byt(Person p, Person q) { Person temp; temp.name = p.name; temp.age = p.age; p.name = q.name; p.age = q.age; q.name = temp.name; q.age = temp.age; } int main() { Person familj[4]; familj[0].setInfo("Anna", 55); familj[1].setInfo("Sofia", 22); familj[2].setInfo("Anders", 56); familj[3].setInfo("Erik", 12); cout << "Ange vilken ålder du söker efter: " << endl; int ageSerch; cin >> ageSerch; int index = linsok(familj, 4, ageSerch); if (index == -1) cout << "Personen hittades ej!"; else cout << "Personen du s\x94ker heter " << familj[index].name << " och finns p\x86 index " << index << " i listan." << endl; for (int i = 0; i < 4; i++) cout << familj[i].name << " " << familj[i].age << endl; cout << "Sorterat efter ålder" << endl; bubblesort(familj, 4); for (int i = 0; i < 4; i++) cout << familj[i].name << " " << familj[i].age << endl; byt(familj,4); // Här försöker jag anropa funktionen byt men får error: could not convert '(person*)(& familj)' from 'Person to 'Person' }

Permalänk
Medlem

Lägg in koden här på sweclockers i [code-tagg]. Då kommer folk kunna läsa betydligt enklare.

Permalänk
Medlem

@Forsgren: Pinsam fråga, men hur gör jag det?! ;P

Permalänk
Medlem

[code]
Din kod här
[/code]
Blir:

Din kod här

Skickades från m.sweclockers.com

Permalänk

void bubblesort(Person p[], int n) { for (int i = 0; i < n; i++) { int nrLeft = n - i; for (int j = 0; j < nrLeft; j++) { if (p[j].age > p[j + 1].age) { int temp = p[j].age; p[j].age = p[j + 1].age; p[j + 1].age = temp; } } } }

I den innersta if-satsen vill du byta ut det du har, dvs ett manuellt byte, till att använda byt-funktionen.

void bubblesort(Person p[], int n) { for (int i = 0; i < n; i++) { int nrLeft = n - i; for (int j = 0; j < nrLeft; j++) { if (p[j].age > p[j + 1].age) { byt(p[i], p[j]); } } } }

Permalänk
Hedersmedlem

Om jag inte missar något så kommer funktionen byt() inte fungera; är det läraren som skrivit den?
Vad jag kan se så tar den två kopior som argument, meckar lite med kopiorna, och sen är den klar... men den ändrar ingenting på argumenten man ger till den.

Om du istället har "void byt(Person &p, Person &q)" så bör den fungera (men den är fortfarande konstigt kodad). Om ni inte har lärt er om referenser ännu så kanske han/hon inte gillar det.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

I övrigt så tror jag du har missuppfattat uppgiften en aning. Bubblesort funktionen ska sortera personerns efter ålder. Nu ger du personerna en ny ålder (så person 1 har lägst ålder, person 2 näst lägst osv). Istället för att enast byta åldern bör du nog byta plats på hela objektet.

Edit: kom in lite svar emellan som gav samma råd ser det ut som

Skickades från m.sweclockers.com

Permalänk
Medlem

@Maldergho: Jag fick det nästan att fungera tack vara din hjälp, dock hamnar erik 12 längst ned i listan.

Permalänk
Medlem

@Thomas:

ja det är läraren som har skrivit den. Men såg att jag hade råkat ta bort & tecknen.

Permalänk
Medlem

@noyce:

Ja det är just det jag är ute efter att byta hela objektet och inte bara ålder. Det är där jag kört fast!
Dom exemplen i boken handlar bara om att byta plats på tal, och inte hela objekt.
Tyckte denna delen va rätt klurig.. Och lite synd att dom inte har bra exempel i läroboken.

Permalänk
Medlem
Skrivet av Apa33:

@noyce:

Ja det är just det jag är ute efter att byta hela objektet och inte bara ålder. Det är där jag kört fast!
Dom exemplen i boken handlar bara om att byta plats på tal, och inte hela objekt.
Tyckte denna delen va rätt klurig.. Och lite synd att dom inte har bra exempel i läroboken.

Byggstenarna finns redan för det i koden.

Exempelvis kan

void byt(Person p, Person q) { Person temp; temp.name = p.name; temp.age = p.age; p.name = q.name; p.age = q.age; q.name = temp.name; q.age = temp.age; }

skrivas om till

void byt(Person p, Person q) { Person temp; temp = p; p = q; q = p; }

I detta fallet gör det inte direkt någon större skillnad dock, förutsatt att du faktiskt använder byt funktionen.

Edit: Förövrigt är det väl ändå en array och inte en vektor i detta exempel? Terminologi kan vara bra att hålla koll på.

Permalänk
Medlem

@SanyaIV: Det skall vara en vektor jag skall ha.

Jag har nästan fått programmet att fungera, dock hamnar "Erik 13" längst ned på listan men han skall hamna längst upp då han är yngst.. Förstår inte vad som är fel.

Bifogar min nya kod

#include <iostream> #include <string> using namespace std; class Person { public: string name; int age; public: int setInfo(string _name, int _age) { name = _name; age = _age; } }; int linsok(Person p[], int n, int a) { for (int i = 0; i < n; i++) if (p[i].age == a) { return i; } return -1; } void byt(Person &p, Person &q) { Person temp; temp.name = p.name; temp.age = p.age; p.name = q.name; p.age = q.age; q.name = temp.name; q.age = temp.age; } void bubblesort(Person p[], int n) { for (int i = 0; i < n; i++) { int nrLeft = n - i; for (int j = 0; j < nrLeft; j++) { if (p[j].age > p[j + 1].age) { byt(p[i], p[j]); } } } } int main() { Person familj[4]; familj[0].setInfo("Anna", 55); familj[1].setInfo("Sofia", 10); familj[2].setInfo("Anders", 54); familj[3].setInfo("Erik", 13); cout << "Ange vilken ålder du söker efter: " << endl; int ageSerch; cin >> ageSerch; int index = linsok(familj, 4, ageSerch); if (index == -1) cout << "Personen hittades ej!" << endl; else cout << "Personen du s\x94ker heter " << familj[index].name << " och finns p\x86 index " << index << " i listan." << endl; for (int i = 0; i < 4; i++) cout << familj[i].name << " " << familj[i].age << endl; cout << "Sorterat efter ålder" << endl; bubblesort(familj, 4); for (int i = 0; i < 4; i++) cout << familj[i].name << " " << familj[i].age << endl; }

Permalänk
Medlem

I din bubblesort så jämför du två personer och kollar om den ena är äldre. När den är det så byter du dock plats på två andra personer.

Permalänk
Medlem

Är det någon som använt Bubblesort etc. sen man tvingades genomlida den typen av uppgifter i skolan? Förvånad att man fortfarande lär ut sånt, men kanske lärarna inte varit så mkt i verkligheten själva

Permalänk
Medlem
Skrivet av improwise:

Är det någon som använt Bubblesort etc. sen man tvingades genomlida den typen av uppgifter i skolan? Förvånad att man fortfarande lär ut sånt, men kanske lärarna inte varit så mkt i verkligheten själva

Det har hänt någon gång men varje gång så får man ju googla på hur man gör

Permalänk
Hedersmedlem
Skrivet av improwise:

Är det någon som använt Bubblesort etc. sen man tvingades genomlida den typen av uppgifter i skolan? Förvånad att man fortfarande lär ut sånt, men kanske lärarna inte varit så mkt i verkligheten själva

Den lärs ut just för att den är klurig och man behöver tänka. Den är extremt ineffektiv och bör aldrig användas, den har inga fördelar direkt. Det är enklare och mer intuitivt att köra till exempel insertion sort eller selection sort.

Permalänk
Skrivet av Shimonu:

Den lärs ut just för att den är klurig och man behöver tänka. Den är extremt ineffektiv och bör aldrig användas, den har inga fördelar direkt. Det är enklare och mer intuitivt att köra till exempel insertion sort eller selection sort.

Jag skulle inte säga att den är klurig direkt, utan så som jag förstått det så används ofta Bubble Sort i utbildningssammanhang eftersom det är den som flest nybörjare kan förstå, och det är dessutom den algoritm som de allra flesta kommer på som en första naiv lösning när man ska sortera saker för första gången. Med det sagt håller jag absolut med om att den inte har några praktiska fördelar och aldrig bör användas i några som helst verkliga sammanhang.