Problème de saisie de flottants en COBOL

Et dire que ce n'est que le début...

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour, je suis en train de suivre le cours de COBOL et j’en suis au premier exercice.

Le programme que j’ai fonctionne (il compile, s’exécute et fait la multiplication) mais la saisie des deux nombres à multiplier est buguée.

Le programme en question :

       IDENTIFICATION DIVISION.
       PROGRAM-ID. exo.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 a PIC 9(2)v9.
       77 b PIC 9(2)v9.
       77 result PIC 9(3)v9.
       screen section.
       1 pla-titre.
              2 blank screen.
              2 line 1 col 1 value 'Multipliation'.
       1 pls-nombres.
              2 line 4 col 2 value 'Nombre 1 : '.
              2 PIC 9(2)v9 to a required.
              2 line 5 col 2 value 'Nombre 2 : '.
              2 PIC 9(2)v9 to b required.
       1 pla-resultat.
              2 line 7 col 2 PIC 9(2)v9 from a.
              2 col 7 value 'x'.
              2 col 9 PIC 9(2)v9 from b.
              2 col 13 value '='.
              2 col 15 PIC 9(3)v9 from result.
           
       PROCEDURE DIVISION.
       display pla-titre.
       display pls-nombres.
       accept pls-nombres.
       compute result = a * b.
       display pla-resultat.

       END PROGRAM exo.

Lorsque l’on rentre un chiffre dans la première ou la deuxième case puis que l’on appuie sur Enter ou Tab, le chiffre rentré disparaît. C’est très désagréable, puisque au lieu d’avoir un maximum de 99,9×99,9 on a un maximum de 90,0×99,0.

Ils ne savaient pas que c’était impossible alors ils l’ont fait Mark Twain

+0 -0
Auteur du sujet

PROCEDURE DIVISION. ….. compute result = a * b. ….

:-°

@Zérotisme

Je te suggère d’aller lire le cours COBOL avant de faire des commentaires.

—EDIT—:

La ligne PROCEDURE DIVISION. est un marqueur du bloc de procédure, du code exécuté. Le mot division n’a donc rien à voir avec l’opération mathématique.

Édité par amael

Ils ne savaient pas que c’était impossible alors ils l’ont fait Mark Twain

+0 -0
Auteur du sujet

Pour info, j’utilise le compilateur GNUCobol.

L’affichage obtenu après execution et tappe de la séquence de touches 9 9 9 Tab 9 9 9 Enter est :

Multipliation


 Nombre 1 : 900
 Nombre 2 : 990

 900  x 990 = 9100
end of program, please press a key to exit 

Ils ne savaient pas que c’était impossible alors ils l’ont fait Mark Twain

+0 -0

Cette réponse a aidé l’auteur du sujet

Je n’ai jamais fait de COBOL, donc mes excuses si je réponds à coté.

Comme tu dis, la multiplication en elle-même semble fonctionner, mais le résultat affiché est faux. Je suppose qu’en écrivant 77 result PIC 9(4)v99 (ligne 8) et en changeant la ligne 23 pour correspondre, ça devrait passer.

Qu’est-ce que ça donne si tu essaies avec des nombres entiers ?

Auteur du sujet

Comme tu dis, la multiplication en elle-même semble fonctionner, mais le résultat affiché est faux. Je suppose qu’en écrivant 77 result PIC 9(4)v99 (ligne 8) et en changeant la ligne 23 pour correspondre, ça devrait passer.

Effectivement, et je n’avais même pas remarqué tellement le problème de saisie me troublait, ta proposition corrige bien le calcul.

Qu’est-ce que ça donne si tu essaies avec des nombres entiers ?

Étonnamment, ça fonctionne bien. On peut aisément rentrer des nombres comme 999. Je ne sais vraiment pas quoi penser du problème des flottants. Après, je suppose qu’il y a moyen de s’en passer à l’affichage et d’utiliser des entiers séparés pour la partie fractionnelle…

Ils ne savaient pas que c’était impossible alors ils l’ont fait Mark Twain

+0 -0

Cette réponse a aidé l’auteur du sujet

J’ai continué à regarder un peu. Il semblerait que quand on utilise les flottants, tab et entrée ajoutent un 0 à la fin des nombres. Si tu tapes tab plein de fois, les nombres deviennent 0. Je ne sais pas pourquoi par contre, et je ne trouve pas sur internet non plus.

Il semblerait que la ligne 27 soit inutile aussi, la ligne 28 s’occupant du dusplay.

Bon, pour une raison que j’ignore, je suis devenu obsédé par cette question. J’ai passé deux soirées à chercher, sans succès, donc j’ai fini par demander sur StackOverflow.

Bien sûr, la première réponse était bonne. J’ai donc modifié le code pour écrire

       IDENTIFICATION DIVISION.
       PROGRAM-ID. exo.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 a PIC 9(2)V9.
       77 b PIC 9(2)V9.
       77 aa PIC Z9.9.
       77 bb PIC Z9.9.
       77 result PIC 9(4)V99.
       screen section.
       1 pla-titre.
              2 blank screen.
              2 line 1 col 1 value 'Multiplication'.
       1 pls-nombres.
              2 line 4 col 2 value 'Nombre 1 : '.
              2 PIC Z9.9 to aa required.
              2 line 5 col 2 value 'Nombre 2 : '.
              2 PIC z9.9 to bb required.
       1 pla-resultat.
              2 line 7 col 2 PIC 9(2)V9 from a.
              2 col 7 value 'x'.
              2 col 9 PIC 9(2)V9 from b.
              2 col 13 value '='.
              2 col 15 PIC 9(4)V99 from result.
           
       PROCEDURE DIVISION.
       display pla-titre.
       accept pls-nombres.
       move function numval (aa) to a
       move function numval (bb) to b
       compute result = a * b.
       display pla-resultat.

       END PROGRAM exo.

Par contre, je ne comprends toujours pas pourquoi ça ne marchait pas avant, du coup si tu comprends plus que moi, n’hésites pas à me le dire. Et si tu as d’autres questions de Cobol, pose-les par ici, c’était amusant :)

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte