Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Здесь имя функции "printf", функция имеет два аргумента, первый - строка символов, второй - переменная num.

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

A = sin( x );

Если функция возвращает значение, то ее вызов можно использовать в различных операциях:

A = sin(x) * cos(y);

n = printf( "%d", k ) + 5;

Функции sin и cos возвращают вычисленные значения синуса и косинуса, а функция printf возвращает количество выведенных на экран байт.

Основная функция, описанная как void main ( void ), не принимает аргументов и не возвращает значения (void - пусто).

5.1.  Стандартная функция printf

Функция предназначена для вывода информации на стандартное устройство вывода (stdout), которым обычно является экран дисплея.

"printf" "(" формат { "," аргумент } ")"

Формат - это адрес строки символов, которая выводится в стандартное устройство вывода.

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

%d - для вывода целых чисел;

%c - для вывода образа символа, соответствующий аргумент должен содержать код символа;

%f - для вывода вещественного числа в виде целой и дробной части;

НЕ нашли? Не то? Что вы ищете?

%e - для вывода вещественного числа в виде мантиссы и порядка;

%g - для вывода вещественного числа в виде %f или %e в зависимости от значения числа;

%u - для вывода беззнакового целого числа в десятичной системе счисления;

%o - для вывода беззнакового целого числа в восмеричной системе счисления;

%x - для вывода беззнакового целого числа в шестнадцатеричной системе счисления;

%s - для вывода на экран символьной строки, соответствующий аргумент должен быть адресом строки (т. е. именем символьного массива или строковой константой).

Для дополнительного управления преобразованием данных используются модификаторы преобразования. Они записываются между символом % и спецификацией преобразования.

модификатор = ["-"] {цифра1} [ "." {цифра2} ][l]

Примеры спецификаций преобразований с модификаторами:

%-20.6lf, %6d, %8.4f

Если присутствует "минус", то данные выравниваются по левой колонке поля, отведенного для вывода числа. Ширина этого поля определяется числом, составленным из цифр поля <цифра1>. Для вещественных чисел можно дополнительно задавать число знаков после запятой с помощью числа, составленного из цифр <цифра2>. Буква l в конце модификатора обозначает преобразование для длинных типов данных, т. е. long, unsigned long и double.

Функция printf возвращает число успешно выведенных байт информации.

Пример:

double a=-78.98;

int c=24;

printf("a=%8.4lf, c=%6d",a, c);

На экране:

a=-78.9800,с= 24

5.2.  Стандартная функция scanf

Функция предназначена для ввода информации со стандартного устройства ввода (stdin), которым обычно является клавиатура.

"scanf" "(" формат { "," аргумент } ")"

Пример:

scanf( "%d", &n );

Перед именем аргумента функции подставляется знак &, который делает переменную n доступной для изменения. Строго говоря, операция & означает получение адреса объекта данных, т. е. мы сообщаем функции scanf информацию о том, где находится ячейка, в которую необходимо занести данные. При использовании функции scanf совместно с данными типа int, long, float, double, перед именем переменной всегда должен стоять знак &. При использовании функции для ввода символьной строки знак & не нужен, т. к. имя массива символов и так означает адрес.

Например:

char name[41];

scanf( "%s", name );

Функцию scanf рекомендуется использовать без лишних символов в формате, иначе может возникнуть непредсказуемая ситуация.

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

Функция scanf возвращает число успешно прочитанных элементов данных. Это свойство можно использовать для проверки правильности ввода.

Функцию scanf нужно использовать совместно с printf для вывода подсказки.

Например:

printf( "Введите ваше имя ");

scanf("%s", name );

6.  Операции и выражения

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

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

6.1.  Простейшие арифметические операции

Определены для данных арифметических типов, т. е. вещественных (float, double) и целых (int, short, long, char и соответствующих им беззнаковых данных unsigned int, unsigned short, unsigned long, unsigned char).

Действие этих операций - соответствующее арифметическое действие. Результат операции - результат арифметического действия.

Одноместные арифметические операции имеют один операнд. К ним относятся операции "+" и "-", которые меняют знак операнда.

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

Двуместные арифметические операции имеют два операнда. К ним относятся операции + , - , * , / и % . Каждая из этих операций выполняет соответствующее действие, результат которого и является результатом операции. Операция + вычисляет сумму операндов, операция - вычисляет разность, операция * вычисляет произведение, операция / вычисляет частное от деления вещественных операндов или целую часть частного от деления целых операндов, операция % вычисляет остаток от деления первого операнда на второй.

Арифметические операции в выражениях выполняются слева направо в соответствии с общепринятыми приоритетами. Приоритет можно изменить с помощью скобок.

Примеры выражений с арифметическими операциями:

a + b%c

(a + b)/3*5

6.2.  Операция присваивания

Операция присваивания выполняет действия по занесению результатов выражения, стоящего справа от знака присваивания = в область памяти, определяемую выражением, стоящим слева от знака присваивания. Чаще всего слева от знака присваивания стоит простая переменная. При выполнении присваивания происходит преобразование типа результата правого выражения к типу левого операнда.

Результат операции присваивания - значение присвоенной величины.

Поскольку присваивание является операцией, а не оператором, то в одном выражении допускается несколько присваиваний. В этом случае они выполняются справа налево

Например:

ab = ( c = d+5 ) * 6

Присваивание имеет самый низкий приоритет из всех операций.

6.3.  Оператор-выражение

Выражение, оканчивающееся точкой с запятой, является оператором, т. е. наименьшей элементарной частью программы.

оператор = выражение ";"

Пример:

ab = ( c = d + 5 ) * 6; /* это оператор */

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

6.4.  Использование в выражениях операндов разных типов

При участии в арифметических операциях операндов разных типов, перед выполнением операции осуществляется преобразование типов так, чтобы не было потери точности. Затем осуществляется сама операция.

Типы данных в порядке возрастания точности:

char, short, int, long, float, double.

Пример:

int a, c;

float d, e;

e = d*(c+e); /* c будет преобразовано в float */

a = 'A' + 20; /* 'A' будет преобразовано в int */

6.5.  Операции преобразования типов

В некоторых случаях правила преобразования типов не позволяют получить верный результат, например:

int a, b;

float c;

a = 7; b = 14;

c = a/b; /* результат 0 */

Для получения правильного результата можно поступить так

c = a; c = c/b;

А можно применить операцию преобразования типа:

преобразование_типа = "("имя_типа ")" выражение

имя_типа - название любого типа, в том числе и заданного программистом.

Для нашего примера применение операции преобразования типа будет выглядеть так:

c = (float)a / (float)b;

Операция преобразования типа имеет приоритет более высокий, чем арифметическая операция.

6.6.  Стандартные математические функции

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

При использовании этих функций в программу необходимо включить файл <math. h>, т. е. необходимо использовать директиву #include <math. h> . При этом будут определены следующие функции:

sin(x) - синус (аргумент в радианах);

cos(x) - косинус (аргумент в радианах);

tan(x) - тангенс (аргумент в радианах);

asin(x) - арксинус (результат в радианах);

acos(x) - арккосинус (результат в радианах);

atan(x) - арктангенс (результат в радианах);

sinh(x) - гиперболический синус;

cosh(x) - гиперболический косинус;

tanh(x) - гиперболический тангенс;

log10(x) - десятичный логарифм;

pow10(x) - возведение числа 10 в степень x;

log(x) - натуральный логарифм;

exp(x) - экспонента;

sqrt(x) - квадратный корень;

pow(x, y) - возведение x в степень y;

fabs(x) - абсолютная величина для double;

abs(x) - абсолютная величина для int.

6.7.  Простейшие функции, определяемые программистом

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

заголовок_функции =

тип имя_функции"("[тип параметр {"," тип параметр}]")"

Например, заголовок функции вычисления котангенса:

double cotan ( double x )

За заголовком функции должно следовать тело функции, т. е. операторы, реализующие функцию. При этом они оформляются подобно операторам основной программы, т. е. тело функции начинается с "{" и заканчивается "}".

Для возврата в вызывающую функцию и для передачи ей вычисленного значения используется оператор return.

"return " [выражение];

Выражение должно быть того же типа, что и тип функции. Его значение будет передано вызывающей программе в качестве значения функции. Например, функцию для вычисления котангенса можно записать так:

double cotan( double x )

{

double ctg;

ctg = 1.0 / tan(x);

return ctg;

}

или

double cotan( double x )

{

return 1.0 / tan(x);

}

После того как функция определена, она может быть использована, так же как и стандартные функции Си, например можно записать:

a = b * cotan(c);

При этом значение c будет передано функции в качестве параметра x, затем будет вычислено выражение 1/tan(x) и передано в вызывающую программу в качестве значения функции cotan.

В функциях могут находится любые операторы языка и в любом количестве.

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

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

6.8.  Дополнительные арифметические операции

Язык Си имеет ряд уникальных операций, как правило, отсутствующих в других языках программирования. К этим операциям относятся операция увеличения на единицу ++ и операция уменьшения на единицу. Например:

a = a + 1; эквивалентно a++; или ++a;

Выполнение операций "++" или "--" вызывает увеличение или уменьшение на единицу значения соответствующей переменной.

Результат операций может быть различным в зависимости от того, где находятся знаки операций: если используется постфиксная операция, т. е операция ++ или -- записана после переменной, то результатом операции будет значение переменной до увеличения или уменьшения. Иными словами переменная сначала используется в выражении, а затем увеличивается или уменьшается. Например:

a = 4;

b = ( a++ ) * 5; /* здесь b = 20 */

Если используется префиксная операция, т. е. операция ++ или -- записана перед переменной, то результат операции - значение переменной после увеличения или уменьшения. Иными словами переменная вначале увеличивается или уменьшается, затем используется в выражении. Например:

a = 4;

b = ( ++ a ) * 5; /* здесь b = 25 */

Приоритет операций выше, чем у * или /, но все равно рекомендуется ставить скобки, чтобы не запутаться.

6.9.  Дополнительные операции присваивания

Очень часто в программах присутствуют операторы вида

a = a + b;

a = a - b;

a = a * b;

a = a / b;

Они изменяют значения некоторых переменных. В языке Cи для сокращения программ и повышения их эффективности используются дополнительные операторы присваивания:

a += b;

a -= b;

a *= b;

a /= b;

a %= b;

Дополнительные операции присваивания должны быть записаны слитно, без пробелов. Действие операции - изменение значения переменной, стоящей слева от знака операции. Результат - значение измененной переменной.

Дополнительные операции присваивания имеют самый низкий приоритет и выполняются справа налево.

Использование операций ++, --, +=, , , /=, %= вместо обычных не является обязательным, но их применение считается хорошим стилем программирования на языке Cи.

6.10.  Битовые операции

Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит, т. е. последовательность нулей и единиц. Например, любое число типа int будет занимать 2 байта в памяти, т. е 16 бит. Его можно рассматривать двояко: либо как целое число ( так и делается при выполнении операций *,/, +, - , % ), либо как последовательность бит, что возможно при использовании битовых операций.

Битовые операции выполняются независимо над каждым битом данных. Если операция двуместная, то она выполняется над соответствующими битами операндов.

В Си имеются следующие битовые операции:

~ битовое отрицание (одноместная),

& побитовое "и" (двуместная),

^ побитовое "исключающие или" (двуместная),

| побитовое "или" (двуместная).

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

Результаты битовых операций

op1

op2

~op1

op1 & op2

op1 ^ op2

op1 | op2

0

0

1

0

0

0

0

1

1

0

1

1

1

0

0

0

1

1

1

1

0

1

0

1

Рассмотрим несколько примеров.

Первый пример показывает, как с помощью операции | можно установить в единицу выбранные биты операнда:

/* a = = 9 */

char a, b; /* = 26 */

a = 9; /* */

b = a | 26 /* b = 31 */ /* b = = 31 */

Следующий пример показывает, как с помощью операции & можно обнулить старшую часть байта:

char a, b; /* a = = 45 */

a = 45; /* */

b = a & 0x0F; /* */

/* b = = 13 */

К битовым операциям относятся операции сдвига << и >> :

a << b сдвиг битов переменной a влево на b позиций,

a >> b сдвиг битов переменной a вправо на b позиций.

Например:

char a, b;

a = 26; /* a = = 26 */

b = a << 2; /* b = = 104 */

Сдвиг влево равносилен умножению на 2 в соответствующей степени. Сдвиг вправо - делению на 2 в соответствующей степени.

Все битовые операции выполняются слева направо. В следующей строке приведены битовые операции в порядке уменьшения их приоритета.

~, << >>, &, ^, |

Для двуместных битовых операций определены дополнительные операции присваивания:

a <<= b; эквивалентно a = a << b,

a >>= b; эквивалентно a = a >> b,

a &= b; эквивалентно a = a & b,

a ^= b; эквивалентно a = a ^ b,

a |= b; эквивалентно a = a | b.

6.11.  Операции отношения

Представляют собой двуместные операции, предназначенные для сравнения операндов. В языке Си имеются шесть операций отношения:

> больше,

< меньше,

>= больше или равно,

<= меньше или равно,

== равно,

!= не равно.

Действие операций отношения заключается в сравнении первого и второго операнда. Если операнды не удовлетворяют условию отношения, то результат операции равен нулю, т. е. условие ложно. Если операнды удовлетворяют условию отношения, то результат отношения не равен нулю, т. е. условие истинно.

Например:

int a, b;

a = 5;

b = ( a + 5 <= 4 ); /* b = 0 */

Из сказанного выше следует, что в языке Cи отсутствует специальный логический тип данных. Его заменяет целый тип, причем логическому понятию "ложно" соответствует значение 0, а логическому понятию "истина" - любое отличное от 0 целое число.

Операции отношения выполняются слева направо. При нечетком понимании их действия возможно получение, вообще говоря, неверного результата. Например, с точки зрения синтаксиса языка Си выражение a<x<b записано совершенно правильно, но действия, выполняемые в соответствии с ним будут отличаться от принятых в математике: сначала будет вычислено выражение a<x, которое даст результат 0 или 1, а затем этот результат будет сравниваться с b.

Чтобы это выражение соответствовало математическому смыслу, его нужно разбить на две части a < x и x < b и связать его логической операцией && ("и"), т. е. (a < x) && (x < b). Такая запись читается так : если a меньше x и x меньше b, то результат - истина.

6.12.  Логические операции

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

! логическое отрицание (одноместная),

&& логическое "и" (двуместная),

|| логическое "или" (двуместная).

В отличие от битовых операций, логические операции выполняются не над битами, а над значениями операндов. Результаты логических операций определяются следующей таблицей:

Результаты логических операций

op1

op2

!op1

op1 && op2

op1 || op2

0

0

не 0 (1)

0

0

0

не 0 (1)

не 0 (1)

0

не 0 (1)

не 0 (1)

0

0

0

не 0 (1)

не 0 (1)

не 0 (1)

0

не 0 (1)

не 0 (1)

Логические операции выполняются слева направо, причем для двуместных операций второй операнд может не вычисляться, если значение первого операнда однозначно определяет значение операции. Это происходит в том случае, если первый операнд для && равен 0 (результат операции тоже 0) и если первый операнд для || не 0 (результат операции тоже не 0).

6.13.  Операция определения размера данных

В некоторых случаях совершенно необходимо иметь возможность определять размеры данных, создаваемых пользователем. Это позволяет писать программы, независимые от компьютера, на котором они выполняются, а также упростить процедуру внесения корректировок в программы. Для определения размера данных в языке Си используется операция sizeof. Первая форма операции выглядит следующим образом:

"sizeof(" тип ")"

Результат этой формы операции - размер данного соответствующего типа в байтах, например, sizeof(float) даст в результате 4.

Вторая форма операции выглядит следующим образом:

"sizeof " имя_данного

Результат этой формы операции - размер памяти, отведенной под соответствующее данное в байтах, например, после описания массива символов char name[40];, операция sizeof name даст в результате 40.

6.14.  Приоритеты операций

Приоритеты и направление рассмотренных выше операций сведены в следующую таблицу. Операции одинакового приоритета объединены в группы, чем выше положение группы в таблице, тем выше приоритет операций группы.

Таблица приоритетов рассмотренных выше операций

Операции одного приоритета

Направление выполнения операции.

! ~ ++ -- (тип) sizeof

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

= *= /= %= += -= <<= >>= &= ^= |=

7.  Программирование алгоритма линейной структуры на языке Си

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7