Vinnaren i pepparkakshustävlingen!
2017-08-13, 17:28
  #1
Medlem
Hej, jag håller på med en sista uppgift för Programmering 1 och vill gärna få A på den. Så lämnat in en (vad jag tror är en) B-uppgift och håller på med A-uppgiften som handlar om något jag inte fått lära mig än. Alltså 1: Att en klass hämtar något från en annan klass. Och 2: Vad heter den arrayen (inte vector) sen efter det? Alltså vanligtvis så skulle jag kalla den (i bubblesort t.ex) hs[1].getName eller hs[1].getPoints. Är det samma här? Här kommer den exakta uppgiften och sen min kod.

"Du ska dela upp projektet i en .cpp-fil och en h-fil. (Tänkte ta och lära mig det här sist efter jag skrivit all kod, om det inte behövs innan.)

Egentligen behöver du konstruera två klasser:

1: En (mycket liten) klass som innehåller egenskaperna namn och poäng. Klassen ska också innehålla en konstruktor. Klassen ska heta HSItem (som i High Score item).

2: Själva klassen HighScore och kommer innehålla många metoder.

Klassen HighScore ska innehålla följande synliga (public) metoder):

HighScore() -
Beskrivning: Konstruktor för klassen. Tar emot ett heltalsvärde för hur många som får finnas i highscore-listan åt gången.
Indata: int maxIntList

Add() - ska överlagras (dunno what that means)
Beskrivning: Lägger till element i listan.
Indata: string name, int points


Print() -
Beskrivning: Denna skriver ut hela listan (ska vara sorterad när den skrivs ut, så antar att den också kallar Sort() först)

Klassen ska också innehålla följande osynliga (private) metod:
Sort() -
Beskrivning: Sorterar listan. Användaren ska aldrig behöva kalla sorteringsmetoden.

Koden i main som ska funka med klasserna och deras metoder.

HighScore hs(5);

hs.Add("JamesTKirk", 132);
hs.Add("AgentMulder", 120);
hs.Add("CaptainPicard", 40);
hs.Add("BobbaFett", 180);
hs.Add("RichDeckard", 110);

hs.Print();

hs.Add("Hal9000", 403);
hs.Add("DavidBowman", 445)

hs.Print(); "


Min kod som har kommenterat bort sort för jag tänkte att jag kanske kan lösa den biten själv när jag fattar allt annat. Har kommenterat lite också. Själva problemet jag har är hur HighScore(), Print() och Add() ska interagera med HighScore hs(5) i main och klassen HSItem. Och har absolut ingen aning vad jag ska mata in i HighScore och vartifrån. Hade det varit en vektor så skulle väll hs.size() funka. Försökte få HighScore att ärva HSItem, men det sket sig också såklart lol.

KOD:

Kod:
#include <iostream>
#include <string>


using namespace std;

class 
HSItem
{
public:
    
string name;
    
int points;

    
HSItem(string _nameint _points)
    {
        
name _name;
        
points _points;
    }

    
stringgetName()
    {
        return 
name;
    }

    
int getPoints()
    {
        return 
points;
    }

};

class 
HighScore: public HSItem //Skapar problem i main (HighScore hs[5], ska ärva HSItems saker tänkte jag.
{
public:
    
HighScore(int maxInList//Ingen aning
    
{

    }



    
Add() //?
    
{
    
//string getName; ?
    //int getPoints;  ?
    //maxInList ++    ?
    
}

    Print() 
//?
    
{
    
//    Sort();
    //    if (int i = 0; i < maxInList; i++)
    //    {
    //       cout << hs[i] << endl;
    //    }


    
}

private:
//    void Sort(HighScore hs[])
//    {
//        HighScore.Add() temp ("",0); //deklarera den pemporära objektet temp endast en gång före loopen
 //       for (int i = 0; i < 4; i++)
 //       {
  //          int nrLeft = 4 - i;
//
  //          for (int j = 0; j < nrLeft; j++)
  //          {
  //              if (hs[j].getPoints() > hs[j+1].getPoints())
  //              {
   //             temp = hs[j];
  //              hs[j] = hs[j+1];
   //             hs[j+1] = temp;
  //                 }
  //          }
  //      }
  // }



};








int main()
{

    
HighScore hs(5);

    
hs.Add("JamesTKirk"132);
    
hs.Add("AgentMulder"120);
    
hs.Add("CaptainPicard"40);
    
hs.Add("BobbaFett"180);
    
hs.Add("RichDeckard"110);

    
hs.Print();

    
hs.Add("Hal9000"403);
    
hs.Add("DavidBowman"445)

    
hs.Print();




    return 
0;

__________________
Senast redigerad av gholiat 2017-08-13 kl. 17:31.
Citera
2017-08-13, 20:30
  #2
Medlem
Citat:
Ursprungligen postat av gholiat
Hej, jag håller på med en sista uppgift för Programmering 1 och vill gärna få A på den. Så lämnat in en (vad jag tror är en) B-uppgift och håller på med A-uppgiften som handlar om något jag inte fått lära mig än. Alltså 1: Att en klass hämtar något från en annan klass. Och 2: Vad heter den arrayen (inte vector) sen efter det? Alltså vanligtvis så skulle jag kalla den (i bubblesort t.ex) hs[1].getName eller hs[1].getPoints. Är det samma här? Här kommer den exakta uppgiften och sen min kod.

"Du ska dela upp projektet i en .cpp-fil och en h-fil. (Tänkte ta och lära mig det här sist efter jag skrivit all kod, om det inte behövs innan.)

Egentligen behöver du konstruera två klasser:

1: En (mycket liten) klass som innehåller egenskaperna namn och poäng. Klassen ska också innehålla en konstruktor. Klassen ska heta HSItem (som i High Score item).

2: Själva klassen HighScore och kommer innehålla många metoder.

Klassen HighScore ska innehålla följande synliga (public) metoder):

HighScore() -
Beskrivning: Konstruktor för klassen. Tar emot ett heltalsvärde för hur många som får finnas i highscore-listan åt gången.
Indata: int maxIntList

Add() - ska överlagras (dunno what that means)
Beskrivning: Lägger till element i listan.
Indata: string name, int points


Print() -
Beskrivning: Denna skriver ut hela listan (ska vara sorterad när den skrivs ut, så antar att den också kallar Sort() först)

Klassen ska också innehålla följande osynliga (private) metod:
Sort() -
Beskrivning: Sorterar listan. Användaren ska aldrig behöva kalla sorteringsmetoden.

Koden i main som ska funka med klasserna och deras metoder.

HighScore hs(5);

hs.Add("JamesTKirk", 132);
hs.Add("AgentMulder", 120);
hs.Add("CaptainPicard", 40);
hs.Add("BobbaFett", 180);
hs.Add("RichDeckard", 110);

hs.Print();

hs.Add("Hal9000", 403);
hs.Add("DavidBowman", 445)

hs.Print(); "


Min kod som har kommenterat bort sort för jag tänkte att jag kanske kan lösa den biten själv när jag fattar allt annat. Har kommenterat lite också. Själva problemet jag har är hur HighScore(), Print() och Add() ska interagera med HighScore hs(5) i main och klassen HSItem. Och har absolut ingen aning vad jag ska mata in i HighScore och vartifrån. Hade det varit en vektor så skulle väll hs.size() funka. Försökte få HighScore att ärva HSItem, men det sket sig också såklart lol.

KOD:

Kod:
#include <iostream>
#include <string>


using namespace std;

class 
HSItem
{
public:
    
string name;
    
int points;

    
HSItem(string _nameint _points)
    {
        
name _name;
        
points _points;
    }

    
stringgetName()
    {
        return 
name;
    }

    
int getPoints()
    {
        return 
points;
    }

};

class 
HighScore: public HSItem //Skapar problem i main (HighScore hs[5], ska ärva HSItems saker tänkte jag.
{
public:
    
HighScore(int maxInList//Ingen aning
    
{

    }



    
Add() //?
    
{
    
//string getName; ?
    //int getPoints;  ?
    //maxInList ++    ?
    
}

    Print() 
//?
    
{
    
//    Sort();
    //    if (int i = 0; i < maxInList; i++)
    //    {
    //       cout << hs[i] << endl;
    //    }


    
}

private:
//    void Sort(HighScore hs[])
//    {
//        HighScore.Add() temp ("",0); //deklarera den pemporära objektet temp endast en gång före loopen
 //       for (int i = 0; i < 4; i++)
 //       {
  //          int nrLeft = 4 - i;
//
  //          for (int j = 0; j < nrLeft; j++)
  //          {
  //              if (hs[j].getPoints() > hs[j+1].getPoints())
  //              {
   //             temp = hs[j];
  //              hs[j] = hs[j+1];
   //             hs[j+1] = temp;
  //                 }
  //          }
  //      }
  // }



};








int main()
{

    
HighScore hs(5);

    
hs.Add("JamesTKirk"132);
    
hs.Add("AgentMulder"120);
    
hs.Add("CaptainPicard"40);
    
hs.Add("BobbaFett"180);
    
hs.Add("RichDeckard"110);

    
hs.Print();

    
hs.Add("Hal9000"403);
    
hs.Add("DavidBowman"445)

    
hs.Print();




    return 
0;


1. Byt namn på classen till HighScoreItem, säg till läraren att han bör lära sig hur man namnger klasser på ett bra sätt.

2. Varför ska HighScore ärva från HighScoreItem? Det ska du bara göra ifall du vill att ClassB ska vara en fortsättning på ClassA och innehålla samma variabler och funktioner, som sedan kan överlagras i ClassB. HighScoreItem är endast en klass som ska innehålla två värden, alltså kan t.o.m. vara en struct då den inte ska behandla informationen på något sätt.

3. Eftersom läraren använder ordet lista är det kanske en lista du ska använda, och inte en array? En lista har en egen sorteringsfunktion så man behöver inte implementera någon själv, t.ex. bubble (dock behöver man ifall jag kommer ihåg rätt, definiera en egen sortering ifall man har egna object?).
http://www.cplusplus.com/reference/list/list/

Kolla gärna med läraren först dock, annars ifall du ska använda en array så behöver du ju veta hur många highscores som ligger i listan redan för att lägga till en ny efter. (I en lista behöver du bara köra push / pop för att lägga till först/sist.)

4. Tror också att listan ska sorteras i Print() funktionen, att sortera den efter varje gång man lägger till ett värde är onödigt då det inte spelar någon som helst roll för användaren, blir onödiga funktionsanrop.

5. Det du ska göra är att skapa nya object av klassen HighScoreItem, och lägga in dessa i listan.

T.ex.
HighScoreItem highScoreItem("Pelle", 42);

Ett nytt object har skapats, konstructorn kräver en string och en int som vi gett med.
Sedan kan vi lägga till detta i listan.

highScoreList.push_back(highScoreItem);

Lägger till i slutet av listan.
Sedan är det bara att göra så varje gång i Add(), bara se till så att längen av listan inte går över maxInList.

6. Du kan inte använda hs[3], eftersom hs är ett object av klassen HighScore, och inte en array. Däremot kan du göra så ifall du befinner dig i Print() funktionen i HighScore, och listan heter hs.

Går att använda en enkel loop för att skriva ut allt.

for (auto highScoreItem : highScoreList){
// skriv ut highScoreItem.getName() och highScoreItem.getScore() här t.ex.
}

7. När jag lärde mig c++ back in the days kunde varken boken eller läraren förklara vad en .h fil var av någon anledning. För att förstå det enklare behövs det att du förstår hur man kan deklarerar och definiera funktioner på olika ställen. Du deklareraren klass i en .h fil, med alla dess variabler och funktioner, men du definierar, bestämmer vad de ska göra, i .cpp filen. Det går dock att deklarera i .h filen också, men man bör hålla de åtskillda för att underlätta när man läser koden.

Kod:
.h
class HighScore
{
public:
	HighScore(int _maxinList) : maxInList(_maxinList) {}
	void Add(string _name, int _points);

private:
	int maxInList;
	void Sort();
};
Kod:
.cpp
#include "HighScore.h"
void HighScore::Add(string _name, int _points)
{
	// Add stuff
}

void HighScore::Sort()
{
	// Do sort stuff
}

Detta underlättar när man ska förstå vad en klass innehåller, men det löser också problemet med att alla variabler och funktioner måste vara definierade innan de används, alltså måste finnas tidigare i koden. Det som händer när man skriver #include "HighScore.h" är att all kod i .h filen läggs till ovanpå när programmet sedan kompileras.

Så det är bra att börja skriva på detta sätt nu, och inte när du är klar med allt. :P

Ehm, tror jag fick med det mesta, blev mycket text att hålla reda på.
Citera
2017-08-14, 10:03
  #3
Medlem
MCHapss avatar
Citat:
Ursprungligen postat av Gottisborgen
...
Det kanske en lista du ska använda, och inte en array? En lista har en egen sorteringsfunktion så man behöver inte implementera någon själv, t.ex. bubble (dock behöver man ifall jag kommer ihåg rätt, definiera en egen sortering ifall man har egna object?).
http://www.cplusplus.com/reference/list/list/
...
Nä, bara ett sätt att jämföra innehållet i STL-containern genom att till exempel överlagra <-operatorn, bidra med en egen comparator eller en lambda-funktion.
Citat:
Ursprungligen postat av gholiat
...Alltså 1: Att en klass hämtar något från en annan klass. Och 2: Vad heter den arrayen (inte vector) sen efter det?...
1. Att en klass hämtar något från en annan klass, att den ärver från den klassen? (http://en.cppreference.com/book/intro/inheritance)
2. Ska du använda en c-array och implementera sorteringsalgoritmen själv? Annars finner du alla STL-containers här. (http://en.cppreference.com/w/cpp/container)
__________________
Senast redigerad av MCHaps 2017-08-14 kl. 10:24.
Citera
2017-08-14, 10:33
  #4
Medlem
kaks avatar
Citat:
Ursprungligen postat av MCHaps
Nä, bara ett sätt att jämföra innehållet i STL-containern genom att till exempel överlagra <-operatorn, bidra med en egen comparator eller en lambda-funktion.

1. Att en klass hämtar något från en annan klass, att den ärver från den klassen? (http://en.cppreference.com/book/intro/inheritance)
2. Ska du använda en c-array och implementera sorteringsalgoritmen själv? Annars finner du alla STL-containers här. (http://en.cppreference.com/w/cpp/container)
std::sort kräver random-access. Fungerar inte på list.
Citera
2017-08-14, 10:43
  #5
Medlem
MCHapss avatar
Citat:
Ursprungligen postat av kak
std::sort kräver random-access. Fungerar inte på list.
Använd std::list::sort då?
Citera
2017-08-14, 11:31
  #6
Medlem
kaks avatar
Citat:
Ursprungligen postat av MCHaps
Använd std::list::sort då?
Precis, det var det som GottisBorgen föreslog tidigare.
Citat:
Ursprungligen postat av GottisBorgen
Det kanske en lista du ska använda, och inte en array? En lista har en egen sorteringsfunktion så man behöver inte implementera någon själv, t.ex. bubble (dock behöver man ifall jag kommer ihåg rätt, definiera en egen sortering ifall man har egna object?).
http://www.cplusplus.com/reference/list/list/
Citat:
Ursprungligen postat av MCHaps
Nä, bara ett sätt att jämföra innehållet i STL-containern genom att till exempel överlagra <-operatorn, bidra med en egen comparator eller en lambda-funktion.

1. Att en klass hämtar något från en annan klass, att den ärver från den klassen? (http://en.cppreference.com/book/intro/inheritance)
2. Ska du använda en c-array och implementera sorteringsalgoritmen själv? Annars finner du alla STL-containers här. (http://en.cppreference.com/w/cpp/container)
Citera
2017-08-14, 13:47
  #7
Medlem
MCHapss avatar
Citat:
Ursprungligen postat av kak
Precis, det var det som GottisBorgen föreslog tidigare.
Ja, och jag svarade att man behöver överlagra jämförelseoperatorn. Vad är grejen? Det funkar väl för std::list::sort också.
Citera
2017-08-14, 17:29
  #8
Moderator
RostigHinks avatar
Citat:
Ursprungligen postat av MCHaps
Ja, och jag svarade att man behöver överlagra jämförelseoperatorn. Vad är grejen? Det funkar väl för std::list::sort också.
Förutom att överlagra operator< kan man som alternativ skicka med en komparatorfunktion till sort. Elegantast är nog ändå operator< som då lämpligen implementeras i den lilla klassen. Detta gäller list::sort. std::sort vill väl ha randomaccessiteratorer väl?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback