2.1.
Элементы языка С (алфавит:
буквы и цифры, пробельные символы,
разделители, специальные символы,
операции; константы: целые константы,
константы с плавающей точкой, символьные
константы, символьные строки;
идентификаторы; ключевые слова;
комментарии).
Под
элементами языка понимаются его
базовые конструкции, используемые
при написании программ: алфавит;
константы; идентификаторы; ключевые
слова; комментарии.
Алфавит
В
программах на языке Си используются
два множества символов: множество
символов языка Си и множество
представимых символов. Множество
символов языка Си содержит буквы,
цифры и знаки пунктуации, которые
имеют определенный смысл для компилятора
языка Си. Множество символов языка Си
является подмножеством множества
представимых символов. Множество
представимых символов состоит из всех
букв, цифр и символов, которые могут
быть представлены как отдельный символ
на клавиатуре данного персонального
компьютера. Программа на языке Си
может содержать только символы из
множества символов языка Си, однако
внутри символьных строк, символьных
констант и комментариев может быть
использован любой представимый символ.
Буквы
и цифры
Множество
символов языка Си включает прописные
и строчные буквы латинского алфавита
и арабские цифры. Компилятор языка Си
рассматривает одну и ту же прописную
и строчную буквы как различные символы.
Пробельные
символы
Символы
пробел,
табуляция, перевод строки, возврат
каретки, новая страница, вертикальная
табуляция
и новая
строка называются
пробельными, поскольку они имеют то
же самое назначение, что и пробелы
между словами и строками в тексте на
естественном языке. Эти символы
отделяют друг от друга лексемы, например
константы и идентификаторы.
Компилятор
языка Си игнорирует пробельные символы,
если они используются не как компоненты
символьных констант или символьных
строк. Это позволяет использовать
столько пробельных символов, сколько
нужно для повышения наглядности
программы.
Комментарии
компилятор языка Си также рассматривает
как пробельные символы.
Разделители
Разделители
из множества символов языка Си
используются для различных целей, от
организации текста программы до
определения указаний компилятору
языка Си.
,
! . | ; / (Слэш) : ? ~ (Тильда) ‘
(Апостроф) _ ( # ) % { & (Амперсанд)
} ^ (Стрелка вверх) < —
> = [ + ] * (Знак умножения
(звездочка))
Эти
символы имеют специальный смысл для
компилятора языка Си.
Специальные
символы
Специальные
символы предназначены для представления
пробельных и неграфических символов
в строках и символьных константах.
Специальный символ состоит из обратного
слэша, за которым следует либо буква,
либо знаки пунктуации, либо комбинация
цифр.
n Новая
строка
t Горизонтальная табуляция
v Вертикальная
табуляция b Забой
г Возврат
каретки f Новая
страница
а Звуковой
сигнал ’ Апостроф
» Двойная
кавычка \ Обратный
слэш
ddd Байтовое
значение в восьмеричном представлении
xdd Байтовое
значение в шестнадцатеричном
представлении
Операции
Операции
— это комбинации символов, специфицирующие
действия по преобразованию значений.
Компилятор языка Си интерпретирует
каждую из этих комбинаций как
самостоятельную лексему.
!
Логическое НЕ
~
Обратный
код
+
Сложение;
унарный плюс —
Вычитание;
унарный минус
*
Умножение;
косвенная адресация /
Деление
%
Остаток
от деления <<
Сдвиг
влево
>>
Сдвиг
вправо <
Меньше
<=
Меньше
или равно >
Больше
>=
Больше
или равно ==
Равно
!=
Не
равно
&
Поразрядное
И; адресация
|
Поразрядное
включающее ИЛИ ^
Поразрядное
исключающее ИЛИ
&&
Логическое
И ||
Логическое ИЛИ
?:
Условная
операция ++
Инкремент
—
Декремент
=
Простое
присваивание
+=
Присваивание
со сложением -=
Присваивание
с вычитанием
*=
Присваивание
с умножением /=
Присваивание
с делением
%=
Присваивание
с остатком от деления >>=
Присваивание
со сдвигом вправо
<<=
Присваивание
со сдвигом влево &=
Присваивание
с поразрядным И
|=
Присваивание
с поразрядным включающим ИЛИ
^=
Присваивание
с поразрядным исключающим ИЛИ
Константа
— это число, символ или строка символов.
Константы используются в программе
для задания постоянных величин. В
языке Си различают четыре типа констант:
целые, с плавающей точкой, символьные
константы и символьные строки.
Целые
константы
— это десятичное, восьмеричное или
шестнадцатеричное число, которое
представляет целое значение. Между
цифрами целой константы пробельные
символы недопустимы.
Целые
константы всегда специфицируют
положительные значения. Если требуется
отрицательное значение, то необходимо
сформировать константное выражение
из знака минус и следующей за ним
константы. Знак минус рассматривается
при этом как арифметическая операция.
Каждая
целая константа имеет тип, определяющий
ее представление в памяти, например,
int.
Константы
с плавающей точкой
— это действительное десятичное
положительное число. Между цифрами
или символами константы пробельные
символы недопустимы. Константы с
плавающей точкой всегда специфицируют
положительные значения. -//-
Символьные
константы
— это буква, цифра, знак пунктуации
или специальный символ, заключенный
в апострофы. Значение символьной
константы равно коду представляемого
ею символа. Символьные константы имеют
тип int.
Символьные
строки
— это последовательность символов,
заключенная в двойные кавычки.
Символьная строка рассматривается
как массив символов, каждый элемент
которого представляет отдельный
символ. Тип символьной строки—массив
элементов типа char.
Число элементов в массиве равно числу
символов в символьной строке плюс
один, поскольку нулевой символ (признак
конца символьной строки) тоже является
элементом массива.
Идентификаторы
— это имена переменных, однозначно
определяющих соответствие переменной
с ее адресом. К идентификаторам относят:
имена переменных, функций; тэги –
имена типов структур, объединений,
перечислимых типов. Компилятор языка
Си не допускает использования
идентификаторов, совпадающих по
написанию с ключевыми словами.
Ключевые
слова
— это предопределенные идентификаторы,
которые имеют специальное значение
для компилятора языка Си. Их использование
строго регламентировано.
список
ключевых слов:
auto
(класс памяти. Определяет время жизни
и область действия объекта); break;
case
(часть оператора выбора, обозначает
начало условной переменной, анализируемой
в операторе выбора); char;
continue
(оператор передачи управления из тела
цикла на оператор вычисления условия
продолжения цикла, в операторе for
на оператор изменения счетчика цикла);
default
(часть оператора выбора); else;
enum
(перечислимый тип данных. Представляет
собой подмножество целого типа); extern
(внешний класс памяти, переменная
должна иметь описание на внешнем
уровне); float;
for;
goto;
int;
long
(префикс к типу, указывающий возможное
увеличение диапазона представимых
значений); if;
register
(класс памяти. Переменная этого класса
по возможности размещается в регистре
общего назначения для ускорения
доступа к ней); struct;
switch
(оператор выбора. В соответствии со
значением условного выражения позволяет
выбрать одну из нескольких альтернатив);
union
(объединение. Тип данных, предназначенных
для хранения двух и более объектов по
одному и тому же адресу); typedef
(определение
пользовательского типа); unsigned;void;
while;
do;
double;
sizeof
(определение размера области памяти
в байтах, занимаемой операндом).
Комментарии
— это последовательность символов,
которая воспринимается компилятором
языка Си как отдельный пробельный
символ и игнорируется. (либо // либо /*
*/)
2.3.
Концепция данных. Стандартные типы
данных (элементарные
данные; агрегатные данные).
Элементарные
данные
– типы
данных, вводимые в язык программирования
для описания основных математических
данных (численные типы целые и
вещественные), типы данных для хранения
символьной и логической информации,
перечислимые типы.
Над
всеми элементарными данными определены
операции вводавывода.
Целые
числа.
Положительные хранятся в прямом коде,
а отрицательные – в дополнительном.
Диапазон определяется количеством
байт, используемых в среде программирования.
Вещественные
числа.
Для их хранения предусмотрены два
формата: с фиксированной точкой и с
плавающей точкой. В первом случае в
программе определяется количество
знаков Джо и после десятичной точки.
Все операции производятся как с целыми
числами после выравнивания положения
точки в операндах друг относительно
друга. При использовании формата с
плавающей точкой числа хранятся в
виде мантиссы и порядка. Мантисса
числа хранится в нормализованном
виде. Порядок числа хранится в смещенном
виде и называется характеристикой.
Нормализация осуществляется путем
приведения к определенному диапазону,
например, от 0.5 до 1. При этом первый
бит всегда =1, => он не хранится, но
учитывается и называется скрытым
битом. Для получения характеристики
из порядка, значение порядка увеличивают
на половину диапазона представления
чисел в к битах, где к – число бит,
отведенных для хранения порядка.
(Например, при 7-битном представлении
порядка характеристика = порядок+64).
Символьные
данные.
Обычно представляются двумя типами
данных: символы и строки. При этом
строка может не быть отдельным типом,
а быть явно реализованной в виде
одномерного массива символов.
Фактически, символ представляет собой
целое число, равное коду символа в
таблице кодирования. Код, обычно, — 1
или 2 байта. Строка фактически отличается
от одномерного массива символов тем,
что содержит информацию о своей длине
в прямом виде, либо косвенно в виде
признака конца строки.
Логические
данные.
Это типы данных, предназначенные для
хранения результата логического или
булевого выражения. Данные логического
типа могут принимать два значения:
ложь и истина. Помимо булевой бинарной
логики может существовать тринарная
(+ не определено). В Си для кодирования
логических данных используют целые
значения: ложь – 0, истина – не 0.
Указатели.
Это типы данных, предназначенные для
хранения адресов объектов и операций
над ними. Выполнение операций над
указателями отличается от арифметических
тем, что все действия производятся в
соответствии с количеством байт,
отводимым для хранения объекта, адрес
которого присутствует в указателе.
Агрегатные
данные – типы
данных, предназначенные для хранения
однородной информации фиксированного
размера. Для агрегатных данных определен
прямой доступ к элементам, составляющим
данные этого типа.
Массив
– это линейная структура данных
фиксированного размера, предназначенная
для хранения однородной информации
с использованием последовательного
хранения. Каждый элемент массива
идентифицируется одним или несколькими
индексами.
Индекс
– это целое число, значение которого
определяет положение элемента массива
и используется для доступа к элементам
массива. Различают одномерные и
многомерные массивы, которые реализуются
на базе одномерных.
2.2.
Структура программы
(исходная программа; исходные файлы;
выполнение программы; время жизни и
область действия; пространства имен).
Исходная
программа
Исходная
программа
представляет собой совокупность
следующих элементов: директив
препроцессора, указаний компилятору,
объявлений и определений. Директивы
препроцессора
специфицируют действия препроцессора
по преобразованию текста программы
перед компиляцией. Указания
компилятору
— это специальные инструкции, которым
компилятор языка Си следует во время
компиляции. Объявление
переменной
задает имя и атрибуты переменной.
Определение
переменной,
помимо задания ее имени и атрибутов,
приводит к выделению для нее памяти.
Объявление
функции
задает ее имя, тип возвращаемого
значения и может задавать атрибуты
ее формальных параметров. Определение
функции
специфицирует тело функции, которое
представляет собой составной оператор,
содержащий объявления и операторы.
Определение функции также задает имя
функции, тип возвращаемого значения
и атрибуты ее формальных параметров.
Объявление
типа позволяет
программисту создать собственный тип
данных. Оно состоит в присвоении имени
некоторому базовому или составному
типу языка Си.
Исходная
программа может содержать произвольное
число директив, указаний компилятору,
объявлений и определений. Порядок
появления этих элементов в программе
весьма существен; в частности, он
влияет на возможность использования
переменных, функций и типов в различных
частях программы. Для того чтобы
программа на языке Си могла быть
скомпилирована и выполнена, она должна
содержать по крайней мере одно
определение — определение функции.
Эта функция определяет действия,
выполняемые программой. Если же
программа содержит несколько функций,
то среди них выделяется одна главная
функция, которая должна иметь имя
main.
С нее начинается выполнение программы;
она определяет действия, выполняемые
программой, и вызывает другие функции.
Исходные
файлы
Текст
программы на языке Си может быть
разделен на несколько исходных файлов.
Исходный файл представляет собой
текстовый файл, который содержит либо
всю программу, либо ее часть. При
компиляции исходной программы каждый
из составляющих ее исходных файлов
должен быть скомпилирован отдельно,
а затем связан с другими файлами
компоновщиком. Отдельные исходные
файлы можно объединять в один исходный
файл, компилируемый как единое целое,
посредством директивы препроцессора
#include.
Исходный
файл может содержать любую целостную
комбинацию директив, указаний
компилятору, объявлений и определений.
Под целостностью подразумевается,
что такие объекты, как определения
функций, структуры данных либо набор
связанных между собой директив условной
компиляции, должны целиком располагаться
в одном файле, т. е. не могут начинаться
в одном файле, а продолжаться в другом.
Именованные
константы и макроопределения обычно
собирают в отдельные файлы и включают
их посредством директивы препроцессора
#include
в те исходные файлы, в которых они
требуются.
Выполнение
программы
Каждая
программа на языке Си содержит главную
функцию. В языке Си главная функция
программы должна иметь имя main.
С функции main
начинается выполнение программы;
обычно она управляет выполнением
программы, организуя вызовы других
функций. Программа может завершить
выполнение по достижению конца функции
main,
однако может завершиться и в других
точках путем вызова стандартных
библиотечных функций, предназначенных
для выхода из программы
Исходная
программа обычно включает в себя
несколько функций, каждая из которых
предназначена для выполнения
определенной задачи. Функция main
может вызывать эти функции, с тем чтобы
выполнить ту или иную задачу. Когда
функция вызывается, выполнение
начинается с ее первого оператора.
Функция возвращает управление при
выполнении оператора return
либо когда выполнение доходит до конца
тела функции.
Функцию
main
вызывает одна из программ, входящих
в состав ОС, — интерпретатор командной
строки. В процессе компоновки программы
на языке Си в ее состав включается
модуль поддержки выполнения. Если
программа не требует аргументов, то
функцию main
можно объявить без формальных
параметров.
Время
жизни и область действия
Понятия
«время жизни» и «область
действия» являются очень важными
для понимания структуры программ на
языке Си. Время жизни переменной может
быть либо «глобальным», либо
«локальным». Объект с глобальным
временем жизни характеризуется тем,
что в течение всего времени выполнения
программы с ним ассоциирована ячейка
оперативной памяти и значение.
Глобальная область действия означает,
что объект доступен, или может быть
через соответствующие объявления
сделан доступным в пределах всех
исходных файлов, образующих программу.
Объекту с локальным временем жизни
выделяется новая ячейка памяти при
каждом входе в блок, в котором он
определен или объявлен. Когда выполнение
блока завершается, память, выделенная
под локальный объект, освобождается
и, следовательно, локальный объект
теряет значение.
Тело
функции представляет собой блок. Блоки
в свою очередь могут содержать внутри
себя другие, вложенные блоки. Однако
функции не могут быть вложенными, т.е.
определение функции не может содержаться
внутри определения другой функции.
Объявления
и определения, записанные внутри
какого-либо блока (т. е. на внутреннем
уровне), называются внутренними.
Объявления и определения, записанные
за пределами всех блоков (т. е. на
внешнем уровне), называются внешними.
Переменные и функции могут быть
объявлены как на внешнем уровне, так
и на внутреннем. Переменные могут быть
также определены на внутреннем уровне,
а функции определяются только на
внешнем уровне.
Все
функции имеют глобальное время жизни.
Переменные, определенные на внешнем
уровне, всегда имеют глобальное время
жизни. Переменные, определенные на
внутреннем уровне, имеют локальное
время жизни.
Если
переменная, объявленная внутри блока,
имеет то же самое имя, что и переменная,
объявленная на внешнем уровне, то
внутреннее объявление переменной
заменяет (вытесняет) в пределах блока
внешнее объявление. Этот механизм
называется локальным переобъявлением
переменной. Область действия переменной
внешнего уровня восстанавливается
при завершении блока.
Область
действия функции, объявленной со
спецификацией класса памяти static,
распространяется на весь исходный
файл, в котором она объявлена, т.е. она
может быть вызвана из любой точки
этого файла, за исключением тех блоков,
в которых она локально переобъявляется.
Область
действия функции, объявленной с классом
памяти extern,
распространяется на все исходные
файлы программы, т.е. она может быть
вызвана из любой точки любого файла,
за исключением блоков, в которых она
локально переобъявляется.
Пространство
имен.
В
программе на Си имена используются
для ссылок на различного рода объекты.
Для различия идентификаторов различного
рода компилятор языка си устанавливает
так называемые пространства имен. Во
избежание противоречий имена внутри
одного пространства должны быть
уникальными, однако в различных
пространствах имена могут повторяться.
Уникальность
имен в пределах этого пространства
связано с понятием области действия,
т.е. в этом пространстве могут содержаться
совпадающие идентификаторы, если
область определения именуемых объектов
не пересекается, т.е. совпадение
идентификаторов указанной группы
объектов допустимо только при локальном
переобъявлении.
2.4.
Представление основных структур
программирования:
итерация, ветвление, повторение;
процедуры.
Итерация
– повторение – цикл.
Оператор
if (ветвление)
if
(выражение) оператор1; [else оператор2;]
Выполнение
оператора if начинается с вычисления
выражения.
Далее
выполнение осуществляется по следующей
схеме:
—
если выражение истинно (т.е. отлично
от 0), то выполняется оператор1.
—
если выражение ложно (т.е. равно 0),то
выполняется оператор2.
—
если выражение ложно и отсутствует
оператор2, то выполняется следующий
за if оператор.
Допускается использование вложенных
операторов if.
Оператор
for —
это наиболее общий способ организации
цикла (с
известным количеством повторений).
for
(выражение 1; выражение 2; выражение 3)
тело;
Выражение
1 обычно используется для установления
начального значения переменных,
управляющих циклом. Выражение 2 — это
выражение, определяющее условие, при
котором тело цикла будет выполняться.
Выражение 3 определяет изменение
переменных, управляющих циклом после
каждого выполнения тела цикла.
Схема
выполнения оператора for:
1.
Вычисляется выражение 1.
2.
Вычисляется выражение 2.
3.
Если значения выражения 2 отлично от
нуля (истина), выполняется тело цикла,
вычисляется выражение 3 и осуществляется
переход к пункту 2, если выражение 2
равно нулю (ложь), то управление
передается на оператор, следующий за
оператором for.
Другим
вариантом использования оператора
for является бесконечный цикл. Для
организации такого цикла можно
использовать пустое условное выражение,
а для выхода из цикла обычно используют
дополнительное условие и оператор
break.
Оператор
while (с
предусловием)
while
(выражение) тело;
Схема
выполнения оператора while следующая:
1.
Вычисляется выражение.
2.
Если выражение ложно, то выполнение
оператора while заканчивается и выполняется
следующий по порядку оператор. Если
выражение истинно, то выполняется
тело оператора while.
3.
Процесс повторяется с пункта 1.
Оператор
do while (с
постусловием)
Используется
в тех случаях, когда необходимо
выполнить тело цикла хотя бы один раз.
do
тело while (выражение);
Схема
выполнения оператора do while :
1.
Выполняется тело цикла (которое может
быть составным оператором).
2.
Вычисляется выражение.
3.
Если выражение ложно, то выполнение
оператора do while заканчивается и
выполняется следующий по порядку
оператор. Если выражение истинно, то
выполнение оператора продолжается с
пункта Итерация
– цикл for.
2.5
Типы данных, определяемые пользователем;
структуры;файлы.
Переименование
типов (typedef)
Для
того, чтобы сделать программу более
ясной, можно задать типу новое имя с
помощью ключевого слова typedef:
typedef
тип новое_имя [размерность];
Перечисления
(enum)
При
написании программ часто возникает
потребность определить несколько
именованных констант, для которых
требуется, чтобы все они имели различные
значения (при этом конкретные значения
могут быть не важны). Для этого удобно
воспользоваться перечисляемым типом
данных, все значения которого задаются
списком целочисленных констант:
enum
[имя_типа] {список_констант};
Имя
типа задается в том случае, если в
программе требуется определять
переменные этого типа. Компилятор
обеспечивает, чтобы эти переменные
принимали значения только из списка
констант.
Структура
(struct)
Это
тип данных, позволяющий объединять в
одном объекте совокупность объектов
разного типа.
struct
[имя] {список полей}
Список
полей – перечень объявлений. Каждое
объявление состоит из спецификации
типа, идентификатора и ;. Доступ:
идентификатор.имя поля, обращение к
значению то адресу идентификатор->имя
поля.
Битовые
поля
В
качестве элемента структуры может
использоваться заданное число битов
определенного типа.
Спецификация_типа
идентификатор: константное выражение;
Объединения
(union)
Объединения
предназначены для хранения данных
различного типа в одной и той же области
памяти.
union
[имя] {список полей}
Файл
Последовательность
является одной из фундаментальных
структур данных. В языках высокого
уровня для обозначения последовательности
компонентов одного и того же типа
применяют термин файл.
Для файлов приняты следующие ограничения:
в любой момент времени в файле доступен
один-единственный компонент, другие
могут быть получены путем последовательного
просмотра компонентов файла. Число
компонентов, называемых длиной файла,
не фиксируется, что позволяет отнести
файл к динамическим структурам данных.
Файл может не содержать ни одного
элемента — пустой. Над
файлами определены 2 типа действий:
1.
просмотр
(последовательное продвижение по
файлу сначала). В процессе просмотра
изменять значения компонентов на
новые запрещается.
2.
создание
(выполняется
дополнение новых элементов в конец
первоначально пустого файла). В процессе
создания новые значения разрешается
записывать только в конец файла. Все
остальные действия являются комбинациями
его просмотра и создания.
Файл
может быть открыт и в режиме просмотра,
и в режиме создания, но для того, чтобы
выполнять действия с физическими
файлами, помимо этих операций
присутствуют операции открытия и
закрытия файла.
Открытие
возможно в двух режимах: чтение, запись
(просмотр, создание). По открытии файла
начинает действовать указатель на
текущий компонент файла. Чтение
сопровождается перемещением указателя
на следующий элемент до конца файла
– компонент особого рода, обозначающий
конец файла. Выполнение операции
закрытия обозначает, что содержимое
временного буфера, который использовался
для ускорения доступа к содержимому
файла за счет хранения его участка за
счет оперативной памяти отбрасывается
на ВЗУ. Возможен так же прямой доступ
к компонентам файла, а так же режим
обновления файла. В связи с этим также
присутствует функция н-ого компонента
файла и функции открытия файла в режиме
добавления и перезаписи.
(В
Си предусмотрены два вида операций
ввода/вывода с файлами: форматированный
и бинарный (двоичной) … ).
2.9.
Инициализация
(базовые типы и указатели; составные
типы; строковые инициализаторы).
Переменной
в объявлении может быть присвоено
начальное значение посредством
инициализатора. Можно инициализировать
переменные любого типа. Функции не
инициализируются. Записи инициализатора
в объявлении предшествует знак
равенства: =<инициализатор>
Базовые
типы и указатели
Можно
инициализировать переменные любого
типа. Функции не инициализируются.
Синтаксис: =<выражение>
Значение
выражения присваивается переменной.
Составные
типы
Элементы
объектов составных типов инициализируются
только константными выражениями.
Инициализация объектов составных
типов имеет следующий синтаксис:
=
{<список
инициализаторов>}
Список
инициализаторов представляет собой
последовательность инициализаторов,
разделенных запятыми. Список
инициализаторов заключается в фигурные
скобки. Каждый инициализатор в списке
представляет собой либо константное
выражение, либо, в свою очередь, список
инициализаторов. Таким образом,
заключенный в фигурные скобки список
может появиться внутри другого списка
инициализаторов. Эта конструкция
используется для инициализации тех
элементов объектов составных типов,
которые сами имеют составной тип.
Значения константных выражений из
каждого списка инициализаторов
присваиваются элементам объекта
составного типа в порядке их следования.
Если в списке инициализаторов меньше
элементов, чем в объекте составного
типа, то оставшиеся элементы объекта
неявно инициализируются нулевыми
значениями. Если же число инициализаторов
больше, чем требуется, то выдается
сообщение об ошибке. Эти правила
применяются и к каждому вложенному
списку инициализаторов.
Строковые
инициализаторы
Существует
специальная форма инициализации
массива типа char
— спомощью символьной строки. Например,
объявление char code[] = «abc»;
инициализирует
массив code
четырьмя символами-‘a’, ‘b’, ‘c’ и символом
», который завершает символьную
строку. Если в объявлении размер
массива указан, а длина инициализирующей
строки превышает указанный размер,
то лишние символы отбрасываются. Если
инициализирующая строка короче, чем
специфицированный размер массива, то
оставшиеся элементы массива
инициализируются нулевым значением
(символом »). Символьной строкой можно
инициализировать не только массив
типа char,
но и указатель на тип char.
2.8.
Спецификация классов памяти.
Использование классов памяти при
объявлении переменной на внешнем
уровне. Использование классов памяти
при объявлении переменной на внутреннем
уровне.
Классы
памяти
Спецификация
класса памяти переменной определяет,
какое время жизни она имеет (глобальное
или локальное), и влияет на область
действия переменной. Объект с глобальным
временем жизни существует и имеет
значение на протяжении всего времени
выполнения программы.
В
языке Си имеется четыре спецификации
класса памяти: auto, register, static, extern.
Область
действия функций, объявленных со
спецификацией класса памяти extern,
распространяется на все исходные
файлы, которые составляют программу,
такие функции могут быть вызваны из
любой функции в любом исходном файле
программы. Переменные классов памяти
auto
и register
имеют локальное время жизни. Спецификации
static
и extern
определяют объекты с глобальным
временем жизни.
|
уровень |
объект |
спецификация класса |
время |
область |
|
1. Внешний |
Определение |
Static |
Глобальное |
Остаток |
|
Объявление |
Extern |
Глобальное |
Остаток |
|
|
Объявление |
Static |
Глобальное |
Остаток |
|
|
2. Внутренний |
Объявление |
Extern |
Глобальное |
Блок |
|
Определение |
Static |
Глобальное |
Блок |
|
|
Определение |
Auto Registr |
Локальное |
Блок |
|
|
Объявление |
Extern Static |
Локальное |
Блок |
Объявление
переменной на внешнем уровне
Объявления
переменной на внешнем уровне используют
спецификации класса памяти static
и extern
или вообще опускают их. Спецификации
класса памяти auto
и register
не допускаются на внешнем уровне.
Объявления переменных на внешнем
уровне—это либо определения переменных,
либо объявления, т.е. ссылки на
определения, сделанные в другом месте.
Определение внешней переменной—это
объявление, которое вызывает выделение
памяти для этой переменной и
инициализирует ее.
Объявление
переменной на внутреннем уровне
Любая
из четырех спецификаций класса памяти
может быть использована для объявления
переменной на внутреннем уровне. Если
спецификация класса памяти опущена
в объявлении переменной на внутреннем
уровне, то подразумевается класс
памяти auto.
Область
действия переменной распространяется
на блок, в котором она объявлена, (и на
все вложенные в него блоки). Переменные
класса памяти auto
автоматически не инициализируются,
поэтому в случае отсутствия инициализации
в объявлении значение
переменной
класса памяти auto считается неопределенным.
Память под переменные класса памяти
auto отводится в стеке. Спецификация
класса памяти register
требует, чтобы компилятор языка Си
выделил переменной память в регистре
микропроцессора, если это
возможно.
Использование регистровой памяти
обычно ускоряет доступ к переменной
и уменьшает размер выполняемого кода
программы. Переменные, объявленные с
классом памяти register, имеют ту же самую
область действия, что и переменные
auto.
Переменная,
объявленная на внутреннем уровне со
спецификацией класса памяти static,
имеет глобальное время жизни, но ее
область действия распространяется
только на блок, в котором она объявлена
(и на все вложенные блоки), но отличие
от переменных класса памяти auto,
переменные, объявленные со спецификацией
класса памяти static, сохраняют свое
значение при выходе из блока. Переменные
класса памяти static могут быть
инициализированы константным
выражением. Если явной инициализации
нет, то переменная класса памяти static
автоматически инициализируется
нулевым значением. Инициализация
выполняется один раз во время компиляции
и не повторяется при каждом входе в
блок. Переменная, объявленная со
спецификацией класса памяти extern,
является ссылкой на переменную с тем
же самым именем, определенную на
внешнем уровне в любом исходном файле
программы. Цель внутреннего объявления
extern состоит в том, чтобы сделать
определение переменной внешнего
уровня (как правило, данное в другом
исходном файле) доступным именно
внутри данного блока.
6.
Динамические структуры данных; списки:
основные виды и способы реализации
(понятие дисциплины обслуживания,
последовательность, очередь, стек,
дек).
…появляется
необходимость динамически выд5лять
память, поэтому…
Список
– базовая структура, позволяющая
определить любую структуру данных.
Указатели вводятся в языки высокого
уровня с целью поддержания списковых
структур. Элемент списка представляет
собой объект, содержащий информационное
поле и 1 или несколько адресных полей,
предназначенных для связи с другими
элементами списка. При отсутствии
связи адресное поле равно специальному
значению указателя, гарантировано
ссылающемуся ни какой объект (NULL
– нулевой указатель).
Однонаправленный
(односвязный) список
Элементом
является структура, в число полей
которой входит поле адреса, в котором
хранится ссылка на следующий элемент
односвязного списка, относят данную
структуру хранения к связным, и поле
данных, содержащее информацию,
предназначенную для хранения.
Связанный
список определяется адресом начала
(головы списка), конец списка определяется
элементом, в поле адреса которого
хранится значение, не ссылающееся ни
на какую область памяти (NULL)
Создание
связного списка.
Выделить
память для хранения адреса головы;
Выделить
память для хранения элементов списка;
Обнулить
поле адреса;
Записать
в поле данных содержащую информацию;
Сохранить
адрес головы списка в переменной,
хранящей ссылку на начало списка.
Добавление
элемента в конец списка.
Присвоить
указателю адрес головы списка;
Проанализировать
значение поля адреса. Пока оно не равно
0, присваивать указателю
значен000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ие
поля адреса.
Создать
элемент списка и записать его в поле
адрес конца списка.
Просмотр
связного списка.
для
всех значений поля адреса, начиная с
головы списка, пока не обнаружено
нулевое значение адреса, выполнять
сравнение поля данных с требуемой
информацией.
если
сравнение дает положительный результат,
то выдать элемент списка.
если
достигнуто значение адреса 0, выдать
сообщение, что элемент не найден.
Добавление
элемента в произвольное место списка.
Найти
заданный элемент, сохранить значение
его поля адреса, создать новый элемент,
записать адрес нового элемента в поле
адреса заданного (найденного) элемента.
Записать
в поле адреса добавляемого элемента
сохраненный адрес следующего элемента.
Процедура
добавления элемента в произвольное
место списка показывает преимущество
связного хранения перед последовательным
(массивы).
Удаление
элемента из конца списка.
Найти
последний элемент, освободить память,
записать в поле адреса предпоследнего
элемента значение NULL.
В данной процедуре требуется хранить
текущее значение адреса и адрес
предыдущего элемента.
Удаление
произвольного элемента связного
списка.
Найти
удаляемый элемент, сохранить его
адрес. В поле адреса предыдущего
элемента записать адрес следующего.
Освободить память из-под удаляемого
элемента.
Кольцевой
односвязный список
Структура
аналогична структуре односвязного
однонаправленного
списка, за исключением
того,
что в поле адреса конечного элемента
хранится
адрес головы списка.
Все
процессы взаимодействия со списком
аналогичны вышеописанным, за исключением
того, что проверка на конец списка
осуществляется не с NULL,
а со значением адреса головы списка.
Двунаправленный
список
Каждый
элемент списка содержит адрес не
только
следующего элемента, но и
предыдущего.
Голова списка в адресе
предыдущего
элемента содержит NULL.
Кольцевой
двунаправленный список
Поле
предыдущий элемент головы списка
содержит
адрес конца списка.
Двусвязный
список
Каждый
элемент списка содержит 2 ссылки
на
2 следующих элемента.
Двунаправленный
(двусвязный) список
Элемент
такого списка помимо ссылки на
левый
и правый следующие элементы
содержит
ссылку на предыдущий элемент.
Многосвязный
список
Каждый
элемент содержит n-ссылок
на
следующие элементы.
(
Преимущество
последовательного хранения: при
известном размере каждого элемента
возможен доступ по индексу элемента.
Недостатки:
необходимость резервирования
предполагаемого максимального размера,
невозможность добавления и исключения
элементов, а только модификация.
Недостатки
связного хранения: множество
дополнительных операций, приводящих
к замедлению скорости; доступ к
элементам возможен только после
просмотра предыдущих элементов.
Преимущества:
отсутствие необходимости резервирования
максимально предполагаемого размера
памяти; отсутствие требований
непрерывности используемой памяти;
возможность произвольного добавления
и исключения элементов
)
Дисциплина
обслуживания.
Очередь:
«first-in, first-out» (FIFO).
Стек:«last-in,
first-out» (LIFO).
Дек
– двунаправленная
очередь
– это
линейный
список, у которого операции
добавления
и удаления элементов и
доступа
к элементам возможны как вначале так
и в конце списка.
2.10.
Объявление типа
(объявление тега, typedef, абстрактные
имена типов).
Объявление
тега
Объявление
типа структуры, объединения или
перечислимого типа имеет такую же
синтаксическую форму, как и объявление
переменной этих типов, однако в
объявлении типа идентификатор
переменной (а в общем случае описатель)
опущен. Именем типа структуры,
объединения или перечислимого типа
является тег. Тег
– идентификатор, именующий структуру,
которая объявляется списком объявления
элементов. Описание специфицирует
либо переменную типа struct,
либо массив, либо указатель на структуру
данного типа, либо объект, являющийся
комбинацией вышеперечисленного.
Например:
struct
[<тег>]
{<список-объявлений-элементов>}
<описатель>
[,<описатель>:];
Объявления
typedef
Синтаксис:
typedef
<спецификация
типа>
<описатель>
[,<описатель>:];
Объявление
typedef
синтаксически аналогично объявлению
переменной или функции, за исключением
того, что вместо спецификации класса
памяти записывается ключевое слово
typedef
и отсутствует инициализатор. Объявление
typedef
интерпретируется таким же образом,
как объявление переменной или функции,
однако идентификатор, входящий в
состав описателя, специфицирует не
переменную или функцию, а тип.
Идентификатор становится синонимом
для объявленного типа и может
употребляться в последующих объявлениях.
Другими словами, создаются не новые
типы, а имена для специфицированных
программистом типов. С помощью typedef
может быть объявлено имя для любого
типа, как базового, так и составного
— указателя, функции, массива. Принято
записывать идентификаторы типов,
объявленные посредством typedef,
прописными буквами, однако это не
является требованием языка.
Абстрактные
имена типов
Иногда
возникает необходимость специфицировать
некоторый тип данных без присвоения
ему идентификатора и без объявления
какого-либо объекта. Такая конструкция,
определяющая тип без имени, называется
абстрактным
именем типа.
Абстрактные имена типов используются
в трех контекстах: в списках типов
аргументов при объявлении функций, в
операции приведения типа и в операции
sizeof.
Абстрактными именами для базовых,
перечислимых, структурных типов и
объединений являются просто
соответствующие им спецификации типа.
Абстрактные имена для типов указатель,
массив и функция задаются следующей
синтаксической конструкцией:
<спецификация
типа>
<абстрактный
описатель>
Абстрактный
описатель отличается от обычного
описателя только тем, что он не содержит
идентификатора. Как и обычный описатель,
он может содержать один или более
признаков указателя, массива и функции.
(int
*
— абстрактное имя для указателя на тип
int,
int
(*) [5]
– на массив из пяти элементов типа
int,
int
(*) (void)
– на функцию, не требующую аргументов
и возвращающую значение типа int).
2.7.Объявления
в языке Си. Базовые типы данных. Области
значений. Описатели
(синтаксис описателей; интерпретация
составных описателей; описатели с
модификаторами). Объявление
переменных
(простой переменной; переменной
перечислимого типа; структуры;
объединения; массива; указателя).
Объявление
функции
(прототип).
Тип данных
– понятие, включающее в себя диапазон
значений, принимаемый данными этого
типа, и набор операций, выполняемый
этими значениями.
Целый тип
данных
Тип
Размер
памяти
в
байтах
Диапазон
значений
char
1 от 0 до 255 без знака, от -128 до
127 со знаком
int
2 от 0 до
без знака, от —
до
-1со
знаком
short
2 от
-32768 до
32767
long
4 от
-2 147 483 648 до
2 147 483 647
unsigned
char 1 oт
0 до
255
unsigned int
2
unsigned short
2 от
0 до
65535Данные плавающего типа
Вещественный
тип данных
float
– 4 байта (от
до
).
Из них 1 байт отводится для знака, 8 бит
для избыточной экспоненты и 23 бита
для мантиссы. Старший бит мантиссы
всегда равен 1, поэтому он не заполняется,
в связи с этим диапазон значений
переменной с плавающей точкой
приблизительно равен от 3.14E-38
до 3.14E+38.
double
– 8 байт ( от
до
).
Формат аналогичен формату float.
Биты памяти распределяются следующим
образом: 1 бит для знака, 11 бит для
экспоненты и 52 бита для мантиссы. С
учетом опущенного старшего бита
мантиссы диапазон значений равен от
1.7E-308
до 1.7E+308.
long
double
– 80 бит (от
до
).
Формат аналогичен double.
Мантисса длиннее на 16 бит.
Описатели
Описатели в языке
Си позволяют объявить следующие
объекты: простые переменные, массивы,
указатели и функции. В простейшем
случае, если объявляется простая
переменная базового типа, либо
структура, либо объединение, описатель
представляет собой идентификатор.
При этом объекту присваивается тип,
заданный спецификацией типа. (int
A[10],
int
function(),
int
*A)
Составной
описатель
— это идентификатор, дополненный
более чем одним признаком типа массив,
указатель или функция. (int
*X[5]
– массив из пяти указателей на целое,
int
(*X)[5]
– указатель на массив из пяти целых,
int
*X()
– функция, возвращающая указатель на
значение типа целое)
Описатели с
модификаторами
Модифицировать
– изменить.
Модификаторы
cdecl,
pascal,
interrupt
воздействуют на идентификатор и
записываются непосредственно перед
ним. Модификаторы const,
volatile,
near,
far,
huge
воздействуют либо на сам идентификатор,
либо на указатель. Если справа от
идентификатора расположен идентификатор,
то модифицируется тип объекта,
именуемого идентификатором. Если же
справа расположен указатель, то
модифицируется указатель на данный
тип.
Модификаторы
const
и volatile
Модификатор const
не допускает явного присваивания
значения переменной либо других
косвенных действий по изменению ее
значения. (int
const
*p
– указатель на постоянное целое)
Модификатор
volatile
показывает, что значение переменной
может быть изменено и не только
программой, а также и внешним
воздействием, например программой
обработки прерываний, либо обменом с
внешним устройством.
Возможно
одновременное использование в
объявлении модификаторов const
и volatile.
Это означает, что значение объявляемой
переменной не может модифицироваться
программой, но подвержено внешним
воздействиям.
Модификаторы
cdecl
и pascal
Из программы на
Си можно обращаться к программам,
написанным на других языках, и обратно.
При смешивании языков программирования
есть две проблемы: написание внешних
имен и передача параметров. В целях
совместимости языков вводятся данные
модификаторы. Результатом работы
компилятора языка Си является файл,
содержащий объектный код программы.
Файлы с таким кодом, полученные при
компиляции всех исходных файлов
программы, компоновщик объединяет в
один выполнимый файл. При этом
производится разрешение ссылок на
глобальные объекты из разных исходных
файлов программы. При компиляции все
глобальные идентификаторы программы,
т. е. имена функций и глобальных
переменных, сохраняются в объектном
коде и используются компоновщиком в
процессе работы. По умолчанию эти
идентификаторы сохраняются в своем
первоначальном виде (т. е. набранные
прописными, строчными буквами либо и
теми, и другими). Кроме того, в качестве
первого символа каждого идентификатора
компилятор языка Си добавляет символ
подчеркивания.
Применение
модификатора pascal
приводит к тому, что идентификатор
преобразуется к верхнему регистру и
к нему не добавляется символ
подчеркивания. Этот идентификатор
может использоваться в программе на
языке Паскаль, то есть в объектном
коде, сгенерированном компилятором
языка Си, и компилятором языка Паскаль,
идентификатор будет представлен
идентично.
Существует опция
компиляции, которая присваивает всем
функциям и указателям на функции тип
pascal,
при этом с помощью модификатора cdecl
объявляются объекты с традиционной
для Си нотацией. Главная функция
программы (main)
должна быть всегда объявлена с
модификатором cdecl,
поскольку модуль поддержки выполнения
передает ей управление, используя
вызывающую последовательность языка
Си.
Модификаторы
near,
far,
huge
Эти модификаторы
оказывают воздействие на работу с
адресами объектов.
Указатель типа
near
— 16-битовый; для определения адреса
объекта он использует смещение
относительно текущего содержимого
сегментного регистра. Для указателя
типа near
доступная память ограничена размером
текущего 64-килобайтного сегмента
данных.
Указатель типа
far
— 32-битовый; он содержит как адрес
сегмента, так и смещение. При использовании
указателей типа far
допустимы обращения к памяти в пределах
1-мегабайтного раздела памяти, однако
значение указателя типа far
циклически изменяется в пределах
одного 64-килобайтного сегмента.
Указатель типа
huge
— 32-битовый; он также содержит адрес
сегмента и смещение. Значение указателя
типа huge
может быть изменено в пределах всего
1-мегабайтного адресного пространства.
Указатель типа huge
всегда хранится в нормализованном
формате.
Для вызова функции
типа near
используются машинные инструкции
ближнего вызова, для типов far
и huge
— дальнего.
Модификатор
interrupt
Модификатор
interrupt
предназначен для объявления функций,
работающих с векторами прерываний
процессора. Для функции типа interrupt
при компиляции генерируется
дополнительный код в точке входа и
выхода из функции, для сохранения и
восстановления
регистров микропроцессора. Функции
прерываний следует объявлять с типом
возвращаемого значения void.
Объявления
переменных
Простая переменная
— Скалярная переменная целого или
плавающего типа.
Переменная
перечислимого типа
— Простая переменная целого типа,
принимающая значения из предопределенного
набора именованных значений.
Структура
— Переменная, содержащая, совокупность
элементов, которые могут иметь
различные типы.
Объединение
— Переменная, содержащая совокупность
элементов, которые могут иметь различные
типы, но занимают одну и ту же область
памяти.
Массив
— Переменная, содержащая совокупность
элементов одинакового типа.
Указатель
— Переменная, которая указывает на
другую переменную (содержит ее адрес).
Объявление
простой переменной
Объявление простой
переменной определяет имя переменной
и ее тип. Можно объявить несколько
переменных в одном объявлении, задавая
список <идентификаторов>, разделенных
запятыми.
<спецификация
типа> <идентификатор>
[,<идентификатор>…];
Объявление
переменной перечислимого типа
При написании
программ часто возникает потребность
определить несколько именованных
констант, для которых требуется, чтобы
все они имели различные значения. Для
этого удобно воспользоваться
перечисляемым типом данных, все
значения которого задаются списком
целочисленных констант. Объявление
переменной перечислимого типа задает
имя переменной и определяет список
именованных констант, называемый
списком перечисления. Каждому элементу
списка перечисления ставится в
соответствие целое число. Переменная
перечислимого типа может принимать
только значения из своего списка
перечисления. Объявление переменной
перечислимого типа начинается с
ключевого слова enum. enum
[имя_типа]
{список_констант};
Объявление
структуры
Это тип данных,
позволяющий объединять в одном объекте
совокупность объектов разного типа.
Объявление структуры начинается с
ключевого слова struct.
struct
[имя] {список полей}
Список полей –
перечень объявлений. Каждое объявление
состоит из спецификации типа,
идентификатора и ;. Список полей
объявлений элементов представляет
собой последовательность из одного
или более объявлений переменных или
битовых полей. Каждая переменная,
объявленная в этом списке, называется
элементом структуры.
Объявление
объединения
Объединения
предназначены для хранения данных
различного типа в одной и той же области
памяти. Объявление объединения
специфицирует его имя и совокупность
объявлений переменных, называемых
элементами объединения, которые могут
иметь различные типы. Объявление
объединения имеет тот же синтаксис,
что и объявление структуры, за
исключением того, что оно начинается
с ключевого слова
union. union
[имя] {список полей} Значение
текущего элемента объединения теряется,
когда другому элементу объединения
присваивается значение.
Объявление
массива
Массив
– это линейная структура данных
фиксированного размера, предназначенная
для хранения однородной информации
с использованием последовательного
хранения. Каждый элемент массива
идентифицируется одним или несколькими
индексами.
Объявление массива
определяет тип элементов массива и
его имя. Оно может определять также
число элементов в массиве.
[<спецификация
типа>] <описатель> [<константное
выражение>];
Квадратные скобки,
следующие за описателем, являются
элементом языка Си, а не признаком
необязательности синтаксической
конструкции. Константное выражение,
заключенное в квадратные скобки,
определяет число элементов в массиве.
Индексация элементов массива начинается
с нуля.
Многомерный
массив, или массив массивов, объявляется
путем задания последовательности
константных выражений в квадратных
скобках, следующей за описателем:
<спецификация типа> <описатель>
[<константное выражение>] {<константное
выражение>]…;
Каждое константное
выражение в квадратных скобках
определяет число элементов в данном
измерении массива.
Объявление
указателя
Указатель — это
переменная, предназначенная для
хранения адреса объекта некоторого
типа. Объявление указателя специфицирует
тип объекта и имя переменной. В качестве
типа может быть использован один из
базовых типов, тип перечисления, пустой
тип, структура или объединение.
[<спецификация типа>] *<описатель>;
Объявление
функции
(прототип)
Объявление функции
задает имя функции и тип возвращаемого
значения. В определение функции так
же может задаваться класс памяти
функции и тип возвращаемого значения,
специфицироваться класс памяти, число
аргументов и их тип. В объявлении
функции допустимо задавать идентификаторы
и класс памяти аргументов. Если тип
возвращаемого значения не указывается,
то по умолчанию используется тип
«целый».
Формальные
параметры
— это переменные, которые принимают
значения, передаваемые функции при
вызове в соответствии с порядком
следования их имен в списке параметров.
Список может быть пустым. После
последнего идентификатора в списке
параметров может быть троеточие. Это
означает, что число параметров функции
переменно, но не меньше, чем список
идентификаторов до троеточия.
Допускается список параметров,
состоящий только из троеточия. Это
значит, что число параметров может
быть равным нулю. В случае, если функция
не имеет аргументов, при ее объявлении
рекомендуется явно указать тип void.
Тело функции
— это составной оператор, который
содержит операторы, определяющие
действия функции и определение
операторов, используемых в этой
функции.
[<спецификация
класса памяти>][<спецификация типа>]
<описатель>([<формальные параметры>])
{<тело функции>};
2.11.Выражения
в языке Си. Операнды (идентификаторы;
константы; символьные строки; вызовы
функций; индексные выражения; выбор
элемента; операции и L–выражения;
скобочные выражения; константные
выражения).
Операнды
Операндом
выражения может быть константа,
идентификатор или символьная строка.
Эти операнды могут посредством так
называемых первичных операций
комбинироваться в первичные выражения
— вызов функции, индексное выражение,
выражение выбора элемента. Эти первичные
выражения, в свою очередь, являются
операндами содержащего их выражения.
Комбинация их с другими операциями
приводит к образованию новых, более
сложных выражений, также являющихся
операндами содержащего их выражения,
и т.д. Каждый операнд имеет тип.
Идентификаторы
— это имена переменных, однозначно
определяющих соответствие переменной
с ее адресом. К идентификаторам относят:
имена переменных, функций; тэги –
имена типов структур, объединений,
перечислимых типов. Компилятор языка
Си не допускает использования
идентификаторов, совпадающих по
написанию
с ключевыми словами.
Значение
объекта, именуемого идентификатором,
зависит от типа следующим образом:
1)
Идентификаторы переменных целого и
плавающего типа представляют значения
соответствующего типа.
2)
Идентификатор переменной перечислимого
типа представляет значение одной
константы из соответствующего этому
типу списка перечисления. Тип этого
значения—int.
3)
Идентификатор структуры или объединения
представляет совокупность значений,
специфицированных этой структурой
или объединением.
4)
Идентификатор указателя представляет
адрес некоторого объекта специфицированного
типа. Если указателю не присвоено
никакого значения, то использование
его в выражении может привести к трудно
выявляемой ошибке. В языке Си определено,
что никакой программный объект не
может иметь адрес NULL (ноль), поэтому
указатель со значением NULL не указывает
ни на какой объект.
5)
Идентификатор массива представляет
массив, но если в выражении требуется
скалярная величина, то представляет
адрес первого элемента этого массива.
Тип идентификатора — указатель на
тип элементов массива. Из этого следует,
что использование в выражениях массивов
и указателей имеет много общего. Во
многих случаях способ организации
доступа к объекту — либо по указателю,
либо как к элементу массива — не имеет
принципиальной разницы и определяется
исключительно выбранным стилем
программирования. Это родство между
массивами и указателями является
существенной особенностью языка Си,
выделяющей его среди других языков
программирования высокого уровня.
Существуют,
однако, некоторые различия между
массивами и указателями. Во-первых,
указатель занимает одну ячейку памяти,
предназначенную для хранения машинного
адреса (в частности, адреса какого-либо
массива). Массив же занимает столько
ячеек памяти, сколько элементов
определено в нем при его объявлении.
Только в выражении массив представляется
своим адресом, который эквивалентен
указателю. Во-вторых, адрес массива
является постоянной величиной, поэтому,
в отличие от идентификатора указателя,
идентификатор массива не может
составлять левую часть операции
присваивания.
6)
Идентификатор функции представляет
функцию, т.е. адрес точки входа в
функцию. Тип идентификатора — функция,
возвращающая значение специфицированного
для нее типа. Однако если в выражении
требуется скалярная величина, то типом
идентификатора считается указатель
на функцию. Адрес функции не изменяется
во время выполнения программы и,
следовательно, не является переменной
величиной. Поэтому идентификатор
функции не может составлять левую
часть операции присваивания.
Константы
Целая
константа
— это десятичное, восьмеричное или
шестнадцатеричное
число, которое представляет целое
значение.
Между цифрами целой константы пробельные
символы недопустимы. Целые
константы всегда специфицируют
положительные значения. Если требуется
отрицательное значение, то необходимо
сформировать константное выражение
из знака минус и следующей за ним
константы. Знак минус рассматривается
при этом как арифметическая операция.
Каждая целая константа имеет тип,
определяющий
ее представление в памяти,
например, int.
Константа
с плавающей точкой
— это действительное десятичное
положительное число. Между цифрами
или символами константы пробельные
символы недопустимы. Константы с
плавающей точкой всегда специфицируют
положительные значения. -//-
Символьная
константа
— это буква, цифра, знак пунктуации
или специальный символ, заключенный
в апострофы. Значение символьной
константы равно коду представляемого
ею символа. Символьные константы имеют
тип
int.
Символьные
строки
Символьная
строка
— это последовательность символов,
заключенная в двойные кавычки.
Символьная строка рассматривается
как массив
символов, каждый элемент которого
представляет отдельный символ. Тип
символьной строки—массив элементов
типа char.
Число элементов в массиве равно числу
символов в символьной строке плюс
один, поскольку нулевой символ (признак
конца символьной строки) тоже является
элементом массива.
Вызовы
функций
Вызов
функции.
Передает
управление и значения фактических
аргументов функции. Выражение
вычисляется и его результат
интерпретируется как адрес функции.
Список выражений, где выражения следуют
через запятую, представляют собой
перечень фактических аргументов,
передаваемых в функцию. Он может быть
пустой. При выполнении вызова функции
значения фактических аргументов
вычисляются, над ними выполняются
необходимые преобразования, затем
они помещаются в стек, откуда эти
значения извлекаются и присваиваются
формальным параметрам. Все аргументы
передаются по значению и только массивы
по ссылке. Вызванная функция работает
с копией фактических аргументов и
никакое изменение формальных параметров
не отразится на значении аргументов.
Порядок вычисления выражений,
представляющих аргументы функции не
определен в Си, что может привести к
побочным эффектам. Функция может быть
вызвана не только по идентификатору.
При выполнении оператора возврата
return
управление передается в вызывающую
функцию. Туда же передается возвращаемое
значение, если оно есть. Функция может
возвращать значение любого типа, кроме
массива или функции. В частности, это
может быть указатель на любой тип,
включая массив или функцию. Тип
возвращаемого значения, указываемый
в определении функции, должен
соответствовать типу возвращаемого
значения во всех элементах функции.
Возврат значения выполняется при
помощи оператора return,
содержащего выражение, которое
вычисляется, преобразуется к типу
возвращаемого значения и возвращается
в точку вызова функции. Если return
отсутствует или не содержит выражение,
то возвращаемое значение не определено.
<идентификатор
функции>
(<фактические
аргументы>)
Индексные
выражения
Синтаксис:
<выражение1>[<выражение2>]
Здесь
квадратные скобки являются символами
языка Си, а не элементами описания.
Значение
индексного выражения находится по
адресу, который вычисляется как сумма
значений <выражения1>
и <выражения2>.
Одно из выражений должно быть указателем,
а другое иметь целый тип. Индексное
выражение обычно используется для
доступа к элементам массива, однако
индексацию можно применить к любому
указателю.
Выбор
элемента
Синтаксис:
<выражение>.<идентификатор>
<выражение>
-> <идентификатор>
Выражение
выбора элемента позволяет получить
доступ к элементу структуры или
объединения. Выражение имеет значение
и тип выбранного элемента.
В
первой синтаксической форме <выражение>
представляет значение типа struct
или union,
а идентификатор именует элемент
специфицированной структуры или
объединения. Во второй синтаксической
форме <выражение>
представляет указатель на структуру
или объединение, а идентификатор
именует элемент специфицированной
структуры.
Операции
и L-выражения
В
зависимости от используемых операций
выражения подразделяются на первичные,
унарные, бинарные, тернарные, выражения
присваивания и выражения приведения
типа.
Операнды
некоторых операций в языке Си должны
представлять собой так называемые
L-выражения. L-выражением является
выражение, которое ссылается на ячейку
памяти и потому имеет смысл в левой
части бинарной операции присваивания.
Простейшим примером L-выражения
является идентификатор переменной:
он ссылается на ячейку памяти, которая
хранит значение этой переменной.
Поскольку L-выражение ссылается на
ячейку памяти, адрес этой ячейки может
быть получен с помощью операции
адресации — &.
К
L-выражениям относятся:
— идентификаторы
переменных целого, плавающего,
перечислимого типов, указателей,
структур и объединений;
— индексные
выражения, исключая те из них, значение
которых имеет тип массив;
— выражение
выбора элемента, если выбранный элемент
сам является одним из допустимых
L-выражений;
— выражение
косвенной адресации, если только его
значение не имеет тип массив или
функция;
— L-выражение
в скобках;
— выражение
приведения типа переменной, если
размер результирующего типа не
превышает размера первоначального
типа.
Скобочные
выражения
Любой
операнд может быть заключен в круглые
скобки. Хотя скобки влияют на то, каким
путем группируются операнды в выражении,
они не гарантируют определенный
порядок вычисления операндов для
операций, обладающих свойством
коммутативности (мультипликативные,
аддитивные, поразрядные операции).
Константные
выражения
Константное
выражение — это выражение, результатом
вычисления которого является константа.
Операндами константного выражения
могут быть целые, символьные, плавающие
константы, константы перечислимого
типа, выражения приведения типа
константного выражения, выражения с
операцией sizeof
и другие константные выражения. Имеются
некоторые ограничения на использование
операций в константных выражениях. В
константных выражениях нельзя
использовать операции присваивания,
операцию последовательного вычисления.
Кроме того, использование операции
адресации, выражений приведения типа
и плавающих констант ограничено.
Константные
выражения, используемые в директивах
препроцессора, имеют дополнительные
ограничения, поэтому они называются
ограниченными константными выражениями.
Ограниченные константные выражения
не могут содержать операцию sizeof,
констант перечисления и выражений
приведения типа и плавающих констант.
2.12.Операции
(преобразования
по умолчанию; унарные; мультипликативные;
аддитивные; сдвига; отношения;
поразрядные; логические; последовательного
вычисления; условная; присваивания:
инкремента и декремента, простое и
составное).
Приоритет и порядок выполнения.
Побочные эффекты.
Преобразования
по умолчанию
Большинство
операций языка Си выполняют преобразование
типов для приведения своих операндов
к общему типу либо для того, чтобы
расширить значения коротких по размеру
типов до размера, используемого в
машинных операциях. Эти преобразования
называются преобразованиями по
умолчанию. (float
преобразуются к типу double,
если один операнд имеет тип double,
то второй операнд преобразуется к
типу double,
unsigned
long,
long,
unsigned
int
-//-, все операнды типов char
или short
преобразуются к типу int,
все операнды типов unsigned
char
или unsigned
short
преобразуются к типу unsigned
int,
иначе оба операнда имеют тип int).
Унарные
операции
Унарный
минус (-)
Операция унарного минуса выполняет
арифметическое отрицание своего
операнда. Операнд должен быть целым
или плавающим значением. Выполняются
преобразования операнда по умолчанию.
Тип результата совпадает с преобразованным
типом операнда.
Унарный
плюс (+)
Операция
применяется для того, чтобы запретить
компилятору языка Си реорганизовывать
скобочные выражения. Операнд унарного
плюса должен иметь целый или плавающий
тип. Над операндом выполняются
преобразования по умолчанию. Операция
унарного плюса не изменяет значения
своего операнда.
Обратный
код (~)
Операция
обратного кода вырабатывает двоичное
дополнение своего операнда, т. е.
инвертирует его битовое представление.
Операнд должен иметь целый тип. Над
операндом производятся преобразования
по умолчанию. Результат имеет тип
преобразованного операнда. Если
операнд имеет знаковый бит, то бит
знака также участвует в операции
обратного кода (инвертируется).
Логическое
отрицание (!)
Операция логического отрицания
вырабатывает значение 0, если операнд
есть ИСТИНА, и значение 1, если операнд
есть ЛОЖЬ. Результат имеет тип int.
Операнд должен иметь целый или плавающий
тип либо быть указателем.
Адресация
«&»
Операция
адресации вырабатывает адрес своего
операнда. Результат операции адресации
является указателем на операнд. Тип
результата — указатель на тип операнда.
Косвенная
адресация «*»
Операция косвенной адресации
осуществляет доступ к значению по
указателю. Ее операнд должен иметь
тип указатель. В качестве операнда
может также выступать идентификатор
массива; в этом случае он преобразуется
к указателю на тип элементов массива,
и к этому указателю применяется
операция косвенной адресации.
Результатом операции является значение,
на которое указывает операнд. Типом
результата является тип, ассоциированный
с этим указателем.
Операция
sizeof
Определяет
размер памяти, который соответствует
объекту или типу.
Мультипликативные
операции
Умножение
(*)
Операция
умножения выполняет умножение одного
из своих операндов на другой.
Деление
(/)
Операция
деления выполняет деление первого
своего операнда на
второй. Если оба операнда являются
целыми значениями
не делятся нацело, то результат
округляется в сторону нуля. Деление
на нуль дает ошибку во время выполнения.
Остаток
от деления (%)
Результатом
операции является остаток от деления
первого операнда на второй. Знак
результата совпадает со знаком
делимого.
Аддитивные
операции
Сложение
(+)
Операция
сложения складывает два своих операнда.
Операнды могут иметь целый или плавающий
тип. Типы первого и второго операндов
могут различаться. Один из операндов
может быть указателем; тогда другой
должен быть целым значением. Новый
указатель указывает на тот же самый
тип данных, что и исходный указатель.
Вычитание
(-)
Операция
вычитания вычитает второй операнд из
первого. Операнды могут иметь целый
или плавающий тип. Типы первого и
второго операндов могут различаться.
Допускается вычитание целого из
указателя и вычитание двух указателей.
Операции
сдвига
Операции
сдвига сдвигают
свой первый операнд влево (<<)
или вправо (>>)
на число разрядов машинного слова,
специфицированное вторым операндом.
Оба операнда должны быть целыми
значениями. При сдвиге влево правые
освобождающиеся биты заполняются
нулями. При сдвиге вправо метод
заполнения освобождающихся левых
битов зависит от того, какой тип
результата получен после преобразования
первого операнда.
Операции
отношения
Операции
отношения сравнивают первый операнд
со вторым и вырабатывают значение 1
(ИСТИНА) или 0 (ЛОЖЬ). Результат имеет
тип int.
Имеются следующие операции отношения:
< > <= >= == != Операнды
могут иметь целый, плавающий тип, либо
быть указателями. Типы первого и
второго операндов могут различаться.
Над операндами выполняются преобразования
по умолчанию.
Поразрядные
операции
Поразрядные
операции выполняют
над разрядами своих операндов
логические функции И (&),
включающее ИЛИ (|) и исключающее ИЛИ
(^). Операнды
поразрядных операций должны иметь
целый
тип, но бит знака, если
он есть, также участвует
в операции. Над операндами выполняются
преобразования
по умолчанию. Тип результата определяется
типом операндов посте
преобразования.
Таблица
значений для поразрядных операций:
|
х |
0 |
0 |
1 |
1 |
|
у |
0 |
1 |
0 |
1 |
|
х|у |
0 |
1 |
1 |
1 |
|
х&у |
0 |
0 |
0 |
1 |
|
x^y |
0 |
1 |
1 |
0 |
Логические
операции
Логические
операции
не выполняют преобразования по
умолчанию. Вместо этого они вычисляют
операнды и сравнивают их с нулем.
Результатом логической операции
является либо 0 (ЛОЖЬ), либо 1 (ИСТИНА).
Тип результата — int.
Логическое
И (&&)
Логическая операция И вырабатывает
значение 1, если оба операнда имеют
ненулевое значение. Если один из
операндов равен нулю, то результат
также равен нулю. Если значение первого
операнда равно нулю, то значение
второго операнда не вычисляется.
Логическое
ИЛИ (||)
Логическая операция ИЛИ выполняет
над своими операндами операцию
включающее ИЛИ. Она вырабатывает
значение 0, если оба операнда имеют
значение 0; если какой-либо из операндов
имеет ненулевое значение, то результат
операции равен
1. Если первый операнд не равен нулю,
то значение второго операнда не
вычисляется.
Операция
последовательного
вычисления
Операция
последовательного вычисления
последовательно вычисляет два своих
операнда, сначала первый, затем второй.
Оба операнда являются выражениями.
Синтаксис операции: <выражение1>,
<выражение2>
Знак операции — запятая, разделяющая
операнды. Результат операции имеет
значение и тип второго операнда.
Ограничения на типы операндов (т. е.
типы результатов выражений) не
накладываются, преобразования типов
не выполняются.
Условная
операция
В
языке Си имеется одна тернарная
операция — уловная.
Она имеет следующий синтаксис:
<операнд1>
?
<операнд2>:
<операнд3>.
Выражение <операнд1>
вычисляется и сравнивается с нулем.
Выражение может
иметь целый, плавающий тип, либо быть
указателем. Если <операнд1>
имеет ненулевое значение, то вычисляется
<операнд2>
и результатом условной операции
является его значение. Если же <операнд1>
равен нулю, то вычисляется <операнд3>
и результатом
является его значение. В любом случае
вычисляется только один из операндов,
<операнд2>
или <операнд3>,
но не оба.
Пример:
j
=
(i
<
0 )?(-i)
:
(i);
Если
i
меньше нуля, то j
присваивается -i.
Если i
больше или равно нулю, то j
присваивается i.
Операции
присваивания
|
++ — = *= /= %= += -= <<= >>= &= |= ^= |
Унарный Унарный Простое Умножение Деление Остаток Сложение Вычитание Сдвиг Сдвиг Поразрядное Поразрядное Поразрядное |
При
присваивании
тип правого операнда преобразуется
к типу левого операнда.
Операции
инкремента и декремента
Операции
++
и
— инкрементируют
(увеличивают на единицу) и декрементируют
(уменьшают на единицу) свой операнд.
Операнд должен иметь целый, плавающий
тип или быть указателем.
Простое
присваивание
Операция
простого присваивания обозначается
знаком =.
Значение правого операнда присваивается
левому операнду. При присваивании
выполняются правила преобразования
типов.
Составное
присваивание
Операция
составного присваивания состоит из
простой операции присваивания,
скомбинированной с какой-либо другой
бинарной операцией. При составном
присваивании вначале выполняется
действие, специфицированное бинарной
операцией, а затем результат присваивается
левому операнду.
Приоритет
и порядок выполнения
Приоритет
и ассоциативность операций языка Си
влияют на порядок группирования
операндов и вычисления операций в
выражении. Приоритет операций существен
только при наличии нескольких операций,
имеющих различный приоритет. Выражения
с более приоритетными операциями
вычисляются первыми.
Приоритет
и ассоциативность операций в языке
Си
|
Знак |
Наименование |
Ассоциативность |
|
() |
Первичные |
Слева |
|
+ |
Унарные |
Справа |
|
* |
Мультипликативные |
Слева |
|
+ |
Аддитивные |
Слева |
|
>> |
Сдвиг |
Слева |
|
< |
Отношение |
Слева |
|
== |
Отношение |
Слева |
|
& |
Поразрядное |
Слева |
|
^ |
Поразрядное |
Слева |
|
| |
Поразрядное |
Слева |
|
&& |
Логическое |
Слева |
|
|| |
Логическое |
Слева |
|
?: |
Условная |
Справа |
|
= |
Простое |
Справа |
|
, |
Последовательное |
Слева |
Побочные
эффекты
Побочный
эффект выражается в неявном изменении
значения переменной в процессе
вычисления выражения. Все операции
присваивания могут вызывать побочный
эффект. Вызов функции, в которой
изменяется значение какой-либо внешней
переменной, либо путем явного
присваивания, либо через указатель,
также имеет побочный эффект.
13.
Преобразование типов
(при присваивании; явные; при вызовах
функций).
При
выполнении операций происходят неявные
преобразования типов
в следующих случаях:
—
при выполнении операций осуществляются
обычные арифметические преобразования;
—
при выполнении операций присваивания,
если значение одного типа присваивается
переменной другого типа;
—
при передаче аргументов функции.
Кроме
того, в С есть возможность явного
приведения
значения одного типа к другому.
В
операциях присваивания
тип значения, которое присваивается,
преобразуется к типу переменной,
получающей это значение. Допускается
преобразования целых и плавающих
типов, даже если такое преобразование
ведет к потере информации. Целое со
знаком преобразуется к более короткому
целому со знаком, посредством усечения
старших битов. Целое со знаком
преобразуется к более длинному целому
со знаком, путем размножения знака.
При преобразовании целого со знаком
к целому без знака, целое со знаком
преобразуется к размеру целого без
знака и результат рассматривается
как значение без знака. Преобразование
целого со знаком к плавающему типу
происходит без потери информации, за
исключением случая преобразования
значения типа long int или unsigned long int к
типу float, когда точность часто может
быть потеряна. Целое без знака
преобразуется к более короткому целому
без знака или со знаком путем усечения
старших битов. Целое без знака
преобразуется к более длинному целому
без знака или со знаком путем дополнения
нулей слева. Когда целое без знака
преобразуется к целому со знаком того
же размера, битовое представление не
изменяется. Поэтому значение, которое
оно представляет, изменяется, если
знаковый бит установлен (равен 1), т.е.
когда исходное целое без знака больше
чем максимальное положительное целое
со знаком, такой же длины. Целые значения
без знака преобразуются к плавающему
типу, путем преобразования целого без
знака к значению типа signed long, а затем
значение signed long преобразуется в
плавающий тип. Преобразования из
unsigned long к типу float, double или long double
производятся с потерей информации,
если преобразуемое значение больше,
чем максимальное положительное
значение, которое может быть представлено
для типа long. Величины типа float
преобразуются к типу double без изменения
значения. Величины double и long double
преобразуются к float c некоторой потерей
точности. Если значение слишком велико
для float, то происходит потеря значимости,
о чем сообщается во время выполнения.
При
преобразовании величины с плавающей
точкой к целым типам она сначала
преобразуется к типу long (дробная часть
плавающей величины при этом
отбрасывается), а затем величина типа
long преобразуется к требуемому целому
типу. Если значение слишком велико
для long, то результат преобразования
не определен. Преобразования из float,
double или long double к типу unsigned long производится
с потерей точности, если преобразуемое
значение больше, чем максимально
возможное положительное значение,
представленное типом long. Преобразования,
выполняемые над аргументами при
вызове функции,
зависят от того, был ли задан прототип
функции со списком объявлений типов
аргументов. Если задан прототип функции
и он включает объявление типов
аргументов, то над аргументами в вызове
функции выполняются только обычные
арифметические преобразования. Эти
преобразования выполняются независимо
для каждого аргумента. Величины типа
float преобразуются к double, величины типа
char и short преобразуются к int, величины
типов unsigned char и unsigned short преобразуются
к unsigned int. Могут быть также выполнены
неявные преобразования переменных
типа указатель. Задавая прототипы
функций, можно переопределить эти
неявные преобразования и позволить
компилятору выполнить контроль типов.
Явное преобразование типов может быть
осуществлено посредством операции
приведения типов, которая имеет формат:
(
<имя типа> ) операнд
В
приведенной записи <имя типа> задает
тип, к которому должен быть преобразован
операнд.
2.14.Операторы
языка Си (понятие
оператора; пустой оператор; составной
оператор; оператор–выражение; условный
оператор if; оператор пошагового цикла
for; оператор цикла с предусловием
while; оператор цикла с постусловием do;
оператор продолжения continue;
оператор–переключатель switch; оператор
разрыва break; оператор перехода goto;
оператор возврата return).
Понятие
оператора
Операторы
языка Си управляют процессом выполнения
программы.
Пустой
оператор — это
оператор, состоящий только из точки
с запятой. Он может появиться в любом
месте программы, где по правилам
синтаксиса требуется оператор.
Выполнение пустого оператора не меняет
состояния программы.
Составной
оператор Действие
составного оператора заключается в
последовательном выполнении содержащихся
в нем операторов, за исключением тех
случаев, когда какой-либо оператор
явно передает управление в другое
место программы.
В
начале составного оператора могут
содержаться объявления. Они служат
для определения переменных, локальных
для данного блока, либо для распространения
на данный блок области действия
глобальных объектов.
Типично
использование составного оператора
в качестве тела другого оператора,
например оператора if.
Оператор-выражение
Значение
содержащегося в нем выражения никак
не используется. Кроме того, он может
быть записан лишь там, где по синтаксису
допустим оператор.
Условный
оператор if
Формат
оператора:
if
(выражение) оператор1; [else оператор2;]
Выполнение
оператора if начинается с вычисления
выражения.
Далее
выполнение осуществляется по следующей
схеме:
—
если выражение истинно (т.е. отлично
от 0), то выполняется оператор1.
—
если выражение ложно (т.е. равно 0),то
выполняется оператор2.
—
если выражение ложно и отсутствует
оператор2, то выполняется следующий
за if оператор.
Допускается
использование вложенных операторов
if.
Оператор
пошагового цикла for
Оператор
for — это наиболее общий способ организации
цикла. Он имеет следующий формат:
for
( выражение 1 ; выражение 2 ; выражение
3 ) тело;
Выражение
1 обычно используется для установления
начального значения переменных,
управляющих циклом. Выражение 2 — это
выражение, определяющее условие, при
котором тело цикла будет выполняться.
Выражение 3 определяет изменение
переменных, управляющих циклом после
каждого выполнения тела цикла.
Схема
выполнения оператора for:
1.
Вычисляется выражение 1.
2.
Вычисляется выражение 2.
3.
Если значения выражения 2 отлично от
нуля (истина), выполняется тело цикла,
вычисляется выражение 3 и осуществляется
переход к пункту 2, если выражение 2
равно нулю (ложь), то управление
передается на оператор, следующий за
оператором for.
Другим
вариантом использования оператора
for является бесконечный цикл. Для
организации такого цикла можно
использовать пустое условное выражение,
а для выхода из цикла обычно используют
дополнительное условие и оператор
break.
Оператор
цикла с предусловием while
Оператор
цикла while называется циклом с предусловием
и имеет следующий формат:
while
(выражение) тело;
Схема
выполнения оператора while следующая:
1.
Вычисляется выражение.
2.
Если выражение ложно, то выполнение
оператора while заканчивается и выполняется
следующий по порядку оператор. Если
выражение истинно, то выполняется
тело оператора while.
3.
Процесс повторяется с пункта 1.
Оператор
цикла с постусловием do while
Оператор
цикла do while называется оператором
цикла с постусловием и используется
в тех случаях, когда необходимо
выполнить тело цикла хотя бы один раз.
Формат оператора имеет следующий вид:
do
тело while (выражение);
Схема
выполнения оператора do while :
1.
Выполняется тело цикла (которое может
быть составным оператором).
2.
Вычисляется выражение.
3.
Если выражение ложно, то выполнение
оператора do while заканчивается и
выполняется следующий по порядку
оператор. Если выражение истинно, то
выполнение оператора продолжается с
пункта 1.
Оператор
продолжения continue передает
управление на следующую итерацию в
операторах цикла do, for, while. Он может
появиться только в теле этих операторов.
Остающиеся в теле цикла операторы при
этом не выполняются.
Оператор-переключатель
switch
Синтаксис:
switch(<выражение>)
{
[<объявление>]
[case
<константное-выражение>:] [<оператор>]
[case
<константное-выражение>:] [<оператор>]
[default:]
[<оператор>]
}
Оператор-переключатель
switch предназначен для выбора одного
из нескольких альтернативных путей
выполнения программы. Выполнение
оператора-переключателя начинается
с вычисления значения выражения
переключения (выражения, следующего
за ключевым словом switch в круглых
скобках). После этого управление
передается одному из <операторов>
тела переключателя. Оператор, следующий
за ключевым словом default, выполняется,
если ни одна из констант варианта не
равна значению выражения переключения.
Если же слово default опущено, то ни один
оператор в теле переключателя не
выполняется, и управление передается
на оператор, следующий за переключателем
в программе.
Оператор
разрыва break прерывает
выполнение операторов do, for, while или
switch. Он может содержаться только в
теле этих операторов. Управление
передается оператору программы,
следующему за прерванным.
Оператор
перехода goto
Оператор
перехода goto передает управление
непосредственно на <оператор>,
помеченный <меткой>. Метка представляет
собой обычный идентификатор. Область
действия метки ограничивается функцией,
в которой она определена; из этого
следует, во-первых, что каждая метка
должна быть отлична от других меток
в той же самой функции; во-вторых, что
нельзя передать управление по оператору
goto в другую функцию.
Помеченный
оператор выполняется сразу после
выполнения оператора goto. Нельзя с
помощью оператора goto передать управление
на конструкции case и default в теле
переключателя.
Оператор
возврата return заканчивает
выполнение функции, в которой он
содержится, и возвращает управление
в вызывающую функцию. Управление
передается в точку вызывающей функции,
непосредственно следующую за оператором
вызова.
2.15.Функции
в языке Си. Понятие функции. Определение
функции (класс
памяти; модификаторы типа функции;
типы возвращаемых значений; формальные
параметры; тело функции).
Объявление функции. Вызов функции
(фактические
аргументы; вызов функции с переменным
числом аргументов; рекурсивные вызовы).
Программирование рекурсивных
алгоритмов.
Функция
—
Совокупность объявлений и операторов,
предназначенных для выполнения
некоторых отдельных задач. Количество
функций в программе не ограничено.
Любая программа на Си содержит как
минимум одну функцию с именем main.
Определение
функции
специфицирует имя функции, атрибуты
ее формальных параметров и тело
функции, содержащее объявление
операторов. В определении функции
также может задаваться класс памяти
функции и тип возвращаемого значения.
Объявление
функции
задает имя функции и тип возвращаемого
значения. В определение функции так
же может задаваться класс памяти
функции и тип возвращаемого значения.
В объявлении функции так же может
специфицироваться класс памяти, число
аргументов и их тип. В объявлении
функции допустимо задавать идентификаторы
и класс памяти аргументов. Если тип
возвращаемого значения не указывается,
то по умолчанию используется тип
«целый». К моменту вызова функции
должен быть известен тип возвращаемого
значения. Что требует предварительного
объявления, если это необходимо.
Формальные
параметры.
Это переменные, которые принимают
значения, передаваемые функции при
вызове в соответствии с порядком
следования их имен в списке параметров.
Список параметров содержит в круглых
скобках идентификаторы, разделенные
запятыми, при этом, для каждого
идентификатора используется один
тип. Список может быть пустым. После
последнего идентификатора в списке
параметров может быть троеточие. Это
означает, что число параметров функции
переменно, но не меньше, чем список
идентификаторов до троеточия. Для
доступа к значениям параметров, имена
которых не заданы в списке формальных
параметров, используется макроопределение.
Допускается список параметров,
состоящий только из троеточия. Это
значит, что число параметров может
быть равным нулю.
Формальные
параметры могут иметь базовый тип,
тип «структура», «объединение», либо
быть указателем или массивом. Массив
воспринимается как указатель на тип
элементов массива. Параметры могут
иметь класс памяти auto
или register
(auto
– по умолчанию). Если параметр
представлен, но не объявлен, считается,
что он имеет тип int.
Идентификаторы формальных параметров
не могут совпадать с параметрами
внутри тела функции. Однако возможно
локальное переобъявление локальных
параметров внутри локальных блоков
функции. В случае, если имеется
переменное число параметров, то
программист отвечает за их определение.
Тип каждого параметра должен
соответствовать типу фактического
аргумента при вызове функции, а также
типу соответствующего параметра в
предварительном объявлении со списком
типов.
Компилятор
выполняет преобразование типа отдельно
над каждым формальным параметром и
фактическим аргументом. После
преобразования все формальные параметры
имеют тип размером не меньше, чем int.
При
наличии идентификаторов типа адресации
компилятор также может неявно
преобразовать указатели в зависимости
от типа указателей и выбранной модели
памяти. Несоответствие типов формальных
параметров и фактических аргументов
приводит к неправильной интерпретации
извлекаемых из стека значений формальных
параметров. В случае, если функция не
имеет аргументов, при ее объявлении
рекомендуется явно указать тип void.
Тело
функции.
Это составной оператор, который
содержит операторы, определяющие
действия функции и определение
операторов, используемых в этой
функции. Все элементы, объявленные в
функции, имеют по умолчанию класс
auto,
но можно присвоить и другой. При вызове
функции выделяется память для локальных
переменных, и, если указано, проводится
их инициализация. Управление передается
первому оператору составного оператора.
Выполнение функции продолжается до
тех пор, пока не встретится return,
либо не будет достигнут конец составного
оператора. Возвращение выполняется
в точку вызова функции.
Вызов функции
передает управление от вызывающей к
вызываемой функции, при этом значение
фактических аргументов при их наличии
передаются в вызываемую функцию. Все
аргументы передаются по значению и
только массивы по ссылке. При выполнении
вызова функции значения фактических
аргументов вычисляются, над ними
выполняются необходимые преобразования,
затем они помещаются в стек, откуда
эти значения извлекаются и присваиваются
формальным параметрам. Вызванная
функция работает с копией фактических
аргументов и никакое изменение
формальных параметров не отразится
на значении аргументов. При выполнении
оператора возврата return
управление передается в вызывающую
функцию. Туда же передается возвращаемое
значение, если оно есть. Функция может
возвращать значение любого типа, кроме
массива или функции. В частности, это
может быть указатель на любой тип,
включая массив или функцию. Тип
возвращаемого значения, указываемый
в определении функции, должен
соответствовать типу возвращаемого
значения во всех элементах функции.
Для вызова функции с целым возвращаемым
значением предварительного объявления
не требуется. Для других типов функций
объявление необходимо. Возврат значения
выполняется при помощи оператора
return,
содержащего выражение, которое
вычисляется, преобразуется к типу
возвращаемого значения и возвращается
в точку вызова функции. Если return
отсутствует или не содержит выражение,
то возвращаемое значение не определено.
Рекурсивные
функции.
Любая
функция в Си может быть вызвана
рекурсивно. Рекурсивным называется
вызов, при котором функция содержит
вызов самой себя, либо вызов другой
функции, которая вызывает первую
функцию. Компилятор не ограничивает
число рекурсивных вызовов в Си. При
каждом рекурсивном вызове для переменных
выделяются новые области памяти, если
их класс не stack
и не extern.
Число рекурсивных вызовов фактически
ограничивается объемом памяти, который
необходим для хранения локальных
переменных функции с классом памяти
auto.
Правила
построения рекурсии:
-
Необходимо
определить условие прекращения
рекурсивных вызовов и порядок выхода
из функции -
Для
рекурсивного вызова определить
параметр, изменение которого перед
каждым вызовом приведет к получению
истинного результата и условию,
указанному в первом пункте -
Необходимо
определить собственно действие,
выполняемое при каждом рекурсивном
вызове функции.
2.16.
Директивы препроцессора и указания
компилятору языка С
(основные понятия и определения;
именованные константы и макроопределения:
директива #define,
склейка лексем и преобразование
аргументов макроопределений, директива
#undef;
включение файлов; условная компиляция:
директивы
#if, #elif, #else, #endif, #ifdef, #ifndef;
управление нумерацией строк; директива
обработки ошибок; пустая директива;
указания компилятору; псевдопеременные).
Директивы
препроцессора. Указания компилятору.
Препроцессор
— собой макропроцессор, используемый
для обработки исходного файла на
нулевой фазе компиляции. Компилятор
Си сам вызывает препроцессор, однако
препроцессор может быть вызван
автономно. Препроцессор представляет
собой инструкции, записанные в исходном
коде и предназначенные для выполнения
препроц. Директива препроцессора
обычно используется для облегчения
модификации исходных текстов программ
и чтобы сделать их более независимыми
от особенностей различных реализаций
компилятора, разных компьютеров и ос.
Признаком директивы препроцессора
является символ #. Директивы могут
быть записаны в любом месте исходного
файла, но их действие распространяется
только от точки программы, в которой
они записаны, до конца исходного файла.
Именованные
константы. Макроопределения
Идентификаторы,
представляющие собой последовательность
действий, заданной операторами и
выражениями, называют макроопределениями.
Обращение к макроопределениям называют
макровызовом.
Директива
#define
используется
для замены часто используемых в
программе выражений: констант, ключевых
слов, выражений осмысленными
идентификаторами.
#define
идентификатор_константы замещающий
текст
После
появления этой строки в файле все
встретившиеся далее в тексте программы
имена, совпавшие с элементом директивы:
дентификатор_константы, будут
автоматически заменены на указанный
в директиве замещающий_текст прежде,
чем начнется компиляция программы.
Символические константы дают возможность
программисту присвоить константе имя
и использовать его далее в программе.
Если возникнет необходимость изменить
значение константы во всей программе,
для этого достаточно будет внести
только одно изменение в директиву
препроцессора #define
и перекомпилировать программу;
значение константы будет изменено по
всей программе автоматически.
(#define
Pi
3.14)
Операция
#
преобразует подставляемую лексему в
строку символов, взятую в кавычки.
Операция
##
выполняет конкатенацию (сцепление,
склеивание) двух лексем. Рассмотрим
следующее макроопределение:
#define
TOKENCONCAT(х,
у) х ## у
Когда
в программе встречается макрос
TOKENCONCAT,
его
аргументы склеиваются и полученное
выражение используется для замещения
идентификатора макроса. Например,
TOKENCONCAT
(О, К) будет
замещаться в тексте программы на ОК.
Операция ## должна иметь два операнда.
Директива
#undef
Определения
символических констант и макросов
могут быть аннулированы при помощи
директивы препроцессора #undef,
имеющей вид:
#undef
идентификатор
Директива
отменяет определение символической
константы или макроса с указанным
идентификатором. Таким образом, область
действия символической константы или
макроса начинается с места их определения
и заканчивает явным их аннулированием
директивой #undef
или концом файла.
Директива
#include
применяется
для включения копии указанного в
директиве файла в то месте, где находится
эта директива. Обработка директивы
#include
препроцессором сводится к тому, что
директива убирается из текста и на ее
место заносится копия указанного
файла. Директива #include
обычно используется для включения
стандартных заголовочных файлов.
Директива #include
используется также при работе с
программами, состоящими из нескольких
исходных файлов, которые должны
компилироваться вместе.
Условная
компиляция: директивы #if,
#endif,
#ifdef,
#ifndef,
#else,
#elif
Условная
компиляция дает возможность программисту
управлять выполнением директив
препроцессора и компиляцией программного
кода. Каждая условная директива
препроцессора вычисляет значение
целочисленного константного выражения.
Условная
директива препроцессора #if
во многом похожа на оператор if.
Ее синтаксис имеет вид:
#if
условие
фрагмент
кода
#endif
В
этой записи условие является
целочисленным выражением. Если это
выражение возвращает не нуль (истинно),
то фрагмент кода, заключенный между
директивой #if
и директивой #endif,
компилируется. Если же выражение
возвращает нуль (ложно), то этот фрагмент
игнорируется и препроцессором, и
компилятором. В условиях, помимо
обычных выражений, можно использовать
конструкцию: defined.
Идентификатор defined
возвращает 1, если указанный идентификатор
ранее был определен директивой #define,
и возвращает 0 в противном случае.
Конструкция #if
defined
может быть заменена эквивалентной ей
директивой #ifdef,
а конструкция #if
!defined
— директивой #ifndef.
Можно
использовать более сложные конструкции
условных директив препроцессора при
помощи директив #elif
(эквивалент else
if
в обычной структуре if)
и #else
(эквивалент else
в структуре if).
Например, в коде
Директива
препроцессора #line
задает
целочисленное константное начальное
значение номера строки для нумерации
следующих за директивой строк исходного
текста программы. Директива
#line
100
задает
начальное значение номера строки,
равное 100, и все последующие строки
исходного текста программы будут
нумероваться, начиная с этого номера.
Директива
препроцессора #error
имеет
следующий синтаксис: #error
лексемы
Директива
печатает сообщение об ошибке, зависящее
от используемой системы и содержащее
заданные в директиве лексемы. Лексемы
представляют собой группы символов,
отделяемые друг от друга пробелами.
Указания
компилятору
Помимо
директив препроцессора на ход компиляции
оказывают влияние указания компилятору.
К ним могут быть отнесены выражения,
влияющие на размер стековой памяти.
На эту константу влияет STK_LEN.
Также размер стека может быть определен
с помощью соответствующего ключа
командной строки. Псевдопеременные
Каждая
такая переменная начинается и
заканчивается двойными символами
подчеркивания и записывается заглавными
буквами.
__LINE__содержит
номер текущей строки
__FILE__имя
компилируемого исходного файла
__DATE__дата
начала компиляции
__TIME__время
начала компиляции
1.
История
развития и классификация языков
программирования
(по уровню близости к аппаратному
обеспечению; по степени автоматизации
процесса программирования; по
направлению использования создаваемого
прикладного программного обеспечения).
Язык
программирования
– набор ключевых слов и система
грамматических и синтаксических
правил для конструирования операторов
с помощью которых человек сообщает
компьютеру последовательность команд.
История
развития: 1.
В машинных кодах; 2. Язык ASSEMBLER;
3. Язык FORTRUN
1954; 4. Язык COBOL
1960; 5. BASIC
1963; 6. PASCAL
1970 (Николас Вирт); 7. С 1972 (Ритчи, Кернеган).
Язык
С хорошо зарекомендовал себя
эффективностью, лаконичностью записи
алгоритмов, логической стройностью
программ. Во многих случаях программы,
написанные на
языке С, сравнимы по скорости с
программами, написанными на языке
ассемблера; при этом они более наглядны
и просты в сопровождении. Одним
из основных достоинств языка Си
считается высокая переносимость
написанных на нем программ между
компьютерами с различной архитектурой,
между различными операционными
средами. Язык С имеет ряд существенных
особенностей, которые выделяют его
среди других языков программирования.
Это язык программирования высокого
уровня, обеспечивающий необычайно
легкий доступ к аппаратным средствам
компьютера. Иногда С называют языком
программирования «среднего»
уровня. С одной стороны, как и другие
современные
языки высокого уровня, язык С поддерживает
полный набор конструкций структурного
программирования,
модульность, блочную структуру
программ, раздельную компиляцию. С
другой стороны, в С реализованы
некоторые операции низкого уровня (в
частности, операции над битами).
Некоторые из таких операций напрямую
соответствуют машинным командам.
Базовые типы данных языка С отражают
те же объекты, с которыми приходится
иметь дело в программе на языке
ассемблера, — байты, машинные слова,
символы, строки. Несмотря на наличие
в языке С развитых средств построения
составных объектов (массивов и
структур), в нем практически отсутствуют
средства для работы с ними как с единым
целым (нельзя, например, сложить две
структуры). Язык С поддерживает механизм
указателей на переменные и функции.
Поддерживается арифметика указателей,
что позволяет осуществлять
непосредственный
доступ и работу с адресами памяти
практически так же легко, как на языке
ассемблера.
Несмотря
на эффективность и мощность конструкций
языка С, он относительно мал по объему.
В нем отсутствуют встроенные операторы
для выполнения ввода-вывода, динамического
распределения памяти, управления
процессами и т.п., однако в системное
окружение языка С входит библиотека
стандартных функций, в которой
реализованы подобные действия. Вынос
этих функций в библиотеку позволяет
отделить особенности архитектуры
конкретного компьютера и соглашений
операционной системы от реализации
языка, сделать программу
максимально независимой от деталей
реализации операционной среды. В то
же время программисты могут пользоваться
системными библиотечными программами,
чтобы более
эффективно использовать особенности
конкретных операционных сред.
Классификация
языков программирования:
Процедурно-ориентированный
язык
–
яп, в котором есть возможность описания
программ как совокупности процедур.
Процедуры имеют возможность вызова
других процедур и самих себя (рекурсия).
Программа может быть представлена
одной процедурой, считающейся главной.
Процедура
– Часть программы выполняющая некоторые
операции над данными в соответствии
с задаваемыми параметрами. К процедурным
языкам программирования относятся
фортран, си, паскаль, Алгол.
Логическое
программирование
– класс языков, который основывается
на символической логике. Пример:
пролог. Логические языки программирования
наиболее приспособлены для реализации
в рамках вычислительных архитектур
с высокой степенью параллелизма.
Логические языки программирования
являются основными при проектировании
систем искусственного интеллекта,
систем управления базами знаний и
экспертных систем. Логические языки
программирования позволяют хранить
информацию в базах фактов и знаний,
которые представляются в них в виде
решающих правил. Вычисления сводятся
к определению фактов и продуцированию
выводов на основе логики вида «если
существует факт 1, то сущ. факт 2» или
«если истина А, то выполнить В».
Функциональный
язык программирования
– класс языков программирования,
основанных на идеях лямбда-исчисления
и теории рекурсивных функций. Программы
представляют собой неупорядоченный
набор уравнений, определяющих функции
и их значения рекурсивно через функцию
и значения, которые задаются функцией
от других значений. В конечном итоге
полный набор уравнений достаточен
для определения всех функций и значений
через элементарные функции и значения,
имеющиеся в языке. Среди задаваемых
значений содержатся требуемые
результаты, которые вычисляются в
ходе выполнения программы. Пример:
Лисп — предназначен для обработки
нецифровых данных. Основной структурой
данных этого языка является список,
элементами которого служат атомы.
Собственно программы также представляют
собой список, т.о. и программы и данные
имеют одинаковую структуру. Лисп
используется при программировании в
области искусственного интеллекта.
Объектно-ориентированные
языки программирования.
В данном подходе проектирования
программ понятия процедуры и данных,
которые используются в других подходах
программирования заменены на понятие
объекта и сообщения. Объект – это
пакет информации в совокупности с
описанием порядка манипулирования
этой информацией. Сообщения –
спецификация условий выполнения одной
из операций обработки объекта. В
отличие от процедуры, которая описывает,
как должна проходить обработка,
сообщения определяют, что желает
отправитель, а получатель – что должно
произойти. В этом подходе к проектированию
программ используются следующие
основные понятия: инкапсуляция,
полиморфизм, наследование.
Инкапсуляция
– хранение в объекте данных и методов
их обработки. Этот принцип позволяет
жестко ограничить набор способов
модифицирования данных. Наследование
позволяет создавать объекты с
использованием средств ранее
использованных объектов. Полиморфизм
позволяет автоматизировать процесс
обработки данных за счет автоматического
выбора способов обработки в зависимости
от вида данных. Все это значительно
повышает производительность.
Классификация
языков программирования:
1. Неструктурный (преобразование
машинных кодов на языке Assembler);
2. Модульные (задачи→подзадачи
→алгоритмы→функции); 3. Логический
подход; 4. Объектно-ориентированный
подход; 5. Функциональный подход; 6.
Смешанный подход; 7. Компонентно-ориентированный
подход;
2.
Понятие формального алгоритма. Тезис
Тьюринга – Черча об эквивалентности
различных определений вычислимости.
Понятие
формального алгоритма.
Алгоритм
– это
заранее заданная последовательность
четко определенных правил или команд
для получения решения задачи за
конечное число шагов. Эффективным
называют алгоритм, допускающий
эффективную вычислительную реализацию.
Понятие эффективной вычислимости
предложено Тьюрингом 1936 г. Функция
эффективно вычислима,
если существует алгоритм правильно
ее вычисляющий и удовлетворяющий
следующим требованиям:
1.
он состоит из конечного множества
простых команд, для которых однозначно
определен порядок исполнения.
2.
Вычисления должны закончиться и дать
результат за конечное число шагов,
если аргумент принадлежит области
определения и не должен приводить ни
к каким результатам, если аргумент не
из области определения.
Тезис
Тьюринга-Черча об эквивалентности
различных определений вычислимости.
До
Тьюринга для определения формального
алгоритма использовалось определение
Черча. Определение основано на общей
рекурсивности Геделя. В 1936 г. Тьюринг
и Черч выдвинули тезис о том, что
определения вычислимости могут быть
сведены к определению Тьюринга. В
частности любой алгоритм можно признать
вычислимым, если он допускает реализацию
на машине Тьюринга. Машина Тьюринга
– гипотетическая. Для неё определены
правила выполнения элементарных
определённых операций.
12.Средства
выполнения программ. Понятие операционной
системы для прикладного программиста.
Интерфейс прикладного программиста
с операционной системой, понятие API.
Система программирования (средство
поддержки программирования; средство
поддержки программных разработок).
Понятие
о библиотеках программ, их использование.
Операционная
система
– набор программ, управляющих
оперативной памятью, внешними
устройствами, процессором и файлами,
ведущими диалог с пользователем.
Перечень
функций с описанием способа их вызова,
входа и выхода параметров, доступных
из прикладных программ и выполняемых
операционной системой называется
интерфейсом
прикладных программ.
API
– Application
PI
– набор функций операционной системы,
позволяющих прикладным программам
осуществить взаимодействие с аппаратным
обеспечением ОС. К ним относят работу
с файловой системой, взаимодействие
с оперативной памятью, операции ввода/
вывода.
Например.
Вызов функции из программы на языке
с вывода на экран printf
приводит к вызову функции ОС, которая
позволяет выводить символ на экран.
Взаимодействие
с функцией API
реализуется через механизм программных
прерываний. При вызове функции
генерируется соответствующее
прерывание, тип которого определяется
номером и значением определенного
регистра.
Система
поддержки программных разработок
– это вычислительная система,
обеспечивающая необходимую поддержку
проектировщика в фазе разработки
программ при создании систем программного
обеспечения. Такая система в стандартном
ее варианте представляет простую базу
данных в качестве информационного
архива и инструментальные программные
средства для редактирования исходных
текстов программ компилирования,
компоновки, загрузки и отладки.
Несмотря
на эффективность и мощность конструкций
языка Си, он относительно мал по объему.
В нем отсутствуют встроенные операторы
для выполнения ввода-вывода, динамического
распределения памяти, управления
процессами и т.п., однако в системное
окружение языка Си входит библиотека
стандартных функций, в которой
реализованы подобные действия. Вынос
этих функций в библиотеку позволяет
отделить особенности архитектуры
конкретного компьютера и соглашений
операционной системы от реализации
языка, сделать программу максимально
независимой от деталей реализации
операционной среды. В то же время
программисты могут пользоваться
системными библиотечными программами,
чтобы более эффективно использовать
особенности конкретных операционных
сред. Библиотека программ — совокупность
отдельных программ в программных
пакетах, которые предназначены для
всеобщего использования в какой-либо
определенной среде.
3.
Абстрактная машина фон Неймана. Понятие
об элементарном исполнителе.
Нейман
предложил трехкомпонентную архитектуру,
получившее название треугольник Фон
— Неймана. В Фон-Неймановская архитектура
ЭВМвключает в себя:
1)ЦП
– объединяющий в себе УУ(устройство
управления) и АЛУ(арифметико-логическое
устройство).
2)
ЗУ — запоминающее устройство — память.
3)УВВ
— устройство ввода-вывода.
Классификация
памяти:
1.постоянная; 2.оперативная
Программы
и данные должны храниться в памяти.
Ввод/вывод осуществляется через
устройство ввода/вывода. Общее
управление осуществляет ЦП. Между УВВ
и ЗУ предусмотрена связь, т. к. при
выполнении медленных операций
ввода-вывода, ЦП может выполнять другие
вычисления, не требующие ввода-вывода.
А специальное устройство – контроллер
прямого доступа к памяти управляет
процессом передачи данных между ЗУ и
УВВ. Под программой
понимают набор команд, извлекаемые в
порядке их следования, либо в соответствии
с управляющими командами. Данные
хранятся в виде переменных, которые
могут быть поименованы для последующей
реализации и изменения. Программы
данных хранятся в памяти. Память
– последовательность ячеек для
хранения порций информации. Доступ к
информации ячеек осуществляется в
соответствии с адресом (порядковым
номером) информация хранится в двоичном
виде.
Единица
информации бит, байт – минимально
адресуемая в памяти единица информации
(1 байт=8 бит). Одним байтом может быть
закодировано 28,
т. е. 256 различных значений. Байты
объединяются в слова, двоичные слова.
Размер машинного слова – разрядность
ЭВМ.
Классификация
памяти:
постоянная и оперативная.
В
процессоре объединены два устройства
— УУ — для считывания команд данных из
памяти и общей координации команд и
АЛУ — для простейших логических и
арифметических операций.
Регистры
–
быстродействующие ячейки памяти,
расположенные на кристалле процессора.
Регистры
специального назначения и регистры
общего назначения:
РОН
предназначены для логических и
арифметических операций. РСН – в их
состав входят счетчик команд; регистр
состояния программы; регистр указателя
стека. Счетчик команд хранит адрес
следующей команды; регистр состояние
программы – обязательно включает в
себя флаги (1/0, да/нет, правда/ложь,
true/false),
характеризующие результат выполнения
последней программы. Флаги используются
для выполнения условных операций.
Регистр стека – хранит адрес вершины
стека. Стек
– область памяти, доступ к которой
осуществляется по принципу LIFO.
Арифметико-логическое
устройство процессора предназначено
для выполнения операций в соответствии
с кодом команды над данными, которые
указываются в качестве аргумента.
Команда
пересылки.
По
ней данные, определяемые 1-м операндом
пересылаются по месту хранения, которое
определяется 2-м операндом. Данные
пересылаются по адресу со смещением.
При этом говорят о непосредственной
адресации в случае, если указаны
данные; прямой адресации данных, если
указан адрес данных; косвенной, если
указывается адрес адреса данных;
индексная, если указан индекс блока
адреса и смещение.
Команды
перехода.
Командам
безусловного перехода соответствует
оператор goto; вместе с кодом операции
указывается операнд определяющий
адрес команды на которую передается
управление. Фактически осуществляется
команда пересылки адреса команды в
реестр счетчика команд. Для задания
адреса могут использоваться различные
виды адресации. При команде условного
перехода пересылка адреса выполняется
в случае истинности условия перехода,
что определяется значениями файлов
регистра состояния программы.
Арифметические
операции.
-
«+»
(выполняется в прямом коде). -
«-»
(реализуется как сложение уменьшаемого
с вычитаемым, которое представляется
в дополнительном коде). -
Умножение
(выполняется как комбинация сложений
и сдвигов). -
Деление
— комбинация вычитаний и сдвигов с
определением частного и остатка. -
Операции
над числами с плавающей точкой. -
Операции
над действительными числами выполняются
в зависимости от форм представления
(с фиксированной или с плавающей
точкой). -
Выполняется
в виде совокупности операций или над
мантиссой и характеристикой числа.
Логические
операции.
-
И
(++ = +, +- = -, — = -) -
ИЛИ
(++ = +, +- = +, — = -) -
НЕ
-
ИСКЛЮЧАЮЩЕЕ
ИЛИ (++ = +, +- = неоднозначность, — = -).
Другие
операции:
команды останова, команды работы со
стеком, пустую операцию, команды вызова
подпрограммы, команда обмена, команда
цикла. Они могут быть реализованы как
комбинация пересылок, переходов,
арифметических или логических действий,
но присутствуют в виде отдельных
команд из-за частого использования.
Понятие
об элементарном исполнителе.
Выполнение
программы на машинном языке осуществляется
следующим образом: в счетчик команд
заносится адрес первой исполняемой
команды. Устройство управления
считывает по этому адресу код операции,
дешифрует его, определяет количество
операндов, место их размещения.
Дешифрованная информация передается
арифметико-логическому устройству.
Также при этом значение регистра и
счетчика команд увеличивается на
размер команды, включая операнды. Если
код команды соответствует команде
перехода, то в регистр счётчика команд
заносится адрес перехода. Процедура
повторяется до тех пор, пока не возникнет
исключительная ситуация: или внешнее
прерывание, или пока не встретится
команда остановок. ЦП является
элементарным исполнителем для алгоритма
исполняемой программы.
4.
Основные этапы решения задач на ЭВМ:
математическая постановка; алгоритм;
программа; отладка и тестирование;
сдача в эксплуатацию.
Основные
этапы решения задач на ЭВМ.
1.
Осознание проблемы и формулировка
задачи, нацеленной на решение данной
проблемы. Каждый этап решения должен
быть зафиксирован в виде результата,
представленного в определенной форме.
Результат представляется на естественном
языке.
2.
Формальная постановка задачи. Форма
представления – естественный язык
или язык математики.
3.
Разработка метода и алгоритма решения
задачи. Форма представления – язык
математики.
4.
Разработка структур данных и процедур
для работы с ними. Проектирование
общей организации программы. Форма
представления – псевдоязык или язык
программирования. Часто исп. визуальные
псевдоязыки, т. е. наборы диаграмм.
5.
Перевод алгоритма на язык программирования.
Форма представления – язык
программирования.
6.
Разработка системы тестов и отладка
программы. Форма представления – язык
программирования или машинный язык.
7.
Решение поставленной задачи, получение
результатов вычислений. Форма
представления – язык таблиц, графиков,
рисунков.
8.
Обработка результатов вычисления и
их интерпретация. Форма представления
– математический или естественный
язык.
Постановка
задачи и спецификация программ.
Постановка
задачи — важнейший этап в разработке
программы. Результатом должна быть
спецификация программы. Программная
спецификация — точное описание того
результата, который необходимо получить
с помощью программы- это описание
должно точно устанавливать что должна
делать программа не указывая как она
должна это делать. Для программ,
заканчивающих свою работу каким-либо
результатом программная спецификация
может иметь форму спецификации
ввода-вывода, которая описывает
желаемое отображение множества входных
величин и множества выходных величин.
Для циклических программ в которых
нельзя указать точку завершения
невозможно дать спецификацию
ввода-вывода поэтому специфицируются
отдельные функции, реализуемые
программой в ходе циклических операций.
Способы
записи алгоритма.
Графический
вид представления алгоритма в
текстовом виде на псевдоязыке
программирования (естественный язык
с ограничениями для записи алгоритмической
конструкцией).
Ошибки
в программе включают в себя :
1.
синтаксические ошибки, определяемые
транслятором
2.
ошибки этапа выполнения (ошибки
арифметических операций (деление на
0), переполнение, потеря значимости…).
Для
устранения подобных ошибок надо
проводить предварительный анализ
значений аргументов. Отличие результата
от ожидаемого происходит из-за выхода
за допустимые диапазоны. Решается
переопределением последних действий.
5.
Критерии качества программы (надежность,
эффективность, модифицируемость,
возможность многократного использования,
стиль программирования).
Критерии
качества программного обеспечения.
К
критериям качества относят: правильность
программы, надежность, эффективность,
модифицируемость, возможность
многократного использования, стиль
программирования.
Программа
называется
правильной
в случае, если семантика программы
соответствует предъявляемым к ней
требования, изложенным в спецификации
этой программы. Спецификацией программы
называют точное описание того
результата, который необходимо достичь
с помощью программы. Это описание
должно устанавливать, что должна
делать программа, не указывая как
должна делать.
Надежность
программного обеспечения — характеристика
способности системы программного
обеспечения выполнять возложенные
на нее функции при поступлении
требований на их выполнение. Понятие
надежности программного обеспечения
существенно отличается от понятия
доказательства правильности если
семантика программы соответствует
предъявляемым требованиям изложенным
в спецификации программы, т.е.
правильность — некоторое статическое
свойство, в котором в соответствии со
спецификацией должна обладать
программа. Надежность — динамические
требования, предъявляемые к системе
и способности системы удовлетворять
этим требованиям. Программа, являющаяся
правильной может считаться ненадежной,
если спецификации, которым она
удовлетворяет, не охватывает всех
требований пользователя к этой системе.
С другой стороны программа не являющаяся
полностью правильной считается
надежной, если допущенные в ней ошибки
незначительные, либо если пользователь
достаточно просто может их избежать.
Эффективность
программного
обеспечения может характеризоваться
двумя способами:
1.
С учетом объема используемой памяти;
2.
С учетом быстродействия программы.
Скорость
работы и расход памяти являются
характеристиками, вступающими в
противоречие. Быстрые алгоритмы обычно
занимают большие объемы при реализации,
а программы с экономией памяти
выполняются более долго.
Модифицируемость.
Программа
должна быть написана так, чтобы любые
изменения в алгоритме требовали
минимальных исправлений текста
программы. Например, рекомендуется
вместо численных и строковых констант
использовать define.
Или вместо явного задания числа
определить константу. Также для
повышения модифицируемости рекомендуется
использовать принцип модульности,
т.е. группировать операторы в блоки в
соответствии с целью, достигаемой при
их выполнении, после чего заменять их
вызовом функции, а сам блок операторов
переносить в определение функции.
Возможность
многократного использования.
Программа
должна быть универсальна, т.е. давать
решение при различных входных данных.
Стиль
программирования
предполагает читабельность. Такие
программы содержат необходимые
комментарии, и оформлены так, что видны
логические блоки.
6.
Диалоговые программы, дружественность
(интерфейс
человек–компьютер, процессы
ввода–вывода, структура диалога,
поддержка пользователя).
Диалоговые
программы.
1.
Понятие интерфейса человек-компьютер;
2.
Процессы ввода- вывода;
3.
Структура диалога;
4.
Поддержка пользователя.
По
способу общения программы с пользователем
прикладные программы подразделяют
на программы, функционирующие в
автоматическом режиме (без участия
человека) и диалоговые программы.
Диалог с программой может осуществляться
в пакетном и интерактивном режимах.
В первом случае параметры работы
программы определяются пользователем
до начала работы программы и передается
в нее, например, в виде файла. В
интерактивном режиме программа
функционирует в режиме вопрос- ответ.
Способ взаимодействия определяется
интерфейсом программы.
Интерфейс
– это система унифицированных связей,
определяющих способ взаимодействия
между компонентами аппаратного
обеспечения, компонентами вычислительной
системы, между человеком и вычислительной
системой и т.д.
Взаимодействие
в интерактивном режиме обычно
организуется по следующей схемам:
1.
Режим командной строки (программа
получает параметры работы из строки
ввода с помощью команд). Например, ОС
MS-DOS.
2.
Система меню (программа получает
управляющий сигнал при выборе
пользователя элементов из списков, в
которых перечислены все возможные
варианты функционирования программы).
Также пользователь имеет возможность
вводить различные числовые значения
в поля ввода. Например, Norton
Commander.
3.
Интерфейс, ориентированный на
координатное устройство, типа мыши.
Включает в себя все элементы из 2
пункта, и также позволяет осуществлять
выбор в соответствии с положением
элемента интерфейса относительно
окна с помощью мыши. То есть взаимодействие
с программой осуществляется через
окно.
При
проектировании интерфейса
человек-компьютер должны учитываться
требования, призванные обеспечить
эффективность взаимодействия
пользователя и системы.
1.
Интерфейс должен быть естественным,
т.е. диалог с пользователем должен
осуществляться на языке понятном для
сферы решаемой задачи. Желательно,
чтобы компьютер общался с пользователем
с использованием терминологии, принятой
пользователем до использования
вычислительной системы.
2.
Интерфейс должен быть последовательным:
необходимо, чтоб каждое текущее
действие пользователя определялось
результатом предыдущих действий.
Реализуется с помощью системы
иерархического меню.
3.
Интерфейс должен быть не
избыточным.
Реализация этого требования определяется
правилом: количество воспринимаемой
информации ограничено количеством
знаков восприятия.
4.
Интерфейс должен быть дружественным,
т. е. должен обеспечивать поддержку
пользователя. Достигается вызовом
справочной информации по желанию
пользователя, в которой указывается
текущее состояние программы и варианты
возможных действий.
5.
Интерфейс должен быть гибким
— реализуется с помощью включения в
систему функций настройки интерфейса.
7.
Жизненный цикл программы (период
от первоначальной концепции до
морального устаревания: выработка
требований к системе, разработка
требований к программному обеспечению,
общее проектирование, детальное
проектирование, создание отдельных
модулей, тестирование отдельных
модулей системы, объединение модулей
в систему, выпуск системы, эксплуатация
и сопровождение системы; итеративность
фаз цикла).
Жизненный
цикл программы – это переход от
первоначальной концепции до морального
устаревания.
Он
включает в себя следующие этапы:
1.
выработка требований к системе;
2.
разработка требований к программному
обеспечению;
3.
общее проектирование;
4.
детальное проектирование;
5.
создание отдельных модулей;
6.
тестирование отдельных модулей;
7.
объединение модулей в систему;
8.
выпуск системы;
9.
эксплуатация и сопровождение системы.
Например
при разработке АС было принято следующее
разграничение фаз жизненного цикла
программы:
1).
Предпроектное исследование объекта.
2).
Оформление технического задания —
документа, содержащего спецификацию
всех информационных и управляющих
функций с указанием входов/выходов,
а также требования к видам обеспечения
ОС: математическим, лингвистическим,
техническим, организационным.
3).
Разработка технического проекта (все
функции описаны подробно).
4).
Разработка рабочего проекта (прототипа
системы).
5).
Экспериментальное внедрение.
6).
Сдача в промышленную эксплуатацию.
7).
Промышленная эксплуатация системы.
Все
фазы жизненного цикла программы
обладают свойством итеративности
– прохождение
одних и тех же этапов.
После выполнения каждого этапа по его
результатам принимается решение о
возможности перехода к следующей фазе
или о необходимости проведения
дополнительных работ по предшествующим
этапам. Например, после фазы тестирования
отдельных модулей может возникнуть
необходимость возврата к этапу
разработки требований программного
обеспечения. Если недостаточна
точность, то требуется заменить среду
разработки программ или, если это
невозможно, возврат к разработке
требований к системе, где необходимо
пересмотреть перечень функций, решаемых
системой.
8.
Постановка задачи и спецификация
программы (представление
в виде спецификации ввода–вывода;
особенности спецификации для
завершающихся и циклических программ);
способы записи алгоритма.
Постановка
задачи и спецификация программ.
Постановка
задачи – важнейший этап в разработке
программы. Результатом должна быть
спецификация программы. Программная
спецификация
– точное описание того результата,
который необходимо получить с помощью
программы. Это описание должно точно
устанавливать, что должна делать
программа, не указывая, как она должна
это делать. Для программ, заканчивающих
свою работу каким-либо результатом,
программная спецификация может иметь
форму спецификации ввода-вывода,
которая описывает желаемое отображение
множества входных величин и множества
выходных величин.Для циклических
программ, в которых нельзя указать
точку завершения, невозможно дать
спецификацию ввода-вывода, поэтому
специфицируются отдельные функции,
реализуемые программой в ходе
циклических операций.
Способы
записи алгоритмов.
Графический
вид представлений, например, в виде
блок-схемы, либо текстовый вид на
псевдоязыке. Графическая форма
наглядна, но громоздка и подходит
только для понимания общего смысла
алгоритма. Запись на псевдоязыке, в
котором присутствует ограничение для
алгоритмических конструкций, более
предпочтительна для детализированных
описаний. Такая запись называется
псевдокод. При составлении псевдокода
можно учитывать конструкции того
языка программирования, на котором,
скорее всего, будет производиться
реализация.
9.
Способы конструирования программ
(простое кодирование алгоритма;
нисходящее проектирование – метод
пошаговой детализации).
Псевдокод
—
это искусственный и неформальный
язык, который помогает программисту
разрабатывать алгоритмы. Псевдокод
используется для разработки алгоритмов,
которые потом должны быть преобразованы
в структурированную программу на C++.
Псевдокод подобен разговорному
языку; он удобный и дружелюбный, но
это не язык программирования.
Программы
на псевдокоде не могут выполняться
на компьютере. Их назначение —
помочь программисту «обдумать
программу» прежде, чем попытаться
написать ее на таком языке программирования,
как C++. Тщательно подготовленная
программа на псевдокоде может быть
легко преобразована в соответствующую
программу на C++. Во многих случаях для
этого достаточно просто заменить
предложения псевдокода их эквивалентами
в языке С++.
Псевдокод
включает только исполняемые операторы
— те, которые выполняются, когда
программа переведена из псевдокода
на C++ и запущена на счет. Объявления
не являются исполняемыми операторами.
Блок-схема
— это графическое представление
алгоритма или фрагмента алгоритма.
Блок-схема рисуется с использованием
специальных символов, таких, как
прямоугольники, ромбы, овалы и малые
окружности; эти символы соединяются
стрелками, называемыми линиями
связи.
Подобно
псевдокоду блок-схемы часто используются
при разработке и описании алгоритмов,
хотя большинство программистов
предпочитает псевдокод. Блок-схемы
наглядно показывают, как действуют
управляющие структуры.
Нисходящее
проектирование – метод пошаговой
детализации
Нисходящее
проектирование.
-
по
алгоритму программы создается текст
главного модуля, содержащего в виде
комментариев основны6е этапы решения
задачи. Желательно, чтобы каждая
строка комментария представляла
собой вызов подпрограммы, решающей
подзадачу главной задачи -
основные
этапы заменяются строчкой кода,
представляющего собой вызов функции,
соответствующей этапу решения задачи.
Выбирается имя функции, тип возвращаемого
значения и определяется список
параметров. -
По
каждой вновь созданной1 функции
записывается определение. Тело функции
содержит комментарии. Процедура
повторяется до тех пор, пока комментарии
не будут заменены кодом на языке С
Нисходящее
проектирование
– подход к проектированию программ,
при котором первоначально создается
главный модуль, для которого затем
проводится декомпозиция (разбиение
на модули, решающие подзадачи главной
задачи).
Метод
нисходящего проектирования
предполагает последовательное
разложение общей функции обработки
данных на простые функциональные
элементы («сверху-вниз»). В
результате строится иерархическая
схема, отражающая состав и
взаимоподчиненность отдельных функций.
Создание
программы с использованием технологии
нисходящей (сверху-вниз) разработки
с пошаговой детализацией. Эта
технология является неотъемлемой
частью создания хорошо структурированных
программ. Она начинаем с записи
псевдокода вершины.
Вершина
— это единственное предложение
(оператор), выражающее общее назначение
программы. Таким образом, вершина
отображает всю программу в целом.
К сожалению, вершина редко отображает
достаточное количество деталей, на
основании которых можно написать
программу на C++. Поэтому надо начинать
процесс детализации. Для этого вершину
делят на ряд более мелких задач и
записывают их в том порядке, в котором
они должны выполняться. В результате
получают первую
детализацию: здесь
использована только структура
следования — записанные шаги должны
выполняться последовательно один за
другим.
Каждая
детализация, так же, как и сама вершина,
является полным описанием алгоритма;
меняется только уровень детализации.
Многие
программы могут быть логически
разделены на три этапа: этап задания
начальных значений, в котором задаются
начальные значения переменных
программы; этап обработки данных,
в котором вводятся данные и устанавливаются
значения соответствующих переменных
программы; заключительный этап, в
котором вычисляются и печатаются
окончательные результаты.
Программист
завершает процесс нисходящей разработки
с пошаговой детализацией, когда
алгоритм на псевдокоде настолько
детализирован, чтобы его псевдокод
можно было бы преобразовать в программу
на C++. Реализованная программа на C+ +
окажется в этом случае простой и
наглядной.
10.Модульные
программы
(основные понятия; критерии разбиения;
принцип утаивания информации Д. Парнаса;
разбиение на основе целевой функции,
на основе выделения однотипных этапов
обработки; декомпозиция на основе
абстрактных типов данных). Восходящее
проектирование программы.
Восходящее
проектирование
(снизу вверх) – подход к проектированию,
при котором в основной задаче
определяются минимальные подзадачи,
решение которых возможно без
использования вызовов дополнительных
вновь создаваемых модулей. После того,
как все подзадачи будут представлены
в виде программных модулей, формируются
вызывающие модули, решающие более
крупные задачи. Процедура повторяется
до тех пор, пока не будет получен
главный модуль, решающий основную
задачу. Это способ программирования
при котором вся программа разбивается
на группу компонентов, называемых
модулями. Каждый со своими контролируемыми
размерами, четким значением и хорошо
определенным интерфейсом с внешней
средой.
Поскольку
естественная альтернатива — создание
монолитной программы, что крайне
неудобно, вопрос заключается в том,
должны ли программы разбиваться на
модули, а в том, каким должен быть
критерий разбиения. Эту проблему решил
Парнас, который предложил, чтоб одним
из критериев считался принцип утаивания
информации. До этого разбиение на
модули обычно осуществлялось на основе
какой-нибудь целевой функции или на
основе выделения однотипных этапов
обработки выполняемой программы, что
давало совсем незначительный выигрыш.
Еще раньше основное внимание
сосредотачивалось на декомпозиции,
основанной на использовании абстрактных
типов данных. Это разбиение на модули
может удачно сочетаться с принципом
утаивания информации.
Принцип
утаивания информации Д. Парнаса
Для
обоих подходов к проектированию
программы (восходящее и нисходящее
проектирование) важнейшим этапом
является способ взаимодействия между
модулями. В соответствии с принципом
утаивания информации Парнаса никакие
данные, используемые внутри модуля
не могут быть доступны извне, кроме
тех, которые передаются через интерфейс
ввода/ вывода, определяемых списком
параметров.
11.Основы
доказательства правильности
(соответствие семантики программы
требованиям ее спецификации;
доказательство общей правильности;
двухэтапное доказательство правильности;
частичная правильность: совместимость
семантики с предусловием и постусловием;
инварианты циклов; концепция вполне
упорядоченного множества – основа
доказательства отсутствия зацикливаний).
Верификация
и тестирование программы.
Доказательство
правильности
— это подтверждение того, что семантика
программы соответствует предъявляемым
требованиям, изложенным в спецификации
этой программы. Существуют два
предварительных условия для построения
такого доказательства: необходимо
иметь формальное описание программы
и формальное определение используемого
языка программирования. Такое
определение может принимать фирму
системы аксиом, охватывающих
семантические правила для любого
простого оператора в языке, и набора
правил вывода, показывающих, как
семантики составных операторов к
числу которых относится и целостная
программа.
Интерпретированные
пооперационно утверждения характеризуют
состояние программы. Доказательство
строится на следующей схеме: если
выполнение программы начинается в
состоянии, когда входное утверждение
истинно, то работа программы в итоге
должна завершаться состоянием, при
котором выходное утверждение тоже
истинно. Этот тип доказательства
известен как доказательство
общей правильности.
Традиционно, однако, такое доказательство
часто выполняется в два
этапа.
Вначале доказывается правильность
частей программы (частичная
правильность);
считается, что, если программа
завершается нормально, то это происходит
в состоянии, для которого выходное
утверждение истинно. На втором этапе
доказывается правильность завершения
программы; в результате этого
доказательства показывается, что
программа завершила работу нормально,
а не преждевременно.
Совместимость
семантики с предусловием и постусловием.
Описание
программы может очень удобно
представляться в форме двух утверждений:
входного и выходного. Для того чтобы
проверить правильность программы,
необходимо сформулировать предусловие
– выражение, определяющее значение
до начала работы группы операторов и
постусловие
– выражение, определяющее значение
после окончания работы группы
операторов.
Если
выражение на входе и на выходе
соответствует ожидаемому, то группу
операторов можно считать семантически
правильной. Для доказательства
правильности циклических участков в
ней включают так называемые инварианты
циклов. Инвариант- это утверждение,
которое остается истинным при некотором
преобразовании или отображении. При
доказательстве правильности инвариантом
является некоторое утверждение о
свойствах фрагментов программы,
который остается истинным не смотря
выполненную часть этого аргумента.
Инвариант
цикла
– выражение, значение которого не
изменяется при каждом прохождении
цикла.
Для
доказательства факта завершения
программы необходимо доказать:
1)Что
программа не зациклилась
2)Что
программа не остановлена преждевременно
Подтверждение
того, что программа в конце концов
выйдет из цикла может быть основано
на концепции вполне упорядоченного
множества. Доказательство правильности
программы не дает полного решения
надежности программы. Так же практически
всегда невозможно машинное доказательство
правильности. Наибольшие трудности
возникают при отсутствии понимания
замысла разработчиков. Машинную
проверку правильности программы
называют верификацией
программы. Тест по возможности
составляют так, чтоб были рассмотрены
все комбинации значений из перечисленного
ряда.
13.
Программа на языке высокого уровня.
Язык программирования С.
Программа
на языке высокого уровня
Программа
– алгоритм, записанный на языке
программирования + структура данных,
с которыми работает программа. Этапы
существования ПО (не жизненный цикл
программы): подвергается трансляции
– процедура
перевода с языка высокого уровня на
машинный язык. В ходе трансляции может
использоваться переход на промежуточный
язык – кросстрансляции, в качестве
промежуточного языка может использоваться
язык ассемблера. Ассемблер
– программа, осуществляющая перевод
с языка ассемблера на машинный язык.
Машинный
язык
– язык, использующий машинные команды,
записанные в формате воспринимаемом
конкретным вычислительным устройством.
Транслятор
– программа, выполняющая процедуру
трансляции. Существует 2 вида: компилятор
и интерпретатор.
Компилятор
– осуществляет перевод текста программы
на машинный язык целиком. Результат
работы – объектный файл, содержащий
программу на машинном языке и информацию
о данных, используемых программой.
Объектный файл обрабатывается
компоновщиком (линкером) или редактором
связи. Компоновщик
обрабатывает
объектные файлы, разрешает внешние
ссылки (делает доступным вызовы
объектов функций или данных из других
объектных файлов или стандартных
библиотек), осуществляет необходимую
подготовительную работу для последующей
загрузки программы на исполнение.
Загрузчик программ, осуществляющих
размещение исполняемого кода и данных
в памяти ЭВМ и передающий управление
первой исполняемой команде программы.
В случае персональных ЭВМ функции
загрузчика распределены между ОС и
кодом, включаемым в исполняемый файл.
Исполнение программы начинается с
загрузки в регистр счетчика исполняемых
команд ЦП, адреса первой исполняемой
команды программы. Устройство управления
считывает по этому адресу код команды,
в соответствии с ним считывает значения
операндов, передает код и операнды
АЛУ, которое выполняет необходимые
операции. По завершению выполнения
команды значение регистра счетчика
команд увеличивается на значение
длины команды, которая известна по
коду операции. Процедура повторяется
до тех пор, пока не будет встречена
команда stop.
Исполняемая программа обычно завершается
возвратом управления программе,
вызвавшей данную программу (ОС).
Интерпретатор
– покомандно или построчно считывает
программу на исходном языке, переводит
на машинный язык и отправляет на
выполнение. Входом является программа
на языке программирования. Результат
– построчно выполняемая команда.
Компилятор
языка С воспринимает исходный файл,
содержащий программу на языке С, как
последовательность текстовых строк.
Каждая строка завершена символом
новой строки. Этот символ вставляется
текстовым редактором при нажатии
клавиши ENTER (ВВОД).
Компилятор
языка С последовательно считывает
строки программы и разбивает
каждую из считанных строк на группы
символов, называемые лексемами.
Лексема—это
единица текста программы, которая
имеет самостоятельный смысл для
компилятора языка С и которая не
содержит в себе других лексем. Никакие
лексемы, кроме символьных строк, не
могут продолжаться на последующих
строках текста программы. Знаки
операций, константы, идентификаторы
и ключевые слова, описанные в этом
разделе, являются примерами лексем.
Разделители, например квадратные
скобки [],
фигурные скобки {},
круглые скобки (), угловые скобки < >
и запятые, также являются лексемами.
Внутри идентификаторов, ключевых
слов, а также знаков операций, состоящих
из нескольких символов, пробельные
символы недопустимы. Когда компилятор
языка Си выделяет отдельную лексему,
он пытается включить в нее последовательно
столько символов, сколько возможно,
прежде чем перейти к выделению следующей
лексемы. Рассмотрим, например, следующее
выражение: i+++j В
этом примере компилятор языка Си
вначале сформирует из первых двух
знаков «плюс» операцию инкремента
(++), а из оставшегося знака плюс —
операцию сложения. Выражение
проинтерпретируется как (i++)+(j), а не
как (i)+(++j).В подобных случаях рекомендуется
для ясности разделять лексемы
пробельными символами или круглыми
скобками.
Введение.
Язык программирования – набор
ключевых слов и система грамматических
и синтаксических правил для конструирования
операторов, состоящих из групп или строф
знаков, с помощью которых человек
сообщает компьютеру последовательность
команд.
Специфика в том, что обозначения понятны
человеку и могут быть преобразованы в
последовательность машинных команд.
Классификация языков
программирования:
-
Неструктурный (преобразование машинных
кодов на языке Assembler); -
Модульные (задачи→подзадачи
→алгоритмы→функции); -
Логический подход;
-
Объектно-ориентированный подход;
-
Функциональный подход;
-
Смешанный подход;
-
Компонентно-ориентированный подход;
Транслятор – программа для перевода
программы понятных человеку символов
в программу машинных кодов.
Понятие формального алгоритма.
Формальный алгоритм – заранее
заданная последовательность чётко
определённых правил или команд для
получения решения задач за конечное
число шагов.
Рабочая лента – линейно-упорядоченный
массив переменной длины. В каждой ячейке
1 символ. Переменная-указатель –
управляющая головка, которая в любой
момент времени указывает на какую-либо
ячейку рабочей ленты.
Эффективность алгоритма
– алгоритм или функция эффективно
вычислима, если существует алгоритм
правильно её вычисляющий и удовлетворяющий
следующим требованиям:
-
Состоит из конечного множества простых
команд, для которых однозначно определён
порядок исполнения; -
Вычисления должны закончиться и дать
результат в конечное число шагов; -
Если аргумент принадлежит области
определения, не должны приводить к
результату: аргумент не принадлежит
области определения.
Эффективным называется алгоритм, который
допускает эффективную вычислительную
реализацию.
20-е года ХХв. – машина Тьюринга (Гильберт,
Черч (основа понятий рекурсивной
функции), Клини, Пост, Тьюринг (описание
алгоритмического процесса))
1936- выдвинута концепция автоматического
устройства, способного выполнить любое
мыслимое вычисление.
Абстрактная машина.
∆Фон Неймана (1945-ЭДВАК 3-хкомпонентная
архитектура).
Такая ЭВМ выполняет программу, которая
должна храниться в памяти, где хранятся
и данные этой программы.
ЗУ и УВВ – прямой доступ в памяти.
Переменная – область в памяти.
Память – последовательность ячеек
для хранения порции информации. Доступ
к информации осуществляется в соответствии
с адресом этой ячейки или в порядке
очереди.
Классификация памяти:
-
постоянная;
-
оперативная = временная (v ↑)
УУ – для считывания команд данных из
памяти и общая координация команд.
АЛУ – для выполнения простейших
арифметических и логических операций.
Основные
этапы решения задач на ЭВМ.
-
Осознание проблемы, формулировка
задачи; -
Формальная постановка задачи
(формируется цель, описывается её
содержание), что будет делать программа,
не указывая как), анализируется характер,
сущность всех величин, используемых в
задаче, определяется условие, при
которых она решается, результатом
данного этапа является спецификация
программы);
Спецификация программы –
точное описание того результата,
который необходимо получить с помощью
программы.
-
Выбор или разработка метода решения
задач (с учетом особенностей, метод
должен привести задачу к конкретным
машинным операциям); -
Разработка алгоритма решения задач
(процесс обработки разбивается на
отдельные относительно самостоятельные
блоки); -
Разработка структур данных и
архитектуры программы (начиная с
проектирования архитектуры, общих
структур данных); -
Перевод алгоритма на язык
программирования (требуются языки
высокого уровня с соответствующим
транслятором в машинный код); -
Разработка системы теста, отладка
и тестирование программы
(поиск и устранение синтаксических и
логических ошибок в программе).
Синтаксический контроль выполняет
транслятор, который выявляет конструкции
и сочетания символов, недопустимые с
точки зрения языка программирования.
После устранения синтаксических ошибок
проверяется логика работы в процессе
её выполнения с конкретными исходными
данными); -
Решение поставленной задачи и анализ
результатов (выполняется многократное
решение задач на ЭВМ для различных
наборов исходных данных. Получаемый
результат интерпретируется специалистом
или пользователем, составившим задачу).
Этапы связаны друг с другом, но некоторые
могут отсутствовать. Неудовлетворительный
результат приводит к пересмотру одного
или нескольких предшествующих этапов.
Критерии
качества ПО.
-
Функциональные возможности.
(Описывает свойства ПО в части полноты
удовлетворения требований пользователя.
Оценка качества ПО должна начинаться
с точного и формального установления
предъявляемых требований и поверки
соответствия ПО данным требованиям.) -
Надежность ПО – характеристика
его способностей выполнять возложенные
функции при поступлении запросов на
их выполнение. В отличие от надежности
правильность ПО – соответствие
предъявляемым требованиям, то есть
различие в том, что правильность –
некоторое статическое свойство, которым
в соответствии со спецификацией должна
обладать программа. Надежность –
динамические требования к работоспособностям
системы. -
Практичность:
-
Простота использования;
-
Модифицируемость (характер трудоемкости
внесения изменений в программу при
ошибках и др.) -
Сопровождаемость
-
Возможность многократного использования
(наличие отдельных частей, модулей и
тому подобное, которые могут быть в
неизменном виде или с небольшими
изменениями перенесены в другие
программы) -
Мобильность — набор атрибутов, относящихся
к соотношению между уровнем качества
функций ПО и объемом используемых
ресурсов при установленных условиях.
Характеризуется 2 способами: с учетом
v используемой памяти,
быстродействия программы.
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Отлично
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Отлично
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отлично
Отличный сайт
Лично меня всё устраивает — и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Отлично
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Хорошо
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Отлично
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Отлично
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отлично
Отзыв о системе «Студизба»
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Хорошо
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Отлично
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Отлично
Установление факта соблюдения либо несоблюдения действующего законодательства в сфере обеспечения санитарно-эпидемиологического благополучия населения
Истечение трех лет со дня окончания проведения последней плановой проверки юридического лица, индивидуального предпринимателя
398600, г. Липецк, ул. Московская, 30
398600, г. Липецк, ул. Московская, 30
Руководители или уполномоченные представители юридического лица или ИП, присутствовавшие при проведении проверки
Родюкова Людмила Владимировна, Ведищев Виталий Викторович, Челядин Владимир Леонидович, Юрова Елена Ивановна, Чебакова Ольга Николаевна
Описание
В автотранспортном цехе ФГБОУ ВО ЛГТУ нарушаются требования ФЗ от 23.02.2013 г. №15-ФЗ «Об охране здоровья граждан от воздействия окружающего табачного дыма и последствий потребления табака»: отсутствуют знаки о запрете курения на входных воротах гаража (п. 1, п. 5 Приказ от 12 мая 2014 г. N 214н «Об утверждении требований к знаку о запрете курения и к порядку его размещения»; в гаражном боксе находится емкость с окурками сигарет, свидетельствующих о курении работниками в данном помещении,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Начальник автотранспорта Кузнецов Петр Михайлович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| 10000 |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2018 года |
| В автотранспортном цехе ФГБОУ ВО ЛГТУ вывесить знаки о запрете курения на входных воротах гаража, убрать в гараже емкость с окурками сигарет, свидетельствующих о курении работниками в данных помещениях. |
Описание
1. Не соблюдаются требования к организации и проведению санитарно-противоэпидемических мероприятий, направленных на профилактику онкологической заболеваемости: — в ФГБОУ ВО ЛГТУ присутствуют факторы, которые являются канцерогеноопасными (сварочные аэрозоли, ультрафиолетовое излучение, минеральные масла, отработавшие газы дизельных двигателей), в соответствии с СанПиН 1.2.2353-08 «Канцерогенные факторы и основные требования к профилактике канцерогенной опасности» с целью обеспечения санитарно-эпидемиологического благополучия человека в канцерогеноопасных организациях проводится санитарно-гигиеническая паспортизация; в ФГБОУ ВО ЛГТУ не проведена санитарно-гигиеническая паспортизация канцерогеноопасного производства; — не в полном объеме определены вредные и опасные производственные факторы в утвержденном списке контингентов, подлежащих прохождению медицинских осмотров (канцероген — ультрафиолетовое излучение в профессии электрогазосварщика); — сварочная аэрозоль в профессии электрогазосварщика, минеральные масла в утвержденном списке контингентов, подлежащем прохождению медицинских осмотров не обозначена как канцерогенный фактор пунктом 1.1.2. «Канцерогены», что не позволяет в полном объеме обеспечить наличие необходимых функциональных исследований и врачей-специалистов при прохождении медицинских осмотров, в соответствии с действующим законодательством в целях профилактики онкологической заболеваемости и могут привести к неблагоприятным последствиям для здоровья человека
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| ФГБОУ ВО ЛГТУ |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Предупреждение |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| — провести санитарно-гигиеническую паспортизацию канцерогеноопасного производства; — в полном объеме определить вредные и опасные производственные факторы в утвержденном списке контингентов, подлежащих прохождению медицинских осмотров; — сварочную аэрозоль в профессии электрогазосварщика, минеральные масла в утвержденном списке контингентов, подлежащем прохождению медицинских осмотров обозначить как канцерогенный фактор пунктом 1.1.2. «Канцерогены». |
Описание
В производственных складских помещениях столовой, кондитерского цеха, обеденном зале требуется проведение текущего ремонта. Краска на потолках, стенах в производственных помещениях, моечном отделении, обеденном зале загрязнена, облицовочная плитка на полах местами с выбоинами,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Проректор Ведищев Виталий Викторович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| 5000 |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Провести ремонт в производственных складских помещениях в кондитерском цехе, обеденном зале комбината питания Липецкого государственного технического университета г. Липецк, ул. Московская, дом 30. |
Описание
В производственных цехах столовой, кондитерского цеха коридорах, складских помещениях на осветительных приборах отсутствует защитная арматура,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Проректор Ведищев Виталий Викторович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| 1000 |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Все осветительные приборы в производственных цехах столовой, кондитерского цеха, коридорах, складских помещениях обеспечить защитной арматурой. |
Описание
Не соблюдается раздельное хранение чистого и грязного белья. В общежитии в кладовой хранения чистого белья установлен стеллаж, на котором хранятся мешки транспортировки грязного белья, Нарушение устранено в ходе проверки.
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Кастелянша Скопинцева Людмила Александровна |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Предупреждение |
Описание
1. Выявлены нарушения законодательства в области обеспечения санитарно-эпидемиологического благополучия населения, выразившиеся в нарушении действующих санитарных правил и гигиенических нормативов, невыполнении санитарно-гигиенических и противоэпидемических требований к условиям труда работников предприятия: — Программа производственного контроля за соблюдением санитарных правил и выполнения санитарно-противоэпидемических мероприятий требует корректировки: в разделе перечень нормативной документации указаны не действующая нормативная документация; отсутствует СанПиН 1.2.2353-08 «Канцерогенные факторы и основные требования к профилактике канцерогенной опасности»; (изменения «СанПиН 1.2.2353-08. Канцерогенные факторы и основные требования к профилактике канцерогенной опасности. Санитарно-эпидемиологические правила и нормативы»); -не в полном объеме организован лабораторный контроль вредных веществ на рабочих местах (ультрафиолетовое облучение); — в ходе производственного контроля предприятием выявлены рабочие места с превышениями уровня физических факторов на рабочих местах, в том числе по производственному шума, превышающие 80дБА, но работодателем не проведена оценка риска здоровью работающих и не подтвержден приемлемый риск здоровью работающих,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| ФГБОУ ВО ЛГТУ |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| 10000 |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| .- откорректировать Программу производственного контроля за соблюдением санитарных правил и выполнения санитарно-противоэпидемических мероприятий требует корректировки; — в полном объеме организовать лабораторный контроль вредных веществ на рабочих местах (ультрафиолетовое облучение); — провести оценку профессионального риска здоровья работающих в условиях превышения уровня шума на рабочих местах больше 80 дБА. |
Описание
Выявлены нарушения санитарно-эпидемиологических требований к эксплуатации санитарно-бытовые помещений, которые находятся в не удовлетворительном санитарно-техническом состоянии: потолки, стены с нарушенным покрытием, требующие ремонта, что препятствует качественной уборке помещений и проведению санитарной обработки, способствует росту микроорганизмов
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Заместитель начальника отдела эксплуатации Елецких Людмила Михайловна |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| 1000 |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Санитарно-бытовые помещения отремонтировать — восстановить покрытие потолков, стен; проводить своевременную уборку помещений. |
Описание
При осуществлении производственного контроля за эксплуатацией бассейнов в учебно-спортивном комплексе ЛГТУ установлены нарушаются требования санитарных правил и норм: — для определения остаточного хлора и РН (водородного показателя) в воде из бассейнов не применяются методики, предусмотренные ГОСТ и используются приборы, не имеющие паспортов и свидетельств о поверке. -не поддерживается, в ряде случаев, установленная СанПиН разница температур в воздухе помещения большого бассейна и температурой воды в 1-2 градуса; -в 2017-2018 годах не обеспечена кратность отбора проб воды на микробиологическое исследований, предусмотренная СанПиН и программой производственного контроля,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Заведующий учебно-спортивным комплексом ФГБОУ ВО «ЛГТУ» Чебакова Ольга Николаевна |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Наложено административное наказание в виде штрафа 1000 рублей. |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Применять для оперативного контроля за свободным остаточным хлором и РН (водородным показателем) в воде бассейнов только утвержденные методики, ГОСТ, оборудование и реактивы. Регулярно заносить данные о температуре воздуха в помещениях бассейнов в журналы оперативного производственного контроля, поддерживать параметры микроклимата в соответствии с требованиями СанПиН. Обеспечить отбор проб воды на микробиологический анализ в соответствие с требованиями СанПиН и программой производственного контроля. |
Описание
В общежитии контейнерная площадка для установки мусоросборников не имеет бетонное или асфальтовое покрытие. Мусоросборники расположены на земле,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Начальник хоз.отдела Немцев Владимир Федорович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Предупреждение |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Оборудовать водонепроницаемое основание для мусоросборников общежития. |
Описание
В общежитии мягкий инвентарь (матрасы, подушки, одеяла) не подвергается камерной дезинфекции ежегодно и после выселения жильца
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Заведующий общежитием Поздняков Владимир Иванович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Предупреждение |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Заключить договор со специализированной организацией на проведение камерной дезинфекции постельных принадлежностей (матрасы, одеяла, подушки). Камерную дезинфекцию проводить ежегодно и после каждого выселения проживающего. |
Описание
Согласно протокола ФБУЗ «Центр гигиены и эпидемиологии в Липецкой области» 1457 от 11.09.2018 г. результатов измерений физических факторов на рабочих местах зам.главного бухгалтера (каб.318), специалиста по кадрам 1 категории (кааб.313 студенческий отдел кадров), специалиста по кадрам 2 категории, программиста, бухгалтера коэффициент пульсации превышает ПДУ ; на рабочих местах специалиста отдела кадров, специалиста по кадрам 2 категории напряженность электрического поля превышает ПДУ,
Судебные сведения о выявленных нарушениях
| 1. Сведения о привлечении к административной ответственности виновных лиц |
| Главный энергетик Челядин Владимир Леонидович |
| 2. Сведения об исполнении постановления по делу об административном правонарушении |
| Предупреждение |
| 3. Сведения о выполнении предписаний органов контроля об устранении выявленных нарушений обязательных требований (с указанием реквизитов выданных предписаний) |
| Выполнено |
Сведения о выданных предписаниях
| 1. Предписание от 28.09.2018 | В срок до 1 февраля 2019 года |
| Довести на рабочих местах зам.главного бухгалтера (каб.318), специалиста по кадрам 1 категории (кааб.313 студенческий отдел кадров), специалиста по кадрам 2 категории, программиста, бухгалтера коэффициент пульсации до требований санитарных норм и правил; на рабочих местах специалиста отдела кадров, специалиста по кадрам 2 категории напряженность электрического поля до требований санитарных норм и правил. Сделать повторные замеры на данных рабочих местах с привлечением аккредитованной лаборатории и протоколы по результатам измерений представить в Управление Роспотребнадзора по Липецкой области. |
Вы искали:
Виталий Ведищев, Липецк
Нашлось 2 человек(а)

Виталий Ведищев
Страна проживания: Россия
Город: Липецк
Высшее образование:
Вуз: ЛГТУ
, 1992 , Очное отделение
Факультет:
Кафедра: Кафедра автоматизированных систем управления
Среднее образование:
Школа: Школа № 30 , 1987
Липецк
1977 — 1987
(а)
Текущая деятельность: ЛГТУ
Подробнее

Виталий Ведищев
Страна проживания: Россия
Город: Липецк
Дата рождения: 24 мая 1970
Высшее образование:
Вуз: ЛГТУ
, 1992 , Очное отделение
Факультет: Факультет автоматизации и информатики
Кафедра: Кафедра автоматизированных систем управления
Текущая деятельность: ЛГТУ
Подробнее
-
Ученая степень
кандидат технических наук
Ведищев Виталий Викторович проректор по информационным технологиям Липецкого государственного технического университета, кандидат технических наук, доцент.
Родился 24 мая 1970 года в Липецке. В 1992 г. окончил Липецкий политехнический институт по специальности 22.02 — Автоматизированные системы обработки информации и управления с присвоением квалификации — инженер-системотехник. В том же году поступил в заочную аспирантуру при Липецком политехническом институте и начал работать на кафедре Автоматизированных систем управления в должности стажера-преподавателя, а затем ассистента и доцента. В 1997 году защитил кандидатскую диссертацию по специальности 05.13.07 на тему «Управление качеством проката с учетом случайной связи распределений технологических факторов и свойств».
Основные направления научной деятельности: управление производствами и качеством продукции, математическое моделирование сложных производств, оптимизационная математика и исследования в области компьютерной графики.
С 2003 г. по 2008 г. работал в должности ответственного секретаря приемной комиссии ЛГТУ. В декабре 2008 г. назначен проректором по информационным технологиям Липецкого государственного технического университета.
Последняя редакция анкеты: 18 января 2010





