Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 Вычислительная математика практика 01-03.pdf
Скачиваний:
19
Добавлен:
05.06.2015
Размер:
390.2 Кб
Скачать

Вычислительная математика. Практикум

Соглашения

В документе используются следующая терминология и сокращения:

MSVS2008 — среда разработки Microsoft Visual Studio 2008 (допускает-

ся также среда года выпуска 2010).

Решаемая функция — функция, решение которой необходимо найти. Функция метода — функция, в пределах которой реализуется задан-

ный метод решения решаемой функции. Основной модуль — модуль основной функции.

Общие замечания

Программирование осуществляется в среде MSVS2008. Программы пишутся на языке программирования C (C++). Все задания выполняются в одном решении (solution в терминологии Microsoft Visual Studio), при этом каждый исследуемый метод выполняется в отдельном модуле (отдельном файле) типа .h (заголовочный), название которого будет задано преподавателем явно.

Каждый метод описывается в виде отдельной функции (функции метода), название которой задает преподаватель, в указанном выше файле. Функция метода имеет параметры, определяемые заданием.

Основная функция main описывается в модуле, который будет создан мастером MSVS2008.

Текст программ должен соответствовать требованиям ТПМ1 с точностью до пробела, со следующими ограничениями:

-каждый модуль должен иметь файловый комментарий;

-основная функция должна иметь комментарий «Основная функция»;

-решаемая функция должна иметь комментарий «Решаемая функция метода название метода»;

-функция метода имеет многострочный комментарий:

Метод название метода (e.g. «Метод деления отрезка пополам») Аргументы:

описание первого аргумента описание второго аргумента

. . .

. . .

-другие комментарии — по желания программиста;

-скобка, открывающая тело функции, должна располагаться в первой строке этой функции, например:

1 См., например, «Вл. Пономарев. ТПМ. Требования к программным модулям. Методические указания. Ред. 1. Озерск: ОТИ МИФИ, 2006. — 40 с.».

1

double foo(double x) {

/* код тела функции */

}

Если задание предусматривает одновременное решение разными способами, каждый отдельный способ описывается функцией, заданное название которой заканчивается цифрой, обозначающей порядковый номер способа, например, half1, half2 … (при этом неявно предполагается, что количество способов реализации метода не должно превышать девяти).

Порядок выполнения первого задания

1)Откройте MSVS2008

2)На вкладке Start Page выберите Create Project

3)В диалоге New Project в списке Project types выберите Visual C++ —

Win32

4)В диалоге New Project в списке Templates выберите Win32 Console Application

5)В поле Name введите VM1 (вычислительная математика 1 курс)

6)В поле Location введите C:\ 2

7)Нажмите кнопку OK

8)Нажмите кнопку Finish

9)Появится проект и основная функция примерно следующего вида:

int _tmain(int argc, _TCHAR* argv[])

{

return 0;

}

Замените описание основной функции следующим:

/* Основная функция */ void _tmain() {

}

10) Замените файловый комментарий основного модуля на, например, следующий:

/* Файл VM1.cpp

*/

/* ОТИ НИЯУ МИФИ

*/

/* 1ПО-XXД

*/

/* Пономарев Владимир Вадимович

*/

/* Вычислительная математика

*/

/* Программа VM1

*/

/* Основной модуль

*/

/* 20.02.2013

*/

2 Вы можете также использовать имя диска вашего личного сменного носителя информации, однако помните, что ресурс числа записей на него может быть ограничен, а сам диск может быть недоступен во время сеанса работы некоторое время по разным причинам.

2

11)Скомпилируйте проект, нажав сочетание клавиш Ctrl+Shift+B. Убедитесь, что проект не содержит ошибок, при необходимости устраните их.

12)Следуйте методическим указаниям и порядку выполнения задания практического задания №1.

13)Выполнив задание, убедитесь, что преподаватель начислил Вам необходимое количество баллов.

14)Сохраните решение (проект) с диска C: на ваш личный сменный носитель информации 3.

Общий порядок выполнения очередного (не первого) задания

1)Скопируйте решение (проект) с вашего личного сменного носителя информации на диск C: (см. также сноску 2), откройте его.

2)Следуйте методическим указаниям и порядку выполнения задания соответствующего практического задания.

3)Выполнив задание, убедитесь, что преподаватель начислил Вам необходимое количество баллов.

4)Сохраните решение (проект) с диска C: на ваш личный сменный носитель информации (см. также сноску 3).

Примечание. Во время выполнения задания периодически (примерно каждые 10 секунд) сохраняйте работу (например, нажимая сочетание клавиш Ctrl+S). После выполнения каждой отдельной законченной части работы проверяйте синтаксическую правильность вашей программы, компилируя ее (например, нажимая сочетание клавиш Ctrl+Shift+B).

Признак успешности выполнения алгоритма

Функция метода последним аргументом должна возвращать признак успешности выполнения алгоритма, название аргумента — success, параметр передается через указатель, используется тип int*.

Этот признак можно использовать различными способами.

1) Если возвращается нулевое значение success, алгоритм, например, зациклился, а если возвращается ненулевое значение, то считается, что алгоритм завершился успешно.

Для формирования такого способа идентификации успешности внутри функции метода должен быть сформирован счетчик числа итераций, название счетчика — cyclecount. Начальное значение этого счетчика задается равным нулю, а в каждой итерации цикла алгоритма счетчик инкрементируется (то есть увеличивается на единицу).

Если в какой-то момент значение счетчика достигает максимально допустимого числа итераций, название константы — MAX_CYCLE_COUNT, то алгоритм завершает свою работу с установкой признака успешного выполнения success в нулевое значение. Если по ходу выполнения алгоритма

3 Если вы использовали диск вашего личного сменного носителя информации, этот пункт не требует выполнения.

3

максимальное значение счетчика достигнуто не было, то алгоритм должен установить значение признака успешного выполнения success в единичное значение, например:

double method(..., int* success) { *success = 0;

int cyclecount = 0; double X = 0;

// рабочий цикл алгоритма while ( 1 ) {

if (cyclecount++ > MAX_CYCLE_COUNT) break; // алгоритм

*success = 1;

}

return X;

}

Здесь три подряд идущих точки обозначают другие аргументы функции метода (они разные для разных методов).

2) Признак успешного выполнения алгоритма на самом деле возвращает число выполненных итераций.

В этом случае в начале алгоритма задается начальное значение аргумента success, равное нулю:

double method(..., int* success) { *success = 0;

}

Далее в каждой итерации цикла значение success увеличивается на единицу (признак считает итерации), например:

double method(..., int* success) { *success = 0;

// рабочий цикл алгоритма while ( 1 ) {

(*success)++;

}

}

Если в какой-то момент времени значение признака достигнет максимального числа циклов, упомянутого выше в п.п. 1), алгоритм завершается, например:

double method(..., int* success) { *success = 0;

double X = 0;

// рабочий цикл алгоритма while ( 1 ) {

if ((*success)++ > MAX_CYCLE_COUNT) break;

}

return X;

}

4

В случае, если возвращается признак, равный нулю, алгоритм не выполнил ни одной итерации. Если число итераций равно 1, либо точное попадание на первой итерации, либо что-то неправильно в алгоритме. Если число итераций равно или превышает значение максимального числа итераций, алгоритм зациклился. В других случаях считается, что алгоритм завершился успешно, а признак успешности success показывает число итераций, что позволяет оценить алгоритм.

Оба способа формирования признака успешности обладают своими достоинствами и недостатками, однако более предпочтительным представляется метод 2).

После вызова функции метода вы можете использовать условный оператор, чтобы определить, выполнился ли алгоритм успешно, например:

void _tmain() {

int success = 0; double result = 0.0;

result = method(..., &success); if (success == 0) {

//неуспешно

printf("Failure\n");

}else {

//успешно

printf("SUCCESS=%d", success); printf("EPSILON=%0.3lfd", EPS); printf("RESULT0=%0.3lf", result);

}

}

Более предпочтительным представляется просто вывод всех результатов работы алгоритма без анализа признака успешности (однако в этом случае необходимо визуально контролировать признак) например:

void _tmain() {

int success = 0; double result = 0.0;

result = method(..., &success); printf("SUCCESS=%d", success); printf("EPSILON=%0.3lfd", EPS); printf("RESULT0=%0.3lf", result);

}

Наилучшим способом является комбинация описанных методов. При этом функция метода возвращает также, помимо признака успешности, счетчик итераций iteration. Определение функции метода должно иметь на один аргумент больше, чем описано в задании, например:

double method(..., int* success, int* iteration) {

}

Внутри функции метода при этом используются приемы работы с аргументами success и iteration, описанные выше.

5