Nombre premier

Résolu
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - 22 sept. 2015 à 12:31
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015 - 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.................:(

13 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 22/09/2015 à 14:02
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
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
22 sept. 2015 à 14:26
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
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
22 sept. 2015 à 14:29
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
0
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
23 sept. 2015 à 17:19
Complètement faux. nbre n'est pas initialisé, et peut donc valoir n'importe quoi.
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
22 sept. 2015 à 14:39
Ah oui bien vu, j'avais carrément pas fait attention
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 sept. 2015 à 14:40
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);

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

0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
22 sept. 2015 à 16:07
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 ^^
0
Rejoignez-nous