Мета роботи
Освоїти прийоми роботи з текстовим редактором і основними компонентами інтегрованого середовища програмування С++; придбати практичні навички введення – виведення даних, складання і налагодження простіших програм мовою С++; освоїти правила опису типів даних; придбати навички у використанні операторів керування й організації циклів.
1.2 Методичні вказівки до організації самостійної роботи студентів
При підготовці до роботи повторити типи констант і змінних, способи їхнього опису, використання інтегрованого середовища програмування на С++ [1–7, конспект лекцій ].
1.2.1 Розробка консольного додатка у середовищі VISUAL C ++
Visual C++ — це інструмент професійного програмування в середовищі Windows. Основна сила пакета – використання бібліотеки класів. Спеціальні програми –майстри пишуть за користувача значну частину проекту – програми. Інтегроване середовище Visual C++ дає можливість писати та виконувати складні програми. Програма в цьому середовищі — це проект, що складається із набору файлів, розміщених в робочих областях. У середовищі можна також реалізовувати звичайні (без використання стандартних класів) програми мовою С++. Для цього застосовується консольний режим.
Для реалізації програми необхідно виконати послідовність дій:
1. Запустити за допомогою меню Visual C++.
2. Використати команду File/New, з’являється вікно New.
3. Перейти на вкладку Projects і вибрати із списку рядок Win32 Console Application.
4. В текстовому полі Project ввести ім’я створюємого проекта Pro1, а в полі Location вказати каталог для проекта за допомогою ієрархічного списку в правому кутку.
5. Натинути кнопку Ок у вікні New. Проект Pro1 створено у вигляді файлів Pro1.dsw, Pro1.dsp.
6. Якщо необхідно продовжити роботу над програмою, з якою працювали раніше, слід використати команду File/Open Workspaces і відкрити файл з розширенням .dsw.
7. Для створення файла Pro1.cpp слід знову використати команду File/New, але з вкладкою Files.
8. Вибирати зі списку рядок C++ Source File, ввести імя файла Pro1.cpp у полі Filename та слідкувати, щоб прапорець Add to project було виставлено! Натиснути Ок. В результаті файл Pro1.cpp буде створено і відкрито у середовищі Visual C++.
9. Якщо необхідний файл. сpp знаходиться на дискеті, слід спочатку створити проект і в ньому всередині замінити його файл з розширенням .cpp на файл. cpp, що знаходиться на дискеті. Для цього найкраще використовувати програму роботи з файлами Far.
10. Набрати текст програми на С++ та відкомпілювати його командою Build/Build Pro1.exe або натисненням іконочної кнопки чи клавіші F7.
11.Запустити програму командою Build/Execute Pro1.exe або клавішами Ctrl+W.
12. Для пошуку та виправлення помилок компіляції у нижньому вікні слід знайти помилковий оператор та два рази натиснути на ньому лівою клавішою мишки. Виходимо на текст програми, виправляємо помилку та знову виконуємо компіляцію. При цьому треба не забувати зберігати на дискові новий варіант програми.
Відладчик вмикається та вимикається в полі меню Build/ Start Debug /Configurations.
Структура програми
Як відомо, кожна програма представляє собою якусь послідовність інструкцій в машинних кодах, що керують поведінкою певного обчислювального засобу. Кожна програма мовою С++ включає до себе підключення заголовних файлів за допомогою директиви препроцесора #include<ім’я заголовного файлу.h>, головну функцію main() і, якщо це необхідно, декілька інших функцій, створених користувачем. Загальна структура простішої програми мовою С++ має вигляд:
#include<ім’я заголовного файлу.h>
Int main()
{тіло головної функції;}
Специфікатор типу int головної функції показує, що вона вертає ціле значення. Фігурні скобки означають початок і кінець блока обчислень, і можуть бути скільки потрібно вкладеними.
Коментарі. В процесі створення програми використовуються коментарі, текст яких завжди ігнорується компілятором, але дозволяє програмісту описувати призначення тої чи іншої частини програми. В мові С++ використовується два різновиду коментарів:
/* текст */ — багатострочний коментар, який не може бути вкладеним і
// текст — однострочний коментар до кінця строки.
Змінні та типи даних. Для того, щоб програма могла на протязі свого виконання зберігати визначенні дані, використовуються змінні та константи. Одним із базових понять властивостей програми є ідентифікатор – ім’я змінної, ім’я функції або метка. В програмі ідентифікатор може містити прописні та строчні латинські букви, цифри та символ підкреслення та обов’язково починатися з буква або символу підкреслення. Ідентифікатор не повинен співпадати з ключовими словами з урахуванням регистру. Ключові слова — це заразервовані мовою ідентифікатори, які мають спеціальне призначення.
Для використання змінної в програмі вона повинна бути оголошена. Створення ідентифікаторів і здійснюється при такому оголошенні.
Змінна — це об’єкт програми, що занімає в загальному випадку декілька комірок пам’яті, та призначений зберігати дані. При оголошенні змінної для неї резервується якась область пам’яти, розмір якої залежить від конкретного типу змінної. Будь-яка константа, змінна, значення чи функції вираження в С++ характеризуються своїм типом. Тип цих об'єктів визначає безліч припустимих значень, форму внутрішнього уявлення, а так само безліч припустимих операцій. Тому всі дані, що використовуються в програмі, до їхньої появи обов'язково повинні бути оголошені (описані).
Нижче приведено перелік базових типів змінних і їхній розмір в байтах.
Таблиця 1.1
Базові типи даних для ПК на базі платформи Intel
Тип | Розмір, байт | Значення |
bool | true (1) або false(0) | |
unsigned short int | від 0 до 65 535 | |
short int | від –32 768 до 32 767 | |
unsigned long int | від 0 до 4 294 967 295 | |
long int | від –2 147 483 648 до 2 147 483 647 | |
int (16 розрядів) | від –32 768 до 32 767 | |
int(32 розряда) | від –2 147 483 648 до 2 147 483 647 | |
unsigned int (16 розрядів) | від 0 до 65 535 | |
unsigned int (32 розряда) | від 0 до 4 294 967 295 | |
char | від 0 до 256 | |
float | від 1.2е-38 до 3.4е38 | |
double | від 2.2е-308 до 1.8е308 | |
long double | від 3.4е-4932 до 3.4е 4932 | |
void | 2 або 4 | - |
Наприклад,
bool dd = true; — логічна змінна dd=1;
bool dd1 = 1; — логічна змінна dd1=true;
int a = 1, b = 0; — цілі змінні a = 1, b = 0;
сhar sim =’A’; — символічна змінна sim =’A’;
float Age = 18.5; — десяткова змінна Age = 18.5 з крапкою, що плаває;
void MyFunction(); — функція не вертає ніякого значення, тощо.
Константи відрізняються від змінних тим, що значення, що присвоєне константі первісно, не може бути змінено на протязі виконання всієї програми. Оголошеня констант виконується за наступною схемою:
сonst [тип] ідентифікатор = значення;
Наприклад:
const double Pi = 3.1415; // константа Pi принимает значение 3.1415;
const a=1; // по умолчанию тип int.
Введення – виведення даних. При введенні - виведенні потоку всі дані розглядаються як потік окремих байтів. Функції введення - виведення для потоку дозволяють обробляти дані різних розмірів і форматів: від одиночного символу до великих структур даних. Програміст може використовувати функції чи бібліотеки, розробляти власні і включати їх у бібліотеку. Для доступу до бібліотеки цих класів треба включити в програму відповідні файли заголовків, наприклад:
#include <iostream>.
За замовчуванням стандартні введення, виведення і виведення повідомлень про помилки відносяться до консолі користувача (клавіатура й екран). Це означає, що всякий раз, коли програма очікує введення зі стандартного потоку, дані повинні надходити з клавіатури, а якщо програма виводить, то на екран.
Найчастіше в С++ використовується потокове введення даних, операції якого включені до складу класів istream чи iostream. Воно може здійснюватися з визначеним у цих класах вхідним потоком std::cin чи вхідним потоком, що визначен користувачем. Для читання символів з цього потоку вказується операція витягу з потоку, що позначається за допомогою символів “ >> “. Це перевантажена операція, визначена для всіх простих типів і покажчика на char.
Формат запису оператора cin має вид:
std::cin [ >> values ];
Наприклад, для введення значень змінним х і у можна написати:
std::cin >> x >> y;
Виведення даних може бути неформатованим і форматованим. Найчастіше для виведення застосовується визначена операція <<, що записується разом з ім'ям вихідного потоку std::cout. Таким чином, запис:
std::cout << x;
означає вивести значення перемінної x (чи записати в потік). Цей оператор вибирає необхідну функцію перетворення даних у потік байтів.
Формат запису cout відрізняється від форми запису команд С ++:
std::cout << data [ << data << "\n"];
де data ¾ це змінні, константи чи вирази, "\n" – керуючий символ переведеннякаретки. Запис std:: означає, що потоки cin і cout об’явлені в простір імен std. Для того щоб спростити форму запису, можна підключити простір імен у глобальну видимість застосувавши оператор using:
using namespace std;
Для додаткового керування вихідними даними використовуються маніпулятори: setw(n) і setprecision(k). Маніпулятор setw(n) служить для вказівки довжини поля, що приділяється для виведення наступних даних (тут n - кількість позицій у рядку), s etprecision(k) призначений для вказівки кількості позицій у дробовій частині дійсних чисел. Для використання цих маніпуляторів треба підключати заголовний файл <iomanip.h>.
Для форматованого введення даних використовується функція scanf з заголовного файлу < stdio.h >.Функція scanf має змінне число параметрів, але як фактичні параметри вона використовує адреси змінних, а не їхні значення. При цьому перед відповідним параметром ставиться знак & — символ взяття адреси змінної. Наприклад, &x означає "адреса змінної x ", а не значення, що ця змінна має в даний момент. Рядок форматів функції scanf указує, які дані очікуються на вході. Якщо функція зустрічає у форматному рядку знак %, за яким випливає знак перетворення, то вона буде пропускати на вході символи доти, поки не зустріне який – небудь непорожній символ. Таким чином функція scanf змінює значення змінних у зухвалій програмі.
Форма запису цієї функції має вигляд:
scanf (" рядок форматних кодів ", список імен змінних );.
Для форматованого виведення даних використовується функція з того ж заголовного файлу < stdio.h >. Для звертання до функції використовуються параметри, які розташовують у круглі дужки. Найчастіше функція printf використовується для виведення значень змінних. Першим аргументом у звертанні до функції ставиться рядок форматів (полягає в подвійних лапках), а наступними, якщо вони є, виведені об'єкти.
Рядок форматів може включати звичайні символи, що копіюються при виведення і специфікації перетворення, що починаються зі знака %: за специфікаціями випливає символ перетворення. Кожна специфікація перетворення відповідає одному з аргументів, що випливають за форматним рядком, і між ними установлюється взаємно однозначна відповідність, наприклад:
printf ("Значення а, b, с рівні: %d %d %d \n", a, b, c);
Тут буква d у специфікації перетворення вказує, що значення аргументу повинне бути надруковане як десяткове ціле число.
При виведення використовуються ті ж специфікації, що і при введенні:
% с - для виведення окремого символу;
% s - для печатки символьного рядка;
% x - для виведення шістнадцятирічної букви;
% 0 - для виведення восьмірічних чисел;
% f - для виведення чисел із крапкою, що плаває.
Використання математичних функцій у мові С++ потребує підключення заголовного файлу #include <math.h>
Таблиця 1.2
Математичні функції заголовочного файлу <math. h>
Прототип функції | Ім'я | Зміст |
double acos (double _x); | acos (x) | Арккосинус |
double asin (double _x); | asin (x) | Арксинус |
double atan (double _x); | atan (x) | Арктангенс |
double atan2 (double _y, double _x); | atan2 (y, x) | Арктангенс від y/x |
double ceil (double _x); | ceil (x) | Округлення в більшу сторону |
double cos (double _x); | cos (x) | Косинус x, в радіанах |
double cosh (double _x); | cosh (x) | Косинус, гіперболічний |
double exp (double _x); | exp (x) | eх, e у ступені x |
double fabs (double _x); | fabs (x) | Абсолютне значення |x| типу double |
double floor (double _x); | floor (x) | Вертає найближче ціле, не більше x |
double fmod (double _x, double_y); | fmod (x) | Залишок від ділення x на y |
double log (double _x); | log (x) | Натуральний логарифм |
double log10 (double _x); | log10 (x) | Десятковий логарифм |
double pow (double _x, double_y); | pow (x, y) | xу, x у ступені y |
double sin (double _x); | sin (x) | Синус x, в радіанах |
double sinh (double _x); | sinh (x) | Синус, гіперболічний |
double sqrt (double _x); | sqrt (x) | Корінь з x, x>0 |
double tan (double _x); | tan (x) | Тангенс x, x у радіанах |
double tanh (double _x); | tanh (x) | Тангенс, гіперболічний |
int abs (int _x); | abs (x) | Модуль x типу int |
double atof (const char*_s); | atof (s) | Перетворює рядок символів у число з плаваючою комою |
double hypot (double_x, double_y); | hypot (x, y) | Корінь із (x2+y2) |
long labs (long _x); | labs (x) | Абсолютна величина типу long |x| |
double pow10 (int _p) | pow10 (p) | Вертає 10р |
Приклад 1.1 Обчислити значення площі круга за значенням радіуса, який вводиться з клавіатури.
#include <iostream>
int main()
{
const double Pi = 3.1415;
float Rad; double Square;
std::cout<<"Input radius, radius =";
std::cin>>Rad;
Square = Pi*Rad*Rad; // Square = Pi*pow(Rad,2);
std::cout<<"Square = "<<Square<< std::endl;
std::cin.get();// затримка экрана
std::cin.get();
return 0;
}
Використання оператора умовного переходу
Оператор умовного переходу має наступний формат запису:
If (А) оператор 1;
Еlse оператор 2;
де А— вираз. Якщо значення цього виразу “істина” (не нуль), то виконується оператор1, якщо ж воно “неправда”, то виконується оператор2; у випадку, коли вираження помилкове та відсутня галузь else — виконується наступний оператор.
Оператори циклу
В мові С++ існують три оператори циклу: while, do, for.
Оператор циклу while (А) із передумовою ¾ будь-який простий, складений чи порожній оператор, тут А —будь – який припустимий вираз.
Виконується цей оператор таким чином: якщо результат виразу А не дорівнює нулю (“істина”), то виконується цикл, а якщо дорівнює нулю (“неправда“), то цикл не виконується і керування передається наступному за while оператору.
Оператор циклу for має наступну форму запису:
for ([вираз1;] [вираз2;] [вираз3]) оператор;
де вираз1 — вираз ініціалізації, що звичайно використовується для установки початкового значення; це вираз присвоювання (необов'язковий параметр); вираз2 — вираз умови, що визначає, при якій умові цикл буде повторюватися (необов'язковий параметр); вираз3 — вираз ітерації, що визначає крок зміни змінних, які керують циклом після кожного виконання (необов'язковий параметр).
Цей оператор реалізується таким чином:
— спочатку виконується вираз ініціалізації (ця нотація може бути виконана до оператора for);
— обчислюється умовне вираження;
— якщо результат умовного вираження “істина” (не дорівнює нулю), то виконується оператор циклу;
— обчислюється вираз ітерації;
— знову перевіряється умова;
— як тільки умовний вираз стає рівним нулю (“неправда”), керування передається оператору, що розташовується за оператором циклу for.
Оскільки перевірка умови виробляється перед циклом, то цикл може жодного разу не виконуватися, якщо умова відразу буде помилковою.
Оператор циклу do звичайно використовується в тих випадках, коли тіло циклу повинне виконуватися хоча б один раз, і має наступну структуру запису:
Do оператор
While (А);
де А ¾ умовний вираз.
Виконується оператор do таким чином: спочатку здійснюється вхід у тіло циклу і виконується оператор (він може бути простий чи складовий), після того перевіряється умова і, якщо вона виконується, тобто “істина” (не дорівнює нулю), то цикл повторюється, а якщо “неправда” ¾ здійснюється вихід з циклу.
Приклад 1.2
Просумувати всі парні числа від парного числа a до парного числа b (a < b).
#include <iostream>
int main()
{
int sum=0, a, b, i;
std::cout<<"Vvedi a, a=";
std::cin>>a;
std::cout<<"\nVvedi b, b=";
std::cin>>b;
for (i=a; i<b; i+=2)
sum +=i;
std::cout<<"Summa dorivnue Sum= "<<sum;
std::cout<<"\n";
std::cin.get();
std::cin.get();
return 0;
}
1.3 Контрольні запитання
1. Розкажіть про структуру простішої програми мовою С++.
2. Які типи даних вам відомі?
3. Чим відрізняються змінні від констант?
4. Яким чином можна ввести інформацію?
5. Яким чином можна вивести інформацію?
6. Які існують види умовного оператора та чим вони відрізняються?
7. Назвіть три види оператора циклу.
1.4 Варіанти індивідуальних завдань
Завдання 1. Для приведених нижче варіантів необхідно скласти програму обчислення значення функцій при різних значеннях аргументів.
Варіанти:
1.Обчислити висоти ha hb,hc трикутника АВС за формулою
де p=(a+b+c)/2.
Значення сторiн трикутника вибрати самостiйно.
2. Обчислити де х=1,45; y=-1,22; z=3,5.
3. Обчислити z=(sin x3 +cos2y); де х=1.2, у=-0.8.
4. Обчислити площу поверхні зрізаного конуса і його об’єм за формулами: ; Значення R,r,h вибрати самостiйно.
5. Обчислити де a =-0,5; b =1,7; t =0,44.
6. Обчислити де a=1,5; b=15,5; x=-2,9.
7. Обчислити ; де a =16,5; b =3,4; x =0,61.
8. Обчислити ; де x =1,82; y =18,5; z =-3,4 9. Обчислити R=x2(x+1)/b-sin2(x-a); де a =0,7; b =0,05; x=0,43.
10. Обчислити b=x(arctg z +e(x+3)); значення x,y,z вибрати самостiйно.
11. Обчислити де x =1,25; y =0,93.
12. Обчислити де x =0,25; y =1,31; a =3,5; b =0,9.
13. Обчислити R=x3(x+1)/b2 – sin2(x(x+a)); S = де a =0,7; b =0,05; x =0,5.
14. Обчислити y=sin3(x2+a)2 - z=x2/a+cos2(x+b)3; де a =1,1; b =0,004; x =0,2.
15. Обчислити де m =2; c =-1; x =1,2; b =0,7.
16. Обчислити де x =0,25; y =0,79; z =0,81.
17. Обчислити де а =3,2; b =17,5; x =-4,8.
18. Обчислити K=ln(a+x3)+sin2(x/b); M=e -cx. де a =10,2; b =9,3; x =2,4; c =0,5.
19. Обчислити
де a =0,3; b=0,9; x=0,53.
20. Обчислити a =0,5; b =2,9; x =0,3.
21. Обчислити де a =0,5; b =3,1; x =1,4.
22. Обчислити де a =0,5; b =2,9; x =0,3.
23. Обчислити де m =0,7; x =1,77; a =0,5; b =1,08.
24. Обчислити де m =2,1; t =1,02; c =-1.
25. Обчислити b=(1+tg2 (x/2))ln x; де x =1,23; y =0,79; z =0,9.
26. Обчислити де x =10,3; y =4,93; z =0,4.
27. Обчислити де x =1,2; y =0,9; z =3,5.
28. Обчислити де x =-5,3; y =2,8; z =0,39.
29. Обчислити де
c =0,5; b = -0,5; x =0,61; y =1,2.
30. Обчислити де x=0,92; y =5,3; a =0,25.
Завдання 2. Для приведених нижче варіантів необхідно скласти програму обчислення значення функцій при різних значеннях аргументів, заданих інтервалом зміни і величиною кроку.
Варіанти:
1.
2.
3. а=5; у=3;
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
x і a змінюються одночасно.
16.
а — має початкове значення 0.1 і змінюється одночасно з x з кроком . Підказка: використовується один цикл.
17. Обчислити функцію двох перемінних
18. Обчислити функцію:
При якому значенні х функція буде найменшою?
19. Підрахувати скількох разів функція приймає негативне значення, якщо .
20. Увести координати 10 крапок на площині і визначити, у якій із чвертей координатної площини згаходиться більше всього крапок.
21. Увести п'ять наборів сторін трикутника а, b, c і визначити для яких сторін висота буде найбільшою.
Підказка: де
22. Увести координати п'яти крапок і визначити, яка з них потрапить в окружність з радіусом R і координатами центра (а, b).
Підказка: рівняння окружності має вид:
23.
, x £ 5,
y =
x4 + 2x2 sin x, x > 5,
x Î [ -10; 10], hx =2
24. Підрахувати скількох разів функція приймає негативне значення, якщо .
25. Обчислити функцію у виді формули .
26.
x2 + y2, x2 + y2 £ 1,
y = x2 + y, x2 + y2 > 1 і y ³ x,
lg(x2 + y2), x2 + y2 > 1 і y < x,
x Î [ 0,1; 1,3], hx =0,2; y Î [ 0,1; 1,3], hy =0,3.
27.
1 + a x < 0,
y = 0, x = 0,
1 - a x > 0,
x Î [ -10; 10], hx = 2; a Î [ 2; 12], ha = 0,95
28.
lg(авс), а > 0, в > 0, с > 0,
y = 2авс, а< 0, в < 0, с < 0,
1, в інших випадках;
а Î [ -3; 3], hа = 0,5; в Î [ -4; 5], hв = 0,5; с Î [ -2; 4], hс = 0,5.
29.
x £ 3,5,
y =
x > 3,5,
x Î [ 2; 4,5], hx = 0,5; a = 1,42; d = 5,4; c = 3,15.
30.
x £ 0,
y =
, x > 0;
a = 1, b = 2, x Î [ -2; 2], hx = 0,5.
2 Розв’язання задач з використанням масивів
Мета роботи
Навчитися складати та реалізовувати у середовищі Visual C++ програми обробки масивів.
2.2 Методичні вказівки до організації самостійної роботи студентів
При роботі з масивами треба звернути увагу на введення та виведення даних. При програмуванні обов'язково треба використовувати покажчики. Покажчик — особливий тип даних, призначений для збереження адреси в пам'яті.
Робота з покажчиками значно прискорює виконання програми. Якщо до покажчика масиву mas, наприклад, додати значення 3, це призводить до отримання нового покажчика на четвертий (!) елемент масиву. При цьому перехід виконується у відповідності до типу масиву.
Тісний зв'язок з покажчиками має визначений у мові C++ тип даних – масив, або вектор. Масиви — це структурований тип даних, які представляють собою безупинні блоки пам'яті, що містять безліч елементів того самого типу. Ознакою масиву при описі є наявність парних дужок — “[ ]”. Елементи масива нумеруються з 0. Наприклад:
int mas1[21]; char mas2[67];
де оголошені вектор mas1, що містить 21 елемента типу int і вектор mas2, що містить 67 елементів типу char.
У C++ дозволені два способи доступу до елементів вектора: з використанням механізму покажчиків і класичний — за допомогою індексу.
Застосування механізму покажчиків засновано на використанні факту, що ім'я вектора є покажчиком – константою, що дорівнює адресі початку вектора - першого байта першого елемента вектора (mas1==&mas1[0]). У результаті цього, використовуючи операцію разіменування «*» можна забезпечити доступ до будь – якого елемента вектора. Так, еквівалентними будуть звертання до i-го елементу вектора з використанням індексу — mas1[i] і посилання *(mas1+i), оскільки (mas1+i)==& mas1[i].
Багатомірні масиви в С++ представляються у виді векторів покажчиків на вектори - багатомірні вектора.
Використання механізму покажчиків для доступу до деякого і,j,k-го елементу тривимірного вектора може бути таким:
b[і][j][k]= = *(b[і][j]+k)= =*(*(b[і]+j)+k)= =*(*(*(b+і)+j)+k).
У цих звертаннях використаний той факт, що, ім'я багатомірного вектора є покажчиком – константою на вектор покажчика - констант вектора рядка, перший елемент якого є теж покажчик- константа рядка. Елементи багатомірних векторів зберігаються в пам'яті в порядку зростання самого правого індексу – по рядках, тобто останній індекс змінюється швидше.
Приклад 2.1 Знайти у масиві mas найменший елемент та його індекс.
#include <iostream>
#include <conio.h>
int main()
{
const int n=5;
int mas[n];
std::cout<<"Vvedit "<<n<<" elemetiv massivu "<<std::endl;
int i;
for(i=0;i<n;i++)
{
std::cin>>mas[i];
}
int imin=0;
for(i=1;i<n;i++)
{
if (mas[imin]>mas[i])
imin=i;
}
std::cout<<"min="<<mas[imin]<<"\tindex="<<imin<<std::endl;
getch();//задержка экрана
return 0;
}
Приклад 2.2 Відсортувати масив mas дійсних чисел розміром 10 елементів за зменшенням.
#include <iostream>
#include <conio.h>
int main()
{
int i, j;
const int n = 10;
float mas [n], rab;
std::cout<<"Vvеdі 10 elem \n";
for (i=0; i<n; i++)
std::cin>>mas[i]; // cin>>*(mas+i);
std::cout<< " Isxodnik\n";
for(i=0; i<n; i++)
std::cout<<mas[i]<<" "; // cout<<*(mas+i)<<" ";
std::cout<<"\n"; // cout<<endl;
// Сортировка по убыванию
for (i=0; i<n-1; i++)
for (j=0;j<n-1-i;j++)
if(mas[j]<mas[j+1]) // if(*(mas+j) <*(mas+j+1))
{
rab= mas[j]; // rab=*(mas+j);
mas[j] =mas[j+1];// *(mas+j)=*(mas+j+1);
mas[j+1]=rab;
} // *(mas+j+1)=rab;
// Вывод результата
std::cout<< " Otsort massiv\n"<<"\n";
for (i=0; i<n; i++)
std::cout<< mas[i]<<" "; // cout<<*(mas+i)<<" ";
getch();//задержка экрана
return 0;
}
Приклад 2.3 В багатовимірному масиві matr розміром 5*6 знайти суму елементів кожного рядка. Отриманий масив відсортувати за зростанням.
#include <iostream>
#include <conio.h>
int main()
{
int i,j,sum,stk;
const int n =5, m=6;
int matr[n][m], mas[n];
std::cout<<"Input matr\n";
// Ввод матрицы
for(i=0; i<n; i++)
for(j=0; j<m; j++)
std::cin>> *(*(matr+i)+j);
// Определение суммы элементов строк
for(i=0; i<n; i++)
{
sum=0;
for(j=0; j<m; j++)
{
sum+=*(*(matr+i)+j);
}
*(mas+i)=sum;
}
std::cout<< "Result mas\n";
for(i=0; i<n; i++)
std::cout<< *(mas+i)<<" ";
// Сортировка вектора mas по возрастанию
for(i=0; i < n-1; i++)
for(j=0; j < n-1-i; j ++)
if (*(mas+j)> *(mas+j+1))
{
stk=*(mas+j);
*(mas+j)= *(mas+j+1);
*(mas+j+1)=stk;
}
// Вывод отсортированного массива
std::cout<< "\nResult otsortirov mas\n";
for(i=0; i<n; i++)
std::cout<< *(mas+i)<<" ";
getch();//задержка экрана
return 0;
}
Приклад 2.4 Створити динамічний масив з n елементів (значення n ввести с клавіатури). Знайти кількість від’ємних елементів масиву.
#include <iostream>
#include <conio.h>
int main()
{
int n,i;
int *mas;
std::cout<<"Vvedit kilkist' strok (n)\n";
std::cin>>n;
mas=new int[n];//створюємо динамічний масив
//Введення масиву
std::cout<<"Vvedit "<<n<<" elementiv massivu\n";
for(i=0;i<n;i++)
std::cin>>mas[i];
int kil(0);
//Підраховуємо кількість від’ємних елементів
for(i=0;i<n;i++)
if(mas[i]<0)
kil++;
std::cout<<"kil="<<kil<<"\n";
delete [] mas;//вивільнюємо пам’ять
getch();//задержка экрана
return 0;
}
Приклад 2.5 Створити динамічний масив з n строк та m стовпців (значення n та m ввести с клавіатури). Знайти суму парних елементів масиву.
#include <iostream>
#include <conio.h>
int main()
{
int n,m,i;
int **mas;
std::cout<<"Vveditе kilkist' strok (n) i stolbcov (m)"<<std::endl;
std::cin>>n>>m;
//створюємо динамічний масив
mas=new int*[n]; //створюємо масив покажчиків
for(i=0;i<n;i++)
mas[i]=new int[m]; //створюємо динамічні строки
std::cout<<"Vveditе "<<n<<"x"<<m <<" elementi massiva"<<std::endl;
//заповнюємо масив з клавіатури
for(i=0;i<n;i++)
for(int j=0;j<m;j++)
std::cin>>mas[i][j];
// Виведення на экран вихідного мисиву
for(i=0;i<n;i++,std::cout<<std::endl)
for(int j=0;j<m;j++)
std::cout<<mas[i][j]<<"\t";
int sum(0);
//Підраховуємо суму парних елементів
for(i=0;i<n;i++)
for(int j=0;j<m;j++)
if(mas[i][j]%2==0)
sum+=mas[i][j];
std::cout<<"sum=="<<sum<<std::endl;
// вивільнюємо пам’ять
for(i=0;i<n;i++)
delete[]mas[i];//вивільнюємо строки
delete []mas; //вивільнюємо масив покажчиків
getch();//задержка экрана
return 0;
}
2.3 Контрольні запитання а завдання
1. Як розуміти вираз *(c+i), де c — ім’я масиву?
2. Що таке розадресування у мові С++?
3. Які дії можна виконувати над покажчиками?
4. Напишіть програму сортування масиву по правилу зростання з використанням покажчиків.
5. Як задати змінний розмір масиву?
3.4 Варіанти індивідуальних завдань
1. Знайти найменші елементи у кожному рядку матриці та номер максимального з них.
2. Відсортувати по зростанню перший рядок та другий стовпець матриці.
3. Знайти найбільші елементи у кожному стовпці матриці та номер найменшого серед них.
4. Знайти суми кожного рядка матриці та найменшу серед них.
5. Серед елементів матриці, що знаходяться вище головної діагоналі, знайти добуток парних елементів.
6. Знайти суму додатніх непарних елементів матриці, що стоять нижче побічної діагоналі.
7. Визначити, скільки елементів матриці в рядках з парними номерами перевищують відношення максимального елемента до мінімального?
8. Відсортувати за зростанням добутки від’ємних елементів рядків матриці.
9. Відсортувати по зменшенню масив максимальних елементів стовпців матриці.
10. У матриці знайти суму парних елементів, що лежать вище головної діагоналі. Якщо вона ділиться на 3, обнулити побічну діагональ.
11.У матриці відсортувати за зростанням елементи головної діагоналі та поміняти місцями максимальний елемент з мінімальним.
12. Переставити рядки матриці відповідно до зростання елементів другого стовпця.
13. Знайти мінімальний елемент матриці, і якщо він парний та парна строка його розташування — відсортувати третій стовпець матриці.
14. Переставити стовпці матриці у відповідності до зростання елементів третього рядка.
15. У кожному рядку матриці знайти кількість елементів, що діляться на 3, та відсортувати ці значення з находженням екстремумів.
16. У матриці в рядках з від’ємним елементом на головній діагоналі знайти найбільший елемент рядка та мінімум серед них.
17. У матриці замінити нулями всі від’ємні елементи над головною діагоналлю. Знайти місце максимуму серед елементів нижче побічної діагоналі.
18. Переписати до масиву В всі елементи матриці А, більші значення x. Якщо в черговому рядку таких немає, записувати до В значення 0.
19. Переписати до масиву С всі значення матриці D, менші заданого у та знайти добуток цих елементів і розташувати їх за зростанням.
20. У вигляді матриці задано таблицю футбольного чемпіонату. Визначити, у скількох команд кількість виграшів перевищує кількість поразок.
21. Написати програму сортування команд за зменшенням кількості перемог, використовуючи таблицю футбольного чемпіонату.
22. Знайти максимальний елемент матриці, і якщо його номер стовпця непарний, то відсортувати цей стовпець.
23. Вихідну матрицю відсортувати за зростанням кількісті додатних елементів у стовпцях.
24. Серед елементів матриці нижче побічної діагоналі відібрати ті, що перевищують максимум у другому стовпці матриці.
25. У квадратній матриці провести сортування тих рядків, у яких на побічній діагоналі стоїть парне число.
26. У стовпцях матриці знайти максимуми та відсортувати стовпці за зменшенням.
27. Переставити стовпці матриці відповідно до зростання елементів другого рядка.
28. Знайти добутки діагоналей квадратної матриці. Відсортувати перший рядок за зростанням.
29. Задано дві матриці розміром 3*3. Перемножити їх за правилом "рядок на стовпець".
30. Знайти скалярні добутки першого рядка матриці на всі інші.
Робота з рядками
Мета роботи
Отримати практичні навички програмування на С++ задач, де використовується символьна інформація.
3.2 Методичні вказівки до організації самостійної роботи студентів
У мові С++ є кілька можливостей роботи з символьними даними. Класична робота зводиться до використання масива символів. Для того, щоб скористуватися стандартними функціями С++ для роботи з рядками, треба їх файли підключити в директиві #include <string.h>. Основні функції з цього пакету наведено нижче.
— char*strcat (char*_dest, const char*_src); — функція реалізує сціплення рядка dest з рядком src. Функція вертає покажчик на початок отриманого рядка (dest). Проміжний символ‘\0’ рядка dest гаситься.
— char*strncat (char*_dest, const char*_src, size_t_maxlen); — функція приєднує maxlen символів з рядка, на який вказує src, до рядка, на який вказує dest. Рядок dest повинен містити не менше maxlen вільних байтів. Якщо maxlen більше рядка src, виконується проста конкатенація.
— char*strchr (const char*_, int_c); — функція вертає покажчик на позицію першого входження символу “c” в рядок, на який вказує s. В рядок s включається і символ ‘\0’.
— int strcmp (const char*_s1, const char*_s2); — функція виконує порівняння двох рядків, на початок яких вказують s1 і s2. Функція вертає значення: менш нуля, якщо s1<s2; рівне нулю, якщо s1==s2; більше нуля, якщо s1>s2.
— int strnсmp (const char*_s1, const char*_s2, size_t_maxlen); — функція, що аналогічна функції strcmp () і відрізняється тим, що виконується порівняння перших maxlen байтів.
— int stricmp (const char *_s1, const char *_s2); — функція виконує порівняння двох рядків, на що вказують s1 і s2. Перед порівнянням символи перетворюються в малі. Функція вертає значення: більше нуля, якщо s1>s2; рівно нулю, якщо s1==s2; менш нуля, якщо s1<s2.
— int strlen (const char*_s); — функція вертає довжину рядка в байтах, на який вказує s. Нуль-терминатор не враховується.
— char*stpcpy (char *_dest, const char *_src); — функція копіює рядок, на котрий вказує src, в інше місце в пам'яті, на що вказує est. Функція вертає покажчик на кінець рядка, що скопіювався в dest.
— char*strncpy (char*_dest, const char*_src, size_t_maxlen); — функція копіює maxlen байт з рядка, на який вказує src, в інше місце в пам'яті, на що вказує dest. Нуль-термінатор теж копіюється. Якщо maxlen менш довжини рядка src, до рядка src не приєднується символ“\0”. І якщо більше, то рядок src переноситься повністю, а символи, що залишалися, заповнюються символом “\0”. Функція вертає покажчик dest.
— char *strlwr (char *_s); — функція перетворює всі символи рядка, на початок якого вказує s, в малі літери. Функція повертає покажчик на початок цього рядка.
— char *strups (char *_s); — функція перетворює всі символи рядка, на початок якої вказує s, в великі літери. Функція вертає покажчик на отриманий рядок.
— char *strset (char *_s, int_ch); — функція заповнює рядок, на початок якого вказує s, символом ch. Функція вертає покажчик на отриманий рядок.
— char *strtok (char *_s1, char *_s2); — функція вертає наступну лексему із s1, яка відділена любим символом з набора s2.
Приклад 3.1
Підрахувати кількість слів у рядку, враховуючи те, що пробілів, а також інших розділових знаків між словами може бути скількі завгодно.
1-ий варіант вирішення поставленої задачі
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
char s[]=" Repetitio est, mater studiorum!";
int i=0, col=0;
char spes[]=";!,.?\t";
int strLen = strlen(s);
while (i<strLen)
{
if (!strchr(spes, s[i]))
{
col++;
while (!strchr(spes, s[i]) && i<strLen)
i++;
}
else
{
while (strchr(spes, s[i]) && i<strLen)
i++;
}
}
std::cout<<"\nKilkist sliv="<<col<<'\n';
getch();//задержка экрана
return 0;
}
2-ий варіант вирішення поставленої задачі з використанням функції strtok
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
int col=0;
char str[] = "Repetitio est mater studiorum. Help.";
char seps[] = ";,\t\n";//знаки препинания
std::cout<<str<<std::endl;
char *token = strtok(str, seps);//поиск первого слова
while(token!= NULL)
{
col++;
token = strtok(NULL, seps);//поиск следующего слова
}
std::cout<<"\nKilkist sliv="<<col<<std::endl;
getch();//задержка экрана
return 0;
}
Приклад 3.2
Знайти в тексті всі слова, що починаються та закінчуються буквою a, та скопіювати їх в нову рядок через пробіл. Під новий рядок необхідно виділити рівно стільки пам’яті, скільки необхідно для запису знайдений слів.
Розв’язок. Поставлено задачу вирішимо у два етапи: спочатку підрахуємо кількість необхідної пам’яті, а за тим запишемо у новий рядок необхідні слова.
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
char str[] = "test word 1: asdda. Test word 2: asdfg, word 3: Awea";
char strCopy[sizeof(str)];
strcpy(strCopy,str);//створюємо копію рядка
char seps[] = ":?!;,.\t\n";//знаки препинания
std::cout<<str<<std::endl;
char *token = strtok(str, seps);//пошук першого слова
int lenResult=0;
int countWord=0; //кількість слів
//Підрахуємо кількість необхідної пам'яты для рядка-результата
while(token!= NULL)
{
int last = strlen(token)-1;
if (
(token[0] == 'a' || token[0] == 'A')
&& (token[last] == 'a' || token[last] == 'A')
)
{
lenResult+= strlen(token)+1;
++countWord;
}
token = strtok(NULL, seps);//пошук наступного слова
}
char* resString = new char [lenResult];
resString[0]='\0'; //створюєму пустий рядок
strcpy(str,strCopy);//відновлюємо рядок
token = strtok(str, seps);//пошук першого слова
int curentNumberWord=0;
while(token!= NULL)
{
int last = strlen(token)-1;
if (
(token[0] == 'a' || token[0] == 'A')
&& (token[last] == 'a' || token[last] == 'A')
)
{
strcat(resString,token);
++curentNumberWord;
if (countWord!=curentNumberWord)//Якщо не останнє слово
{
strcat(resString," ");
}
}
token = strtok(NULL, seps);//пошук наступного слова
}
std::cout<<"\nResult:\n"<<resString<<std::endl;
delete[]resString;
getch();//задержка экрана
return 0;
}
3.3 Контрольні запитання та завдання
1. Що таке рядок символів у мові С++?
2. Розібратися з технікою вводу-виводу рядка у Visual C++.
3. Коли можна не описувати довжину рядка?
4. Познайомитися з функціями роботи з рядками у С++.
3 .4 Варіанти індивідуальних завдань
1. У тексті слово "країна " замінити словом "Україна".
2. Скільки разів у заданому реченні зустрічаються слова "КСМ" та "СКС"?
3. Виписати із тексту слова, що починаються та закінчуються цифрою.
4. Знайти у тексті найдовше слово, що складається з цифр.
5. У тексті слово "моє" замінити словом "наше".
6. У тексті виділити всі слова, що починаються літерою "к".
7. Видалити із тексту слова, що закінчуються на "ь".
8. Виділити частину тексту між словами, що вводяться з клавіатури.
9. Чи є в тексті слова, що починаються та закінчуються однією і тією ж літерою?
10. У якому слові тексту менше усього голосних звуків?
11. Видалити з тексту усі слова, що починаються з літер, які задаються в рядку запиту.
12. Сформувати масив, елементи якого налічують кількость голосних літер у словах речення.
13. Надрукувати слова, які складаються з перших та останніх літер (але не цифр) усіх слів тексту.
14. Введене речення обробити так, щоб його послідовність слів надрукувати у зворотньому порядку.
15. Надрукувати слово тексту з найбільшою кількістю приголосних звуків.
16. Ввести два речення. Якщо у них є однакові слова, то замінити їх у другому реченні на відповідну кількість символів "*".
17. Підрахувати у тексті кількість слів, в яких немає цифр.
18. Вибрати з тексту найдовше слово.
19. Сформувати масив, елементи якого налічують кількість літер у словах речення.
20. Провести кодування та розкодування тексту, вибравши самостійно спосіб кодування.
21. Ввести список українських футбольних команд європейського рівня і у ньому “Металіст” поміняти їх місцями з “Динамо”.
22. Виділити з тексту слова, які мають однакову кількість літер.
23. Виділити з тексту слова, у яких кількість голосних звуків парна.
24. Видалити з тексту програми оператори, що знаходяться всередині дужок.
25. Видалити з тексту усі зайві (більше одного) пропуски.
26. Чи є в тексті слова, що починаються та закінчуються літерою заданою в рядку запиту?
27. Надрукувати усі слова тексту, кількість літер в яких дорівнює даному числу.
28. Якщо у реченні зустрічаються підряд декілька однакових символів, то залишити тільки по одному символу.
29. Знайти в тексті слова, що починаються та закінчуються заданими літерами.
30. У введеному списку з 10 прізвищ визначити найкоротше прізвище.
4 Робота зі структурами
Мета роботи
Отримати практичні навички програмування на С++ задач, де використовується інформація у вигляді структури.
4.2 Методичні вказівки до організації самостійної роботи студентів
Структура – це упорядкована сукупність довільних типів даних, що об'єднані в одній області пам'яті. Тип структури вводиться описом наступного вигляду:
struct [ім’я_структури] {тип_1 ім’я_поля_1;
тип_2 ім’я_поля_2;...;
тип_n ім’я_поля_n;};
де ім’я_структури — ім'я структури шаблону, що задовольняє правилам завдання ідентифікаторів мови C++; тип_1, тип_2,..., тип_n — будь – які призначені типи,; ім’я_поля_1,..., ім’я_поля_n - ідентифікатори полів, що задовольняють правилам завдання ідентифікаторів.
Опис структури являє собою завдання нового типу «ім’я_структури» і не призводить до виділення пам'яті, а лише дає інформацію компілятору про типи і кількість полів. Ця інформація використовується компілятором при описі структурованих змінних для резервування необхідного місця в пам'яті і організації доступу до необхідних полів структурної