Permalänk

Fast i C++

Har kört fast i en C++ uppgift och behöver lite pointers Programmet ska göra en sökning i en funktion och retunera index om värdet finns. Övningen måste innehålla metod och klass. Programmet är fullt körbart som det är men det retunerar endast -1, alltså att sökningen inte hittar värdet. Kan inte se någon anledning till att det inte gör det... Några förslag? Tacksam för hjälp. Har ni lösning får ni gärna hinta åt lösningen och låta mig försöka fixa själv hehe...

#include <iostream> using namespace std; class Person { public: int age; void Info(int _age) { age = _age; } }; int linsearch(Person* p, int key) { for(int i = 0; i < 5; i++) { if(p[i].age == key) { return i; } return -1; //RETUNERAS OM VÄRDET EJ HITTAS } } int main() { Person p[4]; p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); int key = 33; int index = linsearch(p, key); if(index == -1) cout << "Finns ej"; else cout << "YaY" << index; return 0; }

la till code-taggar
Permalänk

Det är svårt att se med den oformaterade koden, men har du inte lagt return -1 för långt in? D.v.s inne i for-loopen. Så redan vid första iterationen när du inte träffar på if(p[i].age == key) så exekveras return -1. For-loopen kör därför bara en gång och du kollar bara p[0].
Prova att flytta ut return -1 till efter loopen.

Permalänk

@OlleDenStore: Oh my gosh! Det VAR det som ställde till det! Jag är helt blind för min egen kod. Tack, tack, tack för snabbt och bra svar.

Oh, hur lägger jag upp kod så det ser bättre ut i forumet?

Permalänk

@gunnar_larsson_mandrake: Så bra att jag kunde hjälpa till
När det gäller kod i forumet så finns det säkert någon code-tagg man kan använda. Har aldrig gjort det själv dock.

Permalänk
Medlem

Du använder code taggarna [code] [/code]

Då blir det såhär:

#include <iostream> using namespace std; class Person { public: int age; void Info(int _age) { age = _age; } }; int linsearch(Person* p, int key) { for(int i = 0; i < 5; i++) { if(p[i].age == key) { return i; } return -1; //RETUNERAS OM VÄRDET EJ HITTAS } } int main() { Person p[4]; p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); int key = 33; int index = linsearch(p, key); if(index == -1) { cout << "Finns ej"; } else { cout << "YaY" << index; } return 0; }

MVH

Skrivet av gunnar_larsson_mandrake:

@OlleDenStore: Oh my gosh! Det VAR det som ställde till det! Jag är helt blind för min egen kod. Tack, tack, tack för snabbt och bra svar.

Oh, hur lägger jag upp kod så det ser bättre ut i forumet?

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem

Test med code:

#include <iostream> using namespace std; class Person { public: int age; void Info(int _age) { age = _age; } }; int linsearch(Person* p, int key) { for(int i = 0; i < 5; i++) { if(p[i].age == key) { return i; } return -1; //RETUNERAS OM VÄRDET EJ HITTAS } } int main() { Person p[4]; p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); int key = 33; int index = linsearch(p, key); if(index == -1) cout << "Finns ej"; else cout << "YaY" << index; return 0; }

Fulat om indenteringen:

#include <iostream> using namespace std; class Person { public: int age; void Info (int _age) { age = _age; } }; int linsearch (Person* p, int key) { for (int i = 0; i < 5; i++) { if (p[i].age == key) return i; return -1; //RETUNERAS OM VÄRDET EJ HITTAS } } int main() { Person p[4]; p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); int key = 33; int index = linsearch(p, key); if (index == -1) cout << "Finns ej"; else cout << "YaY" << index; return 0; }

Det är ju lättare att se matchande par måsvingar så som du har gjort men det tar ju mer plats.

Permalänk
Medlem

Men det är ju en inbyggd funktion som man bör använda.

Permalänk
Medlem
Skrivet av SexMachine:

Men det är ju en inbyggd funktion som man bör använda.

Fast många som studerar har krav att de inte får använda inbyggda funktioner för de ska lära sig själva. T.ex finns det ur bra verktyg för att skapa en länkad lista, men vi fick inte använda det för att förstå hur en sådan fungerar.

mvh,

Permalänk
Hedersmedlem

Fixade även code-taggar i första inlägget.

Permalänk
Skrivet av gunnar_larsson_mandrake:

Har kört fast i en C++ uppgift och behöver lite pointers

Pun intended?

Visa signatur

MSI z170a SLI-Plus - i7 6700K @ 4,6GHz - RTX 2060 - 32GB HyperX Fury DDR4 2666Mhz - Fractal Design arc midi r2 - Noctua UH-14S

Permalänk
Avstängd

Nu är det väl inte så bra att använda fasta värden så här i funktioner... här loopar du ända upp till att i blir fyra (det vill säga fem element)... är det så bra när du sedan dimensionerar arrayen till bara fyra element?

for (int i = 0; i < 5; i++)

Person p[4];

Nu tilldelar du ju inte något där men du kan ju få felaktig svar från funktionen då du inte har någon koll på vad som finns i det icke existerande elementet...

Permalänk

FORTSÄTTNING PÅ MIN UPPGIFT:
Tack för alla svar!
Nästa steg är att sortera listan med Bubbel!
Programmet är körbart (och listan sorteras, men osäker om det är helt som det ska), fast jag lyckas inte anropa funktionen i main. Vill skriva ut en lista så jag kan se att den är sorterad rätt. I övrigt, ser bubbelfunktionen rätt ut? Känns som att jag borde ha med objekt? Alltså p[j].age eller?

#include <iostream> using namespace std; class Person //KLASS. DEFINIERAR KLASS DÄR VARIABLER KLUMPAS IHOP SOM HÖR IHOP. { public: int age; //ÅLDER FÖR KLASSEN PERSON //METOD; void Info(int _age) { age = _age; } //BUBBELSORTERING void bubbelfunc(Person* p[], int max = 10) { for(int i = 0; i < 10; i++) { int siffrorkvar = max - i; for(int j = 0; j < siffrorkvar; j++) //LOOP KÖRS SÅ TILLS INDEX MÖTS SÅ INDEX EJ GÅR OM VARANDRA { if(p[j] > p[j + 1]) { Person* temp; temp = p[j]; p[j] = p[j+1]; p[j+1] = temp; for(int i = 0; i < 5; i++) { cout << p[i]; } return; } } } } }; //LINJÄR SÖKNING AV LISTAN. int linsearch(Person* p, int key, int n = 10) { for(int i = 0; i < n; i++) //LOOPAR INDEXVÄRDE FRÅN 0 TILL N { if(p[i].age == key) //OM INDEXVÄRDET I VEKTOR-OBJEKTS-LISTANS VÄRDE ÅLDER ÄR SAMMA SOM KEY... { return i; //RETUNERAR NUVARANDE INDEXVÄRDE } } return -1; //RETUNERAS OM VÄRDET EJ HITTAS } int main() { Person p[10]; //SKAPA VEKTOR-OBJEKT AV KLASS bubbelfunc(); //INTE DEN BLEKASTE HUR DENNA SKA ANROPAS ELLER SKRIVAS UT. HAR PROVAT ALLT. p[0].Info(19); //VÄRDE PÅ VARJE INDEX. LÄMNAS GENOM METOD INFO, EN DEL AV KLASSEN. p[1].Info(33); //ÖVERSÄTTS I FUL-PSUEDO TILL: INDEXVÄRDET 1 AV VEKTOR-OBJEKT P, GENOM METODEN INFO ÄR 33 p[2].Info(25); p[3].Info(47); p[4].Info(24); p[5].Info(94); p[6].Info(73); p[7].Info(53); p[8].Info(66); p[9].Info(49); int key = 94; int index = linsearch(p, key); //SKAPA VARIABEL AV FUNKTION MED INDATA VEKTOR-OBJEKT OCH 25 (KEY) if(index == -1) //OM VÄRDET EJ FINNS SKRIV... cout << "No result."; else cout << "Age " << key << " is on index " << index; return 0; }

Permalänk
Medlem

Du har flera problem med din bubbelfunc. För det första så har du definierat den som

void bubbelfunc(Person* p[], int max = 10)

Person* p[] är en array av pekare till instanser av Person, vilket troligtvis inte är vad du ville ha. Om du tar bort * eller [] så kan du skicka in din array som du skapar i main.

Det andra problemet du har är att du deklarerat bubbelfunc som en instans-metod i Person. För att anropa bubbelfunc så måste du då ha ett objekt som du kan anropa metoden från. Återigen, troligtvis inte vad du ville. Om du vill ha funktionen som en metod i Person så kan du göra den till en klass-metod genom att deklarera den som static:

class Person { public: static bubbelfunc(Person p[], int max = 10) { ... } }; int main() { Person p[10]; Person::bubbelfunc(p, 10); // <- Notera Person:: framför. }

Ett annat alternativ är ju att bara flytta ut den utanför klassen och ha den som en vanlig funktion.

Sen är ju såna här arrayer en gammal kvarleva från C och bör undvikas i modern C++, eftersom de är felbenägna och krångliga att använda. I din bubbelfunc så använder du t.ex. 10 i den första for-loopen istället för storleken du skickar in till funktionen, så om du ändrar storleken på arrayen så får du odefinierat beteende. I modern C++ finns det bättre alternativ, t.ex. std::array eller std::vector. Du kanske inte har kommit så långt än, men det kan vara bra att känna till i alla fall.

Permalänk

Tack Perost! Har städat upp lite enligt anvisningar. Går att köra nu och tillkalla i main, men utskriften blir fel. Sorteringen kan inte fungera. Försöker hitta felet, men det måste ju ligga i bubbelfunc...

#include <iostream> using namespace std; class Person { public: int age; void Info(int _age) { age = _age; } static bubbelfunc(Person p[], int m = 10) { for(int i = 0; i < m; i++) { int siffrorkvar = m - i; for(int j = 0; j < siffrorkvar; j++) { if(p[j].age > p[j + 1].age) { int temp; temp = p[j].age; p[j].age = p[j+1].age; p[j+1].age = temp; } } } for(int i = 0; i < 10; i++) { cout << p[i].age << " " << "\n"; } } }; int linsearch(Person p[], int key, int n = 10) { for(int i = 0; i < n; i++) { if(p[i].age == key) { return i; } } return -1; } int main() { Person p[10]; Person::bubbelfunc(p, 10); p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); p[4].Info(24); p[5].Info(94); p[6].Info(73); p[7].Info(53); p[8].Info(66); p[9].Info(49); int key = 49; int index = linsearch(p, key); if(index == -1) cout << "No result."; else cout << "Age " << key << " is on index " << index; return 0; }

Permalänk
Skrivet av mortelsson:

Pun intended?

Haha, ja fast jag såg det efteråt
Så, nä

Permalänk
Medlem
Skrivet av gunnar_larsson_mandrake:

Tack Perost! Har städat upp lite enligt anvisningar. Går att köra nu och tillkalla i main, men utskriften blir fel. Sorteringen kan inte fungera. Försöker hitta felet, men det måste ju ligga i bubbelfunc...

#include <iostream> using namespace std; class Person { public: int age; void Info(int _age) { age = _age; } static bubbelfunc(Person p[], int m = 10) { for(int i = 0; i < m; i++) { int siffrorkvar = m - i; for(int j = 0; j < siffrorkvar; j++) { if(p[j].age > p[j + 1].age) { int temp; temp = p[j].age; p[j].age = p[j+1].age; p[j+1].age = temp; } } } for(int i = 0; i < 10; i++) { cout << p[i].age << " " << "\n"; } } }; int linsearch(Person p[], int key, int n = 10) { for(int i = 0; i < n; i++) { if(p[i].age == key) { return i; } } return -1; } int main() { Person p[10]; Person::bubbelfunc(p, 10); p[0].Info(19); p[1].Info(33); p[2].Info(25); p[3].Info(47); p[4].Info(24); p[5].Info(94); p[6].Info(73); p[7].Info(53); p[8].Info(66); p[9].Info(49); int key = 49; int index = linsearch(p, key); if(index == -1) cout << "No result."; else cout << "Age " << key << " is on index " << index; return 0; }

Det största felet är nog att du försöker sortera personerna efter ålder innan du har initierat deras ålder Dessutom är uträkningen av siffrorkvar felaktig, tänk dig att m = 1 och i = 0, vad förväntar du dig att siffrorkvar ska bli då och vad blir den idag?

Permalänk
Skrivet av lntg:

Det största felet är nog att du försöker sortera personerna efter ålder innan du har initierat deras ålder Dessutom är uträkningen av siffrorkvar felaktig, tänk dig att m = 1 och i = 0, vad förväntar du dig att siffrorkvar ska bli då och vad blir den idag?

Ah! Du hade helt rätt! Jag fick rätt på det nu så allt funkar. Jag ändrade plats på när bubbelfunc skulle anropas. La den efter objekten. That's it! Tack för input!