Рефераты
 

Програма розрахунку сили супротиву

Програма розрахунку сили супротиву

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";

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(), в якій безпосередньо і використовуватимемо описані вище функції та перевантаження операцій.

Опис функцій

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 с.


© 2010 BANKS OF РЕФЕРАТ