#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <setjmp.h>
#include <iostream>
#include <wchar.h>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
#include <string>
Fonctions | |
| bool | doInteger (int parameter) |
| Calculs sur les entiers. | |
| bool | doLong (int parameter) |
| Calculs sur les entiers longs. | |
| bool | doDouble (int parameter) |
| Calculs sur les doubles. | |
| bool | doIO (int parameter) |
| Ecriture d'un fichier d'un pattern composé d'une ligne de lettres contenant des caractères accentués. | |
| bool | doMatrix (int parameter) |
| Simple multiplication de deux matrices carrées. | |
| bool | doVector (int parameter) |
| Création de deux vecteurs et divers opérations pour passer des éléments de l'un à l'autre. | |
| bool | doSort (int n) |
| Tri d'un tableau d'ordre inversé par rapport à l'objectif. | |
| bool | doException (int parameter) |
| Génére un nombre important d'exceptions dans une boucle. | |
| bool | doHash (int parameter) |
| Ici on cré une table de hash<int,int> initialisé à FACTOR*parameter valeurs entières. | |
| bool | doTrigo (int parameter) |
| Fonctions mathématiques et trigonométriques. | |
| bool | doConcatenation (int parameter) |
| Concaténation de n chaines en une seule. | |
| bool | doLoop (int parameter) |
| 6 boucles imbriquées. | |
| int | main (int argc, char *argv[]) |
| Procédure principale de lancement d'un test. | |
| bool doConcatenation | ( | int | parameter | ) |
Concaténation de n chaines en une seule.
Pour être plus juste par rapport à l'immutabilité des chaînes dans les langages Java et C#, ce sont les versions bufferisées qui sont utilisées.
| parameter | nombre de concaténations. |
00361 { 00362 static const string PATTERN= "éàôabcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh"; 00363 string result=""; 00364 for (int i=0; i < parameter; i++) { 00365 result+=PATTERN; 00366 } 00367 00368 return result.length() == parameter*PATTERN.length() && result.substr(result.length() - PATTERN.length()) == PATTERN; 00369 }
| bool doDouble | ( | int | parameter | ) |
| bool doException | ( | int | parameter | ) |
Génére un nombre important d'exceptions dans une boucle.
| parameter | nombre d'itérations. |
00271 { 00272 int count=0; 00273 for (int i=0; i < parameter; i++) { 00274 try 00275 { 00276 if ((i % 2) == 0) { 00277 exception e; 00278 throw e; 00279 } 00280 } 00281 catch (exception &e) 00282 { 00283 count++; 00284 } 00285 } 00286 return count==parameter/2; 00287 }
| bool doHash | ( | int | parameter | ) |
Ici on cré une table de hash<int,int> initialisé à FACTOR*parameter valeurs entières.
Ensuite on énumère ces valeurs pour les ajouter dans une seconde hash avec une clef % FACTOR.
| parameter | La taille de la hash / FACTOR |
00296 { 00297 const int FACTOR = 100; 00298 const int ITEMS = FACTOR*parameter; 00299 map <int, int> hash1; 00300 map <int, int> hash2; 00301 int c = 0; 00302 00303 for (int i=0; i<ITEMS; i++) { 00304 hash1.insert(map <int, int>::value_type(i, i) ); 00305 } 00306 00307 map <int, int> :: iterator h1_it; 00308 map <int, int> :: iterator h2_it; 00309 for (h1_it = hash1.begin() ; h1_it != hash1.end(); h1_it++) { 00310 int key=h1_it->first; 00311 int v1 = (int) h1_it->second; 00312 int key2=key % FACTOR; 00313 h2_it=hash2.find(key2); 00314 if (hash2.end()!=h2_it) { 00315 int v2 = (int) h2_it->second; 00316 v1 += v2; 00317 } 00318 hash2.insert(map <int, int>::value_type(key2, v1) ); 00319 } 00320 return hash2.size()==FACTOR; 00321 }
| bool doInteger | ( | int | parameter | ) |
| bool doIO | ( | int | parameter | ) |
Ecriture d'un fichier d'un pattern composé d'une ligne de lettres contenant des caractères accentués.
Ensuite relecture du même fichier ligne par ligne.
| parameter | Nombre d'itérations |
00091 { 00092 const string PATTERN= "éàôabcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh"; 00093 const string FILE_NAME="../tmp/test_cpp.txt"; 00094 00095 ofstream writer(FILE_NAME.c_str()); 00096 for (int i=0; i<parameter; i++) { 00097 writer << PATTERN << endl; 00098 } 00099 writer.close(); 00100 00101 ifstream reader(FILE_NAME.c_str()); 00102 string line; 00103 for (int i=0; i<parameter; i++) { 00104 reader >> line; 00105 if (line != PATTERN) { 00106 return false; 00107 } 00108 } 00109 reader.close(); 00110 00111 return true; 00112 }
| bool doLong | ( | int | parameter | ) |
Calculs sur les entiers longs.
| parameter | Nombre d'itérations |
00056 { 00057 long result = 1; 00058 for (int i = 1; i < parameter; i++) { 00059 result -= i; 00060 result += i; 00061 result *= i; 00062 result /= i; 00063 } 00064 return result == 1; 00065 }
| bool doLoop | ( | int | parameter | ) |
6 boucles imbriquées.
| parameter | nombre d'itérations à chaque étage |
00377 { 00378 int a, b, c, d, e, f; 00379 double x = 0; 00380 for (a = 0; a <= parameter; a++) { 00381 for (b = 0; b <= parameter; b++) { 00382 for (c = 0; c <= parameter; c++) { 00383 for (d = 0; d <= parameter; d++) { 00384 for (e = 0; e <= parameter; e++) { 00385 for (f = 0; f <= parameter; f++) { 00386 x = a + b + c + d + e + f; 00387 } 00388 } 00389 } 00390 } 00391 } 00392 } 00393 return x == 6 * parameter; 00394 }
| bool doMatrix | ( | int | parameter | ) |
Simple multiplication de deux matrices carrées.
L'utilisation des (new) permet d'être plus juste avec les autres langages.
| parameter | taille de la matrice |
00121 { 00122 // Create the the matrix 00123 int **m1= new int*[parameter]; 00124 int **m2= new int*[parameter]; 00125 int count = 1; 00126 for (int i = 0; i < parameter; i++) { 00127 m1[i] = new int[parameter]; 00128 m2[i] = new int[parameter]; 00129 for (int j = 0; j < parameter; j++) { 00130 m1[i][j] = count; 00131 m2[i][j] = 0; 00132 count++; 00133 } 00134 } 00135 00136 00137 // Create inversion matrix 00138 for (int i = 0; i < parameter; i++) { 00139 m2[i][parameter - i - 1] = 1; 00140 } 00141 00142 00143 // Multiply them 00144 int **mm= new int*[parameter]; 00145 ; 00146 for (int i = 0; i < parameter; i++) { 00147 mm[i] = new int[parameter]; 00148 for (int j = 0; j < parameter; j++) { 00149 int val = 0; 00150 for (int k = 0; k < parameter; k++) { 00151 val += m1[i][k] * m2[k][j]; 00152 } 00153 mm[i][j] = val; 00154 } 00155 } 00156 00157 00158 // Check inversion 00159 for (int i = 0; i < parameter; i++) { 00160 for (int j = 0; j < parameter; j++) { 00161 if (mm[i][j] != m1[i][parameter - j - 1]) { 00162 return false; 00163 } 00164 } 00165 } 00166 00167 // Free memory 00168 for (int i = 0; i < parameter; i++) { 00169 delete [] m1[i]; 00170 delete [] m2[i]; 00171 delete [] mm[i]; 00172 } 00173 delete [] m1; 00174 delete [] m2; 00175 delete [] mm; 00176 00177 return true; 00178 }
| bool doSort | ( | int | n | ) |
Tri d'un tableau d'ordre inversé par rapport à l'objectif.
| n | Taille du tableau |
00221 { 00222 int *ra = new int[n + 1]; 00223 for (int i = 0; i <= n; i++) { 00224 ra[i] = n - i; 00225 } 00226 int i, j; 00227 int ir = n; 00228 int l = (n >> 1) + 1; 00229 int rra; 00230 00231 for (;;) { 00232 if (l > 1) { 00233 rra = ra[--l]; 00234 } else { 00235 rra = ra[ir]; 00236 ra[ir] = ra[1]; 00237 if (--ir == 1) { 00238 ra[1] = rra; 00239 break; 00240 } 00241 } 00242 i = l; 00243 j = l << 1; 00244 while (j <= ir) { 00245 if (j < ir && ra[j] < ra[j + 1]) { 00246 ++j; 00247 } 00248 if (rra < ra[j]) { 00249 ra[i] = ra[j]; 00250 j += i = j; 00251 } else { 00252 j = ir + 1; 00253 } 00254 } 00255 ra[i] = rra; 00256 } 00257 for (i = 1; i < n; i++) { 00258 if (ra[i] > ra[i + 1]) { 00259 return false; 00260 } 00261 } 00262 return true; 00263 }
| bool doTrigo | ( | int | parameter | ) |
Fonctions mathématiques et trigonométriques.
| parameter | itéartions sur le test |
00329 { 00330 00331 double sine = 0.0; 00332 double cosine = 0.0; 00333 double tangent = 0.0; 00334 double logarithm = 0.0; 00335 double squareRoot = 0.0; 00336 double cumul = 0; 00337 double full = 8 * atan(1); 00338 for (int i = 0; i < parameter; i++) { 00339 double angle = 0; 00340 while (angle < full) { 00341 sine = sin(angle); 00342 cosine = cos(angle); 00343 tangent = tan(angle); 00344 cumul += sine + cosine + tangent; 00345 angle++; 00346 } 00347 logarithm = log(i+1); 00348 squareRoot = sqrt(i+1); 00349 cumul += logarithm + squareRoot; 00350 } 00351 return cumul != 0; 00352 }
| bool doVector | ( | int | parameter | ) |
Création de deux vecteurs et divers opérations pour passer des éléments de l'un à l'autre.
| parameter | taille des vecteurs. |
00187 { 00188 vector<int> Li1; 00189 for (int i = 0; i < parameter; i++) 00190 Li1.push_back(i); //addlast 00191 00192 vector<int> Li2=Li1; 00193 vector<int> Li3; 00194 00195 while (!Li2.empty()) { 00196 Li3.push_back((int)*Li2.begin() ); //addlast 00197 Li2.erase(Li2.begin()); 00198 } 00199 00200 while (!Li3.empty()) { 00201 Li2.push_back( (int)*(Li3.end()-1) ); //addlast 00202 Li3.erase(Li3.end()-1); 00203 } 00204 00205 vector<int> tmp; 00206 while (!Li1.empty()) { 00207 tmp.insert(tmp.begin() , (int)Li1[0]); //addfirst 00208 Li1.erase(Li1.begin()); 00209 } 00210 Li1 = tmp; 00211 00212 return (int)(Li1[0]) == parameter-1; 00213 }
| int main | ( | int | argc, | |
| char * | argv[] | |||
| ) |
Procédure principale de lancement d'un test.
00399 { 00400 char * testName = argv[1]; 00401 int parameter=atoi(argv[2]); 00402 bool result = false; 00403 clock_t startTime = clock(); 00404 00405 if (strcmp("Double", testName)==0) { 00406 result=doDouble(parameter); 00407 } else if (strcmp("Long", testName)==0) { 00408 result=doLong(parameter); 00409 } else if (strcmp("Integer", testName)==0) { 00410 result=doInteger(parameter); 00411 } else if (strcmp("Trigo", testName)==0) { 00412 result=doTrigo(parameter); 00413 } else if (strcmp("Loop", testName)==0) { 00414 result=doLoop(parameter); 00415 } else if (strcmp("IO", testName)==0) { 00416 result=doIO(parameter); 00417 } else if (strcmp("Exception", testName)==0) { 00418 result=doException(parameter); 00419 } else if (strcmp("Hash", testName)==0) { 00420 result=doHash(parameter); 00421 } else if (strcmp("Concatenation", testName)==0) { 00422 result=doConcatenation(parameter); 00423 } else if (strcmp("Matrix", testName)==0) { 00424 result=doMatrix(parameter); 00425 } else if (strcmp("Vector", testName)==0) { 00426 result=doVector(parameter); 00427 } else if (strcmp("Sort", testName)==0) { 00428 result=doSort(parameter); 00429 } 00430 clock_t stopTime = clock(); 00431 if (!result) { 00432 wprintf(L"-1\n"); 00433 } else { 00434 double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0); 00435 long l = (long)elapsedTime; 00436 wprintf(L"%d\n",l); 00437 } 00438 return 0; 00439 }
1.5.5