Єдина Країна!

Головне меню

Наша кнопка

Українські уроки про ІТ

Друзі

Підтримка української армії


Головна Програмування - C++ Базовий курс програмування на С++. Урок 10. Функції і їхня необхідність. Глобальні і локальні змінні.

Базовий курс програмування на С++. Урок 10. Функції і їхня необхідність. Глобальні і локальні змінні.
Написав Joker   
Субота, 20 червня 2015 23:22
Переглядів: 7480

Я завжди буду шукати ліниву людину для роботи,

Він знайде багато нових простіших способів

Розв’язку поставленої задачі

Білл Гейтс

 

 

Сьогодні ми вивчимо:

1. Розв’язок д/з минулого уроку.

2. Потрібність функцій, створення і виклик.

3. Return.

4. Передача аргументів.

5. Глобальні і локальні змінні.

6. Домашнє завдання.

 

 

Розв’язок д/з минулого уроку

1. Знайти суму всіх елементів.

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
 
int main()
{
	setlocale(LC_CTYPE, "ukr");
	srand(time(NULL));
	const int size = 5;
	int arr[size][size];
	cout<< "Початковий масив: " <<endl;
	for (int i = 0; i <size; ++i)
	{
		for (int j = 0; j <size; ++j)
		{
			arr[i][j] = rand() % 11;
			cout<<arr[i][j] << "\t";
		}
	}
	int sum = 0;
	for (int i = 0; i <size; ++i)
	{
		for (int j = 0; j <size; ++j)
			sum += arr[i][j];
	}
	cout<< "\n\n" << "Сума = " <<sum<<endl;
	_getch();
	return 0;
}

 

2. Знайти максимальне і середнє значення

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
 
int main()
{
	setlocale(LC_CTYPE, "ukr");
	srand(time(NULL));
	const int size = 3;
	int arr[size][size];
	cout<< "Початковий масив: " <<endl;
	for (int i = 0; i <size; ++i)
	{
		for (int j = 0; j <size; ++j)
		{
			arr[i][j] = rand() % 11;
			cout<<arr[i][j] << "\t";
		}
	}
	int sum = 0;
	int max = arr[0][0];
	for (int i = 0; i <size; ++i)
	{
		for (int j = 0; j <size; ++j)
		{
			sum += arr[i][j];
			if (max<arr[i][j])
				max = arr[i][j];
		}
	}
	cout<< "\n" << "Максимальне значення = " <<max<<endl;
	cout<< "\n" << "Середнє значення = " <<sum / (size*size) <<endl;
	_getch();
	return 0;
}

 

3. Знайти суму всіх елементів двовимірного масиву (3х7), якщо будь-який з індексів кратний 3.

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
	srand(time(NULL));
	setlocale(LC_CTYPE, "ukr");
	constshort int x = 3;
	constshort int y = 7;
	int a[x][y];
	int sum = 0;
	cout<< "\n" << "Масив: " <<endl;
	for (int i = 0; i < x; ++i)
	{
		for (int j = 0; j < y; ++j)
		{
			a[i][j] = rand()%11;
			cout<< a[i][j] << "\t";
			if (i % 3 == 0 || j % 3 == 0)
				sum += a[i][j];
		}
	}
	cout<< "\n" << "Сума = " <<sum<<endl;
	system("pause");
	return 0;
}

 

 

Потрібність функцій, створення і виклик.

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

Тепер ближче до теми. Інколи у програмі потрібно повторювати один і той самий код декілька разів, що призводить до багатьох недоліків. Для мене головним аргументом є те, що він засмічує код. Саме тут нам допоможуть функції. Вони виносяться за межі тіла функції main, мають власне ім’я за яким здійснюються виклики. Також функції використовуються при роботі з рекурсіями, але про це у наступних уроках.

Є 2 способи створення функцій:

1. До функції main

2. За допомогою прототипа (вважається більш правильним і красивим)

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

Давайте розберемо обидва способи.

Синтаксис створення функції до main:

Тип_функції ім’я_функції (параметри)

{

Тіло_функції;

}

 

Давайте напишемо програму, яка виводить helloworld 10 разів на екран за допомогою функції.

#include <iostream>
using namespace std;
 
void Hello ()
{
	cout<< "\n" << "Helloworld" <<endl;
}
 
int main ()
{
	for (int i(0); i<10; ++i)
		Hello ();
 
	system ("pause");
	return 0;
}

Ця сама програма, але тепер будемо використовувати прототипи.

#include <iostream>
using namespace std;
void Hello ();
int main ()
{
	for (int i(0); i<10; ++i)
		Hello ();
 
	system ("pause");
	return 0;
}
void Hello()
{
	cout<< "\n" << "Helloworld" <<endl;
}

Також варто сказати:

Заборонено створювати одну функцію в середині іншої. Але одна функція може викликати іншу.

 

Return

Так, ми вже використовували це ключове слово, починаючи з першої програми. Але ми не пояснювали його роботу. Зараз саме час. Справа в тому, що функція будь-якого типу крім void повинна містити ключове слово return. Основна функція програми int main () має тип int, отже повинна містити return. У випадку з main все просто. Він сигналізує про нормальне завершення роботи програми. А у випадку з іншими функціями ми самі повинні це визначити. Розберемо це все на прикладі пошуку суму:

#include <iostream>
#include <conio.h>
using namespace std;
int SuM(int key);
int main()
{
	setlocale(LC_CTYPE, "ukr");
	int n;
	cout<< "\n" << "Введiть верхню межу суми --> ";
	cin>> n;
	cout<<SuM(n) <<endl;
	_getch();
	return 0;
}
 
int SuM(int key)
{
	int res = 0;
	for (int i = 1; i <= key; ++i)
		res += i;
	return res;
}

Тепер пояснимо як працює наша програма. Спершу визначимо як наша програма повинна працювати. Ми повинні додати всі числа від 1 до n.

Н-д: n=5, res= 1+2+3+4+5 = 15.

Тепер прокоментуємо код. У 4 рядку створюється прототип функції, пам’ятайте про символ ; , він є обов’язковим. Далі змінна n слугує для того, щоб визначити верхню межу сумування. Починаючи з 21 рядка починається сама функція. Вона має тип int, оскільки ми сумуємо тільки цілі числа і результатом буде також ціле число. Ім’я функції я зробив використовуючи символи різним регістрів, бо це ім’я має бути унікальним.

Поясню на прикладі. Нехай ми написали функцію для пошуку максимального числа і назвали її max. Але крім того ми підключили бібліотеку <algorithm> і у коді використали стандартну функцію із цієї бібліотеки теж max (ця функція також шукає максимум двох порівнянь). Тоді у нас виникає конфлікт функцій і компілятор може зрозуміти вас неправильно.

Йдемо далі. У цьому ж рядку ми прописали один параметр, який також визначає верхню межу. Параметр створений з тієї причини, що змінна n прописана у функції main, а у функції SuM її просто не існує. І в кінці функції ми повертаємо у функцію main значення res. Здається пояснив все, не соромтесь задавати питання у коментарях.


Передача аргументів.

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

Давайте для кращого розуміння напишемо програму.

#include <iostream>
#include <conio.h>
using namespace std;
void Change(int a, int b)
{
	int q = a;
	a = b;
	b = q;
	cout<< "\n" << "a = " << a<<endl;
	cout<< "b = " << b <<endl;
}
int main()
{
	int a, b;
	cin>> a >> b;
	cout<< "\n" << "a = " << a <<endl;
	cout<< "b = " << b <<endl;
	cout<< "=-=-=-=-=-=-=-=-=-=-=-=-=-" <<endl;
	Change(a, b);
	cout<< "=-=-=-=-=-=-=-=-=-=-=-=-=-=-" <<endl;
	cout<< "a = " << a <<endl;
	cout<< "b = " << b <<endl;
	_getch();
	return 0;
}

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

У функцію Change (яка повинна поміняти значення змінних) насправді передаються не самі змінні a і b з функції main, а їхні копії. Для них окремо виділяється пам’ять. Далі функція міняє місцями значення двох змінних і виводить їх на екран. Після виходу з функції копії змінних видаляються, тому  останній вивід нічим не відрізняється від першого.

Але це тільки для змінних. При роботі з масивами, все зовсім не так. Всі зміни які були зроблені з масивом у функції збережуться і після виходу з неї. Тепер ще декілька нюансів при використанні масивів у функціях. Все це пов’язано з тим, що ім’я масива – адреса його першого елемента. Це призводить до того, що ми передаємо у функцію адресу першого елемента. Це дозволяє функції працювати зразу ж з масивом, а не з його копією. Крім цього не потрібно вказувати кількість елементів.

Ось приклад такої програми:

#include <iostream>
#include <conio.h>
using namespace std;
	void change(int arr[], int n)
	{
		for (int i = 0; i < n; ++i)
			arr[i] = i;
	}
int main()
{
	constshort int size = 10;
	int arr[size];
	for (int i = 0, j = size; i <size; i++, --j)
		arr[i] = j;
	cout<< "\n" << "Firsrarray: " <<endl;
	for (int i = 0; i <size; ++i)
		cout<<arr[i] << "\t";
	change(arr, size);
	cout<< "\n" << "Secondarray: " <<endl;
	for (int i = 0; i <size; ++i)
		cout<<arr[i] << "\t";
 
	_getch();
	return 0;
}

Зміни в масиві відбувалися тільки у функції, а обидва виводи у частині main. Тобто всі операції виконані з масивом у функції збереглися після виходу з функції. Також зверніть увагу на те, як ми прописали аргументи функції. Ми вказали пусті квадратні дужки ( int arr[] ). Це дає зрозуміти компілятору, що arr– масив, а не просто змінна. А уже при виклику функції change з функції main ми вказуємо просто arr.

 

Глобальні і локальні змінні.

Спершу потрібно розібратися, що таке блок. Блок це частина програми (коду) прописаного між однією парою фігурних дужок. Наприклад, ми ставимо фігурні дужки для циклів. Це є блоком видимості для циклу.

І тепер якщо ми створимо якусь змінну у цьому блоці, то після виходу з блоку (за межі циклу) ця змінна видалиться. Якщо ми створимо змінну у функції main, вона буде діяти і буде видимою тільки у функції main. І у всіх вкладених блоках які є у функції main. Це і є локальні і глобальні змінні. Локальні змінні створюються у певному блоці. Глобальні змінні створюються поза будь-якими блоками і є видимі у будь-якому місці програми. За замовчуванням глобальні змінні заповнюються нулем (з локальними змінними не так).

Всі операції, що здійснюються з глобальними змінними у програмі зберігаються. Крім цього варто бути обережними, ви можете створити дві змінні з однаковим іменем (одну – глобальну, іншу - локальну). Це не призведе до помилки і компілятор вважає це коректною роботою. Але у такому випадку він буде опрацьовувати локальну змінну.

Приклад:

#include <iostream>
#include <conio.h>
using namespace std;
int a;      // Глобальна змінна, ініціалізована 0
 
int main()
{
	int a = 5;              // Локальна змінна.
	cout<< a <<endl;
	_getch();
	return 0;
}

 

Завдання для закріплення

1. Напишіть функцію для пошуку факторіалу.

2. Програму яка містить:

- Функцію заповнення масиву з 5 елементів (заповнений рандомно від 0 до 10)

- Функцію яка знаходить елемент, який повторюється найчастіше.

3. Функцію – конвертер валют. Функція має 2 аргументи. Перший аргумент – числове значення суми валюти. Якщо другий аргумент = 1, то перевести гривні у долари . Якщо другий елемент = 0, то перевести долари у гривні . Курс валют взяти за останній на момент написання д/з


( 6 Проголосувало )

Схожі статті:
Новіші матеріали:
Старіші матеріали:

Коментарі
Добавити новий
Олексій   |2015-10-26 01:41:45
"У рядку 5 створюється прототип функції
..."
по-моєму в 4. А можна так щоб рядки
коду програм були прономуревоні як в С++?
Адміністратор   |2015-10-26 01:45:42
avatar Дякую, виправив помилку.

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

В
подальшому ми оновимо сайт і використаємо
інший едітор в якому буде нумерація
Andrii  - Д/з   |2018-03-30 01:56:02
Задача 4.Можливо комусь стане у
пригоді.
#include
#include
#include
#includ e

using namespace std;

int
main()
{
setlocale(LC_ALL, "Ukrainian";
srand(time(NULL));
system(
"color A";

int const size = 6;
int arr[size][size];
int sum =
0;

for (int i = 0; i < size; i++)
{
for (int j = 0; j < size;
j++)
{
arr[i][j] = rand() % 11;
cout
Залишити коментар
Ім`я:
e-mail:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Введіть цей настирливий код
Русская редакция: www.freedom-ru.net & www.joobb.ru

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 

Підписка

Хто онлайн?

Немає
На даний момент 2 гостей на сайті

Український рейтинг
TOP.TOPUA.NET