Trädvy Permalänk
Medlem
Registrerad
Apr 2017

Hjälp med C++ övning

Hej, behöver lite hjälp med en övning jag håller på med i C++, använder mig av Microsoft Visuals 2010.

Övningen jag gör handlar om att jag ska skapa en klass "Person" med två attribut, string namn och int alder.
jag ska också använda mig av funktionen void Skrivut() för att få ut namn och ålder på skärmen.
Ska också skriva en funktion för en linjär sökning samt en bubblesort för att sortera person vektorn efter ålder, yngst först.
sen skapa en main funktion där Programmet ska sedan sortera vektorn familj och skriva ut familjemedlemmarna i åldersordning med den yngsta först. Till sist ska funktionen linsok anropas och söka efter om någon familjemedlem har en viss ålder.

Har kommit en bit på vägen men får vissa error:
1. error C2601: 'byt' : local function definitions are illegal
2. this line contains a '{' which has not yet been matched
3. 'linsok' : function does not take 2 arguments

Skulle verkligen uppskatta lite hjälp från någon mer erfaren programmerare då jag är väldigt färsk i ämnet.

(vet ej hur man gör code-taggar..)

#include <iostream> #include <string> using namespace std; class Person // Klass: En persson { public: string namn; int alder; void SetInfo(string _namn, int _alder) // Metod: sätter den info som behövs { namn = _namn; alder = _alder; } void SkrivUt() { cout << namn << ", " << alder << "."; // Berättar vad som ska skrivas } }; int linsok(Person p[], int n, int a) // Linjär sökning av ålder på person { for (int i = 0; i < n; i++) // Gå igenom hela listan { if (p[i].alder == a) //Om p[i] är samma som det sökta värdet, returneras i. return i; } return -1; // Personen kan ej finnas, -1 returneras. }; void bubblesort(Person p[], int n) { int i = 0; int nrleft; for (int i = 0; i < n; i++) // En yttre loop går igenom hela listan int nrLeft = n - i; // Kollar hur många som redan gått igenom { for ( int j = 0; j < nrleft; j++) if (p[j].alder > p[j+1].alder) // Jämför elementen 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; } } }; int main() // Funktion: Main, start på programmet { Person myFamily[4]; myFamily[0].SetInfo("Simon", 37); myFamily[1].SetInfo("Lasse", 20); myFamily[2].SetInfo("Sara", 7); myFamily[3].SetInfo("Martin", 40); bubblesort(myFamily, sizeof(myFamily)); // Anropar funktionen bubblesort för att sortera myFamily[3] for (int i = 0; i < 3; i++) cout << myFamily[i].namn << ", " << myFamily[i].alder << " \x8Fr." << endl; // Vad som kommer att skrivas ut int index = linsok(myFamily, 37); // Söker efter en person i listan if (index == -1) cout << "Personen hittades ej!"; else cout << "Personen du s\x94ker heter " << myFamily[index].namn << " och finns på index " << index; system("pause"); return 0; }

La till code-taggar // mod
Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av BellaB:

1. error C2601: 'byt' : local function definitions are illegal

Du försöker definiera funktionen byt innuti funktionen bubblesort, men lokala funktioner är som felmeddelandet säger inte tillåtet i C++.

Skrivet av BellaB:

2. this line contains a '{' which has not yet been matched

Troligtvis kompilatorn som blir förvirrad av ovanstående fel. I C++ brukar det vara bäst att fixa det första felet som kompilatorn spottar ur sig, och sen kompilera om och se vad nästa fel blir.

Skrivet av BellaB:

3. 'linsok' : function does not take 2 arguments

Du försöker anropa linsok med två argument i main, men som felmeddelandet säger tar inte linsok två argument (den tar tre).

Skrivet av BellaB:

(vet ej hur man gör code-taggar..)

[​code]
Kod här
[​/​code]
blir:

Kod här

Det är för övrigt en dålig ovana att skriva for-loopar och if-satser utan {}, eftersom det då är lätt hänt att man gör misstag:

// if utan {} if (i > 0) // Om v är större än 0 i++; // Öka i med 1 // Senare kanske man även vill göra något mer med i: if (i > 0) i++; a[i]++; // Inkrementera också element i i arrayen a. Oops, denna kommer alltid köras eftersom den inte är en del av if-satsen.

Om du tycker att det blir för mycket tomrum i koden om du alltid använder {} så kan du alltid använda den populära stilen med att sätta { på samma rad:

if (i > 0) { i++; a[i]++; }

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002
Skrivet av BellaB:

(vet ej hur man gör code-taggar..)

Omge koden med [code] ... [/code]-taggar.

Skrivet av BellaB:

1. error C2601: 'byt' : local function definitions are illegal

Du kan inte nästla funktionsdefinitioner i C++, och eftersom att det här är en generell funktion för att swappa Person-objekt (snarare än en implementationsdetalj för bubblesort) så vore det lämpligt att bara lägga den utanför istället:

void byt(Person& a, Person& b); void bubblesort(Person p[], int n);

Skrivet av BellaB:

2. this line contains a '{' which has not yet been matched

Det är en del missförstånd i din bubblesort(), vill inte posta färdiga lösningar (men fråga gärna vidare! ) men försöker kommentera strukturen lite här för att se om det hjälper? Det är även onödigt svårt att följa din kod beroende på hur den indenterats, om den ser likadan ut i din editor som på forumet (man ser indragen om man citerar ditt inlägg) så var noga med indragen; kod läses fler gånger än den skrivs och välformaterad, lättläst kod hjälper både dig och andra som ska arbeta med (eller betygsätta) koden att undvika misstag.

void bubblesort(Person p[], int n) { int i; // Används aldrig (loopen deklarerar sin egen räknare) int nrleft; // Här deklarerar du variabeln nrleft // for (int i = 0; i < n; i++) // Sedan sätter du n gånger... int nrLeft = n - i; // En *ny* variabel nrLeft (stort L) till n - i // Den här loopen har ingen effekt, dels eftersom // att nrLeft alltid kommer sluta på n - (n - 1) // dels eftersom att nrLeft faller ur scope efteråt. // { // Här deklarerar du ett nytt block. // !! Det här blocket relaterar inte till loopen // ovan utan körs bara en gång. Se även mitt svar // här: #16786305 // for ( int j = 0; j < nrleft; j++) // Medans j är mindre än nrleft... // !! nrleft har aldrig initialiserats // if (p[j].alder > p[j+1].alder) // Om den ena är större än den andra... void byt(Person &p, Person &q) // Här är avsikten att swappa objekten, men istället { // *definieras* en ny funktion, och det är inte tillåtet. } // Är det en del av övningen att implementera en egen } // swap så gör det utanför bubblesort() och *anropa* } // funktionen härifrån (annars bör du använda std::swap).

Vad du söker är något åt det här hållet:

För varje element A i listan L: För varje element B i listan L: Om A > B: Byt plats på A och B

Skrivet av BellaB:

3. 'linsok' : function does not take 2 arguments

Funktionens signatur är int linsok(Person p[], int n, int a); den förväntar sig alltså en Person-array och två heltal (längd och ålder), men när du anropar den så får den bara två argument — en array och ett heltal.

Abstractions all the way down.

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

Fixade code-taggarna