- •Загальні положення ...………………………………………………………….........3
- •Загальні положення
- •1 Організація введення і виведення даних та розв’язання задач з простою змінною
- •1.1 Мета роботи
- •1.2 Вказівки до організації самостійної роботи студентів
- •1.2.1 Використання операторів введення
- •#Define sp " "
- •Int main ( )
- •Int main ( )
- •Int main ( )
- •Void main ( )
- •For ( [ вир1 ]; [ вир2] ;[ вир3 ] ) оператор;,
- •Void main ( )
- •Void main ( )
- •1.5 Контрольні питання
- •1.6 Варіанти індивідуальних завдань
- •2 Розв’язання задач c використанням одновимірних і двовимірних масивів
- •2.1 Ціль роботи Прищепити студентам навички розв’язання задач з використанням одновимірних і двовимірних масивів, складних циклів і використання покажчиків.
- •2.2 Методичні рекомендації з організації самостійної роботи студентів
- •Void main( )
- •Void main ( )
- •Void main ( )
- •Void main ( )
- •2.3 Використання покажчиків
- •Наиведемо програму з використанням покажчиків:
- •Int main ( )
- •Void main ( void )
- •2.4 Використання масивів і покажчиків
- •Приклад 2.4 Обчислити середнє значення додатних елементів одновимірного масиву.
- •Int *pmas;
- •2.5 Масиви покажчиків
- •Void main( )
- •2.6 Контрольні питання
- •2.7. Варіанти індивідуальних завдань
- •3 Вирішування задач з використанням даних символьного типу
- •3.1 Ціль роботи Вивчення засобів опису символьних типів даних і використання структур для обробки даних.
- •3.2 Методичні рекомендації з організації самостійної
- •Роботи студентів
- •3.2.1 Організація символьного введення - виведення
- •Device . Get (char_var);
- •3.2.2 Рядки як символьні масиви
- •3.2.3 Введення-виведення символьних масивів
- •Void main (void)
- •3.2.4 Основні функції обробки символьних типів
- •Void main (void)
- •Void del (char *st, int k, int n);
- •Void del(char *st, int, int);
- •Void main()
- •Void del(char *st,int k,int n)
- •[ Проміжки ] [знак числа] [ цифри].
- •Void main( )
- •Void main()
- •Void main()
- •Void main(void)
- •3.2 Контрольні питання і завдання
- •3.4 Варіанти індивідуальних завдань
- •4 Вирішувння задач з використанням даних типу структура
- •4.1 Ціль роботи Освоєння заходів розробки і налагодження програм з використанням
- •4.2 Методичні рекомендації з організації самостійної
- •Void main(void)
- •Void qsort (void *base , n , width,
- •Int (*fcmp) ( const void *elem1, const void *elem2) .
- •4.3 Контрольні питання
- •4.4. Індивідуальні завдання
- •5 Використання функцій при розробці програм
- •5.1 Ціль роботи
- •5.2 Методичні вказівки з організації самостійної роботи студентів
- •Void fun ( int p)
- •Void main ( )
- •Int main ( )
- •5.2.1 Використання покажчиків на функцію
- •Void main ( )
- •5.2.2 Використання масивів - параметрів функцій
- •Vоid sort (int mas [ 30 ]); .
- •Void sort ( int mas [ ], int n ) ; .
- •Void fun1 (char st [15]);
- •Int main ( )
- •Void fun1 ( char st[15] )
- •Void fun2 ( int mat [ ] [10], int rows, int cols );
- •Int main ( )
- •5.2.4 Звертання до функції і передача результату
- •Int main ( )
- •5.2.5 Перевантаження функцій
- •Int main ( )
- •5.3 Контрольні питання
- •5.4 Варіанти індивідуальних завдань
- •6 Робота з файлами
- •6.1 Ціль роботи
- •6.2 Методичні вказівки по організації самостійної роботи
- •Int main ( )
- •Int main ( )
- •Void main ( )
- •Ifstream in ( ”file1") ;
- •In.Close();
- •Перелік посілань
- •Навчальне видання
- •61726 Харків, просп. Леніна, 14.
Наиведемо програму з використанням покажчиків:
// P2_5.CPP — застосування покажчиків
#include < iostream>
using namespace std;
Int main ( )
{
int x = 10;
int *px = &x;
cout << " x =" << x << endl;
cout << "*px =" << *px << endl;
x* = 2; // або x = x*2;
cout << " Нове значення* px =" << *px << endl;
*px += 2; // або *px =*px + 2;
cout << " Нове значення* px=, тобто х=" << x << endl;
return 0;
}
Результат виконання програми:
x = 10
*px = 10
Нове значення *px = 20
Нове значення*px, тобто x = 22
Сам покажчик-змінна має свою адресу, тому буде справедливим
наступний запис:
int *pt1, *pt2;
pt1 = (int*) &pt2; // тут покажчику pt1 привласнюється адреса пам'яті,
// де розташована змінна pt2
Це має сенс у ситуації, коли :
int y,*pt1, *pt2 =&y;
pt1 = (int*) & pt2; .
Існують наступні обмеження на використання операції взяття адреси "&":
— не можна визначати адресу константи ( оскільки їй не приділяється комірка пам'яті), тобто неприпустимий запис : vp = &345;
— не можна визначати адресу результату арифметичного виразу, тому наступний запис невірний : vp = & (x + y); .
Для змінних – покажчиків дозволені операції:
— присвоювання;
— інкремент і декремент;
— додавання і віднімання;
— порівняння покажчиків однакового типу.
Наприклад, демонстраційна програма з використанням змінних-покажчиків може мати вигляд:
//P2_6.CPP — використання змінних- покажчиків
#include < iostream>
using namespace std;
Void main ( void )
{
int *ptr1 = (int*)100 ;
int *ptr2 = (int*) 200;
ptr1++;
ptr2 -= 10;
cout << "ptr1=" << ptr1 << endl;
cout << "ptr2=" << ptr2 << endl;
cout << "ptr2 - ptr1=" << ptr2 - ptr1 << endl;
}
Результат виконання програми :
ptr1 = 00000068
ptr2 = 000000A0
ptr2 - ptr1 = 14
У програмі операція ptr1++ збільшить адресу на 4 байта , оскільки дані типу int займають 4 байти , операція ptr2-=10 зменьшує адресу на 40 байтів. Адреси виводяться на екран в шістнадцятковому вигляді.
2.4 Використання масивів і покажчиків
У мові С++ масиви і покажчики зв'язані між собою. При оголошенні масиву у вигляді : int mas [20]; ім'я масиву mas визначається як покажчик-константа на перший (нульовий) елемент масиву, тобто на адресу першого елемента масиву &mas[0].
Для доступу до елементів масиву існує два способи:
— використання індексу елемента масиву, наприклад, mas[2] або mas[i];
— використання адресного виразу тобто виразу з покажчиком на
масив, наприклад, *( mas +2 ) чи *( mas+i ).
Ім'я масив-покажчик, можна записати в наступному вигляді:
int mas [20];
int *ptr1;
ptr1 = mas; // чи ptr1 = &mas[0];
Після оголошення масиву int mas [20]; вираз &mas[0] і mas є еквівалентними.
Для обнуління елементів оголошеного масиву досить ініціалізувати його перший елемент: int mas[10] = {0} ; При цьому першому елементу не обов'язково привласнювати значення 0. Якщо в оголошеному масиві ініціалізується трохи перших елементів, то інші ініціалізуються нулями.
Наприклад, у випадку коли float mas [10] ={ 12.2, 34.56 }; , останні вісім елементів одержать значення 0.
Глобальні масиви автоматично ініціалізуються двійковими нулями, у тому числі і символьні.
При оголошенні масивів можна використовувати одну з форм запису :
< тип > < ім'я > [n] // Оголошення одновимірного
// масиву з n елементів
< тип > < ім'я > [n] = { значення } // Значення елементів масиву
< тип > < ім'я > [ ] = { значення } // розділені комою
Наприклад:
float m[6];
float m[6] = { 3.4, 4.5, 5.6, 6.7, 8.9, 10.3 };
float m[ ] = { 3.45, 4.56, 5.67, 6.78 };
Двовимірні і багатовимірні масиви описуються аналогічним образом, тобто правомірний запис :
int mas [2][5] ={ 1, 2, 3, 4, 5,
10, 11, 13, 14, 25 };
int mas [2][5] ={ {1, 2, 3, 4, 5},
{10, 11, 13, 14, 25} };
int mas [ ][5] ={ 1, 2, 3, 4, 5,
10, 11, 13, 14, 25 }; .
При оголошенні одновимірних масивів їхній розмір можна не вказувати, якщо оголошений масив відразу ініціалізується.
В оголошенні багатовимірних масивів можна опускати кількість індексів тільки першого виміру при одночасній ініціалізації. Якщо під час оголошення масивів ініціалізація не проводиться , то кількість індексів треба вказувати завжди і скрізь.
Оскільки для масивів завжди в пам'яті приділяється суцільний блок комірок пам'яті, у яких розташовуються елементи, то адресу наступного елемента mas[1] можна вказати шляхом збільшення покажчика на 1, тобто якщо p = &mas[0] , тоді p=p + 1 або ( p += 1) а для i елемента масиву адреса може бути визначена як p + i; . При цьому автоматично виконується операція збільшення адреси з урахуванням типу масиву і кількості, що відводиться, байт для кожного його елемента, отже :
адреса х[і] = адреса x[0] + і*sizeof ( тип ); .
Якщо два покажчики р1 і р2 указують на елементи одного масиву, то до них застосовні операції відносини: == , != , < , <= , > , >= .
Наприклад, відношення вигляду р1 < р2 істинно, якщо р1 указує на більш ранній елемент, ніж р2 . Всякий покажчик можна порівняти з нулем.
Варто звернути увагу, що для покажчиків, що посилаються на елементи різних масивів, результат арифметичних операцій і відносин не визначений. В арифметиці з покажчиками можна використовувати адресу не існуючого "наступного за масивом " елемента. Крім того, до покажчика можна додати деяке ціле значення, наприклад можна записати:
р + n ; ,
де n — ціле значення, а р — покажчик.
Цей вираз визначає область об'єкта, що займає n -те місце після об'єкта, на який указує р, при цьому n автоматично збільшується на коефіцієнт,що дорівнює відповідній довжині об'єкта. Наприклад , якщо int займає 4 байти , то цей коефіцієнт дорівнює чотирьом.
Допускаються також порівняння покажчиків, що вказують на елементи одного масиву.
Наприклад, якщо р1< p2, то р2 - р1+1 — це число елементів масиву від р1 до р2 включно.
Таким чином, з покажчиками допускаються наступні операції :
— присвоювання значення одного покажчика іншому;
— додавання і вирахування покажчиків і даного цілого типу ( р+5 );
—порівняння двох покажчиків, що посилаються на елементи одного масиву;
— присвоювання покажчику нуля і порівняння з нулем.
Інші операції з покажчиками заборонені.
Для покажчика дозволяються вирази вигляду:
р1 = mas; або р++ ,
тут р — покажчик , mas — масив.
Розглянемо демонстраційні приклади програм роботи з покажчиками.