Nombre premier [Résolu]

TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 12:31 - Dernière réponse : dragonjoker59 93 Messages postés samedi 26 mars 2005Date d'inscription 23 septembre 2015 Dernière intervention
- 23 sept. 2015 à 17:19
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.................:(
Afficher la suite 

Votre réponse

14 réponses

cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - Modifié par cptpingu le 22/09/2015 à 14:02
0
Merci
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
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 14:26
0
Merci
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
Commenter la réponse de TheRogerFederer
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 22 sept. 2015 à 14:29
0
Merci
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
dragonjoker59 93 Messages postés samedi 26 mars 2005Date d'inscription 23 septembre 2015 Dernière intervention - 23 sept. 2015 à 17:19
Complètement faux. nbre n'est pas initialisé, et peut donc valoir n'importe quoi.
Commenter la réponse de cgandco
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 14:39
0
Merci
Ah oui bien vu, j'avais carrément pas fait attention
Commenter la réponse de TheRogerFederer
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - 22 sept. 2015 à 14:40
0
Merci
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);

Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 15:03
0
Merci
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...............
Commenter la réponse de TheRogerFederer
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 15:06
0
Merci
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 ?
Commenter la réponse de TheRogerFederer
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - Modifié par cptpingu le 22/09/2015 à 15:13
0
Merci
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
Commenter la réponse de cptpingu
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 22 sept. 2015 à 15:15
0
Merci
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
Commenter la réponse de cgandco
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 15:36
0
Merci
Tu initialise bien diviseur = 2.........................? Mais nbre on l'initialise a cb ? Moi j'ai mis nbre = 1 !
Commenter la réponse de TheRogerFederer
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 15:39
0
Merci
Par contre même en rectifiant diviseur > nbre par diviseur < nbre il ne rentre toujours pas dans le while................... :(
Commenter la réponse de TheRogerFederer
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - 22 sept. 2015 à 15:50
0
Merci
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;
}

Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 22 sept. 2015 à 16:07
0
Merci
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 ^^
Commenter la réponse de TheRogerFederer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.