- •Оглавление
- •6. Ввод-вывод 52
- •11. Операторы. Дополнение 93
- •12. Передача данных потоком 100
- •13. Файлы 103
- •14. Структура программы 109
- •15. Указатели, массивы, строки 118
- •16. Работа с экраhом 137
- •Введение
- •17. Управление программой с помощью клавиатуры 151
- •1. Основные понятия и определения
- •1.1. Компьютер
- •Процессор
- •Периферия
- •1.2. Алгоритмы
- •1.3. Программы и языки
- •Основные понятия языка программирования
- •Выполнение программы
- •Машинный и алгоритмический языки
- •Метаобозначения
- •Этапы обработки программы на компьютере
- •Терминология
- •Трансляция
- •Редактирование связей (компоновка)
- •Загрузка
- •1.4. Данные
- •Системы счисления
- •Типы и совокупности данных.
- •Вещественные
- •Логические
- •Совокупности данных
- •2. Элементы языка
- •2.1. История языков с и Basic
- •2.2. Алфавит
- •2.3. Идентификаторы
- •2.4. Знаки разрядки
- •2.5. Комментарии
- •2.6. Запись текста программы
- •3.1.1. Целые
- •3.1.2. Данные с плавающей точкой
- •3.1.3. Логический тип
- •3.1.4. Символьные данные
- •3.1.5. Дополнительные типы данных
- •3.2. Совокупности данных
- •3.2.1. Массивы
- •Объявления массивов
- •Обращение к элементу массива
- •3.2.2. Структуры
- •4.1. Арифметические операторы Основные
- •Дополнительные
- •Приоритет
- •4.2. Операторы конкатенации
- •4.3. Операторы сравнения
- •4.4. Логические операторы
- •4.5. Обращение к функции
- •4.6. Встроенные функции
- •4.7. Заключительные замечания
- •5.1. Объявления
- •5.2. Присваивание
- •5.3. Безусловный переход
- •5.4. Инструкция If. Пустая инструкция
- •5.5. Составная инструкция
- •5.6. Циклы
- •5.6.1. Циклы с предусловием
- •Циклы while
- •Циклы for
- •5.6.2. Циклы с постусловием
- •5.6.3. Вложенные циклы
- •5.7. Управляемые переходы
- •5.7.1. Инструкция break
- •5.7.2. Инструкция continue
- •5.7.3. Инструкции exit
- •5.8. Многоальтернативный выбор
- •5.8.1. Инструкция switch (язык с)
- •5.8.2. Инструкция select case (язык Basic)
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •6. Ввод-вывод
- •6.1. Управляющая строка
- •6.1.1. Спецификация d (целые десятичные числа)
- •6.1.2. Спецификация f (десятичные числа с плавающей точкой)
- •6.1.3. Спецификация e (десятичные числа с плавающей точкой)
- •6.1.4. Спецификация g (универсальная спецификация)
- •6.1.5. Вывод символьной информации
- •6.2. Инструкции printf и scanf. Схема ввода-вывода
- •7.1.1. Распределение скаляров
- •7.1.2. Распределение массивов
- •7.1.3. Статическое и динамическое распределение памяти
- •7.2. Блоки
- •7.3. Процедуры
- •7.3.1. Определения процедур
- •7.3.2. Связь между вызывающей и вызываемой функциями
- •Механизмы передачи данных
- •Прототипы функций (c)
- •Передача скаляров Возвращаемое значение
- •Входные данные
- •Выходные данные
- •Передача массивов
- •Передача функций
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •8. Препроцессор
- •8.1. Определение символических констант
- •8.2. Включение файлов в текст программы
- •9.1. Формирование листинга
- •Перенос:
- •9.2. Комментарии
- •9.3. Имена Имена объектов программы должны быть осмысленными.
- •3. Литералы.
- •10.5. Подмассивы (сечения) (c)
- •10.6. Динамические массивы (b)
- •10.7. Структуры и объединения (c)
- •10.7.1. Структуры
- •10.7.2. Рекурсивные структуры
- •10.7.3. Поля битов
- •10.7.4. Объединения (смеси)
- •10.7.5. Переменные структуры
- •10.9. Пользовательские типы данных
- •10.9.1. Инструкция type (b)
- •10.9.2. Инструкция typedef (c)
- •10.10. Преобразование типов
- •10.10.1. Автоматические преобразования
- •10.10.2. Явные преобразования
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •11. Операторы. Дополнение
- •11.1. Уровень 1
- •11.2. Уровень 2 (унарные или одноместные операторы)
- •11.3. Уровень 3 (мультипликативные операторы)
- •11.4. Уровень 4 (аддитивные операторы)
- •11.5. Уровень 5 (сдвиги)
- •11.6. Уровень 6 (отношения)
- •11.7. Уровень 7 (равенство и неравенство)
- •11.8. Поразрядные операторы
- •11.9. Логические операторы
- •11.10. Уровень 13 (условное выражение)
- •11.11. Уровень 14 (операторы присваивания)
- •11.12. Уровень 15 (оператор ',' - запятая)
- •11.13. Некоторые замечания
- •11.14. Постоянные выражения
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •12. Передача данных потоком
- •12.1. Спецификация "s" управляющей строки функций scanf и printf
- •12.2. Функции getchar и putchar
- •12.3. Функции gets и puts
- •12.4. Внутренняя передача данных (функции sscanf и sprintf)
- •13.2. Описание файла
- •13.3. Открытие и закрытие файлов
- •13.4. Средства языка с
- •13.4.1. Открытие и закрытие файла
- •13.4.2. Основные функции обмена
- •13.5. Средства языка Basic
- •13.5.1. Открытие и закрытие файла Инструкция open
- •Инструкция close
- •13.5.2. Работа с файлами Инструкция input
- •Функция input
- •Инструкция line input
- •Инструкция write
- •Инструкция print
- •Инструкция width
- •Длина файла
- •Функция MsgBox
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •14. Структура программы
- •14.1. Элементы структуры программы.
- •14.1.1. Язык c
- •14.1.2. Язык Basic
- •14.2. Область видимости (действия) и время жизни переменных
- •14.2.1. Язык c
- •14.2.2. Язык Basic
- •14.3. Проект программы
- •14.3.1. Использование директивы препроцессора #include
- •14.3.2. Средства управления проектом
- •14.4. Инициализация данных
- •2. Массивы.
- •15.1. Указатели
- •Определение указателей
- •Задание значений
- •Вывод значений
- •15.2. Указатели и массивы
- •15.3. Работа со строками
- •15.3.1. Литералы
- •15.3.2. Переменные
- •15.3.3. Операторы и функции
- •15.4. Динамические объекты
- •15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя
- •Двойное указание
- •Hе выполнено освобождение выделенной памяти
- •Задание адреса локальной (auto) переменной
- •15.6. Примеры использования указателей. Структуры данных
- •15.6.1. Стек
- •15.6.2. Однонаправленный список
- •15.7. Ссылки и многомерные массивы
- •15.8. Рекурсивные процедуры
- •15.8.1. Рекурсивное решение
- •15.8.2. Нерекурсивное решение. Стек в виде массива
- •15.8.3. Нерекурсивное решение. Стек в виде списка
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •16. Работа с экраhом
- •16.1. Текстовый режим(textmode)
- •16.1.2. Управление режимом и окном
- •16.1.3. Управление атрибутом(цветами символа и фона в окне)
- •16.1.4. Информация о текстовом режиме
- •16.1.5. Пример
- •16.1.6. Пример(продолжение)
- •16.2. Графический режим
- •16.2.1. Установка и закрытие
- •16.2.2. Форматирование Цвета
- •Битовые образы(pattern)
- •Текстовые фонты
- •Восстановление установок по умолчанию
- •16.2.3. Размещение на экране Окна
- •Координаты курсора и перемещения
- •16.2.4. Вывод на экран Текст
- •Прямоугольники
- •Эллипсы
- •Многоугольники
- •Пиксели
- •16.2.5. Дополнительные функции
- •Простые циклы
- •Вложенные циклы
- •Процедуры
- •Работа со строками
- •Приложения
- •П1.1. Меню File (Файл)
- •П1.2. Меню Options (Установки среды)
- •П1.3. Разное
- •П1.4. Редактирование текста
- •П1.5. Сообщения
- •Трансляция
- •Компоновка (редактирование связей)
- •Ошибки времени выполнения
- •П1.6. Отладка
- •Прогон до точки прерывания
- •Пошаговое выполнение программы
- •Установка точек прерывания
- •Получение значений объектов программы
- •П1.7. Окна
- •Управление окнами
- •Приложение 2. Среда разработки Visual Basic Express
- •П2.1. Запуск среды
- •П 2.2. Подготовка к работе с новым проектом
- •П2.3. Окна и режимы работы
- •П2.4. Главное меню
- •П2.5. Меню File (Файл)
- •П2.6. Редактирование текста
- •П2.7. Меню View (Обзор)
- •П2.8. Меню Project (Проект)
- •П2.9. Отладка
- •Точки прерывания
- •Определение значений объектов программы в момент прерывания
- •Продолжение работы
- •П2.10. Меню Tools (Средства)
- •П2.11. Меню Window (Окно)
- •Приложение 3. Ответы на вопросы для самопроверки
- •2. Элементы языка
- •3. Элементы данных
- •4. Выражения
- •5. Основные инструкции
- •6. Ввод-вывод
- •7. Процедуры
- •8. Препроцессор
- •9. Стиль программирования
- •10. Данные. Дополнение
- •11. Операторы. Дополнение
- •12. Передача данных потоком
- •13. Файлы
- •14. Структура программы
- •15. Указатели, массивы, строки
- •16. Работа с экраном
- •17. Управление программой с помощью клавиатуры
- •Приложение 4. Темы для курсовой работы
- •Библиографический список
14.2.1. Язык c
Здесь этой цели служит атрибут класса памяти, который добавляется к объявлению объектов.
<объявление>:= [<атрибут класса памяти>] <тип> <список объектов>;
<атрибут класса памяти>:=auto|static|extern|register
Объекты класса памяти auto – это внутренние объекты, память под которые выделяется при входе в функцию или блок и освобождается при выходе. Такой тип памяти называют стек.
Объекты класса памяти static – это также внутренние объекты, но память под них выделяется только один раз и они существуют в течение работы всей программы, причем доступны они только в своей области видимости и при повторном входе в нее сохраняют предыдущие значения. Объекты static имеют одинаковую с объектами auto область видимости, но разное время жизни.
Пример. Подсчитать число обращений к функции из произвольных точек программы.
void function(...){
static int kol=0;
.................
kol++;
.................
}
Объекты класса памяти extern – это внешние объекты и поэтому потенциально доступны для многих функций. Сами функции всегда внешние, т.к. синтаксис языка C не определяет внутренних функций.
Внешние объекты служат для передачи информации между функциями как внутри одного файла, так и между функциями различных файлов. Это второй механизм передачи данных, отличный от механизма аргументов и параметров.
Каковы же возможные причины применения этого механизма?
1. Связь между функциями с большим числом объектов обмена.
2. Инициализация объектов (позже).
3. Две или более функций имеют общие данные, но непосредственно не обращаются друг к другу.
Пример.
1. Функция: добавить элемент в таблицу.
2. Функция: найти элемент в таблице.
Общие данные – таблица (или список).
Если класс памяти объекта не указан явно, то он задается по умолчанию положением его определения в тексте. Если определение находится внутри функции или блока, то класс памяти объекта – auto, если вне, то – extern. Время жизни объекта класса памяти extern равно времени выполнения приложения, т.е. оно совпадает с временем жизни объекта класса памяти static. Если внешний объект объявлен с ключевым словом static, то он локализован в файле, т.е. его имя не может быть объявлено в другом файле с ключевым словом extern.
Пример.
/* file1.c */
int i; /* класс extern */
..........
void f1(...){
int i; /* класс auto */
..........
}
Если программа состоит из нескольких файлов, то внешние объекты могут использованы в других файлах. Для этого их необходимо описать в нужных местах с атрибутом класса памяти extern. Ключевое слово extern в данном случае означает описание и говорит о том, что определение такого объекта находится где-то в другом файле.
П
ример.
/* file1.c */ /* file2.c */
void f1(...){ int i;
extern int i; ...........
............. один и тот же объект
}
void f2(...){
int i; другой объект
.............
}
Замечание. В определениях функций ключевое слово extern записывать не надо, поскольку они по умолчанию внешние, т.е. могут быть вызваны из любого файла. Однако в случае необходимости функцию можно локализовать в файле. Для этого ее определение надо начать с ключевого слова static.
Пример.
static int a(...){ К функции a можно обратиться только из функции b.
.........
}
int b(...){
.........
n=a(...);
.........
}
Выводы.
1. В программе, состоящей из нескольких файлов, может быть только одно определение внешнего объекта (без ключевого слова extern). Объявление имени с атрибутом класса памяти extern означает описание, а не определение.
2. Область видимости внешнего имени – это текст от его определения до конца файла плюс блоки или функции в других файлах, где имеет место описание этого имени с атрибутом класса памяти extern.
3. Внешний объект с атрибутом класса памяти static локализован в файле.
4. Функции могут вызываться до их определения, если их прототипы указаны до места вызова.
5. Статические объекты при выделении памяти всегда инициализируются нулевыми(для строк – "пустыми") значениями, если не указана явная инициализация какими-либо другими значениями. Автоматические объекты при размещении не получают никакого определенного значения. Принято говорить, что после определения они содержат "мусор", если не было их явной инициализации.
Замечание. Правила явной инициализации объектов излагаются ниже.
Рекомендация. Не следует использовать внешние объекты без крайней необходимости и достаточного опыта программирования, поскольку их применение ухудшает принцип изоляции данных, который является одним из критериев надежности программ.
Объекты класса памяти register – это объекты, аналогичные объектам класса памяти auto, которые транслятор стремится разместить в регистрах процессора для обеспечения быстрого доступа. Такое размещение выполняется только при наличии свободных регистров. Атрибут применим также для параметров функции.
Замечание. Регистров мало и, если переменная используется редко, то вместо ускорения быстродействие может упасть, т.к. будет использоваться меньшее число регистров.
