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

Langage Pascal Discussion :

[LG]Calcul des 15 premiers nombres premiers


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut [LG]Calcul des 15 premiers nombres premiers
    Bonjour,

    Je suis en train de faire un petit exo du livre de delannoy qui consite à calculer les 15 premiers nombres premiers.
    Remarque: n est premiers si il n'est divisible par aucun nombre premiers(1 exclu) infférieur ou égal à la racine carré ce n.
    J'ai ecrit un petit progrramme qui marche pas
    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
     
    program main;
    const k=15;
    type Tableau_premier= array[1..k] of integer;
    var Tab_prems :TAbleau_premier;
    var j,i,memo,nb_premier:integer;
     
    begin
       writeln('Ce programme calcule les 15 premiers nombres premiers. ');
       memo:=2;
       nb_premier:=7;
       tab_prems[1]:=3;
       for i:=2 to k do
       begin
          repeat
             if nb_premier mod TAb_prems[memo]<>0 then
                memo:=memo+1         
             else
                exit;
          until memo>=trunc(sqrt(nb_premier)+1);
       if memo>=trunc(sqrt(nb_premier)+1) then tab_prems[i]:=nb_premier;
       nb_premier:=nb_premier+1;
       end;
    for j:=1 to k do writeln(tab_prems[j]);
    end.
    Ca compile mais ca ne s'execute pas ca marque
    Runtime error 200 at 0x08052EA5
    0x08052EA5
    0x080480B0
    Voila si vous savez ce qui cloche dans ce programme. Repondez moi S'il vous pllait
    Amicalement
    Yffick

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut Re: Calcul des 15 premiers nombres premiers
    Citation Envoyé par Yffick
    Ca compile mais ca ne s'execute pas ca marque
    Runtime error 200 at 0x08052EA5
    0x08052EA5
    0x080480B0
    La version de TP que tu as est-elle patchée ?

    Une page qui peut t'interessé :
    http://turbo-pascal.developpez.com/
    Citation Envoyé par Haypo
    Avec les processeurs rapides (200 Mhz et plus), l'unité "Crt.tpu" (contenu dans le fichier TP\BIN\turbo.tpl) produit une division par zéro : le programme se bloque sur le texte "Runtime error 200 at xxxxxxx".
    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Salut,
    En fait j'utilise pas TP7 mais Freepascal sous linux. Et pour mes programmes précedent j'ai jamais eu cette erreur.
    Comprend pas
    Sinon du point de vue de l'algorithme y a t il des erreurs :
    merci d'avance
    à+

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Le problème vient de l'instruction mod, que tu utilises dans le if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if nb_premier mod TAb_prems[memo]<>0 then ...
    Tu initialise ta variable memo à 2, donc lors de l'entrée de la boucle, memo vaut deux. Or il semblerait que ton tableau tab ne soit pas initialisé, donc tab[2] vaut 0 (en théorie, tab[2] est "indéfinie", mais il prends souvent la valeur 0 dans ce cas...). Il y a donc une division par 0 lors du mod (mod effectue une division, car c'est le résultat de mod est le reste dans la division euclidienne). L'erreur viendrait à priori de là !

    Tu peux soit initialiser ton tableau, soit supprimer la ligne (car je ne suis pas sûr de son utilité en fait), soit être inventif...

    a+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Au bout de 3 heures j'ai regarder la solution mais ca ne marche pas non plus
    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
     
    program main;
    const k=15;
     
    type Tableau_premier= array[1..k] of integer;
    var Tab_prems :TAbleau_premier;
    var i,nb_trouve,nb:integer;
    var premier:boolean;
     
    begin
     
       nb_trouve:=1;
       Tab_prems[1]:=2;
       nb:=3;
       writeln('Ce programme calcule les 15 premiers nombres premiers');
       repeat
           premier:=true;
           i:=1;
           repeat
              if nb mod tab_prems[i] =0 then premier:=false;
    	  i:=i+1;
           until (i>nb_trouve) or premier=false;
           if premier then 
              begin
              nb_trouve:=nb_trouve+1;
    	  Tab_prems[nb_trouve]:=nb;
              end;
           nb:=nb+2;
        until nb_trouve=k;
    writeln('les ', k ,' premiers nombres premiers sont : ');
    for i:=1 to k  do
       begin
       write(tab_prems[i]:6);
       end;
    end.
    voila ca me met toujours Runtimme error 200
    ESt ce que ca marche chez vous :
    Merci d'avance
    A+
    Yffick

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Le problème est exactement le même. Au premier tour de ta boucle repeat, i vaut 1 et tab[i] vaut 2. Or au second tour de boucle, i vaut i+1 soit 2, mais tab[i] vaut 0. Donc il y a division par 0, donc exception... Initialises tout ton tableau avec des 2 avant de rentrer dans ta boucle !

    a+

  7. #7
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Il y'a un exercice qui traite des nombres premiers dans la pages des Exercices Pascal. Tu peux le consulter à cette adresse :
    http://pascal.developpez.com/exercic...=Sect4#tabprem

    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    Au premier tour de ta boucle repeat, i vaut 1 et tab[i] vaut 2. Or au second tour de boucle, i vaut i+1 soit 2,
    il ya pas de second tour dans la boucle car a la fin du premier tour de la boucle i est incremente et vaux 2 et cela valide la condition de sortie de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    i:=1;
           repeat
              if nb mod tab_prems[i] =0 then premier:=false;
    	  i:=i+1;
           until (i>nb_trouve) or premier=false;
    Car nb_trouve est initialisé a 1 au debut du programme.

    De toute facon, merci quand meme Wormfull_sickfoot, j' ai initialisé mon tableau comme tu me l'as conseiller malgre ca ca ne fonctionne toujours pas.
    Il y'a un exercice qui traite des nombres premiers dans la pages des Exercices Pascal.
    Merci du tuyau King Kaiser je vais jeter un oeil
    Voila en tout cas toute nouvelle aide est la bienvenue il faut dire que j'apprend et que j'ai un peu de mal
    A+
    yffick

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Voila j'ai reussi à trouver ma solution, (grace à l'exo) je vous la donne.
    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
     
    program main;
    const k=10;
    type TAbleau=array[1..k] of integer;
    var tab:tableau;
    var nb,nb_trouve,i:integer;
    var premier:boolean;
    begin
        for i:=1 to k do TAb[i]:=2;
        nb:=3;
        nb_trouve:=1;
     
        repeat
           i:=2;
           premier:=true;   
           repeat
               if nb mod i =0 then premier:=false;
    	   i:=i+1
           until (i>=nb) or not premier;
           if premier then 
             begin
               nb_trouve:=nb_trouve +1;
               TAb[nb_trouve]:=nb;
    	 end;
           nb:=nb+2;
        until (nb-10)/2>=k;
     
        for i:=1 to  k do write(' ',tab[i],' ');
        writeln;
        readln;
     
    end.
    Voila une derniere fois à vous
    a+
    yffick

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Je viens de tester exactement ton programme et il se trouve qu'il ne sort pas du repeat, donc il fait deux tours ou plusieurs tours de boucle... Le problème vient donc de la condition d'arrêt de l'instruction repeat until. En effet, les parenthèses sont mal formées. Remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    until (i>nb_trouve) or premier=false;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    until ((i>nb_trouve) or (premier=false));
    De manière générale, il faut faire très attention avec les parenthèses, car elles peuvent être interprétées différemment par les compilateurs... Le principe est de parenthéser chaque terme, et ensuite regrouper le tout dans une grande parenthèse. L'écriture est lourde mais au moins ca fonctionne.

    Tu peux rajouter un readln à la fin de ton programme pour voir le résultat de l'exécution avant que le programme ne se termine.

    Au fait il marche ton programme, j'ai testé

    a+

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Ah


  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    et Worms.
    Je me disais bien que la faute ne venait pas de la correction de l'exo mais de moi dans la correction il met not premier et moi j'ai un peu modifié ca par mégarde.
    Ca m'apprendra à faire dans l'exotisme.
    Encore merci pour tout je sens que je progresse et ca fait plaisir
    A+

  13. #13
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Avec plaisir, reviens nous voir si tu as d'autres problèmes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 10 premiers nombres premiers
    Par gameplow dans le forum Débuter
    Réponses: 2
    Dernier message: 16/11/2013, 21h25
  2. Réponses: 5
    Dernier message: 25/01/2008, 12h32
  3. [défi n°8]: premiers nombres premiers
    Par javatwister dans le forum Général JavaScript
    Réponses: 41
    Dernier message: 14/06/2005, 10h22
  4. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

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