Разработка программного комплекса решения математической задачи численными методами

Автор работы: Пользователь скрыл имя, 26 Октября 2010 в 22:52, Не определен

Описание работы

Курсовая работа

Файлы: 1 файл

курсовая по программированию.doc

— 767.00 Кб (Скачать файл)

                  printf("\n\n");

                  GaussMethod();

                  printf("\n\nДля возврата  нажмите любую клавишу...");

                  getch();

            }

            if (Action == 's') {

                  unsigned int NumRow, NumCol;

                  char Size[255]; 

                  for (;;) {

                        printf("\n\nВведите размер расширенной матрицы в формате m*n (m - количество строк,\nn - количество столбцов; количество строк должно быть на единицу меньше\nколичества столбцов):\n");

                        scanf("%s", Size);

                        if (SizeFormatCheck(&NumRow, &NumCol, Size)) {break;}

                  }

                  if (NumRow != NumCol - 1) {

                        Alert("Данная программа предназначена только для решения систем, в которых количество\nнеизвестных равно количеству уравнений.");

                        getch();

                        return 0;

                  } 

                  system("color F7");

                  printf("\nИдёт выделение памяти под хранение матрицы. (Процесс может занять некоторое\nвремя...)");

                  float **Matrix = CreateMatrix(NumRow, NumCol); 

                  if (Matrix == NULL) {

                        Alert("Не удалось выделить память под матрицу указанного размера!\n\nНажмите \"h\", если хотите получить справочную информацию об ошибке или любую\nдругую клавишу для возврата в главное меню.");

                        DelLastSymbols(26);

                        Action = getch();

                        if (Action == 'h') {

                              system("cls");

                              system("color 70");

                              Header("Справка", "=", 42);

                              printf("\n\n");

                              MemoryMatrix();

                              printf("\n\nДля возврата  нажмите любую клавишу...");

                              getch();

                        }

                        return 0;

                  }

                  system("color F0");

                  printf("\n\nПамять выделена.\n");

                  FullMatrix(Matrix, NumRow, NumCol); 

                  system("cls");

                  system("color F0");

                  Header("Меню >> Решение  СЛУ методом Гаусса >> II", "=", 42);

                  Gauss(Matrix, NumRow, NumCol);

                  float *Result = (float*)malloc(sizeof(float)*(NumCol - 1));

                  switch(ReverseGauss(Matrix, NumRow, NumCol, Result)) {

                        case 0:

                              printf("\n\nОтвет:\n");

                              for (int i = 0; i < NumCol - 1; i++) {

                                    if (abs(Result[i]) < 1e-5) {printf("X%d = %10.5f\n", i + 1, 0.0);} else {printf("X%d = %10.5f\n", i + 1, Result[i]);}

                              }

                              printf("\nПримечание: в ответах возможна потеря точности.\n\nДля возврата в главное меню нажмите любую клавишу...");

                              getch();

                              break;

                        case 1: printf("\n\nТак как в результате преобразований все элементы одной из строк\nматрицы стали равны 0, а свободный член соответствующей строки\nнет, то система не совместна.\n\nОтвет: система линейный уравнений не совместна."); getch(); break;

                        case 2: printf("\n\nТак как в результате преобразований все элементы одной из строк\nматрицы стали равны 0 (в том числе и свободный член\nсоответствующей строки), то система имеет бесконечное множество решений.\n\n\n\nОтвет: система линейный уравнений имеет бесконечное множество решений"); getch(); break;

                        case 3: Error("\n\nОШИБКА: Не удалось выделить память под хранение результата!\nНажмите любую клавишу..."); break;

                  } 

                  DelMatrix(Matrix, NumRow);

            }

      }

      return 0;

}

int SizeFormatCheck(unsigned int *NumRow, unsigned int *NumCol, char String[]){

      int StrLength = strlen(String) - 1;

      int NumSymbols = 0;

      int Degree = 1;

      int NowNumber = 0;

      int Length = 0;

      for (int i = StrLength; i > -1; i--) { 

            if (((i == StrLength || i == 0) && String[i] == '*') || (i == 0 && NumSymbols == 0)) { 

                  return(Error("\nОШИБКА: Вы не ввели два целых числа!\nНажмите любую клавишу...")); 

            }

            if (String[i] == '*') { 

                  NumSymbols++;

                  *NumCol = NowNumber;

                  NowNumber = 0;

                  Length = 0;

                  Degree = 1;

                  continue; 

            }

            if (!DigitCheck(&String[i]) || NumSymbols > 1) {

                  return(Error("\nОШИБКА: Вы должны ввести только два целых положительных числа, разделённых\nсимволом \"*\"!\nНажмите любую клавишу..."));

            }

            if (Length == 9 && ((int)String[i] - 48 > 2 || NowNumber > 147483647)) {

                  return(Error("\nОШИБКА: Слишком большое число!\nНажмите любую клавишу..."));

            }

            NowNumber += ((int)String[i] - 48)*Degree;

            Degree *= 10;

            Length++;

      }

      *NumRow = NowNumber;

      return 1;

}

int DigitCheck(char *Symbol){

      char Permissible[] = "0123456789";

      for (int i = 0; i < 10; i++) {

            if (Symbol[0] == Permissible[i]) {return 1;}

      }

      return 0;

}

int ElementsCheck(float *Element, char String[]){

      int StrLength = strlen(String);

      int NumSymbols = 0;

      int Degree = 10;

      float Number = 0;

      float Sign = 1.0;

      for (int i = 0; i < StrLength; i++) {

            if (String[i] == ',' && (i == 0 || i == StrLength - 1)) { 

                  return(Error("\n\nОШИБКА: Неверно введено вещественное число! (Отсутствует целая или дробная\nчасть.)\nНажмите любую клавишу..."));

            }

            if (String[i] == ',') {

                  NumSymbols++;

                  continue;

            }

            if (i == 0 && String[0] == '-') { 

                  Sign = -1.0;

                  continue; 

            }

            if (NumSymbols > 1 || !DigitCheck(&String[i])) {

                  return(Error("\n\nОШИБКА: В записи одного из чисел содержится недопустимый символ!\nНажмите любую клавишу..."));

            }

            if (NumSymbols == 0) {

                  Number = Number*10 + ((int)String[i] - 48);

            } else {

                  Number += ((float)String[i] - 48)/Degree;

                  Degree *= 10;

            }

            if (NumSymbols == 0 && String[i] != ',' && abs(Number) > 1073741823) {

                  return(Error("\n\nОШИБКА: Одно из чисел слишком велико по модулю!\nНажмите любую клавишу..."));

            }

      }

      *Element = Sign*Number;

      return 1;

}

int Gauss(float **Matrix, int NumRow, int NumCol) {

      printf("\n\nШаг 0 (исходная матрица):\n\n");

      PrintMatrix(Matrix, NumRow, NumCol);

      float Multiplier;

      for (int i = 0; i < NumCol - 1; i++) {

            printf("\n\nШаг %d:\n\n", i+1);

            if (!ChangeStrings(Matrix, NumRow, NumCol, i)) {

                  printf("В матрице, полученной на предыдущем шаге, элементы %d-го столбца,\nначиная с %d-ой строки равны 0. Переходим к следующему шагу.", i + 1,i + 1);

                  continue; 

            }

            for (int j = i + 1; j < NumRow; j++) { 

                  Multiplier = -1*Matrix[j][i]/Matrix[i][i];

                  for (int k = i; k < NumCol; k++) {

                        Matrix[j][k] = Matrix[j][k] + Multiplier*Matrix[i][k];

                  } 

            }

            PrintMatrix(Matrix, NumRow, NumCol);

      }

      return 0;

}

int ChangeStrings(float **Matrix, int NumRow, int NumCol, int NowI) {

      if (Matrix[NowI][NowI] != 0) {return 1;}

      float Element;

      for (int i = NowI; i < NumRow; i++) {

            if (Matrix[i][NowI] != 0) {

                  for (int j = NowI; j < NumCol; j++) {

                        Element = Matrix[i][j];

                        Matrix[i][j] = Matrix[NowI][j];

                        Matrix[NowI][j] = Element;

                  }

                  printf("В матрице, полученной на предыдущем шаге, меняем местами строки %d и %d: \n\n", NowI + 1, i + 1);

                  return 1;

            }

      }

      return 0;

}

int ReverseGauss(float **Matrix, int NumRow, int NumCol, float *Result) {

      int NumNil, i, j;

      for (i = 0; i < NumCol - 1; i++) {

            NumNil = 0;

            for (j = 0; j < NumCol - 1; j++) {

                  if (abs(Matrix[i][j]) < 1e-5) {NumNil++;}

            }

            if (NumNil == NumCol - 1 && abs(Matrix[i][NumCol - 1]) > 1e-5) {return 1;}

            if (NumNil == NumCol - 1 && abs(Matrix[i][NumCol - 1]) < 1e-5) {return 2;}

      }

      if (Result == NULL) {return 3;}

      float Summ;

      for (i = NumCol - 2; i > -1; i--) {

            Summ = Matrix[i][NumCol - 1];

            for (j = NumCol - 2; j > i; j--) {

                  Summ -= Result[j]*Matrix[i][j];

            }

            Result[i] = Summ/Matrix[i][i];

Информация о работе Разработка программного комплекса решения математической задачи численными методами