Спецификатор типа
Тип указывает не только на тип величины (с точки зрения языка программирования Си), но и на конкретное представление выводимой величины (например, числа могут выводить в десятичном или шестнадцатеричном виде). Записывается в виде одного символа. В отличие от остальных полей является обязательным. Максимальный поддерживаемый размер вывода от единичной управляющей последовательности составляет по стандартам как минимум 4095 символов; на практике большинство компиляторов поддерживают существенно большие объёмы данных. Значения типов: § d, i — десятичное знаковое число, размер по умолчанию, sizeof(int). По умолчанию записывается с правым выравниванием, знак пишется только для отрицательных чисел. '%d' и '%i' ведут себя одинаково при выводе, но имеют разные значения при вводе с помощью функции scanf(); § o — восьмеричное беззнаковое число, размер по умолчанию sizeof(int); § u — десятичное беззнаковое число, размер по умолчанию sizeof(int); § x и X — шестнадцатеричное число, x использует маленькие буквы (abcdef), X большие (ABCDEF), размер по умолчанию sizeof(int); § f и F — числа с плавающей запятой. По умолчанию выводятся с точностью 6, если число по модулю меньше единицы, перед десятичной точкой пишется 0. Величины ±∞ представляются в форме [-]inf или [-]infinity, Величина Nan представляется как [-]nan или [-]nan(любой текст далее). Использование F выводит указанные величины заглавными буквами (-INF, NAN). Аргумент по умолчанию имеет размер double. § e и E — числа с плавающей запятой в экспоненциальной форме записи (вида 1.1e+44); e выводит символ «e» в нижнем регистре, E — в верхнем (3.14E+0); § g и G — число с плавающей запятой; форма представления зависит от значения величины (f или e); § a и A — число с плавающей запятой в шестнадцатеричном виде; § c — вывод символа с кодом, соответствующим переданному аргументу; переданное число приводится к типу unsigned char (или wint t, если был указан модификатор длины l); § s — вывод строки с нулевым завершающим байтом; если модификатор длины — l, выводится строка wchar_t*. В Windows значения типа s зависят от типа используемых функций. Если используется семейство printf функций, то s обозначает строку char*. Если используется семейство wprintf функций, то s обозначает строку wchar_t*. § S — то же самое что и s с модификатором длины l; В Windows значения типа S зависит от типа используемых функций. Если используется семейство printf функций, то S обозначает строку wchar_t*. Если используется семейство wprintf функций, то S обозначает строку char*. § p — вывод указателя, внешний вид может существенно различаться в зависимости от внутреннего представления в компиляторе и платформе (например, 16 битная платформа MS-DOS использует форму записи вида FFEC:1003, 32-битная платформа с плоской адресацией использует адрес вида 00FA0030); § n — запись по указателю, переданному в качестве аргумента, количества символов, записанных на момент появления командной последовательности, содержащей n; § % — символ для вывода знака процента (%), используется для возможности вывода символов процента в строке printf, всегда используется в виде %%.
1.5.2. Работа с компилятором g++ Для начала напишем программу для вывода сообщения #include <stdio.h> int main { printf(“Program work!\n”); return 0; } Сохраним ее под именем lab2.cc. Чтобы скомпилировать ее, в командной строке набираем:
g++- имя компилятора c++ lab2.cc– имя компилируемого исходного файла -o lab2– с помощью ключа“-o” задаем имя выполняемого файла Теперь в текущем каталоге появится файл lab2. Чтобы его выполнить наберите:
Если программа состоит из нескольких исходных файлов, каждый из них компилируется по-отдельности:
в результате чего появляется объектный файл lab2.o, а затем все объектные файлы собираются вместе в один исполняемый:
Для автоматизации этих действий используется утилита make. Для ее использования в каталоге с исходными файлами создается файл Makefile, с описанием зависимостей и порядка компиляции. Необходимо создать следующие файлы: Файл lab2.cc //----------------------------------------------- #include <stdio.h> #include “fib.hh” int main(){ int fib[10]; View_Fib(fib); printf(“Числа Фибоначчи”\n); for (int i=1;i<=10;i++){ printf(“%d \n”,fib[i]); } } //-----------------------------------------------
Файл fib.cc //----------------------------------------------- #include “fib.hh”
void View_Fib(int fib[10]){ int f1,f2,fbn,i; f1 = 0; f2 = 1; i = 1; while (i<=10){ fbn = f1 + f2; f1++; f2++; fib[i] = fbn; i++; } } //-----------------------------------------------
Файл fib.hh //----------------------------------------------- void View_Fib(int fib[10]); //-----------------------------------------------
Файл Makefile (вместо <TAB> нужно поставить знак табуляции) //----------------------------------------------- lab2: fib.o lab2.o <TAB>g++ fib.o lab2.o -o lab2
fib.o: fib.cc fib.hh <TAB>g++ -c fib.cc
lab2.o: lab2.cc fib.hh <TAB>g++ -c lab2.cc
clean: <TAB>rm -f lab2 lab2.o fib.o //----------------------------------------------- Makefile является списком правил. Каждое правило начинается с указателя, называемого «Цель». После него стоит двоеточие, а далее через пробел указываются зависимости. В нашем случае ясно, что конечный файл lab2 зависит от объектных файлов fib.o и lab2.o. Поэтому они должны быть собраны прежде сборки lab2. После зависимостей пишутся команды. Каждая команда должна находиться на отдельной строке, и отделяться от начала строки клавишейTab. В трех первых правилах выполняются те же самые команды, которыми мы уже пользовались. А что же означает правило clean? В правиле clean стоит команда rm, удаляющая исполняемый и объектные файлы. Флаг-f означает, что, если удаляемый файл отсутствует, программа должна это проигнорировать, не выдавая никаких сообщений. Итак, правило clean предназначено для «очистки» проекта, приведения его к такому состоянию, в каком он был до команды make. Если запустить
появятся объектные файлы и исполняемый. Если выполнить
Объектные и исполняемый файлы исчезнут. Останутся только cc-файлы, hh-файл и сам Makefile. То есть, проект «очищается» от результатов команды make.
|