ЛЕКЦИИ И МАТЕРИАЛ ДЛЯ ЭЭБ и ИСИТвЭ / Методичка по С
.pdfтельное, если же старший бит равен единице, – число отрицательное. Например, целое число +5 типа int будет храниться в памяти компьютера в виде
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
Если объявлено целое отрицательное число, то компилятор генерирует обратный код. Чтобы получить число –5 надо поменять значения всех битов на обратные, т.е. 0 заменить на 1, 1 заменить на 0 и прибавить к младшему биту 1. Число –5 в двоичной записи в обратном коде будет иметь вид
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
2.2. Основная форма объявления переменных
Здесь тип должен быть одним из существующих в C типов переменных, а список переменных может состоять из одной или нескольких переменных, разделенных запятыми. При объявлении переменных компилятор выделяет место в памяти компьютера, необходимое для размещения переменной указанного типа. Примеры объявления переменных
int a,b,c; float radius,length;
unsigned char ch1,ch2; long double integral;
Очень важное значение имеет вопрос о месте объявления переменной в программе. Правило, определяющее место объявления переменной в программе, называется правилом видимости.
В языке C могут быть три места, где переменная может быть объявлена. Во-первых, вне каких либо функций, в том числе и main(). Такая переменная называется глобальной и может использоваться в любом месте программы ( за исключением глобальных статических переменных, речь о которых далее). Во-вторых, переменная может быть объявлена внутри блока, в том числе внутри тела функции. Такая переменная называется локальной и может использоваться только внутри этого блока. Такая переменная неизвестна вне этого блока. Кроме того, переменная может быть объявлена как формальный параметр функции. Переменная, объявленная как формальный
11
параметр функции, используется для передачи информации этой функции, а также может рассматриваться как локальная переменная функции. Рассмотрим пример объявления переменных в разных местах программы
#include <conio.h> /* Пример 3 */ #include <stdio.h>
/* объявляем переменные в разных местах программы */ char ch; /* объявление глобальной переменной*/
main()
{
int n; /* объявление локальной переменной функции main() */ printf(“ Введите символ “);
ch=getche(); /* использование глобальной переменной */ printf(“ Введите количество символов в строке“); scanf(%d,&n) /* использование локальной переменной*/
print_str(n); /* обращение к функции посимвольной печати строки*/
}
print_str(int m) /* заголовок функции print_str() с объявлением формального параметра m*/
{
int j; /* объявление локальной переменной для функции print_str*/ for (j=0; j<m; j++) /* использование локальной переменной j*/ printf(“%c\n”,ch); /* использование глобальной переменной ch*/
}
При написании программ необходимо помнить следующие правила:
–две глобальные переменные не могут иметь одинаковые имена;
–локальная переменная одной функции может иметь такое же имя, как локальная переменная другой функции (или формальный параметр другой функции);
–две локальные переменные в одном блоке не могут иметь одинаковые имена, в том числе формальный параметр функции не должен совпадать с локальным параметром, объявленным в функции.
12
2.3.Константы
Вязыке C константы представляют фиксированные величины, которые не могут быть изменены в программе. Константы могут быть любого базового типа данных. Примеры констант
char |
‘a’, ‘\n’, ‘8’ |
int |
1, 134, -580 |
unsigned int |
52500 |
long int |
87000, -37, 7L |
short int |
11, 13, -128 |
float |
133.34, 3.36E-6, 5E+5 |
double |
133.34, 133340, -2.789 |
Правила определения типа констант следующие.
Целая константа относится к типу int, если эта константа входит в интервал значений типа int.
Если эта константа не ходит в интервал значений типа int, например 37750, то она считается константой типа unsigned. Если же константа не входит в интервал изменения unsigned, она считается константой типа long.
Константа с десятичной точкой считается константой типа double, если она помещается в соответствующий интервал измерения.
Для явного задания типа констант используется механизм суффиксов. В качестве суффиксов целочисленных констант используются u,l,h,U,L,H. Для чисел с плавающей точкой – l,L,f,F. Например
13h, 35H |
short int |
25L, -223l |
long int |
87lu 88Lu 89ul |
unsigned long |
55uh unsigned |
short |
27.43f 7.7E-6F |
float |
1.41l 3.2E+12L |
double |
В программировании важную роль играют восьмеричные и шестнадцатеричные константы. Перед шестнадцатеричной константой ставится пара 0x. Восьмеричная константа всегда начинается с нуля. Шестнадцатеричные и восьмеричные константы всегда являются беззнаковыми. В качестве цифр восьмеричных констант используются символы – 0,1,2,3,4,5,6,7. В качестве цифр шестнадцатеричных кон-
13
стант используются символы – 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. В табл. 2.2 представлено соответствие между десятичными и шестнадцатеричными числами, а также записями восьмеричных и шестнадцатеричных констант.
|
|
|
|
|
Таблица 2.2 |
|
|
|
Числа и константы |
|
|
||
|
|
|
|
|
|
|
Десятичное |
Шестнадцате- |
|
Двоичная |
Восьмеричная |
Шестнадцатеричная |
|
число |
ричное число |
|
запись числа |
константа |
константа |
|
|
|
|
|
|
|
|
0 |
0 |
|
0000 |
00 |
0× 0 |
|
|
|
|
|
|
|
|
1 |
1 |
|
0001 |
01 |
0× 1 |
|
|
|
|
|
|
|
|
2 |
2 |
|
0010 |
02 |
0× 2 |
|
|
|
|
|
|
|
|
3 |
3 |
|
0011 |
03 |
0× 3 |
|
|
|
|
|
|
|
|
4 |
4 |
|
0100 |
04 |
0× 4 |
|
|
|
|
|
|
|
|
5 |
5 |
|
0101 |
05 |
0× 5 |
|
|
|
|
|
|
|
|
6 |
6 |
|
0110 |
06 |
0× 6 |
|
|
|
|
|
|
|
|
7 |
7 |
|
0111 |
07 |
0× 7 |
|
|
|
|
|
|
|
|
8 |
8 |
|
1000 |
10 |
0× 8 |
|
|
|
|
|
|
|
|
9 |
9 |
|
1001 |
11 |
0× 9 |
|
|
|
|
|
|
|
|
10 |
A |
|
1010 |
12 |
0× A |
|
|
|
|
|
|
|
|
11 |
B |
|
1011 |
13 |
0× B |
|
|
|
|
|
|
|
|
12 |
C |
|
1100 |
14 |
0× C |
|
|
|
|
|
|
|
|
13 |
D |
|
1101 |
15 |
0× D |
|
|
|
|
|
|
|
|
14 |
E |
|
1110 |
16 |
0× E |
|
|
|
|
|
|
|
|
15 |
F |
|
1111 |
17 |
0× F |
|
|
|
|
|
|
|
|
Для представления в двоичном виде шестнадцатеричного числа надо просто заменить двоичной записью каждую цифру этого числа. Например, число 0xAC1F представимо в виде
A |
C |
1 |
F |
1010 |
1100 |
0001 |
1111 |
Строковые константы (strings) также играют в языке C важную роль. Строковая константа (строка) представляет собой набор символов, заключенный в двойные кавычки. Особенностью представления таких констант в памяти компьютера является то, что необходи-
14
мо отводить на один байт больше, чем требуется для размещения всех символов строки. Этот последний байт заполняется нулевым значением, называется нулевым байтом и имеет специальное обозначение ‘\0’.
Нельзя путать строковые константы с символьными константами. Так “b” – это строковая константа, содержащая одну букву, а ‘b’ – символьная константа, или просто символ. Отличие “b” от ‘b’ в том, что строка “b” содержит еще один символ ‘\0’ в конце строки, “b” занимает
впамяти 2 байта, в то время как ‘b’ – только один байт.
Вязыке C есть символьные константы, которые не соответствуют никакому из печатных символов. Так, в коде ASCII символы с номерами от нуля до 31 являются управляющими символами, которые нельзя ввести с клавиатуры. Для использования таких символов вводятся так называемые управляющие константы. Управляющие символы представлены в табл. 2.3:
Таблица 2.3
|
Управляющие символы |
|
|
|
|
Управляющий символ |
|
Значение |
|
|
|
\b |
|
BS, забой |
|
|
|
\f |
|
Новая страница, перевод страницы |
|
|
|
\n |
|
Новая строка, перевод строки |
|
|
|
\r |
|
Возврат каретки |
|
|
|
\t |
|
Горизонтальная табуляция |
|
|
|
\v |
|
Вертикальная табуляция |
|
|
|
\" |
|
Двойная кавычка |
|
|
|
\' |
|
Апостроф |
|
|
|
\\ |
|
Обратная косая черта |
|
|
|
\0 |
|
Нулевой символ, нулевой байт |
|
|
|
\a |
|
Сигнал |
|
|
|
\N |
|
Восьмеричная константа |
|
|
|
\xN |
|
Шестнадцатеричная константа |
|
|
|
\? |
|
Знак вопроса |
|
|
|
Если за символом обратной черты следует символ не из этой таблицы, то эта пара воспринимается просто как соответствующий символ.
15
2.4. Символьные переменные и строки
Символьная переменная – это величина размером в 1 байт, которая используется для представления литер и целых чисел в диапазоне от 0 до 255 или от –128 до 127, в зависимости от того, знаковая переменная или беззнаковая. Символьные константы заключаются в одинарные кавычки. Примеры символьных констант: ‘d’, ‘+’, ‘8’. Приведем пример программы с использованием символьных переменных и констант
#include < stdio.h > /* Пример 4 */ main()
{
char ch; ch=’c’; printf(“%c”,ch); ch=’+’;
printf(“%c%c”,ch,ch);
}
Вфункции prinf() появилась новая спецификация – %c. В таком формате печатается символ. Этот же формат можно использовать в функции scanf() для ввода символа с клавиатуры. В языке С в стандартной библиотеке ввода/вывода есть специальная функция getche(). Эта функция ожидает, пока не будет нажата какая-либо клавиша клавиатуры, и затем вводит код этой клавиши. Рассмотрим пример программы, использующей указанную функцию
#include < conio.h >
#include < stdio.h >
/* Пример 5 */ main()
{
char ch;
printf(“Нажмите любую клавишу”); ch=getche();
if ( ch == ‘a’) printf(“Вы нажали клавишу a\n”); printf(“ Вы нажали клавишу %c”,ch);
}
16
В языке C строка – это массив символов, заканчивающихся нулевым байтом. В языке C нет стандартного типа строка (в отличие от языка Pascal) и строка объявляется как одномерный массив символов, но для работы с массивом символов как со строкой имеется набор библиотечных функций. Одномерный массив – это упорядоченная последовательность данных одного типа. В программе одномерный массив символов объявляется как
char str[80];
В этом описании char – тип элементов массива, str – имя массива, в квадратных скобках указан размер массива – 80. Для обращения к отдельному элементу массива нужно указать после имени массива номер элемента в квадратных скобках, например – str[12]. В языке С все элементы массива нумеруются начиная с нуля, т. е. str[0] – первый элемент массива, str[2] – второй элемент массива, str[79] – 80-й элемент массива.
Следует помнить, что в С строка – это массив символов, заканчивающихся нулевым байтом, поэтому при объявлении массива, с которым необходимо работать как со строкой, следует зарезервировать место под нулевой байт. Например, если слово english – это символьная строка, то под нее нужно зарезервировать массив из восьми символов: семь для букв, один последний символ для нулевого байта.
Для чтения строки с клавиатуры необходимо создать символьный массив и затем использовать библиотечную функцию gets(). В качестве аргумента функции gets() используется имя массива, куда вводится строка. Функция gets() читает символы с клавиатуры до тех пор, пока не будет нажата клавиша Enter. Нажатие этой клавиши устанавливает в конец строки нулевой байт.
Пример программы, где используется ввод строки с клавиатуры
# include < stdio.h > /* Пример 6 */ main()
{
char str[80];
printf(“ Введите ваше имя “); gets(str);
printf(“ Ваше имя - %s”,str);
}
17
В данном примере используется спецификатор %s. Он предназначен для ввода/вывода строк.
2.5. Инициализация переменных
После того как переменная объявлена, ей в процессе выполнения программы должно быть присвоено значение. Язык С предоставляет возможность программисту присвоить значение переменной одновременно с процессом ее объявления. Основная форма инициализации переменной имеет вид
тип имя переменной = константное выражение; Например:
int a=230; char c=’c’, ch=’0’;
Объявление переменной с одновременной инициализацией ее значения приводит к тому, что одновременно с выделением памяти в эту память записывается значение инициализации. Глобальные или статические переменные всегда инициализируются либо нулем, либо значением инициализатора. Локальные переменные остаются неопределенными до первого присвоения им значения.
Глобальные переменные инициализируются только один раз в начале выполнения программы. Локальные переменные инициализируются при каждом вызове функции. В стандарте ANSI для С инициализировать можно только константным выражением. В реализации языка Borland C инициализировать можно не только константой, но и выражением с использованием значений переменных, которые были ранее определены (динамическая инициализация).
2.6.Операции
Всостав языка С входит большое число разнообразных операций. Знак операции в языке С – это некоторый символ или комбинация символов, которые сообщают компилятору о необходимости выполнить определенные арифметические, логические или другие действия. Каждая операция, кроме своего содержательного смысла, также определяется рядом характеристик: типы и число операндов, порядок своего выполнения, приоритет выполнения по отношению к другим операциям. Рассмотрим различные виды операций.
Арифметические операции. К арифметическим операциям относятся:
18
-вычитание и унарный минус; + сложение; * умножение; / деление;
% деление по модулю; ++ увеличение на единицу (инкрементация );
-- уменьшение на единицу (декрементация ). Операции сложения, вычитания, умножения и деления действуют
так же, как и в большинстве других языках программирования. Они могут применяться ко всем встроенным типам данных. Операции выполняются слева направо, т. е. сначала вычисляется выражение левого операнда, затем выражение, стоящее справа от знака операции. Если операнды имеют один тип, то результат арифметической операции имеет тот же тип. Поэтому, когда операция деления / применяется к целым переменным или символьным переменным, остаток отбрасывается. Операция деление по модулю % дает остаток от целочисленного деления. Такая операция может применяться только к целочисленным переменным.
Язык С предоставляет программисту еще две очень полезные и специфические операции – унарные операции ++ и —. Операция ++ прибавляет единицу к операнду, операция – вычитает единицу из операнда. Обе операции могут следовать перед операндом или после операнда (префиксная и постфиксная формы). Три написанные ниже оператора дают один и тот же результат, но имеют различие при использовании в выражениях
a=a+1; ++a; a++.
Рассмотрим программу, позволяющую понять это различие
# include < stdio.h > /* Пример 7 */ main()
{
int a=10; int b=70; a++; ++b;
printf(“a=%d b=%d\n”,a,b); printf(“a=%d b=%d\n”,a++,++b);
}
19
Результатом выполнения этой программы будет следующее:
a=11, b=71; a=11, b=72.
Значение переменной a не изменилось при втором обращении к функции printf(), а значение переменной b увеличилось на единицу. На самом деле значение переменной a также увеличилось на единицу, но уже после выхода из функции printf(). Различие в использовании префиксной и постфиксной форм состоит в следующем:
a++ – значение переменной a сначала используется в выражении, и лишь затем увеличивается на единицу;
++a – переменная a сначала увеличивается на единицу, а затем ее значение используется в выражении.
Старшинство арифметических операций следующее: ++, — - (унарный минус)
*, /, % +, -
Операции, одинаковые по старшинству, выполняются в порядке слева направо. Порядок следования операций можно изменить, используя в выражениях круглые скобки.
Операции отношения и логические операции. Операции отношения используются для сравнения. Полный список операций отношения в языке С следующий:
<меньше,
<= |
меньше или равно, |
>больше,
>= |
больше или равно, |
==равно,
!= |
не равно. |
Также имеется три логические операции:
&& и (AND) || или (OR) ! не (NOT).
Операции отношения используются в условных выражениях. Примеры условных выражений
x<1, 200>=199, ‘c’==’C’
20
