Серия статей на основе Harvard CS50: Introduction to Computer Science Course by David J. Malan

Функции

Что такое Функции?

Функции — это черный ящик с набором из нуля или более входов и одним выходом. Внутри черный ящик каким-то образом обрабатывает входные данные и дает один выход. Это называется черным ящиком, потому что нам не нужно знать лежащую в его основе реализацию. Вот почему большинство функций имеют понятные, очевидные названия и хорошо документированы.

Зачем использовать функции?

Функции позволяют нам организовывать вещи и разбивать очень сложную проблему на гораздо более управляемые части. Функции также позволяют нам упростить процесс кодирования. Легче отлаживать 10-строчные функции по сравнению со 100-строчными, что значительно упрощает процесс программирования. Наконец, с помощью функций мы можем повторно использовать эти различные части. Функции могут быть переработаны; можно использовать в той или иной программе.

Объявления функций

Первое, что мы делаем, это объявляем функцию. Когда мы объявляем функцию, мы сообщаем компилятору о функциях и их работе. Обычно мы помещаем все объявления функций в самый верх кода. Существует очень стандартная форма, которой следует каждое объявление функции. Объявление функции состоит из трех частей: тип возвращаемого значения, имя и список аргументов.

Определения функций

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

Открытая фигурная скобка означает, что теперь мы начинаем определять, что происходит внутри черного ящика, который мы решили назвать возвращаемым типом (mult_two_reals). Мы могли бы объявить новую переменную типа float с именем product. Затем присвойте этой переменной значение x, умноженное на y, и верните произведение. Возврат — это то, как мы указываем, как мы передаем вывод обратно.

Вызовы функций

Чтобы начать использовать функции, которые мы объявили и определили, нам нужно вызвать функцию. И для этого мы просто передаем ей соответствующие аргументы и присваиваем возвращаемое значение этой функции какому-то правильному типу.

Переменные и область видимости

Область действия переменной

Область действия — это характеристика переменной, определяющая, из каких функций можно получить доступ к этой переменной. В C есть две основные области видимости: локальные переменные и глобальные переменные. Доступ к локальным переменным возможен только внутри функций, в которых они созданы. С другой стороны, к глобальным переменным может обращаться любая функция в программе.

Различие области видимости переменной

Локальные переменные в C передаются по значению, когда мы делаем вызов функции. Когда переменная передается по значению, вызываемый объект (функции, получающие переменную, передаются в качестве входных данных) не получает саму эту переменную. Он получает свою собственную копию для работы. Это означает, что переменная в вызывающем объекте не изменится, если мы не перезапишем ее. В то время как с глобальными переменными, когда мы манипулируем глобальной переменной в одной функции, эффект этой одной функции распространяется на все остальные функции.

Проблемы с переменной областью видимости

Область видимости переменных, как правило, не представляет большой проблемы, если мы называем все наши переменные разными именами. Но это может стать неприятно, если одно и то же имя переменной появляется в нескольких функциях, что часто происходит в реальном мире, когда вы работаете над совместными программами и людьми в разных командах. Они будут часто повторно использовать имена переменных, особенно распространенные, такие как x, y, i , j, и так далее. Но когда переменные имеют одно и то же имя, проблемы с областью действия могут стать немного сложнее для анализа.

Массивы

Что такое массивы?

Массивы — это фундаментальная структура данных для любого языка программирования, который мы будем использовать. Мы используем массивы для хранения значений одного и того же типа данных в смежных ячейках памяти. Это способ, с помощью которого мы можем сгруппировать группу целых чисел в памяти или группу символов или чисел с плавающей запятой в памяти близко друг к другу и работать без переименования каждого из них.

В C элементы массива индексируются с 0, а не с 1. Вот почему программисты часто считают с 0, потому что индексация массива C всегда начинается с 0. Если массив состоит из n элементов, первый элемент расположен по индексу 0. А последний элемент расположен по индексу (n-1). C не помешает нам выйти за пределы нашего массива. Это не остановит компиляцию нашей программы, но мы можем столкнуться с ужасной ошибкой сегментации, если начнем доступ к памяти за пределами того, что мы просили нашу программу предоставить нам.

Объявления массива

Объявление массива очень похоже на объявление переменной, которое представляет собой просто тип и имя. Элемент размера является особым случаем для массива, потому что мы получаем их кучу одновременно.

Размеры массива

Массивы не ограничены одним измерением. На самом деле мы можем иметь столько спецификаторов сторон, сколько пожелаем. Например, если мы хотим создать настольную игру для игры «Морской бой», которая представляет собой игру, в которую играют с привязками на сетке 10 на 10, мы можем создать такой массив.

Использование массивов

Мы можем рассматривать каждый отдельный элемент массива как переменную, но мы не можем рассматривать сами целые массивы как переменные. Например, мы не можем присвоить один массив другому массиву с помощью оператора присваивания; это недопустимо в C. Вместо этого мы должны использовать цикл для копирования каждого отдельного элемента по одному.

Аргументы командной строки

За «int main (void)»

Большинство наших программ начинались с int main (void). Мы собирали пользовательский ввод с помощью внутрипрограммных подсказок, нам не нужно было изменять это объявление main (). У пользователей есть другой способ предоставлять данные нашей программе во время выполнения, а не пока выполняется программирование, нам нужна новая форма объявления main. Мы не можем использовать int main (void), если хотим собрать другие данные в командной строке.

Сбор аргументов командной строки

Чтобы получить эти аргументы командной строки от пользователя, измените объявление main, чтобы оно выглядело следующим образом.

Argc в аргументах командной строки

Argc обозначает количество аргументов, это переменная целочисленного типа, в которой будет храниться количество аргументов командной строки, введенных пользователем при выполнении программы.

Мы знаем это, потому что способ, которым определяется разделение между строками, есть ли между ними пробел или табуляция. Таким образом, любое количество так называемых пробелов между значениями, введенными в командной строке, указывает на их количество.

Argv в аргументах командной строки

Argv обозначает вектор аргумента (массив), представляет собой массив, в котором хранятся строки, по одной строке на элемент. Это строки, которые пользователь на самом деле ввел в командной строке при выполнении программы. Первый элемент argv всегда находится в argv [0] как первый индекс массива argv. В то время как последний элемент argv всегда находится в argv [argc-1]

argv[3] мы выходим за границы нашего массива. Компилятор позволит нам это сделать, в этом нет интуитивной проблемы. Но с точки зрения того, что на самом деле произойдет, мы на самом деле не знаем. Это зависит от того, что находится в памяти, где должны быть argv[3]. Так что мы могли бы уйти безнаказанными. Скорее всего, особенно когда мы работаем с argv, а не с ним. Мы, вероятно, столкнемся с ошибкой сегментации, поэтому не выходите за границы массивов, особенно argv.