Львівський державний університет безпеки життєдіяльності
Кафедра управління інформаційною безпекою
/
КУРСОВА РОБОТА
на тему:
"Розроблення програмного забезпечення
для розв’язання математичної задачі"
з дисципліни:
"Інформатика"
Зміст:
Вступ
Основним завданням перед написанням курсової роботи стояло розроблення програмного забезпечення для розв’язання математичної задачі. Щоб розробити таке програмне забезпечення мною використовувалися знання з таких предметів як “Технології програмування” та “ Мережеві операційні системи”. Мовою написання стала С++
Мово С++ є з однією з найдосконаліших серед мов програмування. Вона може використовуватися як для програмування математичних виразів, так і для написання складних логічних функцій.
C++ Builder — середовище швидкої розробки (RAD), що випускається компанією Codegear, дочірньою фірмою компанії Embarcadero (раніше Borland). Призначена для написання програм на мові програмування C++. C++ Builder об'єднує Бібліотеку візуальних компонентів і середовище програмування (IDE), написане на Delphi з компілятором C++. Цикл розробки аналогічний Delphi, але з істотними поліпшеннями, доданими в C++ Builder . Більшість компонентів, розроблених в Delphi, можна використовувати і в C++ Builder без модифікації, але, на жаль, зворотне твердження не вірне.
C++ Builder містить інструменти, які дозволяють здійснювати справжню візуальну розробку Windows-програм методом drag-and-drop, спрощуючи програмування завдяки WYSIWYG редакторові інтерфейсу, вбудованому в його середовище розробки .
C++ Builder спочатку створювалася тільки для платформи Microsoft Windows. Пізні версії, що містять, компонентну бібліотеку Borland, засновану на Qt, підтримують і Windows і Linux.
В даній курсовій роботі представлено, як за допомогою елементарних знань з програмування можна розробити універсальні функції та обчислити складне математичне завдання.
3. Опис функцій, що використовуються:
3.1.Функція, яка повертає значення від факторіалу
Код функції:
int fact (int i)
{
int z;
for ( z=i-1; z>0; z--)
i*=z;
return i;
}
Опис:
Як бачимо, дана функція приймає одне ціле число і після кількох операцій повертає його. У функції використовувався один цикл for та в циклі відбувалося накопичення добутку (обчислювався сам факторіал).
3.2. Вивід двовимірного масиву
Код функції
void vuvid(char *name, doubleA[sizeM][sizeM], int M, int N)
{
cout<<name<<endl;
for (int i=0; i<M; i++)
{
for (int j=0; j<N; j++)
cout<<setw(15)<<A[i][j]<<" ";
cout<<endl;
}
}
Опис:
Дана функція слугує для виводу двохвимірного масиву і його імені. Функція - універсальна, тому що ми передаємо їй ще й розмір матриці яку потрібно вивести. Тобто ми можемо передати великий масив, а вивести лише частину з нього. Імя масиву ми передаємо через вказівник *name.
Спочатку ми виводимо назву масиву. Далі задаємо два цикли, в яких і виводимо масив по елементно.
3.3. Добуток матриці на число
Код функції:
void dobutok (doubleD[sizeM][sizeM], doublek, int M, int N)
{
for (int i=0; i<M; i++)
for(int j=0; j<N;j++)
V[i][j]=D[i][j]*k;
}
Опис:
Дана функція слугує для обчислення добутку матриці на число. Ця функція ми передаємо розмір матриці. В коді функції ми бачимо, що у глобальному масиву V присвоюється значення добутку масиву на число.
Виклик функції: dobutok (D, (double) sizeM/n, M, N)
3.4. Добуток матриці на матрицю
Код функції
void dobutok (doubleA[sizeM][sizeM],doubleB [sizeM][sizeM], int M, int N)
{
for (int i=0; i<=M; i++)
for (int j=0; j<=N; j++)
{
float k=0;
for(int s=0; s<M; s++)
{
k+=A[i][s]*B[s][j];
Q[i][j]=k;
}
}
}
Опис:
Дана функція слугує для обчислення добутку двох матриць. Є універсальною. Спочатку ми задаємо два цикли, змінні з яких використовуємо для виклику елементів масиву. Далі створюємо нову змінну, яка буде елементом матриці Q і накопичуватиме суму добутку елементів рядка на стовпець. І створюємо ще один цикл, змінна якого служитиме саме для забезпечення в першій матриці постійного рядка, в другій постійного стовпця.
Виклик функції: dobutok(A, A, M, N)
3.5. Перезапис значень однієї матриці в іншу
Код функції
void perez (doubleA[sizeM][sizeM],doubleB[sizeM][sizeM], int M, int N)
{
for (int i=0; i<=M; i++)
for(int j=0; j<=N; j++)
A[i][j]=B[i][j];
}
Опис:
Функція доволі проста. Вона перезаписує елементи з одного масиву в інший. Але, я її застосував для того, щоб усунути найбільший недолік – локальні змінні. Щоб використати наприклад функцію добутку матриці на матрицю кулька раз, без цієї функції не обійтися. Це все тому, що функція добутку постійно записує в один і той самий масив.
Виклик функції: perez (S,Q,M,N);
3.6. Добуток стовпця на рядок
Код функції
void R_S (doubleA[sizeM],doubleB[sizeM], int M, int N)
{
for (int i=0; i<=M; i++)
for( int j=0; j<=N; j++)
P[i][j]=A[i]*B[j];
}
Опис:
Дана функція використовується для знаходження добутку стовпця на рядок. Їх добутком буде матриця. Функція проста, універсальна. Використовується два оператори циклу і потім елементу матриці присвоюється значення добутку елемента стовпця на елемент рядка.
Виклик функції: R_S (C,C,M,N)
3.7. Сума трьох матриць
Код функції
void suma (doubleA[sizeM][sizeM],doubleB[sizeM][sizeM],
doubleC[sizeM][sizeM], int M, int N)
{
for(int j=0; j<M; j++)
for (int i=0; i<N; i++)
X[j][i]=A[j][i]+B[j][i]+C[j][i];
}
Опис:
Дана функція використовується для знаходження елементів матриці X. В функцію ми передаємо три матриці рівних за розміром. Далі за допомогою двох циклів по елементно їх додаємо. Суму записуємо в глобальну матрицю Х.
Виклик функції: suma (Q, V, S, M, N)
4. Функції, що задані в завданні
4.1. Функція Q
Код функції:
doubleQq (doublex, doubley, doublez)
{
Qq=log(pow(fabs((y-sqrt(fabs(x*x-z)))*(y-x*x/z+4*y*y)),2./3));
return Qq;
}
Опис:
Дана функція виконує різні математичні операції над трьома вхідними величинами і повертає одне дійсне число Qq.
4.2. Функція F
Код функції:
double Ff(double x, double y, double z)
{
double Ff=((sqrt(pow(fabs(x*x-z),0.3))-pow(fabs(y-2*x),1./3))/(y+x*x-cos(pow(fabs(y-(z+x)),0.32))));
return Ff;
}
Опис:
В даній функції ми знаходимо суму елементів від i=1 до нескінченості. Сума буде вважатися знайденою, якщо доданок стане меншим від 0.0001. Для написання даної функції я використав оператор умовного циклу do while. Сума буде накопичуватися до тих пір, поки вираз не стане меншим за 0.0001. Коли умова виконалася, повертає значення Ff/
4.3. Сортування масиву за рядками
Код функції:
void sort (doubleA[sizeM][sizeM], int M, int N)
{
for (int q=0; q<M; q++)
for (int j=0; j<N; j++)
for(int i=0; i<M-1; i++)
if(A[q][i]>A[q][q+1])
{
doubley=A[q][i];
A[q][i]=A[q]A[i+1];
A[q][q+1]=y;
}
}
Опис:
Дана функція використовуєтьcя для сортування елементів масиву за рядками. Функція проста, вона базується виключно на простих операторах циклу, але вона програє в часі функціям які спеціально для цього призначені, наприклад швидке сортування чи бульбашкове сортування. Суть функції – за допомогою циклу ми N*M-1 разів перевіряємо рядок на відповідність посортованому. А для того щоб посортувати двохвимірний, я просто добавив ще один цикл який змінює рядок на наступниц, після того як вони посортуються.
Виклик функції: sort (B, M, N);
5. Знаходження матриць
5.1. Знаходження матриці d
Код функції:
doubleD[sizeM][sizeM];
for (int i=1;i<=M; i++)
for (int j=1; j<=N; j++)
D[i-1][j-1]=(c[j]+3.6*c[i]/c[i]-1.2)*fabs(cos(pow(c[j]),2));
vuvid("\nmatrica D", D, M, N);
Опис:
Знаходження матриці D не дуже важке. Так як це простий двохвимірний масив, в якому кожен елемент задається одним і тим самим математичним виразом. Спочатку я оголосив масив, а потім присвоїв йому певні значення.
5.2. Знаходження матриці С
Код функції:
doubleC[sizeM];
for (int i=1; i<=M; i++)
for(int j=0; j<=i+1;j++)
C[i-1]=((pow(j,0.23)/pow(s,2.3))+pow(pow(sin(s+pow(i,0.3)/s+i),2),1./i));
cout<<”\nmatrica C”<<endl;
for (int i=0; i<M; i++)
cout<<setw(13)<<C[i]<<” “;
cout<<endl;
Опис:
Щоб знайти вектор стовпець С, потрібно використати два цикли for, а потім просто розв’язати математичний вираз.
5.3. Знаходження матриці A
Код функції:
for (int i=1; i<=M; i++)
for(int j=1; j<=N; j++)
{
if (i=j)
A[i-1][j-1]=(log(fabs(i-j*j/i-4*j*j))-tan(pow(j,2)));
else if (i>j)
A[i-1][j-1]=((i*i)-pow(pow(i-sin(pow(j,2)),j),1./i));
else
A[i-1][j-1]=(pow(i,0.2)-(j*j/4)+pow(log(j*j*j),2));
}
Опис:
Для знаходження елементів масиву А, потрібно перевірити на дійсність задані умови. Для кожної умови свій математичний вираз. Якщо ні одна з умов не використовується, то інший математичний вираз. Для здійснення поставленої задачі, я використав два оператори циклу і два умови.
5.4. Знаходження матриці B
Код функції:
for (int i=1; i<=M; i++)
for(int j=1; j<=N; j++)
{
doubleq=0;
for (int h=1; h<=j+2; h++)
{
doublew=0;
for(int k=1; k<=i+1; k++)
w+=((k/s+j/fact(i))/(h+s));
q+=f*(w/(fact(h)+pow(pow(fabs(i*i+2*j-s),j),1./i)));
f=-f;
}
B[i-1][j-1]=q;
}
Опис:
Для знаходження елементів матриці В, потрібно було знайти суму від 1 до і+1 в чисельнику виразу (в коді програми це змінна w) і в загальному суму від 1 до і+1 від усього виразу (в коді це змінна q). Для виконання цієї задачі я користувався виключно оператором for.
6. Знаходження матриці Х
Код функції:
sort (A,M,M);
vuvid("\nposort matrica A", A,M,M);
sort(B,M,M);
vuvid("\nposort matrica B", B, M,M);
transp(D,Tr,M,M);
//vuvid("\nMatrica transp",Tr,M,M);
dobutok(A,kof,M,M);
//vuvid("\nMatrica V", V,M,M);
suma(V,Tr,M,M);
//vuvid("\nMatrica suma", X,M,M);
perez(Tr,X,M,M);
//vuvid ("\nMatrica Tr", Tr,M,M);
R_S(C,C,M,M);
perez(Rt,X,M,M);
MOBR(Rt,M);
//vuvid ("\nMatrica RT",Rt,M,M);
dobutok(Rt,Tr,M,M);
//vuvid("\nMatrica Q", Q,M,M);
perez(X,Q,M,M);
vuvid("\nMatrica",X,M,M);
Опис:
Для знаходження матриці Х, використано всі функції, які згадувалися до цього.
7. Знаходження елемента t
Код функції:
//Знаходження t
doublet,s,u[sizeM], maxX=X[0][0];
int kl;
for(int j=0;j<sizeM;j++)
{
s=0;kl=0;
for(int i=0;i<sizeM;i++)
{
if(maxX<X[i][j])
{
maxX=X[i][j];
}
if(X[i][j]<0)
{
s+=X[i][j];
kl++;
}
}
if (kl==0) u[j]=0;
else u[j]=s/kl;
}
s=u[0];
for(int i=0;i<sizeM;i++)
{
if(s<u[i])
s=u[i];
}
t=s/maxX;
cout<<"\nt="<<setw(15)<<t<<endl;
Опис:
В умові сказано, що ві………………………..
8. обчислення значення одновимірного масиву H
Код функції
doubleH[n]
for (int i=1; i<=M; i++)
{
for (int j=1;j<=N;j++)
{
H[i-1][j-1]=(pow(fabs(Ff(pow(s,2),j,t*i)),i./3)+
(min(Qq(s*s,s*t,i*j),Qq(j,t*t,s/i))/(max(pow(Ff(s,t*t,j),2),sqrt(fabs(Ff(j*t,s*s,s*i)))))));
}
cout<<endl;
}
Опис:
Для знаходження елементів вектор стовпця Н використано стандартні функції С++ для знаходження максимального і мінімального елемента серед кількох заданих.
Висновок:
В даній курсовій роботі було розроблено програмне забезпечення для розв’язання математичної задачі. Це все було виконано на базових знаннях отриманих з різних предметах.
У курсовій роботі, я навчився застосовувати теоретичні знання з програмування, розрахунку функцій, їх табулювання, накопичення значень, а також здійснювати правильний вивід отриманих значень. Навчився виконувати розрахунок математичних та логічних функцій, створювати масиви.
Список використаної літератури:
9. Код всієї програми: