Trädvy Permalänk
Medlem
Registrerad
Jan 2017

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
Trädvy Permalänk
Medlem
Registrerad
Sep 2011

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.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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?

Trädvy Permalänk
Medlem
Registrerad
Sep 2011

@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.

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011

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?

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

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.

Trädvy Permalänk
Medlem
Registrerad
Jun 2003

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

Signatur raderad, se reglerna för mer info.

Trädvy Permalänk
Medlem
Registrerad
Feb 2016
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,

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

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

Trädvy Permalänk
Medlem
Registrerad
Mar 2013
Skrivet av gunnar_larsson_mandrake:

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

Pun intended?

MSI z170a SLI-Plus - i7 6700K @ 4,6GHz - MSI GTX 770 Gaming 4GB- 32GB HyperX Fury DDR4 2666Mhz - Fractal Design arc midi r2 - Kelvin S36

Trädvy Permalänk
Medlem
Plats
Kumla
Registrerad
Jul 2008

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...

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

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; }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

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.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

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; }

Trädvy Permalänk
Medlem
Registrerad
Jan 2017
Skrivet av mortelsson:

Pun intended?

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

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Apr 2008
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?

Trädvy Permalänk
Medlem
Registrerad
Jan 2017
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!