-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.cpp
139 lines (117 loc) · 2.55 KB
/
Main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "List.hpp"
#include <string.h>
#include <climits>
#include <time.h>
#include <fstream>
using namespace std;
int getSeed()
{
int rnd = 0;
size_t size = sizeof(rnd);
ifstream urandom("/dev/urandom", ios::in|ios::binary);
if (urandom)
{
urandom.read(reinterpret_cast<char *>(&rnd), size);
if (!urandom)
{
cerr << "Lecture de urandom échouée (" << errno << "): " << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
urandom.close();
}
else
{
cerr << "Ouverture de urandom échouée (" << errno << "): " << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
return rnd;
}
/**
* Usage
*/
void usage(char* argv[])
{
cerr << "Usage: " << argv[0] << " <lng>" << endl
<< " lng est un nombre entier > 1 et < " << UINT64_MAX << endl;
exit(EXIT_FAILURE);
}
/**
* trySort: Tente de trier de manière aléatoire la liste donnée en paramètre.
*/
List *trySort(List *l)
{
List *l2 = new List();
while (l->Count() > 0)
{
unsigned long random = rand() % l->Count();
ListItem *li = l->Get(random);
if (li == nullptr)
{
throw invalid_argument("Impossible de charger l'item");
}
unsigned long value = li->Value();
l2->Add(new ListItem(value));
l->Remove(random);
}
return l2;
}
/**
* Point d'entrée principal.
*/
int main(int argc, char *argv[])
{
// Initialisation des nombres aléatoires.
srand(getSeed());
// A besoin d'un paramètre exactement.
if (argc != 2)
{
usage(argv);
}
// Vérification du paramètre
for (size_t i = 0; i < strlen(argv[1]); ++i)
{
char data = argv[1][i];
// Vérifie que tout les carachères sont des nombres
if (data < 48 || data > 57)
{
usage(argv);
}
}
unsigned long max;
// Vérifie que le nombre n'est pas trop grand
try
{
max = stoul(argv[1]);
}
catch(const std::exception& e)
{
usage(argv);
}
cout << "Max: " << max << endl;
List *l = new List();
// Création d'une liste ordonnée avec chaque entier de 0 à max - 1
for (unsigned long i = 0; i < max; ++i)
{
l->Add(new ListItem(i));
}
cout << "Liste initiale (triée): ";
l->Show();
l = trySort(l);
bool isSorted = l->IsSorted();
unsigned long tried = 1;
cout << "Liste randomisée: ";
l->Show();
while (isSorted == false)
{
l = trySort(l);
tried++;
cout << "Liste courante: ";
l->Show();
isSorted = l->IsSorted();
}
cout << "Triée en " << tried << " étapes" <<endl;
return EXIT_SUCCESS;
}