void methode3 (retour * monRetour, int * T, int paramk, int paraml, bool verb) { // diviser pour régner Diviser la sequence en 2, calculer la sous sequence gauche puis droite puis une qui contient l'élement du milieu puis prendre le max des 3 // implémentation du cours "Structures de données et algorithmes" de Pierre Geurts diapo 33 http://www.montefiore.ulg.ac.be/~geurts/Cours/sda/2011/06-resolution-a.pdf // methode 3 = O(nlogn) bool subverb = verb; if(DEBUG == true){printf("METHODE 3\n");} moitie(monRetour, T, paramk, paraml, subverb); if (verb == true) { printRetour(monRetour); } }
void moitie (retour * monRetour, int * T, int paramk, int paraml, bool verb) { bool subverb = verb; if (paramk == paraml) { monRetour->k = paramk; monRetour->l = paraml; monRetour->somme = T[paramk]; } else { int mid = (int) ((paramk + paraml)/2); retour retourGauche; moitie(&retourGauche, T, paramk, mid, subverb); retour retourDroit; moitie(&retourDroit, T, mid + 1, paraml, subverb); retour retourMid; milieu(&retourMid, T, paramk, mid, paraml, subverb); if (retourGauche.somme >= retourDroit.somme && retourGauche.somme >= retourMid.somme) { monRetour->k = retourGauche.k; monRetour->l = retourGauche.l; monRetour->somme = retourGauche.somme; if (DEBUG == true) {printf("moitie gauche, somme : %d\n", monRetour->somme);} } else if (retourDroit.somme >= retourGauche.somme && retourDroit.somme >= retourMid.somme) { monRetour->k = retourDroit.k; monRetour->l = retourDroit.l; monRetour->somme = retourDroit.somme; if (DEBUG == true) {printf("moitie droite, somme : %d\n", monRetour->somme);} } else { monRetour->k = retourMid.k; monRetour->l = retourMid.l; monRetour->somme = retourMid.somme; if (DEBUG == true) {printf("moitie milieu, somme : %d\n", monRetour->somme);} } } if (verb == true) { printf("Moitié "); printRetour(monRetour); } }
/* Donne dans le tp. Par la suite, on n'utilise plus cette fonction */ int copier_bmp(int de, int vers){ unsigned char *pixels; entete_bmp entete; /* lecture du fichier source */ lire_entete(de, &entete); pixels = allouer_pixels(&entete); lire_pixels(de, &entete, pixels); /* écriture du fichier destination */ rouge(&entete, pixels); negatif(&entete, pixels); moitie(&entete, pixels,1); sepia(&entete, pixels); noir_et_blanc(&entete, pixels); ecrire_entete(vers, &entete); ecrire_pixels(vers, &entete, pixels); /* on libère les pixels */ free(pixels); return 1; /* on a réussi */ }
int main(int argc, char **argv) { /* Pas d'argument */ if (argc == 1) usage(argv[0]); /* Initialisation */ int c; char *nom = NULL; int de = open("lena.bmp", O_RDONLY); entete_bmp entete; unsigned char *pixels; if (de < 0){ printf("erreur fichier entree\n"); exit(EXIT_FAILURE); }else{ /* Lecture du fichier source */ lire_entete(de, &entete); pixels = allouer_pixels(&entete); lire_pixels(de, &entete, pixels); } while ((c = getopt(argc, argv, "rnbmia")) != -1) { switch (c) { case 'r': rouge(&entete, pixels); break; case 'n': negatif(&entete, pixels); break; case 'b': noir_et_blanc(&entete, pixels); break; case 'm': moitie(&entete, pixels, 1); break; case 'i': moitie(&entete, pixels, 0); break; case 'a': sepia(&entete, pixels); break; default : tuto(argv[0]); break; } } /* Lecture de l'option facultative (nom fichier) */ int index; for (index = optind; index < argc; index++) { if (nom == NULL) nom = argv[index]; else printf ("L'option %s a été ignoré.\n", argv[index]); } /* On écrit dans le fichier de destination */ int vers; if (nom == NULL) vers = open("lena_out.bmp", O_WRONLY | O_CREAT, 0644); else vers = open(nom, O_WRONLY | O_CREAT, 0644); if (vers < 0){ printf("erreur fichier sortie\n"); exit(EXIT_FAILURE); }else{ /* Écriture du fichier destination */ ecrire_entete(vers, &entete); ecrire_pixels(vers, &entete, pixels); } /* On libère les pixels */ free(pixels); return EXIT_SUCCESS; }