1.44M
Category: programmingprogramming

Лекция 3_ОАИП_2020

1.

Основные элементы языка
Лекция №3 по курсу «ОАИП»
20.09.2024
Романькова Т.Л.
1

2.

Структура программы
• Любая программа на языке С состоит из одной или более
функций. Тело обрамляется фигурными скобками, между
которыми идет набор инструкций.
• Простейшим строительным элементом программы на Си
являются инструкции (операторы, statements). Каждая
инструкция выполняет определенное действие. В конце
инструкций в языке Си ставится точка с запятой (;)
• Директива препроцессора "include" определяет, какие файлы
надо включить в данном месте в текст программы. Каждая
директива препроцессора размещается на одной строке и
должна начинаться со знака решетки #.
При компиляции исходного кода вначале срабатывает препроцессор, который
сканирует исходный код на наличие строк, которые начинаются с символа #.
Эти строки расцениваются препроцессором как директивы.
20.09.2024
Романькова Т.Л.
2

3.

• Программа может сопровождаться комментариями для
пояснения текста программы, характеристики кода.
При компиляции комментарии не учитываются и не
оказывают никакого влияние на работу программы.
В Си есть два типа комментариев: блочный и строчный.
Блочный заключается между символами
/* текст комментария */. Он может размещаться на нескольких
строках.
Строчный комментарий помещается на одной строке после
двойного слеша //текст комментария
20.09.2024
Романькова Т.Л.
3

4.

20.09.2024
Романькова Т.Л.
4

5.

Стартовой точкой в любую программу на языке Си
является функция main(). Именно с этой функции начинается
выполнение приложения. Ее имя main для всех программ на
Си всегда одинаково.
Модификации функции main:
int main(void)
{

return 0;
}
int main()
{

return 0;
}
void main()
{

return 0;
}
20.09.2024
Романькова Т.Л.
5

6.

Основные понятия языка
• Алфавит (символы)
a..z, A..Z, _, 0..9, =,+,*,{, пробел
• Лексемы (слова)
22.3, Sum, int, while
• Выражения (словосочетания)
a+b
• Операторы (предложения)
S=a+b;
printf("Привет, Вася!\n");
20.09.2024
Романькова Т.Л.
6

7.

Виды лексем:
• Имена (идентификаторы);
bestFriend max
• Ключевые слова;
int void
• Знаки операций
+, &&, *
• Разделители
Пробел, знак табуляции
• Литералы (константы)
"Привет, Вася! ", 325 , 12.8
20.09.2024
Романькова Т.Л.
7

8.

Escape-последовательности
\n
Перейти на начало новой строки
\t
Перейти к следующей позиции табуляции
\b
Удалить последний выведенный символ
\a
Подать звуковой сигнал
\\
Вывести обратную черту \
\"
Вывести двойную кавычку ”
\’
Вывести одинарную кавычку ’
20.09.2024
Романькова Т.Л.
8

9.

Правила составления идентификаторов:
идентификаторы должны начинаться с буквы латинского
алфавита;
в них могут использоваться буквы латинского алфавита,
символ подчеркивания и цифры; использование других
символов запрещено;
прописные и строчные буквы различаются;
имя не должно быть ключевым словом языка.
20.09.2024
Романькова Т.Л.
9

10.

Типы данных
Тип данных и модификатор типа определяют:
формат хранения данных в оперативной памяти (внутреннее
представление данных);
диапазон значений, в пределах которого может изменяться
переменная;
операции, которые могут выполняться над данными
соответствующего типа.
20.09.2024
Романькова Т.Л.
10

11.

В С имеются следующие 5 базовых типов:
char( символьный),
int (целый),
float (вещественный),
double (вещественный с двойной точностью),
void (пустой тип).
За исключением типа void перечисленные типы данных
могут иметь модификаторы. К модификаторам относятся:
unsigned (беззнаковый), signed (знаковый), short (короткий),
long (длинный).
20.09.2024
Романькова Т.Л.
11

12.

Целые типы
Тип
Пояснение
Размер
Диапазон значений
short
Короткое целое число
2 байта
[-32 768, 32 767]
unsigned short
Беззнаковое короткое
целое число
2 байта
[0, 65 535]
int
Целое число
4 байта
[-2 147 483 648, 2 147 483 647]
unsigned int
Беззаковое целое число
4 байта
[0, 4 294 967 295]
long
Длинное целое число
4 байта
[-2 147 483 648, 2 147 483 647]
unsigned long
Беззаковые длинное целое 4 байта
число
[0, 4 294 967 295]
long long
Двойное длинное целое
число
8 байт
[-9 223 372 036 854 775 808, 9 223
372 036 854 775 807]
unsigned long
long
Беззнаковое двойное
длинное целое число
8 байт
[0, 18 446 744 073 709 551 615]
20.09.2024
Романькова Т.Л.
12

13.

Вещественные типы
float: представляет вещественное число ординарной точности с
плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти
занимает 4 байта (32 бита)
double: представляет вещественное число двойной точности с
плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В
памяти занимает 8 байт (64 бита)
long double: представляет вещественное число двойной
точности с плавающей точкой в диапазоне +/- 3.4E-4932 до
1.1E+4932. В памяти занимает 10 байт (80 бит). На некоторых
системах может занимать 96 и 128 бит.
20.09.2024
Романькова Т.Л.
13

14.

Представление вещественного числа состоит из двух частей —
мантиссы и порядка, причем каждая часть имеет знак.
8320,4 – число в формате с фиксированной точкой
0,83204*104 (записывается как 0.83204E4) – число в формате с
плавающей точкой (0,83204 – мантисса, а 4 - порядок )
В типе float мантисса занимает 24 бита, порядок - 8 бит
В типе double мантисса занимает 52 бита, порядок – 11 бит
Диапазон значений float приблизительно от -3,4 × 1038 до 3,4 × 1038
Числа в диапазоне от -3,4× 10-38 до 3,4 × 10-38 считаются равными 0
20.09.2024
Романькова Т.Л.
14

15.

Тип
Пояснение
Размер Диапазон значений
char
Символьный
тип
1 байт
[-128, 127]
unsigned Беззнаковый
char
символьный
тип
1 байт
[0, 255]
1 байт
[0, 255]
bool
20.09.2024
Логический
тип
Романькова Т.Л.
15

16.

При записи символа в память или его воспроизведения
на экран система пользуется кодовой таблицей.
20.09.2024
Романькова Т.Л.
16

17.

Переменные и константы
Переменная — это именованная область памяти, предназначенная
для хранения данных, которые могут быть изменены.
Переменная может иметь тип, имя и значение.
Перед использованием любую переменную надо определить.
тип_переменной имя_переменной;
float number;
int sum, max;
char letter, digit;
Если начальное значение не задано, то невозможно предугадать,
чему равна переменная. В памяти компьютера всегда что-то есть.
20.09.2024
Романькова Т.Л.
17

18.

При определении переменной можно дать ей некоторое
начальное значение (инициализировать).
float number=23.5;
int sum=0, max;
Константа – это именованная область памяти, предназначенная
для хранения постоянных данных
При объявлении константы применяется ключевое слово const
для указания того, что её значение далее в программе
изменяться не будет.
В отличие от переменных значение
устанавливается один раз при их объявлении.
констант
const int number = 2;
number = 5;//ошибка
20.09.2024
Романькова Т.Л.
18

19.

В зависимости от мест расположения объявлений данных
в программе они различаются на глобальные и локальные.
Глобальные объявляются вне любой из функций и,
следовательно, доступны для многих из них. Область действия
такой переменной - модуль, в котором она определена (от точки
описания до его конца).
Локальные переменные являются внутренними по
отношению к функциям. Они начинают существовать при входе в
функцию и уничтожаются при выходе из нее. Область действия
локальной переменной - от точки описания до конца блока,
включая все вложенные блоки.
Время жизни глобальных и локальных переменных отличается:
глобальная переменная "живет", пока работает программа, а
локальная - только до конца блока.
20.09.2024
Романькова Т.Л.
19

20.

Область видимости переменных
#include <stdio.h>
#include <locale.h>
char simvol = 'A'; //глобальная переменная
void main()
{
setlocale(LC_ALL, "rus");
int k = 0; //локальная переменная
{
printf("k=%d \n", k); //вывод k=0
int k = 3; //объявление этой
// переменной делает невидимой
// переменную k, описанную ранее
printf("k=%d \n", k); //вывод k=3
printf("символ=%c \n", simvol); //вывод 'A’
}
printf("k=%d \n", k); //вывод k=0, снова доступна
system("pause");
Романькова Т.Л.
20
}

21.

Функция sizeof(name) возвращает размер памяти в байтах,
которую занимает переменная, где name - или идентификатор
или имя типа. Имя типа не может быть void.
printf("Данные типа int занимают в памяти %d байт\n", sizeof(int));
Литералы (константы без имени)
Целые константы:
4356
431L
0427
0x136
- десятичная константа (int),
- десятичная константа типа long,
- восьмеричная константа,
- шестнадцатеричная константа.
20.09.2024
Романькова Т.Л.
21

22.

Префиксы:
0 – восьмеричное число;
0x
(0X)

шестнадцатеричное
число;
Суффиксы:
L (l) – long
U(u) – unsigned
F(f) - float
Вещественные константы.
2.5348
.34е-2
34е-2
.34
34.
Использование пробелов в записи константы недопустимо.
20.09.2024
Романькова Т.Л.
22

23.

Директивы препроцессора
Директива #include вставляет текст внешнего файла в
текст программы, содержащей директиву.
Директива имеет один из форматов:
#include <имя файла>
#include ”имя файла”
#include <stdio.h>
#include "locale.h"
Угловые скобки указывают препроцессору искать
включаемый файл в каталогах, определенных по умолчанию в
IDE.
20.09.2024
Романькова Т.Л.
23

24.

Двойные кавычки указывают вначале производить поиск
в текущем каталоге, а затем если файл не найден, в тех же
каталогах, что и с угловыми скобками.
Директива #include чаще
включения заголовочных файлов.
всего
используется
для
Заголовочный файл (иногда головной файл, англ. header
file), или подключаемый файл — в языках программирования Си и
C++ файл, содержащий определения типов данных, структуры,
прототипы функций, перечисления, макросы препроцессора.
Имеет по умолчанию расширение h.
20.09.2024
Романькова Т.Л.
24

25.

Директива #define предназначена для выполнения
функции найти и заменить и имеет следующий формат:
#define argument1 argument 2
где argument1 – идентификатор не содержащий пробелов,
аrgument2 может содержать любые символы.
Директива заменяет все вхождения argument1 в тексте
программы на аrgument2.
Заменяемые
в
ней
аргументы
называют
предопределенными константами. Определить можно
константу любого типа, включая строковый.
#define YEAR 2020
#define BEST_FRIEND "ВАСЯ"
20.09.2024
Романькова Т.Л.
25

26.

Консольный вывод
int puts(const char *str)
Функция puts() выводит передаваемый ей аргумент на
экран, завершая вывод переходом на новую строку.
puts("Привет, Вася");
char slovo[] = "Hello world!";
puts(slovo);
#define HELLO "Hello, Vasja!"
main()
{
puts(HELLO);
system("pause");
}
20.09.2024
Романькова Т.Л.
26

27.

puts("\tМы не рабы,\n рабы немы");
Функция putchar в Си предназначена для вывода единичного
символа на экран.
putchar('F');
char letter = 'Z';
putchar(letter);
putchar(89);//Y
20.09.2024
Романькова Т.Л.
27

28.

Функция
printf()
позволяет
осуществлять форматированный вывод данных.
Формальное описание:
printf(строка_форматирования, список_аргументов)
20.09.2024
Романькова Т.Л.
28

29.

Первый параметр представляет строку, которая может
содержать
обычные
символы,
управляющие
последовательности и спецификации преобразования
printf("Флаг");
int age = 25;
char ch = '$';
double weight = 53.6;
printf("\tage= %d ch=%c weight=%f\n", age, ch, weight);
20.09.2024
Романькова Т.Л.
29

30.

Спецификации преобразования
Спецификация
преобразования
20.09.2024
Описание
%d
десятичное целое число

восьмеричное целое число

шестнадцатеричное целое число
%u
десятичное целое число без знака
%f
вещественное десятичное число в формате с
плавающей точкой
(3.456)
%e
вещественное десятичное число в
экспоненциальном формате (0.3456E1)
%g
вещественное десятичное число, выбирается
наиболее короткий формат %f или %e

символ
%s
строка символов
%p
указатель
Романькова Т.Л.
30

31.

Формат спецификации:
% [знак] [размер поля вывода ][.точность] символ_преобразования.
Знак, расположенный после %, указывает на необходимость
выравнивания выводимого параметра:
Выравнивание влево выводимого числа в пределах
выделенного поля. Правая сторона выделенного поля
дополняется пробелами. Если этот знак не указан, то по
умолчанию производится выравнивание вправо.
+ Выводится знак числа. Знак "минус" при отрицательных
значениях выводится всегда и не зависит от наличия данного
флага
20.09.2024
Романькова Т.Л.
31

32.

Пробел - Выводится знак пробела перед положительным числом
0 Заполняет поле нулями
# Действие зависит от установленного для аргумента типа
формата. Для целых чисел выводится идентификатор системы
счисления: 0 перед восьмеричным числом; 0х или 0Х –перед
шестнадцатеричным. При указании типа формата e, E или f
происходит вывод десятичной точки. Действие данного символа
при использовании формата g и G идентично действию при e и E
Размер поля вывода задает количество позиций для
вывода символов. Если число подлежащих выводу символов
меньше, чем указано в этом поле, то слева или справа
добавляются пробелы для достижения указанного значения.
Точность задает число подлежащих выводу десятичных
знаков и должно начинаться точкой.
20.09.2024
Романькова Т.Л.
32

33.

Модификаторы позволяют конкретизировать выводимое
значение. Используются следующие модификаторы:
h: для вывода значений short int
l: для вывода значений long int
L: для вывода значений long double
Аргументами функции printf могут быть переменные,
константы, выражения, вызовы функции.
Основным требованием правильной работы функции
является
соответствие
выводимой
информации
и
спецификации, описывающей эту информацию. В противном
случае результат будет неверным.
20.09.2024
Романькова Т.Л.
33

34.

double x = 4.2537, y = -25.71;
printf("**********************************\n");
printf("*
x
*
y
* x+y
*\n");
printf("**********************************\n");
printf("*%+8.3f * %-10.3f*%10.2f*\n",x,y,x+y);
printf("**********************************\n");
20.09.2024
Романькова Т.Л.
34

35.

Функция printf возвращает в качестве
количество символов, выведенное на консоль.
результата
Так как символ % имеет служебный смысл, для вывода
самого этого символа его нужно продублировать: %%
20.09.2024
Романькова Т.Л.
35

36.

Выражения. Операции.
Выражения состоят из операндов, знаков операций и
скобок.
Каждый операнд является, в свою очередь, выражением
или одним из его частных случаев, например, константой
или переменной.
Операции задают действия, которые необходимо
выполнить.
Для изменения порядка выполнения операций
используются круглые скобки. Не существует ограничения
на вложенность скобок.
( a + 0.12 ) / 6
x && y || ! z
( t * sin(x) - 1.05e4 ) / ( ( 2 * k + 2 ) * (2 * k + 3 ) )
a=b=c
20.09.2024
Романькова Т.Л.
36

37.

В зависимости от количества операндов операции делятся на:
унарные (один операнд). Например: ++item;
-b. Знак
операции может стоять и слева, и справа от операнда.
бинарные (два операнда). Например: a+b, x/y.
тернарная (три операнда). Например: a>b?a:b
Если в одном выражении записано несколько операций
одинакового приоритета, то унарные операции, условная
операция и операции присваивания выполняются справа
налево, остальные - слева направо.
Например,
a = b = c это a = (b = c),
a + b + c это (a + b) + c.
20.09.2024
Романькова Т.Л.
37

38.

Приоритет операции задает порядок вычисления операций в
выражении.
Ниже приводятся операции в порядке убывания приоритета.
(Жирными линиями выделены операции с одинаковым
приоритетом)
Операция
Краткое описание
[]
Индекс массива
()
Вызов функции
. ->
Выбор члена структуры или класса
Унарные операции
++
инкремент
--
декремент
!
логическое отрицание
-
арифметическое отрицание (унарный минус)
+
sizeof
(<тип>)
20.09.2024
унарный плюс
Размер
преобразование типа
Романькова Т.Л.
38

39.

Бинарные и тернарная операции
20.09.2024
*
умножение
/
деление
%
остаток от деления
+
сложение
-
вычитание
<
меньше
<=
меньше или равно
>
больше
>=
больше или равно
==
равно
!=
не равно
&&
логическое И
||
логическое ИЛИ
?:
условная операция (тернарная)
=
присваивание
*=
умножение с присваиванием
/=
деление с присваиванием
%=
остаток отделения с присваиванием
+=
сложение с присваиванием
Романькова Т.Л.
вычитание с присваиванием
-=
39

40.

Это не все операции. Вот более полный перечень:
Операция
Порядок вычисления
() [] -> .
слева направо
! ~ ++ — + - * & sizeof
справа налево
* / %
слева направо
Бинарные + -
слева направо
<< >>
слева направо
< <= > >=
слева направо
== !=
слева направо
&
слева направо
^
слева направо
|
слева направо
&&
слева направо
||
слева направо
?:
справа налево
= += -= *= /= %= &= ^= |= <<= >>=
справа налево
20.09.2024
Романькова Т.Л.
40

41.

Если несколько операций имеют один и тот же
уровень приоритета, то они выполняются в том порядке, в
котором записаны в операторе (выражении).
Операция sizeof
Унарная операция, возвращающая длину в байтах
переменной или типа, помещенного в скобках. Выражение
sizeof имеет форму:
sizeof выражение;
double number = 3.5;
printf("размер переменной number - %d байт\n", sizeof number);
//размер переменной number - 8 байт
20.09.2024
Романькова Т.Л.
41

42.

Арифметические операции.
Префиксный
инкремент
(++x).
Увеличивает
значение
переменной на единицу и полученное значение используется как
значение выражения ++x
int a = 8;
int b = ++a;
printf("a = %d \n", a); // 9
printf("b = %d", b);
// 9
20.09.2024
Романькова Т.Л.
42

43.

Постфиксный инкремент (x++). Увеличивает значение
переменной на единицу, но значением выражения x++ будет то,
которое было до увеличения на единицу.
int a = 8;
int b = a++;
printf("a = %d \n", a); // 9
printf("b = %d", b);
// 8
Префиксный декремент (--x). Уменьшает значение переменной
на единицу, и полученное значение используется как значение
выражения --x
Постфиксный декремент (x--). Уменьшает значение переменной
на единицу, но значением выражения x-- будет то, которое было
до уменьшения на единицу
20.09.2024
Романькова Т.Л.
43

44.

int a = 3;
int b = 5;
int c = a+++b;
printf("a = %d \n", a);
printf("b = %d \n", b);
printf("c = %d\n", c);
// 4
// 5
// 8
Операции присваивания.
= основная операция присваивания - присваивает значение
справа переменной слева от знака.
Сначала вычисляется выражение справа от знака = , а затем
результат помещается в переменную, записанную слева от
знака =. При этом старое значение переменной теряется и
заменяется новой информацией. Например: x=x+5;
20.09.2024
Романькова Т.Л.
44

45.

Сокращенные формы операции присваивания.
a+=10;
a-=10;
a*=10;
a/=10;
a%=10;
эквивалентно a=a+10;
эквивалентно a=a-10;
эквивалентно a=a*10;
эквивалентно a=a/10;
эквивалентно a=a%10;
Условная (тернарная операция).
операнд_1 ? операнд_2 : операнд_3
Сначала вычисляется значение операнда 1. Если он равен
"истина" (соответствует значению 1), то результатом выполнения
всей условной операции будет значение операнда_2, иначе операнда_3.
int z = x > 0 ? 5 : -5;
20.09.2024
Романькова Т.Л.
45

46.

Большинство операций С выполняют преобразование
типов, чтобы привести операнды выражений к общему типу,
или чтобы расширить короткие величины до размера целых
величин,
используемых
в
машинных
операциях.
Преобразования, выполняемые операциями С, зависят от
специфики операций и от типа операнда или операндов.
- операнды типа float преобразуются к типу double;
- если один операнд типа double, то второй операнд
преобразуется к типу double;
- любые операнды типов char или short преобразуются к int;
- любые операнды типов unsigned char или unsigned short
преобразуются к типу unsigned int;
- если один операнд типа unsigned long, то второй операнд
преобразуется к типу unsigned long;
20.09.2024
Романькова Т.Л.
46

47.



если один операнд типа long, то второй операнд
преобразуется к типу long;
если один операнд типа unsigned int, то второй операнд
преобразуется к unsigned int.
Для получения верного результата выражения желательно,
чтобы операнды, входящие в выражение, и результирующая
переменная были одного типа.
Последовательность имен типов, упорядоченных от "высшего"
типа к "низшему", имеет следующий вид:
double, float, long, int, short, и char.
Применение модификатора unsigned повышает ранг
соответствующего типа данных со знаком.
20.09.2024
Романькова Т.Л.
47

48.

"Повышение" типа обычно заканчивается успешно, в
то время как "понижение" может закончиться не всегда
успешно. Это связано с тем, что все число может не
поместиться в элементе данных низшего типа.
char c;// cимвольная переменная
int i; // объявление переменной целого типа
float f;//объявление переменной вещественного типа
f = i = c = 'C';
printf("c= %c, i= %d, f= %2.3f \n", c, i, f);
c = c + 1;
/*преобразования выполнятся успешно, т. к. размер-*/
i = f + c;
/*ность памяти под переменными c, i, f достаточна*/
f = i / c;
/*для размещ. в них значений вычисленных выраж. */
printf("c= %c, i= %d, f= %f \n", c, i, f);
c = 3.67e17; /*для числа 3.67e17 требуется > 1 байта (ошибка)*/
printf("c= %c \n", c);
20.09.2024
Романькова Т.Л.
48

49.

Операция приведения
С помощью специальной операции преобразования
можно явным образом привести данные к нужному типу.
Перед приводимым к требуемому типу выражением
ставится тип в круглых скобках:
(тип) выражение
int a = 5;
int b = 10;
double c = a/b;
printf("a=%d b=%d c=%f\n", a, b, c);
double c = a/(double)b;
20.09.2024
Романькова Т.Л.
49

50.

double a = 284;
int b = a;
char c = b;
Без потери информации проходят следующие цепочки
преобразований:
char -> short -> int -> long
unsigned char -> unsigned short -> unsigned int -> unsigned long
float -> double -> long double
20.09.2024
Романькова Т.Л.
50
English     Русский Rules