
- •«Разработка программного комплекса решения математической задачи численными методами»
- •3.Руководство программиста 15
- •1.Описание программы
- •1.4. Используемые технические средства
- •1.4.1. При разработке
- •1.4.2. Минимальные требования
- •1.5. Вызов и загрузка
- •2.3. Описание задачи
- •Правила исключения интервалов
- •2.4. Входные данные
- •3.4. Входные и выходные данные.
3.4. Входные и выходные данные.
3.4.1. Входные данные.
Входными данными, задающимися пользователем являются:
- коэффициенты при степенях x;
- коэффициент при свободном члене уравнения;
- значение точности производимых вычислений;
- значение диапазона: начальное и конечное положение координат отрезка поиска.
3.4.2. Выходные данные.
Выходными данными являются:
- точка минимума функции;
- значение функции в этой точке;
3.5. Сообщения
Сообщения, возникают на экране во время выполнения данной программы в случае четырех возможных ошибок:
1.Пользователь ввел значение степени, не входящее в заданный интервал [2;5]
2. При неправильном указании интервала.
3.Погрешность вычисления отрицательна.
4. Значение погрешности нулевое.
4.ОПИСАНИЕ КОНТРОЛЬНОГО ПРИМЕРА
4.1 Назначение программы
Программа предназначена для нахождения экстремумов функции при задаваемых коэффициентах, точности и интервале. Программа имеет некоторые ограничения, которые необходимо учитывать пользователю при вводе тех или иных параметров. В любом случае параметры проверяются перед расчетом.
4.2. Целью проведения испытаний
Проверить правильность нахождения точки минимума методом деления отрезка пополам (методом дихотомии).
4.3 Требования, подлежащие проверке
- Правильность нахождения точки минимума;
- Правильность нахождения значения функции в точке;
- Верность выдаваемых сообщений об ошибке или предупредительных сообщений при наличии данных, некорректно введенных пользователем.
4.4. Технические программные средства, используемые при вводе
Технические средства: компьютер типа IBM PC, мышь и клавиатура.
Программные средства: операционная система Microsoft Windows XP Professional и тестируемая программа.
4.5. Порядок проведения тестирования
- Вести значения, соответствующие проверяемым требованиям;
- Отследить результаты работы программы;
- Сравнить полученные значения с ожидаемыми результатами.
4.6. Используемые методы тестирования
Проверка правильности нахождения точки минимума
1) Зададим коэффициенты многочлена:
1 0 56 8 95 63
2) Введем интервал поиска:
-5 2
3) Введем точность вычислений:
0,01
4) Рассчитаем:
4.6.2. Проверка поведения программы при заведомо неправильных входных данных
Ошибки
1.Пользователь ввел значение степени, не входящее в заданный интервал [2;5]
2. При неправильном указании интервала.
3.Погрешность вычисления отрицательна.
4. Значение погрешности нулевое.
Текст программы
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define gxy gotoxy
#define cpr cprintf
#define rpr rprintf
#define tc textcolor
int x[]={10,10,10}, y[]={7,8,9};
FILE *hlp;
void rprintf(char str[]) {
char buffer[200];
CharToOem(str,buffer);
cpr("%s",buffer); }
void draw_window(char *caption, int xl, int xr, int yu, int yd, int cf, int cb) {
register short int x, y;
tc(cf);
gxy(xl,yu); putch(218);
gxy(xl,yd); putch(192);
gxy(xr,yu); putch(191);
gxy(xr,yd); putch(217);
for(x=xl+1;x<xr;x++) {
gxy(x,yu); putch(196);
gxy(x,yd); putch(196); }
for(y=yu+1;y<yd;y++) {
gxy(xl,y); putch(179);
gxy(xr,y); putch(179);
for(x=xl+1;x<xr;x++) {
gxy(x,y);putch(32); } }
gxy(xl+floor((xr-xl-strlen(caption))/2),yu); cpr("%s",caption);
}
int selection(int *x, int *y, int cnt) {
int cur=1, i, c;
int pressed_key;
const int enter_key=13, up_arrow=72,down_arrow=80,esc_key=27;
do {
for(i=0;i<cnt;i++)
{
gxy(x[i],y[i]);
if(i+1==cur)c=14; else c=0;
tc(c); putch(16);
}
pressed_key=getch();
switch(pressed_key) {
case up_arrow: cur=(cur==1)?cnt:cur-1;break;
case down_arrow: cur=(cur==cnt)?1:cur+1;break;
case esc_key: exit(0);
case enter_key: return cur;
default: break; }
}while(pressed_key!=up_arrow||pressed_key!=down_arrow);
}
float F(float v, int n, float*k)
{
int i;
float tmp=0;
for(i=n;i>=0;i--)
{
tmp+=k[i]*pow(v,i);
}
return tmp;
}
int main(void) {
int choice,i,j;
int n,xc,yc;
float *k,a,b,p,l,r,fl,fr,fx,xp,root;
char s[50];
for(;;){
clrscr();
gxy(7,6);rpr("______________________КУРСОВАЯ РАБОТА_____________________");
gxy(7,5);rpr("__________________________________________________________");
gxy(7,6); rpr(""); tc(2);
gxy(7,7); rpr(" Ввести данные и начать работу...");
gxy(7,8); rpr(" Инфо о сие замечательном творении...");
gxy(7,9); rpr(" Выход...");
gxy(7,10); rpr(""); tc(7);
gxy(7,11); rpr("______________________КЛАВИШИ:_________________________");
gxy(7,12); rpr(" ВНИЗ, ВВЕРХ - Выбор");
gxy(7,13); rpr(" ESC - выйти; ENTER - подтвердить");
gxy(7,14); rpr("_______________________________________________________");
tc(3);
gxy(7,15); rpr("___________________ТОКАРЧУК Н.А.______________________");
choice=selection(x,y,3);
switch(choice) {
case 1: clrscr();tc(14);
rpr("____________________Вводд данных:___________________\n\r"); do {
tc(7);rpr("Введите степень многочлена из интервала [2; 5]-> ");
scanf("%d",&n);
if(n<2 || n>5)
{
tc(4);rpr("НЕПРаВИЛЬНОЕ ЗНАЧЕНИЕ!\n\r");tc(7);
}
}while(n<2 || n>5);
k=new float[n+1];
rpr("Введите коэффициенты многочлена при степенях, начиная со старшего:\n\r");
for(i=0;i<=n;i++)scanf("%f",&k[n-i]);
tc(2);rpr("ПОЛУЧЕННЫЙ МНОГОЧЛЕН:\n\r");tc(10);
for(i=n;i>=0;i--)
{
if(k[i]<0 || i==n)cpr("%f(X^%d)",k[i],i);
else if(i!=n)cpr("+%f(X^%d)",k[i],i);
}
putch(8);putch(8);putch(8);putch(8);putch(8);
cpr(" = 0 \n\r\n\r");tc(7);
do {
rpr("Введите интервал [a; b], содержащий корень
уравнения:\n\r");
rpr("Примечание: Функция y=f(x) должна иметь на указанном
интервале только 1 корень,\n\r");
rpr("быть монотонной и не иметь точек перегиба.\n\r");
scanf("%f %f", &a,&b);
if(a==b || a>b)
{
tc(4);rpr("НЕПРАВИЛЬНОЕ УКАЗАНИЕ ИНТЕРВАЛА!\n\r");tc(7);
}
}while(a==b || a>b);
do {
rpr("Введите точность вычисления корня уравнения:");
scanf("%f", &p);
if(p>0.1 || p<0.0000001)
{
tc(4);rpr("НЕПРАВИЛЬНОЕ УКАЗАНИЕ ПОГРЕШНОСТИ!\n\r");tc(7);
}
}while(p>0.1 || p<0.0000001);
if(F(a,n,k)*F(b,n,k)>0)
{
tc(14);rpr("Уравнение не имеет корней либо имеет более 1 корня
на указанном интервале!\n\r");
tc(7);rpr("Нажмите любую клавишу..."); getch();
break;
}
l=a;r=b;
fl=F(l,n,k);
fr=F(r,n,k);
do {
xp=(l+r)/2;
fx=F(xp,n,k);
if(fx==0)
{
root=fx; break;
}
if(fx*fl<0)
{
r=xp; fr=fx;
}
else
{
l=xp; fl=fx;
}
if(r-l-p<0)root=(r+l)/2;
}while(r-l-p>=0);
tc(13);rpr("Корень уравнения X = ");
cpr("%f\n\r",root);
tc(7);rpr("Нажмите любую клавишу...");
getch();
delete [] k;
break;
case 2: draw_window(" HELP ", 1, 80, 1, 23, 10, 0);
if((hlp=fopen("c:\\hlp.txt","rt"))==NULL)
{
gxy(10,8);tc(4);rpr("Файл не найден!\n\r");
gxy(10,9);tc(7);rpr("Нажмите любую клавишу...");
getch(); break;
}
xc=2,yc=2;
tc(11);
while(!feof(hlp))
{
s[0]='\0';
fscanf(hlp,"%s",&s);
strcat(s," ");
if(xc+strlen(s)>79){xc=2;yc++;}
gxy(xc,yc); rpr(s);
xc+=strlen(s);
}
rpr("\n\r\n\r"); tc(15);
putch(179);rpr("Нажмите любую клавишу...");
getch(); break;
case 3: exit(0);
default:break; }
}
}
ЗАКЛЮЧЕНИЕ
Результатом выполнения курсовой работы является программа, позволяющая находить минимум унимодальной функции, записанной в виде полинома 5-ой степени, на заданном интервале методом деления отрезка пополам (методом дихотомии).
Программный продукт обладает интерфейсом пользователя эстетичного внешнего вида с эргономичным расположением управляющих элементов, содержит систему меню, строго определяющую диалог пользователя с программой, систему помощи, позволяющую пользователю получить справку о текущем состоянии программы, вариантах продолжения работы и о математической основе происходящего. Также имеет место обработчик ошибок пользователя и выполнения с выдачей диагностического сообщения.
Автор стремился сделать программу дружественной к пользователю. Окна не насыщены графикой и ненужными элементами.
Также были написаны некоторые документы, соответствующие заданию кафедры, прилагающиеся к программному обеспечению в соответствии с ЕСПД и СТД АСУ.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Глушаков С. В. Программирование в среде Borland C++ Builder 6.0 /
С. В. Глушаков, К. Н. Зорянский, С. Н. Хомяков.-М: Фолио,2003.-508с.
2. Архангельский А.Я. Программирование в C++Builder 6./ А.Я. Архангельский. – М.: Бином – Пресс, 2003. – 1152с.