Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


structar och sortering

Postades av 2008-01-19 03:25:45 - Robbin Westerlund, i forum c++, Tråden har 42 Kommentarer och lästs av 2254 personer

sitter och försöker komma på det här med struct´s, försöker mig på ett databas liknande program, där man ska kunna lägga in en namn och poäng tex. sen vill jag kunna sortera dem efter poängen när jag skriver ut dem, den ska bara kunna innehålla 5 namn så om man inte skriver in ett högre poäng än som redan finns på listan ska det inte läggas till, och om man gör det ska resten flyttas neråt osv

#include <iostream>
using namespace std;

struct Hiscore
{
	char name[20];
	int points;
};


int main()
{
	// fyller listan
	Hiscore listan[4];
	strcpy( listan[0].name, "Robbin" );
	listan[0].points = 1000;
	strcpy( listan[1].name, "Annelie" );
	listan[1].points = 800;
	strcpy( listan[2].name, "Magnus" );
	listan[2].points = 600;
	strcpy( listan[3].name, "Carro" );
	listan[3].points = 400;
	strcpy( listan[4].name, "David" );
	listan[4].points = 200;

	int i = 0;
	for (i = 0; i < 5; i++)
	{
		cout  << listan[i].name << "\t" << listan[i].points << endl;
	}

	cout << "Do you want to enter a new name? (yes/no): ";

	system("pause");
return 0;


så långt har jag kommit, dock vet jag inte riktigt hur jag ska göra för att kunna lägga in nya namn och sortera dem riktigt, eller ja lägga in kan jag men sen då?


Svara

Sv: structar och sortering

Postades av 2008-01-19 21:54:21 - Niklas Jansson

Tja, det beror ju lite på.

Först några kommentarer om hur du skriver kod:
För det första. Använd hellre string än char[], det underlättar enormt.
För det andra, lägg gärna in en konstruktor till struct:en, så blir det lite snyggare.
För det tredje, försök var noga med hur du döper saker. Jag skulle kalla Hiscore för "entry". Undvik svenska namn, det blir alltid krystat.

Då får man;

#include <iostream>
using namespace std;

struct entry
{
	entry(string n="", int p=0) : name(n), points(p) {}
	string name;
	int points;
};


int main()
{
	// fyller listan
	entry list[4];
        list[0] = entry("Robbin", 1000);
        list[1] = entry("Annelie", 800);
        //...

	int i = 0;
	for (i = 0; i < 5; i++)
	{
		cout  << list[i].name << "\t" << list[i].points << endl;
	}

	cout << "Do you want to enter a new name? (yes/no): ";

	system("pause");
	return 0;
}


Nu till själva problemet. Det är ju helt enkelt så att du får tänka ut hur det ska funka.
Om man skriver in ett poäng som är lägre än det sämsta är det bara att strunta i den nya posten.
Om man skriver in ett poäng som är högre än det sämsta så får man gå igenom listan för att ta reda på var det ska läggas in, ta bort sista, och sen skjuta ner alla som är lägre än det talet man har.

Om du gör så här så blir det alltid sorterat. Nu finns det problem med det och det är att du måste göra mycket manuellt. I C++ finns bättre alternativ än arrayer. Den enklaste är vector, och då kan du sortera lättare. Det här kanske är grejer som du inte har kollat på än, men du kan ju kika på det.

Då får du
vector<entry> the_list;
the_list.push_back(entry("Robbin", 1000));
the_list.push_back(entry("Annelie", 800));
//...

//Sen lägger du till en ny genom
the_list.push_back(entry(name, points));

//till sist sorterar du med
sort(the_list);

//detta kan du göra massor av gånger, det viktiga är att du bara visar de fem första när du presenterar det. (om man nu inte tillåter listan att växa)
for(int i=0; i<5; i++)
  std::cout << the_list.at(i).name << ": " << the_list.at(i).points;

}


För att sort ska fungera måste du definiera en <-operator (och eventuellt några andra också, typ ==), de gör du som:
struct entry{
//...
  bool operator<(entry e) { return points < e.points; }
//...
} ;

Detta går att fixa på andra sätt också, men det här är nog enklast som första försök.

Det bästa är att inte trassla med sortering själv alls, utan använda en lagringsstruktur som hanterar det själv. Det finns en sån inbyggd, priority_queue. Där måste också < vara definierad. Då får du istället:

priority_queue<entry> the_list;
the_list.push(entry("Robbin", 1000));
//...

//Lägg in nya mha
the_list.push(entry(name, points));

//Så fort du ska ha ut de fem högsta använder du
for(int i=0; i<5; i++){
  std::cout << the_list.front();
  the_list.pop();
}

//Detta kommer dock innebära att listan blir tom, och om du vill skriva över flera gånger kan du köra med:

std::vector<entry> backup;
for(int i=0; i<5; i++){
  std::cout << the_list.front();
  backup.push_back(the_list.front());
  the_list.pop();
}

for(int i=0; i<5; i++){
  the_list.push(backup.back());
  backup.pop_back();
}

Detta kanske ser krångligare ut men är egentligen väldigt enkelt. Återkom om du har några frågor!


Svara

Sv:structar och sortering

Postades av 2008-01-19 22:37:43 - Robbin Westerlund

okey, vi börjar högst upp i din förklaring då!

Jag antar att jag lär lägga till #include <string> för att kunna använda det istället för char?
so far so good,

ändrat i stucten, lagt till alla posterna som ska vara där från början, då kör vi

FATAL ERROR... _VALIDATE_RETURN_ERRCODE(sizeInBytes >= count, ERANGE);

BREAK...

Visual Studio har gjort en felaktig åtgärd, kommer nu att stängas

Varför får jag det meddelandet?
det är nåt som inte stämmer riktigt, tar jag bort <string> så komplierar den med ett error i just den delen självklart, så jag antar att det ligger någonstans i

entry(string n="", int p=0) : name(n), points(p) {}


Svara

Sv: structar och sortering

Postades av 2008-01-20 03:48:51 - Niklas Jansson

Skippa konstruktorn tills vidare. Ta bort den raden helt, och kolla vad du får för fel.


Svara

Sv:structar och sortering

Postades av 2008-01-20 04:31:23 - Robbin Westerlund

tog bort ovanstående rad och då får jag

hiscore.cpp(18) : error C2661: 'entry::entry' : no overloaded function takes 2 arguments


Svara

Sv: structar och sortering

Postades av 2008-01-20 15:30:51 - Niklas Jansson

Okej, jag var nog lite otydlig. Vad jag menar är att du ska köra med din ursprungliga kod och byta en sak i taget. Byt först strängen till string istället för char[] (och mina nya namnförslag om du vill det).

Funkar det?

Nästa steg är att bara lägga till en konstruktor men inte använda den, och testa att det funkar. Sen börja använda den, osv. Undvik alltid stora ändringar i program.


Svara

Sv:structar och sortering

Postades av 2008-01-21 04:00:11 - Robbin Westerlund

det var precis det jag gjorde denna kod har jag just nu

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

struct entry
{
    string name;
    int points;
};



int main()
{
	
    // fyller listan
    entry list[4];
        list[0] = entry("Robbin", 1000);
        list[1] = entry("Annelie", 800);
        list[2] = entry("Magnus", 600);
		list[3] = entry("Carro", 400);
		list[4] = entry("David", 200);

	int i = 0;
    for (i = 0; i < 5; i++)
    {
        cout  << list[i].name << "\t" << list[i].points << endl;
    }

    cout << "Do you want to enter a new name? (yes/no): ";

    system("pause");
    return 0;
}


Svara

Sv: structar och sortering

Postades av 2008-01-21 07:49:04 - Per Persson

Nu använder du konstruktorn utan att ha definierat den. Niklas skrev att du skulle definiera konstruktorn utan att använda den, tvärtom alltså.


Svara

Sv:structar och sortering

Postades av 2008-01-21 14:34:52 - Robbin Westerlund

vad jag tror är att eftersom det är en ganska så nybörjar aktig kurs och en uppgift i den så ska man inte blanda in för mycket komplicerade saker, för att göra den bästa koden! Utan använda sig av de saker man lärt sig! och det är i princip enkla cout och cin, if, elseif, else, do, while, for och lite structs och arrays har vi pricis börjat med!

så att blanda in massa överkurs grejer för att lösa denna uppgift är ingenting för mig tror jag!

Så här ser uppgiften ut:
Du ska göra en Hi-Score lista. Listan ska rymma namn och poäng för 5 spelare. Listan ska vara sorterad på något sätt, t.ex. med s.k. bubbelsortering. Sorteringsalgoritmen fungerar så här:

så_länge_som( listan_inte_är_sorterad ){
för_varje_element_i_listan_utom_det_sista
om( nuvarande_element < elementet_till_höger )
{
byt_plats_på( nuvarande_element, elementet_till_höger );
}
}

Tips: att kolla att "listan_inte_är_sorterad" är samma sak som att man kan löpa igenom den utan att behöva byta plats på några element.

Du får välja en annan sorteringsalgoritm om du vill. Det viktiga är att highscorelistan är sorterad.

Programmet ska fråga efter namn och poäng. Varje gång som man matat in dem ska programmet visa listan, sorterad (och helt presenterad på något snyggt sätt). Därefter ska programmet fråga om man vill mata in ett nytt namn. Om man väljer 'nej' ska programmet avslutas, annars ska programmet forsätta. Man ska alltså kunna mata in hur många namn som helst, och varje gång ska det nya namnet och poängen sorteras in på rätt ställe.


Svara

Sv: structar och sortering

Postades av 2008-01-21 14:53:52 - Niklas Jansson

Ja, du skrev ju inte att det var en skoluppgift, det jag gav var ju vettig kod... =)
Poängen är att man inte vill skriva kod som redan finns i systemet.

Principen för att göra allt själv är enkel, men det är nog det här du borde komma på.
Det finns två olika varianter som är bra (och en hel rad dåliga):
Variant 1 (fulast):
1. Ha plats för 6 element i listan.
2. Lägg till det sista på plats 6 (skriv över vad som än var där innan).
3. Sortera listan.
4. Presentera alltid bara de 5 första.

Variant 2 (på många sätt snyggare):
1. Se till att listan alltid är sorterad.
2. Leta reda på punkten där den nya posten ska sättas in, flytta ner de andra. Du är då fortfarande garanterad att den är sorterad


Svara

Sv:structar och sortering

Postades av 2008-01-21 15:56:08 - Robbin Westerlund

jag tror dig :) men eftersom jag inte kommit så långt ännu, så är det nog simplast att försöka bygga upp det med det som jag bör/ska ha lärt mig hittills! Så enkel kod som möjligt utan saker som inte ingått i kursen än så länge. Nu är det iofs svårt för dig att veta vad jag kan och inte kan, men nu har du ju uppgiften så kanske det är lite enklare att se vad jag är ute efter

Så vad jag tänker är, att bygga upp det på detta vis

1. skapa en struct och fylla den med några namn
2. skapa början till koden som skriver ut listan och frågar om man vill lägga in ett nytt namn

där ska finnas 3 olika utfall
*ja - nytt namn
*nej - avslutar programmet
*felaktig inmatning - får skriva in ja/nej igen

3. om ja, skriva in namn/poäng, sortera in det på rätt plats och skriva ut nya listan


Svara

Sv: structar och sortering

Postades av 2008-01-21 16:29:56 - Niklas Jansson

Ja, det är helt klart vettigt, men det svåra är ju just steg 3. Det är det jag beskrev i förra inlägget.

Uppfattade inte om du hade någon fråga nu?


Svara

Sv:structar och sortering

Postades av 2008-01-21 16:45:09 - Robbin Westerlund

Vi kanske skulle kunna gå igenom koden från början till slut, ett steg i taget och få det att fungera, om vi börjar så här (nu skriver jag utav kunskaper jag har än så länge, sen är antagligen inte det de allra bästa sättet, men kommentera gärna och ge tips

vi börjar från början:

#include <iostream>
using namespace std;

int main()
{

return 0;
}


sen skapar jag själva structen för mina namn och poäng och lägger in string

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

struct entry
{
   string name;
   int points;
};

int main()
{

return 0;
}


nästa steg är ju att fylla den med värden som är standard och då antar jag att en array skulle funka?

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

struct entry
{
   string name;
   int points;
};

int main()
{
entry list[4];
list[0] = entry("Robbin",1000);
// osv...

return 0;
}


då får jag fel i komplieringen
hiscore.cpp(17) : error C2661: 'entry::entry' : no overloaded function takes 2 arguments


Svara

Sv: structar och sortering

Postades av 2008-01-21 17:02:34 - Niklas Jansson

Javisst funkar array, även om ni borde ha lärt er vector före...
Problemet är att du skriver

list[0] = entry("Robbin",1000);

Men för att kunna göra det måste du ha en konstruktor i structen "entry". Vi kan skippa det just nu, och då skriver du bara precis som förut (förutom att strängarna blir enklare):

list[0].name = "Robbin"
list[0].points = 1000;


Svara

Sv:structar och sortering

Postades av 2008-01-21 17:35:52 - Robbin Westerlund

hur vet den att den hör ihop med entry då?


Svara

Sv: structar och sortering

Postades av 2008-01-21 19:06:11 - Niklas Jansson

Okej, jag lade mig nog på lite för hög nivå här. Förstår du den koden du själv skickade?
Det här är ju precis samma sak men char[] är utbytt mot string.

list är nu en "array av entry".
det betyder att list[0] är en "entry"
och då vet kompilatorn att list[0].name är en "string"

är du med?


Svara

Sv:structar och sortering

Postades av 2008-01-21 20:08:50 - Robbin Westerlund

ja men om man inte skriver "entry list[4]" och bara "list[4]" så har den ju ingen koppling alls till entry
jag har lärt mig att man kan skriva ungefär så här, dock är det ingen array då men det är ungefär samma sak när man gör det

entry list = {"robbin", 1000}

och då är list kopplad till structen entry


Svara

Sv: structar och sortering

Postades av 2008-01-21 22:00:39 - Niklas Jansson

Okej, känner du till begreppen deklaration och definition?
När det kommer till variabler är det i stort sett samma sak.

När vi skriver
entry list[4];

Så betyder det att "list är en array med fyra element, varje element är av typen 'entry'".
Efter detta vet kompilatorn att "list" har denna typ, och förväntar sig operationer som den klarar. Vad gäller "array av ..." så betyder det att den klarar av [i]-operationer. Så fort vi anger list[0] efter detta så syftar vi på den första av alla våra "entry".

Vi skulle i princip kunna skriva
entry list0, list1, list2, list3;
och sen använda varje av dem istället för list[0], osv.

Alltså: Varje variabel måste deklareras. När man gör det berättar man vad den har för typ, då blir list "kopplad" till en struct. (Även om det är helt fel terminologi.)

Skulle du vilja deklarera variabeln som list[4] så skulle du få fel, där måste man berätta typ. Däremot ska man <b>inte</b> ange typen någon annanstans.


Svara

Sv:structar och sortering

Postades av 2008-01-22 03:57:16 - Robbin Westerlund

tappade bort mig någonstans där i mitten ;)

så VAD ska jag använda mig av? vektor? array? string eller chars?

kod exempel på båda skulle vara nice, hur man deklarerar och definerar, och jo jag känner till det ;)


Svara

Sv: structar och sortering

Postades av 2008-01-22 10:21:48 - Niklas Jansson

Okej, vi tar det i steg. Skriv all kod, kopiera inte bara, utan för över det nya jag skriver, säg sen till var du inte förstår.

1.

int main()
{
}


2.
#include<string>
#include<iostream>
using namespace std; //denna vill vi egentligen inte ha här, men nu gör vi så för enkelhets skull

int main()
{
  string name="Robbin";
  int points=1000;
  std::cout << name << ": " << points ;
}


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

struct entry{
  string name;
  int points;
};
int main()
{
  entry e;
  e.name = "Robbin";
  e.points = 1000;
  cout << e.name << ": " << e.points;
}


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

struct entry{
  string name;
  int points;
};
int main()
{
  entry e0, e1, e2;
  e0.name = "Robbin";
  e0.points = 1000;
  e1.name = "Annelie";
  e1.points = 800;
  e2.name = "Erik";
  e2.points = 600;
  cout << e0.name << ": " << e0.points;
  cout << e1.name << ": " << e1.points;
  cout << e2.name << ": " << e2.points;
}


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

struct entry{
  string name;
  int points;
};
int main()
{
  entry e[3];
  e[0].name = "Robbin";
  e[0].points = 1000;
  e[1].name = "Annelie";
  e[1].points = 800;
  e[2].name = "Erik";
  e[2].points = 600;
  cout << e[0].name << ": " << e[0].points;
  cout << e[1].name << ": " << e[1].points;
  cout << e[2].name << ": " << e[2].points;
}


Är allt klart så långt?


Svara

Sv:structar och sortering

Postades av 2008-01-23 12:19:47 - Robbin Westerlund

yeah jag har koll på det nu, nästa steg borde vara att välja ja/nej för att lägga in ett nytt namn


Svara

Sv: structar och sortering

Postades av 2008-01-23 13:45:09 - Niklas Jansson

Ja, det verkar vettigt.


Svara

Sv:structar och sortering

Postades av 2008-02-11 18:47:30 - Robbin Westerlund

har börjat få det att fungera lite som jag ska nu, men behöver lite hjälp med själva sorteringen!
som jag skrev ovanför så är uppgiften att använda sig av en så kallad bubbelsortering!

jag sparar ner min nya information i en temp

och sen vill jag lista igenom hela listan med något likande:

for (i = 0; i > 5; i++)
om (temp > lista[i])
sätt in och flytta alla ett steg till höger

vet inte hur jag ska lösa det smidigt utan att behöva kopiera all text om och om igen
om den till exempel hamnar högst upp måste jag juh kopiera temp till 0, 0 > 1, 1 > 2 osv

kanske är där någon form av swap funktion kanske skulle passa?


Svara

Sv: structar och sortering

Postades av 2008-02-11 19:03:36 - Niklas Jansson

Ja, en swap är alltid vettig om man ska byta plats (och använd gärna den inbyggda, std::swap).

<b>>vet inte hur jag ska lösa det smidigt utan att behöva kopiera all text om och om igen
om den till exempel hamnar högst upp måste jag juh kopiera temp till 0, 0 > 1, 1 > 2 osv
</b>
Vad ser du som problemet - att det blir mycket kod, att det tar lång tid?
Blir det mycket kod har du tänkt fel. Att det tar lång tid spelar ingen roll eftersom:
1. Det är på en dator, då är det inte mycket saker som tar lång tid.
2. Det är bara ett experiment/en kurs (?), då är prestandan oväsentlig.
3. Det vanligaste sättet att optimera är att byta algoritm. Bubble sort fungerar precis som du beskriver, så om du gör på något annat sätt får du en annan algoritm.

Med reservation för hur du har tänkt att det ska funka. Bubble sort är märkligt nog en av de mest missförstådda algoritmerna.


Svara

Sv:structar och sortering

Postades av 2008-02-11 19:11:30 - Robbin Westerlund

sitter och läser om och om igen här och försöker fundera ut hur jag ska kunna lösa det!

hur fungerar den inbyggda swapen? tar den emot flera typer än int tex? eftersom jag som tidigare använder mig utav arrays av en struct med string och int i samma


Svara

Sv: structar och sortering

Postades av 2008-02-12 01:38:14 - Niklas Jansson

Jepp, den tar alla typer. Det kallas "templates", mallar.

Du kan alltså göra:

swap(din_array[i], din_array[j]);


Men sen är det ju kanske inte mycket svårare att använda:
temp = din_array[i];
din_array[i] = din_array[j];
din_array[j] = temp;

Så häng inte upp dig på det.


Svara

Sv:structar och sortering

Postades av 2008-02-12 03:41:48 - Robbin Westerlund

har kommit en bit på vägen, men får inte själva algoritmen att funka som det ska, tänker kanske snurrigt? Den sorterar till viss del men stannar upp innan den e klar! inte lätt att vara nybörjare, ska lägga mig och läsa igenom lite av sorterings kapitlen men kommentera gärna! missar en "for" där i koden och jag förstår att det är därför den inte fortsätter

entry list[5];
list[0] = entry("Robbin", 1000);
list[1] = entry("Annelie", 300);
list[2] = entry("David", 600);
list[3] = entry("Carro", 1200);
list[4] = entry("Magnus", 700);

//så_länge_som( listan_inte_är_sorterad )
   for (int i = 0; i < 3; i++)
      if(list[i].points < list[i+1].points)
      {
         swap(list[i], list[i+1]);
       }


Svara

Sv: structar och sortering

Postades av 2008-02-12 03:57:09 - Robbin Westerlund

löste det! :P weee

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

//Skapar en struct
struct entry
{
	entry(string n="", int p=0) : name(n), points(p) {}
    string name;
    int points;
};


int main()
{
	const int max_hiscore = 5; // Hur många som ska visas i hiscore listan

	//Skapar och fyller hiscore listan
	entry list[max_hiscore];
	list[0] = entry("Robbin", 1000);
    list[1] = entry("Annelie", 300);
	list[2] = entry("David", 600);
	list[3] = entry("Carro", 1200);
	list[4] = entry("Magnus", 700);



	//Sorterar
	for (int sort=0; sort<max_hiscore-1; sort++)
		for(int i=0; i < max_hiscore-1; i++)
			if(list[i].points < list[i+1].points)
				swap(list[i], list[i+1]);
	 

	//Skriver ut
	for (int i = 0; i < max_hiscore; i++)
			cout << list[i].name << "\t" << list[i].points << endl;

	system("pause");
    return 0;


}


Nu återstår bara att lägga in de sista funktionerna, så beware! Jag kommer nog med flera frågor ska du se, men lär säga att jag börjar förstå mera och mera


Svara

Sv:structar och sortering

Postades av 2008-02-12 10:49:48 - Niklas Jansson

Grattis!

Nu är det bara en grej att tänka på, och det är att algoritmen egentligen inte är riktigt rätt. =)
Försök fundera ut hur du kan optimera den, kolla på nätet efter bubblesort. Du har gjort rätt i

swap(list[i], list[i+1]);

och det är ovanligt. Men det är en detalj kvar. =)


Svara

Sv: structar och sortering

Postades av 2008-02-12 17:37:13 - Robbin Westerlund

nu följer jag inte riktigt, du får nog förklara vad som är fel

dessutom har jag en liten fråga angående funktioner, försökte bygga en funktion utav sorteringen men då uppkom lite problem med arraysen och structen! står att den måste vara av en class/union/struct eller nåt likande i felmeddelandet, lite kod exempel skulle vara nice du har juh min kod som den är just nu ovanför


Svara

Sv:structar och sortering

Postades av 2008-02-12 20:42:51 - Niklas Jansson

http://en.wikipedia.org/wiki/Bubble_sort
Du vet att den största (eller minsta, beroende på hur du har skrivit det) alltid kommer hamna på rätt plats. Då räcker det att antingen börja från 2 eller sluta på n-1 nästa runda (beroende på upplägget), osv.

Principen för att skicka en array är:

void fun(type *array, int size)
{
array[1].apa = ...;
}


Men det är onödigt krångligt, och mycket bättre att bara köra med vector istället.


Svara

Sv: structar och sortering

Postades av 2008-02-13 05:33:40 - Robbin Westerlund

jag har kikat på några olika exempel på bubbelsortering och enda skillnaden jag kan se från deras kod och min är att jag hade skrivit max_hiscore-1 på båda for:sen, tog bort på den översta och det funkade fortfarande, på den andra dock så hängde det sig och jag fick trycka break i vs


Svara

Sv:structar och sortering

Postades av 2008-02-13 10:54:56 - Niklas Jansson

vad jag menar är att du ska kunna skriva
for (int sort=0; sort<max_hiscore-1; sort++)
for(int i=0; i < max_hiscore-1-sort; i++)
if(list[i].points < list[i+1].points)
swap(list[i], list[i+1]);


Efter sort=0-rundan så ser du att det minsta elementet kommer att ligga sist, eller hur?
Då behöver du inte jämföra med det sista nästa gång.


Svara

Sv: structar och sortering

Postades av 2008-02-13 13:57:25 - Robbin Westerlund

okey jag ändrade lite i koden, och har lagt till en temp för att kunna lägga in nya namn/poäng, dessutom har jag lagt till funktioner för att både sortera och skriva ut

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

//Skapar en struct
struct entry
{
	entry(string n="", int p=0) : name(n), points(p) {}
    string name;
    int points;
};

//Funktion för att sortera hiscore listan
void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
		for(int i=0; i < max_hiscore; i++)
			if(list[i].points < list[i+1].points)
				swap(list[i], list[i+1]);
}

//Funktion för att skriva ut Hiscore listan
void PrintHiscore(entry list[], int max_hiscore)
{
	
	cout << "-- HISCORE --"<< endl;
	for (int i = 0; i < max_hiscore; i++)
			cout << list[i].points << "\t" << list[i].name << endl;
}

int main()
{
	const int max_hiscore = 5; // Hur många som ska visas i hiscore listan

	//Skapar och fyller hiscore listan
	entry list[6];
	list[0] = entry("Robbin", 1000);
    list[1] = entry("Annelie", 300);
	list[2] = entry("David", 600);
	list[3] = entry("Carro", 1200);
	list[4] = entry("Magnus", 700);

	//Test input som ej skall vara med sen
	string tempn;
	int tempp;
	cin >> tempn; cin >> tempp;
	list[5] = entry(tempn, tempp);

	SortHiscore(list, max_hiscore);
	PrintHiscore(list, max_hiscore);

system("pause");
return 0;
}


Svara

Sv:structar och sortering

Postades av 2008-02-13 14:01:47 - Niklas Jansson

Det börjar bli bra, men prova att ändra funktionen till

void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
        for(int i=0; i < max_hiscore - sort; i++)
            if(list[i].points < list[i+1].points)
                swap(list[i], list[i+1]);
}

Så ska den gå ungefär dubbelt så snabbt (inte för att det spelar någon roll med så här små arrayer, men ändå).
Gör du det till ett skolarbete eller vill du ha mer tips på hur du kan förbättra programmet?
Steg 1 är i så fall att byta ut arrayen till std::vector.


Svara

Sv: structar och sortering

Postades av 2008-02-13 19:25:44 - Robbin Westerlund

jag har läst några veckor på powerhouse, och detta är första övningsuppgiften, är rätt ny i c++ som du säkert ser :)

hur mycket ändringar måste göras för att få det att funka med std::vector?


Svara

Sv:structar och sortering

Postades av 2008-02-13 20:34:18 - Niklas Jansson

Ganska lite. Du måste ändra alla deklaration av arrayerna. från entry[] x; och entry *x till
vector<entry> x(5);

för deklarationen av själva typen,

vector<entry> x;

i funktionsdeklarationen om du bara ska läsa från vectorn (som i print-funktionen).
eller

vector<entry> &x;
i funktionsdeklarationen om du ska ändra vektorn (som i sort-funktionen).

Utöver det så behöver du inte längre använda max_sort utan det räcker med x.size() för att få fram storleken. Om du får det att funka har du lärt dig ett bättre sätt att arbeta på. (Sen finns det några saker med ovanstående som man bör göra lite annorlunda, men det är en annan sak.)


Svara

Sv: structar och sortering

Postades av 2008-02-14 02:18:47 - Robbin Westerlund

ska läsa igenom lite mera om vectors och se om jag kan få det att fungera!


Svara

Sv:structar och sortering

Postades av 2008-02-15 06:07:32 - Robbin Westerlund

okey, om du bortser från det med vectorn nu och kollar på övrig kod, finns det nåt du skulle ändra på? tex mitt sätt att mata in namn och poäng och hur jag sparar dem? Har dessutom fått en kommentar från läraren angående mitt sätt att sortera? "Det ser bra ut, precis så är det tänkt att fungera. Jag är inte helt säker på att sorterings-funktionen är korrekt, testa med en omvänd sorterad lista och se om den fungerar //Jimmy"




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

//Skapar en struct
struct entry
{
	entry(string n="", int p=0) : name(n), points(p) {}
    string name;
    int points;
};

//Funktion för att sortera hiscore listan
void SortHiscore(entry list[], int max_hiscore)
{
for (int sort=0; sort < max_hiscore; sort++)
        for(int i=0; i < max_hiscore - sort; i++)
            if(list[i].points < list[i+1].points)
                swap(list[i], list[i+1]);
}

//Funktion för att skriva ut Hiscore listan
void PrintHiscore(entry list[], int max_hiscore)
{
	
	cout << endl << "Sorted Hiscore:" << endl << endl;
	for (int i = 0; i < max_hiscore; i++)
			cout << list[i].points << "\t" << list[i].name << endl;
}

int main()
{
	const int max_hiscore = 5;	//Hur många som ska visas i hiscore listan
	char option[10];			//För att välja yes/no
	string temp_name;			//Här sparas det temporära namnet
	int temp_points;			//Här sparas den temporära poängen

	//Skapar och fyller hiscore listan
	entry list[6];
	list[0] = entry("Robbin", 1000);
    list[1] = entry("Annelie", 300);
	list[2] = entry("David", 600);
	list[3] = entry("Carro", 1200);
	list[4] = entry("Magnus", 700);

	//Sorterar och skriver ut listan
	SortHiscore(list, max_hiscore);
	PrintHiscore(list, max_hiscore);

	do {
		cout << endl << "Do you want to add a new name? (yes/no): "; cin >> option;

		if(strcmp(option, "yes") == 0)
		{
			cout << "Enter new name: "; cin >> temp_name;
			cout << "Enter Score: "; cin >> temp_points;
			list[5] = entry(temp_name, temp_points);
			SortHiscore(list, max_hiscore);
			PrintHiscore(list, max_hiscore);
		}
		else
			cout << "Please enter yes or no!";
	}while (strcmp(option, "no") != 0);

return 0;
}


Svara

Sv: structar och sortering

Postades av 2008-02-15 11:17:05 - Niklas Jansson

1. Gör option till string också, då får du tydligare jämförelser;
if(strcmp(option, "yes") == 0)
blir
if(option == "yes")

2. Det sätt du skriver loopen på kommer leda till att "please enter..." visas en gång även om man skriver "no".

3. yes/no är trevligt att få skriva in med stora bokstäver om man vill, och gärna bara med första bokstaven. Det gör man _inte_ genom att skriva varje tänkbar kombination av text, utan genom att först konvertera hela strängen till lower- eller upper-case.

4. Du får problem med highscorelistan eftersom du hela tiden skriver över entry nr 5. Vad du kan göra är att skriva över nr 6, och alltid visa 1-5. men inte skriva över 5.

5. Angående lärarens kommentar så är jag osäker på vad han syftar på. Antingen på max_hiscore-sort eller på swap(list[i], list[i+1]). Hur som helst så är det exakt så som bubblesort är definierad, och det är lite märkligt att han inte känner till det.

Du kan övertyga dig själv om att den är rätt. Första varvet kommer "i" gå rakt igenom hela listan. Det största av i och i+1 kommer hamna i position i+1. Det leder direkt till att det största talet kommer hamna allra längst till höger i första iterationen, alltså behöver man aldrig mer kolla på det sista talet. Du kan ju hänvsia

Men för all del, testa funktionen, det ska man alltid göra.


Svara

Sv:structar och sortering

Postades av 2008-02-15 19:17:16 - Robbin Westerlund

1. får det inte att funka med string, har försökt! Men skriver jag tex "dsako" så stängs programmet ner efter loopen, och skriver jag yes, sen namn och poäng så stängs det nere efter.

2. Förstår nu när du säger det att loopen visar "please enter..." men hur ska jag lösa det för att den inte skall göra det? finns ett gammal utryck som lyder, det man inte ser/vet, mår man inte dåligt av! Är inte detta ett ypperligt exempel på att bruka det utrycket :P så länge man har en tillräckligt snabb dator så hinner man nog aldrig se det haha

3. Jag har en exempel exe som visar hur det ska fungera, dock finns det juh alltid plats för förbättringar! I exemplet har jag provat allt det du skrev, om stora bokstäver och så och det fungerar som min, om man skriver YES så står det försök igen, så det är ju en sak jag kan utveckla på det till det bättre.

4. jag skriver ju över 6:an i arrayen 0,1,2,3,4 innehåller listan, 5an swappar väl plats med någon av dem när man skriver in namn/poäng?

5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?


Svara

Sv: structar och sortering

Postades av 2008-02-17 16:30:26 - Niklas Jansson

<b>>1. får det inte att funka med string, har försökt! Men skriver jag tex "dsako" så stängs programmet ner efter loopen, och skriver jag yes, sen namn och poäng så stängs det nere efter.</b>
Det ska inte påverka. Problemet skulle kunna vara att du har ett radbryt liggande kvar. Du skulle då kunna använda cin.flush() efteråt.

<b>>2. Förstår nu när du säger det att loopen visar "please enter..." men hur ska jag lösa det för att den inte skall göra det? finns ett gammal utryck som lyder, det man inte ser/vet, mår man inte dåligt av! Är inte detta ett ypperligt exempel på att bruka det utrycket :P så länge man har en tillräckligt snabb dator så hinner man nog aldrig se det haha</b>
Det är inte helt snyggt bara. Det kan du lösa genom att sätta en ifsats på rätt ställe, till exempel.

<b>>3. Jag har en exempel exe som visar hur det ska fungera, dock finns det juh alltid plats för förbättringar! I exemplet har jag provat allt det du skrev, om stora bokstäver och så och det fungerar som min, om man skriver YES så står det försök igen, så det är ju en sak jag kan utveckla på det till det bättre.</b>
Ja, om du vill lära dig programmera och inte bara följa exempel är det typiskt en bra grej att göra. Kolla på "string to lower case c++" på google.

<b>>4. jag skriver ju över 6:an i arrayen 0,1,2,3,4 innehåller listan, 5an swappar väl plats med någon av dem när man skriver in namn/poäng?</b>
Sorry, mitt fel. Men se till att du alltid skriver ut de fem första, och inte den sista med.

<b>>5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?</b>
Det där förstod jag inte?


Svara

Sv:structar och sortering

Postades av 2008-02-18 05:24:06 - Robbin Westerlund

<b>>5. får maila honom och höra vad han menar, enda jag kan se är att om man vänder det och räknar baklänges så kommer 0 stå högst upp hela tiden även om man skriver över den av någon konstig anledning?</b>
Det där förstod jag inte?

Jo han bad mig kolla om det fungerade baklänges, och NÄR jag gör det så skriver den ut helt knasigt... du kan juh prova med min kod ovan om du har tid och ändra så for går baklänges istället.

ska kolla vidare på det programmet under dagen så jag lär nog posta lite här igen snart


Svara

Nyligen

  • 20:22 Spel
  • 17:07 Snabb och trevlig webbplats utan l
  • 17:00 Bra spelsajt med bonusar
  • 15:51 Slappna av
  • 15:17 Onlineunderhållning på fritiden
  • 11:13 Online Kasino
  • 17:57 Vart är SEO på väg till 2030?
  • 14:24 CBD regelbundet?

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 670
27 955
271 721
592
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies