diff --git a/Sonderuebung/WiSe24-25/SU08_2024_12_10_Arrays-in_UPs/01_matrix_rechnen_mit_UP.f95 b/Sonderuebung/WiSe24-25/SU08_2024_12_10_Arrays-in_UPs/01_matrix_rechnen_mit_UP.f95 new file mode 100644 index 0000000000000000000000000000000000000000..cf95bfd97492aa5c3f5b5f474c3b9e8a3ba02d52 --- /dev/null +++ b/Sonderuebung/WiSe24-25/SU08_2024_12_10_Arrays-in_UPs/01_matrix_rechnen_mit_UP.f95 @@ -0,0 +1,125 @@ +module mat_rechnen + implicit none + private + public :: einlesen, spur, orthogonal, positivteil, ausgabe + + contains + subroutine einlesen(A) + integer, dimension(:,:), intent(out) :: A ! rueckgabewert + integer :: i + + write(*,*) "Gebe die Eintraege der Matrix zeilenweise ein." + + do i = 1, size(A, 1) + read(*,*) A(i,:) + end do + + ! Alternativ : + ! do i = 1, size(A,1) ! Zeilen + ! write(*,*) "Zeile", i, ", Eintragsweise" + ! do j = 1, size(A, 2) ! Spalten + ! read(*,*) A(i,j) + ! end do + ! end do + + end subroutine einlesen + + function spur(A) + integer, dimension(:,:), intent(in) :: A + integer :: spur ! rueckgabewert + integer :: i + + spur = 0 + do i = 1, size(A,1) + spur = spur + A(i,i) + end do + + end function spur + + function orthogonal(A) + integer, dimension(:,:), intent(in) :: A + logical :: orthogonal ! rueckgabewert + + integer, dimension(size(A,1), size(A,1)) :: I + integer :: j + + ! Einheitsmatrix anlegen + I = 0 + do j = 1, size(A,1) + I(j,j) = 1 + end do + + + orthogonal = all( matmul(A, transpose(A)) == I ) + + end function orthogonal + + function positivteil(A) + integer, dimension(:,:), intent(in) :: A + integer, dimension(size(A,1), size(A,1)) :: positivteil ! rueckgabewert + + integer :: i, j + + do i = 1, size(A,1) + do j = 1, size(A,1) + + if ( A(i,j) > 0 ) then + positivteil(i,j) = A(i,j) + else ! A(i,j) <= 0 + positivteil(i,j) = 0 + end if + + end do + end do + + end function positivteil + + subroutine ausgabe(A) + integer, dimension(:,:), intent(in) :: A + integer :: i + + do i = 1, size(A,1) + write(*,*) A(i,:) + end do + + end subroutine ausgabe + + +end module mat_rechnen + +program matrizen + use mat_rechnen + implicit none + + integer, allocatable, dimension(:,:) :: A + integer :: n + + ! Einlesen Dimension Matrix + write(*,*) "Wie gross soll die Matrix sein?" + do + read(*,*) n + if (n > 0) exit + write(*,*) "Fehler: n <= 0! Erneute Eingabe." + end do + + ! Allokieren der Matrix als nxn-Matrix + allocate(A(n,n)) + + + call einlesen(A) + + write(*,*) "Die Spur der Matrix ist ", spur(A) + + if (orthogonal(A)) then + write(*,*) "Die Matrix ist orthogonal." + else + write(*,*) "Die Matrix ist nicht orthogonal." + end if + + write(*,*) "Der Positivteil der Matrix ist :" + call ausgabe(positivteil(A)) + + + ! Deallokieren nicht vergessen + deallocate(A) +end program matrizen \ No newline at end of file