Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Лекция 3

.docx
Скачиваний:
12
Добавлен:
21.03.2015
Размер:
28.45 Кб
Скачать

Программирование. Лекция 3. Текст программы и препроцессор. Функция main(). Форматированный вывод.

Освещаемые вопросы: переменные и константы, типы данных С++, операторы, приоритеты и порядок вычисления операторов, конструкции управления в С++ (ветвление, циклы, переключатель switch)

Каждая программа на языке Си есть последовательность препроцессорных директив, описаний и определений глобальных объектов и функций. Исходная программа проходит три обязательных этапа обработки:

  1. препроцессорное преобразование текста;

  2. компиляция;

  3. компоновка (редактирование связей или сборка).

Только после успешного завершения этих этапов формируется исполняемый машинный код программы.

Задача препроцессора – преобразование текста программы до ее компиляции. Правила такой обработки программист задает с помощью директив препроцессора. Каждая такая директива начинается с символа #.

Препроцессор просматривает исходный код в поиске директив, которые определяют действия по преобразованию текста. Так, например, директива #define указывает правила замены в тексте. Например, #define MAXVAL 255. Директива #include указывает, какие текстовые файлы нужно включить в этом месте текста программы. Директива #include предназначена для включения в текст программы текста файла из каталога «заголовочных файлов», поставляемых вместе со стандартными библиотеками компилятора. Каждая библиотечная функция, описанная стандартом языка Си, имеет соответствующее описание в одном из заголовочных файлов.

Употребление в программе директивы #include еще не подключает к программе соответствующую стандартную библиотеку. На уровне препроцессора производится только модификация исходного кода программы (в текст вставляется описание из указанного заголовочного файла). Подключение к программе кодов библиотечных функций осуществляется только на этапе компоновки, после компиляции, когда уже получен машинный код программы.

Получившийся полный текст программы поступает на вход компилятора, который выделяет лексемы, а затем на основе грамматики языка распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия строит объектный модуль (файл с расширением *.obj).

Компоновщик, или редактор связей, формирует исполняемый модуль программы, подключая к объектному модулю другие объектные модули, в том числе, содержащие библиотечные функции. Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе компоновки. Исполняемый модуль имеет расширение *.exe и запускается на выполнение обычным образом.

В код программы вставляются не все функции из подключенного заголовочного файла, а только те, которые используются в программе. Выбор нужных функций осуществляет компоновщик (linker) на этапе, который называется редактирование связей.

Структура программы.

В любой программе на языке Си обязательно должна присутствовать главная функция с фиксированным именем main. В соответствии со стандартом языка, функция main имеет две допустимых сигнатуры:

int main(); int main(int argc, char* argv[]);

Функция int _tmain(int argc, _TCHAR* argv[]) является макросом от компании Microsoft, который вызывает одну из двух функций:

int main(int argc, char* argv[]);или int wmain(int argc, wchar_t* argv[]); в зависимости от того, используется ли в проекте кодировка Unicode.

Перед именем каждой функции программы следует помещать сведения о типе возвращаемого значения (типе результата). Если функция ничего не возвращает, указывается тип void. Значение, возвращаемое функцией main(), может быть передано операционной системе для дальнейшего анализа.

Параметры функции main() позволяют организовать передачу данных из среды выполнения в исполняемую программу, минуя средства стандартной библиотеки ввода-вывода.

Ввод-вывод

Простейший механизм ввода – это чтение одного символа из стандартного ввода (обычно с клавиатуры) функцией getch:

int _getch(void);

В качестве результата каждого своего вызова функция _getch() возвращает следующий символ ввода или, если обнаружен конец файла, предустановленную константу EOF (end of file).

Для вывода информации в Си достаточно часто используется функция printf() (форматная строка, список аргументов);

Прототип этой функции находится в файле <stdio.h>. Форматная строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Список аргументов может отсутствовать.

Произвольный текст выводится на экран непосредственно без изменений:

printf("Привет, мир!");

Управляющие символы (перевод строки, табуляция) позволяют влиять на размещение информации на экране.

Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции printf(). Обобщенный формат спецификации: %флажки ширина_поля.точность модификатор спецификатор. Обязательными являются только % и спецификатор.

Примеры спецификаторов:

d – для целых десятичных чисел (тип int); u – для целых десятичных чисел без знака (unsigned); f – для вещественных чисел.

Ширина поля – целое положительное число, определяющее длину (в позициях на экране) представления выводимого значения.

Точность - целое положительное число, определяющее количество цифр в дробной части вещественного числа.

float f = 5.23232323;

printf("%5.3f",f);

Результат: 5,232.

В качестве модификаторов в спецификации преобразования используются символы: h – для вывода значений short, l – для вывода значений long, L – для вывода значений типа long double. Например, для вывода переменной типа long int нужно использовать спецификатор формата %ld.

Функция scanf, обеспечивающая ввод, является аналогом printf. Она читает символы из стандартного входного потока, интерпретирует их согласно спецификациям форматной строки и рассылает результаты в свои остальные аргументы.

Литература

  1. Подбельский В. В., Фомин С. С. Программирование на языке Си: Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 2004. – 600 с.

  2. http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c