diff --git a/Sonderuebung/WiSe24-25/SU06_2024_11_26_Module_Inteface_ADT/02_teilnehmerverzeichnis.f95 b/Sonderuebung/WiSe24-25/SU06_2024_11_26_Module_Inteface_ADT/02_teilnehmerverzeichnis.f95 new file mode 100644 index 0000000000000000000000000000000000000000..a3fc93bd82231662dc0deb7bf58a325ef560085b --- /dev/null +++ b/Sonderuebung/WiSe24-25/SU06_2024_11_26_Module_Inteface_ADT/02_teilnehmerverzeichnis.f95 @@ -0,0 +1,112 @@ +module teilnehmer + implicit none + private + public :: student, PUT, vgl_studiendauer, vgl_name, name + + TYPE student + CHARACTER (len=30) :: vname + CHARACTER (len=30) :: nname + INTEGER :: alter + INTEGER :: semester + END TYPE + + interface PUT + module procedure PUT + end interface + + contains + + function name(person) + type(student), intent(in) :: person + character (len=60) :: name + + name = trim(person%vname)//" "//trim(person%nname) + end function name + + + subroutine PUT(person) + type(student), intent(in) :: person + + ! & als Klebelasche, da Zeile sonst zu lang (>131 Zeichen) + write(*,*) trim(name(person)), ", ", person%alter, " Jahre, ist Student im ",& + & person%semester, ". Semester." + end subroutine PUT + + + function vgl_studiendauer(p1, p2) result(kleiner) + ! vergleich auf strikt kleiner + type(student), intent(in) :: p1, p2 + logical :: kleiner + + kleiner = p1%semester < p2%semester + end function vgl_studiendauer + + + function vgl_name(p1, p2) result(kleiner) + ! vergleich auf strikt kleiner + type(student), intent(in) :: p1, p2 + logical :: kleiner + + kleiner = .false. + + ! vergleiche nachname + if (p1%nname < p2%nname) then + kleiner = .true. + elseif (p1%nname == p2%nname) then + !vergleiche vorname + if (p1%vname < p2%vname) kleiner = .true. + end if + + end function vgl_name + +end module teilnehmer + + + +program teilnehmerverzeichnis + use teilnehmer + implicit none + + type(student) :: p1, p2 + + write(*,*) "Gebe den Vornamen, Nachnamen, das Alter und Semster von Student 1 an." + read(*,*) p1 + ! alternativ funktioniert auch: + ! read(*,*) p1%vname, p1%nname, p1%alter, p1%semester + ! dies ist insbesondere nützlich, wenn die Komponenten nicht in Speicherreihenfolge eingelesen werden + + CALL PUT(p1) + write(*,*) ! Leerzeile im Terminal + + write(*,*) "Gebe den Vornamen, Nachnamen, das Alter und Semster von Student 2 an." + read(*,*) p2 + + CALL PUT(p2) + write(*,*) ! Leerzeile im Terminal + + + ! vergleich studiendauer + if (vgl_studiendauer(p1, p2)) then ! studiendauer p1 < studiendauer p2 + write(*,*) trim(name(p2)), " studiert schon laenger als ", trim(name(p2)) + + elseif (vgl_studiendauer(p2, p1)) then ! studiendauer p1 < studiendauer p2 + write(*,*) trim(name(p1)), " studiert schon laenger als ", trim(name(p2)) + + else ! studiendauer p1 == studiendauer p2 + write(*,*) trim(name(p1)), " und ", trim(name(p2)), " studieren gleich lang." + + end if + + + ! vergleich name + if (vgl_name(p1, p2)) then ! name p1 < name p2 + write(*,*) trim(name(p1)), " ist lexikalisch vor ", trim(name(p2)) + + elseif (vgl_name(p2, p1)) then ! name p2 < name p1 + write(*,*) trim(name(p1)), " ist lexikalisch nach ", trim(name(p2)) + + else ! name p1 == name p2 + write(*,*) trim(name(p1)), " und ", trim(name(p2)), " haben den gleichen Namen." + end if + +end program teilnehmerverzeichnis \ No newline at end of file