В программировании на СИ нет особой сложности. Если разложить любую программу на минимальные части (операторы), то даже неподготовленный человек догадается, что делает конкретный оператор. Сложность только в понимании структуры программы.
Как выглядит программа на СИ изнутри?
Программа обрабатывает какие-то данные, следовательно, состоит она из данных и кода, который с ними работает. Данные могут поступать откуда угодно, иметь разные типы и быть преобразованы в иные данные. Программы, приносящие реальную пользу, могут иметь достаточно сложные алгоритмы и большой объем кода.
Любую программу можно описать в одном файле. Но насколько удобно будет работать с этим файлом самому программисту, если объем кода превысит хотя бы десять тысяч строк? Ведь часть кода взаимодействует с базой данных, часть — с пользователями, часть — ответственна за вывод информации. Поэтому программы принято разделять.
Так, одна программа может состоять из множества файлов, где каждый играет свою роль. Но как быть, если необходимость удалить лишние символы из строки возникает не только при работе с базой данных, но и в иных случаях? Последовательность одних и тех же операций может понадобиться в разных файлах программы.
Как быть, когда не хочется дублировать один и тот же код в нескольких местах? А если в алгоритм потребуется внести изменения, тогда их нужно также внести и в остальных частях программы?
Любую программу можно описать в одном файле. Но насколько удобно будет работать с этим файлом самому программисту, если объем кода превысит хотя бы десять тысяч строк? Ведь часть кода взаимодействует с базой данных, часть — с пользователями, часть — ответственна за вывод информации. Поэтому программы принято разделять.
Так, одна программа может состоять из множества файлов, где каждый играет свою роль. Но как быть, если необходимость удалить лишние символы из строки возникает не только при работе с базой данных, но и в иных случаях? Последовательность одних и тех же операций может понадобиться в разных файлах программы.
Как быть, когда не хочется дублировать один и тот же код в нескольких местах? А если в алгоритм потребуется внести изменения, тогда их нужно также внести и в остальных частях программы?
Функции приходят на помощь
Чтобы не дублировать код, за счет чего сократить общий его объем, создают пользовательские функции. Если предполагается, что какая-то часть кода будет использоваться в проекте повторно, тогда ее описывают в виде функции, которую можно вызывать произвольное количество раз в любых местах программы.
Как пишут на форуме программистов СИ https://www.cyberforum.ru/c/, разделение программы СИ на файлы и функции позволяет добиться той модульности, благодаря которой проектом становится легче управлять. Более того, над одним проектом могут работать несколько человек, и они не обязаны иметь представление о всем программном комплексе.
На каждую функцию ложится конкретная задача — вернуть необходимые данные из полученных. Возвращаемые данные могут использоваться другими функциями для дальнейшей обработки. Между функциями происходит некий обмен данными, и весь этот процесс можно представить как древовидную структуру.
Какая-то функция выполняет свою работу по нескольку раз, какая-то — всего один. Если она используется часто, ее выносят в отдельный файл, тем самым создавая свою библиотеку, которая понадобится при написании новых программ.
Когда полезная часть кода выражена в виде независимой функции, ее легко поддерживать. Например, со временем стало ясно, что алгоритм слишком медленный. В то же время известно, что функция должна вернуть определенный массив данных, который уже повсеместно используется в проекте. Тогда можно просто усовершенствовать работу функции, после чего изменения тут же распространятся на всю программу.
Функции не должны быть слишком универсальными, иначе в них теряется смысл. При их разработке нужно соблюдать золотую середину. Этот навык приходит только с опытом. Начинающие программисты допускают ошибку, когда сильно усложняют код функции, они фактически делают новую функцию зависимой от проекта, а для нового проекта им приходится переписывать код заново. Однако, новичкам в СИ могут помочь специализированные форумы https://www.cyberforum.ru/c-beginners/
Как пишут на форуме программистов СИ https://www.cyberforum.ru/c/, разделение программы СИ на файлы и функции позволяет добиться той модульности, благодаря которой проектом становится легче управлять. Более того, над одним проектом могут работать несколько человек, и они не обязаны иметь представление о всем программном комплексе.
На каждую функцию ложится конкретная задача — вернуть необходимые данные из полученных. Возвращаемые данные могут использоваться другими функциями для дальнейшей обработки. Между функциями происходит некий обмен данными, и весь этот процесс можно представить как древовидную структуру.
Какая-то функция выполняет свою работу по нескольку раз, какая-то — всего один. Если она используется часто, ее выносят в отдельный файл, тем самым создавая свою библиотеку, которая понадобится при написании новых программ.
Когда полезная часть кода выражена в виде независимой функции, ее легко поддерживать. Например, со временем стало ясно, что алгоритм слишком медленный. В то же время известно, что функция должна вернуть определенный массив данных, который уже повсеместно используется в проекте. Тогда можно просто усовершенствовать работу функции, после чего изменения тут же распространятся на всю программу.
Функции не должны быть слишком универсальными, иначе в них теряется смысл. При их разработке нужно соблюдать золотую середину. Этот навык приходит только с опытом. Начинающие программисты допускают ошибку, когда сильно усложняют код функции, они фактически делают новую функцию зависимой от проекта, а для нового проекта им приходится переписывать код заново. Однако, новичкам в СИ могут помочь специализированные форумы https://www.cyberforum.ru/c-beginners/
Общее представление о структуре
Типичная функция состоит из списка параметров, оператора возврата значения и тела. Она может и не иметь параметров, также может ничего не возвращать.
В параметры функции в качестве ее аргументов передаются данные, имеющие любой из доступных типов (int, string и пр.). В зависимости от языка программирования набор этих типов может отличаться, но не кардинально. Источником передаваемых данных может быть что угодно: переменные и константы, файлы, записи из базы данных, а также значения, возвращаемые другими функциями.
Приняв данные в качестве параметров, функция производит с ними какие-то действия, приводящие к образованию новых данных, которые она должна вернуть. Они так же должны иметь свой тип, и это указывается в объявлении функции. Например, если указано int, это значит, что она может вернуть только целое число.
И сколько бы аргументов с разными типами она ни принимала, возвращаемые значения могут быть лишь того типа, какого и сама функция. Однако в языках с нестрогой типизацией одна функция может возвращать данные разных типов.
Весь механизм работы функции описывается в ее теле. Переменные, объявленные в теле, имеют локальную область видимости, то есть они недоступны для кода за пределами тела. В теле могут вызываться и другие функции; так образуется иерархия вызовов.
Если от функции требуется вывести что-либо на экран или просто присвоить чему-либо значения, ее объявляют как void. Она не возвращает ничего.
Сегодня не очень модно говорить о функциях, так как на дворе эпоха объектно-ориентированного программирования — все говорят о методах. Но методы являются потомками функций, только более продвинутыми, и чтобы понять, как они работают, нужно начинать с основ.
В параметры функции в качестве ее аргументов передаются данные, имеющие любой из доступных типов (int, string и пр.). В зависимости от языка программирования набор этих типов может отличаться, но не кардинально. Источником передаваемых данных может быть что угодно: переменные и константы, файлы, записи из базы данных, а также значения, возвращаемые другими функциями.
Приняв данные в качестве параметров, функция производит с ними какие-то действия, приводящие к образованию новых данных, которые она должна вернуть. Они так же должны иметь свой тип, и это указывается в объявлении функции. Например, если указано int, это значит, что она может вернуть только целое число.
И сколько бы аргументов с разными типами она ни принимала, возвращаемые значения могут быть лишь того типа, какого и сама функция. Однако в языках с нестрогой типизацией одна функция может возвращать данные разных типов.
Весь механизм работы функции описывается в ее теле. Переменные, объявленные в теле, имеют локальную область видимости, то есть они недоступны для кода за пределами тела. В теле могут вызываться и другие функции; так образуется иерархия вызовов.
Если от функции требуется вывести что-либо на экран или просто присвоить чему-либо значения, ее объявляют как void. Она не возвращает ничего.
Сегодня не очень модно говорить о функциях, так как на дворе эпоха объектно-ориентированного программирования — все говорят о методах. Но методы являются потомками функций, только более продвинутыми, и чтобы понять, как они работают, нужно начинать с основ.