ПРОГРАМИ З РОЗГАЛУЖЕННЯМ
ІВАНО-ФРАНКІВСЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ НАФТИ І ГАЗУ
Кукурудз С.Ф.
Процюк В.Р.
Ваврик Т.О.
ЗБІРНИК ЗАДАЧ З ПРОГРАМУВАННЯ
НАВЧАЛЬНИЙ ПОСІБНИК
Посібник написаний на базі програми курсу “Програмування та алгоритмічні мови” для студентів технологічних спеціальностей з урахуванням багаторічного досвіду викладання в Івано-Франківському Національному університеті нафти і газу.
Посібник складається з 18 розділів, пов’язаних між собою за принципом “з низу до гори”. Кожний розділ складається з набору задач, прикладу розв’язування задачі, контрольних запитань. Розв’язуючи задачі з кожного розділу, студенти набувають практичних навичок з алгоритмізації та складання програм. Для ілюстрації в кінці розділу наведено алгоритм розв’язання задачі, програми мовами GW-BASIC, PASCAL, C , DELPHI, VISUAL BASIC і пояснення до них.
У перших дев’яти розділах наведено задачі, розв’язування яких сприяє засвоєнню простих алгоритмічних структур, що застосовуються як складові частини при розв’язуванні складніших інженерних задач.
Окремі розділи містять задачі, розв’язання яких вимагає застосування процедур, функцій користувача, вміння працювати з файлами даних послідовного і безпосереднього доступу.
В останніх п’ятьох розділах наведено задачі розв’язування систем лінійних алгебраїчних рівнянь, числового інтегрування та інтерполяції функцій.
Посібник може бути корисним студентам, які вивчають курси “Програмування”, “Інформатика”, “Програмування і математичні методи”, "Програмування і алгоритмічні мови".
Посилання на використану літературу в тексті відсутнє, бо це ускладнило б роботу з посібником. Список використаної літератури наведено в кінці посібника.
ЗМІСТ
1 Лінійні програми................................................................... 5
2 Програми з розгалуженням ................................................. 22
3 Циклічні програми з регулярною зміною аргумента.......... 37
Циклічні програми з регулярною зміною аргумента,
які містять розгалуження......................................................... 53
5 Ітераційні циклічні процеси.................................................. 71
6 Одновимірні масиви.............................................................. 82
7 Циклічні програми з накопиченням суми або добутку....... 104
8 Вкладені цикли...................................................................... 119
9 Двовимірні масиви, сортування масивів.............................. 137
10 Процедури........................................................................... 156
11 Підпрограми-функції.......................................................... 173
12 Обробка текстів................................................................... 194
13 Файли................................................................................... 208
14 Розв’язання системи лінійних алгебраїчних
рівнянь методом Гауса............................................................ 238
15 Розв’язання системи лінійних алгебраїчних рівнянь
методом простої ітерації або методом Зейля........................ 239
16 Числове інтегрування......................................................... 242
17 Розв’язання диференційних рівнянь................................... 243
18 Інтерполяція функцій.......................................................... 243
19 Перелік використаних джерел............................................ 246
ЛІНІЙНІ ПРОГРАМИ
Структура лінійної програми складається з введення аргумента чи аргументів, присвоєння сталим їх числових значень, обчислення значень функції за заданими залежностями і виведення результатів обчислень.
При складанні лінійних програм для прикладів, які наведені в таблиці 1.1, необхідно виконати такий обсяг роботи:
- скласти графічний алгоритм;
- виконати ідентифікацію змінних;
- скласти програму однією або двома мовами, передбачивши введення аргумента і виведення проміжних результатів обчислень, значення аргумента та функції;
- налагодити програму;
- розв’язати задачу на ЕОМ в діалоговому режимі.
Таблиця1.1 –Варіанти завдань
№ ва- ріанту | Функція | Аргу- мент | Значення аргумента |
; ; R=4.21; g=3; a=11.6; Q=89.52 | x | 2.456 | |||
; ; j=4.215; a=286.35; C=6.28; dk=8.351; b= -12.6 | x | 2.456 | |||
; f=21.85; x=31.3; y=9.06; T=161.58 | t | 1.362 | |||
; A=18.365; j=2.1; w=6.28; b=6.31 | t | 2.035 | |||
; ; U1=120;U2=63.5;b=1.86;R1=15;R3=4.8;U3=45 | Rz | 8.75 | |||
; n=12; g=22.68 | x | 2.863 | |||
; ; x=3.141 | a | p/10 | |||
; ; e=1.48; x=3.685 | p | 1.46 | |||
; N=8; L=4206.5; Qn=6250; Dt`=2.83; k=0.82 | Dt | 1.59 | |||
; g=1.25; Q=0.762; L=405; C=13.856; b=83 | B1 | 4.35 | |||
; I=0.36; q=9.81; G=35.68 | w | ||||
; a=3.65; z=4.83; j=11.862 | r | 24.5 | |||
; U1=12.3; T2=3.856; n0=840; n1=610 | k | 1.485 | |||
; ; b=150; x=2.8 рад. | q | ||||
; ; C=161.5; j=550 | k | 1.65 | |||
| ; a=465;sx=1.6. 105; t=0.15 | n | |||
w=700; L=0.1; R=32.5; Um=320.4 | t | 0.225 | |||
T=20.86; a=0.015; w=20 | Z | 321.8 | |||
P1=8.564; P2=4.116; a=0.156; d=4.5; g=9.81; g=1.262 | g | 1.21 | |||
p=1.1.105; S=2.6; f=285.1; r=0.328; =12.86 | l | 362.5 | |||
;t=1.63; c1=15.65; c2=8.21; T1=1.265; T2=2.035 x | x | 0.65 | |||
x=-0.355; t=2.608; a=p/4 | k | ||||
| D=0.865; d=0.532; g=9.81; a=1230; g=1.63 | h | 245.6 | ||
f=1863.4; r1=61.4; r2=4.51; Q=2.1.105 | DP | 4.173 | |||
d=-1.735; j=3.06; B=10.5 | A | 6.35.103 |
Приклад. Скласти графічний алгоритм і програму для обчислення
Значення сталих величин:
Значення аргумента: Um=360.6 .
1. Графічний алгоритм наведений на рис. 1. 1
2. Ідетинфікація змінних
Змінна | Ідентифікатор |
Z R1 R2 p Um j U | Z R1 R2 R3 R4 P U1 F U |
3. Програма мовою GW Basic і результати обчислень мають вигляд
10 REM ЛІНІЙНА ПРОГРАМА
20 REM МОВОЮ GW BASIC
30 DATA 20.5, 31.6, 18.95, 3.142
40 READ R3, R4, R2, P
50 INPUT U1
60 F=P/16 : R1=R3+R4
70 U=SQR(U1)*SIN(F)
80 Z=(R1^2+R2^2)/(R1+R2)*U
90 PRINT “F=”;F,”R1=”;R1,”U=”;U
100 PRINT “Z=”;Z,”U1=”;U1
110 END
F= .196375 R1= 52.1 U= 3.705136
Z= 160.2784 U1=360.6
4. Програма мовою С
/*лінійна програма*/
#include <math.h>
#include <stdio.h>
#define Pi 3.14
main( )
{
float r1,u,f,z,
r2=18.95,
r3=20.5,
r4=31.6,
u1=360.6;
f=Pi/16;
r1=r3+r4;
u=sqrt(u1)*sin(f);
z=(r1*r1+r2*r2)/(r1+r2)*u;
printf(“\nF=%f R1=%f U=%f \ nZ=%f U1=%f” , f, r1, u, z, u1);
}
F= 0.196250 R1= 52.099998 U= 3.702808
Z= 160.278399 U1= 360.600006
5. Програма мовою Pascal
{Лінійна програма}
program lab1(input,output);
var r1,r2,r3,r4,z,f,u,u1,p: real;
begin
r2:=18.95;r3:=20.5;r4:=31.6;p:=3.142;
write(‘Введіть аргумент>’);
read(u1);
f:=p/16; r1:=r3+r4;
u=sqrt(u1)*sin(f);
z:=(r1*r1+r2*r2)/(r1+r2)*u;
writeln(‘f=‘,f:11,’ r1=‘,r1:11,’ u=‘,u:11);
writeln(‘z=‘,z:11,’ u1=‘,u1:11);
end.
f= 1.9638E - 01 r1= 5.2100E+01 u= 3.7051E+00
z= 1.6028E+02 u1= 3.6060E+02
Завдання:
Скласти програму для обчислення ; ;
Значення сталих величин: = 20.5; = 18.95; = π/16; = 31.6.
Значення аргумента: = 360.6.
Опис форми.
Відкриваємо нову форму і на цій формі створюємо такі елементи(Таблиця 1.2):
Таблиця 1.2 - Елементи керування і їх властивості
Елемент (Name) | Властивість | Значення |
Label1 | Caption | Значення аргументу | ||
Alignment | 2-Center | |||
Label2 | Caption | Результат | ||
Alignment | 2-Center | |||
Продовження таблиці 1.2 | ||||
Textbox | Name | в полі стираємо значення Text1 | ||
ToolTipText | Введіть значення аргументу | |||
Label3 | Caption | F | ||
Label4 | Caption | R1 | ||
Label5 | Caption | U | ||
Label6 | Caption | Z | ||
Label8 | Caption | поле Caption порожнє | ||
BorderStyle | 1-FixedSingle | |||
Label9 | Caption | поле Caption порожнє | ||
| BorderStyle | 1-FixedSingle | ||
Label10 | Caption | поле Caption порожнє | ||
BorderStyle | 1-FixedSingle | |||
Label11 | Caption | поле Caption порожнє, | ||
BorderStyle | 1-FixedSingle | |||
CommandButton1 | Caption | Розрахунок | ||
CommandButton2 | Caption | Скасувати | ||
CommandButton3 | Caption | Вихід |
Рисунок 1.2 – Інтерфейс програми.
R2 = 18.95
P = 3.142
U1 = Val(Text1.Text)
F = P / 16: R1 = R3 + R4
U = Sqr(U1) * Sin(F)
Z = (R1 ^ 2 + R2 ^ 2) / (R1 + R2) * U
Label8.Caption = F
Label9.Caption = R1
Label10.Caption = U
Label11.Caption = Z
End Sub
Тепер програмуємо кнопки „Скинути” і „Вихід”:
Private Sub Command2_Click()
Text1.Text = ""
Label8.Caption = ""
Label9.Caption = ""
Label10.Caption = ""
Label11.Caption = ""
End Sub
Private Sub Command3_Click()
End
End Sub
Результати:
F = 0.196375
R1 = 52.1
U = 3.705136
Z = 160.2784
Програма мовою Delphi
Опис форми.
Відкриваємо нову форму і на цій формі створюємо такі елементи:
Таблиця 1.3 - Елементи керування і їх властивості
Елемент (Name) | Властивість | Значення |
Label1 | Caption | Введіть аргумент |
Label2 | Caption | Результати обчислення |
Edit1 | розміщуємо поле напроти Label1 | |
Label3 | Caption | f |
Label4 | Caption | r1 |
Label5 | Caption | u |
Label6 | Caption | z |
Label7 | Caption | u1 |
Button1 | Caption | Обчислити |
Button2 | Caption | Вихід |
Рисунок 1. 3– Інтерфейс програми.
Тепер почнемо програмувати.
Коли ми двічі клацнемо на кнопці „Обчислити” з’явиться вікно, в якому набираємо таку програму:
procedure TForm1.Button1Click(Sender: TObject);
Label 1;
begin
r2:=18.95;
r3:=20.5;
r4:=31.6;
p:=3.142;
if Edit1.Text<>'' then u1:=StrToFloat(Edit1.Text)
else
Begin ShowMessage(‘Введіть будь ласка аргумент');
Goto 1;
end;
f:=p/16;
r1:=r3+r4;
u:=sqrt(u1)*sin(f);
z:=(r1*r1+r2*r2)/(r1+r2)*u;
Label3.Caption:='f='+format('%2.6s',[FloatToStr(f)]);
Label4.Caption:='r1='+format('%2.6s',[FloatToStr(r1)]);
Label5.Caption:='u='+format('%2.6s',[FloatToStr(u)]);
Label6.Caption:='z='+format('%2.6s',[FloatToStr(z)]);
Label7.Caption:='u1='+format('%2.6s',[FloatToStr(u1)]);
1:end;
Тепер запрограмовуємо кнопку „Вихід”.
Її код наступний:
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
Нижче поданий код вСєї програми.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;{оголошення модулів}
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var {оголошення змінних}
Form1: TForm1;
r1,r2,r3,r4,z,f,u,u1,p:real;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);{Код програми першої кнопки}
Label 1;
begin
r2:=18.95;
r3:=20.5;
r4:=31.6;
p:=3.142;
{обробка ситуації коли користувач не ввів аргумент}
if Edit1.Text<>'' then u1:=StrToFloat(Edit1.Text)
else
Begin ShowMessage(‘Введіть будь ласка аргумент');
Goto 1;
end;
{Обчислення і виведення результатів}
f:=p/16;
r1:=r3+r4;
u:=sqrt(u1)*sin(f);
z:=(r1*r1+r2*r2)/(r1+r2)*u;
Label3.Caption:='f='+format('%2.6s',[FloatToStr(f)]);
Label4.Caption:='r1='+format('%2.6s',[FloatToStr(r1)]);
Label5.Caption:='u='+format('%2.6s',[FloatToStr(u)]);
Label6.Caption:='z='+format('%2.6s',[FloatToStr(z)]);
Label7.Caption:='u1='+format('%2.6s',[FloatToStr(u1)]);
1:end;
{Код кнопки для виходу із програми}
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
Рисунок 1.4 – Результат виконання програми.
Пояснення до програм.
В програмі мовою GW- Basic сталим величинам їх числові значення задають за допомогою операторів DATA і READ, в програмах іншими мовами за допомогою операторів присвоєння. Після введення аргумента U1 обчислюються і виводяться проміжні значення F, R1, U і значення функції Z, а також значення аргумента.
Питання для самоперевірки.
1. Що таке ідентифікатор? Які правила побудови ідентифікаторів?
2. Які основні оператори введення-виведення даних?
3. Як виконується введення-виведення даних мовами Pascal і С, Visual Basic, Delphi?
4. Який порядок дій в арифметичному виразі?
5. Як задається аргумент стандартної тригонометричної функції?
6. Що таке програма лінійної структури?
7. Якою командою запускається на виконання?
8. Типи даних та їх оголошення?
ПРОГРАМИ З РОЗГАЛУЖЕННЯМ
Структура розгалуженої програми складається з введення аргумента, формування умови розгалуження, розрахунку в кожній вітці значення функції відповідно до умови задачі, виведення значення аргумента і обчислення значення функції.
При складанні програм з розгалуженням (таблиця 2.1) необхідно:
- скласти графічний алгоритм;
- ідентифікувати змінні;
- скласти однією або двома мовами програму, в якій передбачити введення аргумента і виведення значення обчисленої функції в кожній вітці алгоритму;
- розв’язати задачу на ЕОМ в діалоговому режимі.
Задачу слід розв’язати для двох значень аргумента, які вказані в умові задачі, що дає можливість тестувати алгоритм.
Таблиця 2.1- Варіанти завдань
№ ва-ріанту | Вид функції | Аргу-мент | Значен-ня аргу-мента | A | B |
x | 1.62 1.41 | 1.62 | -1.25 | ||
y | 2.86 3.98 | 3.463 | 4.215 | ||
g | 4.751 1.17 | 6.435 | 1.87 | ||
1.321 2.65 | 3.65 | 1.321 | |||
x | 11.68 3.86 | 4.63 | 0.68 | ||
l | 2.38 7.6 | 1.361 | - | ||
x | 4.26 7.29 | 8.3 | 6.8 | ||
h | 0.21 1.65 | 0.261 | 1.658 | ||
q | 9.477 4.35 | 4.652 | 3.825 | ||
x | 3.2 6.856 | 1.5 | 10.638 | ||
o | 1.651 0.581 | 12.83 | 0.863 | ||
p | 3.271 4.956 | 3.651 | 5.82 | ||
r | 8.269 2.892 | 6.347 | 21.4 | ||
s | 1.326 3.906 | 0.854 | 3.625 | ||
t | 0.365 | 1.265 | 3.126 | ||
y | 0.375 0.506 | 0.265 | -0.883 | ||
l | 2.685 7.21 | 4.735 | 8.216 | ||
3.656 8.350 | 2.876 | 12.393 | |||
c | 18.106 28.318 | 6.208 | 23.575 | ||
x | 1.627 0.291 | 1.326 | 0.967 | ||
1.36 2.314 | 2.128 | 0.366 | |||
8.272 3.214 | 16.283 | 2.283 | |||
y | 2.225 7.093 | 2.703 | 12.385 | ||
i | -5.5 -2.638 | -2 | -8 |
Приклад. Скласти графічний алгоритм і програми для обчислення функції
a=6.6; b=2.95.
Задачу розв’язати для двох значень аргумента х=2.46 і х=4.1.
Розв’язок задачі.
1. Графічний алгоритм показаний на рис.2.1
2. Ідентифікація змінних
Змінна | a | b | x | Y |
Ідентифікатор | A | B | X | Y |
3. Програма і результати обчислень мовою GW- Basic
10 REM РОЗГАЛУЖЕНА ПРОГРАМА
20 A=6.6 : B=2.95
30 INPUT X
40 IF X>A/2 THEN 70
50 IF X>A/3 AND X<B THEN 100
60 GOTO 120
70 Y=A*X^2+B*SIN(A/2)^2
80 PRINT “Y=“;Y,”X=“;X
90 GOTO 120
100 Y=(B+1)/2+A*COS(A^3)
110 PRINT “Y=“;Y,”X=“;X
120 END
Y=2.240538 X=2.46
Y=111.0194 X=4.1
4. Програма мовою С
#include <math.h>
#include <stdio.h>
#define A 6.6
#define B 2.95
main( )
{
float x,y;
scanf(“f”,&x);
if(x>a/2.)
{
y=A*pow(x,2.)+B*pow(sin(a/2.).2.);
printf(“\ny=%f x=%f”,y,x);
}
else
if((x<B)&(x>a/3.))
{
y=(B+1)/2.+A*cos(pow(A.3.));
printf(“\ny=%f x=%f”,y,x);
}
}
Y=2.240538 X=2.460000
Y=111.0194 X=4.100000
5. Програма мовою Pascal
program lab2(input,output);
const a=6.6; b=2.95;
var x,y: real;
begin
write(‘Введіть x>‘);
read(x);
if x>a/2 then y:=a*x*x+b*sin(a/2)*sin(a/2)
else if (x>=a/3) and (x<b)
then y:=(b+1)/2+a*cos(a*a*a);
writeln(‘y= ‘,y,’x= ‘,x);
end.
Y=2.2407E+00 X=2.4600E+00
Y=1.1102E+02 X=4.1000E+00
Завдання:
Скласти програму для обчислення функції:
|
|
Задачу розв’язати для двох значень аргументу x = 2.46 i x = 4.1.
Опис форми.
Відкриваємо нову форму і на цій формі створюємо такі елементи (таблиця 2.1):
Таблиця 2.2- Елементи керування і їх властивості
Елемент (Name) | Властивість | Значення |
Label1 | Caption | Значення аргументу |
Alignment | 2-Center | |
Label2 | Caption | Результат |
Alignment | 2-Center | |
Textbox | Name | стираємо значення Text1 |
ToolTipText | Введіть значення | |
BorderStyle | 1-FixedSingle | |
Label3 | Caption | поле Caption порожнє |
BorderStyle | 1-FixedSingle | |
CommandButton1 | Caption | Розрахунок |
CommandButton2 | Caption | Скасувати |
CommandButton3 | Caption | Вихід |
Рисунок 2.2- Інтерфейс програми.
Програма з оператором If…Then:
Private Sub Command1_Click()
Dim A, B, X As DoubleA = 6.6: B = 2.95
X = Val(Text1.Text)
If X > A / 2 Then
Y = A * X ^ 2 + B * Sin(A / 2) ^ 2
Else If X > A / 3 And X < B Then
Y = (B + 1) / 2 + A * Cos(A ^ 3)
Else
Y = "Функція не існує"
End If
Label3.Caption = Y
End Sub
Private Sub Command2_Click()
Text1.Text = ""
Label3.Caption = ""
End Sub
Private Sub Command3_Click()
End
End Sub
Програма з оператором Case:
Private Sub Command1_Click()
Dim A, B, X As Single A = 6.6: B = 2.95
X = Val(Text1.Text)
Select Case X
Case Is > A / 2
Y = A * X ^ 2 + B * Sin(A / 2) ^ 2
Case Is > A / 3 And X < B
Y = (B + 1) / 2 + A * Cos(A ^ 3)
Case Else
Y = "Функція не існує"
End Select
Label3.Caption = Y
End Sub
Private Sub Command2_Click()
Text1.Text = ""
Label3.Caption = ""
End Sub
Private Sub Command3_Click()
End
End Sub
Результати:
Рисунок 2.3 – Результат виконання програми.
Програма мовою Delphi
Опис форми.
Відкриваємо нову форму і на цій формі створюємо такі елементи (таблиця 2.2):
Таблиця 2.3 - Елементи керування і їх властивості
Елемент (Name) | Властивість | Значення |
Label1 | Caption | Введіть аргумент |
Label2 | Caption | Результати |
Edit1 | Text | Стираємо значення Edit1 |
Label3 | Caption | y |
Button1 | Caption | Обчислити |
Button2 | Caption | Очистити |
Button3 | Caption | Вихід |
Рисунок 2.4- Інтерфейс програми .
Код програми з оператором IF…
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const a=6.6; b=2.95;
var
Form1: TForm1;
x,y: real;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
x:=StrToFloat(Edit1.Text);
if x>a/2 then y:=a*x*x+b*sin(a/2)*sin(a/2)
else if (x>=a/3) and (x<b)
then y:=(b+1)/2+a*cos(a*a*a);
Label3.Caption :='y='+format('%2.7s',[FloatToStr(y)]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Label3.Caption :='';
end;
end.
Рисунок 2.5 – Результат виконання програми.
Пояснення до програм
Щоб позбутися зайвих операторів при програмуванні розгалужених процесів, необхідно слідкувати за тим, щоб обхід здійснювався по вітці ТАК. Кількість умов у графічному алгоритмі повинна бути на одиницю меншою за кількість віток.
В приведених програмах обчислення у вітказ організовані за допомогою логічних умовних операторів if … then … else …
Питання для самоперевірки
1. Як працює умовний оператор?
2. Як працює безумовний оператор за обчисленням?
3. Яка різниця між арифметичним і логічним умовними операторами?
4. Чим визначається кількість умовних операторів у програмі?
5. Які логічні фунуції можуть бути використані в умовних операторах?
6. Чим визначається кількість операторів у тілі умовного оператора?
7. Як уникнути надлишкового застосування безумовного оператора?
8. Як отримуються дані логічного типу?