t1nman

Math.lab1

Mar 1st, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXSIZE 4
  4.  
  5. int read_matrix(char *file_name, float matrix[][MAXSIZE]);
  6. void print_matrix(int size, float matrix[][MAXSIZE]);
  7. void great_diagonal(int size, float matrix[][MAXSIZE]);
  8. void swap_rows(int master, int slave, int size, float matrix[][MAXSIZE]);
  9. void triangle_matrix(int size, float matrix[][MAXSIZE]);
  10. void upward(int size, float matrix[][MAXSIZE]);
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14.     char *file_name = "input";
  15.     float matrix[MAXSIZE][MAXSIZE];
  16.     int size = 0;
  17.  
  18.     size = read_matrix(file_name, matrix);
  19.     printf("\nOriginal matrix:\n");
  20.     print_matrix(size, matrix);
  21.     great_diagonal(size, matrix);
  22.     printf("Matrix with selection of main value in columns\n");
  23.     print_matrix(size, matrix);
  24.     triangle_matrix(size, matrix);
  25.     printf("Triangle matrix:\n");
  26.     print_matrix(size, matrix);
  27.     upward(size, matrix);
  28.  
  29.     return 0;
  30. }
  31.  
  32. void triangle_matrix(int size, float matrix[][MAXSIZE])
  33. {
  34.     int i, j, k;
  35.     float factor_master, factor_slave;
  36.  
  37.     for (k = 0; k < size; k++) {
  38.         if (abs(matrix[k][k]) == 0) {
  39.             swap_rows(k+1, k, size, matrix);
  40.             printf("after 0-swap:\n");
  41.             print_matrix(size, matrix);
  42.         }
  43.         factor_master = matrix[k][k];
  44.         for (j = k; j < size+1; j++) {
  45.             matrix[k][j] = matrix[k][j] / factor_master;
  46.         }
  47.    
  48.         for (i = k+1; i < size; i++) {
  49.             factor_slave = matrix[i][k];
  50.             for (j = 0; j < size+1; j++) {
  51.                 matrix[i][j] = matrix[i][j] - matrix[k][j] * factor_slave;
  52.             }
  53.         }
  54.         printf("step #%d\n", k+1);
  55.         print_matrix(size, matrix);
  56.     }
  57. }
  58.  
  59. void upward(int size, float matrix[][MAXSIZE])
  60. {
  61.     int i, j;
  62.     float x[size-1], tmp;
  63.    
  64.     x[0] = matrix[size-1][size];
  65.  
  66.     for (i = 1; i >= 0; i--) {
  67.         tmp = 0.0;
  68.         for (j = 0; j < size-i-1; j++)
  69.             tmp -= matrix[i][size-j-1] * x[j];
  70.         tmp += matrix[i][size];
  71.         x[size-i-1] = tmp;
  72.     }
  73.  
  74.     putchar('\n');
  75.     for (i = 0; i < size; i++)
  76.         printf("x%d = %11f\n", i+1, x[size-i-1]);
  77.  
  78. }
  79.  
  80. void great_diagonal(int size, float matrix[][MAXSIZE])
  81. {
  82.     int i, j, max_indx;
  83.     float max;
  84.  
  85.     for (j = 0; j < size; j++) {
  86.         max = 0;
  87.         max_indx = 0;
  88.         for (i = j; i < size; i++) {
  89.             if (abs(matrix[i][j]) > abs(max)) {
  90.                 max = matrix[i][j];
  91.                 max_indx = i;
  92.             }
  93.         }
  94.         if (abs(matrix[max_indx][j]) > abs(matrix[j][j])) {
  95.             swap_rows(max_indx, j, size, matrix);
  96.         }
  97.     }
  98. }
  99.  
  100. void swap_rows(int master, int slave, int size, float matrix[][MAXSIZE])
  101. {
  102.     int j;
  103.     float temp = 0;
  104.  
  105.     for (j = 0; j < size+1; j++) {
  106.         temp = matrix[slave][j];
  107.         matrix[slave][j] = matrix[master][j];
  108.         matrix[master][j] = temp;
  109.     }
  110. }
  111.  
  112. int read_matrix(char *file_name, float matrix[][MAXSIZE])
  113. {
  114.     FILE *ifp;
  115.     int i, j, size = 0;
  116.  
  117.     ifp = fopen(file_name, "r");
  118.     fscanf(ifp, "%d", &size);
  119.     for (i = 0; i < size; i++) {
  120.         for (j = 0; j < size+1; j++) {
  121.             fscanf(ifp, "%f", &matrix[i][j]);
  122.         }
  123.     }
  124.     fclose(ifp);
  125.    
  126.     return size;
  127. }
  128.  
  129. void print_matrix(int size, float matrix[][MAXSIZE])
  130. {
  131.     int i, j;
  132.  
  133.     putchar('\n');
  134.     for (i = 0; i < size; i++) {
  135.         for (j = 0; j < size+1; j++) {
  136.             printf("%16f", matrix[i][j]);
  137.         }
  138.         putchar('\n');
  139.     }
  140.     putchar('\n');
  141. }
Advertisement
Add Comment
Please, Sign In to add comment