Макросы

Директива include

Комментарии

Текст на Си, заключенный в скобки /* и */, компилятором игнорируется. Комментарии служат двум целям: документировать код и облегчить отладку. Так, если в программе на Си используется некоторый специальный алгоритм, то будет уместен комментарий, содержащий ссылку на источник, в котором описывается этот алгоритм. Вообще говоря, в программу следует вносить любой текст, поясняющий код. Но комментариями не нужно и злоупотреблять.

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

Во многие программы на Си подставляется один или несколько файлов, обычно в самое начало исходного текста программы. Появление директив

#include <файл_1>

#include “файл_2”

...

#include <файл_n>

приводит к тому, что препроцессор подставляет в место директив тексты файлов файл_1, файл_2, …, файл_n соответственно.

Если имя файла заключено в угловые скобки < и >, то поиск файла производится в специальном каталоге, задаваемом в настройках интегрированной среды разработки. Обычно в этот каталог помещаются все заголовочные файлы с расширением h. Если в каталоге отсутствует искомый файл, то препроцессор выдает сообщение об ошибке и процесс создания объектного файла прерывается.

Если имя файла заключено в двойные кавычки (как, например, “файл_2”), то поиск файла производится сначала в текущем каталоге. Если файл не обнаружен, то система переходит к поиску файла в специальном каталоге, заданном в настройках. Если и здесь требуемый файл не найден, то препроцессор выдаст сообщение об ошибке и процесс создания объектного файла будет прерван.

Внимание! Обычная ошибка – добавление после директивы #include точки с запятой. В отличие от операторов языка Си директива #include не должна заканчиваться точкой с запятой.

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

Обычно макросы используют для того, чтобы связать идентификатор (identifier – опознаватель, имя) и значение. Как только препроцессор встречает идентификатор, он заменяет его на соответствующее значение. Например, директива

#define pi 3.14159265

связывает идентификатор pi со значением 3.14159265.

Макросы могут иметь параметры. Например, макрос

#define square(x) ((x) * (x))

задает замену символов square(аргумент) на значение ((аргумент) * (аргумент)).

Внимание! Не оканчивайте значение макроса (например, 3.14159265) точкой с запятой. Значение макроса подставляется вместо имени макроса полностью. Если точка с запятой присутствует в значении макроса, то она будет подставлена вместе с числом.

8 Оператор printf: вывод на экран

Одной из основных задач программирования является вывод в файл или на экран. Без вывода информации нет возможности узнать и проанализировать результаты работы программы. В Си весь вывод реализуется через внешние функции и макросы. Одной из наиболее универсальных и полезных функций вывода является printf. Она включена во внешнюю библиотеку stdio.h.

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

Типичный пример использования функции printf:

printf(“\nВозраст Васи - %d. Его рост - %.2f м.”,

age, height);

Предполагается, что целой переменной age (возраст) и вещественной переменной height (рост) присвоены какие-то значения.

Последовательность символов \n переводит курсор на новую строку. Последовательность символов “Возраст Васи – “ будет выведена с начала новой строки. Символы %d – это спецификация для целой переменной. Вместо %d подставляется значение переменной age. Следующая за спецификацией последовательность символов “. Его рост – “ просто выводится на экран сразу после значения переменной age. %.2f – это спецификация для вещественного значения, а также указание формата для вывода только двух знаков после десятичной точки. На место спецификации %.2f подставляется значение переменной height. И окончательная последовательность символов “ м.” выводится на экран после значения переменной height.

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

Более формально полную спецификацию вывода можно определить следующим образом (поля в квадратных скобочках – необязательные):

%[флаги][ширина][.точность][l]символ_формата

где l – используется для указания целых длинных типов, а ширина – минимальный размер поля вывода.

Значения флагов:

- выравнивание по левому краю

+ вывести знак значения – как плюс, так и минус

пусто для неотрицательных значений

вместо знака плюс вывести пробелы.

Точность: для целых – число цифр, для вещественных – число цифр после десятичной точки, для строк – число символов.

Символы формата:

с тип char

s строка

d тип int

o тип int в восьмеричном виде

u unsigned int (unsigned – беззнаковый)

x тип int в шестнадцатеричном виде

ld тип long

lo тип long в восьмеричном виде

lu unsigned long

lx тип long в шестнадцатеричном виде

f типы float и double

в виде с фиксированной точкой

e типы float и double в экспоненциальном виде

g типы float и double

в наиболее коротком виде из f или e.

Внимание! Частая ошибка – отсутствие соответствующей переменной для каждой спецификации в строке printf. Другая частая ошибка – несоответствие типа переменной спецификации. Обычно это происходит тогда, когда в строке много спецификаций и программист путает порядок переменных.

Листинг 3. Пример использования оператора printf

/* printf.c – пример использования оператора printf. */ #include <stdio.h> #include <conio.h> #define square(x) ((x) * (x)) #define pi 3.14159265 void main() { float x = 2.5; int i = 11; int j = 119; clrscr(); printf(“\nЗначение квадрата 2.5 = %10.4f”, square(x)); printf(“\nЧисло пи = %10.4f”, pi); printf(“\nЗначение 2 * пи = %10.4f”, 2.0 * pi); printf(“\n\nШестнадцатеричный вид числа 11 = %x”, i); printf(“\nШестнадцатеричный вид числа 119 = %x”, j); printf(“\nВосьмеричный вид числа 119 = %o\n”, j); }

Рисунок 17. Результат выполнения программы printf.c

9 Оператор scanf: ввод с клавиатуры

Оператор scanf (scan – сканировать) является одной из многих функций ввода, имеющихся во внешних библиотеках. Она включена во внешнюю библиотеку stdio.h.

Каждой вводимой переменной в строке функции scanf должна соответствовать спецификация. Формат спецификации ввода аналогичен спецификации вывода (см. оператор printf), но обычно используется простейшая форма с указанием только символа формата. Перед именами переменных следует ставить символ &. Этот символ означает «взять адрес».

Ниже приведен пример (листинг 4) использования оператора scanf.

Оператор

scanf(“%d”, &weight);

ожидает ввода с клавиатуры целого числа типа int, о чем свидетельствует спецификация ввода %d. После нажатия клавиши ENTER введенное число помещается в переменную weight.

Внимание! В функции scanf, в отличие от printf, спецификация ввода для типа double – %lf.

Листинг 4. Пример использования оператора scanf

/* scanf.c – пример использования оператора scanf */ #include <stdio.h> #include <conio.h> void main() { int weight, /* вес */ height; /* рост */ clrscr(); printf(“Введите ваш вес: ”); scanf(“%d”, &weight); printf(“Введите ваш рост: ”); scanf(“%d”, &height); printf(“\n\nВес = %d, рост = %d\n”, weight, height); }

Рисунок 18. Результат выполнения программы scanf.c


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: