Skip to content
Extraits de code Groupes Projets
Valider ed54db46 rédigé par Charline Zgajewski Delforge's avatar Charline Zgajewski Delforge
Parcourir les fichiers

push main.c

parent c7678355
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Pipeline #2292 en échec
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.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
if (number != 2 ) {
if (number % 2 == 0) { // si il n'est pas divisible par deux pas besoin de regarder les nombres paires
return 0 ;
}
}
for (int i = 3 ; i <= number / 2 ; i = i + 2) { //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) { // initialsier ma liste avec un premier noued
list_t *liste = malloc(sizeof(*liste)) ;
struct node *nouveau = malloc(sizeof(*nouveau)) ; // allouer de la memoire pour nouveau
if (nouveau == NULL || liste == NULL) { // si malloc ne focntionne pas
return NULL ;
}
nouveau -> nombre_premier = (int *) value; // donne la valeur au noued
nouveau -> next = NULL ; // suivant est NULL
liste -> head = nouveau ; // donne une valeur a head
liste -> size = liste -> size + 1 ;
return liste ;
}
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 enmagasiner les différents nombres premiers
int premier = 0 ; //pour que se soit le premier de La liste
list_t *list = NULL ;
for (int i = 2 ; i <= number / 2 ; 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) ; // 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)
{
int val = (int) noued->nombre_premier;
printf("%d ", val);
noued = noued -> next;
}
printf("NULL\n");
}
int 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 1;
}
char *line = malloc(sizeof(char[50])) ; // j'alloue de la memoire pour line
while (fgets (line, sizeof(char[50]), 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 = malloc(sizeof(char[50])) ;
/*É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,(char *) nombre, sizeof(char[50])) ;
/*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
*/
fprintf(fichier_sortie, "%d ",nombre) ; // Ecriture dans le fichier
list_t *liste = prime_divs(nombre) ;
if (liste == NULL) {
fputc('\n', fichier_sortie);
continue ;
}
else {
node_t *noued = liste -> head;
while (noued != NULL)
{
//char *nombre_devient_char = malloc(sizeof(char[50]));
//memcpy(nombre_devient_char,(char*) noued -> nombre_premier, sizeof(char[50])) ;
fprintf(fichier_sortie, "%d ",(int) noued -> nombre_premier) ;
/* https://www.geeksforgeeks.org/fprintf-in-c/
* int fprintf (FICHIER * fptr, const char * str, ...);
* fprintf est utilisé pour imprimer le contenu dans un fichier au lieu de la console standard.
*/
noued = noued -> next;
}
fputc('\n', fichier_sortie);
}
}
fclose(fichier_entree) ;
fclose(fichier_sortie) ;
return 0 ;
}
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
afficherListe(liste) ;
int oui = ecrire_dans_fichier("input.txt","output.txt") ;
printf("%d",oui) ; //0
return 0;
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter