Функції в C++

Оціни цю статтю




функції в с ++, функції c ++

Пройдя не такой уж долгий путь от нашего первого урока к этому, вы “подошли” к изучению функций в C . Функции – це іменований фрагмент коду, який повторюється в програмі 2 або більше разів . Коли ми пишемо функцію, необходимо дать ей имя и в дальнейшем, чтобы её вызвать в программе (з main() або з іншої функції), надо обратиться к ней по этому имени.

Мы уже встречали функции в предыдущих уроках. Это функции для строк (символьных массивов) strlen(), strcmp(), функция для генерации случайных чисел rand(). Ми їх застосовували в програмах і, например, передавали в функцию strlen() строку, а она нам возвращала количество символов в этой строке (ціле число). Это конечно происходило не волшебным образом, а функция принимала нашу строку, обрабатывала её и возвращала нам значение, которое подсчитала. Тобто хтось до нас написав цей самий код функції, которая считает длину строки и мы успешно ею пользуемся в своих программах. И эта функция здорово экономит наше время, сокращает количество строк кода и облегчает его читаемость.

Да – Тобто ці чудові стандартні бібліотечні функції, которые мы можем применять в своих программах, але в більшості випадків кожне нове завдання унікально і стандартні функції не завжди підійдуть. В С ++ програміст може самостійно написати власну функцію і застосовувати її з таким же успіхом, как и библиотечные функции.

До певного часу можна обходитися і без функцій. Замість цього плодити однаковий ділянку коду у всій програмі. Но если придется изменить этот код (усовершенствовать или что-то убрать из него), придется вносить изменения по всей программе. Лучше сразу освоить тему функций и активно применять.

Визначити функцію можна двома способами:

  • до main-функции;
  • після main-функции. В этом случае необходимо до main-функції оголосити прототип своєї функції.

У цій статті і наступних ми будемо користуватися другим способом, так як він є більш поширеним. Первый способ можно использовать, если функция одна и её код совсем небольшой. Пока мы пишем простые программы, такое встречается часто. Но для программ посложней, будем писать несколько функций которые будут состоять не из 2-3 строк, а побольше. Покажу вам как выглядит определение функции до main():

С использованием прототипа это будет выглядеть так:

Прототип функции размещен в строке 4, а её определение находится в самом низу программы в строках 20 – 25. Что касается выполнения программы: сначала компилятор прочтет прототип. Это даст ему знать о том, что где-то после main() располагается определение этой функции. Далі почнеться виконання головної функції main(). Выполняться она будет, поки компілятор не зустріне ім'я функції ourFunctionForPrint(). Тоді він знайде визначення цієї функції, которое расположено после main(), по имени, указанному в прототипе, виконає її код, после чего снова вернется к выполнению команд main-функции.

В итоге на экране увидим:

функції в с ++, функції c ++

Поговоримо про визначення функцій.

Функції в C ++ можуть не повертати ніяких значень (как в примере) и могут возвращать какое-либо значение. Якщо функція не повертає нічого, то це функція типу void.

Синтаксис функции, которая не возвращает значений:

функции c++, функции в с++

Имя функции следует давать придерживаясь правил для имен переменных. Єдине – желательно чтобы оно содержало глагол, так как функция выполняет действие. Наприклад якщо вона вважає середнє арифметичне можна дати назву calculateAverage, если выводит что-то на экран – showText. Имя должно говорить за себя, чтобы не пришлось оставлять лишние комментарии в коде.

Параметри (или аргументы функции) – это данные, які функція приймає і обробляє в тілі. Если функции не нужно ничего принимать для обработки, круглі дужки залишають порожніми. Згідно з правилами High Integrity C Coding Standard бажано не визначати функції з большім количеством параметров (больше 6).

Рассмотрим пару примеров с функциями, которые принимают параметры и не возвращают значений.

Принимает один параметр:

В 10-й строке кода функция получает параметр – ціле число 7. С ним (с этим числом) произойдет то, что описано в определении функции – строки 16 – 22. А именно – это число подставится в заголовок цикла for. вираз i < questionCount станет равнозначным i < 7 . В итоге мы увидим на экране 7 знаков вопроса.

функції в с ++, функції c ++

Приймає три параметра:

функції c ++, функції в с ++

Синтаксис функции, которая возвращает значение:

функции в с++, функции c++

Такие функции отличаются тем, что необходимо указать тип значения, которое вернет функция в результате своей работы. Сам возврат значения в программу оформляется оператором return и это значение программа получит в том месте, де функція була викликана . return может возвращать переменную, константу или результат выражения (например: return variable1 - variable2; ). У тілі функції можуть перебувати кілька операторів return. Тогда, работа функции завершится, якщо спрацює якийсь один з цих операторів. Наприклад:

Определение функции располагается в строках 28 – 34. Если пользователь введет +, сработает блок if в строке 30, а в ньому відповідно спрацює return d1 + d2; . После этого код функции уже не будет обрабатываться дальше. Компилятор вернется к выполнению main-функции.

функції c ++, функції в с ++

Вы наверное заметили, что в предыдущем коде названия параметров в прототипе и в самом определении функции отличаются от имен переменных, которые передаются в функцию из main. Справа в наступному – параметри у визначенні і прототипі функції формальні. Когда мы передаем переменные в виде параметров, функция будет работать не с оригиналами переменных, а з їх точними копіями. Эти копии создаются в оперативной памяти в момент вызова функции. Она работает с этими копиями, а по завершении работы, копии уничтожаются. Так что в прототипах вы можете использовать точные имена переменных, но функция в любом случае будет работать не напрямую с ними, а с их копиями. То есть сами переменные она не может изменить. Коли в наступних уроках ви познайомитеся з указателями і ссылками – узнаете, якомога змінити значення переданих змінних в тілі функції.

Еще немного о прототипе: прочитав его до main, компілятор отримує відомості про те, какой тип возвращаемого значения будет у функции (або вона взагалі не повертає значення – имеет тип void) и о том, какие параметры будут в неё переданы, в каком количестве и в какой последовательности.

прототип int calculateSomeDigits(int d1, int d2, char ч); говорить компілятору, что функция вернет на место её вызова целое число и о том, що при виклику в неї має бути передано два цілих числа і один символ. При виконанні функції, ми повинні передати їй стільки параметрів скільки вказано в її заголовку при визначенні. Передавати параметри необхідно в тому ж порядку, как они определены в круглых скобках за именем функции. Иначе возникнут ошибки при компиляции либо программа будет работать некорректно.

Синтаксис прототипа функции:

прототип функції в C ++

Если параметров несколько – вони повинні відокремлюватися комою. Легче всего объявить прототип – это скопировать из определения функции первую строку (заголовок) і після закриває круглої дужки додати крапку з комою.

функції в с ++, функції c ++, прототип функции

Имена переменных-параметров в прототипе можно не указывать. Следующий прототип равнозначен тому, что выше.

функції в с ++, функції c ++, прототип функции

На мой взгляд, все же лучше объявлять прототипы функций с указанием имён параметров. Особенно если параметров несколько и они имеют одинаковый тип. Для читаемости и понимания программы так будет лучше.

Чтобы закрепить то, о чём говорили в этой статье, надо попрактиковаться. Смотрите статью с задачами на функции в C . В ней вы так же найдете информацию о том, как передавать в функции массивы в виде параметров. Порада – не просто читайте, а пишите код! Желательно своими силами.

Видео по теме:

Следите за обновлениями на нашем сайте и делитесь ссылками на статьи с друзьями!

Нові уроки з програмування:

25 думки про "Функції в C++

  1. Ще в найперших уроках ви написали, що в кінці кожної програми треба писати return = 0 і додали, що в наступних уроках буде пояснено навіщо це робити і для чого взагалі кудись там повертати нуль. Я вважаю, що вже пора б виконати обіцянку. Поясніть будь ласка навіщо потрібен повернення і чому там може бути не тільки ноль.Спасібо заздалегідь.

    1. ))) Згідно з останніми стандартами С ++, вже можна не писати return 0; Програма та сама його поверне незалежно від того пропишемо ми це чи ні. Это значит, що вона (програма) відпрацювала і закрилася. А ось всілякі інші значення можна повертати для того, щоб відловлювати помилки в ході роботи програми. Наприклад запрограмувати в функції якась умова і якщо воно не виконається – повернути з функції значення -1 (або будь-яке інше), а якщо виконається повернути 1. Далі прописати умова, що якщо функція повернула -1 – значить сталася помилка. повернула 1 – можна продовжувати роботу (функція відпрацювала нормально).
      Можеш почитати наш урок по Виключенням в С ++: http://purecodecpp.com/archives/2044

    2. А return в кінці головної функції програми main(), доповню, повертає результат виконання усієї програми в операційну систему: 0 – успіх, не нульовий значення – щось в програмі сталося не так.

      1. Скрипт повинен реагувати на зміну кольору на екрані, але в рядку 11 де перша фігурна дужка autoit пише що не вдається розібрати рядок. Допоможіть будь-ласка

        Var х0 = 0, у0 = 0, х 1 = 100, Y 1 = 100; // фрагмент екрану від 0:0 до 100:100

        змінна = CRC0 ait.pixelChecksum(x0, y0, x1, y1);

        while(true)
        {
        WSH.sleep(500); // перевірка кожні 0.5 сек
        змінна стс = ait.pixelChecksum(x0, y0, x1, y1);
        if(CRC!= CRC0)
        {
        CRC0 = CRC;
        sapi.speak(“сигнал тривоги! Картина змінилася.”) // кричить людським голосом )
        }
        }

  2. Взагалі то, все що відноситься до специфіки відображення на екран, до C ++ взагалі не має ніякого стосунку, і на 100% визначається а).в якій це ви операційній системі … намагаєтеся, і б).в якому графічному інструменту, бібліотеці, Інструмент-се.

    І в залежності від цих варіантів а) і б) різних відповідей і підказок може бути мільйон.

  3. а) сімка, б) я не можу зрозуміти. Через програму autoit повинен запускатися цей скрипт. Допоможіть. Може є інша програма, яка виконує такі ж функції, Дайте посилання. Може є програма, яка реагує на певний звук?Теж дайте посилання якщо знаєте. Допоможіть будь ласка.

    1. 1. я не знаю що там в Windows 7 (та й не дуже хочу знати)
      2. питання ваш не відноситься жодним боком до програмування на C ++ … та й до програмування взагалі – це питання за конкретними програмами і їх використання.
      4. якщо у вас є конкретно сформульовані тих. питання (чого ви хочете?), та ще безвідносно до конкретно ОС Windows 7 (як взагалі вирішують такі проблеми?) то можете питати:
      https://toster.ru/my/feed – тут
      http://rus-linux.net/forum/index.php – або тут

  4. Спасибо за информацию! А как сделать библиотеку с функциами? Заранее спасибо( Извиняюсь за ошибки, если есть!) )

    1. Хорошо ли вы понимаете что вы хотите, когда говоритебиблиотека”?
      1. Вы можете создать отдельно компилируемый объектный файл, содержащий несколько ваших функций, и этот файл будет собираться вместе с вашим приложением.
      2. Вы можете создать статическую библиотеку, которая должна собираться вместе с вашим приложением.
      3. Вы можете создать динамическую библиотеку, разделяемую, DLL, которая должна подгружаться (системой) во время выполнения вашего приложения.

  5. Спасибо за информацию! А как сделать библиотеку с функциами? Заранее спасибо( Извиняюсь за ошибки, если есть!) ) Так как сообщение не получается отправить(типа сообщение уже отправлено) ТО немного дичи флдаолдфарфждшаролдарфра
    перепрошую!!!!!!!!!!!!!!

  6. Как можно присвоить результат функции переменной в основной функции?
    Для примера: одна функция при двукратном вызове вернула два результата.
    Как их возможно сравнить?
    Как эти результаты присвоить переменным в основной функции.?

    1. Ось так:

      Или даже просто вот так:

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>