- •Предисловие
- •Контрольные вопросы
- •Библиографический список
- •Тема 2 Переменные и базовые типы данных языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема3 Организация циклов в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 4 Принятие решений. Условные операторы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 5 Числовые массивы в языке программирования с
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 6 Символьные массивы в языке с. Работа со строками
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 7 Указатели в языке программирования с
- •Int *ptr; // объявили указатель на целую переменную
- •Контрольные вопросы
- •Библиографический список
- •Тема 8 Указатели и массивы в языке с
- •Int data[7]; // обычный массив
- •Int *pd[7]; // массив указателей
- •Контрольные вопросы
- •Библиографический список
- •Тема 9 Динамическое распределение памяти в языке с
- •If (!ptr) // условие логического отрицания
- •If (!ptr) // условие логического отрицания
- •Контрольные вопросы
- •Библиографический список
- •Тема 10 Функции Общие сведения о функциях языка с
- •Fun(тип имя_перем1, тип имя_перем2, , тип имя_перем n)
- •Контрольные вопросы
- •Библиографический список
- •Тема 11 Указатели и функции в языке программирования с
- •Тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргументы);
- •Контрольные вопросы
- •Библиографический список
- •Тема 12 Файловый ввод/вывод в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 13 Структуры – производные типы данных языка с
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Контрольные вопросы
- •Библиографический список
- •Тема 14 Объединения и перечислимые типы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 15 Структуры и функции языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема 16 Операции с разрядами (битами) в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 17 Программы, состоящие из нескольких файлов, на языке с
- •Спецификатор extern
- •Спецификатор static
- •Спецификатор register
- •Спецификатор auto
- •Контрольные вопросы
- •Библиографический список
- •Тема 18 Рекурсивные алгоритмы и функции
- •Переместить (a, b);
- •Контрольные вопросы
- •Библиографический список
- •Тема 19 Препроцессор языка с
- •Директива #define
- •Директива #error
- •Директива #include
- •Директивы условной компиляции
- •2_ Я_последовательность операторов программного кода
- •3_ Я_последовательность операторов программного кода
- •Директива #line
- •Директива #pragma
- •Предопределенные символические константы
- •Макрос подтверждения assert
- •Контрольные вопросы
- •Библиографический список
- •Тема 20 Программы на языке с при использовании статически подключаемой библиотеки
- •Контрольные вопросы
- •Библиографический список
- •Тема 21 Использование аргументов командной строки в с
- •Контрольные вопросы
- •Контрольная работа № 2 Покупки в супермаркете
- •Приложение Управление конфигурациями проекта в Visual Studio 2010
Контрольные вопросы
Как осуществляется нумерация разрядов байта?
Для каких систем счисления в языке С имеются классификаторы форматируемых данных?
Какие логические поразрядные операции существуют в языке С?
Какие логические операции сдвига существуют в языке С? Какими операторами они реализуются?
Что такое битовое поле в языке С? Где оно может быть определено?
В чем различие поразрядных и логических операторов НЕ, И и ИЛИ?
Как можно обменять значения двух целочисленных переменных без использования третьей переменной?
Чем отличается операция сдвига вправо для типов int и unsigned?
Библиографический список
Прата С. Язык программирования С. Лекции и упражнения : пер. с англ. / С. Прата. – 5-е изд. – М.: Вильямс, 2006. – 960 с.
Кочан С. Программирование на языке С : пер. с англ./С. Кочан. – 3-е изд.– М.: Вильямс, 2007. – 496 с.
Подбельский В.В. Программирование на языке Си: учеб. пособие/ В.В.Подбельский, С.С.Фомин. – 2-е изд., доп. – М.: Финансы и статистика, 2007. – 600 с.
Тема 17 Программы, состоящие из нескольких файлов, на языке с
Рассматриваются вопросы сборки программы, состоящей из нескольких функций, расположенных в разных файлах, а также дополнительные обращения к функциям.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Программа на языке С – это совокупность функций. Ее работа начинается с запуска главной функции, содержащей остальную часть программы. Внутри главной функции для реализации заданного алгоритма вызываются все другие необходимые функции. Часть функций создается самим программистом, другая – библиотечные функции – поставляется пользователю со средой программирования и используется в процессе разработки программ (например, printf(), sqrt() и др.).
Простейший метод использования нескольких функций требует их размещения в одном и том же файле. Затем выполняется компиляция этого файла, как если бы он содержал единственную функцию [1]. Другие подходы к решению этой проблемы существенно зависят от конкретной операционной системы (Unix-подобные системы, Windows, Macintosh). Компиляторы операционных систем Windows и Macintosh представляют собой компиляторы, ориентированные на проекты [1]. Проект описывает ресурсы, используемые программой. Эти ресурсы включают файлы исходного программного кода.
Если поместить главную функцию main() в один файл, а определения собственной функции программиста – во второй, то первому файлу нужны прототипы функций. Для этого их можно хранить в одном из заголовочных файлов. Хорошим тоном в программировании считается размещение прототипов функций и объявление их констант в заголовочном файле [1]. Назначение отдельных задач отдельным функциям способствует улучшению программы.
Функция может быть либо внешней (по умолчанию), либо статической. К внешней функции доступ могут осуществлять функции из других файлов, в то время как статическая может использоваться только в файле, в котором она определена [1]. Например, возможны следующие объявления функций:
double gamma(); // внешняя функция по умолчанию
static double beta();
extern double delta();
Функции gamma() и delta() могут вызываться функциями из других файлов, которые являются частью программы, тогда как beta() – нет. В силу этого применение последней ограничено одним файлом, поэтому в других файлах можно определять функции с тем же именем. Одна из причин использования класса статической памяти заключается в необходимости создания функций, приватных для конкретных модулей, благодаря чему во многих случаях удается избежать конфликта имен [1].
Обычно при объявлении функции, определенной в другом файле, указывается ключевое слово extern. Однако этим достигается большая ясность, поскольку функция при объявлении и предполагается как extern, если только не задано ключевое слово static.
Одно из «золотых правил» надежного программирования – соблюдение принципа «необходимости знать», или принципа минимально необходимой области видимости [1]. Рекомендуется держать всю внутреннюю работу каждой функции максимально закрытой по отношению к другим функциям, используя совместно только те переменные, без которых нельзя обойтись по логике программы. Другие классы памяти полезны, и ими можно воспользоваться. Однако всякий раз следует задаваться вопросом: есть ли в этом необходимость.
Память, использованная для хранения данных, которыми манипулирует программа, обладает такими характеритсиками, как продолжительность хранения, область видимости и связывание [1]. Продолжительность хранения может быть статической, автоматической или распределенной. При статической, память распределяется в начале выполнения программы и остается занятой на протяжении всего выполнения, при автоматической память под переменную выделяется в момент, когда выполнение программы входит в блок, в котором эта переменная определена, и освобождается, когда выполнение программы блок покидает.
Выделение памяти осуществляется с помощью функции malloc()(или родственной функции) и освобождается память посредством функции free(). Область видимости означает, какая часть программы может получить доступ к данным. Переменные, определенные вне пределов функции, имеют область видимости в пределах файла и видимы в любой функции данного файла. Переменная блока видима только в этом блоке и в любом из блоков, вложенных в него.
Связывание описывает экстент (протяжение, пространство), в пределах которого переменная, определенная в одной части программы, может быть привязана к любой другой части программы. Переменная с областью видимости в пределах блока, будучи локальной, не имеет связывания; переменная с областью видимости в пределах файла имеет внутреннее или внешнее связывание. Внутреннее связывание означает, что переменная может быть использована в файле, содержащем ее определение. При внешнем она может использоваться в других файлах.
Стандарт языка С поддерживает 4 спецификатора класса памяти [2]:
extern
static
register
auto
Спецификаторы сообщают компилятору, как он должен разместить соответствующие переменные в памяти. Спецификатор класса памяти в объявлении всегда должен стоять первым [2]. Приведем характеристику спецификаторов классов памяти.