Nombre premier [Résolu]

Signaler
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
-
Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015
-
Bonjour, j'ai aussi cela :

programme premier
nombre, diviseur : entier
debut
diviseur ß 2
tantque nombre mod diviseur <> 0 et diviseur < nombre
diviseur ß diviseur + 1
fintantque
si diviseur = nombre alors
afficher nombre, " est premier"
sinon
afficher nombre, " n'est pas premier"
finsi
fin


et j'ai codé ça :
// -- Programme principal --
int main () {
	
	// -- déclarations --
	int nbre, diviseur = 2 ;
	
	// Recherche d'un nombre premier 
	while (nbre/diviseur != 0 && diviseur > nbre ) {
		diviseur = diviseur + 1 ;
	}
	if (diviseur = nbre) {
		printf(" le nombre est premier ") ;
	}else{
		printf(" le nombre n'est pas premier ") ;
	}
	
	return 0 ;
	
}

Mais quand j'éxecute, il m'affiche directement : le nombre est premier, il me passe tout le reste et la par contre je ne comprend pas pourquoi.................:(
A voir également:

13 réponses

Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
Bonjour.

Attention à ne pas confondre l'affectation (via "=") et la comparaison (via "=="). Si tu as activé les warnings, le compilateur devrait te le dire quand tu fais ce genre d'erreur. S'il te le dit déjà et que tu ignores les warnings, eh bien... considère toujours un warning comme une erreur :).

Quelques remarques (facultatives, sans importances):
  • Accolades non nécessaires si tu n'as qu'une seule instruction.
  • N'oublie pas l'include de stdio.h (le C est permissif, ce qui fait que ça compile quand même).



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
pour le stdio.h ne t'inquietes pas car je ne l'oublie jamais, pour le = et == comme tu l'as bien expliqué, j'ai mieux compris, effectivement j'ai un warning, au niveau du if !
Il me dit : suggest parentheses around assignment used as truth value
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
9
Bonjour,

en plus tu ne passeras jamais dans le while car tu n'initialise pas nbre qui vaut donc toujours 0
et donc nbre/diviseur aussi

Bonne jounée
Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015

Complètement faux. nbre n'est pas initialisé, et peut donc valoir n'importe quoi.
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Ah oui bien vu, j'avais carrément pas fait attention
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
suggest parentheses around assignment used as truth value


Je t'explique l'erreur, et le message du compilateur. La traduction (non littérale) donnerait ceci: "Il est suggéré de mettre des parenthèses supplémentaires lorsque l'on assigne une valeur au sein d'une structure de contrôle".

En effet, en C, lorsque l'on fait "a = b", c'est une affectation. Faire une affectation, renvoie la valeur de la variable fraîchement affectée. Je sais que c'est bizarre, mais quand on assigne une valeur, on fait une action, et cette action renvoie quelque chose.

Donc écrire ceci:
if (a = b)
  printf("ok\n");


équivaut à ceci:

a = b;
if (a)
  printf("ok\n");


Comme en C, confondre = et == est un classique, la norme du C demande à ce qu'on prouve qu'on n'ait pas confondu "=" et "==", en ajoutant des parenthèses supplémentaires. Donc quand tu vois ce warning, soit tu t'es trompé entre = et ==, soit tu dois ajouter des parenthèses supplémentaires pour dire: "je ne me suis pas trompé, je veux vraiment faire une affection dans mon if".

Exemple où c'est pratique (lire les lignes d'un fichier, tant qu'il n'y a pas d'erreurs):
int res = 0;
char line[32] = {0};
while ((res = fscanf(file, "%s\n", line)))
  printf("%s\n", line);

Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Oula oui mais en plus, il passe directement a : le nombre n'est pas premier ! Il me saute tous mon while, comme la dit cgandco, ma variable (nbre) n'est pas initialisé, mais en plus je ne lui dis jamais : "Entrez un nombre" etc...............
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
J'ai des questions spécifiques par rapport a ton bout de code, celui sur la lecture des lignes d'un fichier :
_ Quand doit t'on utiliser fscanf et a quoi il serre ?
_ A quoi correspond "%s" et quand l'utiliser ?
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
On sort un peu du sujet, mais je vais tout de même t'expliquer.

Quand doit t'on utiliser fscanf et a quoi il serre ?

fscanf est l'une des fonctions de lecture d'une ligne formatée, à partir d'un fichier. Je t'ai donné un petit exemple qui n'avait pas forcément de lien avec le sujet initial.

A quoi correspond "%s" et quand l'utiliser ?


Réponse courte: À une chaîne de caractères.

Réponse longue:
La famille des *scanf (scanf, sscanf, fscanf, etc...) et des *printf (printf, fprintf, sprintf, etc...) utilisent tous les mêmes formatages de conversions. Il suffit alors de la lire la documentation pour comprendre comment utiliser ces transformateurs.
Voir les doc suivantes:


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
9
Tu as aussi inversé ta condition dans le while

tu as mis

diviseur > nbre

qui sera toujours faux si nbre > 3 au départ

donc pas de bouble while

Bonne journée
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Tu initialise bien diviseur = 2.........................? Mais nbre on l'initialise a cb ? Moi j'ai mis nbre = 1 !
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Par contre même en rectifiant diviseur > nbre par diviseur < nbre il ne rentre toujours pas dans le while................... :(
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
Tu as le bon algo généraliste écrit, et tu as juste à le transcrire en C. Je t'invite à bien relire le code et l'énoncé (et être plus rigoureux sur ce point), car il est évident que le pseudo-code n'a pas été recopié correctement (utilisation de > au lieu de <, utilisation de / au lieu de %).

Voici le code corrigé:
#include <stdio.h>

int main()
{
  int nbre = 0;
  int diviseur = 2;

  printf("Entrez un nombre: ");
  scanf("%i", &nbre);

  while (nbre % diviseur != 0 && diviseur < nbre)
    diviseur++;

  if (diviseur == nbre)
    printf("Le nombre est premier\n");
  else
    printf("Le nombre n'est pas premier\n");

  return 0;
}

Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Alors pour le diviseur < nbre, j'avais corrigé, ensuite pour le signe de division entière apparemment je me suis planté donc merci de rectifier, et pour l'affichage d'un nombre comme ca n'étais pas marquer dans l'algorithme je ne l'avais pas fait meme en meme temps avec le bon sens effectivement c'est impératif ! C'est con parce que sur certaines choses que je te présente, hormis quelques grosse erreurs j'y suis presque ^^