birmaga.ru
добавить свой файл

1
1.4. Базовые типы данных Языка Си.

1.4.1. Идентификаторы.



Имена, которые присваиваются константам, типам данных, переменным и функциям называются идентификаторами. В Си следующие правила создания идентификаторов: должны начинаться с буквы (a...z,A...Z) или с подчеркивания (_), остальная часть идентификатора должна состоять из букв, подчеркиваний и/или цифр(0...9).
Компилятор Си рассматривает буквы верхнего и нижнего регистра как различные символы.
Идентификатор имени может быть любой длины, но распознаются первые 32 символа. Идентификатор начинается с латинской буквы или символа подчеркивания, последующие символы могут быть цифры, латинские буквы и символы подчеркивания.


1.4.2. Типизированные константы.
В Си используются константы, которые представляют собой имя, присваиваемое какой-либо величине. Типизированные константы бывают: целые, с плавающей запятой, символьные константы и символьные строки.
Описание констант начинается с ключевого слова const, далее тип и значение, например

const int NALOG=2;

1.4.3. Переменные.

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

1.4.3.1. Целые типы.
Целые числа представляются целыми типами. Целый тип - это обобщенный тип, представление которого зависит от операционной системы и типа процессора.

Целый тип

Размер

char

8 битовое целое -128…127

unsigned long

32 битовое целое без знака

Рассмотрим простой пример.


#include

#include

main()

{

const int Nalog= 2;

int Stavka;

int Symma;

int C;

Stavka = 300;

Symma = Stavka * Nalog;

printf("Symma naloga = %d\n",Symma);

C=getch();

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

В C++ существуют следующие основные типы вещественных чисел:

Вещественный тип

Размер

Float

32 битовое плавающее число


Long double

80 битовое плавающее число

Рассмотрим следующий пример.

#include

main()

{

const float Nalog= 0.7;

int Stavka;

float Symma;

Stavka = 325;

Symma = Stavka * Nalog;

printf("Symma naloga = %8.4f\n",Symma);

}
В данном примере вещественный тип представлен переменной Symma.
1.4.3.3. Символьные типы.
Символьный тип -Char предназначен для хранения одного символа, поэтому его размер - один байт.


Символьный тип

Размер

Unsigner char

8 бит без знака

Char

8 бит


Рассмотрим пример:
#include

main()

{

char A;

char B;

char C;

A = 'D';

B = '!';

printf("A= %c B= %c\n",A,B);

C = '*';

printf("C= %c\n",C);

}
В данном примере переменной A присвоено значение ‘D’, переменной B значение ‘!’, а переменной С присвоено значение символа ‘*’.

1.5. Основные операторы.
Операция присваивания.
Самой общей операцией является присваивание, например, с= a/b. В Си присваивание обозначается знаком равенства=, при этом значение справа от знака равенства присваивается переменной слева. Возможно, применять также последовательные присваивания, например: с = a = b
Арифметические операторы.
В Си выполняются следующие группы арифметических операций:
1.Бинарные: сложение(+), вычитание(-), умножение(*), деление(/), целочисленное деление(%) (для типа int получение остатка).
2.Унарные: унарный плюс (+), унарный минус (-), адресация (&), косвенная адресация (*), определение размера памяти типа (sizeof).
3.Логические:

&& конъюнкция AND

| | дизъюнкция OR

! отрицание NOT

4.Отношения:

a)равно (==), не равно(!=);

б) меньше чем (<), больше чем (>), меньше или равно (<=), больше или равно (>=);
5.Приращения (++) и уменьшения (--). Например, i++ обозначает, что i=i+1, а i-- обозначает i=i-1.
6.Побитовые операции - позволяют производить операции над битами.
n >> k сдвиг побитового представлетия n на к разрядов вправо

n << k сдвиг побитового представлетия n на к разрядов влево

n & k побитовая конъюнкция AND

n | k побитовая дизюнкция OR

! n побитовое отрицание NOT
7.Комбинированные операции. В Турбо-Си существуют сокращения при написании выражений, содержащих многочисленные операции:

a = a + b; сокращается до a += b;


a = a - b; сокращается до a -= b;

a = a * b; сокращается до a *= b;

a = a / b; сокращается до a /= b;

a = a % b; сокращается до a %= b;
8.Адресные операции:


  1. Операция определения адреса (&)

  2. Операция обращения по адресу (*).


Операция & возвращает адрес данной переменной; если Х является переменной типа int, то &Х является адресом (расположения в памяти) этой переменной. С другой стороны, если msg является указателем на тип char, то *msg является символом, на который указывает msg. Рассмотрим пример:

#include

main()

{

int X;

char *msg;

X = 6 + 1;

msg = "Привет\n";

printf(" X = %d &X = %p \n",X,&X);

printf("*msg = %c msg = %p \n", *msg, msg);

}

При печати в первой функции печатается два значения: значение X 7 и адрес X (назначаемый компилятором).

Во второй функции также печатается два значения: символ, на который указывает msg (П), и значение msg, которое является адресом этого символа (также назначен компилятором).

Старшинство операций в Си соответствует старшинству операций в математике.
Оператор запятая.
Для организации множественных выражений, расположенных внутри круглых скобок используется оператор запятая. Выражение внутри скобок вычисляется слева направо, и все выражение принимает значение, которое было вычислено последним. Например:
char X,Y;

(X = Y, Y = getch())
присваивает переменной X значение Y, затем считывает символ, вводимый с клавиатуры, и запоминает его в Y. Результатом всего выражения, в итоге, будет значение введенного с клавиатуры символа.

Операторы управления.
Оператор If... дает возможность в зависимости от условия выполнять ту или иную ветвь программы. Синтаксис оператора следующий:

if( условие ) выражение1 else выражение2;

Условие должно давать результат в виде логического значения истинности или ложности. Выражение1 будет выполняться если условие истинно. Выражение2 будет выполняться если условие ложно.
Существует сокращенный вариант оператора:
if( условие ) выражение1;
Пример. Определить, является ли введенное число днем недели, т.е. входит ли число в диапазон от 1 до 7.

#include

int A;

main()

{

printf("? ");

scanf("%d",&A);

if ((A < 1) || (A > 7))

printf("Error %d\n",A);

else

printf("OK %d\n",A);

}
Выражение условия (A<1) || (A>7) будет давать TRUE, если выполняется A<1 или A>7 - в этом случае выполняется ветка printf('Error ',A);, иначе ветка printf('OK ',A);.

Существует другой вариант записи оператора If ... Пример:

#include

main()

{

int y,t;

printf("? ");

scanf("%d",&t);

y = (t>0) ? t*10 : t-10; // if( t>0 ) y = t * 10; else y = t - 10;

printf("OK %d\n",y);

}
Оператор switch... case используется в случае, когда необходимо анализировать переменную и в зависимости от ее значения производить те или иные действия. Рассмотрим пример. С клавиатуры вводятся буквы латинского алфавиты. В зависимости от буквы произвести те или иные действия.
#include

char A;

main()

{

printf("? ");

scanf("%c",&A);

switch (A) {

case 'c': printf(" smoll %c\n",A);

break; /* выход из блока */

case 'F':

case 'G': printf(" big %c\n",A);

break;

default: printf("Error %c\n",A);

}

}

В данном примере если введен символ с, то выполняется printf(" smoll %c\n",A);, если вводится заглавные буквы F или G, то выполняется printf(" big %c\n",A);, если не один из рассмотренных символов не вводится, то выполняется printf("Error %c\n",A);.


Для повторения некоторого множества команд несколько раз можно использовать оператор do... while. Рассмотрим пример.
#include

main()

{

int A;

do {

printf("Zifra? ");

scanf("%d",&A);

printf("Error %d\n",A);

} while (!(A == 9));

printf("OK %d\n",A);

}
С клавиатуры вводится число. Выполняется оператор printf("Error %d\n",A);. Далее идет анализ - равно число 9 или нет, если не равно, снова выполняется тело цикла:

printf("Zifra? ");

scanf("%d",&A);

printf("Error %d\n",A).

Если число равно 9, то выполняется оператор printf("OK %d\n",A); и работа цикла заканчивается.
Главной особенностью оператора do... while является тот факт, что тело цикла, заключенное между операторами do и while выполняется хотя бы один раз, т.е. вначале выполняется тело цикла, а затем идет анализ условия.
Таким образом, смысл рассматриваемого оператора заключается в следующем: "Выполняй тело цикла до тех пор, пока истинно условие".
Оператор while... в отличие от do... while вначале анализирует условие, а затем выполняет тело цикла.

Пример.
#include

main()

{

int A;

A = 0;

while (A != 9)

{

printf("Zifra? ");

scanf("%d",&A);

printf("Error %d\n",A);

}

printf("OK %d\n",A);

}
В данном примере инициализирована переменная A:=0;. Это сделано, потому что вначале идет анализ равна она 9 или нет. Если не равна, то выполняется тело цикла. Смысл рассматриваемого оператора заключается в следующем:

«Пока истинно условие выполняй тело цикла».

Оператор for... используется когда известно сколько раз необходимо выполнить тело цикла, но этот оператор горазда гибче по сравнению с Паскалем. Рассмотрим пример.

#include


int A;

main()

{

for (A = 1; A <= 5; A++)

printf("Zifra %d\n",A);

}
В этом примере A хранит состояние счетчика цикла. Первоначально A:=1. Выполняется оператор printf("Zifra %d\n",A). Далее значение A увеличивается на единицу. Идет анализ A<=5 или нет. Если A больше 5, то цикл заканчивает работу. Если нет, то снова выполняется оператор printf("Zifra %d\n",A).
В следующем примере рассмотрим вариант оператора for..., когда начальное значение переменной больше конечного, а переменная во время работы цикла уменьшается на единицу.
#include

int A;

main()

{

for (A = 5; A >= 1; A--)

printf("Zifra %d\n",A);

}
Существует множество модификаций оператора for..., например:
- пустой оператор - для временной задержки:

for (n=1;n <=10000;n++)

; /* пустой оператор */
- использование различного шага:

for (n=1;n <=230;n=n+10)
- изменение переменных:

for (x=2;n*n <=476;n=5*x++)