2017-10-16 8 views
1

Nous vous remercions de votre aide à l'avance. Je dois commencer à programmer en Pascal et, honnêtement, ce n'est pas très agréable de changer de Java et de Python. J'ai essayé un programme simple pour retourner GCD, mais la console ne restera même pas ouverte malgré la lecture à la fin.Pascal - Plus grand diviseur commun - Pas de sortie

program App1Learning; 

var 
    a, b : integer; 

begin 
    read(a); 
    read(b); 
    while a <> b do 
    begin 
    if a < b then b := b - a; 
    if a > b then a := a - b; 
    end; 
    writeln(a); 
    readln; 
end. 
+0

J'ai essayé le débogage en ajoutant des writelns partout et en quelque sorte réussi à le réparer en ajoutant un readln après avoir lu les arguments ... Je ne comprends tout simplement pas de ceci ... read (a); lire (b); readln; –

+0

'Read (A)' lit un nombre mais ne passe pas à la ligne suivante. Je préfère utiliser 'Readln (A)', pour obtenir un nombre par ligne. Ceci est différent de Java, mais je ne trouve pas non plus la manière Java très intuitive. –

+1

Quel Pascal utilisez-vous? FreePascal, Delphi, GNU Pascal, quoi? Il existe des différences, en particulier dans les fonctionnalités les plus avancées. –

Répondre

1

Ne sachant pas que vous Pascal utilisez, j'ai essayé cela dans FreePascal 3.0.0 pour Windows:

program App1Learning; 

var 
    a, b : integer; 

begin 
    readln(a); 
    readln(b); 
    // Or, instead of the two previous lines: readln(a, b); 
    while a <> b do 
    begin 
    if a < b then b := b - a; 
    if a > b then a := a - b; 
    end; 
    writeln(a); 
    readln; 
end. 

Read(), tout cela dépend de l'entrée ligne en mémoire tampon, ne pas attendre pour un retour chariot , donc il va lire deux chiffres mais ne consomme pas le retour chariot final, c'est à dire c'est toujours dans le tampon d'entrée. Après que le programme calcule le GCD et l'affiche, le retour chariot qui est encore dans le tampon sera immédiatement lu par le readln final, ainsi la console se ferme juste après (readln ne doit pas attendre un retour chariot, car il est déjà — ou encore — dans le tampon).

Si vous utilisez readln(a); etc, chaque nombre sera entré sur sa propre ligne et la fonction attend un retour chariot et le consomme. Cela signifie que le dernier readln ne trouvera pas de retour chariot dans le tampon d'entrée, il attendra jusqu'à ce que vous appuyiez sur Entrez.

+0

J'utilise Lazarus. Le problème est que lorsque j'utilise read (a, b) ou read (a); lire (b); la console apparaît à chaque fois. J'ai essayé de mettre des entrées dans un et des lignes séparées dans les deux cas. Pas de chance. Cependant, lorsque j'utilise readline, que ce soit pour a, b ou séparément, cela fonctionne, pas de problème du tout. Je ne comprends pas vraiment où est la prise. Même s'il y avait une faute, j'ai un commentaire à la fin, alors pourquoi est-ce que ça s'arrête comme ça? Aucune exception, rien. Juste ... pouf. –

+0

@SamuelNovelinka: comme je l'ai dit, si vous utilisez 'Read()', la nouvelle ligne est laissée dans le tampon, prête à être consommée par le 'readln' final. Cela signifie que Readln ne doit pas attendre que vous appuyez sur Entrée et la fenêtre de la console se ferme immédiatement. ** En d'autres termes, si vous utilisez 'Read', le dernier' Readln' trouve déjà un retour chariot dans le buffer et n'en attend plus un. ** –

+0

Oh, je le sais. Merci beaucoup. Cela signifierait-il qu'une seconde lecture juste après ferait l'affaire? Je sais que cela semble quelque peu amateur, et je n'ai pas l'intention de l'utiliser, je veux juste m'assurer que j'ai bien compris. –