- 01. Функция одной переменной: способы задания, характеристики поведения. Примеры функциональных зависимостей
- Переменные
- Переменные
- Типы переменных
- Целые
- sizeof
- Типы с плавающей точкой
- Переполнение переменных
- Постфиксное обозначение типа
- Шестнадцатеричный и восьмеричный формат
- Экспоненциальная форма представления чисел
- Объявление переменных
- Начальное значение переменной
- Область видимости переменной
01. Функция одной переменной: способы задания, характеристики поведения. Примеры функциональных зависимостей
Точный математический анализ социально-экономических проблем всегда базируется на понятии функции. Функция — это правило, по которому элементы одного числового множества сопоставляются с элементами другого числового множества. Функции обозначаются как:
, где
х — аргумент функции, объясняющая или независимая переменная, у – значение функции, объясняемая или зависимая переменная.
Существуют четыре способа задания функции: табличный, графический, аналитический, алгоритмический. Некоторые из перечисленных способов задания функций (иногда говорят «функциональных зависимостей») будут рассмотрены ниже на конкретных примерах.
Пример 1: Результаты изучения сезонного спроса на некоторый товар приводятся в таблице.
Для каждого конкретного момента времени в таблице указывается значение спроса на товар в этот момент времени, то есть правило задано таблично.
Пример 2: Изучение спроса на некоторый товар в зависимости от изменения цены на него позволило построить следующую графическую зависимость:
Графический способ представления, как очевидно является наиболее удобным с точки зрения очевидности представления данных, но наименее удобным с позиций точности.
Пример 3. Расход продуктов питания Y в зависимости от доходов семьи Х может быть описан следующей зависимостью
Пример 4. Издержки по управлению товарными запасами У Складываются из затрат на хранение и затрат на доставку. В свою очередь каждое слагаемое зависит от объема товарной массы
Где А, b — коэффициенты, характеризующие условия хранения и поставки товара.
Пример 5: В микроэкономике, изучающей поведение потребителя на рынке товаров и услуг, широко используется функция полезности U. Для случая двух товаров, например, чая и кофе, она может иметь вид:
Здесь У1,У2 — объемы потребления каждого вида товара.
Приведённых примеров достаточно, чтобы сделать некоторые выводы.
Во-первых, Аналитические зависимости (формулы) совершенно различны, но все они состоят из конечного числа простых зависимостей, которые называют основными элементарными функциями.
На рис.1 показаны шесть основных элементарных функций (по порядку слева направо):
1. Линейная —
2. Квадратичная
3. Гипербола
4. Логарифмическая
5. Показательная
6. Степенная
Используемые на практике функции состоят из сочетаний нескольких элементарных и строятся по принципу «функция от функции». Например, пусть z = F(y). В свою очередь, переменная У также является функцией, зависящей от х — то есть у = F(x). Тогда говорят, что функция z является сложной функцией вида Z = F(f(x)).
Можно отметить, что функция может зависеть от одной переменной, тогда её можно изобразить на плоскости в виде графика в системе координат. Если аргумента два, как у функции полезности, то она может быть изображена на плоскости в виде совокупности линий уровня (см. рис.2).
Во-вторых, каждый из перечисленных способов задания функции не исключает любой другой. Они лишь дополняют друг друга. В одних задачах удобнее использовать аналитическую зависимость, а в других — графическую.
Кроме этого, можно отметить, что можно производить переход от одного способа представления функций к другому.
В-Третьих, функциональные зависимости полезны не только тем, что позволяют вычислить объясняемую переменную при заданных значениях объясняющих переменных, но и тем, что позволяют выявить качественные особенности описываемого явления.
Например, исследуем как изменяются затраты на продукты питания (см. пример 2), если доход увеличивается на величину Dх. Новое значение затрат определится как
Таким образом очевидно, что увеличение затрат на питание не зависит от дохода Х, а зависит лишь от прироста дохода Dх. Это означает, что, если индивид получал 800 руб. в месяц и его зарплата увеличится на 20 руб., то из этой величины он выделит дополнительно на питание 14 руб. То же самое сделает другой человек при зарплате 1600 руб. в месяц, если его зарплата также увеличится на 20 руб.
Источник
Переменные
Переменные
П еременные используются для хранения значений (sic!). Переменная характеризуется типом и именем. Начнём с имени. В си переменная может начинаться с подчерка или буквы, но не с числа. Переменная может включать в себя символы английского алфавита, цифры и знак подчёркивания. Переменная не должна совпадать с ключевыми словами (это специальные слова, которые используются в качестве управляющих конструкций, для определения типов и т.п.)
auto | double | int | struct |
break | else | long | switch |
register | typedef | char | extern |
return | void | case | float |
unsigned | default | for | signed |
union | do | if | sizeof |
volatile | continue | enum | short | while | inline |
А также ряд других слов, специфичных для данной версии компилятора, например far, near, tiny, huge, asm, asm_ и пр.
Например, правильные идентификаторы
a, _, _1_, Sarkasm, a_long_variable, aLongVariable, var19, defaultX, char_type
неверные
1a, $value, a-long-value, short
Си — регистрозависимый язык. Переменные с именами a и A, или end и END, или perfectDark и PerfectDarK – это различные переменные.
Типы переменных
Т ип переменной определяет
- 1) Размер переменной в байтах (сколько байт памяти выделит компьютер для хранения значения)
- 2) Представление переменной в памяти (как в двоичном виде будут расположены биты в выделенной области памяти).
В си несколько основных типов. Разделим их на две группы — целые и числа с плавающей точкой.
Целые
- char — размер 1 байт. Всегда! Это нужно запомнить.
- short — размер 2 байта
- int — размер 4 байта
- long — размер 4 байта
- long long — размер 8 байт.
Здесь следует сделать замечание. Размер переменных в си не определён явно, как размер в байтах. В стандарте только указано, что
Указанные выше значения характерны для компилятора VC2012 на 32-разрядной машине. Так что, если ваша программа зависит от размера переменной, не поленитесь узнать её размер.
Теперь давайте определим максимальное и минимальное число, которое может хранить переменная каждого из типов. Числа могут быть как положительными, так и отрицательными. Отрицательные числа используют один бит для хранения знака. Иногда знак необходим (например, храним счёт в банке, температуру, координату и т.д.), а иногда в нём нет необходимости (вес, размер массива, возраст человека и т.д.). Для этого в си используется модификатор типа signed и unsigned. unsigned char — все 8 бит под число, итого имеем набор чисел от 00000000 до 11111111 в двоичном виде, то есть от 0 до 255 signed char от -128 до 128. В си переменные по умолчанию со знаком. Поэтому запись char и signed char эквивалентны.
Тип | Размер, байт | Минимальное значение | Максимальное значение |
---|---|---|---|
unsigned char | 1 | 0 | 255 |
signed char ( char ) | 1 | -128 | 127 |
unsigned short | 2 | 0 | 65535 |
signed short ( short ) | 2 | -32768 | 32767 |
unsigned int ( unsigned ) | 4 | 0 | 4294967296 |
signed int ( int ) | 4 | -2147483648 | 2147483647 |
unsigned long | 4 | 0 | 4294967296 |
signed long ( long ) | 4 | -2147483648 | 2147483647 |
unsigned long long | 8 | 0 | 18446744073709551615 |
signed long long ( long long ) | 8 | -9223372036854775808 | 9223372036854775807 |
sizeof
В си есть оператор, который позволяет получить размер переменной в байтах. sizeof переменная, или sizeof(переменная) или sizeof(тип). Это именно оператор, потому что функция не имеет возможности получить информацию о размере типов во время выполнения приложения. Напишем небольшую программу чтобы удостовериться в размерах переменных.
(Я думаю ясно, что переменные могут иметь любое валидное имя). Эту программу можно было написать и проще
В си один и тот же тип может иметь несколько названий
short === short int
long === long int
long long === long long int
unsigned int === unsigned
Типы с плавающей точкой
- float — 4 байта,
- long float — 8 байт
- double — 8 байт
- long double — 8 байт.
Здесь также приведены значения для VC2012, по стандарту размер типов float Таб. 2 Размер типов с плавающей точкой в си.
Переполнение переменных
Си не следит за переполнением переменных. Это значит, что постоянно увеличивая значение, скажем, переменной типа int в конце концов мы «сбросим значение»
Вообще, поведение при переполнении переменной определено только для типа unsigned: Беззнаковое целое сбросит значение. Для остальных типов может произойти что угодно, и если вам необходимо следить за переполнением, делайте это вручную, проверяя аргументы, либо используйте иные способы, зависящие от компилятора и архитектуры процессора.
Постфиксное обозначение типа
П ри работе с числами можно с помощью литер в конце числа явно указывать его тип, например
- 11 — число типа int
- 10u — unsigned
- 22l или 22L — long
- 3890ll или 3890LL — long long (а также lL или Ll)
- 80.0f или 80.f или 80.0F — float (обязательно наличие десятичной точки в записи)
- 3.0 — число типа double
Экспоненциальная форма записи также по умолчанию обозначает число типа double.
Следующий код, однако, не будет приводить к ошибкам, потому что происходит неявное преобразование типа
Шестнадцатеричный и восьмеричный формат
В о время работы с числами можно использовать шестнадцатеричный и восьмеричный формат представления. Числа в шестнадцатиричной системе счисления начинаются с 0x, в восьмеричной системе с нуля. Соответственно, если число начинается с нуля, то в нём не должно быть цифр выше 7:
Экспоненциальная форма представления чисел
Э кспоненциальной формой представления числа называют представление числа в виде M e ± p , где M — мантиса числа, p — степень десяти. При этом у мантисы должен быть один ненулевой знак перед десятичной запятой.
Например 1.25 === 1.25e0, 123.5 === 1.235e2, 0.0002341 === 2.341e-4 и т.д.
Представления 3.2435e7 эквивалентно 3.2435e+7
Существеут и другое представление («инженерное»), в котором степень должна быть кратной тройке. Например 1.25 === 1.25e0, 123.5 === 123.5e0, 0.0002341 === 234.1e-6, 0.25873256 === 258.73256e-3 и т.д.
Объявление переменных
В си переменные объявляются всегда в начале блока (блок — участок кода ,ограниченный фигурными скобками)
При объявлении переменной пишется её тип и имя.
Можно объявить несколько переменных одного типа, разделив имена запятой
Здесь объявлены переменные a и b внутри функции main, и переменная z внутри тела цикла. Следующий код вызовет ошибку компиляции
Это связано с тем, что объявление переменной стоит после оператора присваивания. При объявлении переменных можно их сразу инициализировать.
int i = 0;
При этом инициализация при объявлении переменной не считается за отдельный оператор, поэтому следующий код будет работать
Начальное значение переменной
О чень важно запомнить, что переменные в си не инициализируются по умолчанию нулями, как во многих других языках программирования. После объявления переменной в ней хранится «мусор» — случайное значение, которое осталось в той области памяти, которая была выделена под переменную. Это связано, в первую очередь, с оптимизацией работы программы: если нет необходимости в инициализации, то незачем тратить ресурсы для записи нулей (замечание: глобальные переменные инициализируются нулями, почему так, читайте в этой статье).
Если выполнять эту программу на VC, то во время выполнения вылетит предупреждение
Run-Time Check Failure #3 — The variable ‘i’ is being used without being initialized.
Если нажать «Продолжить», то программа выведет «мусор». В многих других компиляторах при выполнении программы не будет предупреждения.
Область видимости переменной
П еременные бывают локальными (объявленными внутри какой-нибудь функции) и глобальными. Глобальная переменная видна всем функциям, объявленным в данном файле. Локальная переменная ограничена своей областью видимости. Когда я говорю, что переменная «видна в каком-то месте», это означает, что в этом месте она определена и её можно использовать. Например, рассмотрим программу, в которой есть глобальная переменная
Будет выведено
foo: 100
bar: 333
Здесь глобальная переменная global видна всем функциям. Но аргумент функции затирает глобальную переменную, поэтому при передаче аргумента 333 выводится локальное значение 333.
Вот другой пример
Программа выведет 555. Также, как и в прошлом случае, локальная переменная «важнее». Переменная, объявленная в некоторой области видимости не видна вне её, например
Этот пример не скомпилируется, потому что переменная y существует только внутри своего блока.
Вот ещё пример, когда переменные, объявленные внутри блока перекрывают друг друга
Программа выведет
30
20
10
Глобальных переменных необходимо избегать. Очень часто можно услышать такое. Давайте попытаемся разобраться, почему. В ваших простых проектах глобальные переменные выглядят вполне нормально. Но представьте, что у вас приложение, которое
- 1) Разрабатывается несколькими людьми и состоит из сотен тысяч строк кода
- 2) Работает в несколько потоков
Во-первых, глобальная переменная, если она видна всем, может быть изменена любой частью программы. Вы изменили глобальную переменную, хотите её записать, а другая часть программы уже перезаписала в неё другое значение (на самом деле это целый класс проблем, которые возникают в многопоточной среде). Во-вторых, при больших размерах проекта не уследить, кто и когда насоздавал глобальных переменных. В приведённых выше примерах видно, как переменные могут перекрывать друг друга, то же произойдёт и в крупном проекте.
Безусловно, есть ситуации, когда глобальные переменные упрощают программу, но такие ситуации случаются не часто и не в ваших домашних заданиях, так что НЕ СОЗДАВАЙТЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ!
Переменные могут быть не только целочисленными и с плавающей точкой. Существует множество других типов, которые мы будем изучать в дальнейшем.
Источник