4 svar
471 visningar
Raffel är nöjd med hjälpen
Raffel 3
Postad: 3 maj 2022 20:44

Anropa funktionen Bubble sort?

Hej!
Första inlägget jag lägger upp här, så ursäkta ifall det inte är korrekt skrivet, eller om något verkar oklart.
För att verka så tydlig som möjligt så klistra jag in uppgiftens beskrivningar (vilket är lite svårt för mig att tolka)
och visa vad jag har kommit fram till.

Del 1

Jag har fått i uppgift att skapa en väderstations program och detta ska inkludera en klass stad med två attributer
string name;
int temp;

samt ska en funkton/metod ToString(); skrivas
De ska returnerar en string som innehåller värden i attributen namn och temp.
Observera att medlemsfunktion/metoden ToString() genererar ingen utskrift till konsolen. 

Första delen av denna uppgift har jag förstått till en viss del, dock osäker på vad uppgiften vill jag ska göra angående ToString();

Del 2

Skriv en funktion/metod för linjär sökning i ett fält (array, vector, list) städer med stad-objekt.
int linsok(fält städer, int n, int söktemp)

Funktionen/metoden ska söka igenom ett fält städer efter en stad med en specifik temperatur (temp) och returnera   index för den staden. Om ingen stad med den temperaturen hittas returneras -1. Variabeln n är antalet element i fältet 

Skriv också en funktion/metod som sorterar ett stad-fält efter temperatur (kallast först).
void bubblesort(fält städer, int n)


Linjärsökning har jag inte påbörjat eftersom jag då är mer fokuserad på att sortera först, har istället börjat med Bubble sort funktionen (den del jag inte förstår mig på) 

Så min fråga lyder, varför får jag felmeddelandet -  argument of type "int*" is incompatible with parameter of type "City*" ?
Är det inte möjligt att på kodlinje - 71 använda sig av - int arr[4]; för att ge bubble sort arrayen?
För tillfället har jag inte anropat InputName() eller InputTemp() just för att se hur man först ska anropa bubble sort funktionen. 

#include <iostream>
#include <string>
using namespace std;

class City
{
	string name;
	int temp = 0;
public:
	void InputName(string[]);
	void InputTemp(int[], string[]);

	City(string aName, int aTemp)
	{
		name = aName;
		temp = aTemp;
	}
	string GetName()
	{
		return name;
	}
	int GetTemp()
	{
		return temp;
	}

	void BubbleSort(City arr[])
	{
		for (int i = 0; i < 4; i++)
		{
			int nrLeft = 4 - i;
			for (int j = 0; j < nrLeft; j++)
			{
				if (arr[j].temp > arr[j + 1].temp)
				{
					City sortCity = arr[j+1];
					arr[j+1] = arr[j];
					arr[j] = sortCity;
				}
			}
		}
	}

};
void City::InputName(string arr[])
{
	for (int i = 0; i < 4; i++)
	{
		cout << "Enter name for city :" << endl;
		cin >> name;
		arr[i] = name;
	}
}

void City::InputTemp(int arr[], string name[])
{
	for (int i = 0; i < 4; i++)
	{
		cout << "Enter temp for " << name[i] << endl;
		cin >> temp;
		arr[i] = temp;
	}
}



int main()
{
	int arr[4];
	City city("",0);
	city.BubbleSort(arr);
	return 0;
}




Laguna Online 28597
Postad: 3 maj 2022 20:51 Redigerad: 3 maj 2022 20:52

Nej, hur ska sorteringen kunna göra något med .temp om den bara får en int?

Bra med indenterad kod förresten och att du anger radnumret, men det är inte så lätt att se vilken rad det är här.

 

Raffel 3
Postad: 3 maj 2022 21:05
Laguna skrev:

Nej, hur ska sorteringen kunna göra något med .temp om den bara får en int?

Bra med indenterad kod förresten och att du anger radnumret, men det är inte så lätt att se vilken rad det är här.

 

Oj.. trodde att radnumret skulle dyka upp efter inlägget.
Tänker du på int arr[4]? att den enbart får en int från detta?

Vad kan bubbel sort ta emot i sådan fall? Jag är något van att använda int/string/double osv inom en metod, T.ex 
void BubbleSort(int arr[]) istället för void BubbleSort(City arr[]) eftersom detta är första gången jag leker med klasser och objekt så är det lite förvirrande för mig.

anders_k Online 234
Postad: 3 maj 2022 21:29 Redigerad: 3 maj 2022 21:38

Som jag har förstått din uppgift så behöver du i slutändan en array av städer med temperaturer, som du sedan skall sortera efter temperatur och sedan skriva ut.

Vad du har nu är att du skickar in en oinitialiserat array av integers till BubbleSort.

Så först du behöver en array av City

City arr[4];

Normalt i C++ använder man inte "råa" arrayer utan man använder templates som std::array, std::vector eller för all del std::span. Anledningen är att när man skickar in en rå array till en funktion finns ingen information hur många element som är i arrayen så funktionen som ropas måste då få den informationen från någon annanstans. Istället kan man använda detta, då får man storleken med när man skickar in "arr"

std::array<City,4> arr;

I C brukar man skicka med längden på arrayen till en funktion som tar en array så att funktionen vet hur många element i arrayen det finns.

void BubbleSort(City arr[], int size) {...}

Efter du deklarerat arrayen så matar du namn och temperatur för varje stad, de funktioner du gjort verkar läsa in alla städer först, sedan alla temperaturer. Det är nog bättre att för varje stad mata in temperaturen:

for (int i = 0; i < 4; ++i)
{ 
  std::cout << "Enter city name:" << std::flush;
  std::getline(std::cin, arr[i].name);
  std::cout << "Enter temperature:" << std::flush;
  std::cin >> arr[i].temp;
}

std::flush gör att texten och din input kommer på samma rad.

Sedan skickar du in den arrayen till BubbleSort. Gör BubbleSort till en "static member function" eftersom den inte är en del av instansen City, utan du vill sortera en array av City.

static void BubbleSort(City arr[], int size) 

Sedan gör du din bubbel sort och skriver ut arrayen City t.ex. med hjälp av ToString()  (som du definierat i City)

for (int i = 0; i < 4; ++i)
{
  std::cout << arr[i].ToString() << std::endl;
}

// alternativt om name och temp hade varit deklarerade som public
// hade du kunnat göra så här men det är en god vana att låta member
// variabler inte vara public.

for (int i = 0; i < 4; ++i)
{
  std::cout << arr[i].name << ", " << arr[i].temp << std::endl;
}

hth

Raffel 3
Postad: 4 maj 2022 06:18 Redigerad: 4 maj 2022 06:20
anders_k skrev:

Som jag har förstått din uppgift så behöver du i slutändan en array av städer med temperaturer, som du sedan skall sortera efter temperatur och sedan skriva ut.

Vad du har nu är att du skickar in en oinitialiserat array av integers till BubbleSort.

Så först du behöver en array av City

City arr[4];

Normalt i C++ använder man inte "råa" arrayer utan man använder templates som std::array, std::vector eller för all del std::span. Anledningen är att när man skickar in en rå array till en funktion finns ingen information hur många element som är i arrayen så funktionen som ropas måste då få den informationen från någon annanstans. Istället kan man använda detta, då får man storleken med när man skickar in "arr"

std::array<City,4> arr;

I C brukar man skicka med längden på arrayen till en funktion som tar en array så att funktionen vet hur många element i arrayen det finns.

void BubbleSort(City arr[], int size) {...}

Efter du deklarerat arrayen så matar du namn och temperatur för varje stad, de funktioner du gjort verkar läsa in alla städer först, sedan alla temperaturer. Det är nog bättre att för varje stad mata in temperaturen:

for (int i = 0; i < 4; ++i)
{ 
  std::cout << "Enter city name:" << std::flush;
  std::getline(std::cin, arr[i].name);
  std::cout << "Enter temperature:" << std::flush;
  std::cin >> arr[i].temp;
}

std::flush gör att texten och din input kommer på samma rad.

Sedan skickar du in den arrayen till BubbleSort. Gör BubbleSort till en "static member function" eftersom den inte är en del av instansen City, utan du vill sortera en array av City.

static void BubbleSort(City arr[], int size) 

Sedan gör du din bubbel sort och skriver ut arrayen City t.ex. med hjälp av ToString()  (som du definierat i City)

for (int i = 0; i < 4; ++i)
{
  std::cout << arr[i].ToString() << std::endl;
}

// alternativt om name och temp hade varit deklarerade som public
// hade du kunnat göra så här men det är en god vana att låta member
// variabler inte vara public.

for (int i = 0; i < 4; ++i)
{
  std::cout << arr[i].name << ", " << arr[i].temp << std::endl;
}

hth

Tack så hemskt mycket för din hjälp, det var väldigt klart och tydligt! 
Användningen av klass och objekt har alltid vart lite oklart sen jag började uppgiften, men ser nu hur enkelt det egentligen är.

Svara Avbryt
Close