Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
колоквіум_2.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
258.55 Кб
Скачать

25. Поясніть алгоритм обчислення інтегралів із заданою точністю

 Сформуємо описову частину програми аналогічно до попередньої програми.

 У виконуваній частині програми введемо, окрім значень а, b, n, ще точність обчислення інтегралів

Eps.

 Додатково введемо ознаку Met обраного методу: 1 – прямокутників; 2 – трапецій; 3 – Сімпсона.

Програма обчислюватиме інтеграл із заданою точністю Eps лише одним методом, який ми обрали.

Вибір методу робимо з допомогою оператора switch (Met)

 Для кількості n=5 поділів інтервалу

[ , ] ab

обчислимо визначений інтеграл обраним нами методом і

запишемо його значення у змінну int_new.

 Запустимо цикл з передумовою, у якому:

- збільшимо значення n на 1;

- перерахуємо значення кроку

H з новим значенням n;

- запишемо значення змінної int_new у змінну int_old;

- обчислимо інтеграл обраним нами методом для нового значення кроку h

і запишемо його у

змінну int_new ;

- цикл повторюватимемо доти, доки не виконається умова

__ int new int old Eps .

 Виводимо на дисплей обчислене значення шуканого інтеграла.

 Завершуємо роботу програми.

26.

Структури-це складні типи даних ,які ми самі утворюємо на основі інших типів.У Delphi аналогом структур є Record. Cтруктури-це набори різнотипних даних,які об’єднано спеціальним імям. Кожен екземпляр цих даних називають полем. Опис : struct <ім’я (тег) структури>

{ <поле>;

<поле>;….}

Або: struct

{< поля >;}

<імя>,<імя>…

Наприклад: struct student \\опис

{ AnsiString PIB[30]; \\прізвище імя по-батькові

AnsiString group[8]; \\група

Int year; \\рік народження

Int inform,math ;}

Student Ivanenko,Petrenko,*st;

Для роботи з полями структури в С++ використовують операції:

“.”, якщо звертання за іменами

“->”,якщо за адресою(посиланням)

Якщо написати pst=&Ivanenko;

Ivanenko.tear=1994; або

Pst->year=1994;

В С++ елементами структури можуть бути функції і специфікатори доступу private,public.

Ініціалізація полів структури:

struct student \\опис

{ AnsiString PIB[30]; \\прізвище імя по-батькові

AnsiString group[8]; \\група

Int year; \\рік народження

Int inform,math ;}

Student Ivanenko,Petrenko,*st;

Ivanenko ={“Іваненко І.Б.”,”ФеІ-11”,1995,5,5};

Білет 27 Об’єднання.

Об’єднання(Union)-варіант структури ,у якій компілятор повинен усі поля розташувати за одною адресою .Синтаксис опису Union такий,як і в структури ,тільки struct змінюється на union. У кожен момент роботи програми у змінній типу Union міститься значення тільки якогось одного з її полів. Це значення може періодично змінюватись. Відповідальність за коректність цього процесу лежить виключно на програмістові.

Об’єднання часто використовують як поле структури . При цьому в структурі повинно бути присутнє ще одне поле для визначення яке саме поле з union потрібно використати.

Наприклад :

#include <iostream.h>

int main()

{ enum paytype {CARD.CHECK}

struct

{ paytype ptype;

union {char card [25];

Long check};

};

switch (info.ptype)

{case CARD:cout <<”Платити карткою:”<<info.card;break;

case CHECK:cout <<”Платити чеком:”<<info.check;break;}

return 0;}

Об’єднання виконується в разі потреби по-різному проінтерпретувати окремі біти цілопис. Змінної.Обмеження у виконанні об’єднання :

  • Ініціалізувати можна тільки змінні його першого елемента;

  • Об’єднання не може містити віртуальні мет,конструктори,деструктури і присвоєння.

  • Об’єднання не може містити так звані бітові поля.

28. Порівняйте функції у С++ та підпрограми у Delphi.

Процедури та функції відрізняються формами опису та способом передачі їм управлінн, тобто способом їх виклику та виконання. У С++ відсутнє поняття процедури. Тут кожна програма – це набір окремих функції, які відносяться до однієї щ двох категорій: 1) функції як не мають результуючого значення. Їх називають функціями типу VOID. 2) Функції які таке значення мають. У заголовку цієї категорії ф-ії необхідно вказати значення якого типу вона повертає. Обидві категорії функцій окрім йього використовують вихідні параметри, можуть повертати в точку їхнього виклику одне чи декілька значень, які формуються під час виконання операторів тіла ф-ії. Можна стверджувати, що функції типу VOID є аналогом процедури в Pascal, оскільки їх виклик подібний до виклику процедур.

Синтаксис опису функції в С++

Void <імя параметру> (

[< тип параметру1> <імя параметру1>

<тип параметру2> <імя параметру2>])

{<виконув. Частина>;->тіло ф-ії

return;

}

Головна функція main().

З неї починають виконуватися всі програми. Вона може мати параметр або не мати.

В С++ описи функцій не можуть бути вкладеними в інших функціях, тобто в середині одної функції не може бути описана інша функція. При цьому одна функція може викликати іншу в тому числі і суму себе. Такі виклики називаються рекурсією.

29.

30.

31.

32. Напишіть консольну програму та поясніть алгоритм розв’язання квадратних рівнянь на С++.

#include <iostream>

#include <clocale>

#include <math.h>

using namespace std;

int main()

{ double a,b,c;

cout<<"vvedit znazennya a,b,c zerez enter=";

cin>>a>>b>>c;

double d,x1,x2,x;

if (a==0){x=-c/b;

cout<<"koren rivnnya x="<<x<<endl;

system("PAUSE");

return 0; }

else

{ d=b*b-4*a*c;

if (d<0)

{ cout<<"obudva koreni rivnnya e komplesni chusla"<<endl;

system("PAUSE");

return 0; }

else

{ if (d=0)

{ x=-b/(2*a);

cout<<"koren rivnnya x="<<x<<endl; }

else

{ x1=(-b+(sqrt(d)))/(2*a);

x2=(-b-(sqrt(d)))/(2*a);

cout<<"koren rivnnya x1="<<x1<<endl;

cout<<"koren rivnnya x2="<<x2<<endl;

system("PAUSE");

return 0; } } } }

33. Напишіть віконну програму та поясніть алгоритм розв’язання квадратних рівнянь на С++.

#include <vcl.h>

#pragma hdrstop

#include <iostream>

#include <clocale>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner) { }

void __fastcall TForm1::Button1Click(TObject *Sender)

{ double d,x1,x2,x,a,b,c,p;

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

c=StrToFloat(Edit3->Text);

if (a==0)

{ x=-c/b;

Edit4->Text=x; }

Else

{ d=b*b-4*a*c;

if (d<0)

{ Edit4->Text="Obudva koreni-kompleksni chusla"; }

Else

{ if (d==0)

{ x=-b/(2*a);

Edit4->Text="Isnuje odun korin"+FloatToStr(x); }

else

{ x1=(-b+(sqrt(d)))/(2*a);

x2=(-b-(sqrt(d)))/(2*a);

Edit4->Text="x1= "+FloatToStr(x1)+" x2= "+FloatToStr(x2); } } } }

34 Напишіть консольну програму мовою С++ та поясніть алгоритм розв’язання нелінійних рівнянь методом половинного ділення.

Метод половинного ділення – це універсальний метод чисельного розв’язання задачі. Він є повільним але завжди приводить до шуканого результату. Ідея цього методу полягає в тому, що ми ділимо відрізок у якому точно находиться корінь на дві частини. Потім ми перевіряємо на якій половині цей корінь і відкидаємо іншу. Такий процес ділення ми продовжуємо доки довжина не стає настільки малою, що похибкою можна знехтувати. Щоб перевірити чи корінь справді знаходиться на заданому відрізку ми перемножуємо функцію зі значеннями іксів – інтервалі якщо

F(a)*F(b)<0 то корінь на даному відрізку існує. Це пояснюється тим що функція буде мати протилежні знаки.

Кроки розв’язання задачі МПД:

  1. описуємо ф-ю f(x), що відповідає рівнянню

  2. задаємо інтервал [a,b], на якому існує тільки один корінь рівняння, і бажану точність його обчислення Eps, за необхідності табулюємо f(x).

  3. перевіряємо чи виконується умова f(a) *f(b)>0.

  4. якщо умова інтервалу не виконується, програма видає повідомлення про відсутність кореня на заданому інтервалі.

  5. у випадку виконання умови визначаємо середину інтервалу [a,b], тобто точку c:=a+(b-a)/2.0, і перевіряємо умову f(a) *f(с)>0

  6. якщо вона виконується то праву межу інтервалу b переносимо в середню точку с – шляхом присвоєння b:= c, у протилежному випадку a:= c

  7. поділ уточненого інтервалу [a,b] навпіл і перенесення однієї із меж інтервалу продовжуємо доти, доки не виконається умова | b - a|<Eps

  8. друкуємо обчислене наближене значення корення.

//---------------------------------------------------------------------------

#include <stdio.h>

#pragma hdrstop

#include <tchar.h>

#include <math.h>

#include <conio.h>

#include <iostream>

#include <clocale>

//---------------------------------------------------------------------------

#pragma argsused

using namespace std;

float f(double x)

{double c=3*sin(sqrt(x))+0.35*x-3.8;

return (c);}

int main ()

{ double a,b,eps,n,x;

cout <<"vvedit a,b,eps";

cin >>a>>b>>eps;

n=(a+b)/2.0;

while ((b-a)>eps)

{if (f(a)*f(n)<0)

{b=n;}

else

{a=n;}

n=(a+b)/2.0;}

x=(a+b)/2.0;

cout<<"x="<<x<<endl;

system ("PAUSE");

return 0;}

35 Напишіть віконну програму мовою С++ та поясніть алгоритм розв’язання нелінійних рівнянь методом половинного ділення.

Метод половинного ділення – це універсальний метод чисельного розв’язання задачі. Він є повільним але завжди приводить до шуканого результату. Ідея цього методу полягає в тому, що ми ділимо відрізок у якому точно находиться корінь на дві частини. Потім ми перевіряємо на якій половині цей корінь і відкидаємо іншу. Такий процес ділення ми продовжуємо доки довжина не стає настільки малою, що похибкою можна знехтувати. Щоб перевірити чи корінь справді знаходиться на заданому відрізку ми перемножуємо функцію зі значеннями іксів – інтервалі якщо

F(a)*F(b)<0 то корінь на даному відрізку існує. Це пояснюється тим що функція буде мати протилежні знаки.

Кроки розв’язання задачі МПД:

  1. описуємо ф-ю f(x), що відповідає рівнянню

  2. задаємо інтервал [a,b], на якому існує тільки один корінь рівняння, і бажану точність його обчислення Eps, за необхідності табулюємо f(x).

  3. перевіряємо чи виконується умова f(a) *f(b)>0.

  4. якщо умова інтервалу не виконується, програма видає повідомлення про відсутність кореня на заданому інтервалі.

  5. у випадку виконання умови визначаємо середину інтервалу [a,b], тобто точку c:=a+(b-a)/2.0, і перевіряємо умову f(a) *f(с)>0

  6. якщо вона виконується то праву межу інтервалу b переносимо в середню точку с – шляхом присвоєння b:= c, у протилежному випадку a:= c

  7. поділ уточненого інтервалу [a,b] навпіл і перенесення однієї із меж інтервалу продовжуємо доти, доки не виконається умова | b - a|<Eps

  8. друкуємо обчислене наближене значення корення.

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <math.h>

#include "Unit1.h"

#include <iostream>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

float f(double x)

{

double f=3*sin(sqrt(x))+0.35*x-3.8;

return (f);

}

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double c,d,eps,s,x;

c=2;

d=3;

eps=0.0001;

s=(c+d)/2;

while (d-c>eps)

{

if (f(c)*f(s)<0) {

d=s;}

else

c=s;

s=(c+d)/2;

}

x=(c+d)/2;

Edit1->Text=x;

Edit2->Text=f(x);

}//---------------------------------------------------------------------------

36.Напишіть консольну програму мовою С++ та поясніть алгоритм розв’язання нелінійних рівнянь методом Ньютона

Це найшвидший метод розв’язання рівняння f(x)=0 проте він спрацьовує незавжди.

Xm+1=Xm* f(Xm)/ fp(Xm)

m-номер ітерації,fp-похідна

Обравши певне початкове наближення за наведеною формулою ми одержуємо уточнене значення кореня X1. у залежності від обраної точності Eps, ми за декілька кроків знаходимо корінь.

Ітерація – це крок послідовного наближення.

Ітераційний метод – формула, згідно з якою ми здійснюємо ітераційний процес.

Головною характеристикою Ітераційного процесу є збіжність.

Процес наз. Збіжним якщо виконуючи ітераційний процес - ми наближаємося до шуканого розв’язку . Метод Ньютона володіє квадратичною швидкість збіжності.

//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>

#include<conio.h>

#include<math.h>

#include<stdio.h>

//---------------------------------------------------------------------------

#pragma argsused

float f(float x)

{

float f=exp(x)+log(x)-(10*x);

return f;

}

float f1(float x)

{ float f1=exp(x)-(1/x)-10;

return f1;

}

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

{ float x,dx,g,eps;

printf("Input a");

scanf("%f",&x);

printf("Input eps");

scanf("%f",&eps);

do

{ dx=f(x)/f1(x);

x=x-dx;

}

while (fabs(dx)>eps);

g=exp(x)+log(x)-(10*x);

printf("x=%f",x);

printf("F(x)=%f",g);

getch();

}//---------------------------------------------------------------------------

37. Поясніть і проілюструйте правила використання параметрів у функціях С++.

38. Напишіть за блок-схемою мовою С++ функцію розв’язання СЛАР методом Гауса

39. Опишіть правила роботи у консольних проектах С++ Builder 2010.

40. Опишіть принципи побудови власних графіків у С++ Builder 2010

41. Напишіть просту програму побудови графіка функції y=sin(x).