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
|
subroutine creer_liste(this)
class(liste) :: this
integer :: IO_ERROR, n, i
real :: x,y
type(point), pointer :: nouveau_point, dernier_point
write(*,"('Entrer le nombre de points dont vous disposez :')")
! Ci-dessous la gestion des erreurs pour la valeur de n entrée par l'utilisateur
do
read(*,IOSTAT=IO_ERROR,FMT="(i5)") n
if(IO_ERROR .EQ. 0) exit
write(*,"('Entree incorecte, entrer un entier en format i5. Merci.')",advance='no')
end do
do while ((n.EQ.0).OR.(n.LT.0))
write(*,"('Erreur : le nombre de points ne peut pas etre inferieur ou egal a zero. n =')",advance='no')
do
read(*,IOSTAT=IO_ERROR,FMT="(i5)") n
if (IO_ERROR .EQ. 0) exit
write(*,"('Entree incorecte, entrer un entier en format i5. Merci.')",advance='no')
end do
end do
! Fin de la gestion des erreurs
!Boucle do allant de 1 à n (n =nombre de points dont on souhaite entrer les coordonnées dans la liste). Pour chaque itération, l'utilisateur va entrer l'abscisse et l'ordonnée du point.
do i=1,n
write(*,"(10x,'Point',x,i3,x':')") i
write(*,"('Entrer abscisse :')")
!Gestion des erreurs pour la valeur de x entrée
do
read(*,IOSTAT=IO_ERROR,FMT="(f5.2)") x
if(IO_ERROR .EQ. 0) exit
write(*,"('Entree incorecte, entrer un reel en format f5.2. Merci.')",advance='no')
end do
write(*,"('Entrer ordonnee :')")
!Gestion des erreurs pour la valeur de y entrée
do
read(*,IOSTAT=IO_ERROR,FMT="(f5.2)") y
if(IO_ERROR .EQ. 0) exit
write(*,"('Entree incorecte, entrer un reel en format f5.2. Merci.')",advance='no')
end do
call allouer_nouveau_point(nouveau_point) ! On créé un espace mémoire pour notre nouveau point à partir de la subroutine allouer_nouveau_point.
! On entre les coordonnées et le numéro du point
call nouveau_point%set_x(x)
call nouveau_point%set_y(y)
call nouveau_point%set_num(i)
! On ajoute le nouveau point dans la liste :
if ( this%est_vide() ) then
call this%set_tete(nouveau_point)
else
dernier_point => this%get_tete()
do while ( dernier_point%suivant_estAssocie() )
dernier_point => dernier_point%get_suivant()
end do
call dernier_point%set_suivant(nouveau_point)
end if
call this%incrementer_taille()
end do
return
end subroutine creer_liste
subroutine allouer_nouveau_point(nouveau_point)
type(point), pointer :: nouveau_point
allocate(nouveau_point)
nullify(nouveau_point)
return
end subroutine allouer_nouveau_point |
Partager