Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2011, 11:15   #1
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию Не работает код

Нашел программу для решения систем алгебраических уравнений.
Работает, но на маленьких матрицах. Запустил на матрице порядка 3000 - не работает. в чем ошибка не пойму. Программа просто падает, не выдавай никаких результатов.
Код:
#include <stdio.h>
#include <process.h>
#include <sstream>
#include <fstream>
#include <iostream>
 
using namespace std;
 
float **a, *b, *x;
int N;
char filename[256];
FILE* InFile=NULL;
void count_num_lines(){
   //count number of lines in input file - number of equations
   int nelf=0;       //non empty line flag
   do{
       nelf = 0;
       while(fgetc(InFile)!='\n' && !feof(InFile)) nelf=1;
       if(nelf) N++;
   }while(!feof(InFile));
}
 
void freematrix(){
   //free memory for matrixes
   int i;
   for(i=0; i<N; i++){
       delete [] a[i];
   }
   delete [] a;
   delete [] b;
   delete [] x;
}
 
void allocmatrix(){
   //allocate memory for matrixes
   int i,j;
   x = new float[N]();
   b = new float[N]();
   a = new float*[N]();
   if(x==NULL || b==NULL || a==NULL){
       printf("\nNot enough memory to allocate for %d equations.\n", N);
       exit(-1);
   }
   for(i=0; i<N; i++){
       a[i] = new float[N];
       if(a[i]==NULL){
           printf("\nNot enough memory to allocate for %d equations.\n", N);
       }
}
 
void readmatrix(){
   int i=0,j=0;
   //read matrixes a and b from input file
   for(i=0; i<N; i++){
       for(j=0; j<N; j++){
           fscanf(InFile, "%f", &a[i][j]);
       }
       fscanf(InFile, "%f", &b[i]);
   }
}
 
//void printmatrix(){
//   //print matrix "a"
//   int i=0,j=0;
//   printf("\n");
//   for(i=0; i<N; i++){
//       for(j=0; j<N; j++){
//         printf(" %+f*X%d", a[i][j], j);
//       }
//       printf(" =%f\n", b[i]);
//   }
//}
 
//void testsolve(){
//   //test that ax=b
//   int i=0,j=0;
//   printf("\n");
//   for(i=0; i<N; i++){
//       float s = 0;
//       for(j=0; j<N; j++){
//         s += a[i][j]*x[j];
//       }
//       printf("%f\t%f\n", s, b[i]);
//   }
//}
void printresult(){
   int i=0;
   ofstream ofsx("x.txt");
   printf("\n");
   printf("Result\n");
   for(i=0; i<N; i++){
           ofsx << x[i] << endl;
       //printf("X%d = %f\n", i, x[i]);
   }
}
void diagonal(){
   int i, j, k;
   float temp=0;
   for(i=0; i<N; i++){
       if(a[i][i]==0){
           for(j=0; j<N; j++){
               if(j==i) continue;
               if(a[j][i] !=0 && a[i][j]!=0){
                   for(k=0; k<N; k++){
                       temp = a[j][k];
                       a[j][k] = a[i][k];
                       a[i][k] = temp;
                   }
                   temp = b[j];
                   b[j] = b[i];
                   b[i] = temp;
                   break;
               }
           }
       }
   }
}
void cls(){
   for(int i=0; i<25; i++) printf("\n");
}
void main(){
   int i=0,j=0, k=0;
   cls();
   do{
       printf("\nInput filename: ");
       scanf("%s", filename);
       InFile = fopen("3.txt", "rt");
   }while(InFile==NULL);
   count_num_lines();
   allocmatrix();
   rewind(InFile);
   //read data from file
   readmatrix();
   //check if there are 0 on main diagonal and exchange rows in that case
   diagonal();
   fclose(InFile);
   //printmatrix();
   //process rows
   for(k=0; k<N; k++){
       for(i=k+1; i<N; i++){
           if(a[k][k]==0){
               printf("\nSolution is not exist.\n");
               return;
           }
           float M = a[i][k] / a[k][k];
           for(j=k; j<N; j++){
               a[i][j] -= M * a[k][j];
           }
           b[i] -= M*b[k];
       }
   }
   //printmatrix();
   for(i=N-1; i>=0; i--){
       float s = 0;
       for(j = i; j<N; j++){
           s = s+a[i][j]*x[j];
       }
       x[i] = (b[i] - s) / a[i][i];
   }
 
   InFile = fopen(filename, "rt");
   readmatrix();
   fclose(InFile);
   //printmatrix();
   //testsolve();
   printresult();
   freematrix();
}
программа, по идее, считывает из файла матрицу и столбец свободных членов.
Матрица и столбец, которые я должен решить, прикрепил в топику.
Вложения
Тип файла: rar матрица с присодиненным столбцом.rar (76.6 Кб, 10 просмотров)
hello19 вне форума Ответить с цитированием
Старый 02.08.2011, 11:21   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Запустил на матрице порядка 3000 - не работает. в чем ошибка не пойму. Программа просто падает, не выдавай никаких результатов.
Дык переполнение стэка скорей всего произошло. 3000*3000 = 9000000 - элементов!
Это считай 36000000 байт информации (тип Float = 4 байта)... что равно почти 32 МБ...

Я точно не знаю, сколько размер стека нынче, у старых компиляторов было 65кб вроде...
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 02.08.2011, 11:22   #3
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию

Так ведь я как раз и делаю с помощью кучи
hello19 вне форума Ответить с цитированием
Старый 02.08.2011, 11:29   #4
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от hello19 Посмотреть сообщение
Так ведь я как раз и делаю с помощью кучи
Понятно. Тогда напиши в конце программы

Код:
cin.get();
cin.get();
return 0;
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 02.08.2011, 11:34   #5
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию

а что делается этими строчками???
hello19 вне форума Ответить с цитированием
Старый 02.08.2011, 13:23   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

что значит "падает"? ошибку какую-то выводит?
Carbon вне форума Ответить с цитированием
Старый 02.08.2011, 13:27   #7
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию

Вообще без ошибки.. просто появляется окно с надписью
"Progra.exe hes stopped working" Проблема заключается в считывании матрицы...
hello19 вне форума Ответить с цитированием
Старый 03.08.2011, 15:19   #8
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

по моему программа работает на матрице из файла 3.txt - мне выдала что решения системы не существует

в функции main поправьте
Код:
   do{
       printf("\nInput filename: ");
       scanf("%s", filename);
       InFile = fopen(filename, "rt");
   } while(InFile==NULL);
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 03.08.2011, 15:55   #9
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию

Уже исправил...
hello19 вне форума Ответить с цитированием
Старый 05.08.2011, 11:58   #10
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию

Нароод! помогиет!!
Надо считать столбец свободных членов системы.
Решил просто проверить как работает. Считываю, записываю в массив, вывожу. Вот код:
Код:
 int range;
    cin >> range;
    // Colum of free members
    double *free = new double[range];
    ifstream ifsf("B.txt");
    double q;
    int i = 0;
    int j = 0;
    while ( ifsf >> free[i] )
    {
        i++;
    }
    ifsf.close();
    ofstream ofs("B-0.txt");
    for ( int i = 0; i < range; i++ )
    {
        ofs << free[i] << endl;
    }
    ofs.close();
hello19 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код не работает в IE asdasdasdasd HTML и CSS 5 24.08.2010 19:36
Не работает код. ApxuKILLER Общие вопросы .NET 2 20.05.2010 00:46
Не работает код. Messer Общие вопросы Delphi 0 15.05.2010 21:11
Не работает код... prizrak1390 Общие вопросы Delphi 3 22.10.2008 14:59