Bonjour à tous,
Voilà je me suis mis à un langage que je pensais jamais apprendre, mais petit défi, je m’y suis mis et ça se passe plutôt pas mal, malgré des débuts extrêmement difficile dans une syntaxe assez déroutante.
J’ai tenté un jeu du pendu, avec allocation mémoire, utilisation des boucles et tableau. Je voulais savoir si ma façon de faire était correcte, dans le sens bonnes et mauvaises pratiques, car malgré des tutoriels lus et relus, n’ayant pas d’expérience dans ce langage, je préfère vous laisser juger.
J’utilise Fortran 90. Voici le code…
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 | PROGRAM pendu CHARACTER(len=32) :: secret CHARACTER, DIMENSION(:), ALLOCATABLE :: word CHARACTER :: let LOGICAL :: trouve secret = "coucou" ALLOCATE(word(LEN_TRIM(secret))) CALL star(word, LEN_TRIM(secret)) ! Transforme mot secret en une liste d'étoiles * trouve = .FALSE. DO WHILE (.NOT. trouve) print*, word print*, "Proposer une lettre: " read (*, '(A)') let CALL check(secret, word, let) trouve = check_win(word) END DO print*, word DEALLOCATE(word) CONTAINS SUBROUTINE star(w, n) INTEGER, INTENT(IN) :: n CHARACTER, DIMENSION(n), INTENT(OUT) :: w w = '*' END SUBROUTINE star SUBROUTINE check(s, w, letter) !Fonction qui vérifie que letter est dans s !Si oui, on l'à place dans w CHARACTER, DIMENSION(:) :: w CHARACTER(len=*), INTENT(IN) :: s CHARACTER :: letter INTEGER :: i DO i=1, LEN_TRIM(s) IF (s(i:i) == letter) THEN w(i) = letter END IF END DO END SUBROUTINE LOGICAL FUNCTION check_win(w) ! Vérifie que l'on a plus d'* dans w, si oui c'est gagné CHARACTER, DIMENSION(:) :: w INTEGER :: i LOGICAL :: win win = .TRUE. DO i=1, SIZE(w) IF (w(i) == '*') THEN win = .FALSE. EXIT END IF END DO check_win = win END FUNCTION END PROGRAM pendu |
Pour les balises code, je me doutais que Fortran était aux abonnés absents.
EDIT1: J’ai modifié la signature de check_win par
1 | FUNCTION check_win(w) RESULT (win) |
Ce qui donne ce nouveau bloc de fonction, ne changeant pas l’aspect du code principal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | FUNCTION check_win(w) RESULT (win) ! Vérifie que l'on a plus d'* dans w, si oui c'est gagné CHARACTER, DIMENSION(:) :: w INTEGER :: i LOGICAL :: win win = .TRUE. DO i=1, SIZE(w) IF (w(i) == '*') THEN win = .FALSE. EXIT END IF END DO END FUNCTION |