Tres Grands Débutants - Recherche nombres premiers [C++] - Programmation
Marsh Posté le 24-05-2001 à 18:18:18
Voici une version qui fonctionne, j'ai legerement retouche ton programme.
#include <iostream>
//partie comparaison
bool compare(int nombre_y, int z)
{
if (nombre_y % z == 0)
return true;
else
return false;
}
//partie test
void test(int nombre_a)
{
int limite= nombre_a-1;
int b;
for (b=2; b<limite ; b++)
if (compare(nombre_a,b)==true) break;
if (b==limite) // Tous les tests ont echoue, on est alle jusqu'a la fin de la boucle
cout << nombre_a << " est premier" << endl;
}
// partie principale
void main()
{
int limite;
cout << "Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;
cin >> limite;
for (int nombre=1; nombre <= limite; nombre ++)
test (nombre);
}
Marsh Posté le 24-05-2001 à 18:24:14
Le probleme de return que t'annonce le compilateur, c'est que tu definis tes fonctions comme des int fonction(), donc elles doivent retourner un int.
Si tu ne veux rien retourner, il faut les definir en void, comme la fonction test ou main.
D'autre part y avait pas mal de trucs inextricables dans ton programme, donc je l'ai relativement modifie. La fonction compare renvoie desormais un booleen (vrai ou faux), suivant que nombre_a est divisible par b ou non.
La fonction test fonctionne ainsi : elle teste un a un les potentiels diviseurs, si jamais compare compare renvoie 'true', le break indique que l'on sort de la boucle for sans la terminer.
Le test suivant est alors tout bete : si b==limite, ca veut dire que toute la boucle for a ete parcourue, et donc que le nombre est premier.
J'espere que ces maigres explications pourront t'aider
Et pour augmenter la rapidite du programme, tu peux fixer limite a sqrt(nombre_a)+1. Dans ce cas il faudra include la librairie 'math.h'.
Ou encore dans la boucle for, ne tester que les nombres impairs, apres avoir fait un cas particulier pour 2 (qui n'est pas reconnu comme un nombre premier par le programme actuel).
avec un for (b=3; b<limite; b=b+2);
Marsh Posté le 24-05-2001 à 18:26:42
bah voila je crois avoir trouvé (je débute aussi en c++).
de tes fonctions comme par exemple : void test(int nombre_a)
sont de types void, c à dire qu'elles ne retournent pas de valeurs.
Par contre int compare(int nombre_y, int z)
elle est censée retourner un entier (int ...) et pour retourner cet entier tu dois justement mettre return [valeur ou variable](mais apparemment t'en a pas besoin donc a la place de int ... met void ...)
bon je sais c pas très clair mais en espérant avoir pu t'aider...
@+
Marsh Posté le 24-05-2001 à 18:33:59
#include <iostream>
#include <math.h>
// Retourne 'true' si nombre_a est premier, 'false' sinon
bool est_premier(int nombre_a)
{
if (nombre_a < 4) return true; // 1,2,3 sont premiers
if (nombre_a % 2 == 0) return false; // Cas des nombres pairs
int b, limite= 1+ (int) sqrt(nombre_a);
for (b=3; b<limite; b+=2) // On ne teste que les nombres impairs
if (nombre_a % b == 0) return false;
return true;
}
void main()
{
int limite;
cout << "Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;
cin >> limite;
for (int nombre=1; nombre<= limite; nombre++)
if (est_premier(nombre))
cout << nombre << " est premier\n";
}
Marsh Posté le 24-05-2001 à 18:50:19
merci beaucoup pour votre aide, j'avais pas du tout penser au booleen, et pourtant ca apparait clairement comme la meilleure solution...
encore merci
Marsh Posté le 24-05-2001 à 19:59:45
vous avez des idées de progs relativement simple pour débuter ?
Marsh Posté le 24-05-2001 à 20:05:45
Je pense que tu pourrais faire des trucs tout simple en OpenGL, y a des tutoriaux un peu partout sur le net... et puis c moins rebarbatif que de faire un programme de gestion de bibliotheque ou autre...
Genre faire tourner un cube, se deplacer dans un monde en 3D, et en plus ca t'obligera a utiliser des structures de donnees pour gerer des donnees geometriques
Marsh Posté le 24-05-2001 à 20:51:27
si tu penses que c'est abordable je te crois, mais c'est assez impressionant (voire intimidant)
Marsh Posté le 24-05-2001 à 21:06:27
Je tiens a te preciser que la programmation en C++ que tu dis avoir commencer... ce n est pas de la programmation C++
C est juste de la programmation en C au quelle tu t aides des facilites du C++, utilisation de cin et de cout
La vrai programmation C++ fait intervenir les classes... tu dois encore apprendre avant de dire que tu programmes en C++
Marsh Posté le 24-05-2001 à 21:16:50
pour le coup du c / c++ je te rassure je suis au courant, j'ai un ami qui a bossé sur du RSA en C et je sais ce que c'est
disons que le c++ facilite un peu la syntaxe, mais les classes je vais y venir, tout doucement...
Marsh Posté le 25-05-2001 à 11:20:17
Salut,
moi je ne réponds pas du point de vue info, le C++ c'est pas mon truc.
En revanche il me semble que t'as pas fait beaucoup de maths !!!
En effet pour tester si un nombre est premier il est INUTILE de tester ses diviseurs de 1 à lui-même !!!
1) tu testes s'il est pair ou pas : s'il est pair il est pas premier!! (sauf 2 évidemment)
2) il suffit de tester jusqu'à racine carrée de n (où n est le nombre que tu testes) : je ne vais pas rentrer dans les explications mais si n est ton nombre un nombre plus grand que racine carrée de n ne pourra jamais diviser n.
3) Dès que tu as un diviseur, ce n'est pas la peine de continuer à tester les divisibilités : de toute façon il est pas premier, puisque divisible au moins par un nombre.
Voilà rien qu'avec ces deux tests, ton algo va être optimisé!!!!
PS : pour plus de détail, voir un cours d'ALGEBRE sur les nombres premiers.
Marsh Posté le 25-05-2001 à 11:21:50
resalut,
oups j'avais sauté une ligne de code : t'as déjà éliminé les nombres pairs, autant pour moi!!!
Marsh Posté le 25-05-2001 à 11:26:49
je pense que le programme que j'ai ecrit plus haut correspond a toutes tes remarques...
Marsh Posté le 25-05-2001 à 11:32:27
Xavier_OM a écrit a écrit : vous avez des idées de progs relativement simple pour débuter ? |
Bonjour juste pour dire que pour commencer en progrmmation faire de l'openGl c'est pas terrible mais ca le devient apres.
Pour commencer il y a les algos de tri qui sont pas mal à faire
(tri bulle, quick sort et compagnies). Je pense que l'openGL vient par la suite quand on commence a bien maitriser le c/c++.
Marsh Posté le 25-05-2001 à 13:00:23
pour les algos de tri, je vais essayer de me renseigner la dessus.
pour davidmarli, je te rassure je sais tout ca (je suis pas mauvais en maths) mais en étant à mon 2eme prog (ben oui 2 c tout) j'ai préféré tout tester plutot que d'éliminer les cas improbables, par peur de compliquer mon prog en m'avançant dans un truc mal maitrisé (dans ma tête j'aurai optimiser après, bien que la puissance des pc actuels soit enorme, mais ce cher tgrx s'en est occupé tres gentillement)
Marsh Posté le 24-05-2001 à 17:55:32
Bonjour messieurs du forum prog.
Alors voila avant toute chose sachez que je me suis mis à la prog hier, et que je commence par le c++ (bah autant faire les choses bien)
Alors ce matin j'ai fais un prog ou on entre des notes et si on tape -1 il affiche la moyenne, la note la plus haute et la plus basse.
Apres ce difficile succès, j'ai voulu tester un peu les boucles, alors je me suis dis on va faire un prog de calcul de nombres premiers...
Voila mon idée :
on prend un nombre limite
on cherche les nombres premiers entre 1 et cette limite
1 nb:
-on teste
-si il est premier on l'affiche et on passe au suivant
-sinon on passe au suivant sans afficher
pour tester :
on compare le nombre avec tout ceux compris entre 1 et lui
si il est divisible par 1 et par lui et par un autre il est pas premier
sinon il l'est
pour tester la divisibilité :
je prend le module des 2 nombres, si il est egal a 0 le nb est divisible, sinon non.
pour le moment ca donne ca :
#include <iostream.h>
//partie comparaison
int compare(int nombre_y, int z)
{
int mod;
mod = nombre_y % z;
if (mod==0)
{
cout<<"Le nombre est divisible par "<<z<<" et donc pas premier"<<endl;
}
else cout<<nombre_y<<" est premier"<<endl; // on ne peut pas diviser pas ce chiffre, test avec la valeur suivante.
}
//partie test
int test(int nombre_a)
{
int b;
for (b==2; b==(nombre_a-1); b++)
{
compare (nombre_a,b);
}
}
// partie principale
void main()
{
int nombre;
int limite;
cout<<"Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;
cin>>limite;
for (nombre==1; nombre==limite; nombre ++)
{
test (nombre);
cout<<nombre<<"est premier"<<endl;}
}
qu'en pensez-vous ? je sais pas trop comme débloquer mon prog, il me dit a la compilation que g un pb de return.
Merci d'avance.
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.