Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Структура простой программы на языке СиСтр 1 из 6Следующая ⇒
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
Данный курс предусматривает основы современного подхода к разработке программ через освоение базовых алгоритмических концепций и моделей представления данных. Рассматриваются как классическая концепции, уже успевшие зарекомендовать себя за долгие годы, так и только начинающие оформляться и применяться методы и технологии. В результате изучения дисциплины «Технология программирования» студенты должны овладеть знаниями, умениями и навыками традиционного императивного стиля программирования, который все еще широко используются и при этом является неотъемлемой частью любого объектно-ориентированного языка, а так же знать принципы и основы объектно-ориентированного проектирования и программирования. Выполнение лабораторных работ по дисциплины «Технологии программирования» позволит будущим специалистам разрабатывать программы на языке С++, использовать объектно-ориентированное программирование и знать о современных тенденциях развития предметной области данной дисциплины. ЛАБОРАТОРНАЯ РАБОТА №1 Структура простой программы на языке Си Цель работы: научиться составлять простые программы на языке Си
Краткие теоретические сведения Основные понятия языка СИ Программы на СИ представляют собой последовательность строк, которые в отдельности состоят из символов. Набор символов включает в себя 26 букв латинского алфавита или (и) 33 буквы русского алфавита, десять арабских цифр от нуля до девяти и некоторое конечное множество специальных символов, например: ;, :, !, =, и т. д. Со всем набором символов познакомимся по мере изучения языка СИ. Таким образом, текст программы представляет собой информацию о последо-вательности действий, которые должна выполнить ЭВМ при решении той задачи, алгоритм решения которой она представляет. Причем данная информация закоди-рована в виде набора символов. Основные понятия необходимые для написания программы на алгоритмичес-ком языке СИ будут вводиться по мере необходимости. Программа работает с такими основными объектами, как переменные и константы. Константами являются такие объекты программы, которые за все время ее выполнения ни разу не изменяли своего значения, а переменные – объекты, которые во время выполнения программы могут изменять свое значение сколь угодно раз. Таких объектов в программе может быть много и их необходимо различать друг от друга. Для этой цели служат идентификаторы. Идентификаторы. Под ними понимается буквенно-цифровая последователь-ность, которая начинается с буквы и не должна совпадать с каким-либо ключе-вым словом. Количество символов в идентификаторе (имени) может быть сколь угодно. Однако значащими являются восемь первых символов или, например, 32 в Turbo C. В именах различаются строчные и прописные буквы. Символ _ - подчеркивания очень полезен для написания длинных имен и считается буквой. С него также может начинаться имя какой-либо переменной. Примеры идентифи-каторов (имен): sum, SUM, _sum, SuM, Vector_sum, Addition_vector. Программис-ты условились использовать в идентификаторах по возможности только строч-ные буквы, за исключением случаев, когда идентификатор именует константу. Формальное определение идентификатора (имени) имеет вид: < идентификатор>:: =[< буква> |< подчеркивание> ]{< буква> |< подчеркивание> | < цифра> }. Ключевые слова. Выше уже упоминалось о ключевых (служебных) словах. К ним относятся такие слова, за которыми в языке программирования закреплен определенный смысл или они имеют определенное назначение. Их нельзя употреблять в других случаях кроме тех, для которых они предназначены. Количество ключевых слов не велико, их необходимо запомнить, а конк-ретное назначение каждого будет указывать по мере изложения основ програм-мирования на СИ. Таблица 1- Список ключевых слов
Обратим внимание еще раз на то, что ключевые слова не могут быть использованы в качестве имен переменных (идентификаторов) так как они играют особую роль в языках программирования высокого уровня, включая и СИ. Комментарий – пояснительный текст, который служит для документирования программы. Многострочный комментарий представляет собой набор символов, заключенный между /* и */. Однострочный комментарий – это набор символов, следующий после //. Разделители. В СИ имеется некоторый набор символов, выполняющие как бы роль разделителей (ограничителей), за которыми закреплены определенные функции. Приведем их список: ( ) – вызов функции, порядок выполнения выражения; [ ] – задает элемент массива; { } – задает составной оператор; : – разделяет метку от оператора; , – разделяет имена переменных в списке переменных; ; – разделяет операторы друг от друга. Управляющие коды – это последовательность символов управляющая выво-дом информации на печатающем устройстве (см. таблицу 2). Таблица 2- Управляющие коды
Константы. В отличие от переменных константы – объекты, которые в про-цессе выполнения программы не меняют своего значения. Их имена принято записывать заглавными буквами. По типу принимаемых значений в СИ имеется четыре вида констант: целые, вещественные, символьные и строковые. Целые константы. Данный вид констант может задаваться в десятичной, восьмеричной, шестнадцатеричной и двоичной системах счисления. Таблица 3 - Формы представления константы 125
Таким образом, константа 125, приведенная в десятичной системе счисления, в языке СИ может быть также представлена еще в трех видах таблица 3. Вещественные константы. Константа с плавающей запятой (вещественная) – это действительное десятичное положительное число. Оно включает целую часть, дробную часть и экспоненту. Константы с плавающей запятой представляются в следующей форме [< цифры> ][.< цифры> ][< э> [-]< цифры> ]. Здесь < цифры> – одна или более десятичных цифр от 0 до 9, < э> – признак экспонентности, задаваемая символами " Е" или " е". Квадратные скобки обозначают, что фрагмент, заключенный в них, может, как присутствовать, так и отсутствовать в полном представлении вещественной константы. Следует учитывать такие правила: целая или дробная часть могут быть опущены, но не обе сразу; точка с дробной частью или экспонента могут быть опущены, но не обе одновременно. Примеры вещественных констант: 285.103, 2.85109Е2, 285103е-3, 83., .28, .0028е2. Константы с плавающей запятой всегда задаются положительными значения-ми. Если требуется ввести отрицательные значения, то они формируются с помощью константного выражения, состоящего из знака минуса и следующей за ним константы. Знак минус при этом рассматривается как арифметическая операция (унарный минус). Например: -.0025, -2.5е-3, -.125, -1.85Е-8. Символьные константы. Под символьной константой в языке СИ понимается буква, цифра, знак пунктуации или специальный символ, заключенный в апострофы. Значение такой константы равно коду, представляемого ею символа. Символьная константа представляется в следующей форме '< символ> ', где < символ> – любой символ кроме ' (апострофа) или \ (обратного слеша). Они представляются следующим образом: '\'' – апостроф, '\\' – обратный слеш. Примеры символьных констант: 'a', '! ', '2', '\b'. Строковые константы. Символьная строка – это последовательность символов, заключенная в двойные кавычки. Символьная строка – массив символов и она имеет следующую форму представления " < символы> " , в котором < символы> – это произвольное количество символов, за исключе-нием " " " и " \ ". Чтобы их использовать в строке, необходимо перед ними поставить дополнительный знак " \ ". Примеры строковых констант: " This is symbol of string\n", " Один \\ Два", " \" Хорошо\" – сказал он.", " " (пустая строка). Для формирования символьных строк, которые занимают несколько строк в программе, используется комбинация символов обратный слеш и новая строка, которая представит в памяти ЭВМ строки как одну. Например, " Длинная строка является объединением нескольких строк.". В СИ строки неразделенные ничем представляются как одна строка (см. программу 1). Программа 1: void main (void) { char *s; s=" Данный текст иллюстрирует" " возможность \nобъединения группы" " строк в одну длинную строку.\n" " Это необходимо для " " наглядности написания программ.\n"; printf (" %s", s); } Программа напечатает фрагмент текста в виде: Данный текст иллюстрирует возможность объединения группы строк в одну длинную строку. Это необходимо для наглядности написания программ. Операции Ранее отмечалось, что переменные это такие объекты, которые могут неоднократно изменять свои значения в ходе выполнения программы. Именно с помощью них можно получать и хранить в оперативной памяти ЭВМ значения интересующих программиста величин. Для того чтобы получать новые значения переменных, должны быть определены операции, проводимые над ними. В зависимости от типа принимаемых значений переменными над ними определяется тот или иной набор операций. Операции определенные в СИ в порядке убывания приоритета (старшинства) представлены в следующей таблице 4 Таблица 4 - Назначение операций языка СИ
Более подробно с каждой из операций познакомимся при изучении соответствующих типов данных. Скалярные типы данных. По типу принимаемых значений переменные могут отличаться друг от друга, как и константы, занимаемой памятью и тем набором операций, которые можно применять к ним. Таким образом, необходимо по данным признакам отличать переменные и константы. В СИ это делается с помощью объявления типов. По-существу определение типа переменной задается набором допустимых значений и набором действий, которые можно совершать над каждой перемен-ной рассматриваемого типа. В языке программирования СИ существует целый набор типов переменных, который можно разделить на два класса: первый – базовые (скалярные) типы (int, float, char, double, и т. д.), второй – производные (сложные) типы данных (enum, [ ], struct, union и другие). В СИ существует правило, что все переменные, используемые программой, должны быть описаны (т. е. для них должен быть определен однозначно тип принимаемых значений). Сейчас рассмотрим правила описания переменных базового типа. Переменные целого типа. Переменные целого типа объявляются с помощью оператора описания имеющего вид тип < идентификатор> [, < идентификатор >, ...]; , где тип – одно из ключевых слов, указывающих на тип принимаемых значений, < идентификатор> – имя переменной, которая принимает данный тип значений. Выражение, содержащееся в квадратных скобках, может, как присутствовать, так и отсутствовать. Оператор описания, как и любой другой оператор языка СИ, должен заканчиваться символом "; ". В соответствии с этим правилом запишем вид оператора описания (объявления) переменных, которым даны имена in, rama, cub. Предполагается, что они принимают целочисленные значения. Тогда с учетом выражения (17) оператор объявления этих переменных имеет вид int in, rama, cub; Заметим, что между ключевым словом и первым именем переменной, по крайней мере, должно быть не менее одного пробела. Типов переменных, принимающих целочисленные значения, в СИ не одно int. Это определяется оперативной памятью, отводимой для представления чисел. Объем памяти фактически определяет и диапазон значений, из которого переменная данного типа может принимать одно из значений. Типы целочисленных значений и их характеристики приведены в следующей таблице 5 Таблица 5- Характеристики целочисленных типов данных языка СИ
Примеры операторов объявления переменных, принимающие целочисленные значения различных типов: 1) int x, a, f; 2) unsigned p1, pi, l; 3) short k, m, n; 4) long p, t, r; 5) unsigned long q, qq, s2; Над переменными, принимающими целочисленные значения, в СИ опреде-лены три типа операций: арифметические, логические и битовые. Арифметические операции в порядке убывания приоритета содержатся в таблице 6. Таблица 6 - Арифметические операции
Обратим внимание читателя на то, что операция деления целого числа на целое представляется двумя операциями: деления на цело и вычисления остатка от деления. Рассмотрим конкретные примеры: 5 / 2 = 2 и 5 % 2 = 1. В различных реализациях языка СИ при условии того, что хотя бы один из операндов является отрицательным числом, в результате выполнения операции % могут быть получены различные значения. Поэтому для получения мобильного (переносимого) кода рекомендуется применять эту операцию только для переменных, принимающих беззнаковые целочисленные значения, а именно для типов данных: unsigned, unsigned short, unsigned long. Для других же типов операнды должны принимать только положительные значения. Операция % неприменима к типам, принимающим значения с плавающей запятой. Рассмотрим примеры программ, выполняющие арифметические операции над переменными, которые принимают целочисленные типы данных. Программа 2: #include < stdio.h> void main (void) { int x, r; unsigned y, z; x = -125; y = 29; r = -5; z = 3;
x += r; /* Эквивалентно оператору x = x + r */ printf (" \n x = %d\n", x); x -= r; /* Эквивалентно оператору x = x - r */ printf (" x = %d\n", x); x = r; / Эквивалентно оператору x = x * r */ printf (" x = %d\n", x); x /= r; /* Эквивалентно оператору x = x / r */ printf (" x = %d\n", x); y %= z; /* Эквивалентно оператору y = y % z */ printf (" y = %d\n", y); y = ++z; /* Эквивалентно оператору y = z + 1 */ printf (" y = %d z = %d\n", y, z); y = z++; /* Эквивалентно оператору y = z */ printf (" y = %d z = %d\n", y, z); } В результате выполнения программы будут получены следующие данные: x = -130 x = -125 x = 625 x = -125
y = 2 y = 3 z = 3 y = 3 z = 4 Над переменными, принимающими целочисленные значения, определены логические операции, представленные в следующей таблице Таблица 7 - Логические операции
В СИ нет типа переменных, принимающих значения логического типа. Однако определены логические и операции отношения для формирования и записи выражения, являющихся по смыслу принимаемых значений логическими. Они принимают значения либо 1 (истина) либо 0 (ложно). Данный тип принимаемых значений относится к типу int. Этот набор операций приведен в таблице 8. Предположим, что имеется две переменные X и Y, принимающие значение 0 или 1, а результаты действия этих операций содержатся в следующей таблице 8 Таблица 8-Результаты действия логических операций
Как видно из таблицы 8 результатом действия логических операций является целое число, принимающее значение 0 или 1. Другие операции, кроме трех рассмотренных только что, относятся к операциям сравнения выражений и (или) констант, принимающих целочисленные значения. По своему смысловому содержанию данные операции используются для записи неравенств, а в качестве ответа выступают либо 0 или 1 в зависи-мости от того верно или не верно неравенство. Примеры выражений, содержащих операции сравнения: 1) 5 < = 3; 2) (2*b + c) == 4; 3) da / fk + 2! = (c * (d * k – 3) + 3 * fk) – 4; 4) ((d – 5 / fk) > (da / c + k) == (fk + d * c)) – 1. Для целочисленных переменных также определены битовые операции (см. следующую таблицу). Таблица 9 - Битовые операции
Битовые операции обычно используются в приложениях тогда, когда возникает потребность для доступа к аппаратуре, манипулируя с битами на нижнем уровне. Например, такой способ часто применяется при управлении станками ЧПУ и другим оборудованием. Чтобы понять, каким образом работают битовые операции, приведем табли-цу, содержащую получаемые результаты. Для этого величины X и Y будут отражать значения в двух разрядах, над которыми проводятся битовые операции. Таблица 10- Результаты битовых операций
Рассмотрим, каким образом работают битовые операции на конкретном примере, а именно для чисел 79 и 28. Для этого необходимо представить их в двоичном коде, в результате получим 792 = 1001111 и 282 = 0011100. Теперь над ними по разрядно проводим битовые операции: 1) 79 & 28 = 1001111 & 0011100 = 0001100 = 12; 2) 79 | 28 = 1001111 | 0011100 = 1011111 = 95; 3) 79 ^ 28 = 1001111 ^ 0011100 = 1010011 = 83; 4) ~ 79 = ~ 1001111 = 0110000 = 48; 5) ~ 28 = ~ 0011100 = 1100011 = 99. Отдельно рассмотрим операции сдвига по разрядной сетке влево (< < ) и впра-во (> > ). Предположим, что необходимо осуществить сдвиг на 2 разряда. Естественно данные операции проводятся над числами в двоичной системе счисления. Получим следующие результаты: 1) 79 > > 2 = 1001111 > > 2 = 0010011 = 19 (эквивалентно 79 / 22); 2) 28 > > 2 = 0011100 > > 2 = 0000111 = 7 (эквивалентно 28 / 22); 3) 79 < < 2 = 1001111 < < 2 = 100111100 = 316 (эквивалентно 79 * 22); 4) 28 < < 2 = 0011100 < < 2 = 001110000 = 112 (эквивалентно 28 * 22). При проведении операции сдвига вправо нижние разряды теряются, а в верхних разрядах автоматически выставляется значение 0. Когда же проводится операция сдвига влево, то в добавляемых нижних разрядах автоматически выстав-ляется значение 0. Переменные вещественного типа. В большинстве прикладных задач, которые решаются с помощью ЭВМ, часто приходится иметь дело с величинами, представляющиеся дробными (вещественными) числами. Для таких объектов (переменных и констант) в СИ предусмотрен вещественный тип значений. Переменные вещественного типа, как и любого другого типа должны быть объявлены и для этого используются ключевые слова float, double и long double. Это указывает на то, что в СИ имеется три типа вещественных данных, которые отличаются друг от друга объемом памяти, отводимой на хранение соответствующего значения, и, следовательно, диапазоном принимаемых значений. Оператор объявления переменных вещественного типа будет иметь одну из форм float < идентификатор> [, < идентификатор >, ...]; double < идентификатор> [, < идентификатор >, ...]; long double < идентификатор> [, < идентификатор >, ...]; . Основные характеристики объектов вещественного типа содержатся в таблице 11 Таблица 11-Характеристики вещественных типов данных языка СИ
Примеры операторов объявления переменных, принимающих вещественные значения. Так, например, для хранения значения переменных с именами f1, f2, ff должно быть отведено по 4 байта, а для переменных tt, tr, ts, te – 8 байтов и для объектов mmq, mwq по 10 байтов. Соответствующие операторы объявления имеют вид: float f1, f2, ff; double tt, tr, ts, te; long double mmq, mwq; . Для значений вещественного типа определены две группы операций: арифметические и логические. Для них в отличие от целочисленных типов данных определена одна операция деления (она обозначается символом " / " ), результатом которой является также значение вещественного типа. В качестве примера приведем листинг программы для решения следующей задачи: требуется вычислить площадь кольца, у которого радиусы внешней и внутренней окружности равны r1 и r2 соответственно. Программа 4: #include < stdio.h> #include < math.h> #include < conio.h> #define PI 3.1415926535 void main (void) { float r1, r2, s; clrsrc ( ); printf (" Введите значения r1, r2: " ); scanf (" %f %f", & r1, & r2); s = PI * (pow(r1, 2) – pow(r2, 2)); printf (" \nПлощадь кольца s = %f ", s); } Битовые операции для вещественных переменных не имеют смысла, так как их значения не возможно точно представить в двоичной системе счисления. Они представляются приближенно, используя конечное число разрядов. Переменные символьного типа. Как правило, большинство программ, написанных на любом языке программирования (не является исключением и язык СИ), имеет дело с символами, которые применяются для представления инфор-мации в виде текста. По этой причине в СИ предусмотрен символьный тип значе-ний, используемый для объявления переменных символьного типа. Символьные типы значений в СИ бывают двух видов и обозначаются ключевыми словами char и unsigned char. Для хранения их значения компилятором отводится 1 байт памяти, что и определяет диапазон принимаемых значений таблица 12 Таблица 12-Характеристики символьных типов данных
В программах они объявляются с помощью операторов вида: char < идентификатор> [, < идентификатор >, ...]; unsigned char < идентификатор> [, < идентификатор >, ...]; . По существу они являются подмножеством целых и поэтому их можно свободно смешивать в выражениях с переменными типа int. Для примера приведем программу, которая оперирует одновременно с переменными символьного и целого типов. Программа 6: #include < stdio.h> #include < conio.h> void main (void) { int j, k[]; char b[]; clrsrc ( ); j = 0; while (b[j]! = '\0') { k[j] = b[j]; ++j; }; j = 0; while (k[j]! = '\0') printf (" %d\n", k[j]); } Перечислимый тип данных. Не редки случаи, когда приходится иметь дело с объектами (переменными), которые могут принимать перечислимое множество значений, например: дни недели (понедельник, вторник, …, воскресенье), месяцы года (январь, февраль, …, декабрь), номенклатура изделий завода или фирмы. При этом хотелось бы, чтобы программа имела дело с понятными значениями, а именно с принятыми названиями. Так, например дни недели можно пронумеровать и программа будет оперировать с целыми числами. Способы нумерации у каждого программиста могут быть свои, а для удобства восприятия программы хотелось бы использовать общепринятые обозначения. Для таких целей в СИ предусмотрен перечислимый тип enum, который необходимо вводить (объявлять) с помощью оператора, имеющего одну из форм записи enum [< тег> ]{< список перечисления> } < описатель > [, < описатель >...]; enum < тег> < идентификатор> [, < идентификатор >, ...]; . Здесь < тег> – идентификатор, именующий перечислимый тип, который специфицируется данным списком; < список перечисления> представляет собой одну или более конструкций вида < идентификатор> [= < константное выражение> ], разде-ляемые друг от друга запятой; < идентификатор> – имя переменной перечислимого типа. Примеры операторов объявления переменных перечислимого типа: enum {пон, вт, ср, четв, пят, суб, воскр} day_week; enum week_type {пон, вт, ср, четв, пят, суб, воскр}; enum week_ type day_ week; . Пример программы, которая выводит на экран монитора название дней недели, используя переменные перечислимого типа. Программа 7: #include < stdio.h> #include < conio.h> void main (void) { enum {пон, вт, ср, четв, пят, суб, воскр} day; clrsrc (); printf (" Введите значение day (0< =day< =6): " ); scanf (" %d", & day); switch (day) { case пон: printf (" Понедельник" ); break; case вт: printf (" Вторник" ); break; case ср: printf (" Среда" ); break; case четв: printf (" Четверг" ); break; case пят: printf (" Пятница" ); break; case суб: printf (" Суббота" ); break; case воскр: printf (" Воскресенье" ); break; default: printf (" Переменная day не может принимать данного значения" ); } } Рассмотрим пример простой программы на языке Си #include < stdio.h> /* Пример программы на языке Си */ void main () { int x; // Переменная целого типа float a; // Переменная вещественного типа char c, str[20]; // Символьная переменная и строка printf (" \n Введите целое число: " ); //Вывод информации на экран scanf (" %d", & x); //Ввод информации с клавиатуры printf (" \n Введите число c плавающей точкой: " ); scanf (" °/of', & a); printf (" \n Введите символ: " ); scanf (" \n%c", & c); printf (" \n Введите строку символов: " ); scanf (" %s", str); printf (" \n Результаты: " ); printf (" \n %-6d \n %-12.4f \n %2c \n %-20s ", x, a, c, str); } Первая строка программы содержит директиву include препроцессора языка Си. Препроцессор - это системная программа, которая выполняется перед вызовом компилятора. Все директивы препроцессора начинаются с символа #. В данном случае применение директивы include обеспечит подстановку в исходный текст программы стандартного заголовочного файла < stdio.h>, содержащего описания функций printf и scanf. Если удалить первую строку программы, то компилятор не сможет проверить правильность обращения к функциям printf и scanf и выдаст сообщение об ошибке. Основными элементами, из которых строится любая программа на языке Си, являются функции. Выполнение программы, написанной на языке Си, начинается с вызова главной функции, которая должна иметь имя main. Тип возвращаемого значения указывается до имени функции, а список аргументов приводится в круглых скобках после имени функции. В приведенном примере функция main имеет пустой список аргументов и ничего не возвращает (на это указывает ключевое слово void). Тип возвращаемого значения, имя функции и список ее аргументов образуют заголовок функции. Помимо заголовка, функция должна иметь тело (или определение). Тело функции представляет собой блок. Блок - это последовательность операторов языка Си, заключенная в фигурные скобки. Фигурные скобки выполняют в языке Си роль операторных скобок. Каждый из операторов языка Си заканчивается символом Рассмотрим тело функции main. Первые три строки тела main содержат описания переменных. В языке Си существует правило: все используемые переменные, структуры данных или функции должны быть обязательно описаны до своего использования. В приведенном примере описаны переменные следующих типов: переменная x целого типа, переменная a типа с плавающей точкой, переменная c символьного типа и переменная str строкового типа. После описания переменных производится обращение к стандартным функциям printf и scanf. Функция printf обеспечивает вывод информации на экран, а scanf - ввод данных с клавиатуры. Приведенная программа содержит также комментарии, или пояснительный текст. Для языка Си более типично указание комментариев между парами символов /* и */, играющих роль открывающих и закрывающих скобок. В языке Си++ имеется еще одна возможность задания комментариев: с помощью пары символов //. Все символы, следующие за // до конца строки, рассматриваются как комментарий и игнорируются компилятором. Функции printf и scanf Функции printf и scanf обеспечивают соответственно форматированный вывод и ввод информации. Рассмотрим функцию printf более подробно. Общее описание функции printf выглядит следующим образом: printf (Управляющаястрока, аргумент1, аргумент2,..., ); Аргумент1, аргумент2 и т.д. - это параметры, которые могут быть переменными, константами, выражениями, вычисляемыми перед выводом информации. Управляющая_строка - это строка символов, заключенных между кавычками. В состав этой строки могут входить спецификаторы форматов, поэтому строка называется форматной строкой. Спецификатор формата - это шаблон, на место которого при выводе строки на экран будет подставлено конкретное значение, принадлежащее тому или иному типу данных. Спецификатор формата определяет, как будет отображено это значение. При выводе на экран параметра аргумент1 функция printf применяет первый спецификатор формата из управляющей строки, при выводе параметра аргумент2 -второй спецификатор формата, и т. д. Таким образом, во избежание непредсказуемого результата необходимо обеспечить точное соответствие количества спецификаторов форматов и параметров, подставляемых на их место. Формат представляет собой последовательность символов, следующих за знаком %. Наиболее существенную роль при описании формата играют символы типа, обозначаемые латинскими буквами. Приведем перечень основных символов типов: - для целочисленных значений: d, i (целое десятичное знаковое), o (целое восьмеричное беззнаковое), u (целое десятичное беззнаковое), x, X, (целое шестнадцатеричное беззнаковое); - для чисел с плавающей точкой: f (число с плавающей точкой в десятичной записи) ^^ (число с плавающей точкой в экспоненциальной записи), g, G (более компактный вариант форматов %f или %e); - для символов и строк: c (одиночный символ), s (строка символов), % (используется для вывода знака %). Спецификаторы форматов в последнем вызове функции printf из программы-примера содержат не только символы типа, но также числа и знак минус. Знак минус означает выравнивание по левому краю. Числа задают минимальную ширину поля вывода. Для значений с плавающей точкой может быть также указано количество знаков после запятой (указывается после ширины поля вывода через точку). Форматная строка может также содержать обозначения неграфических символов, начинающиеся с '\': '\n' - переход на новую строку; '\r' - возврат каретки; '\t' - табуляция; '\\' - символ '\'; 'V" - символ ". Обращение к функции scanf во многом сходно с обращением к printf. Для scanf также необходимо указывать форматную строку и следующий за ней список аргументов. Однако для scanf список аргументов должен содержать указатели на переменные. Для получения указателя на любую переменную базового типа необходимо перед именем переменной записать символ &. Для получения указателя на строку достаточно указать имя строки, символ & не нужен.
Порядок выполнения работы |
Последнее изменение этой страницы: 2017-04-12; Просмотров: 1514; Нарушение авторского права страницы