From cbd29fa8970dc53c8517c0e0f7118457884ce867 Mon Sep 17 00:00:00 2001
From: dali662d <dana.liebscher@mailbox.tu-dresden.de>
Date: Tue, 10 Dec 2024 13:19:10 +0000
Subject: [PATCH] Upload New File

---
 .../01_matrix_rechnen_mit_UP.f95              | 125 ++++++++++++++++++
 1 file changed, 125 insertions(+)
 create mode 100644 Sonderuebung/WiSe24-25/SU08_2024_12_10_Arrays-in_UPs/01_matrix_rechnen_mit_UP.f95

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 0000000..cf95bfd
--- /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
-- 
GitLab