Програма розрахунку сили супротиву
3
Постановка задачі
На частинку,яка рухається в середовищі, діє сила супротиву. Вона розраховується по формулі:
, де
S - площа проекції тіла на площину ;
- швидкість руху частинки відносно середовища;
- щільність середовища;
- коефіцієнт супротиву середовища;
Він залежить від числа Рейнольдса
,
де
- швидкість руху частинки відносно середовища;
d - діаметр частинки;
- щільність середовища;
- в'язкість середовища.
Конкретно :
= для Re,
= для 2 < Re ? 500,
=0,44 для 500 < Re < 2*.
Описати абстрактний клас «Об'єкт_обчислення» з елементом даних «Обчислювальний параметр». Передбачити три віртуальні функції:
1) Введення даних із файлу;
2) Розрахунок обчислюваного параметру;
3) Виведення в файл результату та вхідних даних.
Описати клас «Сила_опору», похідний від абстрактного класу. В ньому добавити елементи даних: , , d, , Re.
Крім віртуальних функцій передбачити перевантажені операції присвоєння, порівняння (= =, !=, <, <=, >, >=), а також конструктори: пустий, з ініціалізацією і копіювання.
Привести приклад програми, в якій застосувати усі конструктори, члени-функції і перевантажені оператори.
Порядок значень параметрів:
=1,29 кг/
=8-20 м/с,
d=1*,
Пояснювальна записка
В програмі використовуються:
1. Заголовкові файли стандартної бібліотеки:
§ <stdio.h> - прототипи для функцій введення/виведення;
§ <math.h> - прототипи для функцій математичної бібліотеки;
§ <iostream.h> - організація потокового введення/виведення;
§ <stdlib.h> - прототипи функцій для перетворення чисел в текст і навпаки, а також прототипи функцій розміщення пам'яті, генерації випадкових чисел і т.п.; в курсовій роботі застосовується для використання команди exit();
§ <fstream.h> - містить підкласи ofstream, ifstream та fstream, які забезпечують потоки введення/виведення в дискові файли;
§ <conio.h> - прототипи функцій консольного введення/виведення.
2. Класи:
§ Абстрактний - клас, в якому є хоча б одна чиста віртуальна функція.
§ Похідний - може використовувати як елементи даних базового класу (в якому передбачені загальні елементи даних і методи їх обробки, також це клас, з якого породжуються інші класи), так і мати свої власні елементи даних і методи для їх обробки.
3. Спеціальні члени-функції класу:
§ Конструктор - спеціальна функція, яка викликається кожного разу, коли треба створити новий об'єкт класу.
Пустий конструктор (конструктор по замовчуванню) - його задачею є створення об'єкта класу.
Конструктор з ініціалізацією в тілі - відбувається не тільки створення об'єкта, а й відбувається ініціалізація його елементів даних.
Конструктор копіювання - слугує для того, щоб під час створення нового об'єкту можна було скопіювати йому елементи даних уже раніше описаного об'єкту.
4. Функції:
§ Чисті віртуальні функції - функції без тіла (тіла функції немає, наприклад, тому, що ми не знаємо як реалізувати її тіло, але сама функція буде відображувати концепцію певної дії).
§ Inline-функції (вбудовані функції) - функції, які підставляються в точці виклику.
5. Структура вибору:
§ if/else - дає можливість програмісту вказати, залежно від того, істинна умова чи хибна, які дії будуть виконуватись.
§ if - використовується для вибору одного з альтернативних напрямків дій.
6. Вказівники:
§ Вказівник - змінна, яка містить адресу.
§ Неявний вказівник *this - вказівник на поточний об'єкт всередині члена-функції. В нього заноситься адреса об'єкту, який зв'язується з цією функцією.
7. Перевантажені оператори:
§ Перевантаження операторів - визначення функціональності вбудованих операторів при використанні з типами користувача.
8. Потоки:
§ Стандартні
cin - стандартний вхідний потік;
cout - стандартний вихідний потік;
§ Файлові
ofstream - відповідає за виведення інформації в файл;
ifstream - відповідає за введення інформації в файл;
Послідовність дійУ файлі kurs.cpp описуємо абстрактний клас «object» та похідний від абстрактного класу клас «sila_oporu».Підключаємо заголовкові файли:#include<iostream.h>-файл заголовків методів класів потоків вводу виводу інформації;#include<fstream.h> -
файл заголовків методів класів потоків для роботи з файлами;#include<math.h> - файл з прототипами математичних функцій, який забезпечує виконання математичних операцій;#include<conio.h> - файл з прототипами функцій консольного вводу/виводу;#include<stdlib.h> - файл, який містить в собі функції для виділення памяті, перетворення типів і керування процесом виконання програми.Потім оголошується клас «object »:class object{protected:double F;public:virtual void vvod()=0;virtual void resh()=0;virtual void resh1()=0;virtual void vivod()=0;};Тут ми оголосили змінну F типу double з міткою доступу protected. Це означає, що змінна F буде доступна для даного та похідних від нього класів. Також оголошені прототипи чистих віртуальних функцій.Далі описуємо клас «sila_oporu», що є
похідним від абстрактного класу. В ньому додаємо елементи даних. class sila_oporu: public object{private:double Q1;double s;double R;double V;double d;double m;double re;Визначаємо допоміжні функції:public:double S(){return (d*d*M_PI)/4;}double Re(){return ((V*d*R)/m);}double Q(){double re = Re();if (re<=2){ return 24/re;}if(2<re && re<=500){ return (18.5)/pow(re,0.6);}if(500<re && re<200000){return 0.44;}return 0;}Оголосимо пустий конструктор:sila_oporu(){}Оголосимо конструктор з ініціалізацією:sila_oporu(double Q1src, double ssrc, double Rsrc, double Vsrc){Q1=Q1src;s=ssrc;R=Rsrc;V=Vsrc;}Оголосимо конструктор копіювання:sila_oporu(const sila_oporu & src){Q1=src.Q1;s=src.s;R=src.R;V=src.V;}Визначаємо віртуальні функції, прототипи яких описані раніше:virtual void vvod(){ifstream ifs("dan.txt");if(!ifs){cout<<"Error: file \"dan.txt\" was not found"<<'\n';exit(1);}ifs>>R>>V>>d>>m;cout<<"Information from the file \"dan.txt\":\n R="<<R<<" V="<<V<<" d="<<d<<" m="<<m<<'\n';ifs.close();}virtual void resh(){F=((Q()*S()*R*V*V)/2);cout<<"F="<<F<<'\n';}virtual void resh1(){F=((Q1*s*R*V*V)/2);cout<<"F="<<F<<'\n';}virtual void vivod(){ofstream ofs("rez.txt");if(!ofs){cout<<"Error: file \"rez.txt\" was not found"<<'\n';exit(1);} ofs<<"Q="<<Q()<<"S="<<S()<<"R="<<R<<"V="<<V<<"Re="<<Re()<<"\nF="<<F;cout<<"The result was written into the file \"rez.txt\"\n";ofs.close();}Перевантажуємо операцію ==:sila_oporu & operator == (sila_oporu&src){if(F==src.F)cout<<"Power of object A and B are equal.\n";elsecout<<"Power of object A and B are not equal.\n";return *this;}Перевантажуємо операцію !=:sila_oporu & operator != (sila_oporu&src){if(F!=src.F)cout<<"Power of object A and B are not equal.\n";elsecout<<"Power of object A and B are equal.\n";return *this;}Перевантажуємо операцію <:sila_oporu & operator < (sila_oporu&src){if(F<src.F)cout<<"Power of object A is less then Power of object B.\n";elsecout<<"Power of object A is greater then Power of object B.\n";return *this;}Перевантажуємо операцію <=:sila_oporu & operator<=(sila_oporu&src){if(F<=src.F)cout<<"Power of object A is less or equal then Power of object B.\n";else cout<<"Power of object A is greater or equal then Power of object B.\n";return *this;}Перевантажуємо операцію>:sila_oporu & operator>(sila_oporu&src){if(F>src.F)cout<<"Power of object A is greater then Power of object B.\n";elsecout<<"Power of object A is less then Power of object B.\n";return *this;}Перевантажуємо операцію>=:sila_oporu & operator>=(sila_oporu&src){if(F>=src.F) cout<<"Power of object A is greater or equal then Power of object B. ";elsecout<<"Power of object A is less or equal then Power of object B. ";return *this;}};Потім опишемо функцію void main(), в якій безпосередньо і використовуватимемо описані вище функції та перевантаження операцій.
Опис функцій1. virtual void vvod() - функція, що зчитує дані з файлу «dan.txt», та виводить їх на екран в тому разі, якщо інформація зчитана успішно. Якщо інформація не зчитана, то з'являється відповідне повідомлення.
2. virtual void resh() - функція, що безпосередньо обчислює наше значення F використовуючи при цьому дані, що зчитані з файлу та дві допоміжні функції Q() та S(). Після обчислень результат виводиться на екран.
3. virtual void resh1() - функція, що обчислює F використовуючи дані, ініціалізовані конструктором. Після обчислень результат виводиться на екран.
4. virtual void vivod() - функція, що записує результати в файл rez.txt, а саме Q1, S, R, V, Re, F. Також вона виводить повідомлення на екран про те, що дані записані в файл.
5. double S() - функція, що повертає значення (d*d*M_PI)/4, а саме обчислює площу проекції тіла на площину.
6. double Re() - функція, що повертає значення (V*d*R)/m, а саме обчислює число Рейнольда.
7. double Q() - функція, що повертає значення коефіцієнта супротиву середовища в залежності від величини числа Рейнольда.
8. void main() - головна функція, в якій реалізовані всі операції та функції.
9. clrscr() - стандартна функція очищення екрану.
10. getch() - функція, що зчитує і повертає код одного символа з буфера клавіатури без відображення його на екрані. Використовується для затримки екрану.
11. close() - функція, що закриває файловий потік.
12. pow() - стандартна функція обчислення степеня.
Опис команд та операторів1. sila_oporu & operator == (sila_oporu&src) - перевантаження операції ==.
2. sila_oporu & operator != (sila_oporu&src) - перевантаження операції !=.
3. sila_oporu & operator < (sila_oporu&src) - перевантаження операції <.
4. sila_oporu & operator<=(sila_oporu&src) - перевантаження операції <=.
5. sila_oporu & operator>(sila_oporu&src) - перевантаження операції >.
6. sila_oporu & operator>=(sila_oporu&src) - перевантаження операції >=.
7. cout - стандартний об'єкт, що служить для виведення інформації на екран.
8. endl - маніпулятор, який викликає flash, переходить на інший рядок.
9. іf - логічна інструкція.
10. ofstream - стандартний клас файлового виведення даних.
11. іfstream - стандартний клас файлового введення даних.
12. оfs - команда, що використовується для файлового виведення даних.
13. іfs - команда, що використовується для файлового введення даних.
Таблиця символьних імен
|
Змінна за умовою | Змінна в програмі | Одиниці вимірювання | Пояснення | |
F | F | Н | сила супротиву | |
| Q1 | / кг*м | коефіцієнт супротиву середовища | |
S | s | | площа проекції тіла на площину | |
| R | кг/ | щільність середовища | |
| V | м/с | швидкість руху частинки відносно середовища | |
d | d | м | діаметр частинки | |
| m | | в'язкість середовища | |
Re | re | кг*м/ | число Рейнольдса | |
|
Також в програмі використовуються такі змінні як:
Q1src, ssrc, Rsrc, Vsrc - вони застосовуються в конструкторі ініціалізації для ініціювання змінних заданими значеннями.
Програма
#include<math.h>
#include<stdlib.h>
#include<fstream>
#include<conio.h>
#include<iostream>
using namespace std;
#define M_PI 3.14159265
class object //абстрактний клас
{
protected:
double F;
public:
virtual void vvod()=0; //чисті віртуальні функції
virtual void resh()=0;
virtual void resh1()=0;
virtual void vivod()=0;
};
class sila_oporu: public object //клас, похідний від абстрактного
{
private:
double Q1;
double s;
double R;
double V;
double d;
double m;
double re;
public:
double S()
{
return (d*d*M_PI)/4;
}
double Re()
{
return ((V*d*R)/m);
}
double Q()
{
double re = Re();
if (re<=2)
{
return 24/re;
}
if(2<re && re<=500)
{
return (18.5)/pow(re,0.6);
}
if(500<re && re<200000)
{
return 0.44;
}
return 0;
}
sila_oporu() //пустий конструктор
{
}
sila_oporu(double Q1src, double ssrc, double Rsrc, double Vsrc)
{
Q1=Q1src; //конструктор з ініціалізацією в тілі s=ssrc;
R=Rsrc;
V=Vsrc;
}
sila_oporu(const sila_oporu & src) //конструктор копіювання
{
Q1=src.Q1;
s=src.s;
R=src.R;
V=src.V;
}
virtual void vvod() //функція введення даних з файлу
{
ifstream ifs("dan.txt");
if(!ifs)
{
cout<<"Error: file \"dan.txt\" was not found"<<'\n';
exit(1);
}
ifs>>R>>V>>d>>m;
cout<<"Information from the file \"dan.txt\":\n R="<<R<<" kg/m^3 V="<<V<<" m/s d="<<d<<" m m="<<m<<" N*s/m^2 '\n'" ;
ifs.close();
}
virtual void resh() //функція підрахунку сили F
{
F=((Q()*S()*R*V*V)/2);
cout<<"F="<<F<<'\n';
}
virtual void resh1()
{
F=((Q1*s*R*V*V)/2);
cout<<"F="<<F<<'\n';
}
virtual void vivod() //функція виведення (запису в файл)
{
ofstream ofs("rez.txt");
if(!ofs)
{
cout<<"Error: file \"rez.txt\" was not found"<<'\n';
exit(1);
}
ofs<<"Q="<<Q()<<" S="<<S()<<" R="<<R<<" V="<<V<<" Re="<<Re()<<"\nF="<<F;
cout<<"The result was written into the file \"rez.txt\"\n";
ofs.close();
}
sila_oporu & operator = (sila_oporu&src) //перевантаження оператора присвоєння
{
Q1=src.Q1;
s=src.s;
R=src.R;
V=src.V;
return *this;
}
sila_oporu & operator == (sila_oporu&src) //перевантаження оператора порівняння = =
{
if(F==src.F)
cout<<"Power of object A and B are equal.\n";
else
cout<<"Power of object A and B are not equal.\n";
return *this;
}
sila_oporu & operator != (sila_oporu&src) //перевантаження оператора порівняння ? (!=)
{
if(F!=src.F)
cout<<"Power of object A and B are not equal.\n";
else
cout<<"Power of object A and B are equal.\n";
return *this;
}
sila_oporu & operator < (sila_oporu&src) //перевантаження оператора порівняння <
{
if(F<src.F)
cout<<"Power of object A is less then Power of object B.\n";
else
cout<<"Power of object A is greater then Power of object B.\n";
return *this;
}
sila_oporu & operator<=(sila_oporu&src) //перевантаження оператора порівняння
{
if(F<=src.F)
cout<<"Power of object A is less or equal then Power of object B.\n";
else
cout<<"Power of object A is greater or equal then Power of object B.\n";
return *this;
}
sila_oporu & operator>(sila_oporu&src) //перевантаження оператора порівняння >
{
if(F>src.F)
cout<<"Power of object A is greater then Power of object B.\n";
else
cout<<"Power of object A is less then Power of object B.\n";
return *this;
}
sila_oporu & operator>=(sila_oporu&src) //перевантаження оператора порівняння ?
{
if(F>=src.F)
cout<<"Power of object A is greater or equal then Power of object B. ";
else
cout<<"Power of object A is less or equal then Power of object B. ";
return *this;
}
};
void main() //головна функція
{
object *p;
p=new sila_oporu; //виділення пам'яті
p->vvod(); //звертання до функції введення
cout<<"\nThe result is: ";
p->resh(); //звертання до функції підрахунку
p->vivod(); //звертання до функції виведення
sila_oporu a(1.1,8.3,1.29,15);
sila_oporu b(0.8,4.2,1.29,20);
cout<<"\nAfter the initialising:\nFor object A: ";
a.resh1();
cout<<"\nFor object B: ";
b.resh1();
sila_oporu w(a);
cout<<"After the copying: ";
w.resh1();
sila_oporu k;
k=a;
cout<<"After the assignment: ";
k.resh1();
cout<<"Operator ==: ";
a==b;
cout<<"Operator !=: ";
a!=b;
cout<<"Operator >=: ";
a>=b;
cout<<"\nOperator >: ";
a>b;
cout<<"Operator <=: ";
a<=b;
cout<<"Operator <: ";
a<b;
}
Результати роботи програми
В результаті отримаємо :
Тобто, спочатку зчитуються з файлу “dan.txt” та виводяться на екран дані, з якими працюватиме програма. Далі обраховується значення сили супротиву F; результат обчислення записується в файл “rez.txt” та виводиться на екран.
Також в програмі передбачена ініціалізація даних для двох об'єктів класу “ sila_oporu ” - а та b, після чого обчислюються та виводяться на екран значення параметра F для даних об'єктів. Присутнє і присвоєння(копіювання) - об'єкт k=a (w(a)) . Тобто, об'єкт k (w) класу “ sila_oporu ” буде мати такі самі значення параметрів, як і а. На екран виводиться результат присвоєння(копіювання) - значення F для k (w). Програма містить перевантажені операції присвоєння (що використовується при копіюванні) та порівняння (==, !=, <, <=, >, >=), за допомогою яких відбувається порівняння об'єктів а та b. Результат роботи цих операцій виводиться на екран.
Висновки
В курсовій роботі виконується обчислення сили супротиву, яка діє на частинку,що рухається в середовищі. Вона обчислюється по формулі:
.
Програмна реалізація основується на роботі з класами, а саме:
1. Описується абстрактний клас, в якому наявні чисті віртуальні функції:
1) Введення даних із файлу.
2) Розрахунок обчислювального параметру.
3) Виведення в файл результату та вхідних даних.
2. Описується клас, похідний від абстрактного, в якому передбачені:
1) Перевантажені операції присвоєння, порівняння (==, !=, <, <=, >, >=).
2) Конструктори: пустий, з ініціюванням і копіювання.
Тобто, в курсовій роботі були вдосконаленні вміння роботи з класами, спеціальними членами-функціями класу, віртуальними функціями, перевантаженими операторами, а також з файловими потоками в середовищі Microsoft Visual C++ 2005.
Література
1. Конспект лекцій з предмету «Алгоритмічні мови».
2. Стефан, Дэвис. C++ для "чайников", 4-е издание. : Пер. с англ.: - М.: Издательский дом «Вильямс», 2003. - 336 с.
3. Х.Дейтел, П.Дейтел. Как программировать на С. : Пер. с англ.: - М.: Издательский дом «Вильямс», 2000. - 995 с.
4. Джесс Либерти. Освой самостоятельно С++ за 21 день.:Пер. С англ.:- М.: Издательский дом «Вильямс», 2006. -840 с.