@anon18277073 Kodlardaki birkaç mantık hatasının da sebebi şu, Yaptığım şey bir ödev aslında. Birkaç fonksiyon yazmam istenmiş ve bu fonksiyonlar hocanın elindeki main(){....}
kodlarıyla kontrol edilecek. Benim main(){....}
bunun içindeki kodlara müdahale etme hakkım yok. İstenen şey matris üzerinde işlem yapmam ama matris elemanları A[3][3] yerine A[9] şeklinde veriliyor mainde.
Bu yüzden her seferinde elemanları A[i][j] biçiminde bir matrise aktarmak,
Ardından gerekli işlemleri yapmak ve sonrasında da tekrardan A[i] şeklindeki diziye return etmek durumunda kalıyorum.
Açıklayıcı olması adına programın tamamını aşağıya bırakıyorum göz gezdirmek isterseniz buyrun;
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
double** matrisyap(double* x,double **matris, int n);
void Add(double *A, double *B, double *C, int N);
void Subtract(double *A, double *B, double *C, int N);
void Multiply(double *A, double *B, double *C, int N);
void Transpose(double *A, double *C, int N);
double Determinant(double *A, int N);
double Inverse(double *A, double *C, int N);
int main(){
double A[] = {5, 2, 4, 2, 4, 6, 1, 2, 8};
double B[] = {1, 5, 8, 3, 5, 6, 4, 7, 9};
double C[9];
double grade = 100.0;
/* C = A + B */
Add(A, B, C, 3);
if (C[0] != 6 || C[1] != 7 || C[2] != 12 ||
C[3] != 5 || C[4] != 9 || C[5] != 12 ||
C[6] != 5 || C[7] != 9 || C[8] != 17) grade -= 7.5;
/* C = A - B */
Subtract(A, B, C, 3);
if (C[0] != 4 || C[1] != -3 || C[2] != -4 ||
C[3] != -1 || C[4] != -1 || C[5] != 0 ||
C[6] != -3 || C[7] != -5 || C[8] != -1) grade -= 7.5;
/* C = A * B */
Multiply(A, B, C, 3);
if (C[0] != 27 || C[1] != 63 || C[2] != 88 ||
C[3] != 38 || C[4] != 72 || C[5] != 94 ||
C[6] != 39 || C[7] != 71 || C[8] != 92) grade -= 20;
/* C = A' */
Transpose(A, C, 3);
if (C[0] != 5 || C[1] != 2 || C[2] != 1 ||
C[3] != 2 || C[4] != 4 || C[5] != 2 ||
C[6] != 4 || C[7] != 6 || C[8] != 8) grade -= 7.5;
/* det(A) */
if (Determinant(A, 3) != 80) grade -= 7.5;
/* det(B) */
if (Determinant(B, 3) != -4) grade -= 7.5;
/* C = inv(A) */
if (Inverse(A, C, 3) == 0) {
if (C[0] != 0.250 || C[1] != -0.100 || C[2] != -0.0500 ||
C[3] != -0.1250 || C[4] != 0.450 || C[5] != -0.2750 ||
C[6] != 0 || C[7] != -0.100 || C[8] != 0.2000) grade -= 15;
}
else grade -= 15;
/* C = inv(B) */
if (Inverse(B, C, 3) == 0){
if (C[0] != -0.7500 || C[1] != -2.7500 || C[2] != 2.5000 ||
C[3] != 0.7500 || C[4] != 5.7500 || C[5] != -4.5000 ||
C[6] != -0.2500 || C[7] != -3.2500 || C[8] != 2.5000) grade -= 15;
}
else grade -= 15;
A[0]=A[1]=A[2]=A[3]=A[4]=A[5]=A[6]=A[7]=A[8]=0.0; if (Inverse(A, C, 3) != -1) grade -= 5;
printf("Notunuz: %.2f\n", grade);
}
//Okulnabilirlik açısından fonksiyonları aşağıya yazdım.
//Bu fonksiyonu tek boyutlu dizi olarak verilen matris elemanlarını NxN matris formatına çevirmek için oluşturdum.
double** matrisyap(double* x,double **matris, int n){
int i,j,k=0;
matris=(double**)malloc(sizeof(double*)*n);
for(i=0;i<n;i++){
matris[i]=(double*)malloc(sizeof(double)*n);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
matris[i][j]=x[k];
k++;
}
}
return matris;
}
/* C = A + B */
void Add(double *A, double *B, double *C, int N){
int i,j,k=0;
double** matrisa;
matrisa= matrisyap(A,matrisa,N);
double** matrisb;
matrisb= matrisyap(B,matrisb,N);
for(i=0;i<N;i++){
for(j=0;j<N;j++){
C[k]= matrisa[i][j]+matrisb[i][j];
k++;
}
}
}
/* C = A - B */
void Subtract(double *A, double *B, double *C, int N){
int i,j,k=0;
double** matrisa;
matrisa= matrisyap(A,matrisa,N);
double** matrisb;
matrisb= matrisyap(B,matrisb,N);
for(i=0;i<N;i++){
for(j=0;j<N;j++){
C[k]= matrisa[i][j]-matrisb[i][j];
k++;
}
}
}
/* C = A - B */
void Multiply(double *A, double *B, double *C, int N){
int i,j,k=0;
double D[9];
double** matrisa;
matrisa= matrisyap(A,matrisa,N);
double** matrisb;
matrisb= matrisyap(B,matrisb,N);
double** matrisd;
matrisd= matrisyap(D,matrisd,N);
for(i=0; i<N; i++){
for(j=0; j<N; j++){
for(k=0; k<N; k++){
matrisd[i][j] += matrisa[i][k] * matrisb[k][j];
}
}
}
k=0;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
C[k]= matrisd[i][j];
k++;
}
}
}
/* C = A' */
void Transpose(double *A, double *C, int N){
int i,j,k=0;
double** matrisa;
matrisa= matrisyap(A,matrisa,N);
for(i=0;i<N;i++){
for(j=0;j<N;j++){
C[k]=matrisa[j][i];
k++;
}
}
}
/* det(A) */
double Determinant(double *A, int N){
int sutun1,sutun2,sutun3;
double determinant;
double** matrisa;
matrisa= matrisyap(A,matrisa,N);
if(N==2)
{
determinant=(matrisa[0][0]*matrisa[1][1]-matrisa[0][1]*matrisa[1][0]);
return determinant;
}
if(N==3){
sutun1=matrisa[0][0] * ((matrisa[1][1] * matrisa[2][2]) - (matrisa[1][2] * matrisa[2][1]));
sutun2=matrisa[0][1] * ((matrisa[1][0] * matrisa[2][2]) - (matrisa[1][2] * matrisa[2][0]));
sutun3=matrisa[0][2] * ((matrisa[1][0] * matrisa[2][1]) - (matrisa[1][1] * matrisa[2][0]));
determinant=(+sutun1)+ (-sutun2)+ (+sutun3);
}
return determinant;
}
double Inverse(double* A, double* C, int N) {
int i;
double determinant;
double** matrisa;
matrisa = matrisyap(A, matrisa, N);
determinant = Determinant(A, 3);
if (determinant ==0) return -1;
double tersdeterminant = 1 / determinant;
C[0] = (matrisa[1][1] * matrisa[2][2] - matrisa[2][1] * matrisa[1][2]) * tersdeterminant;
C[1] = -(matrisa[0][1] * matrisa[2][2] - matrisa[0][2] * matrisa[2][1]) * tersdeterminant;
C[2] = (matrisa[0][1] * matrisa[1][2] - matrisa[0][2] * matrisa[1][1]) * tersdeterminant;
C[3] = -(matrisa[1][0] * matrisa[2][2] - matrisa[1][2] * matrisa[2][0]) * tersdeterminant;
C[4] = (matrisa[0][0] * matrisa[2][2] - matrisa[0][2] * matrisa[2][0]) * tersdeterminant;
C[5] = -(matrisa[0][0] * matrisa[1][2] - matrisa[1][0] * matrisa[0][2]) * tersdeterminant;
C[6] = (matrisa[1][0] * matrisa[2][1] - matrisa[2][0] * matrisa[1][1]) * tersdeterminant;
C[7] = -(matrisa[0][0] * matrisa[2][1] - matrisa[2][0] * matrisa[0][1]) * tersdeterminant;
C[8] = (matrisa[0][0] * matrisa[1][1] - matrisa[1][0] * matrisa[0][1]) * tersdeterminant;
return 0;
}