Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Ціль роботи: закріплення знань алфавіту мови програмування C++, придбання навичок запису його констант, змінних, виразів, операторів присвоєння; оволодіння навичками складання програми з лінійною структурою та виконання її в IDE Borland C++ 5.0.
Завдання 2.1. Записати мовою C++ математичні вирази за варіантами, які наведені в таблиці 2.1.
Таблиця 2.1
№ |
Математичні вирази |
№ |
Математичні вирази |
1-3 |
а) 3(z+1)2+2,1106 б) x+z0 0b1 |
4-6 |
а) 104 e2 f +z3 б) x+z<0 0f2 |
7-9 |
а) 3(z+3)0,5+10-3 б) x+z1 1b2 |
10-12 |
а) ln(z + 1)0,5+4,2104 б) x2 0b3 |
13-15 |
а) 5(z+1)5+106 б) 0 b1 0f0,5 |
16-18 |
а) 6(z+1)6+1,6106 б) cosx+z0 0b6 |
19-21 |
а) 7(z+1)0,5+2,7106 б) x+z0 0b7 |
22-24 |
а) 107sin3z + b0,5 б) lnx+z0 0b1 |
25-27 |
а) z+13+2105 б) lnx+z0 b9 |
28-31 |
а) (z+1)0,5+106 б) x+z0 0b 1 |
Прийняті позначення: обєднання множин, переріз множин.
Завдання 2.2. Представити математичний запис виразу за варіантами, які наведені в таблиці 2.2, і показати порядок дій.
Таблиця 2.2
№ |
Вираз |
1 |
x2./3./x/a+sin(x)/2sqrt(x)+1.0e6pow(x,1./7.) |
2 |
(x7)/3.x+3sqrt(x)/2./x+1.0e71./3.pow(x,5) |
3 |
x2./3.x/a+cos(x)/2./sqrt(x)+1.0e5pow(x,7) |
4 |
(x4)/3./x+sqrt(abs(x))/2.x+1.0e6pow(x,1./3.) |
5 |
x2./3./x/a+sqrt(x)/2./sin(x)+1.0e5pow(x/3.,2./7.) |
6 |
1.4e4pow(2*x,3)+sqrt(sin(x))/2.+cos(x)/2./x |
7 |
abs(cos(x))/2./x5./7.x/a/1.0e6pow(x/2.,1./7.) |
8 |
x2./3./xa+sqrt(sin(x))/2/x+1.0e3pow(x/7.,2./3.) |
9 |
(x7)/3.x+3sqrt(x)/2./x+1.0e74pow(x,b) |
10 |
sqrt(cos(xx))/2./x5./7.x/a/1.0e6pow(x,1./8.) |
11 |
x9./(3x/a)+cos(x)/2./sqrt(x)+1.0e5pow(x,9) |
12 |
x4./3./x+exp(abs(x))/2.x+1.0e4pow(x,1./3.) |
13 |
sqrt(x)/2./(x5./7.)x/a/1.0e6pow(x/2.,1./9.)/11 |
14 |
x23./xa+sin(x)/(2x+1.0e3pow(x,5./7.) |
51 |
|
15 |
x4./3./(x+abs(x))/2.x+1.0e5pow(x,5./3.) |
Завдання 2.3. Cклаcти програму обчислення наступних величин за варіантами, які наведені в таблиці 1.3, та виконати її в IDE Borland C++ 5.0.
Таблиця 2.3
№ |
Величини, які треба обчислити |
1 |
Модуль вектора 5a+10b, якщо a={3; 2} і b={0; 1} |
2 |
Проекція вектора a={5; 2; 5} на вісь вектора b={2; 1; 2} |
3 |
Периметр трикутника з вершинами A(1; 1), B(4; 1), C(4; 5) |
4 |
Модуль вектора 2a+4b, якщо a={3; 2} і b={0; 1} |
5 |
Кути трикутника з вершинами A(0; 1,7), B(2; 1,7), C(1,5; 0,85) |
6 |
Площа чотирикутника з вершинами A(0;0), B(1;3), C(2;4), D(3;1) |
7 |
Модуль вектора a+b, якщо a=11, b=23, ab=30 |
8 |
Модуль вектора ab, якщо a=3, b=5, та a і b утворюють кут у 1200 |
9 |
Кут між векторами a={2; 4; 4} і b={3; 2; 6} |
10 |
Модуль вектора a+b, якщо a={1; 2; 3} і b={4; 2; 9} |
Алфавіт мови C++ складається з сукупності символів, які наведені у додатку 3. За допомогою символів алфавіту можна складати різноманітні конструкції: константи, змінні, оператори, тощо.
Постійна величина (константа) не змінюється в процесі роботи програми. Є декілька видів констант: числові (цілі та з плаваючою крапкою), символьні, логічні.
Цілі десяткові константи складаються з послідовності десяткових цифр, перед якою немає цифри 0, а може стояти знак “+” або “”. Приклад: 15
Цілі вісімкові константи складаються з послідовності вісімкових цифр, перед якою є цифра 0 та може стояти знак “+” або “”. Приклад: 015
У мові C++ цілі константи можна зображати і в шістнадцятковій системі числення. В цьому випадку константи починаються з 0x або 0X, за якими йдуть шістнадцяткові цифри. Перед знаком 0x або 0X може бути знак “+” або “”. Приклад: 0x2A
Цілі десяткова, вісімкова та шістнадцяткова константа, значення якої перевищує найбільше машинне ціле зі знаком, є довгою константою (long); в інших випадках цілі константи вважаються int.
Цілі десяткова, вісімкова та шістнадцяткова константа, за якою безпосередньо стоїть буква l або L, є довгою константою (long).
Константа з плаваючою крапкою складається з цілої частки, десяткової крапки, дробової частки, букви е або Е та цілого показника степеня. Ціла або дробова частка (але не обидві одразу) може бути відсутньою. Десяткова точка, або е (Е) сумістно з цілим показником степеня (але не обидві частки одночасно) може бути відсутньою. Наприклад, число 0,015 можна записати як 0.015 та 0.15E01, або 1.5E02. Константа з плаваючою крапкою має тип double.
Cимвольна константа це символ в лапках. Приклад: f. Символьні константи вважаються даними типа int.
Логічні константи приймають тільки два значення: true (iстина) та false (хибність).
Коментар це текст, обмежений символами /* і */, або текст, який починається символами // та закінчується на прикинці рядка. Коментарі /* */ не можуть бути вкладеними. Символи // можна використовувати для того, щоб закоментувати символи /* або */, а символами /* можно закоментувати //.
Змінна визначається імям (ідентифікатором), типом та значенням.
Ідентифікатор є послідовністю букв і цифр, причому перший символ повинен бути буквою. Символ підкреслювання “_” вважається буквою. В ідентифікаторах великі та малі букви розрізнюються, букви кирилиці використовувати не можна. Не можна використовувати як ідентифікатори службові слова, список яких наведений у додатку 4.
Мова C++ є суворо типізованою мовою. Це означає, що кожна змінна повинна бути описана, тобто необхідно визначити її тип.
Обробка даних виконується в виразах. Вираз складається з операцій і операндів. Операндом може бути константа, змінна або імя функції (математичні функції наведені у додатку). Обчислення виконуються зліва направо з урахуванням пріоритету операцій. У мові C++ є 18 рівнів пріоритету операцій. Операції за приорітетом з описом їх позначень, назв та синтаксиса наведені у додатку.
Відзначимо, що при виконанні операції ділення “/” цілого на ціле у результаті набуваємо цілу частку. Наприклад, 5/2 дорівнює 2.
Префіксні операції розташовані зліва від операнда і виконують дію з ним до того, як його значення буде використане, а постфіксні операції виконуються після усіх обчислень.
Логічні операції !, &&, та || здійснюють дії над операндами відповідно з таблицєю істинності (таблиця 2.7). Наприклад, при k=1 результатом виразу k0 && k4 є true.
Таблиця 2.7
Операція |
Дія |
Вираз |
A |
B |
Результат |
! |
Логічне НI |
!A |
true false |
false true |
|
&& |
Логічне I |
A && B |
true true false false |
true false true false |
true false false false |
|| |
Логічне АБО |
A || B |
true true false false |
true false true false |
true true true false |
Завдання 2.1. Данні математичні вирази записати мовою C++:
а) 103e2x +5(z+1)3 б) b< 0 f > 1.
a) 1.0e3exp(2x)+5*pow(z+1, 3)
б) abs(b)<0 && f>1
Завдання 2.2. Представити математичний запис виразу 0.51e6sqrt(3x)+2bb і показати порядок дій.
3 2 1 6 4 5
0,51106(3x)0,5+ 2b2 0.51e6sqrt(3x)+2bb
Завдання 2.3. Cклаcти програму обчислення скалярного добутку двох векторів а={4; 2; 4} і b={6; 3; 2} та виконати її в IDE Borland C++ 5.0.
Cклаcти програму обчислення скалярного добутку двох векторів а={4; 2; 4} і b={6; 3; 2} на мові C++.
2. Методика розвязання задачі
Скалярний добуток двох векторів обчислюється за формулою:
ab= A1 B1 + A2 B2+ A3 B3 , (1.1)
де A1 , B1 , A2 , B2 , A3 , B3 відповідні координати векторів а і b.
3. Алгоритм розвязання задачі
Алгоритм розвязання задачі можна представити у вигляді такої послідовності дій:
Дія 1. Ввести координати векторів а і b;
Дія 2. Обчислити скалярний добуток за формулою (1.1);
Дія 3. Вивести значення скалярного добутку двох векторів.
Представимо алгоритм розвязання задачі на мові C++, позначив змінні A1 , B1 , A2 , B2 , A3 , B3 і ab відповідно як a1, b1, a2, b2, a3, b3 і ab (усі типу double).
4. Текст програми
//Обчислення скалярного добутку двох векторів
#include <iostream.h>
#include <math.h>
void main(){
double a1, a2, a3, b1, b2, b3, ab;
cout<<" Введіть координати a1,a2,a3,b1,b2,b3"<<endl;
cin>>a1>>a2>>a3>>b1>>b2>>b3;
ab=a1b1+a2b2+a3b3;
cout<<" Скалярний добуток ab="<<ab<<endl;
}
5. Результати роботи програми
Введіть координати a1,a2,a3,b1,b2,b3
4. 2. 4. 6. 3. 2.
Скалярний добуток ab=22
1. Які дані можна вживати в мові C++?
2. З якою метою використовують директиву {$E}?
3. Назвіть порядок виконання операцій в виразі.
4. Яка структура програми на мові C++?
5. Як працює оператор присвоєння?
6. Як у C++ здійснюється введення і виведення значень змінних?
Ціль роботи: оволодіння навичками складання програми з розгалуженою структурою за допомогою умовного оператора if або оператора вибору switch та виконання її в IDE Borland C++ 5.0.
Завдання 3.1. Представити математичний запис фрагмента програми за варіантами, які наведені в таблиці 3.1, і обчислити значення змінної x після його виконання. Вказівка: замість n підставити номер варіанта.
Таблиця 3.1
№ |
Фрагмент програми |
№ |
Фрагмент програми |
1-5 |
t=n; x=t; if(t>1 && t<3)x=3; if(t<=1) x=0; |
6-10 |
t=n; x=0; if(t<0)x=t; else x=t; |
11-15 |
a=n; b=13; c=12; x=a; if(x<b)x=b; if(x<c)x=c; |
16-20 |
a=n; b=17; c=18; x=a; if(b<x)x=b; if(c<x)x=c; |
21-25 |
t=n; switch(t){ case 0: x=1; break; default: x=0;}; |
26-30 |
t=n; if(t0 && t28)x10; else if(t=28)x20; else x0; |
Завдання 3.2. Cклаcти програму обчислення значень функції за варіантами, які наведені в таблиці 3.2, та виконати її в IDE Borland C++ 5.0.
Таблиця 3.2
№ |
Функція |
№ |
Функція |
№ |
Функція |
№ |
Функція |
1 |
y=tgx/lnx |
2 |
y=lnx/tgx |
3 |
y=arcsin(1/x) |
4 |
y=ctg lnx |
5 |
y=сtg x1/3 |
6 |
y=tgx/(1x) |
7 |
y=tgx/ln2/3x |
8 |
y=x0,2tgx |
9 |
y=ln tg x |
10 |
y=tg1/3x/(x+1) |
11 |
y=arcctg1/3x |
12 |
y=arccos x |
13 |
y=arcsin x |
14 |
y=tgx/(x 1) |
15 |
y=lnx/(1x2) |
16 |
y=x/(1+tgx) |
17 |
y=lnx/(1x) |
18 |
y=arcctg x |
19 |
y=tgx/lnx |
20 |
y=x1/7сtgx |
21 |
y=arccos(1/x) |
22 |
y= x1/3/(1x2) |
23 |
y=arcsin1/3x |
24 |
y=arcctg x1/3 |
25 |
y=tg2lnx |
26 |
y=tg1/3x |
27 |
y=tgx/(1x2) |
28 |
y=ln tgx1/3 |
Умовний оператор if призначений для виконання або невиконання деякого оператора (простого або складеного) залежно від значення виразу.
Загальні вигляди умовного оператора if:
if(вираз) оператор 1;
if(вираз) оператор 1 else оператор 2;
Виконання умовного оператора if полягає в обчисленні логічного виразу. Якщо його значення true (не дорівнює нулю), то виконується оператор 1. Якщо значення логічного виразу false (дорівнює нулю) і умовний оператор не містить слова else, то його виконання завершується. Якщо слово else є, то виконується оператор 2.
Якщо в якій-небудь вітці умовного оператора треба виконати кілька операторів, то їх слід обєднати в складений оператор {}. Один умовний оператор може входити в інший умовний оператор. При цьому кожне слово else відповідає останньому перед ним if. Так, після виконання наступного фрагмента програми:
x3;
if (x0 && x=1)y1;
else if (x1)y10;
else y0;
змінна y має значення 10.
Оператор вибору switch призначений для виконання одного з кількох можливих операторів в залежності від збігу значення виразу-селектора та значеня константного виразу. Загальний вигляд оператора switch:
switch вираз-селектор{
case константний вираз 1 : оператор 1;
. . .
case константний вираз N : оператор N;
default: оператор;
}
Вираз-селектор повинен бути цілого типу або типу вказівника. Константний вираз повинен мати такий самий тип що і вираз-селектор. В одному операторі switch ніякі константні вирази не можуть мати однакових значень. Може також буте не більше одного префіксу default.
Виконання оператора switch починається з обчислення значення виразу-селектора. При першому збігові цього значення із значенням константного виразу (1,..., N) виконується відповідний оператор. Якщо жодного збігу не зафіксовано, а є слово default, то виконується оператор, наступний за default. У противному разі виконання оператора switch завершується.
Слід зазначити, що префікси case та default самі не змінюють потік управління. Для виходу з оператора switch застосовується оператор break.
Оператор break припиняє виконання оператора switch, в якому був виконан цей оператор. Управління передається на оператор, який стоїть одразу за цим оператором switch.
Приклад. Після виконання наступного фрагмента програми:
char latter=A;
switch (latter){
case 'A': cout<<"Case A"; break;
case 'B':
case 'C': cout<<"Case B or C"; break;
default: cout<<"Not A, B or C";
}
буде надруковано Case A
Завдання 3.1. Представити математичний запис фрагмента програми
t=8.;
if(t>0)x=pow(t,1./3.);
else if(t<0) x=pow(abs(t),1./3.);
else x=0;
і обчислити значення змінної x після його виконання.
Цей фрагмент програми реалізує обчислення функції xt1/3. Після виконання цього фрагмента x2.
Завдання 3.2. Скласти програму обчислення значень функції y=ctgx і виконати її в IDE Borland C++ 5.0.
1. Постановка задачі
Скласти програму обчислення значень функції y=ctgx на мові C++.
2. Методика розвязання задачі
Функція y=ctgx обчислюється за формулою
y=cosx/sinx, (2.1)
якщо sinx 0 (2.2)
3. Алгоритм розвязання задачі
Алгоритм розвязання задачі можна представити у вигляді такої послідовності дій:
Дія 1. Ввести значення x.
Дія 2. Перевірити умову (2.2). Якщо умова істина, то обчислити значення функції за формулою (2.1) і вивести його, інакше вивести повідомлення: "Функція не існує".
Остаточно представимо алгоритм розвязання задачі на мові C++, позначив змінні x і y відповідно як x і y (обидві типу double).
4. Текст програми
//програма обчислення функції y=ctg(x)
#include <iostream.h>
#include <math.h>
void main(){
double x,y;
cout<<" Введіть x="; cin>>x;
if(sin(x)!=0){
y=cos(x)/sin(x);
cout<<" y="<<y<<endl;
}
else cout<<" Функція не існує"<<endl;
}
5. Результати роботи програми
Введіть x=1.57
y=0.000796327
1. Як працюють оператори if і switch?
2. Коли в операторі if застосовують складений оператор?
3. Як виконується умовний оператор if, якщо до нього входить інший умовний оператор if?
4. Що робе оператор break у разі його виконання в операторі switch?
Ціль роботи: оволодіння навичками складання програми з циклічною структурою за допомогою операторів циклу while, do while і for та виконання її в IDE Borland C++ 5.0.
Завдання 4.1. Представити математичний запис фрагмента програми за варіантами, які наведені в таблиці 4.1, і обчислити значення змінної x після його виконання. Вказівка: замість n підставити номер варіанта.
Таблиця 4.1
№ |
Фрагмент програми |
№ |
Фрагмент програми |
1-5 |
x=1; for(j=n; j>n; j--) x=xj; x=2x; |
6-10 |
x0; j=1; do x=x+j; j=j+2; while(j<=n); |
11-15 |
x=0; for(j=1; j<=n; j++) x=x+2; x=2x; |
16-20 |
x=1; while(x<=n) x=x+1; x=2x; |
21-25 |
x=1; j=1; x1=n % 5; do x=xx1; j=j+1; if(j==4) break; while(j<=5); |
26-30 |
x=n; for(k=1; k<=6; k++){ if(k<3) continue; x=x+1; }; |
Завдання 4.2. Cклаcти програму табулювання функції з завдання 4.2 при зміні значення x від 1 до 1 з кроком 0,2 та виконати її в IDE Borland C++ 5.0.
Оператор циклу з передумовою while складається з ключового слова while, за яким йдуть вираз логічного типу у круглих дужках та виконуваний у циклі оператор (простий чи складений).
Загальний вигляд оператора циклу з передумовою:
while(вираз)оператор;
Виконання оператора циклу з передумовою починається з обчислення значення виразу. Якщо це значення false, то оператор не виконується (управління передається на оператор, який стоїть одразу за циклом). Якщо значення виразу true, оператор виконується, після чого знову обчислюється вираз. Щоб запобігти зациклюванню, слід передбачити зміну значення виразу всередині тіла циклу. Наприклад, після виконання наступного фрагмента програми:
atrue; x5;
while(a || x9){ //цикл завершиться, як тільки
a!a; xx2; //вираз набуде значення false
}
змінна x має значення 11, а змінна a 0 (false).
Оператор циклу з післяумовою do while складається з ключового слова do, за яким іде виконуваний у циклі оператор (послідовність операторів); ключового слова while і виразу логічного типу.
Загальний вигляд оператора циклу з післяумовою:
do оператор while(вираз);
Виконання цього оператора циклу відбувається так. Спочатку виконується оператор, а потім визначається значення виразу логічного типу. Якщо значення виразу false, то виконання циклу припиняється. Якщо це значення true, то виконується оператор, а потім знову обчислюється вираз. Наприклад, після виконання наступного фрагмента програми:
atrue; x5;
do
a!a; xx2; //цикл завершиться, як тільки
while(a || x9); //вираз набуде значення false
змінна x має значення 11, а змінна a 0 (false).
Треба підкреслити, що на відміну від циклу while, тіло циклу з післяумовою do while завжди виконується хоча б один раз.
Оператор циклу з параметром for складається з ключового слова for, за яким йдуть вираз1, крапка з комою (;), вираз2, крапка з комою (;), вираз3 у круглих дужках і виконуваний у циклі оператор (простий або складений).
Загальний вигляд оператора циклу for:
for(вираз1; вираз2; вираз3)оператор;
Вираз1 це вираз, який описує ініціалізацію циклу. Вираз2 перевірка умови завершення циклу. Вираз3 це вираз, який обчислюється після кожної ітерації циклу. Кожний з виразів1-3 може складатися з декількох виразів, які обєднуються оператором кома (,).
Виконання оператора циклу for починається з обчислення виразу1. Потім обчислюється вираз2. Якщо значення виразу2 false, то виконання циклу припиняється і управління передається наступному оператору. Якщо це значення true, то послідовно виконуються оператор і вираз3, а потім знову обчислюється вираз2.
43
Оператора циклу for еквівалентний наступній послідовності операторів:
вираз1;
while(вираз2){
оператор; вираз3;
}
Якщо немає виразу2, то вважається, що він має значення true. Оператор for(;;); представляє собою нескінченний цикл, який еквівалентний оператору while(true);.
Приклад. Після виконання наступного фрагмента програми:
for(atrue, x5; a || x9; a!a, x+2);
змінна x має значення 11, а змінна a 0 (false).
Оператор break припиняє виконання оператора циклу (while, do while або for), в якому був виконан цей оператор. Управління передається на оператор, який стоїть одразу за оператором циклу.
Оператор continue припиняє виконання поточної ітерації оператора циклу (while, do while або for), в якому був виконан цей оператор, і здійснює перехід к виконанню наступної ітерації циклу. Оператор continue по дії протележен оператору break.
Завдання 4.1. Представити математичний запис фрагмента програми
for(x=1,j=1; j<5; j++, x*=j);
и обчислити значення змінної x після його виконання.
Цей фрагмент програми реалізує обчислення x!=12...5. Після виконання цього фрагмента x120.
Завдання 4.2. Скласти програму табулювання функції y=ctgx при зміні значення x від a1 до b1 з кроком h0,5 і виконати її в IDE Borland C++ 5.0.
1. Постановка задачі
Скласти програму табулювання функції y=ctgx при зміні значення x від a1 до b1 з кроком h0,5 на мові C++.
2. Методика розвязання задачі
Методика розвязання задачі збігається з методикою з приклада завдання 2.2 (при оформленні роботи треба навести методику наново).
3. Алгоритм розвязання задачі
Алгоритм розвязання задачі можна представити у вигляді такої послідовності дій:
Дія 1. Ввести значення a, b, h;
Дія 2. Присвоїти x значення a;
Дія 3. Повторювати наступні дії поки x≤b:
Дія 3.1. Перевірити умову (2.2). Якщо умова істинна, то обчислити значення функції y за формулою (2.1) і вивести x та y, інакше вивести x та повідомлення: не існує;
Дія 3.2. Присвоїти x нове значення, яке дорівнює старому значенню x плюс крок h.
Запишемо алгоритм розвязання задачі мовою C++, позначив змінні x, y, a, b, h відповідно як x, y, a, b, h (усі типу double).
4. Текст програми
#include <iostream.h>
#include <math.h>
void main(){
double a,b,h,x,y;
cout<<" Введіть a,b,h: "; cin>>a>>b>>h;
for(x=a; x<=b; x+=h)
if(sin(x)!=0){
y=cos(x)/sin(x); cout<<" x="<<x<<" y="<<y<<endl;
}
else cout<<" x="<<x<<" y="<<" не існує"<<endl;
}
5. Результати роботи програми
Введіть a,b,h: -1. 1. 0.5
x=1 y=0.642093
x=0.5 y=1.83049
x= 0 y= не існує
x=0.5 y=1.83049
x=1 y=0.642093
1. Як працюють оператори циклу while, do while і for?
2. Чим цикл do while відрізняється від циклу while?
3. Коли у циклах while та for застосовують складений оператор?
4. Якій послідовності операторів еквівалентний оператор циклу for?
5. Як працюють оператори break та continue?
Ціль роботи: оволодіння навичками складання програми з використанням функцій та виконання її в IDE Borland C++ 5.0.
Завдання 5.1. Обчислити значення змінних, які будуть виведені на дісплей, після виконання фрагмента програми за варіантами наведенимі в таблиці 5.1. Вказівка: n дорівнює номеру варіанта.
Таблиця 5.1
№ |
Фрагмент програми |
№ |
Фрагмент програми |
1-5 |
void d(int &x, int &y); void main(){ int x,y,n; cin>>n; x=3; y=4; d(y,x); y=nx; cout<<x<<" "<<y; } void d(int &x, int &y){ x*=2; y=x+2; } |
6-10 |
int d(int x, y); void main(){ int x,y,n; cin>>n; x=3; y=4; y=nx+d(y,x); cout<<x<<" "<<y; } int d(int x, y){ return 2*x+y; } |
11-15 |
int d(int x, y); void main(){ int x,y,n; cin>>n; x=3; y=4; y=nx+d(n,y); cout<<x<<" "<<y; } int d(int x, y){ return 2*x-y; } |
16-20 |
void d(int &x, int &y); void main(){ int x,y,n; cin>>n; n-=9; x=3; y=4; d(y,x); y=n*x+y; cout<<x<<" "<<y; } void d(int &x, int &y){ x*=2; y=x+1; } |
21-25 |
int Fp(int x); void main(){ int n,y; cin>>n; n-=18; y=Fp(n); cout<<y; } int Fp(int x){ if(x>2)return x*Fp(x-1); else return x; } |
26-30 |
int Fs(int x); void main(){ int n,y; cin>>n; n-=21; y=Fp(n); cout<<y; } int Fs(int x){ if(x>1)return x+Fp(x-1); else return x; } |
Завдання 5.2. Скласти програму обчислення величин із завдання 4.2 з використанням функцій і виконати її в IDE Borland C++ 5.0.
У мові C++ передбачено засоби, завдяки яким можна обєднувати послідовність операторів під одним іменем та звертатися до неї як до одного цілого. Це можна робити за допомогою функцій іменованих часток програми, до яких можна звертатися стільки разів, скількі потрібно.
У програмах C++ усі функції повинні бути обявлені та визначені. Обява функції (function declaration) це оператор, який складається з типа повертаємого функцієй значення, імені функції, круглих дужек та крапки з комою “;”. У круглих дужках можуть бути записані формальні параметри функцiї, які один від одного вітділяються комами. Окрім того, перед типом повертаємого функцієй значення може стояти спеціфікатор функції. Обява функції в загальній формі має такий вигляд:
{спеціфікатор} тип_повертаємого_значення імя_функції(
{тип_парам1 імя_парам1, тип_парам2 імя_парам2,…});
Фігурні дужки “{}” вказують на те, що спеціфікатор та формальні параметри функцiї не обовязкові, а три крапки позначають, що кількість параметрів може бути довільною. Приклад обяви функції: long Fact(long x);
Визначення функцiї (function definition) складається з її обяви (виключаючи крапку з комою “;”) та тіла функції у фігурних дужках. Загальний вигляд визначення функцiї:
{спеціфікатор} тип_повертаємого_значення імя_функції(
{тип_парам1 імя_парам1, тип_парам2 імя_парам2,…})
{
тіло функції
}
Якщо функція має відмінний від void тип повертаємого значення, то оператор return у тілі функції повинен повертати значення данного типу.
Параметри функції дають змогу при кожному виклику функцiї працювати з обєктами, що задаються в момент виклику через список фактичних параметрів. При використанні формальних і фактичних параметрів необхідно памятати про наступні правила:
кількість формальних і фактичних параметрів повинна бути однаковою;
перший фактичний параметр відповідає першому формальному, другий другому і т.д.;
кожний фактичний параметр повинен мати той самий тип, що й відповідний йому формальний параметр.
Параметри у функцію можна передавати за значенням і за посиланням. Зміна формальних параметрів, які передаються за значенням, всередині функцiї не викликає зміни відповідних фактичних параметрів. І навпаки, будь-яка змінна формального параметра, який передається за посиланням, викликає зміну фактичного параметра. Передачу параметра за посиланням використовуються тоді, коли цей параметр призначений для передачі деякого значення у місце виклику функції. Приклад:
#include <iostream.h>
void swaparg(int &x, int &y);
void main(){
int i=5, j=7;
cout<<"i="<<i<<" j="<<j<<endl;
swaparg(i, j);
cout<<"Після перестановки: i="<<i<<" j="<<j<<endl;
}
void swaparg(int &x, int &y){
int t;
t = x; x = y; y = t;
}
Якщо функція викликає сама себе, то вона називається рекурсивною. Глибина рекурсії, тобто кількість викликів, у C++ не обмежується. Реально вона залежить від ресурсів памяті (розміру стека). Максимальний розмір стека при роботі з Borland C++ 5 складає 1Mb.
В загальному випадку рекурсивність це не властивість самої функції, а властивість її опису. Рекурсивна функція, як правило, коротша і наочніша за нерекурсивну, але при виконанні вимагає більше часу і памяті за рахунок повторних звертань до самої себе і дублювання локальних змінних. Необхідно добре розуміти, що кожний черговий рекурсивний виклик приводить до утворення нової копії локальних обєктів функції і усі ці копії, що відповідають ланцюжкові активізованих і незавершених рекурсивних викликів, існують незалежно один від одного та зберігаються у стекі. Це може привести до так званого “вибуху” стека. “Вибух” стека означає, що для запису локальних змінних функції не вистачає памяті, яка відводиться під стек.
У C++ можна задати функцію, яка насправді не викликається, а її тіло вбудовується в програму в місці її виклика. Перевагою вбудованих (in-line) функцій є те, що вони не звязані з механізмом виклика функції та повернення ними свого значення. Це позначає, що вбудовані функції можуть виконуватися скоріше звичайних. Недоліком вбудованих функцій є те, що, якщо вони великі та викликаються часто, то обсяг програми зростає. Тому застосування вбудованих функцій звичайно обмежується короткими функціями. Для обяви вбудованої функції використовують спеціфікатор inline.
Приклад.
#include <iostream.h>
inline int even(int x) {
return !(x%2);
}
void main(){
if(even(10))cout<<”парне”<<endl;
}
Завдання 5.1. Обчислити значення змінних, які будуть виведені на дісплей, після виконання наступного фрагмента програми:
long Fact(long x);
void main(){
long n,x,y; n=40; n-=36;
y=Fact(n); x=n; cout<<x<<" "<<y;
}
long Fact(long x){
return x>2 ? x*Fact(x-1):x;
}
Ця програма обчислює x!=4321 з використанням рекурсивної функції. У результаті її виконання x=4, а y=24.
Завдання 5.2. Скласти програму перестановки елементів масиву a в зворотному порядку з використанням функції і виконати її в IDE Borland C++ 5.0. Елементи масиву a визначаються за формулою ai+1=(37ai+3) mod 64. Значення a0=40; i змінюється від 0 до 16.
1. Постановка задачі
Скласти програму перестановки елементів масиву a в зворотному порядку на мові C++ з використанням функції, якщо елементи масиву визначаються за формулою ai+1=(37ai+3) mod 64. Значення a0=40; i змінюється від 0 до 16. Виконати програму в IDE Borland C++ 5.0.
2. Алгоритм розвязання задачі
Алгоритм наведений у прикладі розвязання завдання 4.2 (при оформленні роботи алгоритм необхідно навести наново).
3. Текст програми
//програма перестановки елементів масиву a[n]
#include <iostream.h>
void Rev(int n, int a[]);
void main(){
int i,j,m,x,n=18;
int a[18];
cout<<” Вводимо масив a[”<<n<<”]”<<endl;
a[0]=40;
for(i=0; i<=n-2; i++)a[i+1]=(37a[i]+3) % 64;
for(i=0; i<=n-1; i++)cout<<a[i]<<” ”;
cout<<endl;
Rev(n, a);
cout<<” Масив a[”<<n<<”] після перестановки”<<endl;
for(i=0; i<=n-1; i++)cout<<a[i]<<” ”;
cout<<endl;
}
//функція перестановки елементів масиву int a[n]
void Rev(int n, int a[]){
int m,i,j,x;
m=n/2; j=n-1;
for(i=0; i<=m-1; i++){
x=a[i]; a[i]=a[j]; a[j]=x; j-=1;
}
}
4. Результати роботи програми
Вводимо масив a[18]
40 11 26 5 60 47 14 9 16 19 2 13 36 55 54 17 56 27
Масив a[n] пiсля перестановки
27 56 17 54 55 36 13 2 19 16 9 14 47 60 5 26 11 40
1. Що таке функція?
2. Яка різниця між фактичними і формальними параметрами?
3. Коли використовують передачу параметрів за значення, а коли за посиланням?
4. Що таке “вибух” стека?
5. Що приводе до “вибуху” стека?
Ціль роботи: оволодіння навичками складання програми з масивами та виконання її в IDE Borland C++ 5.0.
Завдання 6.1. Визначити дію фрагмента програми за варіантами, які наведені в таблиці 6.1, якщо char sName[20]="Hello World!"; char *p=sName; int n,i; (Вказівка: n дорівнює номеру варіанта)
Таблиця 6.1
№ |
Фрагмент програми |
№ |
Фрагмент програми |
1-5 |
for(p+=n; *p; p++) cout<<*p<<" "; |
6-10 |
for(p+=n; *p; p--) cout<<*p<<" "; |
11-15 |
for(p+=n-9; *p; p++) cout<<*p<<endl; |
16-20 |
for(p+=n-11; *p; p--) cout<<*p<<endl; |
21-25 |
for(i=n-21; i<5; i++) cout<<sName[i]; |
26-30 |
for(i=n-21; i>2; i--) cout<<sName[i]; |
Завдання 6.2. Cклаcти програму обчислення наступних величин за варіантами, які наведені в таблиці 6.2, та виконати її в IDE Borland C++ 5.0, якщо елементи масиву визначаються за формулою ai+1=(37ai+3) mod 64. Значення a0 дорівнює номеру варіанта; i змінюється від 0 до 18.
Таблиця 6.2
№ |
Величини, які потрібно обчислити |
1-3 |
Найбільший елемент масиву а і його порядковий номер |
4-6 |
Cуми елементів масиву а, значення яких кратні номеру варіанта |
7-9 |
Cуми елементів масиву а, значення яких парні числа |
10-12 |
Середнє арифметичне додатних елементів масиву а |
13-15 |
Cуми елементів масиву а, значення яких непарні числа |
16-18 |
Середнє геометричне додатних елементів масиву а |
19-21 |
Cуми елементів масиву а, значення яких двозначні парні числа |
22-24 |
Добуток найбільшого і найменшого елементів масиву а |
25-27 |
Cуми елементів масиву а, значення яких двозначні непарні числа |
28-30 |
Модуль вектора а/3 |
Масив це упорядкована послідовність однойменних елементів, кожен з яких має один і той самий тип. Елементи масиву можуть мати любий стандартний тип або тип, введений користувачем. Елементи масиву розміщені впорядковано, кожен має свій номер, який називається індексом. Доступ до елементів масиву відбувається шляхом вказування імені масиву та порядкового номера елемента (індексу).
Масив визначається за модифікатором типа []. Загальний вигляд опису масиву:
тип_елементів імя_масиву[кількість_елементів];
Наприклад:
char sName[20];
визначає масив з двадцяти елементів типа char. Імя масиву sName містить адресу першого елементу масива. Це імя може бути використоване в операциях арифметики вказівників для доступу до елементів масиву.
Оператор [] дає більш короткий вираз для доступу до елементів масиву. Вираз sName[k] є еквівалентним *(sName+k).
Масиви в C++, як і в С, нумеруються з нуля. Тому найбільший елемент це кількість_елементів минус одиниця. Так, в масиві з 20 елементів індекси змінюються від 0 до 19. Перехід через максимум приводить до використання чужої області памяті.
Елементи масиву розміщуються у памяті послідовно. Елементи з меншими значеннями індексу зберігаються в більш низьких адресах памяті. Елементи багатовимірних масивів розміщуються таким чином, що самий правий індекс зростає самим першим. Так, для двумірного масиву int d[2][2] елементи масиву розміщуються у памяті за зростанням адресів: d[0][0], d[0][1], d[1][0], d[1][1].
Завдання 6.1. Визначити дію фрагмента програми
char sName[20]="Hello!"; char *p=sName; int n,i;
for(i=1; i<5; i++) cout<<sName[i];
Цей фрагмент програми виводить на екран рядок: ello
Завдання 6.2. Скласти програму перестановки елементів масиву a в зворотному порядку і виконати її в IDE Borland C++ 5.0, якщо елементи масиву визначаються за формулою ai+1=(37ai+3) mod 64. Значення a0=40; i змінюється від 0 до 16.
1. Постановка задачі
Скласти програму перестановки елементів масиву a в зворотному порядку на мові C++, якщо елементи масиву визначаються за формулою ai+1=(37ai+3) mod 64. Значення a0=40; i змінюється від 0 до 16.
2. Алгоритм розвязання задачі
Алгоритм розвязання задачі можна представити у вигляді такої послідовності дій:
Дія 1. Ввести елементи масиву a;
Дія 2. Вивести елементи масиву a;
Дія 3. Визначити m (кількість перестановок елементів масиву a), як результат цілочислового ділення числа елементів масиву n на 2;
Дія 4. Присвоїти j (номеру поточного елемента масиву, який переставляється на місце елемента з меншим номером) значення n-1;
Дія 5. Повторювати m разів наступні дії (i= 0, 1, ..., m-1):
Дія 5.1. Присвоїти x (змінній для тимчасового зберігання елемента з меншим номером) значення i-го елемента масиву a;
Дія 5.2. Присвоїти i-му елементу масиву a значення j-го елемента;
Дія 5.3. Присвоїти j-му елементу масиву a значення x;
Дія 5.4. Зменшити значення j на 1;
Дія 6. Вивести елементи масиву a після перестановки.
Запишемо алгоритм розвязання задачі мовою C++, позначив масив a через a, елементи якого мають тип int. Змінні i, j, n, m, x позначимо відповідно як i, j, n, m, x (усі мають тип int).
3. Текст програми
//програма перестановки елементів масиву a[n]
#include <iostream.h>
#include <math.h>
void main(){
int i,j,m,x,n=18;
int a[18];
cout<<” Вводимо масив a[”<<n<<”]”<<endl;
a[0]=40;
for(i=0; i<=n-2; i++)a[i+1]=(37a[i]+3) % 64;
for(i=0; i<=n-1; i++)cout<<a[i]<<” ”;
cout<<endl;
m=n/2; j=n-1;
for(i=0; i<=m-1; i++){
x=a[i]; a[i]=a[j]; a[j]=x; j-=1;
};
cout<<” Масив a[”<<n<<”] після перестановки”<<endl;
for(i=0; i<=n-1; i++)cout<<a[i]<<” ”;
cout<<endl;
}
4. Результати роботи програми
Вводимо масив a[18]
40 11 26 5 60 47 14 9 16 19 2 13 36 55 54 17 56 27
Масив a[n] пiсля перестановки
27 56 17 54 55 36 13 2 19 16 9 14 47 60 5 26 11 40
1. Який тип можуть мати елементи масиву?
2. Як розміщуються в памяті елементи масиву?