ІВАНО-ФРАНКІВСЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ НАФТИ І ГАЗУ
Кукурудз С.Ф.
Процюк В.Р.
Ваврик Т.О.
ЗБІРНИК ЗАДАЧ З ПРОГРАМУВАННЯ
НАВЧАЛЬНИЙ ПОСІБНИК
Посібник написаний на базі програми курсу “Програмування та алгоритмічні мови” для студентів технологічних спеціальностей з урахуванням багаторічного досвіду викладання в Івано-Франківському Національному університеті нафти і газу.
Посібник складається з 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. Як отримуються дані логічного типу?