Контакты 244851268 Телефон 8(067)6446674
Логин: Пароль: Код проверки: captcha >>Забыли пароль?

Поиск

>>Расширенный

Категории

Новости

Вы здесь: Начало > Новости

НОУ ІНТУЇТ | лекція | Оператори управління

Розглянемо використання оператора if на прімерах3.

Аналітично функцію, представлену на Мал. 3.10 , Можна записати так:

Складемо словесний алгоритм вирішення цієї задачі:

  1. Початок алгоритму.
  2. введення числа Розглянемо використання оператора if на прімерах3 (Аргумент функції).
  3. якщо значення менше або дорівнює -2, то перехід до п. 4, інакше перехід до п. 5.
  4. Обчислення значення функції: , Перехід до п. 8.
  5. якщо значення більше або дорівнює 1, то перехід до п. 6, інакше перехід до п. 7.
  6. Обчислення значення функції: , Перехід до п. 8.
  7. Обчислення значення функції: .
  8. Висновок значень аргументу і функції .
  9. Кінець алгоритму.

Блок-схема, відповідна описаним алгоритмом, представлена ​​на малюнку 3.11 . Як видно, блок-схема наочніше і простіше для сприйняття, ніж словесний опис алгоритму. Надалі для опису алгоритму ми часто будемо використовувати саме блок-схеми.

Текст програми на мові Free Pascal матиме вигляд:

var x, y: real; begin write ( 'x ='); readln (x); if x <= -2 then y: = 4 else if x> = 1 then y: = 1 else y: = sqr (x); writeln ( 'x =', x: 5: 2, 'y =', y: 5: 2); end.

Цю програму можна ввести в текстовому редакторі Geany (або в текстовому редакторі Free Pascal) і запустити на виконання.

Як показано на Мал. 3.12 , Область обмежена лініями Як показано на   Мал і . Значить, точка з координатами буде належати цій галузі, якщо будуть виконуватися наступні умови: і . Інакше точка лежить за межами області.

Блок-схема, що описує алгоритм розв'язання даної задачі, представлена ​​на Мал. 3.13 .

Текст програми до задачі 3.2:

var x, y: real; begin write ( 'x ='); readln (x); write ( 'y ='); readln (y); if (x> = -1) and (x <= 3) and (y> = -2) and (y <= 4) then writeln ( 'Точка належить області') else writeln ( 'Точка не належить області'); end.

ЗАВДАННЯ 3.3. Написати програму вирішення квадратного рівняння ax ^ 2 + bx + c = 0.

Вихідні дані: речові числа Вихідні дані: речові числа   і   - коефіцієнти квадратного рівняння і - коефіцієнти квадратного рівняння.

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

Допоміжні змінні: речова змінна Допоміжні змінні: речова змінна   , В якій буде зберігатися дискриминант квадратного рівняння , В якій буде зберігатися дискриминант квадратного рівняння.

Складемо словесний алгоритм вирішення цієї задачі.

  1. Початок алгоритму.
  2. Введення числових значень змінних і .
  3. Обчислення значення дискримінанту за формулою .
  4. якщо , То перехід до п. 5, інакше перехід до п. 6.
  5. Висновок повідомлення "Дійсних коренів немає" і перехід до п. 8.
  6. обчислення коренів і .
  7. висновок значень і на екран.
  8. Кінець алгоритму.

Блок-схема, що відповідає цьому опису, представлена ​​на Мал. 3.14 .

Текст програми, яка реалізує рішення квадратного рівняння:

{Опис змінних.} Var a, b, c, d, x1, x2: real; begin {Введення значення коефіцієнтів квадратного рівняння.} writeln ( 'Введіть коефіцієнти квадратного рівняння'); readln (a, b, c); {Обчислення дискримінанту.} D: = b * b-4 * a * c; {Якщо дискримінант від'ємний,} if d <0 then {то висновок повідомлення, що коріння немає,} writeln ( 'Дійсних коренів немає') else begin {інакше обчислення коренів x1, x2} x1: = (- b + sqrt (d) ) / 2 / a; x2: = (- b_sqrt (d)) / (2 * a); {І виведення їх на екран.} Writeln ( 'X1 =', x1: 6: 3, '-X2 =', x2: 6: 3) end end.

Вихідні дані: речові числа Вихідні дані: речові числа   і   - коефіцієнти квадратного рівняння і - коефіцієнти квадратного рівняння.

Результати роботи програми: речові числа Результати роботи програми: речові числа   і   - дійсні корені квадратного рівняння - або   і   - дійсна і уявна частини комплексного числа і - дійсні корені квадратного рівняння - або і - дійсна і уявна частини комплексного числа.

Допоміжні змінні: речова змінна Допоміжні змінні: речова змінна   , В якій буде зберігатися дискриминант квадратного рівняння , В якій буде зберігатися дискриминант квадратного рівняння.

Можна виділити наступні етапи рішення задачі:

  1. Введення коефіцієнтів квадратного рівняння і .
  2. обчислення дискримінанту за формулою .
  3. Перевірка знака дискримінанту. якщо , То обчислення дійсних коренів:

і висновок їх на екран. При негативному дискримінант виводиться повідомлення про те, що дійсних коренів немає, і обчислюються комплексні корні4

У обох комплексних коренів дійсні частини однакові, а уявні відрізняються знаком. Тому можна в змінної x1 зберігати дійсну частину числа У обох комплексних коренів дійсні частини однакові, а уявні відрізняються знаком , В змінної x2 - модуль уявної частини , А в якості коренів вивести x1 + ix2 і x1-ix2.

на Мал. 3.15 зображена блок-схема рішення задачі. Блок 1 призначений для введення коефіцієнтів квадратного рівняння. У блоці 2 здійснюється обчислення дискримінанту. Блок 3 здійснює перевірку знака дискримінанту; якщо дискримінант від'ємний, то коріння комплексні, їх розрахунок відбувається в блоці 4 (дійсна частина кореня записується в змінну x1, модуль уявної - в змінну x2), а висновок - в блоці 5 (перший корінь x1 + ix2, другий - x1-ix2) . Якщо дискримінант позитивний, то обчислюються дійсні корені рівняння (блоки 6-7) і виводяться на екран (блок 8).

Текст програми, що реалізує поставлену задачу:

var a, b, c, d, x1, x2: real; begin writeln ( 'Введіте_коеффіціенти_квадратного_уравненія'); readln (a, b, c); d: = b * b-4 * a * c; if d <0 then begin // Якщо дискримінант від'ємний, то висновок повідомлення, // що дійсних коренів немає, і обчислення комплексних коренів. writeln ( 'Дійсних коренів немає'); {Обчислення дійсної частини комплексних коренів.} X1: = - b / (2 * a); {Обчислення модуля уявної частини комплексних коренів.} X2: = sqrt (abs (d)) / (2 * a); writeln ( 'Комплексні коріння рівняння', a: 1: 2, 'x ^ 2 +', b: 1: 2, 'x +', c: 1: 2, '= 0'); {Виведення значень комплексних коренів у вигляді var a, b, c, d, x1, x2: real;  begin writeln ( 'Введіте_коеффіціенти_квадратного_уравненія');  readln (a, b, c);  d: = b * b-4 * a * c;  if d <0 then begin // Якщо дискримінант від'ємний, то висновок повідомлення, // що дійсних коренів немає, і обчислення комплексних коренів } Writeln (x1: 1: 2, '+ i * (', x2: 1: 2, ')'); writeln (x1: 1: 2, '- i * (', x2: 1: 2, ')'); end else begin {інакше обчислення дійсних коренів x1, x2} x1: = (- b + sqrt (d)) / 2 / a; x2: = (- b_sqrt (d)) / (2 * a); {І виведення їх на екран.} Writeln ( 'Дійсні корені рівняння', a: 1: 2, 'x ^ 2 +', b: 1: 2, 'x +', c: 1: 2, '= 0') ; writeln ( 'X1 =', x1: 1: 2, "X2 = ', x2: 1: 2) end end.

Кубічне рівняння має вигляд

Після поділу на Після поділу на   рівняння (3 рівняння (3.1) приймає канонічний вигляд:

де де . У рівнянні (3.2) зробимо заміну і отримаємо наведене рівняння:

де

Число дійсних коренів наведеного рівняння (3.3) залежить від знака дискриминанта Число дійсних коренів наведеного рівняння (3 наведеного кубічного рівняння ( табл. 3.1 ).

Таблиця 3.1. Кількість коренів кубічного рівняння Дискримінант кількість дійсних коренів кількість комплексних коренів D> 0 1 2 D <0 3 -

Коріння наведеного рівняння можуть бути розраховані за формулами Кардано:

де

При негативному дискримінант рівняння (3.1) має три дійсних кореня, але вони будуть обчислюватися через допоміжні комплексні величини. Щоб позбутися від цього, можна скористатися формулами:

де

Таким чином, при позитивному дискримінант кубічного рівняння (3.3) розрахунок коренів будемо вести за формулами (3.4), а при негативному - за формулами (3.5).

Після розрахунку коренів наведеного рівняння (3.3) за формулами (3.4) або (3.5) необхідно за формулами

перейти до коріння заданого кубічного рівняння (3.1).

Блок-схема рішення кубічного рівняння представлена ​​на Мал. 3.16 .

Опис блок-схеми. У блоці 1 вводяться коефіцієнти кубічного рівняння, в блоках 2-3 розраховуються коефіцієнти канонічного і наведеного рівнянь. Блок 4 призначений для обчислення дискримінанту. У блоці 5 перевіряється знак дискримінанту кубічного рівняння. Якщо він негативний, то коріння обчислюються за формулами (3.5) (блоки 6-7). При позитивному значенні дискримінанту розрахунок йде за формулами (3.4) (блок 9, 10). Блоки 8 і 11 призначені для виведення результатів на екран.

Текст програми з коментарями наведено ніже55.

var a, b, c, d, r, s, t, p, q, ro, fi, x1, x2, x3, u, v, h, g: real; begin // Введення коефіцієнтів кубічного рівняння. write ( 'a ='); readln (a); write ( 'b ='); readln (b); write ( 'c ='); readln (c); write ( 'd ='); readln (d); // Розрахунок коефіцієнтів канонічного рівняння по 3.2. r: = b / a; s: = c / a; t: = d / a; // Обчислення коефіцієнтів наведеного рівняння 3.3. p: = (3 * s - r * r) / 3; q: = 2 * r * r * r / 27- r * s / 3 + t; // Обчислення дискримінанту кубічного рівняння. d: = (p / 3) * sqr (p / 3) + sqr (q / 2); // Перевірка знака дискримінанту, // гілка then реалізує формули (3.5), // гілка else - формули 3.4 if d <0 then begin ro: = sqrt (-p * p * p / 27); // Наступні два оператора реалізують розрахунок кута fi, // спочатку обчислюється величина косинуса кута, // потім обчислюється його арккосинус через арктангенс. fi: = - q / (2 * ro); fi: = pi / 2-arctan (fi / sqrt (1 - fi * fi)); // Обчислення дійсних коренів рівняння x1, x2 і x3 x1: = 2 * exp (1/3 * ln (ro)) * cos (fi / 3) - r / 3; x2: = 2 * exp (1/3 * ln (ro)) * cos (fi / 3 + 2 * pi / 3) - r / 3; x3: = 2 * exp (1/3 * ln (ro)) * cos (fi / 3 + 4 * pi / 3) - r / 3; writeln ( 'x1 =', x1: 1: 3, 'x2 =', x2: 1: 3, 'x3 =', x3: 1: 3); end else begin // Обчислення u і v з перевіркою знака // подкоренного вираження. if -q / 2 + sqrt (d)> 0 then u: = exp (1/3 * ln (-q / 2 + sqrt (d))) else if -q / 2 + sqrt (d) <0 then u : = - exp (1/3 * ln (abs (-q / 2 + sqrt (d)))) else u: = 0; if -q / 2- sqrt (d)> 0 then v: = exp (1/3 * ln (-q / 2- sqrt (d))) else if -q / 2- sqrt (d) <0 then v : = - exp (1/3 * ln (abs (-q / 2- sqrt (d)))) else v: = 0; // Обчислення дійсного кореня кубічного рівняння. x1: = u + vr / 3; // Обчислення дійсної і // уявної частини комплексних коренів. h: = - (u + v) / 2 - r / 3; g: = (u - v) / 2 * sqrt (3); writeln ( 'x1 =', x1: 1: 3, 'x2 =', h: 1: 3, '+ i *', g: 1: 3, 'x3 =', h: 1: 3, '-i * ', g: 1: 3); end end.

Вхідні дані: a, b, c. Вихідні дані: x1, x2, x3, x4.

Для вирішення біквадратних рівняння необхідно заміною Для вирішення біквадратних рівняння необхідно заміною   привести його до квадратного рівняння   і вирішити це рівняння привести його до квадратного рівняння і вирішити це рівняння.

Наведемо алгоритм вирішення цієї задачі ( Мал. 3.17 ):

  1. Введення коефіцієнтів біквадратних рівняння і (Блок 1).
  2. Обчислення дискримінанту рівняння (Блок 2).
  3. якщо (Блок 3), висновок повідомлення, що коріння немає (блок 4), а інакше визначаються коріння відповідного квадратного рівняння і (Блок 5).
  4. якщо і (Блок 6), то висновок повідомлення, що коріння немає (блок 7).
  5. якщо і (Блок 8), то обчислюються чотири кореня за формулами (Блок 9) і виводяться значення коренів (блок 10).
  6. Якщо умови 4) і 5) не виконуються, то необхідно перевірити знак . якщо (Блок 11), то обчислюються два кореня за формулою (Блок 12), інакше (якщо ) Обчислюються два кореня за формулою (Блок 13).
  7. Висновок обчислених значень коренів (блок 14).

Текст програми на мові Free Pascal з коментарями:

// Опис змінних: // a, b, c - коефіцієнти біквадратних рівняння, // d - дискримінант, // x1, x2, x3, x4 - коріння біквадратних рівняння, // y1, y2 - коріння квадратного рівняння ay ^ 2 + by + c = 0. var a, b, c, d, x1, x2, x3, x4, y1, y2: real; begin // Введення коефіцієнтів рівняння. writeln ( 'Введіть коефіцієнти біквадратних рівняння'); readln (a, b, c); // Обчислення дискримінанту. d: = b * b-4 * a * c; // Якщо він негативний, if d <0 then // виведення повідомлення "Корній немає" writeln ( 'Корній немає') // Якщо дискримінант> = 0, else begin // обчислення коренів квадратного рівняння. y1: = (- b + sqrt (d)) / 2 / a; y2: = (- b-sqrt (d)) / (2 * a); // Якщо обидва кореня квадратного рівняння <0, if (y1 <0) and (y2 <0) then // виведення повідомлення "Корній немає". writeln ( 'Корній немає') // Якщо обидва кореня квадратного рівняння> = 0, else if (y1> = 0) and (y2> = 0) then begin // обчислення чотирьох коренів біквадратних рівняння. x1: = sqrt (y1); x2: = - x1; x3: = sqrt (y2); x4: = - sqrt (y2); // Висновок коренів біквадратних рівняння на екран. writeln ( 'X1 =', x1: 6: 3, 'X2 =', x2: 6: 3); writeln ( 'X3 =', x3: 6: 3, 'X4 =', x4: 6: 3); end // Якщо не виконалися обидва умови // 1. y1 <0 І y2 <0 // 2. y1> = 0 І y2> = 0, // то перевіряємо умова y1> = 0 else if (y1> = 0) then // Якщо воно істинне begin x1: = sqrt (y1); x2: = - x1; writeln ( 'X1 =', x1: 6: 3, 'X2 =', x2: 6: 3); end else // Якщо умова y1> = 0 помилково, то begin x1: = sqrt (y2); x2: = - x1; writeln ( 'X1 =', x1: 6: 3, 'X2 =', x2: 6: 3); end end end.