Re: Way to sort in C++, how? 4 possiblities
* Andreas Ott:
http://www1.minpic.de/bild_anzeigen.php?id=72043&key=73473177&ende
Why do you include a link to an incomprehensible graphic on a German page?
Most folks here don't read German.
And more importantly, most folks here are /not/ telepathic. You need to /say/
what you want to communicate. Not just think it.
Hello together,
I have a big problem.
I have 4 cases about the way.
Please see the picture.
Problem:
My code is not working. I don't know why.
And we (or at least, I) don't know what you mean by "not working".
You need to /say/ what you want to communicate.
Not just think it.
Can somebody help me.
C++ Application
I use static. Only with static I can call this function.
std::sort(mylistSortWay.begin(),
mylistSortWay.end(),
CSortWay::SortCase1);
It is good or bad?
The naming convention with prefix "C" is bad, it's something Microsoft does.
Maybe better with a function of the object, or?
Problem
It is also not working. It is not correct.
Pos=1 x= 10.00, y= 10.00
Pos=2 x= 10.00, y= 20.00
Pos=3 x= 10.00, y= 30.00
Pos=4 x= 30.00, y= 10.00
Pos=5 x= 30.00, y= 20.00
Pos=6 x= 10.00, y= 40.00
Pos=7 x= 30.00, y= 30.00
Pos=8 x= 30.00, y= 40.00
Pos=9 x= 50.00, y= 10.00
Pos=10 x= 50.00, y= 20.00
Pos=11 x= 50.00, y= 30.00
Pos=12 x= 50.00, y= 40.00
Pos=13 x= 70.00, y= 10.00
Pos=14 x= 70.00, y= 20.00
Pos=15 x= 70.00, y= 30.00
Pos=16 x= 70.00, y= 40.00
Pos=17 x= 90.00, y= 10.00
Pos=18 x= 90.00, y= 20.00
Pos=19 x= 90.00, y= 30.00
Pos x= 90.00, y= 40.00
What is "not correct"?
You need to /say/ what you want to communicate.
Not just think it.
I need the algorithm for all 4 cases.
What are the "4 cases"?
You need to /say/ what you want to communicate.
Not just think it.
Can you give me that?
Nope -- see above.
Can you say, where can I reread it, if you not want to give me the code?
Nope -- see above.
My code now - Thanks for check!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
// Sort_Wege.cpp :
//
#include "stdafx.h"
This is a non-standard header. You don't need it.
#include "Sort_Wege.h"
This is a header that you forgot to present.
As mentioned, few if any in this group are telepathic.
So it's almost impossible to guess the contents of that header.
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Redefining a keyword yields Undefined Behavior if you're using any standard
library headers.
// Das einzige Anwendungsobjekt
CWinApp theApp;
You don't need this. It's from some library. One would guess MFC.
using namespace std;
#pragma once
You don't need this. It's compiler specific.
#include <vector>
#include <algorithm>
#include <conio.h>
You don't need this, and anyway it's a non-standard header. Instead of using a
'getch' to stop your program, e.g. run your program from a command interpreter.
#include <ctype.h>
You probably don't need this.
class CSortWay
Don't use a 'C' prefix, it's just noise (and adopting that convention makes it
much harder to use a 'C' prefix for something reasonable such as 'const').
'SortWay' is misleading.
An instance of your class stores to numbers X and Y, it might be e.g. a 'Position'.
{
public:
CSortWay(){}
Unless this is very intentional it's bad: it leaves X and Y with indeterminate
values, which, if ever used, yields formally Undefined Behavior. Depending on
the compiler that UB might be a crash.
CSortWay(double x, double y) { X = x; Y = y; }
OK.
You might improve the notation a little by using a memory initializer list:
CSortWay( double x, double y ): X(x), Y(y) {}
And that's less problematic in the general case (for types other than 'double').
~CSortWay(){}
You don't need this.
typedef std::vector<CSortWay> data;
public:
double X;
double Y;
As a general rule, use all uppercase names for macros and macros /only/ (except
for idiomatic usage such as single letter template type parameters).
static double SortCase1(const CSortWay var1,const CSortWay var2)
{
double x1 = var1.X;
double y1 = var1.Y;
double x2 = var2.X;
double y2 = var2.Y;
return( (x1*x1 + y1*y1) < (x2*x2 + y2*y2) );
}
The result type should be 'bool'.
By convention arguments of class type are passed by reference, and local
variables that are not meant to be modified are declared 'const', thus:
static bool SortCase1( CSortWay const& var1, CSortWay const& var2 )
{
double const x1 = var1.X;
double const y1 = var1.Y;
double const x2 = var2.X;
double const y2 = var2.Y;
return (x1*x1 + y1*y1 < x2*x2 + y2*y2);
}
[snip]
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
This is all Microsoft specific, non-standard.
In standard C++:
int main()
It's also much less to write! :-)
{
int nRetCode = 0;
You don't need this.
// MFC initialisieren und drucken. Bei Fehlschlag Fehlermeldung
aufrufen.
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
_tprintf(_T("Schwerwiegender Fehler bei der
MFC-Initialisierung\n"));
nRetCode = 1;
}
else
{
You don't need the above.
CSortWay::data mylistSortWay;
mylistSortWay.push_back(CSortWay(10,10));
mylistSortWay.push_back(CSortWay(10,20));
mylistSortWay.push_back(CSortWay(10,30));
mylistSortWay.push_back(CSortWay(10,40));
mylistSortWay.push_back(CSortWay(30,10));
mylistSortWay.push_back(CSortWay(30,20));
mylistSortWay.push_back(CSortWay(30,30));
mylistSortWay.push_back(CSortWay(30,40));
mylistSortWay.push_back(CSortWay(50,10));
mylistSortWay.push_back(CSortWay(50,20));
mylistSortWay.push_back(CSortWay(50,30));
mylistSortWay.push_back(CSortWay(50,40));
mylistSortWay.push_back(CSortWay(70,10));
mylistSortWay.push_back(CSortWay(70,20));
mylistSortWay.push_back(CSortWay(70,30));
mylistSortWay.push_back(CSortWay(70,40));
mylistSortWay.push_back(CSortWay(90,10));
mylistSortWay.push_back(CSortWay(90,20));
mylistSortWay.push_back(CSortWay(90,30));
mylistSortWay.push_back(CSortWay(90,40));
OK.
// ** Case 1
std::sort(mylistSortWay.begin(),
mylistSortWay.end(),
CSortWay::SortCase1);
int count=0;
for ( CSortWay::data::iterator it2(mylistSortWay.begin());
it2!=mylistSortWay.end();
it2++ )
{
++count;
printf("Pos=%d x= %7.2f, y=%7.2f\r\n",
count,
(*it2).X,
(*it2).Y);
}
This seems to be OK.
However, note that by convention
(*p).d
is written as simply
p->d
Both more clear and less to write! :-)
[snip]
Cheers & hth.,
- Alf
--
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff! :-) Just going there is good. Linking
to it is even better! Thanks in advance!