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

Turbo Pascal Discussion :

Mon programme s'arrête tout seul [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Mon programme s'arrête tout seul
    Bonjour/Bonsoir,

    Je suis nouveau sur ce forum et j'ai grandement besoin de votre aide sur Turbo Pascal.

    En effet, j'ai écrit un programme récemment qui s'arrête tout seul à mi chemin...


    Alors pour expliquer :
    J'ai écrit un programme qui me permet de trouver des paires de nombres amicaux et parfaits. Je ne sais pas si vous voyez ce que c'est.

    En fait, quand on fait la somme des diviseurs stricts d'un nombre A, on tombe sur un nombre B, et quand on fait la somme des diviseurs stricts du nombre B, on retombe sur le nombre A.
    (Les diviseurs stricts d'un nombres sont tous les diviseurs hormis ce nombre lui-même.
    Ex : diviseurs stricts de 6 : 1,2,3
    On constate que 6 est un nombre parfait car on retombe sur lui)

    Le principe est de tester tous les entiers à partir de 4 (le premier entier qui n'est pas un "nombre premier") jusqu'à tomber sur soit un nombre parfait, soit une paire de nombres amicaux.

    Enfin voilà, le problème c'est qu'à partir de 960, le programme s'arrête...
    J'ai bien essayé de mettre des "longint" à la place des "integer" pour les variables, mais ça ne change rien...

    Enfin, voilà mon programme :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    program nombres_amis(output);
    uses crt;
    type tableau = array [1..20] of longint;
    type tableau2 = array [1..20] of longint;
    var x,y,test,nombre,nombre2,indice,somme_div,somme_div2,boucle:longint;
    var a : tableau;
    var b : tableau2;
     
    begin
    clrscr;
    textcolor(white);
     
    {Nettoyage de la m‚moire}
    x:=0;
    y:=0;
    test:=0;
    nombre:=0;
    nombre2:=0;
    indice:=0;
    somme_div:=0;
    somme_div2:=0;
    boucle:=0;
     
                  {====CHOIX DU NOMBRE====}
                         nombre:=497;
     
    repeat
    clrscr;
     
    {///////////////////////////PARTIE 1////////////////////////}
     
    writeln('nombre : ',nombre);
     
    {J'initialise les variable et le tableau}
    x:=2;
    for indice:=1 to 20 do a[indice]:=0;
    indice:=1;
    y:=nombre div 2;
     
    {Je test pour trouver les diviseurs}
    for x:= 2 to y do
    begin
    test:= nombre mod x;
        if test=0 then
        begin
        a[indice]:=x;
        indice:= indice+1;
        end
    end;
     
    {je fais la somme des diviseurs}
    somme_div:=0;
    for indice:= 1 to 20 do somme_div:= somme_div+a[indice];
    somme_div:=somme_div+1;
     
    writeln('somme des diviseurs ',somme_div);
     
    {///////////////////////////PARTIE 2////////////////////////}
     
    nombre2:=somme_div;
     
    {J'initialise les variable et le tableau}
    x:=2;
    for indice:=1 to 20 do b[indice]:=0;
    indice:=1;
    y:=nombre2 div 2;
     
    {Je test pour trouver les diviseurs}
    for x:= 2 to y do
    begin
    test:= nombre2 mod x;
        if test=0 then
        begin
        b[indice]:=x;
        indice:= indice+1;
        end
    end;
     
    {je fais la somme des diviseurs}
    somme_div2:=0;
    for indice:= 1 to 20 do somme_div2:= somme_div2+b[indice];
    somme_div2:=somme_div2+1;
     
     
    writeln('somme des diviseurs ',somme_div2);
     
    {Je test l'‚galit‚ pour sortir de la boucle}
    boucle:=0;
    if nombre=somme_div2 then boucle:=boucle+1;
     
     
    {J'incr‚mente le nombre principale d'1}
    nombre:=nombre+1;
     
     
    until boucle=1;
     
    readln;
    nombre:=nombre-1;
    writeln(nombre);
    readln;
     
    end.
    (apparemment le spoiler ne fonctionne pas ici ?)

    Enfin, si vous avez une idée d'où ça peut bloquer, dites-moi svp.

    Merci d'avance

    EDIT : merci pour les balises CODE

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Il y aurait beaucoup de rangement et d'optimisations à faire dans ton code.

    Mais bon, la réponse est évidente : 960 a 26 diviseurs stricts !

    Ce qui fait que tes tableaux ne sont pas assez grands...

    Je m'étonne d'ailleurs que ça ne plante pas déjà à 720, qui a 28 diviseurs stricts, ou a 840, qui en a 30. Je n'ai pas regardé de près, mais vérifie bien tes algorithmes.

    Petit lien utile pour ton projet (pour vérification) :

    http://fr.wikipedia.org/wiki/Table_des_diviseurs


    D'ailleurs, plus tu avanceras dans les nombres, plus tu trouveras d'entiers ayant un grand nombre de diviseurs.

    Pense à l'opportunité d'utiliser des pointeurs plutôt que des tableaux statiques.

    Enfin, les traitements que tu fais sur a et sur b sont exactement les mêmes, c'est l'occasion d'écrire une seule procédure pour les deux.

    PS : effectivement, ce n'est pas [spoiler] ici, mais [code] ... [/code].

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ta réponse !

    En fait, au niveau des tableaux, je venais tout juste d'apprendre comment en faire, et je ne savais pas trop comment faire pour mettre a et b en une ligne...

    Et c'est vrai qu'à certains endroits, je pourrais optimiser le code. Par exemple, la variable nombre_div et nombre2 qui est la même en fait.

    Et sinon, pour la longueur des tableaux je n'avais pas du tout fait attention !
    Le programme plantait déjà à 720 ou avant, je ne sais plus, mais là je le relançais à partir de 920 et quelque donc c'est pour ça.

    Je m'en vais tester ça de suite !

    A bientôt et encore merci !


    EDIT : ça marche impec'

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

Discussions similaires

  1. [PC fixe] Mon ordinateur s'arrête tout seul.
    Par zilis dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 22/01/2011, 19h27
  2. mon portable s'arrête tout seul
    Par tsague dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 07/05/2008, 11h40
  3. mon pc s'eteind tout seul
    Par philippe123 dans le forum Ordinateurs
    Réponses: 8
    Dernier message: 28/01/2006, 18h58
  4. Ma base s'arrête toute seule
    Par Mcpanch dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/01/2006, 15h57
  5. tester si mon programme a liberer toute la memoire
    Par Mokhtar BEN MESSAOUD dans le forum C
    Réponses: 2
    Dernier message: 14/11/2005, 16h55

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