IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Nombres premiers/Mon premier programme/cherche conseils


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Jaenne
    Femme Profil pro
    AVS
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : AVS

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut Nombres premiers/Mon premier programme/cherche conseils
    Salut,
    J'apprends le C grâce au livre open source "Le C en 20h" que je trouve génial. Je me suis un peu trop prise au jeu pour un programme qui n'a pas vraiment de correction prévue.
    Avez vous des idées pour améliorer ce programme ? La fonction getchar() en particulier me pose quelques soucis. Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <math.h>
    #include <ctype.h>
     
    int main () {
    	printf("\nNombres premiers.\n\n");
    	char sortie=' ';
     
     
    	while (sortie!='S'){
    		int nombre = 1;
    		printf ("\nEntrez un nombre.\n\n");
    		scanf ("%d", & nombre);
     
     
    		int diviseur =2;
    		int modulo =1;
     
    		while (diviseur >1&& modulo !=0) {
    			//Pour eviter une erreur avec 1,2,3.
    			if (nombre<4){
    				diviseur=1;
    				modulo=1;
    			}
     
    			else	{
                                    //Pour eviter une perte de temps en calculs.
    				diviseur = nombre/2;
    				while (diviseur >1&& modulo !=0) {
    					nombre/diviseur;
    					modulo = nombre%diviseur;
    					printf("\n%d : %d = %d reste %d\n",nombre,diviseur,nombre/diviseur, nombre%diviseur);
    					diviseur--;
     
    				}
    			}
     
    		}
     
     
    		if (modulo == 0){
    			printf("\n%d n'est pas premier.\n", nombre);
    		}
     
    		else {
    			printf ("\n%d est premier.\n", nombre);
    		}
     
    		printf("\nTapez S pour sortir.\n\n");
    		sortie = getchar () ;
    		sortie = toupper (sortie);
     
     
    	}
     
    	printf ("\nMerci d'avoir joue.\n\n");
     
    	return 0;
    }

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Voici quelques idées pour améliorer ton programme :

    • la ligne nombre/diviseur; ne fait rien, supprime-la et compile avec les avertissements (-pedantic -Wall -Wextra) ;
    • la notion de nombre premier n'a de sens qu'au sein de l'ensemble des entiers naturels : utilise donc des entiers non signés ;
    • oublie l'interactivité en ligne de commande.. c'est complexe, fastidieux et peu portable : lis plutôt tes paramètres depuis argv, effectue les calculs que ton programme est sensé réaliser puis termine, confie l'interactivité (si elle est indispensable) à un script shell ;
    • détecte les overflows (dépassements de capacité) lorsque l'on fournit des nombres trop grands au programme : utilise strtoul pour la conversion ;
    • ne fais pas d'entrée-sortie (surtout non bufferisée ou avec '\n') dans la boucle de calcul, c'est très lent : pour en avoir une idée, compile ton programme avec les optimisations (-O2) et teste-le avec et sans le printf central, tu vas être étonnée (si tu dois afficher une information de progrès, ne le fais pas à chaque tour de boucle).


    C'est un début très correct.

  3. #3
    Membre averti Avatar de Jaenne
    Femme Profil pro
    AVS
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : AVS

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Merci pour ta réponse détaillée.

    Je suis pas sûre de tout comprendre alors je vais tenter de reformuler :

    1 quand je compile je dois utiliser la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o programme1 programme1.c -lm -pedantic -Wall -Wextra
    2 pour utiliser des nombres non signés, je rajoute une ligne type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (nombre <=0)
        printf ("message d'erreur");
    et je corrige au passage pour le nombre 1 qui n'est pas premier...

    3 a l'air d'être une fonction ou un argument ?. Il faut que je me renseigne dessus.
    Un shell serait mieux pour recueillir des info de l'utilisateur. C'est un fichier avec du code qui n'a pas besoin d'être compilé. Type Python ?
    Est-ce que c'est utilisé sur Arduino ou est-ce surtout utile pour des programmes type jeux, logiciels... ?

    4 est un pointeur ? Qui sert à définir des intervalles pour un fonctionnement correcte du programme si j'ai bien compris ?
    Ça veut dire string tool ? Je garde ça en tête pour plus tard.

    5 tous les affichages en cours de calcul ralentissent le calcul. A éviter surtout quand ils ne sont pas nécessaires comme ici.
    Je peux utiliser la commande de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o programme1 programme1.c -lm -02
    pour que les calculs s'effectuent en mémoire tampon. Sûrement pour accélérer le processus.


    J'ai l'impression d'essayer de courir sans savoir déjà marcher.

    N'hésitez pas à corriger mes erreurs de compréhension et autres merci d'avance.

    Si un modérateur passe dans le coin : merci de déplacer mon sujet dans la section débutant.. j'ai posté trop vite. désolée.

  4. #4
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par défaut
    bonjour
    2)les nombres non signés sont de type unsigned int
    3) la declaration de main est: int main(int argc,char * argv[])
    donc argv est un tableau de char *,c'est les differents arguments en parametre de ta ligne de commande,argv[0] est le programme lui meme et argv[1] le premier argument en parametre s'il y en a un.
    4)strtol est une fonction qui convertit une chaine de caractères char * en long (regarde sur google.fr ou qwant.com,ton moteur de recherche)

  5. #5
    Membre averti Avatar de Jaenne
    Femme Profil pro
    AVS
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : AVS

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Salut,

    2 J'ai l'impression que j’aurai gagné du temps avec unsigned int Le point positif c'est qu'en faisant pleins d'erreurs je vais apprendre pleins de choses !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include <ctype.h>
     
    int main () {
    	printf("\nNombres premiers.\n\n");
    	char sortie=' ';
     
     
    	while (sortie!='S'){
    		int nombre = 1;
    		printf ("\nEntrez un nombre.\n\n");
    		scanf ("%d", & nombre);
     
     
    		int diviseur =2;
    		int modulo =1;
     
    		while (diviseur <nombre/2 && modulo !=0) {
    			if (nombre<5){
    				//Pour eviter des erreurs avec 0,1,2,3,4 et negatifs.
    				modulo=0;
     
     
    			}
     
    			else	{
    				//Pour eviter une perte de temps en calculs.
    				while (diviseur <nombre/2 && modulo !=0) {
    					modulo = nombre%diviseur;
    					diviseur++;
     
    				}
    			}
     
    		}
     
     
    		if (modulo == 0 || nombre<=1 || nombre ==4){
     
    			if (nombre<0)
    				//negatifs.
    				printf("\nVous ne pouvez pas entrer un nombre negatif.\n\n");
     
    			else
    				if (nombre <=1)
    					//1 et 0.
    					printf("\n%d n'est ni un nombre premier ni un nombre compose.\n", nombre);
    				else 
    					//Nombres composés.
    					printf("\n%d est un nombre compose.\n\n", nombre);
    		}
     
    		else 
    			//nombres premiers
    			printf ("\n%d est un nombre premier.\n", nombre);
     
     
    		printf("\nTapez S pour sortir.\n\n");
    		sortie = getchar () ;
    		sortie = toupper (sortie);
     
     
    	}
     
    	printf ("\nA bientot.\n\n");
     
    	return 0;
    }
    3 Quand on déclare main on peut (doit ?) déclarer des arguments. C'est pour retourner ces mêmes arguments en sortie ?
    J'irai checker sur mon moteur de recherche (Duck duck go ) avec 4 strtol.

    Merci.

  6. #6
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par défaut
    3) c'est au cas où tu veuilles utiliser des arguments en parametres de ton programme ce qui t'etait suggéré et c'est d'ailleurs la signature preferable de main il me semble

Discussions similaires

  1. [Conseils/Aide] Structure de mon premier programme
    Par Invité2 dans le forum Débuter
    Réponses: 44
    Dernier message: 13/09/2008, 14h08
  2. mon premier programme j2me
    Par adilo dans le forum Java ME
    Réponses: 1
    Dernier message: 14/09/2006, 08h43
  3. [JDOM] Mon premier programme java-xml
    Par adilo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 12/07/2006, 13h12
  4. [Language] Aide sur mon premier programme Java?
    Par hash2zo dans le forum Langage
    Réponses: 15
    Dernier message: 27/09/2005, 19h26
  5. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo