Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  123
Language: C/C++
Code:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <clocale>
#include <cstdlib>

#define N 6
void index_elem(int n, int order_roots[], int k, double mas[] [N + 1]);

int main()
{     
     setlocale(LC_CTYPE, "rus"); //Русскоязычные символы в консоли
     double mas[N] [N + 1];
     double x[N]; //Корни системы
     int order_roots[N]; //Сохраняем порядок корней
     int i, j, k, n;

     //Ввод количества корней
     printf( "Enter the number of equations of the system: \n" );
     scanf( "%d", &n );

     //Проверка на корректность
     if ( N < n ){
          printf( "Invalid number of equations .  %dn",N);
          return 0;
     }

     //Ввод системы уравнений
     printf( "Input system: \n" );
     for ( i = 0; i < n; i++ ){
          printf ("quation number %dn",i+1);
          for ( j = 0; j < n + 1; j++ ){
               if (j<n){
                    printf("coefficient of x%d=\n",j+1);
               } else {
                    printf("Result is");
               }
               scanf( "%lf", & mas[i] [j] );
          }
     }

     //Демонстрация пользователю матрицы
     printf( "Your system:\n" );
     for (i = 0; i < n; i++){
          for (j = 0; j < n + 1; j++){
               printf("%7.2f ",mas[i] [j]);
          }
          printf( "n" );
     }
     
     //Сначала все корни по порядку
     for (i = 0; i<n+1; i++){
          order_roots[i] = i;
     }
     
     //Прямой ход метода Гаусса
     for ( k = 0; k < n; k++ ){ //На какой позиции должен стоять главный элемент
          index_elem(n, order_roots, k, mas); //Установка главного элемента
          if (fabs( mas[k][k]) < 0.0001 ){//Берем по модулю для проверки на существование решения
               printf( "System does not have a unique solution" );
               system("pause");
               return 0;
          }

          for ( j = n; j >= k; j-- ){
               mas[k] [j] /= mas[k] [k];
          }
     
          for ( i = k + 1; i < n; i++ ){
               for ( j = n; j >= k; j-- ){
                    mas[i] [j] -= mas[k] [j] * mas[i] [k];
               }
          }
     }
     
     //Обратный ход
     for ( i = 0; i < n; i++ ){
          x[i] = mas[i] [n];
     }
     for ( i = n - 2; i >= 0; i-- ){
          for ( j = i + 1; j < n; j++ ){
               x[i] -= x[j] * mas[i] [j];
          }
     }
     
     //Вывод результата
     printf( "Answer:n" );
     for ( i = 0; i < n; i++ ){
          for ( j = 0; j < n; j++ ){
               if ( i == order_roots[j] ){ //Расставляем корни по порядку
                    printf( "%fn", x[j] );
                    break;
               }
          }
     }

     system("pause");
     return 0;
}

//Вспомогательная функция для установки главного элемента
void index_elem(int n, int order_roots[], int k, double mas[] [N + 1]){
     int i, j, i_max = k, j_max = k;
     double jump;

     //Ищем максимальный по модулю элемент
     for ( i = k; i < n; i++ ){
          for ( j = k; j < n; j++ ){
               if ( fabs( mas[i_max] [j_max] ) < fabs( mas[i] [j] ) ){
                    i_max = i;
                    j_max = j;
               }
          }
     }
     
     //Переставляем строки
     for ( j = k; j < n + 1; j++ ){
          jump = mas[k] [j];
          mas[k] [j] = mas[i_max] [j];
          mas[i_max] [j] = jump;
     }
     
     
     //Переставляем столбцы
     for ( i = 0; i < n; i++ ){
          jump = mas[i] [k];
          mas[i] [k] = mas[i] [j_max];
          mas[i] [j_max] = jump;
     }
     
     //Учитываем изменение порядка корней
     i = order_roots[k];
     order_roots[k] = order_roots[j_max];
     order_roots[j_max] = i;
}
          
          
          
          
          
          
          
Comments: