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

2к3с Языки программирования / Конспект лекций

.pdf
Скачиваний:
10
Добавлен:
27.11.2024
Размер:
691.17 Кб
Скачать

ТЕМА 3. ВВОД И ВЫВОД В СИ.

Цели: изучить операторы ввода-вывода данных в языке СИ.

Задачи:

изучить синтаксис оператора printf(); и элементы его форматной строки;

изучить форматные спецификаторы операторов printf(); и scanf();

рассмотреть назначение и возможные значения модификатора форматных команд в printf();

изучить синтаксис оператора scanf(); и правила записи аргументов;

рассмотреть функции по работе с потоками: getchar(); и putchar();.

После изучения темы Вы должны знать:

синтаксис операторов printf(); и scanf();

форматные спецификаторы операторов printf(); и scanf();

модификаторы форматных команд в printf();

функции по работе с потоками.

Стандартная библиотека языка СИ содержит две функции для работы с форматным вводом и выводом. Этими функциями являются: printf() – для форматного вывода, scanf() – для форматного ввода. Эти функции называют форматными, потому, что они позволяют читать и выводить данные в различных форматах, определяемых пользователем. Для выбора формата используются форматные спецификаторы.

Синтаксис оператора printf(). Данная функция используется для вывода данных на экран. В общем виде функция printf() имеет вид:

printf(“control_string”, argument_list);

argument_list (список аргументов) может содержать в себе константы,

переменные, выражения или функции, разделенные запятой. Каждому элементы из argument_list должен быть поставлен в соответствие форматный спецификатор, записываемый в control_string (форматной строке); control_string

записывается в двойных кавычках. Форматная строка может содержать в себе

элементы трех различных типов:

текстовые символы – обычные символы, выводимые на экран так, кака они записаны в форматной строке;

форматные спецификаторы – специальные группы из 2-х или более символов, определяющие способ вывода на экран значений из списка аргументов. Форматные команды начинаются со знака процента %;

неотображаемые символы – символы табуляции, пробела, перехода на следующую строку и др.

Для каждого из возможных в СИ типов данных существует как минимум

один форматный спецификатор, таблица 10.

Таблица 10. Форматные спецификаторы

Формат

printf()

scanf()

символ

строка

%s

%s

целое число

%d или %i

%d или %i

вещественное число с

%f

%f иди %e

точностью до 6-го знака

 

 

число типа double с

%lf

%lf

точностью до 6-го знака

 

 

вещественное число в

%e

%f или %e

экспоненциальной форме

 

 

записи с точность

 

 

до 6-го знака

 

 

беззнаковое целое

%u

%u

шестнадцатиричное

%x

%x

восьмеричное число

%o

%o

Модификаторы форматных команд в printf(). Рассмотренные форматные команды могут быть модифицированы.

Модификатор ширины поля может использоваться при необходимости вывести большой объем целых, вещественных или символьных значений.

Модификатор ширины определяет минимальное число позиций, отводимое под вывод. Значение выравнивается по правой стороне столбца.

Модификатор точности. Может использоваться для вывода на экран вещественных и строковых значений. Позволяет задать число позиций,

отводимое под вещественную часть числа (по умолчанию 6). При работе со строками определяет максимальное число символов, выводимое на экран.

Если вещественная часть значения типа float или double оказывается длиннее, чем указанное в модификаторе, то происходит округление. В

аналогичной ситуации для строк – лишние символы отбрасываются.

Модификатор «0». При использовании модификатора ширины поля пустые позиции слева от значения заполняются пробелами. Использование модификатора «0» позволяет заменить их на нули.

Модификатор «1» позволяет вывести на экран значения типа long int и double.

Модификатор «h» используется для вывода на экран «коротких» значений.

Модификатор «*» используется в случае, если программист не может заранее определить ширину поля и предоставляет решение этой проблемы компьютеру.

Синтаксис оператора scanf(). Функция scanf() используется для ввода данных. Она имеет следующий формат:

scanf(“control_string”, argument_list);

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

1. Различия в списке аргументов. scanf() использует адреса переменных.

Адрес позволяет узнать местоположение переменной в памяти компьютера.

Элементы списка аргументов функции scanf() должны подчиняться следующим правилам:

если происходит чтение с клавиатуры значения одного из базовых типов данных языка СИ, то перед именем переменной необходимо поставить знак амперсанд (&);

если происходит чтение с клавиатуры значения в переменную строкового типа, то знак & не ставится.

2. Различия в форматных командах:

не используется спецификатор %g;

спецификаторы %f и %e работают абсолютно одинаково.

Буферизованный ввод/вывод. Язык СИ позволяет совершать операции ввода и вывода на только на высоком, но и на низком уровне. При этом используется так называемый буферизованный ввод/вывод (то есть ввод/вывод отдельных символов в их ASCII представлении).

Буфер - это область памяти, которая позволяет накапливать данные. При буферизованном вводе/выводе символы, например, читаемые с клавиатуры,

размещаются в памяти и передаются программе по нажатию клавиши Enter уже как целый блок.

Буферизованный ввод/вывод может быть: консольным и файловым.

Консольный ввод/вывод позволяет работать с клавиатурой и экраном.

Файловый ввод/вывод дает возможность писать в файл и читать из него.

В СИ консоль представляется в виде потока. Для работы с потоками используются следующие функции:

getchar() – читает с клавиатуры один (и только один) символ;

putchar() – выводит один символ на экран.

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

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

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

Выводы

В данной теме рассмотрены следующие вопросы: назначение операторов ввода-вывода; синтаксис операторов printf() и scanf(); форматные спецификаторы операторов printf() и scanf(); функции по работе с потоками getchar() и putchar().

Вопросы для самопроверки

1.Синтаксис оператора printf();.

2.Какие элементы может содержать в себе форматная строка оператора printf();?

3.Назовите и охарактеризуйте форматные спецификаторы операторов printf() и scanf();

4.Назначение модификатора форматых команд в printf(); и его возможные значения.

5.Синтаксис оператора scanf();.

6.Правила для аргументов функции scanf();.

7.Какие функции используются в языке СИ для работы с потоками?

8.Назначение функций getchar(); и putchar();\.

ТЕМА 4. УСЛОВИЯ.

Цели: изучить алгоритмические конструкции записи условных выражений в

языке СИ.

Задачи:

изучить синтаксис оператора выбора if;

изучить синтаксис оператора множественного выбора switch;

сформировать практические навыки использования условных операторов.

После изучения темы Вы должны знать:

конструкции записи условных выражений в языке СИ;

назначение, синтаксис и использование оператора if;

назначение, синтаксис и использование оператора switch;

Понятие условного выражения. Условные выражения позволяют изменять порядок выполнения программных элементов. В зависимости от условия,

выполняются те, или иные альтернативные действия. Результатом вычисления условного оператора всегда является истина (true, не ноль) или ложь (false,

ноль).

Операторы выбора. В СИ существует два типа операторов выбора: оператор if

(условный оператор) и оператор switch (оператор варианта).

Конструкция «if». Оператор if позволяет проверить, является ли результат вычисления некоторого логического выражения истинным, или ложным.

Оператор if имеет следующую структуру:

if (условие)

действие;

Условие должно записываться в круглых скобках. От его истинности зависит, будет, или не будет выполняться действие, записываемое после оператора if.

Действия, следующие за оператором if должны быть записаны в фигурных скобках {}. Оператор if может работать только с одним действием. Если же действий несколько, то они должны быть заключены в блочный оператор. Если этого не сделано, то вторая команда выполняется всегда, а не только в случае истинности условия.

Конструкция «if….else». Структура «if….else» является полной формой оператора if и позволяет выполнить одно из двух действий. Синтаксис:

if (условие)

действие 1;

else

действие 2;

Множественный выбор «else-if». Конструкция «if-else» дает возможность выбрать одно из двух действий. В тоже время, очень часто нужно выбирать не одно из двух, а одно из нескольких условий. Для этой цели служит конструкция

«else-if». Синтаксис:

if (условие)

действие 1; else if (условие)

действие 2; else if (условие)

действие 3;

……

else

действие;

Если ни одно из условий не является истинным, то выполняется последняя веточка else. Если последней ветви else нет, то никаких действий при ложности всех условий не выполняется.

Вложенные операторы if. Вложенные операторы if представляют собой конструкцию, в которой внутрь ветви одного if вложен другой оператор if. При этом подключенная ветвь else относится к ближайшему оператору if.

Например:

if (условие 1)

{

if (условие 2)

действие 1; if (условие 3)

действие 2; else

действие 3; /*относится к (условию 3)*/

}

else

действие 4; /*относится к (условию 3)*/

В этом примере, в случае если условие 1 истинно, то происходит проверка условия 2, в случае если и оно истинно, выполняется действие 1. Действие 2

выполняется в случае, если истинно условие 3, в противном случае выполняется действие 3. Если условие 1 ложно, то выполняется действие 4.

Так как наличие ветвей else-if не является обязательным, то возможна,

например, и следующая конструкция:

if (условие 1)

if (условие 2)

действие 1;

else

действие 2;

следующие действия;

В данном примере на истинность проверяется сначала условие1, а затем условие 2. Если оба они истинны, то выполняется действие 1. Если ложно только условие 2, то выполняется действие 2. В случае, если ложно условие 1,

то условие 2 даже не проверяется и управление передаются следующим действиям.

В соответствии со стандартом ANSI компиляторы обязаны поддерживать не менее 15 уровней вложенности. Однако, большинство компиляторов этим условием не ограничиваются и позволяют работать с гораздо большим числом вложений.

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

switch (выражение)

{

case константа 1:

действия

break;

case константа 2:

действия

break;

case константа 3:

действия

break;

….

default:

действия

}

Здесь switch, case, break и default являются ключевыми словами, а качестве действия может выступать как один, так и несколько операторов, причем заключать последовательность операторов в скобки необязательно. Выражение после switch, должно находится в круглых скобках, а все тело оператора – в

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

для сравнения. В качестве констант могут выступать только целые числа и символы. Значения констант не должны совпадать.

Оператор switch действует, сравнивая значение выражения со значениями констант. При совпадении выполняются действия, соответствующие выбранной константе. Признаком окончания ветви (то есть набора действий,

соответствующих константе) служит оператор break. Если оператор break не установлен, то выполняются действия, соответствующие другим константам.

Выполнение действий продолжается до конца оператора switch, или до первого встреченного break.

Инструкции, записанные после default, выполняются в том случае, если значение выражения не совпало ни с одной из констант. Данная ветвь не является обязательной. При ее отсутствии возможна ситуация, когда в результате сравнения не будет выполнено никаких действий.

Выводы

В данной теме рассмотрены следующие вопросы: понятие «условное выражение», операторы выбора «if» и «switch»; синтаксис конструкций выбора

(«if», «if…else», «else…if», вложенных операторов «if»).

Вопросы для самопроверки

1.Охарактеризуйте понятие «условное выражение».

2.Какие в языке СИ существуют операторы выбора?

3.Синтаксис конструкции «if».

4.Синтаксис конструкции «if….else».

5.Синтаксис конструкции множественного выбора «else…if».

6.Синтаксис вложенных операторов «if».

7.Синтаксис оператора «switch».