From 304eed3d420e2857b2351770d58895d2216addb2 Mon Sep 17 00:00:00 2001 From: zgajewskidec <corentin.zgajewski@student.uclouvain.be> Date: Thu, 19 Mar 2020 15:28:03 +0100 Subject: [PATCH] premiere validation de mon commit --- projet_3.c | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 projet_3.c diff --git a/projet_3.c b/projet_3.c new file mode 100644 index 0000000..2e16d84 --- /dev/null +++ b/projet_3.c @@ -0,0 +1,188 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <io.h> +#include <sys/stat.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 ecrire_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)) ; + } +} +int main() { + // 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; +} \ No newline at end of file -- GitLab