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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2011, 13:24   #1
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
Смущение Не получается разобраться в коде

Сам код приведен ниже. Этот код позволяет решать СЛАУ методом Гаусса-Якоби.
На вход он получает данный файл:
Цитата:
4

25.3 8 7.4 6.2 14.49 -3.3

-11 -45 -17.7 -5.9 -212.19 2.1

2.35 -5.6 -13.8 3.3 -104.025 7.2

-2.9 -4.1 -6.6 18.1 34.89 4.5

0.001
Насколько я понял - 1ая строка это размерность матрицы. Далее идёт сама матрица. Последняя же строка - точность, с которой необходимо произвести расчеты. Не понимаю принцип работы - что и откуда и как обозначено Прошу, прокомментируйте действия выполняемые в программе. То, с чем я разобрался более-менее, я обозначил коментариями. Процедуру вообще не понял. Исходный текст во вложениях.
На выходе получаем:
Цитата:
-3.29998841
2.10001804
7.20002662
4.49996850
k_prog=65
k=16
delta_k=5.583115e-04
delta=3.150091e-05
Вложения
Тип файла: txt main_comments.txt (6.3 Кб, 123 просмотров)
stck вне форума Ответить с цитированием
Старый 22.12.2011, 15:02   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
 double delta = -1;    //Разность компонент столбца иксов соседних итераций
        double norm;          //Норма, определяемая как наибольшая разность компонент столбца иксов соседних итераций.
По вашему в этом можно что-то понять? Даже Штирлицем не распозналось
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.12.2011, 15:19   #3
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Прошу прощения, у меня Debian, - поставьте кодировку UTF-8.
Закинул на pastie.org

Последний раз редактировалось stck; 22.12.2011 в 15:22.
stck вне форума Ответить с цитированием
Старый 22.12.2011, 16:23   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от stck Посмотреть сообщение
Прошу прощения, у меня Debian, - поставьте кодировку UTF-8.
Закинул на pastie.org
Странная политика. Надо Вам, а кодировку будем менять мы.
Может, О Великий, Вы снизойдёте до нас, грешных и выложите читаемый код?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.12.2011, 16:33   #5
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Не очень красиво получилось с моей стороны.
Вот прилагаю в utf8 и ansi
Вложения
Тип файла: txt main_comment.utf8.txt (6.4 Кб, 117 просмотров)
Тип файла: txt main_comment.ansi.txt (5.5 Кб, 118 просмотров)
stck вне форума Ответить с цитированием
Старый 22.12.2011, 17:24   #6
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Исправил
Код:
int main()
{
        ofstream fout("out.txt"); 							// Выводим поток в файл "out.txt"
        ifstream fin("in.txt");								// Вводим на чтение в поток файл "in.txt"
        if(fin.fail())                    					// Если есть ошибка чтения:
        {
                cout << "unable to open in.txt" << endl;  	// в консоль выводим сообщение
                return 1;                                   // завершаем с кодом "1"
        }
        int size;             								// Инициализируем переменную размерности
        fin >> size;        								// и считываем её
 
        double **system = new double*[size]; 				// Инициализируем массив длиной [size]
        for(int i = 0; i < size; i++)                   	// Проходясь по всему массиву
                system[i] = new double[size+1];				// инициаизируем вторую размерность
        double *x = new double[size];            			// Инициализируем массив правильных
        for(int i = 0; i < size; i++)                   	// Построчно считываем матрицу
        {
                for(int j = 0; j < size + 1; j++)     		// и элементы a(1),a(2),...,a(n),b
                        fin >> system[i][j];            	// записываем в нашу матрицу
                fin >> x[i];                               	// последний же записываем в массив истинных решений
        }
 
        double EPS;    										// Определяем переменную точности
        fin >> EPS;     									// Считываем ёё из файла
 
        int k;												// Наименьшее целое решение неравенства delta_k<=eps
		int kprog;	     									// Прогнозируемого числа итераций
        double delta_k;										// Разность компонент столбца иксов соседних итераций
        double *res = new double[size]; 					// инициализируем массив результата
        solution(system,size,EPS,res, &kprog,&k,&delta_k); 	// Выполняем процедуру "solution"
 
        double delta = -1;    								// Абсолютная погрешность
        double norm;          								// Норма, определяемая как наибольшая разность компонент столбца иксов соседних итераций.
        for(int i = 0; i < size ;i++) 						// В цикле от 1 до размерности матрицы
        {
                norm = fabs(x[i] - res[i]); 				// Норма = Разница по модулю между столбцом иксов и столбцом решений
                if(norm > delta)              				// Если норма > разницы
                        delta = norm;         				//       Разность=норма
        }
 
        for(int i = 0; i < size; i++)                       // В цикле от 1 до [size]
            fout << fixed << setprecision(8) << res[i] << endl;// Выводим в поток столбец результата, кол-во знаков после точки - 8
        fout << "k_prog=" << kprog << endl;                 // Выводим прогнозируемое число итераций
        fout << "k=" << k << endl;                          // Выводим наименьше целое решение неравенства delta_k<=eps
        fout << scientific << setprecision(6) << "delta_k=" << delta_k << endl;// Выводим разность компонент столбца иксов и соседних итераций
        fout << "delta=" << delta << endl;                  // Выводим delta
 
        fin.close();                                        // Закрываем поток на чтение
        fout.close();                                       // Закрываем поток на запись
        for(int i = 0; i < size; i++)                       // Очищаем мусор
                delete [] system[i];
        delete [] system;
        delete [] x;
        delete [] res;
 
        return 0;                                           // Возвращаем "успешное завершение"
}
stck вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться в коде zif0rka PHP 6 05.12.2011 01:22
Не получается разобраться с xlat (assembler) sunny_alice Помощь студентам 9 12.05.2011 00:05
Не получается разобраться в программе с указателями sunny_alice Паскаль, Turbo Pascal, PascalABC.NET 15 16.04.2011 22:26
не получается разобраться в коде ! разъясните пожалуйста! код внутри! Lion_paint Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2009 09:30