Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_lektsy_Pascal_C.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Елементи мови

  1. Алфавіт.

  2. Числа.

  3. Рядки.

  4. Константи.

  5. Ідентифікатори.

  6. Змінні.

Алфавіт

Алфавіт - це сукупність знаків, що використовуються для побудови конструкцій мови.

Алфавіт мови С++ складають:

  • латинські букви великі і маленькі (A..Z, a..z);

  • цифри (0..9);

  • спеціальні символи (= # + - . , : ; ‘ @ $ * ( ) [ ] { } / % < > пропуск);

  • службові слова (switch if for do . . .).

Великі і малі літери розрізняються.

Числа

Для зображення чисел по умовчанню використовується десяткове подання.

Числа можуть бути цілими і дійсними.

Цілі числа можуть мати знак. Знак плюс може опускатись. Наприклад: 234, -34.

Можна використовувати цілі числа в 8-річному і 16-річному форматі.

В разі 8-річного представлення, значення повинно починатись з символу 0(ноль) за яким слідують цифри 0 . . 7. Наприклад: 045, 0153. Максимальне значення 037 777 777 777.

В разі 16-річного представлення, значення повинно починатись з символів 0х|0Х(ноль Х) за яким слідують 16-річні цифри (0 . . 7, a . . f) без врахування регістру. Наприклад: 0х567, 0х6F41, 0Х216. Максимальне значення 0хff fff fff.

Дійсні числа можуть бути представлені в звичайній формі (23.4, -34.8123, 0.0034) або в експоненціальній формі:

Математичне представлення числа в експоненціальній формі:

7230 = 7.23103 , 0.00067 = 6.710-4.

Відповідний запис на мові С++: 7.23Е3 6.7Е-4

Не можна дійсне число починати з крапки ( .789), потрібно записувати 0.789.

Рядки

Рядок - це послідовність довільних символів, обмежених подвійними лапками. Наприклад:

”Розум поперед справи” , ”Золоті руки у того, хто навчався добре”

Рядок закінчується символом нуля ”\0”. Пустий рядок містить тільки код нуля ”\0”.

Перенесення довгого рядка можна здійснити за допомогою символу ”\”.

Константи

  1. Явні константи (літерали).

  2. Іменовані константи

Константи – це величини, які не змінюються.

Не іменовані константи (літерали)

Константи можуть використовуватись в тексті програми, в виразах і операторах.

Константи можуть бути:

  • числовими (цілі, дійсні) (45, -62.789б, 0х57),

  • рядковими (”Очі - дзеркало душі”),

  • символьними ( ‘а’, ‘6’, ‘%’),

Іменовані константи

Іменована константа - це константа, якій присвоєно імя.

Формат обяви:

const <тип> <имя константи> = <значення> ;

Наприклад, const float PI = 3.14; const int max= 345; const char a=’y’;

Для цілих констант тип можна не вказувати, наприклад, const max= 345;

Для рядкової константи використовується указник:

char *const =”добрий день!”;

Ідентифікатори

Ідентифікатор - це будь-яка послідовність латинських букв, цифр і символу підкреслювання ( _ ), яка починається з букви або символу підкреслювання. Довжина ідентифікатору не обмежується, але оболонка може накладати свої обмеження. Як правило, використовується довжина не більше 255 символів.

Велику і малі літери розрізняються, тобто b1 і B1 є різними ідентифікаторами.

Ідентифікатори використовуються для формування імен різних елементів програми.

В якості ідентифікатора не можна використовувати службові слова.

Змінні

Змінні - це величини, які можуть змінюватись. Змінна - це область в памяті компютера, де може зберігатись деяке значення для використання. Кожній змінній призначається ім’я, яке формується за правилом ідентифікатора з врахуванням того, що літери в різних регістрах розрізняються. Доцільно змінним давати такі імена, які відображають суть тих величин, які в них зберігаються. Якщо імена складаються з кількох слів їх можна розділяти символом підкреслювання або кожне слово починати з великої букви. Наприклад middl_temperatura (або MiddlTemperatura).

Формат обяви змінних:

<клас памяті> <тип> <список змінних> ;

<клас памяті> - визначається одним з чотирьох ключових слів мови С++: auto, extern, register, static, і указує, яким чином розподілятиметься пам'ять під оголошувану змінну, з одного боку, а з іншого, область видимості цієї змінної, тобто, з яких частин програми можна до неї звернутися.

Наприклад, іnt x1, x2;

Одночасноно з обявою змінних може бути їх ініціалізація, тобто присвоювання їм початкового значення. Наприклад:

іnt х1 = 5, х=2*2;

Операції

  1. Арифметичні операції

  2. Логічні операції

  3. Операції відношень

  4. Операції присвоювання

  5. Спеціальні операції

  6. Пріоритети операцій

Арифметичні операції

Застосовуються до дійсних і цілих чисел і указників. Можуть бути унарними і бінарними.

Бінарні операції мають два операнди :

+ складання

- віднімання

* множення

/ ділення

% залишок цілочисельного ділення

В операціях множення і ділення (* /) операнди можуть бути будь-яких арифметичних типів. Якщо обидва операнди цілі, то і результат буде цілим, тобто виконується цілочисельне ділення: десяткова частина просто відкидається і округлення не проводиться.. Якщо хоч один з операндів дійсний, то і результат дійсний.. Наприклад

7/4 = 1 17/5 = 3

14/3=4 14.0/3=4.6 14/3.0=4.6 14.0/3.0=4.6

В операції узяття залишку ( %) - обидва операнди повинні бути цілими.

Унарні операції мають один операнд:

+ - знаки чисел

++ інкремент (збільшення на 1)

-- декремент (зменшення на 1)

Операції ++ і -- виконуються швидше, ніж звичайне складання або віднімання (і = і+1).

Ці операції мають по 2 форми: префіксна форма і постфіксна форма запису.

Префіксна форма запису ++a

Постфіксна форма запису a++

В першому випадку змінна спочатку збільшується (або зменшується) на 1, а потім використовується у вирахуванні виразу.

В другому випадку – у виразі використовується поточне значення змінної, а потім воно збільшується (або зменшується) на 1.

Операція застосовується тільки для змінних, для виразу не допускається. Тому запис

+ +( a+1) є помилковим.

Приклади.

1) Визначити значення змінних a,b після виконання операцій

а =1;

b = 5 + а++;

Після виконання а=2, b=6

2) Визначити значення змінних a,b після виконання операцій

a=1;

b = 5 + (++а);

Після виконання в=7, а=2

Логичні операції

Операндами логічних операцій є логічні значення. Результатом логічної операції є логічне значення правда чи неправда. В Borland С++ правда має значення 1, а неправда - 0. Перелік операцій приведено в таблиці.

Позначення операції

Операція

!

Логічне „не”

&&

Логічне „і”

||

Логічне „або”

Операції відношень

Результатом операції відношення є логічне значення правда чи неправда.

Перелік операцій приведено в таблиці.

Позначення операції

Операція

==

Перевірка на рівність

!=

Перевірка на не рівність

>

Більше

<

Менше

>=

Не менше

<=

Не більше

Операції присвоєння

С++ має кілька операцій присвоювання, які дозволяють скорочувати запис виразів, що присвоюються. Наприклад, оператор с=с+3; може бути скорочений завдяки використанню складеної операції додавання += : с +=3; Такі операції виконуються швидше.

Формат складених операцій присвоєння:

<змінна> <операція>= <вираз>;

Перелік складених операцій присвоєння приведено в таблиці:

Позначення операції

Операція

+=

Присвоєння з додаванням

-=

Присвоєння з відніманням

*=

Присвоєння з множенням

/=

Присвоєння з діленням

%=

Присвоєння залишку цілочисельного ділення

<=

Присвоєння з зсувом вліво

>=

Присвоєння з зсувом вправо

&=

Присвоєння з порозрядною операцією „AND”

^=

Присвоєння з порозрядною операцією „XOR”

|=

Присвоєння з порозрядною операцією „OR”

Складені операції присвоєння присвоюють першому операнду результат примінення відповідної простої операції, що вказана перед символом „=”, до першого і другого операндів. Операція присвоєння повертає як результат присвоєне значення. Завдяки цьому вони допускають сцеплення. Наприклад, можна записати:

А = (В = 1) + 2;

Спочатку визначається значення в дужках. Тобто змінній В присвоюється значення 1. Ця операція поверне значення 1, до цього результату додається 2, отримане значення присвоюється змінній А, значить А=3.

С++ допускає запис в одному реченні кілька операцій присвоювання

А=В=С=Ø;

Спеціальні операції

  1. Операція умови

  2. Операція визначення розміру операнду

  3. Операція слідування

Операція умови

Це єдина операція, яка має три операнди.

Формат запису операції:

<умова> ? <вираз_1> : <вираз_2>;

Якщо значення <умова> є правда, то операція повертає в якості результату значення <вираз_1>, інакше - <вираз_2>.

Наприклад,

a=1; b=3;

C=a>b ? a+b : 0;

Якщо a>b, то С буде дорівнювати сумі a+b, в іншому випадку С буде дорівнювати 0(нулю). В нашому прикладі С=0.

Операція визначення розміру операнду

Операція sizeof визначає в байтах розмір свого операнду, яким може бути змінна або тип.

Операція має дві форми. Формат запису операції:

Sizeof <вираз>

Sizeof (<імя типу>)

Наприклад, С= sizeof (int); Результат - С=2

double a; С= sizeof а; Результат - С=8

Операція слідування

Операція (,), що называється операцією слідування, обєднує два довільних вирази, які обчислюються зліва направо. Спочатку обчислюється значення лівого операнду. Тип його результату визначається як void. Потім обчислюється значення правого операнду. Значення і тип результату операції слідування вважається рівним значенню і типу правого операнду. Наприклад,

С= (а=4, в=а+5)+7;

Результат в дужках дорівнює 9, в=9, С=16,

Приоритети операцій

! - + ++ -- sizeof

* / %

+ -

< <= > >=

= = !=

&&

||

?:

= *= /= %= += -=

,

Питання для самоперевірки

  1. Записати на мові C++ вираз, що є істиною ,якщо всі числа x,y,z - додатні

  2. Які значення будуть мати змінні a, b після виконання операції

a= (b=5) +7;

  1. Визначити значення змінної a :

a=2;

a+=6;

  1. Визначити значення змінних a, b після виконання операцій:

а=3;

b=2*(a++)+7;

  1. Визначити значення змінних a, b після виконання операцій:

a=2;

b=5+2*(--a)+3;

  1. Визначити значення a

a=15/2;

  1. Визначити значення b

b=7 % 3;

  1. Визначити значення b

b=25.0/2;

  1. Який символ ставиться в кінці кожного оператора і опису?

  2. За правилами С++ записати вираз, значення якого є правда, якщо a=b і неправда в протилежному випадку.

  3. За правилами С++ записати вираз, значення якого є правда, якщо a#b і a позитивне, і неправда в протилежному випадку.

  4. Визначити значення змінної а

a=7;

a++;

  1. За правилами С++ записати вираз, значення якого є правда, якщо a лежить в проміжку [-2, 5]і неправда в протилежному випадку.

  2. Визначити значення змінних a, b після виконання операцій

a=3;

b=(a>7) ? 10 : 12;

  1. Визначити значення змінних a, b після виконання операцій

b=(a=2, a+=2)+3;

  1. Визначити значення змінної a після виконання операції

a=sizeof char;

  1. Визначити значення змінної a після виконання операції

a=2;

a+=7;

  1. Визначити значення змінних a, b після виконання операцій

a=3;

b=2*a++ ;

a*=2;

  1. Записати вираз значення якого буде правда якщо значення змінної а лежить в проміжку (5, 15)

  2. Записати вираз значення якого буде правда якщо значення змінної а не лежить в проміжку (-8,25)

  3. Яке значення буде мати змінна с після виконання операторів

a=1; b=3;

C=a>b ? a+b : 0;

  1. Визначити значення змінної а після виконання операторів

a=15;

a%=2;

  1. Визначити значення змінної а після виконання операторів

a=5;

a/=2;

  1. Записати вираз, що є правда якщо а не дорівнює b і неправда в протилежному випадку.

  2. Визначити значення змінних a,b після виконання операторів

a=7;

b=(a+=2, --a)+12;

Типи даних

  1. Класифікація типів. Модифікатори

  2. Оголошення типів

  3. Приведення типів

Класифікація типів

Типи даних можна класифікувати двома різними способами.

Перший спосіб:

Всі типи даних можна розділити на 4 групи:

  1. «порожній тип » - void

  2. скалярний тип – арифметичні типи (int float doble char), перелічення, указники, посілання

  3. тип «функція»

  4. агреговані типи: масиви, структури, обєднання, класи.

Другий спосіб:

Інший спосіб класифікації типів, це розбиття їх на основні і похідні

До основних типів відносяться void char int float doube і їх варіанти з модифікаторами shozt (короткий), lonq(довгий) siqned (із знаком ), uusiqned(без знака) Модифікатор siqned мається на увазі за умовчанням і тому не указується. Таким чином, можливі наступні описи:

Імя типа

Назва типа

i nt

ціле

short int

коротке ціле

lonq int

довге ціле

unsigned short int

коротке ціле без знака

unsigned int

ціле без знака

unsigned lonq int

довге ціле без знака

float

з плаваючою крапкою

double

з плаваючою крапкою подвійної точності

long double

довге дійсне

char

ціле

unsigned char

ціле без знака (0 .. 256)

Дані типу char займають в пам'яті 1байт. Тип char є типом ціле. Може бути із знаком і без. В компіляторі встановлена опція „значення без знака ”.

Значення типу char є символом, укладеним в одинарні лапки. Може використовуватися група символьних констант при виведенні:

Символ

Призначення

\а

звуковий сигнал при виведенні

\n

перехід на новий рядок

\t

табуляція

\\

символ «\»

\'

символ одинарної кавички

\''

символ подвійної кавички

Розмір пам'яті, що відводиться для зберігання змінних стандартного типу, (а отже і діапазон їх значень) залежить від компілятора і ОС.

До похідних типів відносяться масиви, структури, об'єднання, класи, типи функцій, указники, посилання.

Оголошення типів

Можна створювати свої типи . Формат обявлення типа:

typedef <визначення типа> < імя типа> ;

Наприклад, typedef double MyType;

Приведення типів

В арифметичних виразах, які містять лементи різних арифметичних типів, система в процесі обчислень автоматично виконує перетворення типів, яке здійснюється по принципу: якщо операція має операнди різних типів, то тип операнда „молодшого” типу приводиться до типу операнда „старшого” типу. В операції присвоювання приведення приводиться до типу лівого операнда.

Можна вказувати явне приведення типів за допомогою операції явного приведення типів:

(<тип>)

Наприклад, int m=1,n=2;

double A=(double)m/n;

Елементарний ввід-вивід

  1. Введення-виведення в стилі С

  2. Введення-виведення в стилі С++

  3. Розробка програм реалізації лінійних алгоритмів

Ввід-вивід в стилі С

Обов'язкове підключення заголовного файла відповідної бібліотеки введення-виведення

#include <stdio.h>

Вивід в стилі С

Використовується спеціальна функція printf()

Формат функції:

printf (<формат виводу> <список виводу>);

<Формат виводу> - рядкове значення, яке може містити пояснюючий текст і формат для кожного значення що виводиться. Послідовність форматів і змінних виведення повинна співпадати по типу.

<список виводу> - змінні або вирази. Елементи списку розділяються комами.

Опис формату

%[ширина][.точність]<тип>

<тип> може бути:

Формат

Опис

с

символ

d, i

десяткове ціле із знаком

u

десяткове ціле без знака

f

дійсне

s

рядок

Наприклад,

printf (“Добрий день!”);

printf (“при Х=%f, Y=%f”, X,Y);

Ввід в стилі С

Використовується функція scanf()

Вводить символи, перетворює їх згідно формату і записує в змінну.

Формат опису:

printf (<формат вводу> <список вводу>);

<список вводу> - указуються адреси змінних, тому попереду змінної пишеться символ &, що означає операцію узяття адреси. Елементами списку можуть бути тільки змінними.

Наприклад,

scanf (“%d %d”,&x,&y);

Ввід-вивід в стилі С++

Обов'язкове підключення заголовного файла відповідної бібліотеки введення-виведення.

#include <iostream.h>

Вивід в стилі С++

Для виведення використовується стандартний потік виведення cout і операція << - помістити в стандартний потік виведення. Операція використовується для кожного елемента виведення. Наприклад

cout << “Здрастуйте,”<<name;

cout <<”Послухайте дзвінок \а\n”;

Для форматування даних використовуються символьні константи або маніпулятори потоку, приведені в таблиці.. При використовуванні маніпуляторів необхідне підключення бібліотеки

#include <iomanip.h>

Манипулятор

Призначення

endl

Перехід на новий рядок і викид буфера виводу

hex

Установка 16-річного формату виводу числових значень

cout<<hex<<n;

oct

Установка 8-річного формату виводу числових значень

cout<<oct<<n;

dec

Установка 10-річного формату виводу числових значень

cout<<dec<<n;

setprecision (<n >)

n - точність числа

Установка кількості знаків дробової частини дійсного числа

cout<< setprecision(5)<<value;

Діє до нової установки. Точність по умовчанню - 6, встановлюється при n=0.

setw(<n>)

n - ширина поля

Установка ширини поля для вводу чи виводу

cout<< setw(10)<<value;

Ввід в стилі С++

Для введення використовується стандартний потік введення cin і операція >> - помістити в стандартний потік введення. Операція використовується для кожного елемента введення. Наприклад,

cin>>a;

Питання для самоперевірки

  1. Написати оператор виводу для виведення сповіщення "Це програма!"

  2. Написати оператор вводу для введення одного цілого значення.

  3. Прочитати 3 цілих числа з клавіатури і занести їх значення в змінні X, Y, Z.

  4. Що буде виведено після виконання операторів

a=7;

b=2;

coun<<"a+b"<<endl;

  1. Описати цілу змінну з ініціюванням.

  2. Написати оператор виводу для виведення дійсного значення Х з точністю 4 знаки після коми в полі з 10 позицій.

  3. Записати оператор виводу який виводить результат обчислення функції Y=sin X при заданному значенні Х. Точність аргументу повинна бути не менше двох знаків після коми, а результату - чотири.

  4. Описати дві дійсні змінні з ініціюванням.

  5. Описати символьну змінну з ініціюванням.

  6. Що буде надруковано програмою:

int a,b; char c;

cdin>>a>>b>>a>>c;

cout<<a<<b<<a<<c;

якщо введено рядок значень 1 3 5 7

  1. Що буде виведено пiсля виконання операторiв

c=5; cout<<c<<++c<<c<<endl;

  1. Що буде виведено пiсля виконання операторiв

c=5; cout<<c<<c--<<c<<endl;

Розробка програми реалізації лінійних алгоритмів

Приклад . Розробити програму знаходження площини довільного прямокутного трикутника з заданими катетами.

Вивчивши завдання, визначаємо, що для одержання результату необхідно знати катети трикутника. Тому вхідними даними будуть значення катетів трикутника. Вихідні дані – значення площини. Для одержання значення площини використовуємо відому з математики формулу визначення площини прямокутного трикутника: , де a,b - катети прямокутника.

Алгоритм рішення задачі і текст програми:

#include <iostream.h>

void main ()

{

float a,b,S;

cout<<”Введіть катети ”;

cin>>a>>b;

S=1/2*a*b;

Cout<<”S=”<<S<<endl;

}

Керування порядком обчислень

1) Визначення і призначення операторів

2) Складений оператор

3) Оператор присвоєння

4) Оператори реалізації розгалужень

5) Оператори реалізації повторів

Визначення і призначення операторів

Оператор - це речення, яке визначає деяку дію. Оператори можуть розміщуватись в одній або декількох рядках. В кінці оператора ставиться символ „;”..

Складений оператор

Складений оператор являє собою кілька операторів і обяв, які обмежуються фігурними дужками:

{ [oбявли]

:

оператор; [оператор];

:

}

Оператор присвоєння

Формат оператора

<ім‘я змінної>=<вираз>;

Тип змінної і тип виразу повинні бути однаковими або сумісними.

Питання для самоперевірки

  1. Записати оператор присвоєння суми змінних a,b змінній z зі збільшенням значення а на 1 після обчислення.

  2. Записати оператор присвоєння суми змінних a,b змінній z зі зменшенням значення а на 1 до обчислення.

  3. Чому буде дорiвнювати значення змiнних ALFA i k пiсля виконання операторiв:

ALFA=5; k=2; ALFA =k--;

  1. Чому буде дорiвнювати значення змiнних ALFA i k пiсля виконання операторiв:

ALFA=5; k=2; ALFA +=++k;

  1. Привласнити змінній Т значення, протилежне тому, що там знаходиться.

  2. Записати оператор присвоювання, який привласнює змінній Т значення середнього арифметичного чисел X, Y, Z і збільшує значення z після обчислення.

Оператори реалізації розгалужень

  1. Умовний оператор if

  2. Оператор вибору switch

  3. Оператор break

  4. Розробка програм реалізації розгалужених алгоритмів

Умовний оператор

Формат оператора:

if (<вираз>) <оператор-1>;

[else <оператор-2>;]

Виконання оператора if починається з обчислення виразу.

Далі виконання здійснюється по наступній схемі:

- якщо вираз істинний (тобто значення відмінно від 0), то виконується <оператор-1>.

- якщо вираз помилковий (тобто значення рівно 0), то виконується <оператор-2>.

- якщо вираз помилковий і відсутній <оператор-2>, то виконується наступний за if оператор.

Допускається використовування вкладених операторів if. Щоб зробити програму більш читабельною, рекомендується групувати оператори і конструкції у вкладених операторах if, використовуючи фігурні дужки. Якщо ж фігурні дужки опущені, то компілятор зв'язує кожне ключове слово else з найбільш близьким if, для якого немає else.

Оператор вибору

Оператор switch призначений для організації вибору з безлічі різних варіантів. Формат оператора наступний:

switch ( <вираз> )

{ [<оголошення>]

:

case <константний-вираз 1>: [ <список-операторів 1>][break;]

case <константний-вираз 2>: [ <список-операторів 2>][break;]

:

[ default: <список операторів> ]

}

Вираз, що стоїть за ключовим словом switch в круглих дужках, може бути будь-яким виразом, значення якого повинне бути цілим.

Список операторів може бути порожнім, або містити один або більш операторів. Причому не вимагається укладати послідовність операторів у фігурні дужки.

В операторі switch можна використовувати свої локальні змінні, оголошення яких знаходяться перед першим ключовим словом case, проте в оголошеннях не повинна використовуватися ініціалізація.

Схема виконання оператора switch:

- обчислюється вираз в круглих дужках;

- обчислені значення послідовно порівнюються з константними виразами, наступними за ключовими словами case;

- якщо один з константних виразів співпадає із значенням виразу, то виконуються відповідні оператори. Після їх виконання продовжується порівняння з наступними константними виразами. Якщо порівняння необхідно припинити і завершити оператор switch, необхідно після операторів використати оператор break

- якщо жоден з константних виразів не співпав з значенням виразу, то управління передається на оператор, помічений ключовим словом default, а у разі його відсутності управління передається на наступний після switch оператор.

Для того, щоб виконати одні і ті ж дії для різних значень виразу, можна помітити один і той же оператор декількома ключовими словами case. Наприклад,

case <значення>: case < значення >: case < значення >: <операторі>;

В тілі оператора switch можна використовувати вкладені оператори switch,.

Оператор break

Оператор break забезпечує припинення виконання самого внутрішнього з об'єднуючих його операторів switch, do, for, while. Після виконання оператора break управління передається оператору, наступному за перерваним.

Питання для самоперевірки

  1. Записати оператор, який має : присвоїти змінній В значення 0 або 1 в залежності від того парне чи непарне значення в змінній Р

  2. Записати на мові C++ оператор,,що привласнює змінній А значення 0 ,якщо всі числа x,y,z -додатні , і значення 1 в протилежному випадку

  3. Записати дію у вигляді умовного оператору:

Y=cos x якщо х лежить у проміжку (-3,8) і Y=sin x в протилежному випадку.

  1. Яким буде значення змiннoї a пiсля виконання операторів

a=3;

if (a <4)

( a+=2; --a };

  1. Яким буде значення змiннoї a пiсля виконання операторів

b=3;

switch (b)

{

case 7: case 8: case 3:case 9: a=b+2; break;

case 11 : case 56:case 13: case 9: a=b-2;

}

  1. Яким буде значення змiннoї a пiсля виконання операторів

b=8; a=11;

switch (b)

{

case 7: case 8: case 3: case 9: a=b+2;

case 11 : case 56: case 13:case 9: a=b-2;

case 18: case 8: case 33: a*=2;

}

  1. Яке значення буде мати змінна а після виконання операторів:

b=2;

if (b>-4 && b<2) a=5;

else a=10;

  1. Яке значення буде мати змінна а після виконання операторів:

b=-8;

if (b<-4 || b>2) a=15;

else a=30;

  1. Яке значення буде мати змінна а після виконання операторів:

b=-1;

if (b<-5 || b>10) a=14;

else a=44;

  1. Використовуючи оператор вибору записати дії:

якщо а=2 або 4, то збільшити а на 1;

якщо а=3 або 5, то зменшити а на 1;

  1. Записати дію у вигляді умовного оператору:

Y=2x2 якщо х лежить у проміжку (-3,3) і

Y=7+х3 в протилежному випадку.

  1. Записати дію у вигляді умовного оператору:

Y=cos x якщо х лежить у проміжку (-3,8) і Y=sin x в протилежному випадку.

  1. Використовуючи оператор вибору записати дії:

якщо а='a' або 'n', то збільшити змінну Kol на 1;

якщо а='b' або 'm', то зменшити змінну Kol на 1;

Розробка програм реалізації розгалужених алгоритмів

Приклад 1. Розробити програму визначення, чи належить задане число проміжку [2,10].

#include <iostream.h>

//Визначення належності Х проміжку [2,10]

void main()

{

float X;

cout<<”Введіть значення числа “;

cin>>X;

if ((X>=2) && (X<=10))

cout<<”Число “<<X<<” належить проміжку\n”;

else

cout<<”Число “<<X<<” не належить проміжку\n”;

Ї

Приклад 2. Розробити програму, яка виконує наступні дії: для введеного символу видати відповідне сповіщення: при введенні „П” вивести своє прізвище, при введенні „І” – ім’я, при введенні іншого символу видати сповіщення „Символ не оброблюється”.

#include <iostream.h>

//Визначеннясимволів

void main()

{

char С;

cout<<” Введіть cимвол “;

cin>>C;

switch (C)

{

case ‘П’:case ’п’; cout<<”Іванов\n”;break;

case ‘І’:case ’і’; cout<<”Сергій\n”<<break;

default cout<<” Символ не обробляється\n”;

}

}

Оператори реалізації повторів

  1. Оператор циклу з параметром

  2. Оператор циклу з передумовою

  3. Оператор циклу з післяумовою.

  4. Оператор continue

  5. Питання для самоперевірки

  6. Розробка програм реалізації циклічних алгоритмів

Оператор циклу з параметром

Оператор for - це самий загальний спосіб організації циклу.

Формат оператору:

for ( <вираз 1>; <вираз 2>; <вираз 3> ) <оператори>;

<вираз 1> звичайно використовується для встановлення початкового значення змінних, управляючих циклом. <вираз 2> - це вираз, що визначає умову, при якій тіло циклу виконуватиметься. <вираз 3> визначає зміну змінних, управляючих циклом після кожного виконання тіла циклу.

Схема виконання оператора for:

  • Обчислюється <вираз 1>.

  • Обчислюється <вираз 2>

  • Якщо значення <вираз 2> відмінно від нуля (істина), виконується тіло циклу, обчислюється <вираз 3> і здійснюється перехід до пункту 2, якщо <вираз 2> дорівнює нулю (неправда), то управління передається на оператор, наступний за оператором for.

Перевірка умови завжди виконується на початку циклу. Це значить, що тіло циклу може жодного разу не виконатися, якщо умова виконання відразу буде помилковою.

Оператор циклу з передумовою

Використовується в випадку неозначеності кількості повторів. Умова закінчення циклу перевіряється перед виконанням циклу.

Формат:

while (<умова>) <оператор>;

<умова> - логічний вираз

<оператор> - тіло циклу. Може бути простим або складним оператором.

Алгоритм виконання:

  • Обчислюється логічний вираз.

  • Якщо вираз є неправда, то виконання оператора while закінчується і виконується наступний по порядку оператор. Якщо вираз є правда, то виконується тіло оператора.

  • Процес повторюється з пункту 1.

Оператор циклу з післяумовою.

Використовується в випадку невиначеності кількості повторів. Умова закінчення циклу перевіряється після виконання циклу. Тому тіло циклу виконується хоча б один раз.

Формат оператора:

do <оператор> while (<умова>);

Алгоритм виконання:

  • Виконується <оператор>.

  • Обчислюється вираз умови.

  • Якщо вираз є неправда, то виконання оператора закінчується і виконується наступний по порядку оператор. Якщо вираз істинний, то виконання оператора продовжується з першого пункту.

Оператор continue

Оператор continue використовується тільки усередині операторів циклу. Виконання програми продовжується з початку перерваного оператора.

Формат оператора: continue;

Питання для самоперевірки

  1. Наступний оператор є вірним? Дати пояснення.

while (z>=0)

sum+= z;

  1. Скiльки разiв будe виконануватись цикл for (k:=-1; k<=1; k++) a++;

  2. Скiльки разiв буде виконуватись цикл for (k:=20; k<=10;k++) a++;

  3. Яким умовам повинне задовольняти k,щоб цикли були закiченними

a)while (c<0) c=c+k; b) while (k<>0) k=k+1;

  1. Чим вiдрiзняються оператори ++i ; та i++ ;

  2. Що буде виведено пiсля виконання операторiв

for (i=1; i<6; i++)

if (i>3) break;

cout<<i<<endl;

  1. Що буде виведено пiсля виконання операторiв

k=3;

for (i=1; i<6; i++)

if (k>5) continue;

else k++;

cout<<k<<i<<endl;

  1. Чому вказаний оператор помилковий: z=5; while (z>=0) sum +=z;

  2. Скільки разів буде виконуватись цикл:

x=-5;

while (x>0) x+=2;

  1. Скiльки разiв буде повторюватись цикл

a=1;b=1;

while (a+b<8)

{ a+=1; b+=2; }

  1. Скiльки разiв будe виконуватись цикл

for (k=-1; k<= 1;k++) a++;

  1. Скiльки разiв будe виконуватись цикл

for (k=-1; k<= 1;k+=2) a++;

  1. Яким буде значення змiннoї a пiсля виконання операторів:

a=3;

for (I=1; i<= 3;i++)

if (a <4) a+=1;

else a+=2;

  1. Скiльки разiв буде повторюватись цикл

a:=3;b:=1;

do

{

a+=1; b+=2;

}

while (a+b<8);

  1. Скiльки разiв буде повторюватись цикл

a=7;

do

a-=1;

while (a>5);

  1. Скiльки разiв будe виконуватись цикл

a=8;

do

a++;

while (a<9);

Розробка програм реалізації циклічних алгоритмів

Приклад 2. Знайти суму десяти введених значень.

#include <iostream.h>

void main()

{

float x,s=0;

int i;

//x - значення, що вводиться

// s - сума введених значень

// i - змінна циклу}

for (i=1;i<=10;i++)

{

cout<<”Введи наступне значення ”;

cin>>x;

s+=x;

}

cout<<setw(10)<<setprecision(2);

cout<<”Сума введених значень =“<<s<<endl);

}

П

Варіант1.

#include <iostream.h>

void main()

{

float X=10,Y,max;

max=2*(X+3)+2*X;

while (X<= 100)

{

Y= 2*(X+3)+2*X;

If (Y>max)

max=Y;

X+=10;

}

cout<<setw(10)<<setprecision(2);

cout<<”Максимальне значення функції=”<<max<<endl;

}

Варіант1.

#include <iostream.h>

void main()

{

float X,Y,max;

max=2*(X+3)+2*X;

for (X=10;X<= 100; X+=10)

{

Y= 2*(X+3)+2*X;

If (Y>max)

max=Y;

}

cout<<setw(10)<<setprecision(2);

cout<<”Максимальне значення функції=”<<max<<endl;

}

риклад
2. Знайти найбільше значення функції Y=2(X+3)+2X на проміжку [10,100] в точках з кроком 10.

Приклад 3. Вводиться послідовність символів. При введенні символу ´П´ - вивести своє прізвище, при введенні символу ´І´ - ім´я, при введенні символу ´к´ - завершити роботу.

#include <iostream.h>

void main()

{

char c;

//c - символ, що вводиться

do

cout<<”Введи символ (для заверш.роботи символ *)”;

cin>> c;

switch ( c )

{

case ’П’: case ’п’: cout<<”Іванов\n”;

case ’I’: case ’i’: cout<<”Іван\n”;

}

while (c!=’к’);

}

Процедурно-орієнтоване програмування . Функції користувача

  1. Визначення і опис функції

  2. Вихід з функції

  3. Передача параметрів

  4. Звернення до функції

  5. Розміщення функції

  6. Аргументи по умовчуванню

  7. Перевантаження функцій

  8. Рекурсивні функції

  9. Бібліотечні функції

Визначення і опис функції

Являють собою програмні блоки, які можуть бути викликаними з різних частин програми.

Формат опису функції:

<тип результату> <ім’я функції>(<список формальних параметрів>)

{

<оператори>

}

<тип результату> - може бути довільного типу, крім масиву і функції.

Функція може не повертати результату. В цьому випадку <тип результату> повинен бути void.

По умовчанню <тип результату> є int.

<список формальних параметрів> - являє собою перелік описів параметрів. Описи розділяються комами. Для кожного параметру вказується тип і ім’я. Наприклад,

(double x,int y,int z)

Формальних параметрів може не бути. В цьому випадку замість списку вказується тип void.

Порядок і типи формальних параметрів повинні бути однаковими у визначенні функції й у всіх її оголошеннях. Типи фактичних параметрів при виклику функції повинні бути сумісні з типами відповідних формальних параметрів. Тип формального параметра може бути будь-яким основним типом, структурою, об'єднанням, перерахуванням, покажчиком або масивом.

Вихід з функції

Якщо функція не повертає значення, то вона закінчується виконанням останнього оператора функції або для виходу використовується оператор return; без параметрів.

Якщо функція повертає значення, то використовується той же оператор з параметром, яким є значення результату.

return <результат>;

результатом може бути значення або вираз, тип якого співпадає з типом результату в описі заголовку функції.

Передача параметрів

Параметри можуть передаватись по значенню і по посиланню.

Щоб показати, що параметр передається по посиланню, в заголовку функції після типу параметру ставиться символ & . Проміжок можна ставити в довільному місці. Наприклад:

int &x

int& x

int & x

Звернення до функції

Звернення до функції може бути використано у виразі і як окремий оператор.

Формат звернення

<ім‘я функції> ([<список фактичних параметрів>])

Елементи <список фактичних параметрів> відокремлюються комами.

Якщо параметр передається по значенню, то в якості фактичного параметру може бути константа і змінна.

. Якщо параметр передається по посиланню, то в якості фактичного параметру може бути тільки змінна.

Фактичний параметр може бути величиною будь-якого основного типу, структурою, об'єднанням, перерахуванням або покажчиком на об'єкт будь-якого типу. Масив і функція не можуть бути використані як фактичні параметри, але можна використати покажчики на ці об'єкти.

Розміщення функції

Функція може розміщуватись в тілі файлу основної функції або в іншому файлі. Функція не може бути описана в тілі іншої функції.

В тілі файлу основної функції вона може бути розміщена до головної функції або після неї.

Функція повинна бути об‘явленою до першого звернення до неї. Тому, якщо функція розміщена після головної функції, то необхідно до головної функції описати її прототип для того, щоб компілятор міг перевірити вірність викликів функції. Прототип функції вказує компілятору тип даних, що повертає функція, кількість параметрів, які очікує функція і їх тип і порядок їх слідування.

Прототип - це заголовок функції без параметрів і символом ; в кінці. Імена формальних параметрів не вказуються. Наприклад:

int ff1(int, int, &int);

float ff2 (int, float []);

Де float [] описує масив.

Аргументи по умовчуванню

При виклику функції їй передаються конкретні значення параметрів.

Можна задати значення параметрів по умовчанню. Значення задається в заголовку функції. Це буде означати, що якщо значення параметра, який описаний як параметр по умовчанню, при виклику не буде вказано, то в тілі функції буде використано значення цього параметру, що вказано по умовчанню.

Якщо такий параметр задано при виклику, то в тілі функції буде використовуватись вказане значення. Параметри по умовчанню записуються в заголовку функції останніми. При виклику можна опускати тільки крайні параметри.

Наприклад, функції розраховує об‘єм паралелепіпеду:

float Vbox(float len=1,float w=1,float h=1)

{return len*w*h;}

Можна викликати цю функцію наступним чином:

Vbox () всі параметри будуть по умовчанню

Vbox (2.5) len=2.5, інші по умовчанню

Vbox (2.5,4) по умовчанню тільки h

Vbox (2.5,4,5.9) значень по умовчанню не буде

Параметри по умовчанню повинні бути вказані при першому описі функції, як правило в прототипі.

Значення по умовчанню можуть бути константами, глобальними змінними, викликами функцій.

Перевантаження функцій

Можна визначити кілька функцій з одним і тим же іменем, якщо ці функції мають різні набори параметрів. Ця особливість називається перевантаженням функцій. При виклику перевантаженої функції компілятор визначає відповідну функцію за допомогою аналізу кількості, типів і порядку слідування параметрів у виклику.

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

Наприклад:

int square (int x)

{return x*x;}

double square (double x)

{return x*x;}

Рекурсивні функції

Будь-яка функція в програмі мовою С++ може бути викликана рекурсивно, тобто вона може викликати саму себе. Компілятор допускає будь-яке число рекурсивних викликів. В кожен момент часу доступні тільки значення поточного виклику.

n! = 1 при n=0;

n*(n-1)! при n>1

Класичний приклад рекурсії - це математичне визначення факторіала n!

long fakt(int n)

{

return ( (n= =1) ? 1 : n*fakt(n-1) );

}

Функція, що обчислює факторіал

Питання для самоперевірки

  1. Записати прототип функції, яка визначає кількість парних чисел в заданому масиві з 15 цілих чисел

  2. Записати прототип функції, яка вводить дані в масив 10 дійсних чисел

  3. Описати функцію, яка в заданому масиві 20 дійсних чисел визначає кількість чисел додатніх, відємних і рівних нулю.

  4. Який тип повинен мати результат функції, якщо вона не повертає значень. Привести приклад прототипу такої функції.

  5. Функція знаходить суму двох дійсних чисел. Описати заголовок і тіло функції.

  6. Написати функцію, яка визначає і повертає відповідь парне задане ціле число чи ні.

  7. Записати функцію, яка виводить сповіщення "Робота закінчена."

  8. Записати заголовок функції, яка не отримує жодного параметра і не повертає результату.

  9. Знайдіть і опишіть помилку в функції:

int sum(int x,int y)

{

int result;

result=x+y;

}

  1. Знайдіть і опишіть помилки в функції:

void fun( float a);

{

float a;

a=2*a;

cout<<a<<endl;

}

  1. Напишіть функцію, яка визначає значення гіпотенузи прямокутнього триутника, якщо відомі його катети.

  2. Напишіть функцію, яка визначає і повертає відповідь чи одне задане ціле число кратне іншому.

  3. Записати заголовок функції, яка знаходить суму елементів двох заданих масивів розміром 15 дійсних елементів кожен.

  4. Написати функцію, яка повертає символ проміжку, якщо переданий символ є символом крапки.

  5. Написати прототип функції, яка до елементів одного заданого масиву 10 дійсних чисел додає відповідні елементи іншого заданого масиву 10 дійсних чисел .

  6. Написати заголовок функції, яка визначає скільки разів вказаний символ зустрічається в масиві з 30 символів.

  7. Написати функцію, яка визначає і повертає відповідь чи однакові два переданих їй символи.

  8. Написати прототип функції, яка визначає чи однакові два переданих їй символи.

  9. Знайти і пояснити помилки у функції:

void fun(int a; float b)

{

return a+b;

}

  1. Знайти і пояснити помилки у функції:

int fun(float a,float &b);

{

b:=2*b;

return a+b;

}

Бібліотечні функції

    1. Математичні функції

    2. Обробка символів

    3. Робота з рядками символів

    4. Робота з екраном

    5. Використання графіки

У програмах широко використаються, так називані, бібліотечні функції, тобто функції, попередньо розроблені й записані в бібліотеки. Прототипи бібліотечних функцій перебувають у спеціальних заголовних файлах, що поставляють разом з бібліотеками в складі систем програмування, і включаються в програму за допомогою директиви #include.

Математичні функції

<math.h>

Звернення

Пояснення

sin(x)

cos(x)

X вимірюється в радіанах

tan(x)

log(x)

ln x

log10(x)

lg x

exp(x)

ex

sqrt(x)

Корінь квадратний

max(<ціле Х>,<ціле Y>)

Повертає максимальне ціле з двох цілих аргументів

min(<ціле Х>,<ціле Y>)

Повертає мінімальне ціле з двох цілих аргументів

pow(<основа>,<ступінь>)

Зведення в ступінь

fabs(<дійсне число>)

Абсолютне значення. Результат дійсний

fmod(<дійсне х>,<дійсне y>)

Залишок від ділення Х на Y. Результат дійсний

ceil(<дійсне х>)

Округлення в більшу сторону. Результат дійсний

сeil(8.1)=9 сeil(8.7)=9

floor(<дійсне х>)

Округлення в меншу сторону. Результат дійсний

floor(8.1)=8 floor(8.7)=8

<stdlib.h>

Звернення

Пояснення

atof(<число в символьному представленні>)

Перетворення з строкового представлення в число double. Якщо в рядку недопустимий символ, то перетворення відбувається до нього. atof(“78.56”)=78.56, atof(“78*56”)=78, atof(“*56”)=0,

atoi(<число в символьному представленні>)

Аналогічно попередньому для int. atoi(“78”)=78, atoi(“78.56”)=78, atoi(“*56”)=0,

atol(<число в символьному представленні>)

Аналогічно попередньому для long int

itoa(<ціле х>,<ім‘я масиву символів>,

<система числення>)

Перетворює ціле число в рядок символів

int n; char s[15]; itoa(n,s,10);

ltoa(<довге Х>,<ім‘я масиву символів>,

<система числення>)

Перетворює довге ціле число в рядок символів

long int n; char s[15]; itoa(n,s,10);

randomize()

Задає початкове значення для генерації випадкових чисел. Обов‘язкове підключення <time.h>

random(< ціле n>)

Повертає випадкове ціле число з проміжку 0..n-1

rand()

Повертає випадкове ціле число з проміжку 0..32767

abs(<ціле х>)

Повертає абсолютне значення. Результат цілий

labs(<довге ціле х>)

Повертає абсолютне значення. Результат довге ціле

Обробка символів

<ctype.h>

Звернення

Пояснення

isdigit(<символ>)

Повертає істину(1), якщо <символ>) є цифра

isхdigit(<символ>)

Повертає істину(1), якщо <символ>) є шістнадцятирічна цифра

isalfa(<символ>)

Повертає істину(1), якщо <символ>) є буква

isalnum(<символ>)

Повертає істину(1), якщо <символ>) є цифра або буква

islower(<символ>)

Повертає істину(1), якщо <символ>) є буква нижнього регістру

isupper(<символ>)

Повертає істину(1), якщо <символ>) є буква верхнього регістру

isspace(<символ>)

Повертає істину(1), якщо <символ>) є пробіл

iscntrl(<символ>)

Повертає істину(1), якщо <символ>) є управляючий символ

tolover(<символ>)

Повертає <символ>) у нижньому регістрі

toupper(<символ>)

Повертає <символ>) у верхньому регістрі

<stdio.h>

Звернення

Пояснення

getchar()

Повертає введений символ

putchar()

Виводить символ

<conio.h>

Звернення

Пояснення

getch ()

Повертає введений символ. Символ не відображається на екрані

getchе ()

Повертає введений символ. Символ відображається на екрані

putch()

Виводить символ

kbhit()

Повертає істину(1), якщо в буфері клавіатури є символ. Цикл

while (!kbhit());

можна використати для очікування натискання клавіши.

Робота з рядками символів

Рядок - це послідовність символів, що обробляється як єдине ціле. Рядок може містити довільні символи., обмежені подвійними лапками.

Рядок в С++ - це масив символів, що закінчується нульовим символом (‘\0‘).

Рядок може бути оголошений як масив символів. Наприклад, char R[30];

При оголошенні рядок може бути ініціалізованим як масив символів або простіше

char R[30]=”Масив символів”;

Крім того, масив можна оголосити як змінну указник на тип char: char *str; з ініціалізацією:

char *str=”Масив символів”;

Для ведення даних у рядок можна використовувати потік cin

cin>>str; cin>>R;

Ці оператори будуть вводити набір символів до тих пір, поки не зустрінеться символ проміжку, символ табуляції, символ нового рядку або указник кінця файлу. При цьому, якщо кількість введених символів буде більше ніж розмір оголошеного масиву мінус один(так як в кінці нульовий символ), то символи будуть записуватись за межі оголошеного масиву, що приведе до помилок. Тому, щоб мати гарантію вводу потрібної кількості символів, необхідно використовувати маніпулятор setw().

cin>>setw(30)>>R;

Маніпулятор необхідно використовувати для кожного рядка.

Якщо необхідно вводити повни й текст(тобто з проміжками), то потрібно використовувати функцію getline().

cin.getline(R,30);

<string.h>

Звернення

Пояснення

strcat(<рядок 1>,<рядок 2>)

Приєднує <рядок 2> в кінець <рядок 1>

strncat(<рядок 1>,<рядок 2>)

Приєднує n символів з <рядок 2> в кінець <рядок 1>

stpcpy(<рядок 1>,<рядок 2>)

Копіює <рядок 2> в <рядок 1>. Функція повертає указник на кінець сформованого рядка

strcpy(<рядок 1>,<рядок 2>)

Копіює <рядок 2> в <рядок 1>. Функція повертає указник на початок сформованого рядка

strncpy(<рядок 1>,<рядок 2,

<кількість>)

Аналогічно попередньому, але копіюється n перших символів

strchr(<рядок>,<символ>)

Функція повертає указник на позицію першого входження заданого символу. Якщо символ не знайдено - NULL

strrchr(<рядок>,<символ>)

Функція повертає указник на позицію останнього входження заданого символу. Якщо символ не знайдено - NULL

strcmp(<рядок 1>,<рядок 2>)

Зрівнює два рядки в лексикографічному порядку з врахуванням великих і малих літер. Повертає значення <0, якщо перший рядок менше другого, значення >0 - якщо більше, 0 - якщо рядки однакові

strncmp(<рядок 1>,<рядок 2>)

Аналогічно попередньому, але зрівнює n символів

stricmp(<рядок 1>,<рядок 2>)

Аналогічно попередньому, але без врахування великих і малих літер.

strnicmp(<рядок 1>,<рядок 2>)

Аналогічно попередньому, але зрівнює n символів

strcspn(<рядок 1>,<рядок 2>)

<рядок 2> вміщує послідовність символів які відшукуються в першому рядку. Повертає номер першого знайденого символу (починаючи з нуля). strcspn(“book”,”aso”)=1

strpbrk(<рядок 1>,<рядок 2>)

<рядок 2> вміщує послідовність символів які відшукуються в першому рядку. Повертає указник на перший знайдений символ.

strlen(<рядок>)

Повертає довжину рядка без врахування \0

strlwr(<рядок>)

Перетворює всі символи рядку в малі літери

strupr(<рядок>)

Перетворює всі символи рядку в великі літери

strnset(<рядок>,<символ>,

<кількість>)

Замінює перші n символів рядка на вказаний символ.

char s[10]=“qwertyui”; strnset(s,’9’,4); в результаті s=”9999tyui”

strset(<рядок>,<символ)

Замінює всі символи рядка на вказаний символ.

strew(<рядок>)

Реверсує рядок. До “вікно”, після “онків”

strstr(<рядок 1>,<рядок 2>)

Відшукує місце першого входження <рядок 2> в <рядок 1>. Якщо рядок не знайдено - NULL.

strtok(<рядок 1>,<рядок 2>)

Повертає указник на лексему, що обмежена вказаним роздільником(знак табуляції \t, кома пробіл).

Приклад 1.

Розібрати рядок на лексеми, тобто вивести окремо кожне слово з рядка, які можуть відокремлюватись пробілом або комою.

#include <iostream.h>

#include <string.h>

void main()

{

int k;

char t[40]="qwer asdfg zxcv, asdfg",r[2]=" ,";

char *tok;

tok=strtok(t,r);

while(tok!=NULL)

{

cout<<tok<<endl;

tok=strtok(NULL,r);

}

}

Приклад 2.

Вивести всі букви латинського алфавіту.

#include <iostream.h>

#include <string.h>

void main()

{

char c;

for (c='a';c<='z';c++)

cout<<c;

}

Приклад 3.

Підрахувати скільки раз в заданому тексті зустрічається буква «а» .

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

void main()

{

char c,*k;

int kol=0;

k=strchr("qwer tyui asdf axcvb ggha",'a');

while (k)

{

kol++;

k=strchr(k+1,'a');

}

cout<<kol<<endl;

}

Приклад 4.

Текст складається з слів, що розділені проміжками. Підрахувати скільки раз в тексті зустрічається перше слово.

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

void main()

{

char c,*k,*k1;

int kol=0;

char t[40]="qwer tyui asdf qwer axcvb ggha";

k=strtok(t," ");

k1=k;

while (k)

{

if (strcmp(k,k1)==0)

kol++;

k=strtok(NULL," ");

}

cout<<kol<<endl;

}

Приклад 5.

Текст складається з слів, що розділені проміжками. Вивести довжину кожного слова.

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

void main()

{

char c,*k,*k1;

int kol=0;

char t[40]="qwer tyui asdf qwer axcvb ggha";

k=strtok(t," ");

k1=k;

while (k)

{

cout<<strlen(k)<<endl;

k=strtok(NULL," ");

}

}

Приклад 6.

Сформувати фразу з введених слів. Слова розділяти проміжком.

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

void main()

{

char t[40]="",sl[15];

for (int i=1;i<=5;i++)

{

cout<<"vvod slova ";

cin>>sl;

strcat(t,sl);

strcat(t," ");

}

cout<<t<<endl;

}

Приклад 7.

Текст складається з слів, що розділені проміжками. Вивести кожне слово, що починається з цифри.

#include <iostream.h>

#include <ctype.h>

#include <string.h>

void main()

{

char t[40]="qwer 1qwer sdff 4dffg",*k;

k=strtok(t," ");

while (k)

{

if (isdigit(k[0]))

cout<<k<<endl;

k=strtok(NULL," ");

}

}

Приклад 8.

Текст складається з фраз розділених символом "крапка з комою". Кожна фраза складається з двох слів розділених проміжком. Вивести друге слово з кожної фрази.

#include <iostream.h>

#include <ctype.h>

#include <string.h>

void main()

{

char t[40]="qqq qwer;www2 sdff;rtrtrtr3 dffg;",*k,*h;

int r;

k=strtok(t,";");

while (k)

{

h=strchr(k,' ');

r=h-k;

cout<<k+r+1<<endl;

k=strtok(NULL,";");

}

}

Питання для самоперевірки

  1. Опишіть і ініціалізуйте два рядки. Напишіть оператор, який перевіряє чи однакові ці рядки і виводить відповідне сповіщення.

  2. Опишіть і ніціалізуйте рядок. Напишіть оператор, який перевіряє чи є в рядку вказаний символ і виводить відповідне сповіщення.

  3. Опишіть і ініціалізуйте два рядки. Напишіть оператор. який перевіряє чи співпадають в цих рядках перші три символи і виводить відповідне сповіщення.

  4. Описати масив з 50 символів. Записати в цей масив фразу "Ученье свет, а не ученье тьма".

  5. Описати два рядки і ініціювати їх. Об'єднати їх в один рядок.

  6. Описати і ініціалізувати рядок символів. Записати оператор, який визначає чи є в цьому рядку вказаний підрядок і вивести відповідне сповіщення.

  7. Написати функцію, яка визначає і повертає відповідь чи є два заданих символи символами цифр.

  8. Записати прототип функції, яка визначає і повертає відповідь чи є два заданих символи символами цифр.

  9. Написати функцію, яка визначає і повертає відповідь чи заданий символ є маленькою літерою латинського алфавіту.

  10. Написати функцію, яка визначає і повертає відповідь чи є заданий символ цифрою

Робота з екраном

<conio.h>

Звернення

Пояснення

wherex()

Повертає поточне значення Х

wherety()

Повертає поточне значення Y

gotoxy(<x>,<y>)

Переміщення курсора в (х,у).

window(<x1>,<y1>,<x2>,<y2>)

Вікно, де х,y – лівий верхній кут, а х1,y1 – правий нижній

clrscr()

Очистка екрану

textcolor(<колір>)

Встановлення кольору символів

textbackground(<колір>)

Встановлення кольору фону

sound(<частота в гц>)

Включити звук з вказаною частотою

nosound()

Віключити звук

delay(<час в млсек>)

Затримка на вказаний час

Використання графіки

<graphics.h>

Попередньо необхідно ініціалізувати графіку. Для цього можна використати функцію:

void ingr(void)

{

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "d:\\turboc~1\\bgi");

errorcode = graphresult();

if (errorcode != grOk)

{

cout<<"Graphics error: “<<grapherrormsg(errorcode);

exit(1);

}

}

Звернення

Пояснення

getmaxx()

Повертаї максимальне значення Х

getmaxy()

Повертає максимальне значення Y

getx()

Повертає поточне значення Х

gety()

Повертає поточне значення Y

moveto(<x>,<y>)

Переміщення курсора в (х,у).

moverel(<dx>, <dy>)

Переміщення в (х+dx, y+dy)

putpixel(<x1>,<y1>,<колір>)

Точка

line(<x1>,<y1>,<x2>,<y2>)

Лінія, де х,y – точка початку, а х1,y1 – кінця

lineto(<x>,<y>)

Лінія від поточної точки до вказаної

linerel(<dx>, <dy>)

Лінія від поточної до точки, що визначається (х+dx, y+dy)

rectangle(<x1>,<y1>,<x2>,<y2>)

Прямокутник

circle(<x>,<y>,<радіус>)

Коло

arc(<x>,<y>,<початковий кут>,

<кінцевий кут>,<радіус>)

Дуга кола. Х,y - координати центру

ellipse(<x>,<y>,<початковий кут>,

<кінцевий кут>,

<радіусX>,<радіусY>)

Дуга еліпсу

drawpoly(<кількість вузлів>,<112м.‘я

масиву з координатами вузлів>)

Ломана лінія або багатокутник. В другому випадку перша вершина описується вдруге як і остання. Масив типу int, розмір=2*<кількість вузлів>. Елементи масиву послідовно містять координати вузлів. Наприклад для трикутника

int M[6]={50,20,100,100,50,20}; drawpoly(3,M);

setlinestyle (<тип лінії>,

<шаблон>,<товщина>)

Встановлення стилю лінії

<тип лінії>

    1. - пунктирна

    2. – штрихпунктирна

    3. –

    4. - визначається шаблоном

Для типу лінії 0-3 шаблон 0.

<Товщина>: 1 - в 1 піксел, 3 - в 3 пікселі

setbkcolor (<колір>)

Колір фону (від 0 до 7)

setcolor (<колір>)

Колір ліній (від 0 до 15)

getbkcolor()

Повертає поточне значення кольору фону

getcolor()

Повертає поточне значення кольору ліній

setFillStyle (<шаблон>, <колір>)

Встановлення шаблону заливки

<шаблон>: 0 - суцільна заливка кольором фона;

1 - " ;

2 - ============ ;

3 - //////////// ;

4 - жирні //////// ;

5 - " \\\\\\\\\\\\ ;

6 - тонкі \\\\\\\\\ ;

7 - рідкий штрих ;

8 - густий штрих

bar(<x1>,<y1>,<x2>,<y2>)

Прямокутник, залитий по поточному шаблону

bar3d(<x1>,<y1>,<x2>,<y2>,

<глибина>,<0 або 1>)

Паралелепіпед. Верхня грань залита по поточному шаблону

fillpoly(<кількість вузлів>,<ім‘я

масиву з координатами вузлів>)

Багатокутник, залитий по поточному шаблону

fillellipse(<x>,<y>,

<радіусX>,<радіусY>)

Еліпс, залитий по поточному шаблону

sektor (<x>,<y>,<початковий кут>,

<кінцевий кут>,

<радіусX>,<радіусY>)

Сектор еліпсу, залитий по поточному шаблону

floodfill(<x>,<y>,

<колір лінії контуру>)

Заливка замкнутої області по поточному шаблону. <x>,<y> - точка в середині області.

outtext (<текст>)

Виведення тексту з поточної точки

outtextxy(<x1>,<y1>,<текст>)

Виведення тексту з вказаної позиції

settextstyle (<номер шрифта>,

<положення текста>,

<розмір символів>)

Вибір шрифта

<номер шрифта>:

0 - матричний 8х8;

1 - полужирний ;

2 - тонкий ;

3 - рублений;

4 - готичний.

<положення текста>:

0 - горизонтальне, зліва - направо;

1 - вертикальне знизу-вверх;

2 - букви повернуто на 90, але вивід горизонтальний.

<розмір символів> - 0.....10

cleardevice()

Очистка екрану. Курсор встановлюється у початок координат

closegraph()

Вийти з графічного режиму

Приклад 1: Побудувати правильний багатокутник.

#include <iostream.h>

#include <math.h>

#include <conio.h>

#include <graphics.h>

#include <stdlib.h>

#define n 6 // кількість кутів

#define n1 2*n

void main()

{

float a;

int x=200,y=200,r=100; // координати центру і радіус описаного кола

int m[n1]; // масив вершин багатокутника. Послідовно //заносяться значення x1, Y1, X2, Y2, ... ,x6, y6, x1, y1

// Перехід в графічний режим

int r0=DETECT, r1;

initgraph(&r0,&r1,"d:\\turboc~1\\bgi");

if (r0<0)

{ cout<<"ERROR GRAPH!!!"<<endl;

exit(1);

}

// Формування координат вершин багатокутника

for (int i=0;i<n*2;i+=2)

{

/* аргумент у функцій sin, сos повинен бути в радіанах. Кути у багатокутника вимірюються в градусах. Тому значення в градусах необхідно перевести в радіани:

Кут в радіанах= Рі/180*(кут в градусах)

*/

a=360/n*i/2; //кут кожної вершини багатокутника

m[i]=x+(int)(cos(3.14/180*a)*r);

m[i+1]=y+(int)(sin(3.14/180*a)*r);

cout<<a<<endl<<m[i]<<" "<<m[i+1]<<endl;

}

// Додатково задається перша вершина як остання

m[12]=m[0];

m[13]=m[1];

drawpoly(n+1,m);

}

Організація даних в мові С++

    1. Масиви

    2. Структури

    3. Обєднання

    4. Розробка програм з використанням структурованих типів даних

Масиви

  1. Одновимірні масиви. Ініціалізація одновимірних масивів

  2. Двовимірні масиви. Ініціалізація двовимірних масивів

  3. Питання для самоперевірки

  4. Розробка програм з використанням масивів

Масив - це обмежена послідовність даних однакового типу. Масив характеризується іменем, типом елементів і розміром. Нумерація елементів завжди починається з нуля. До елементів масиву можна звернутись за допомогою індексу. Індексом може бути ціле число або вираз. Індекс є номером елементу.

Елементи масиву можуть мати довільний тип, крім типу void.

Масиви можуть бути одновимірними і багатовимірними.

Одновимірні масиви

Формат опису масиву:

<тип елементів> <імя масиву>[<розмір>];

Наприклад:

int mas1[10]; float mas2[5]; char mas3[15];

Опис масиву тільки відводить необхідний розмір памяті для елементів масиву, але не заповнює їх ніякими значеннями - елементи масиву можуть мати довільне значення. Тільки для зовнішніх і статичних масивів компілятор заповнює їх елементи нулями.

При описі масиву може бути виконана ініціалізація його елементів. Для цього після опису розміщується перелік значень елементів масиву, обмежений фігурними дужками.

Формат ініціалізації:

<тип елементів> <імя масиву>[<розмір>]={<знач.1>,<знач.2>,...<знач.n>};

Наприклад: int mas1[3]={2,34,189};

Можливі різні варіанти ініціалізації:

  1. Кількість вказаних елементів співпадає з розміром масиву;

  2. Кількість вказаних елементів менше розміру масиву. В цьому випадку перші елементи масиву будуть ініціалізовані вказаними значеннями, а значення інших буде дорівнювати нулю.

Наприклад: int mas[10]={3,5,7,9}; Перші чотири елементи набудуть вказаних значень, а значення інших буде 0.

Якщо необхідно заповнити всі елементи масиву нулями, достатньо вказати в фігурних дужках лише один ноль: int mas[10]={0}; Значення всіх елементів масиву буде 0.

Для масивів типу char не ініціалізовані елементи набувають значення коду нуля, а саме ‘\x0’.

Для визначення пустого рядка можна записати: char m[10]={“”}; або

char m[10]=“”;

  1. Кількість вказаних елементів більше розміру масиву. В цьому випадку при трансляції формується сповіщення про помилку.

  2. Розмір масиву встановлюється по кількості заданих значень при ініціалізації. В цьому разі при описі масиву його розмір в квадратних дужках не вказується. Наприклад: int mas[]={3,5,7,9}; Буде створено масив з чотирьох цілих елементів і ці елементи отримують початкові значення з списку ініціалізації.

Двовимірні масиви

Двовимірний масив можна розглядати як масив, елементам якого є масив.

Формат опису двовимірного масиву:

<тип елементів> <імя масиву>[<розмір1>][<розмір2>];

Наприклад:

int mas4[10][10]; float mas5[5][6]; char mas6[3][15];

Для звернення до елементу двовимірного масиву необхідно вказувати два індекси. Наприклад,

mas[0][0], mas[5][7].

Елементи двовимірних масивів зберігаються в памяті по рядках. Перший індекс - це номер рядку, а другий - номер елементу в рядку, тобто номер стовпця.

Правила ініціалізації для двовимірних масивів такі ж, як і для одновимірних.

Наприклад:

  1. int mas[3][3]={ 1,2,3,

4,5,6,

7,8,9};

Елементи заповнюються послідовно по рядкам. Можна явно вказувати поділ на рядки:

int mas[3][3]={ {1,2,3},

{4,5,6},

{7,8,9}};

  1. Кількість рядків можна не вказувати, кількість визначиться по заданим даним:

int mas[][3]={ {1,2,3},

{4,5,6},

{7,8,9}};

Буде сформовано матрицю 3х3.

  1. Щоб заповнити всю матрицю нулями: int mas[3][3]={0};

  2. Можна вказувати не всі значення в рядках:

int mas[3][3]={ {1},

{4,5},

{7,8,9}};

Не ініціалізовані елементи заповняться нулями.

  1. Для масиву рядків, в кінці кожного рядка буде записано код нуля.

char str[3][50]={ “Рядок 1”,

“Рядок 2”,

“Рядок 3”};

Визначення масиву пустих рядків char str[3][50]={“”};

Для двовимірних масивів можна використовувати рядки матриці, як масиви. Тобто, наприклад, mas[i] може бути передано як масив у функцію.

Питання для самоперевірки

  1. Описати масив з 10 цілих значень. П'ятому елементу цього масиву присвоїти значення.

  2. Описати масив з 10 символів. Другому елементу цього масиву присвоїти значення.

  3. Описати масив з 20 дійсних значень. Першому елементу цього масиву присвоїти значення.

  4. Описати двовимірний масив 5х8, що містить дійсні значення. Елементу цього масиву, що знаходиться в третьому рядку і шостому стовбці присвоїти значення.

  5. Описати двовимірний масив 4х4, що уміщує символьні значення. Елементу цього масиву, що знаходиться в другому рядку і першому стовбці присвоїти значення.

  6. Описати двовимірний масив 5х8, що містить дійсні значення. Першому елементу головної діагоналі цього масиву присвоїти значення.

  7. Описати масив з трьох цілих значень і ініціалізувати всі його елементи.

  8. Описати масив з 10 символів і ініціалізувати перші три його елементи.

  9. Описати і ініціалізувани нулями масив з 30 цілих значень.

  10. Описати і ініціалізувати двовимірний масив дійсних чисел, розміром 2х2.

  11. Описати двовимірний масив цілих елементів розміром 3х13. Ініціалізувати його таким чином, щоб в кожному рядку перший елемент мав значення номеру рядку, а інші дорівнювали нулю.

  12. Описати двовимірний масив символів, 3х10. Ініціалізувати його таким чином, щоб перший рядок містив першу літеру латинського алфавіту, другий рядок - першу і другу, третій - три перші літери.

  13. Описати двовимірний масив, розміром 5х15. Написати фрагмент програми, що заповнює другий рядок цього масиву числами від 1 до 15.

  14. Описати двовимірний масив, розміром 20х10. Написати фрагмент програми, що заповнює четвертий стовбець цього масиву числами від 1 до 20.

  15. Описати двовимірний масив, розміром 10х10, що містить символи. Написати фрагмент програми, що заповнює перший рядок цього масиву символами цифр від 0 до 9.

  16. Описати двовимірний масив, розміром 10х10, що містить символи. Написати фрагмент програми, що заповнює перший стовбчик цього масиву символами цифр від 0 до 9.

  17. Напишіть оператори, за допомогою яких знаходять суму елементів другого рядка масиву 3х3.

  18. Напишіть оператори, за допомогою яких знаходять суму елементів третього стовбця масиву 3х3.

  19. Опишіть і ніціалізуйте два рядки .

  20. Підрахуйте середнє арифметичне елементів масиву. Кількість елементів дорівнює 10 і значення елементів задаються із клавіатури користувачем.

  21. Підрахуйте суму непарних елементів масиву. Кількість елементів дорівнює 10 і значення елементів задаються із клавіатури користувачем.

  22. Запропонуєте користувачеві ввести із клавіатури 15 цілих чисел, збережете їх у масиві й виведіть на екран номера тих елементів масиву, значення яких кратно 3.

  23. Написати програму, що змінює порядок проходження елементів масиву на протилежний (тобто перший елемент стає останнім, а останній - першим; другий елемент стає передостаннім, а передостанній - другим і так далі) і вивідний результуючий масив на екран. Елементи масиву вводяться користувачем із клавіатури.

  24. Використайте одномірний масив для рішення наступного завдання. Прочитайте 20 чисел, кожне з яких перебуває в діапазоні від 10 до 100 включно. Після того, як прочитали чергове число, надрукуйте його, але тільки в тому випадку, якщо воно дублює раніше прочитані числа. Передбачите "найгірший випадок", коли всіх 20 чисел різні. Використайте найменший можливий масив для рішення цього завдання.

  25. Написати програму, що міняє значення двох однотипних змінних без використання додаткової змінної.

Розробка програм з використанням масивів

Приклад 1. Для заданого масиву з 10 дійсних значень знайти суму позитивних значень.

#include <iostream.h>

#include <iomanip.h>

void main()

{

int i;

float m[10], Sum=0;

cout <<"Vvedi 10 znacheniy \n";

for (i=0;i<=9;i++)

cin>>m[i];

for (i=0;i<=9;i++)

if (m[i]>0)

Sum+=m[i];

cout<<"Summa >0 znacheniy = "<<setw(10)<<setprecision(4)<<Sum<<endl;

}

Приклад 2.

В матриці 5*4 знайти суму елементів кожного рядка

#include <iostream.h>

#include <iomanip.h>

void main()

{

int i,j;

int m[5][4], Sum;

cout <<"Vvedi matricu 5x4 \n";

for (i=0;i<=4;i++)

for (j=0;j<=3;j++)

cin>>m[i][j];

for (i=0;i<=4;i++)

{

Sum=0;

for (j=0;j<=3;j++)

Sum+=m[i][j];

cout<<"Summa elementov "<<i<<"

stroki= "<<setw(5)<<Sum<<endl;

}

}

Структури

  1. Визначення і опис структур

  2. Визначення синоніму типу структури

  3. Вкладені структури

  4. Операції над структурами

  5. Ініціалізація структур

  6. Розробка програм з використанням структур

  7. Питання для самоперевірки

Визначення і опис структур

Cтруктура - це складний тип даних, в який входять елементи будь-яких типів, за винятком функцій. Елементи структури називаються полями. Кожне поле характеризується іменем і типом.

Формат опису структури:

struct <імя структури>

{

<тип поля 1> <імя поля 1>;

<тип поля 2> <імя поля 2>;

. . .

<тип поля n> <імя поля n>;

};

<імя структури> - це тег (позначення) структури, може розглядатись як новий тип даних, визначений користувачем. Щоб використовувати структуру в програмі, необхідно визначити змінну цього типу. Наприклад:

struct STUDENT

{ char fio[20];

int God_rogd;

char pol;

char grupa[15];

};

STUDENT stud1,stud2;

Змінні можна описати разом з описом структури. Наприклад:

struct STUDENT

{ char fio[20];

int God_rogd;

char pol;

char grupa[15];

}stud1,stud2;

Для доступу до елементів полів використовується складне імя, що складається з імені змінної типу структури і імені поля, розділених крапкою. Наприклад, stud1.fio, stud2.God_rogd. В цьому випадку імя структури (STUDENT) вказувати не обовязково, тобто допускається опис

struct

{ char fio[20];

int God_rogd;

char pol;

char grupa[15];

}stud1,stud2;

Структура може бути описана в поточному блоці або за його межами. В першому випадку структура буде локальною для поточного блоку і другому - глобальною для всіх блоків, розміщених після опису.

Визначення синоніму типу структури

Для визначення свого типу можна використати оператор typedef.

typedef struct STUDENT

{ char fio[20];

int God_rogd;

char pol;

char grupa[15];

}ТSTUDENT;

В приведеному описі ТSTUDENT є новим типом даних, а STUDENT залишається імям структури, яке можна опустити:

typedef struct

{ char fio[20];

int God_rogd;

char pol;

char grupa[15];

}ТSTUDENT;

Опис змінних: ТSTUDENT stud1,stud2;

Вкладені структури

Можна використовувати вкладені структури, описуючи їх до опису головної структури або в її описі. Наприклад, дату народження опишемо як структуру, що складається з трьох цілих значень: число, місяць, рік.

Перший випадок; попередній опис:

Struct data

{ int d,m,g;};

struct STUDENT

{ char fio[20];

data Data_rogd;

char pol;

char grupa[15];

}stud1,stud2;

Другий випадок: опис в структурі:

struct STUDENT

{ char fio[20];

Struct {int d,m,g;} Data_rogd;

char pol;

char grupa[15];

}stud1,stud2;

І в першому і в другому випадку для доступу до елементів вкладеної структури використовуються операції доступу до елементів структури, тобто складні імена, що складаються з імені структурної змінної, імені структурного поля і імені поля вкладеної структури, розділених крапкою: stud1.Data_rogd.d, stud1.Data_rogd.d.

Операції над структурами

Допустимими операціями для структур є:

  • операція присвоєння для однотипних структур. Наприклад, stud1=stud2;

  • операція адреси (&) структури;

  • операція sizeof для визначення розміру структури;

  • операція доступу до елементів структури.

Ініціалізація структур

Структури можуть бути ініціалізовані таким же чином, як і масиви. Наприклад:

ТSTUDENT stud1= {“Іванов І.І”,1987, ‘м’,”ПМ 04 1/9” };

ТSTUDENT stud2= {“Петрова А.А.” }; Не заданим значенням присвоюється нульове значення.

Розробка програм з використанням структур

П риклад 1. Сформувати масив даних про 5 студентів групи. По кожному студенту необхідно мати дані: ПІБ, дата народження, стать. Вивести перелік юнаків, що народились в 1988 році.

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char pol;

struct {int d,m,g;} data_r;

};

void main()

{

zStudent stud[5];

int k;

for (k=0;k<5;k++)

{

cout<<"\nVvod FIO ";

cin>>stud[k].FIO;

cout<<"Vod pol ";

cin>>stud[k].pol;

cout<<"Vod data r(d m g) ";

cin>>stud[k].data_r.d>>

stud[k].data_r.m>>stud[k].data_r.g;

}

cout<<"Spisok "<<endl;

for (k=0;k<5;k++)

if (stud[k].data_r.g==1988 && stud[k].pol=='m' )

cout<<stud[k].FIO<<endl;

}

Питання для самоперевірки

  1. Описати структуру, яка описує карту: масть, достоїнство. Ініціалізувати структуру

  2. Описати структуру, яка описує кісточку доміно: значення на лівій частині, значення на правій частині. Використовуючи змінну типу цієї структури, присвоїти полям відповідні значення.

  3. Написати оператор виводу значень елементів структури, описаної в п.2.

  4. Описати структуру, яка описує студента групи: ПІБ, група. Ініціалізувати структуру.

  5. Описати структуру, що описує м'яч: колір, розмір, матеріал. Ініціалізувати структуру.

  6. Описати структуру, що описує собаку: порода, окрас, рук народження, наявність медалей. Ініціалізувати структуру.

  7. Визначити розмір структури, описаної в п.5.

  8. Описати структуру, яка описує студента групи: ПІБ, группа, дата народження(день, місяць, рік), адреса(область, місто, вулиця, дім, квартира), використовуючи вкладені структури. Ініціалізувати структуру.

  9. Вивести, використовуючи структуру з п.8, ПІБ стулента і його адресу.

Обєднання

  1. Визначення об‘єднань

  2. Оголошення об‘єднань

  3. Доступ до елементів об‘єднань

Обєднання - це область памяті, в якій в різні моменти часу можуть знаходитись обєкти різних типів. В довільний момент часу обєднання може містити тільки один обєкт, тому що елементи обєднання сумісно використовують одну й ту ж область памяті.

Обєднання оголошуються за допомогою ключового слова union в такому ж форматі, як і структури. Формат оголошення:

union Number

{

int x;

float y;

};

Як правило, обєднання оголошуються до головної функції, щоб мати доступ до нього з довільної функції.

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

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур.

Коли виконано присвоєння Numder.x=78; то звернення то іншого елементу не має сенсу. В памяті буде зберігатись значення останнього присвоєння.

Обєднання дозволяє інтерпретувати представлення об'єкту одного типу, начебто цьому об'єкту був привласнений інший тип.

Допустимі операції такі ж, як і у структури.

Указники

  1. Визначення указника

  2. Операції над указниками

  3. Зв‘язок між указниками і масивами

  4. Масиви указників

Визначення указника

Це змінні, значеннями яких є адреса пам‘яті. Указник містить адресу, за якою знаходиться значення. Кожна змінна, яка оголошується як указник, повинна мати перед собою знак *.

Формат опису:

<тип> *<ім‘я змінної>

Символ * може стояти будь-де:

int *ptr; int* ptr; int * ptr;

Указник може бути ініційований при оголошенн і:

int *ptr=(int*)200;

або за допомогою операції присвоєння:

i

(а)

nt y=5;

int *ptr;

ptr=&y;

Пустий указник має значення NULL. Це значення визначено в бібліотеці stdio.

.

Операції над указниками

  1. Операція розіменування

  2. Арифметичні операції

  3. Операції відношення

  4. Операція присвоєння

Операція розіменування

Операція повертає значення об‘єкту, на яке указує указник. Операція позначається символом *, який ставиться поперед указником.

Для отримання значення на яке указує указник, використовується операція розіменування.

Якщо маємо опис (а), то після виконання cout<<*ptr; буде виведено значення 5.

Арифметичні операції

Операція

Позначення

Опис

Інкремент

++

Збільшення указника для переходу до наступної адреси

Декремент

 

Зменшення указника для переходу до попередньої адреси

Додавання

+, +=

Збільшення указника на ціле число

Віднімання

, =

Зменшення указника на ціле число. Можна знайти різницю між двома указниками

Фізичне збільшення або зменшення значення указника залежить від розміру того об‘єкту, на який він указує.

Якщо до указника, описаного в (а), додати обо відняти деяке ціле N, то значення ptr зміниться на значення N*sizeof(int).

Операції відношення

Операції відношення == і != можна використовувати для всіх указників.

Операції <, >, >=, <= мають сенс тільки для указників на один і той же масив.

Операція присвоєння

Указник можна привласнити іншому указнику, якщо обидва мають одинаків тип. Наприклад:

int *a,*b;

float *c;

Допустимо a=b;

Зв‘язок між указниками і масивами

Указники широко використовуються при роботі з масивами.

Ім.‘я масиву є адресою першого елементу масиву. Наприклад, маємо описи

int b[5];

int *bptr;

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

bptr=b;

Ця дія еквівалентна наступній дії: bptr=&b[0];

Операції ++ і   при роботі з масивами будуть означати перехід до наступного або попереднього елементу масиву.

Операції + і  деякого значення N будуть означати перехід до елементу масива, що лежить через N елементів від поточного.

bptr+=2; буде означати перехід до 3-го елементу. bptr буде указувати на 3-й елемент.

bptr+=2; буде означати перехід до 5-го елементу.

До 4-го елементу масиву можна звернутись наступним чином:

b[3]

*(bptr+3)

*(b+3)

bptr[3]

Масиви указників

Елементами масивів можуть бути указники. Типовим представником такої структури є формування масиву рядків. Кожний елемент такого масиву є рядок. Змінна рядка є по суті указником на її перший символ. Наприклад:

сhar *color[3]={”червоний”,“жовтий”,”зелений”};

Масив color оголошено таким, що складається з указників на тип сhar. Кожне з значень ”червоний”, “жовтий”, ”зелений” зберігається в пам‘яті як окремий рядок. Масив color буде містити указники на кожен з рядків. Кожний указник посилається на перший елемент відповідного рядку.

Для звернення до елементів масиву необхідно вказати індекс відповідного елементу і операцію розіменування. Наприклад, для виведення значення третього елементу:

cout<<*color[2];

Використання масиву указників дає більшу гнучкість тому, що розмір рядку не обмежений.

Наприклад, подібний масив можна було оголосити як двовимірний масив

сhar color[3][10]={”червоний”,“жовтий”,”зелений”};

Але в цьому випадку кількість елементів рядків обмежена 10 символами.

Питання для самоперевірки

  1. Описати указник на цілу змінну і ініціалізувати його.

  2. Описати указник на дійсну змінну і ініціалізувати його.

  3. Описати і ініціалізувати указник на масив 10 цілих елементів.

  4. Маємо опис:

int b[8];

int *bPtr=b;

Вивести значення третього елементу масив, використовуючи указник.

  1. Маємо опис:

int b[8]={1,2,3,4,5,6,7,8};

int *bPtr=b;

Що буде виведено при виконанні операторів:

cout<<b[7];

cout<<*bPtr;

cout<<*(bPtr+2);

  1. Маємо опис:

int b[8]={1,2,3,4,5,6,7,8};

int *bPtr=b;

Що буде виведено при виконанні операторів:

cout<<*(b+7);

bPtr++;

cout<<*bPtr;

cout<<*(bPtr-1);

  1. Маємо опис:

int b[8]={1,2,3,4,5,6,7,8};

int *bPtr=b;

Що буде виведено при виконанні операторів:

cout<<*(b+4);

bPtr-=2;

cout<<*bPtr;

cout<<bPtr[3];

  1. Маємо опис:

int b[8]={1,2,3,4,5,6,7,8};

int *bPtr=b;

Що буде виведено при виконанні операторів:

cout<<*(bPtr+5);

bPtr++;

cout<<*bPtr;

bPtr+=3;

cout<<*(bPtr-2);

Файли і потоки

  1. Введення і виведення потоків

  2. Робота з файлами послідовного доступу

  3. Приклад діалогової програми з використанням файлів послідовного доступу

  4. Робота з файлами довільного доступу

Введення і виведення потоків

Потік -- це послідовність байтів. В операціях введення байти пересилаються від пристрою в оперативну пам'ять. Байти даних можуть представлятися у вигляді символів в коді ASCII, у вигляді внутрішнього формату, у вигляді графічного зображення, цифрового зображення і т.д.

Мова надає можливості для введення-виведення на «низькому» і «високому» рівнях. Уведення-виведення на низькому рівні (тобто неформатоване уведення-виведення) здійснює просто пересилку даних по байтах від пристрою в пам'ять і навпаки. При використанні введення-виведення на високому рівні (тобто форматоване уведення-виведення) байти групуються в певні елементи, наприклад цілі або речовинні числа, символи, рядки і дані типів, визначених користувачем.

При використанні потокового введення-виведення необхідно підключити наступні заголовні файли:

- <iostream.h> -- містить основні відомості, необхідні для всіх операцій з потоками введення-виведення.

- <iomanip.h> -- відомості для форматування

- <fstream.h> -- інформація для операцій з файлами, обробка яких здійснюється користувачем.

В C++ визначено три класи файлового введення-виведення:

ifstream

вхідні файли для читання

ofstream

вихідні файли для запису

fstream

файли для читання і запису

Файли відкриваються шляхом створення об'єктів цих класів потоків.

При роботі з файлами цих класів можна використовувати ряд властивих їм методів ( open – для відкриття потоку, close – для закриття потоку) і застосовувати дуже зручні операції помістити в потік (<<) і узяти з потоку (>>).

Файли що використовуються є текстовими.

Робота з файлами послідовного доступу

  1. Виведення у файл

  2. Приклад

  3. Читання з файлу

  4. Приклад

Необхідно створити об'єкт потоку виведення, пов'язаний з файлом, за допомогою конструктора. Параметром для конструктора буде ім'я файлу виведення і режим відкриття файлу.

Можливі режими відкриття файлу приведені таблиці:

Режим

Опис

ios::out

Відкрити файл для виведення. Вміст файлу очищається

ios::app

Відкрити для додавання в кінець файлу

ios::ate

Переміститися в кінець відкритого файлу

ios::in

Відкрити файл для введення

ios::frunc

Очищається вміст файлу

ios::nocreate

Якщо файл не існує, то операція його відкриття не виконується.

ios::noreplace

Якщо файл існує, то операція його відкриття не виконується.

Виведення у файл

Формат обісу на відкриття потоку для виведення у файл з використанням ініціалізації:

ofstream <имя вихідного потока>(<имя фізичного файла>[<режим>]);

За умовчанням використовується режим ios::out тому його можна не указувати.

Наприклад

ofstream outfile("Test.dat");

Або можна описати об'єкт класу, а потім відкрити файл з використанням методу open:

ofstream outfile;

outfile.open("Test.dat", ios::out);

В результаті, при нормальному завершенні операції, створюється вихідний потік outfile, пов'язаний з файлом Test.dat. Якщо файл з таким ім'ям не існує, то він створюється. Якщо файл існує, то він очищається.

Якщо операція завершена з помилкою, то значення потоку буде рівне 0(нуль), якщо помилки не було, то не нуль. Для перевірки правильності завершення операції використовується оператор:

if ( !outfile)

cout<<"Файл не вдається створити")<<endl;

else

{

. . . . // робота з файлом

}

При виведенні даних у файл елементи що виводяться необхідно розділяти символом «пропуск».

Для установки поточного покажчика файлу в його початок для вихідного потоку використовується метод seekp:

outfile.seekp(0);

Приклад

Сформувати файл з даними про студентів. Для кожного студента ввести номер залікової книжки і прізвище. Для завершення введення використовувати ознаку кінця файлу введення з клавіатури (^z).

#include <iostream.h>

#include <fstream.h>

void main()

{

long nZach;

char FIO[25];

ofstream Studfile("Student.dat");

if ( !Studfile)

cout<<"Файл не вдається створити"<<endl;

else

{

cout<<"Введите номер залікової книжки і прізвище студента"<<endl;

cout<<"Введите ^z для завершення."<<endl;

while (cin>>nZach>> FIO)

{

Studfile<< nZach<<' '<<FIO<<endl;

cout<<"? ";

}

Studfile.close();

}

}

По завершенню роботи з файлом необхідно його закрити за допомогою методу класу close().

Примітка. Цикл «поки не кінець вводу» ( while (cin>>nZach>> FIO) ) можна використати у формі while (!cin.eof()). Але в цьому випадку до файлу потрапляє зайвий останній запис з пустими значеннями.

Читання з файлу

Аналогічно може створюватися вхідний потік, пов'язаний з файлом:

ifstream <имя вхідного потока>(<имя фізичного файла>[<режим>]);

За умовчанням використовується режим ios::in тому його можна не указувати.

Наприклад

ifstream infile("Test.dat");

Або можна описати об'єкт класу, а потім відкрити файл з використанням методу open:

ifstream infile;

infile.open("Test.dat", ios::in);

Для установки поточного покажчика файлу в його початок для вхідного потоку використовується метод seekg:

infile.seekg(0);

Приклад

Прочитати вміст файла, створеного в попередньому прикладі.

#include <iostream.h>

#include <fstream.h>

void main()

{

long nZach;

char FIO[25];

ifstream Studfile("Student.dat");

if ( !Studfile)

cout<<"Файл не вдається відкрити")<<endl;

else

{

cout<<"Номер залікові книжки прізвище студента"<<endl;

while (Studfile >>nZach>> FIO)

cout<< nZach<<" "<<FIO<<endl;

Studfile.close();

}

}

Коли досягається кінець файлу, вхідна послідовність в операторі while повертає нуль.

Можна цикл читання з файлу записати інакше, використовуючи метод eof() для перевірки досягнення кінця файла:

while (!Studfile.eof())

{

Studfile >>nZach>> FIO;

cout<< nZach<<" "<<FIO<<endl;

}

Приклад діалогової програми з використанням файлів послідовного доступу

Створити файл, що містить відомості про студентів: номер залікової книжки, середній бал, ПІБ студента. Вивести дані про вказаного студента. Мати змогу доповнити файл і переглянути весь вміст.

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

#include <string.h>

void vvod(int); // прототипи функцій

void vivod (void);

void vibor (void);

void main() // головна функція. Містить діалог

{

char d;

do

{

clrscr();

cout<<"1 -vvod"<<endl<<"2 - add"<<endl<<"3 - vivod"<<endl

<<"4 - vibor"<<endl<<"5 - exit"<<endl;

d=getch();

switch (d)

{

case '1':vvod(0);break;

case '2':vvod(1);break;

case '3':vivod();break;

case '4':vibor();break;

}

}

while (d!='5');

}

void vvod(int d) // функція для створення файлу і вводу в нього або доповнення

/*d = 0 для вводу

d = 1 для доповнення*/

{

long nZach;

char FIO[25];

float ball;

ofstream Studfile;

if (d==0)

Studfile.open("Student.dat");

else

Studfile.open("Student.dat",ios::app);

if ( !Studfile)

cout<<"Файл не вдається створити"<<endl;

else

{

cout<<"Введiть номер залiкової книжки, cepeднiй bal,прiзвище

студента"<<endl;

cout<<"Введiть ^z для завершення."<<endl;

while (cin>>nZach>>ball>>FIO)

{

Studfile<< nZach<<' '<<ball<<' '<<FIO<<endl;

cout<<"? ";

}

Studfile.close();

cin.clear(); // очистити потік стандартного вводу

}

}

void vivod(void) // функція виводу вмісту всього файлу

{

long nZach;

char FIO[25];

float ball;

ifstream iStudfile("Student.dat");

if ( !iStudfile)

cout<<"Файл не вдається вiдкрити"<<endl;

else

{

cout<<"Hомер залiкової книжки, cepeднiй бал,прiзвище студента"<<endl;

while (iStudfile>>nZach>>ball>>FIO)

cout<< nZach<<" "<<ball<<" "<<FIO<<endl;

getch();

iStudfile.close();

}

}

void vibor (void) // функція вивірки даних про вказаного студента

{

long nZach;

char FIO[25],vFIO[25];

float ball;

ifstream iStudfile("Student.dat");

if ( !iStudfile)

cout<<"Файл не вдається вiдкрити"<<endl;

else

{

cout<<"Введiть ФIО для пошуку"<<endl;

cin>>vFIO;

cout<<"Данi по студенту"<<endl;

while (iStudfile>>nZach>>ball>>FIO)

{

if (strcmp(vFIO,FIO)==0)

cout<< nZach<<" "<<ball<<endl;

}

iStudfile.close();

getch();

}

}

Робота з файлами довільного доступу

    1. Основні відомості

    2. Створення і відкриття файлу прямого доступу

    3. Запис даних у файл

    4. Читання даних з файлу

    5. Доступ до довільного запису

Основні відомості

При використанні файлів послідовного доступу неможливо прямо у файлі змінити якесь значення. Це приведе до спотворення інших даних. Найпростішим способом це зробити - використати допоміжний файл у який послідовно записати дані до запису, що змінюється, потім дані, що змінюється, а потім дані, що розміщуються за зміненими даними. Потім цей файл повинен замінити або бути скопійованим у висхідний файл. Це потребує додаткових ресурсів часу і не є вигідним. Спрощує завдання використання файлів з довільним доступом.

С++ не накладає обмежень на структуру файлів. Тому додаток може сам створювати їх за своєю потребою для створення файлів довільного доступу може бути використано багато методів. Найбільш простим методом є вимога, щоб всі записи в файлі були однакової довжини. Це дає можливість легко визначати місцеположення потрібних даних. Тому при запису до файлу необхідно явно вказувати розмір даних. Найчастіше для роботи використовуються структури.

Створення і відкриття файлу прямого доступу

Створення, відкриття для читання, відкриття для доповнення файлу прямого доступу нічим не відрізняється від цих дій для файлу послідовного доступу.

Запис даних у файл

Для запису даних до файлу прямого доступу використовується функція елемент write класу ofstream яка виводить у файл фіксовану кількість байтів, починаючи з вказаного місця пам‘яті у позицію файлу на яку вказує файловий вказівник.

Формат запису

<ім‘я потоку>.write((char*)&<ім‘я змінної>,sizeof(<ім‘я змінної>));

Приклад формування нового файлу

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char grupa[15];

int god_r;

};

void main()

{

zStudent stud;

ofstream outStud("Stud.dat");

if (!outStud)

cout<<"File not create!!!"<<endl;

else

while (!cin.eof())

{

cout<<"\nVvod FIO ";

cin>>stud.FIO;

cout<<"Vod grupa ";

cin>>stud.grupa;

cout<<"Vod god_r ";

cin>>stud.god_r;

outStud.write((char*)&stud,sizeof(stud));

}

outStud.close();

}

Приклад доповнення файлу

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char grupa[15];

int god_r;

};

void main()

{

zStudent stud;

ofstream outStud("Stud.dat",ios::app);

if (!outStud)

cout<<"File not create!!!"<<endl;

else

while (!cin.eof())

{

cout<<"\nVvod FIO ";

cin>>stud.FIO;

cout<<"Vvod grupa ";

cin>>stud.grupa;

cout<<"Vvod god_r ";

cin>>stud.god_r;

outStud.write((char*)&stud,sizeof(stud));

}

outStud.close();

}

Читання даних з файлу

Для читання даних з файлу прямого доступу використовується функція елемент read класу ifstream яка читає з файлу фіксовану кількість байтів, починаючи з позиції файлу на яку вказує файловий вказівник у вказане місце у пам‘яті.

Формат читання

<ім‘я потоку>. read ((char*)&<ім‘я змінної>,sizeof(<ім‘я змінної>));

Приклад читання з файлу

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char grupa[15];

int god_r;

};

void main()

{

zStudent stud;

ifstream inStud("Stud.dat");

if (!inStud)

cout<<"File not open!!!"<<endl;

else

while (!inStud.eof())

{

inStud.read((char*)&stud,sizeof(stud));

cout<<endl<<stud.FIO<<" "<<stud.grupa<<" "<<stud.god_r<<endl;

}

inStud.close();

}

Доступ до довільного запису

Для доступу до довільного запису для виведення даних у файл використовується функція елемент seekp класу. При цьому, якщо файл був закритий, то його необхідно відкрити файл в режимі ios::ate (переміститись в кінець відкритого файлу). Якщо файл був відкритий для запису – ніяких дій для відкриття виконувати не потрібно.

Для доступу до довільного запису для виведення даних у файл використовується функція елемент seekg класу.

Формат доступу до запису:

<ім‘я потоку>.seekp | seekg (<номер запису>*sizeof<ім‘я змінної>);

Спочатку необхідно встановити файловий указник на необхідний запис, а потім виконати необхідні дії: читати або писати. Врахувати, що нумерація записів починається з нуля.

Приклад зміни вмісту третього запису файлу

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char grupa[15];

int god_r;

};

void main()

{

zStudent stud;

ofstream outStud("Stud.dat",ios::ate);

if (!outStud)

cout<<"File not create!!!"<<endl;

else

{

cout<<"\nVvod FIO ";

cin>>stud.FIO;

cout<<"Vvod grupa ";

cin>>stud.grupa;

cout<<"Vvod god_r ";

cin>>stud.god_r;

outStud.seekp(2*sizeof(stud));

outStud.write((char*)&stud,sizeof(stud));

}

outStud.close();

}

Приклад читання з файлу третього запису

#include <iostream.h>

#include <fstream.h>

struct zStudent

{

char FIO[20];

char grupa[15];

int god_r;

};

void main()

{

zStudent stud;

ifstream inStud("Stud.dat");

if (!inStud)

cout<<"File not open!!!"<<endl;

else

{

inStud.seekg(2*sizeof(stud));

inStud.read((char*)&stud,sizeof(stud));

cout<<endl<<stud.FIO<<" "<<stud.grupa<<" "<<stud.god_r<<endl;

}

inStud.close();

}

Динамічний розподіл памяті

Память може бути виділена і звільнена в процесі виконання програми. Для роботи з динамічною памяттю використовуються оператори new i delete.

Оператор new використовується для виділення памяті. Формат оператора може бути представлено в двох формах:

new <імя типу> [(<значення для ініціалізації>)]

new (<імя типу>)[(<значення для ініціалізації>)]

Оператор повертає указівку на обєкт вказаного типу.

Якщо память не може бути виділена, оператор повертає значення NULL.

Наприклад:

double *d;

d=new double; або d=new(double);

Коли виділяється память, значення обєкту (значення записане в цій памяті), буде не визначеним. Обєкту можна присвоїти початкове значення при використанні оператора new, наприклад

d=new double (3.567); int* i=new int(12345);

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

При виділення памяті для масиву оператор повертає указівку на перший елемент масиву. В цьому разі формат оператору має вигляд:

new <імя типу>[<розмір>]

Наприклад:

int *n;

n=new int[20];

Ініціалізувати значення елементів масиву не дозволяється.

Для виділення динамічної памяті для двовимірного масиву необхідно сформувати масив указівок на одновимірні масиви, тому що в С++ двовимірний масив розглядається як масив масивів. Наприклад, сформуємо динамічний масив розміром 2х2:

іnt **m; //указівка на указівку

m=new int*[2]; //указівка на масив

for(i=0;i<2;i++) //формування указівок на одновимірні масиви(рядки

матриці)

m[i]=new int[2];

Оператор delete використовується для звільнення памяті, відведеної для обєкту.

Оператор можна записати в двох формах:

delete <імя змінної стандартного типу>;

delete []<імя змінної масиву>;

Наприклад:

delete d;

delete []n;

Для двовимірного масиву необхідно спочатку звільнити память, відведену для одновимірних масивів, а потім -- відведену для масиву вказівок.

for (i=0;i<2;i++)

delete[] m[i];

delete []m;

Приклад. Записати ціле значення в динамічну пам‘ять.

#include <iostream.h>

void main()

{

int* k=new int;

if (k!=NULL)

{

cout<<"vvod"<<endl;

cin>>*k;

cout<<"s= "<<*k<<endl;

delete k;

}

}

Приклад. Сформувати масив 10 цілих чисел. Знайти суму елементів масиву.

#include <iostream.h>

void main()

{ int і,s=0;

int* k=new int[10];

if (k!=NULL)

{

cout<<”Введіть 10 чисел”<<endl;

for(i=0;i<=9;i++)

cin>>k[i];

for(i=0;i<=9;i++)

s+=k[i];

cout<<"s= "<<s<<endl;

delete []k;

}

}

ДОДАТОК А

Інформаційний

ПЕРЕЛІК ГРАФІЧНИХ СИМВОЛІВ

СИМВОЛИ ДАНИХ:

СИМВОЛИ ПРОЦЕСУ:

Дані

Процес

Дані, що запам'ято-

вуються

Визначений процес

ОЗП

Ручна операція

ЗП з прямим доступом

Перевірка

Документ

Паралельні дії

Ручний ввід

Початок циклу

Дісплей

Кінець циклу

Продовження додатку А

СИМВОЛИ ЛІНІЙ:

ПРАВИЛА ЗАСТОСУВАННЯ СИМВОЛІВ:

Передача керування

ххх

Використання ідентифікатора

Канал зв'язку

хх..х

Використання опису

__ __ __

Альтернативний зв'язок

Докладне представлення

СПЕЦІАЛЬНІ СИМВОЛИ:

З'єднання кількох ліній в одну

З 'єднувач

Зображення пересічних ліній

Ввід - вивід

Коментарі

Внутрішній з'єднувач

. . . Пропуск

Зовнішній з'єднувач

61

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]