Линейные алгоритмы. Переменные.

Стандарт С89 определяет пять базовых типов данных:

int – целочисленный тип, целое число;

float – вещественное число одинарной точности с плавающей точкой;

double – вещественное число двойной точности с плавающей точкой;

char – символьный тип для определения одного символа;

void – тип без значения.

Ряд компиляторов может поддерживать еще и логический тип _Bool. Тип void служит для объявления функции, не возвращающей значения, или для создания универсального указателя (pointer).

Объект типа char всегда занимает 1 байт памяти. Размеры объектов других типов, как правило, зависят от среды программирования и операционной системы.

Приведем модификаторы базовых типов данных. К ним относятся следующие спецификаторы, предшествующие им в тексте программы:

signed, unsigned, long, short

Базовый тип int может быть модифицирован каждым из перечисленных спецификаторов. Тип char модифицируется с помощью unsigned и signed, тип double – с помощью long.

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

Типы данных языка С

Тип данных

Типичный размер в битах

Минимально допустимый диапазон значений

char

8 (или 1 байт)

от –127 до 127

unsigned char

8

от 0 до 255

signed char

8

от –127 до 127

int

16 или 32

от –32767 до 32767

unsigned int

16 или 32

от 0 до 65535

signed int

16 или 32

от –32767 до 32767

short int

16

от –32767 до 32767

unsigned short int

16

от 0 до 65535

signed short int

16

от –32767 до 32767

long int

32

от –2147483647 до 2147483647

long long int

64

от –(263–1 ) до (263–1) для С99

signed long int

32

от –2147483647 до 2147483647

unsigned long int

32

от 0 до 4294967295

unsigned long long int

64

от 0 до (264–1) для С99

float

32

от 1Е–37 до 1Е+37 (с точностью не менее 6 значащих десятичных цифр)

double

64

от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр)

long double

80

от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр)

Для базового типа int возможны следующие записи с модификатором:

signed  или  signed int

unsigned  или  unsigned int

long  или  long int

short  или  short int

Для данных вещественного типа максимальные значения абсолютных величин представлены в таблице:

Вещественные типы данных языка С

Тип данных

Типичный размер в битах

Диапазон абсолютных величин

float

32

от 3.4Е–38 до 3.4Е+37

double

64

от 1.7Е–308 до 1.7Е+308

long double

80

от 3.4Е–4932 до 1.1Е+4932

В языке С предусматривается преобразование типов в выражениях и приведение типов. Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один тип. Во-первых, все char и short int значения автоматически преобразуются (с расширением "типоразмера") в тип int. Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением "типоразмера") в тип самого большого операнда. Этот процесс называется расширением типа (type promotion), причем он выполняется пооперационно. Например, если один операнд имеет тип int, а другой–long int, то тип int расширяется в тип long int. Или если хотя бы один из операндов имеет тип double, то любой другой операнд приводится к типу double. Это означает, что такие преобразования, как тип char в тип double, вполне допустимы (если предусматривать, к чему это приведет). После преобразования оба операнда будут иметь один и тот же тип, а результат операции – тип, совпадающий с типом операндов. Приведем последовательность преобразования типов в выражениях по старшинству

Спецификаторы формата для функции printf() перечислены в таблице:

Спецификаторы формата функции printf()

Код

Формат

%c

Символ

%d

Десятичное целое число со знаком

%i

Десятичное целое число со знаком

%e

Экспоненциальное представление числа (в виде мантиссы и порядка, е — на нижнем регистре)

%E

Экспоненциальное представление числа (в виде мантиссы и порядка, Е — на верхнем регистре)

%f

Десятичное число с плавающей точкой

%F

Десятичное число с плавающей точкой (только стандарт С99; если применяется к бесконечности или нечисловому значению, то выдает надписи INF, INFINITY(бесконечность) или NAN — Not A Number на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре)

%g

Использует более короткий из форматов %e или %f

%G

Использует более короткий из форматов %E или %F

%o

Восьмеричное число без знака

%s

Символьная строка

%x

Шестнадцатеричное без знака (строчные буквы)

%X

Шестнадцатеричное без знака (прописные буквы)

%p

Выводит указатель

%n

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

%%

Выводит знак процента

Спецификаторы формата функции scanf()

Код

Формат

%c

Читает один символ

%d

Читает десятичное целое число

%i

Читает целое число в любом формате (десятичное, восьмеричное или шестнадцатеричное)

%u

Читает десятичное целое число типа short int

%e

Читает число с плавающей точкой (и в экспоненциальной форме)

%E

Аналогично коду %e

%f

Читает число с плавающей точкой

%lf

Читает десятичное число с плавающей точкой типа double

%F

Аналогично коду %f (для стандарта С99)

%g

Читает число с плавающей точкой.

%G

Аналогично коду %g

%o

Читает восьмеричное число

%x

Читает шестнадцатеричное число

%X

Аналогично коду %x

%s

Читает строку

%p

Читает указатель

%n

Принимает целое значение, равное количеству прочитанных до сих пор символов

%[ ]

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

%%

Читает знак процента

 

Пример программы:

#include <stdio.h>

int main(){

       int i,k,t;

       printf("Введите число\n");

       scanf("%d",&i);

       k=2;

             t=k*i;

       printf("полученное число: %d\n",t);

       return 0;

}

Примет:

Если вы используете десятичные  дроби (например: 6.067):

#include <stdio.h>

float main(){

        float i,k,t;

       printf("Введите число\n");

       scanf("%f",&i);

       k=2.4;

             t=k*i;

       printf("полученное число: %f\n",t);

       return 0;

}

Операции языка СИ (C)

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

Операции выполняются в строгой последовательности. Величина, определяющая преимущественное право на выполнение той или иной операции, называется приоритетом. В табл. 2 перечислены различные операции языка СИ (C). Их приоритеты для каждой группы одинаковы (группы выделены цветом). Чем большим преимуществом пользуется соответствующая группа операций, тем выше она расположена в таблице. Порядок выполнения операций может регулироваться с помощью круглых скобок.

Таблица операции:

Знак операции

Назначение операции

( )

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

[ ]

Выделение элемента массива

.

Выделение элемента записи

->

Выделение элемента записи

!

Логическое отрицание

~

Поразрядное отрицание

-

Изменение знака

++

Увеличение на единицу

--

Уменьшение на единицу

&

Взятие адреса

*

Обращение по адресу

(тип)

Преобразование типа (т.е. (float) a)

sizeof( )

Определение размера в байтах

*

Умножение

/

Деление

%

Определение остатка от деления

+

Сложение

-

Вычитание

<<  

Сдвиг влево

>>  

Сдвиг вправо

<  

Меньше, чем

<=

Меньше или равно

>  

Больше, чем

>=

Больше или равно

= =

Равно

!=

Не равно

&

Поразрядное логическое "И"

^

Поразрядное исключающее "ИЛИ"

|

Поразрядное логическое "ИЛИ"

&&

Логическое "И"

||

Логическое "ИЛИ"

?:

Условная (тернарная) операция

=

Присваивание

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

Бинарные операции (например, а *= b
(т.е. a = a * b) и т.д.)

,

Операция запятая

Оператор в языке Си (C)

Для исключения путаницы в понятиях "операция" и "оператор", отметим, что оператор - это наименьшая исполняемая единица программы. Различают операторы выражения, действие которых состоит в вычислении заданных выражений (например: a = sin(b)+c; j++;), операторы объявления, составные операторы, пустые операторы, операторы метки, цикла и т.д. Для обозначения конца оператора в языке СИ (C)используется точка с запятой. Что касается составного оператора (или блока), представляющего собой набор логически связанных операторов, помещенных между открывающей ({) и закрывающей (}) фигурными скобками ("операторными скобками"), то за ним точка с запятой не ставится. Отметим, что блок отличается от составного оператора наличием определений в теле блока.

Характеристика основных операций языка Си (C)

Охарактеризуем основные операции языка СИ (C).

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

Сначала рассмотрим одну из них - операцию присваивания (=). Выражение вида

х = у;

присваивает переменной х значение переменной у. Операцию "=" разрешается использовать многократно в одном выражении, например:

x = y = z = 100;

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

Арифметические операции.

Логические операции и операции отношения.

Операции с битами.

Арифметические операции задаются следующими символами: +, -, *, /, % . Последнюю из них нельзя применять к переменным вещественного типа. Например:

a = b + c;
x = y - z;
r = t * v;
s = k / l;
p = q % w;

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

Логические операции отношения задаются следующими символами (см. табл. 2): && ("И"), || ("ИЛИ"), ! ("НЕ"), >, >=, <, <= , = = (равно), != (не равно). Традиционно эти операции должны давать одно из двух значений: истину или ложь. В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже приводится таблица истинности для логических операций.            

x

y

x&&y

x||y

!x

0

0

0

0

1

0

1

0

1

1

1

0

0

1

0

1

1

1

1

0

Битовые операции можно применять к переменным, имеющим типы int, char, а также их вариантам (например, long int). Их нельзя применять к переменным типов float, double, void (или более сложных типов). Эти операции задаются следующими символами: ~ (поразрядное отрицание), << (сдвиг влево), >> (сдвиг вправо), & (поразрядное "И"), ^ (поразрядное исключающее "ИЛИ"), | (поразрядное "ИЛИ").

Примеры: если a=0000 1111 и b=1000 1000, то

~a = 1111 0000,
a << 1 = 0001 1110,
a >> 1 = 0000 0111,
a & b = 0000 1000,
a ^ b = 1000 0111,
a | b = 1000 1111.

В языке предусмотрены две нетрадиционные операции инкремента (++) и декремента (--). Они предназначены для увеличения и уменьшения на единицу значения операнда. Операции ++ и -- можно записывать как перед операндом, так и после него. В первом случае (++n или --n) значение операнда (n) изменяется перед его использованием в соответствующем выражении, а во втором (n++ или n--) - после его использования. Рассмотрим две следующие строки программы:

a = b + c++;
a1 = b1 + ++c1;

Предположим, что b = b1 = 2, c = c1 = 4. Тогда после выполнения операций: a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1 = 5.

Широкое распространение находят также выражения с еще одной нетрадиционной тернарной или условной операцией ?: . В формуле

y = x ? a: b;

y = a, если x не равно нулю (т.е. истинно), и y = b, если х равно нулю (ложно). Следующее выражение

y = (a>b) ? a: b;

позволяет присвоить переменной у значение большей переменной (а или b), т.е. y = max(a, b).

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

 

Hosted by uCoz