- •12. Класи пам'яті даних 100
- •13. Робота з файлами 106
- •14. Посилання 111
- •Склад мови
- •Алфавіт мови
- •Лексеми
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Символьні рядки
- •Знаки операцій, роздільники, коментарі
- •Типи даних
- •Класифікація типів даних
- •Цілочислові типи
- •Дійсні типи
- •Оголошення змінних і констант
- •Переліки
- •Структура програми
- •Функція main
- •Область дії змінної
- •Введення і виведення даних
- •Функції стандартної математичної бібліотеки
- •Вирази і операції
- •Поняття виразу, операнда, операції
- •Порядок виконання операцій
- •Арифметичні операції
- •Порозрядні операції
- •Операції порівняння
- •Логічні операції
- •Операції присвоєння
- •Умовна операція
- •Операція визначення розміру sizeof
- •Узгодження типів у виразах
- •Умовні оператори
- •Оператори
- •Умовний оператор if
- •Оператор вибору switch
- •Оператори циклу
- •Цикл з параметром. Оператор for
- •Цикл з передумовою. Оператор while
- •Цикл з постумовою. Оператор do while
- •Оператори переходу
- •Використання псевдовипадкових чисел
- •Одновимірні масиви
- •Багатовимірні масиви
- •Символьні рядки
- •Вказівники
- •Оголошення вказівника, операції, пов’язані з вказівниками
- •Адресна арифметика
- •Void – вказівники, типізація вказівників
- •Звертання до елементів масивів через вказівники
- •Масиви символьних рядків і масиви вказівників
- •Динамічне виділення пам’яті
- •Структури і об’єднання
- •Оголошення і ініціалізація структур
- •Звертання до елементів структур
- •Перейменування типів
- •Об’єднання
- •Поля бітів
- •Директиви препроцесора
- •Призначення директив препроцесора
- •Директива включення #include
- •Директиви макропідстановок #define I #undef
- •Директиви умовної компіляції
- •Директиви #ifdef, #ifndef
- •Функції
- •Структура функції
- •Виклик функцій. Прототипи функцій
- •Взаємодія фактичних і формальних параметрів функцій
- •Inline – функції
- •Масиви і символьні рядки як параметри функцій
- •Використання кваліфікатора const в оголошеннях параметрів
- •Багатовимірні масиви як параметри функцій
- •Опрацювання структур у функціях
- •Вказівники на функції
- •Рекурсивні функції
- •Класи пам'яті даних
- •Клас пам'яті, час існування і видимість об’єкта
- •Область дії глобальних і локальних змінних
- •Специфікатори класів пам'яті
- •Специфікатори глобальних змінних
- •Багатофайлові програми
- •Робота з файлами
- •Звертання до файлів
- •Послідовний запис до файлу і послідовне читання з файлу
- •Файли з довільним доступом
- •Посилання
- •Призначення посилань
- •Передача аргументів функцій як посилань
Опрацювання структур у функціях
На відміну від масивів, структури можна копіювати та присвоювати, оскільки мова С++ інтерпретує їх як звичайні змінні, а не як вказівники. Тому можна передавати значення структури у функцію через відповідний формальний параметр або повертати структуру як значення результату виконання функції.
Якщо певна структура опрацьовується функціями програми, то шаблон такої структури повинен бути описаний перед функціями, які використовують даний тип структури.
Використовують різні способи передавання структур у функцію для опрацювання: передавання цілих структур через відповідні параметри – структури; передавання адрес структур через параметри – вказівники на структури; передавання окремих полів структур. Залежно від конкретного випадку кожен з цих методів має свої переваги і недоліки.
Передавати цілу структуру в функцію не завжди раціонально – при кожному виклику функції для кожного параметра структурного типу буде створена змінна, для кожного з полів структури буде виконана операція копіювання. Часто більш ефективно передавати в функцію вказівника на структуру, в цьому випадку не витрачається час на операції створення структур і на копіювання значень полів, але всі дії виконується над оригіналом структури, а не над її копією.
Приклад програми. Є два масиви цілих чисел: в першому зберігаються порядкові номери студентів, в другому – рейтинги студентів. Сформувати масив структур, кожна з яких буде містити інформацію про окремого студента. В цьому масиві знайти порядкові номери студентів з найменшим і найбільшим рейтингом (вважати, що рейтинги унікальні), знайти середній рейтинг, кількість студентів з рейтингом нижчим середнього.
#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
using namespace std;
//-----------------------------------------------------------------
struct student {
int id;
int rating;
}; //--------------------------------------------------------------
void student_add( student a[ ], int pos, int new_id, int new_rating ) {
a[ pos ].id = new_id;
a[ pos ].rating = new_rating;
} //---------------------------------------------------------------
void student_show( student * s ) {
cout << "id = " << s->id << ", rating = " << s->rating << endl;
} //---------------------------------------------------------------
void student_show_all( student a[ ], int n ) {
for ( int i = 0; i < n; i++ )
student_show( &a[ i ] );
} //---------------------------------------------------------------
int student_max_rating( student a[ ], int n ) {
int max = 0;
for ( int i = 1; i < n; i++ )
if ( a[ max ].rating < a[ i ].rating )
max = i;
return max;
} //---------------------------------------------------------------
int student_min_rating( student a[ ], int n ) {
int min = 0;
for ( int i = 1; i < n; i++ )
if ( a[ min ].rating > a[ i ].rating )
min = i;
return min;
} //---------------------------------------------------------------
double student_avg( student a[ ], int n ) {
double avg = 0;
for ( int i = 0; i < n; i++ )
avg += a[ i ].rating;
return avg / n;
} //---------------------------------------------------------------
int student_nof_loosers( student a[ ], int n ) {
int num = 0;
double avg = student_avg( a, n );
for ( int i = 0; i < n; i++ )
if ( a[ i ].rating < avg )
num++;
return num;
}
#endif
#include "student.h"
#include <iostream>
using namespace std;
int main() {
const int N = 5;
int sid[ N ] = { 1, 2, 4, 5, 7 };
int srating[ N ] = { 75, 80, 90, 70, 95 };
student s[ N ];
for ( int i = 0; i < N; i++ )
student_add( s, i, sid[ i ], srating[ i ] );
student_show_all( s, N );
cout << "max rating = " << student_max_rating( s, N ) << endl;
cout << "min rating = " << student_min_rating( s, N ) << endl;
cout << "avg = " << student_avg( s, N ) << endl;
cout << "below avg = " << student_nof_loosers( s, N ) << endl;
}
