diff --git a/projet_3.c b/projet_3.c deleted file mode 100644 index e0dd7973b2775ab4f08c1d2961550ebfb54dcd7b..0000000000000000000000000000000000000000 --- a/projet_3.c +++ /dev/null @@ -1,259 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <io.h> -#include <sys/stat.h> -#include <sys/mman.h> -#include <unistd.h> - -int is_div(int number, int i) { // Vérifie si i est un diviseur de number. - return (number % i == 0) ; // revoi 0 si le nombre n'est pas divisible par i et 1 si il est divisible -} - -int is_prime(int number) { // Vérifie si number est un nombre premier. Return 1 si il est premier, 0 sinon - for (int i = 2 ; i < number ; i++) { //regarde les differents nombres pouvant etre diviser number - if (is_div(number,i) == 1) { // si i peut diviser number - return 0 ; //renvoi 0 => FAUX - } - } - return 1 ; //sinon => VRAI -} - -// travail en likendList -typedef struct node { // creation d'un node - struct node *next; // prochain - int *nombre_premier; // nombre_premier -}node_t; - -typedef struct list { - int size; // taille de mon noeud - node_t *head ; // tete de mon noeud -} list_t; - -list_t *init_node(int value, struct list *list) { // initialsier ma liste avec un premier noued - - struct node *nouveau = malloc(sizeof(*nouveau)) ; // allouer de la memoire pour nouveau - if (nouveau == NULL) { // si malloc ne focntionne pas - return NULL ; - } - nouveau -> nombre_premier = (int *) value; // donne la valeur au noued - list -> head = nouveau ; // donne une valeur a head - list -> size = list -> size + 1 ; - nouveau -> next = NULL ; // suivant est NULL - return list ; -} - -void add_node(list_t *list, int value) { // si ne fonctionne pas 1 sinon 0 - struct node *nouveau = malloc(sizeof(*nouveau)) ; // allouer de la memoire pour nouveau - if (nouveau == NULL) { // si malloc rate - return ; - } - if (list == NULL) { - return; - } - nouveau -> nombre_premier = (int *) value ; // donne une valuer a nouveau - nouveau -> next = list -> head ; // ajoute son pointeur - list -> head = nouveau ; - list -> size = list -> size + 1 ; // augmente la taille de la liste -} - - -list_t * prime_divs(int number) { - // creation d'une stack pour emagasiner les différents nombre premier - int premier = 0 ; //pour que se soit le premier de La liste - list_t *list = NULL ; - for (int i = 2 ; i < number ; i++) { - if (is_prime(i) == 1 && is_div(number , i) == 1) { // si i est premier et divise number - if (premier == 0) { // si c'est le premier nombre initialise ma liste - list = init_node(i,list) ; // j'initialise ma liste - premier = 1 ; // ne reviens plus ici - } - else { - add_node(list,i) ; // je le mets dans ma liste - } - } - } - return list ; -} - -void *afficherListe(list_t *liste) { // afficher la liste - - if (liste == NULL) { - exit(EXIT_FAILURE); - } - - node_t *noued = liste -> head; - - while (noued != NULL) - { - printf("%d ", noued -> nombre_premier); - noued = noued -> next; - } - printf("NULL\n"); -} - -void lecrire_dans_fichier(char *input, char *output) { - int fichier_entree = open(input,O_RDONLY) ; // ouverture de fichier en mode lecture - // O_RDONLY , O_WRONLY ou O_RDWR . - // respectivement l'ouverture du fichier en lecture seule, en écriture seule ou en lecture / écriture. - struct stat memoire ; // création de l'espace de la mémoire - if (fstat(fichier_entree,&memoire)) { - close(fichier_entree) ; - return; - } - /*fstat () obtient des informations d'état sur l'objet spécifié par le descripteur de descripteur ouvert et stocke les informations - * dans la zone de mémoire indiquée par l' argument tampon - * (Entrée) Le descripteur pour lequel les informations doivent être récupérées. - * (Sortie) Un pointeur vers un tampon de type struct stat dans lequel les informations sont retournées. - * Valeur de retour => 0 fstat () a réussi. Les informations sont renvoyées dans la mémoire tampon . - * => -1 fstat () n'a pas réussi. La variable globale errno est définie pour indiquer l'erreur. - */ - int fichier_sortie = open(output,O_WRONLY,|O_TRUNC|O_CREAT) ; // ouverture du fichier en mode ecriture - if (fichier_entree == -1 || fichier_sortie == -1) { // si les fichier ne s'ouvrent pas correctement - return; - } - int check = ftruncate(fichier_sortie, memoire.st_size) ; - if (check == -1) { - close(fichier_entree) ; - close(fichier_sortie) ; - return; - } - - char *line = malloc(sizeof(int)) ; // j'alloue de la memoire pour line - while (fgets (line, sizeof(int), (FILE *) fichier_entree) != NULL) { // lire les ligne du fichier input - // https://openclassrooms.com/forum/sujet/lire-un-fichier-ligne-a-ligne-48056 - int nombre = strtol(line,NULL,0) ; - // Cette fonction, signifiant string to long, permet de transformer une chaîne de caractères, contenant - // la représentation textuelle d'un entier, en un entier type long. - void* mapping = mmap(NULL, sizeof(int),PROT_WRITE,MAP_SHARED,fichier_sortie,0) ; - /*Établir ne projection en mémoire des fichiers ou des périphériques ( - en qq sorte le malloc des fichier - argument : - 1er => L'adresse de départ de la nouvelle projection - 2eme => longueur - 3eme => PROT_WRITE On peut écrire dans la zone mémoire. - 4eme => MAP_SHARED Partager cette projection. - 5eme => fihcier - 6eme => ? - mmap() renvoie un pointeur sur la zone de mémoire, s'il réussit. En cas d'échec il retourne la valeur MAP_FAILED (c'est-à -dire (void *) -1) - http://manpagesfr.free.fr/man/man2/mmap.2.html - */ - memcpy(mapping,line, sizeof(int)) ; - /*void * memcpy (void * dest, const void * src, size_t n) copie n caractères de la zone mémoire src vers la zone mémoire dest . - argument : - dest - Il s'agit du pointeur vers le tableau de destination où le contenu doit être copié, transtypé en un pointeur de type void *. - src - Il s'agit d'un pointeur vers la source des données à copier, transtypées en un pointeur de type void *. - n - Il s'agit du nombre d'octets à copier. - Cette fonction renvoie un pointeur vers la destination - https://www.tutorialspoint.com/c_standard_library/c_function_memcpy.htm - */ - fputc((int) mapping, (FILE *) fichier_sortie) ; // Ecriture dans le fichier - list_t *liste = prime_divs(nombre) ; - if (liste == NULL) { - continue ; - } - else { - node_t *noued = liste -> head; - while (noued != NULL) - { - char *nombre_devient_char = NULL; - sprintf(nombre_devient_char, "%d", noued -> nombre_premier) ; - fputc((int) nombre_devient_char, (FILE *) fichier_sortie) ; - noued = noued -> next; - } - printf("\n"); - } - munmap(mapping, sizeof(int)) ; - } -} - -void ecrire_dans_fichier(char *input, char *output) { // => en utilisant FILE on a plusieurs fonctions qui facilitenet la vie - - FILE * fichier_entree = NULL ; - fichier_entree = fopen(input, "r+") ; - // "r+": lecture et écriture. Vous pourrez lire et écrire dans le fichier. - // Le fichier doit avoir été créé au préalable. - FILE * fichier_sortie = NULL ; - fichier_sortie = fopen(output, "w+") ; - //"w+": lecture et écriture, avec suppression du contenu au préalable. - // Le fichier est donc d'abord vidé de son contenu, vous pouvez y écrire, - // et le lire ensuite. Si le fichier n'existe pas, il sera créé. - if (fichier_entree != NULL || fichier_sortie != NULL) { // si ca ne va pas - return; - } - - char *line = malloc(sizeof(int)) ; // j'alloue de la memoire pour line - while (fgets (line, sizeof(int), fichier_entree) != NULL) { - - int nombre = strtol(line,NULL,0) ; - // Cette fonction, signifiant string to long, permet de transformer une chaîne de caractères, contenant - // la représentation textuelle d'un entier, en un entier type long. - - void* mapping = mmap(NULL, sizeof(int),PROT_WRITE,MAP_SHARED,fichier_sortie,0) ; - /*Établir ne projection en mémoire des fichiers ou des périphériques ( - en qq sorte le malloc des fichier - argument : - 1er => L'adresse de départ de la nouvelle projection - 2eme => longueur - 3eme => PROT_WRITE On peut écrire dans la zone mémoire. - 4eme => MAP_SHARED Partager cette projection. - 5eme => fihcier - 6eme => ? - mmap() renvoie un pointeur sur la zone de mémoire, s'il réussit. En cas d'échec il retourne la valeur MAP_FAILED (c'est-à -dire (void *) -1) - http://manpagesfr.free.fr/man/man2/mmap.2.html - */ - - memcpy(mapping,line, sizeof(int)) ; - /*void * memcpy (void * dest, const void * src, size_t n) copie n caractères de la zone mémoire src vers la zone mémoire dest . - argument : - dest - Il s'agit du pointeur vers le tableau de destination où le contenu doit être copié, transtypé en un pointeur de type void *. - src - Il s'agit d'un pointeur vers la source des données à copier, transtypées en un pointeur de type void *. - n - Il s'agit du nombre d'octets à copier. - Cette fonction renvoie un pointeur vers la destination - https://www.tutorialspoint.com/c_standard_library/c_function_memcpy.htm - */ - - fputc((int) mapping, fichier_sortie) ; // Ecriture dans le fichier - list_t *liste = prime_divs(nombre) ; - if (liste == NULL) { - continue ; - } - else { - node_t *noued = liste -> head; - while (noued != NULL) - { - char *nombre_devient_char = NULL; - sprintf(nombre_devient_char, "%d", noued -> nombre_premier) ; - /* https://www.geeksforgeeks.org/sprintf-in-c/ - * int sprintf (char * str, const char * string, ...) - Au lieu d'imprimer sur la console, il stocke la sortie sur le tampon de caractères spécifié dans sprintf - */ - fputc((int) nombre_devient_char, fichier_sortie) ; - noued = noued -> next; - } - printf("\n"); - } - munmap(mapping, sizeof(int)) ; - } -} -/*int main(int argc, char *argv[]) { - // test pour is_div(int number, int i) - int number = 10 ; - int number1 = 11 ; - int i = 2 ; - printf("%d\n",is_div(number,i)) ; // 1 - printf("%d\n",is_div(number1,i)) ; // 0 - // test pour is_prime(int number) - int number2 = 1498498411 ; - int number3 = 5 ; - int number4 = 14545144 ; - printf("%d\n",is_prime(number2)) ; // 0 - printf("%d\n",is_prime(number3)) ; // 1 - printf("%d\n",is_prime(number4)) ; // 0 - //prime divis - int numbre5 = 14 ; - list_t *liste = prime_divs(numbre5) ; - // je ne vois pas pq ca ne fonctionne pas - printf("%d\n",afficherListe(liste)) ; - return 0; -}*/