next up previous
Next: 練習問題 Up: 計算機言語 I 第 11 Previous: プログラムを書くときの考え方

プログラム

/* File name 11-3.c */

#include <stdio.h>

#define BUFFSIZE 1000

double matrix[4][8]={{0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0},
                     {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0},
                     {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0},
                     {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}};

void inverse();
void swap(int i, int j);
void setpivot(int i);
void eliminate(int i);

main()
{
  int i;
  char input[BUFFSIZE];

  for (i=0; i< 4; i++){
    printf("Input the %dth row.\n", i+1);
    fgets(input, BUFFSIZE, stdin);
    sscanf(input, "%lf %lf %lf %lf", &matrix[i][0], &matrix[i][1], &matrix[i][2], &matrix[i][3]);
  }

  inverse();

  printf("Inverse matrix is\n");
  for(i=0; i< 4; i++)
    printf("%f %f %f %f\n", matrix[i][4], matrix[i][5], matrix[i][6], matrix[i][7]);
}

void inverse()
{
   int i;

   for(i=0; i < 4; i++){
      setpivot(i);
      eliminate(i);
   }
}

void setpivot(int i)
{
   int j;

   if (matrix[i][i]!=0) return;

   for (j=i+1; j < 4; j++){
      if (matrix[j][i]!=0){
         swap(i, j);
         return;
      }
   }

   printf("The matrix does not have the inverse.\n");
   exit(1);
}

void swap(int i, int j)
{
   int k;
   double temp;

   for (k=i; k< 8; k++){
      temp=matrix[i][k];
      matrix[i][k]=matrix[j][k];
      matrix[j][k]=temp;
   }
}

void eliminate(int i)
{
   int k;
   int j;
   double denominator=matrix[i][i];
   double multiplier;

   for (j=i; j<8;j++){
      matrix[i][j]/=denominator;
   }

   for (k=0; k<4; k++){
     if (k != i){
        multiplier=matrix[k][i];
        for (j=i; j<8; j++)
           matrix[k][j] -= multiplier*matrix[i][j];
     }
  }
}



Next: 練習問題 Up: 計算機言語 I 第 11 Previous: プログラムを書くときの考え方