Главная страница

Лекции. Основные понятия и определения


Скачать 1.94 Mb.
НазваниеОсновные понятия и определения
Дата27.03.2018
Размер1.94 Mb.
Формат файлаdocx
Имя файлаЛекции.docx
ТипКонтрольные вопросы
#39570
страница17 из 58
1   ...   13   14   15   16   17   18   19   20   ...   58

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

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

1. Какие преимущества имеет инструкция присваивания языка C перед аналогичной инструкцией языка Basic?

2. Какой новый объект программы позволяет выполнить инструкцию goto?

3. Допустим ли выход из тела цикла с помощью инструкции goto?

4. Можно ли реализовать разветвление алгоритма более, чем на 2 ветви?

5. Почему необходимо в языке C наличие пустой инструкции?

6. В чем смысл составной инструкции?

7. Можно ли организовать цикл, не используя инструкцию цикла?

8. В чем преимущество циклов с предусловием?

9. Можно ли изменять конечное значение счетчика цикла внутри тела цикла в инструкции for языка Basic? А в инструкции for языка C?

10. Чему равно значение счетчика цикла после его окончания? Отличается ли это правило для языков Basic и C?

11. В чем разница в действиях инструкций break и continue языка C?

12. Происходит ли выход из инструкции switch по достижения конца ветви case? А в инструкции Select языка Basic?
Контрольные вопросы

1. Можно ли считать запись i++; инструкцией присваивания?

2. Можно ли использовать в качестве метки целое число? Если можно, то в каком языке?

3. Как выполняется помеченная инструкция, если она достигнута не с помощью инструкции goto, а в естественном порядке выполнения программы?

4. Почему в языке Basic не нужны пустая и составная инструкции?

5. Можно ли в однострочной форме инструкции If языка Basic выполнить разветвление более, чем на 2 ветви?

6. Перечислите блоки обобщенной блок-схемы цикла.

7. Какова функция <выражения 3> инструкции for языка C?

8. Когда разумно использовать цикл с постусловием?

9. Когда форма Do Until языка Basic удобней, чем форма Do While?

10. Может ли инструкция Exit Do завершить цикл For?

11. Могут ли иметь одинаковые значения выражения в ветвях case инструкций switch и Select?

6. ВВОД-ВЫВОД


Ввод-вывод – это передача данных между переменными программы в оперативной памяти и внешней средой.

Ввод – это передача: внешняя средаоперативная память, вывод – оперативная памятьвнешняя среда.

Здесь рассмотрим только средства консольного ввода-вывода. Под термином «Консоль» будем понимать: ввод – с клавиатуры, вывод – на экран монитора. Он сложился исторически с тех времен, когда эти 2 периферийных устройства составляли так называемую консоль управления ЭВМ. В каждом из изучаемых языков существует большое количество средств ввода-вывода, реализованных в виде функций или методов в зависимости от выбранного языка программирования.

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

6.1. Язык Си


В языке C обмен данных производится с помощью функций, прототипы которых хранятся в файле stdio.h.

Основными функциями форматного ввода-вывода являются: printf – вывод на экран, scanf – ввод с клавиатуры.

Формат обращения к ним:

{scanf | printf}(<управляющая строка>[, <список-данных>]);

6.1.1. Управляющая строка


Управляющая строка состоит из текста и спецификаций. Каждая спецификация определяет только одно передаваемое значение.

Формат одной спецификации:

%[<флаги>][W][.D][d]<тип>

Флаги для функции printf (для функции scanf они не используются):

- данное прижимается к левой границе поля вывода, если выводимое значение имеет меньше символов, чем размер поля вывода;

+ число всегда выводится со знаком;

<пробел> вместо знака числа: <пробел> для чисел >= 0, - для чисел <0.

W – размер поля данного в символах (байтах).

D – обычно характеризует точность представления значения при выводе, при вводе не используется.

d – модификатор длины; = h – при передаче значений типа short, = l –

для long и double.

<тип> - это собственно спецификация, определяющая тип передаваемого значения.

6.1.1.1. Спецификация d (целые десятичные числа)


Ввод. Формат спецификации: %[W][h|l]d

Значения при вводе разделяются символами разрядки. Если в спецификации присутствует параметр W и до появления символа разрядки будет считано W символов, то ввод данного значения закончится.

W – максимальное число считываемых символов.

Пример.

Внешнее представление Спецификация Значение в памяти

165<пробел> d 165

-165 d -165

+165 d 165

165 2hd 16

165 1hd 1

431921 ld 431921

-431921 4ld -431

+431921<пробел> 10ld 431921

Замечание. Внешнее представление – это последовательность вводимых символов (нажатых клавиш).

Вывод. Формат спецификации: %[<флаги>][W][.D][h|l]d, где D – минимальное число выводимых символов. Если длина выводимого значения превышает W символов, то действие параметра W игнорируется и значение выводится полностью. Если его длина меньше W символов, то выводимое значение располагается в крайних правых позициях поля вывода. Если при этом использован флаг -, то значение располагается в крайних левых позициях поля. Если длина значения меньше D символов, то значение дополняется слева нулями.

Пример.

Значение в памяти Спецификация Внешнее представление

2475 d 2475

2475 +d +2475

2475 d _2475

-2475 d -2475

-2475 +d -2475

-2475 _d -2475

-2475 3d -2475

2475 10d ______2475

2475 +10d _____+2475

2475 -10d 2475______

2475 -+10d +2475_____

2475 10.4d ______2475

-12 10.4d ______-012

-12 .4d -012

-12 .0d -12

3 5.0d ____3

-478126 10ld ___-478126

-478126 -10ld -478126___

478126 +-10ld +478126___

Замечание 1. Во внешнем представлении примера пробел для наглядности заменен символом подчеркивания.

Замечание 2. Не следует использовать при вводе переменные типа [unsigned] char, хотя они могут хранить и манипулировать с целыми значениями. Для некоторых трансляторов ввод по спецификации d будет некорректным.

Замечание 3. Для беззнаковых (unsigned) данных вместо спецификации d следует применять спецификацию u.

6.1.1.2. Спецификация f (десятичные числа с плавающей точкой)


Ввод. Формат спецификации: %[W][l]f .

Форма представления одного значения:

[+|-][a][.b][<порядок>] , где aцелая часть, b – дробная часть.

<порядок>:= [e|E][+|-]<целое без знака>

Длина мантиссы >= 1 цифры.

Вводимое значение может представляться как в обычной, так и в показательной форме. Очевидно, что какая-то из необязательных опций должна присутствовать. Для значений в показательной форме символ e (10 в степени) можно не задавать. Тогда необходимо задать знак числа.

Пример.

Внешнее представление Спецификация Значение в памяти

-2.347e-5 f -2.347e-5

-236.485 f -2.36485e+2

2e10 f 2e10

.345 f 0.345

-2. f -2.0

461.2347 %5f%3f 461.2 347

-94.56e-5 f -9.456e-4

-94.56+5 f -9.456e+6
Вывод. Значение выводится в обычной форме.

Формат спецификации: %[флаги][W][.D][ l ] f, где D – число знаков после символа десятичной точки.

По умолчанию D=6. При D=0 десятичная точка не выводится. Если число дробных разрядов больше D, то результат округляется, если меньше, то значение дополняется справа нулями. Значение, как при спецификации d, выводится полностью, что при неправильной оценке величины выводимого значения приводит к очень длинным числам.

Пример.

Значение в памяти Спецификация Внешнее представление

-385.476 f -385.476000

2. f 2.000000

1e-7 f 0.000000

1e15 f 1000000000000000.000000

-385.476 10f -385.476000

-385.476 15f ____-385.476000

2.5 10.4f ____2.5000

-6.48756 10.4f ___-6.4876

-0.34844 6.4f -0.3484

38.56 .0f 39

0.000346 10.5f ___0.00035

6.1.1.3. Спецификация e (десятичные числа с плавающей точкой)


Ввод. Полностью аналогичен спецификации f, поэтому для ввода ее можно не использовать.

Вывод. Значение выводится в показательной форме в нормализованном виде (преобразуется так, чтобы мантисса находилась в пределах 1<=|m|<10).

Формат спецификации: %[флаги][W][.D]{e|E}, где D – количество значащих цифр мантиссы. По умолчанию D=6. При D=1 точка не выводится. Если в спецификации использована заглавная буква E, то в выводимом значении также ставится заглавный символ E (10 в степени). Остальные правила совпадает со спецификацией f.

Пример.

Значение в памяти Спецификация Внешнее представление

2.3 e 2.30000e+00

2.3 .5e 2.3000e+00

237.486 10.4e _2.375e+02

237.486 10.4E _2.375E+02

-96.56e-105 15.5e ___-9.6560e-104

2.37e25 10.1e _____2e+25

-24.866e-10 .4e -2.487e-09

6.1.1.4. Спецификация g (универсальная спецификация)


С помощью этой спецификации можно вводить и выводить любые числовые значения. Формат спецификации g аналогичен формату спецификации e. Эту спецификацию удобно использовать для вывода значений с плавающей точкой, когда неизвестен диапазон выводимых значений. Если значение лежит в диапазоне 104<=|x|<10D, где D – параметр спецификации, то оно будет выводиться по спецификации f, если значение вне указанного диапазона, то по спецификации e. Это дает возможность всегда получать внешнее представление значения приемлемой длины. При этом конечные нули не выводятся. Если использовать заглавную букву G, то при выводе в показательной форме будет применяться заглавная буква E в представлении порядка.

Рекомендация по вводу-выводу числовых значений. Для ввода-вывода целых значений следует использовать спецификацию d. Для ввода значений с плавающей точкой любой величины достаточно спецификации f. Если значения с плавающей точкой по модулю невелики(или немалы), разумно применять спецификацию f, в противном случае – спецификацию g. Спецификацию e можно вообще не использовать.

Пример.

Значение в памяти Спецификация Внешнее представление

0.000485456 .5g 0.00048546

4.456e-5 .5g 4.456e-05

4.456 .5g 4.456

4.456e4 .5g 44560

4.456e6 .5g 4.456e+06

0.0004456 .5g 0.0004456

4.456e6 .5G 4.456E+06

6.1.2. Вывод символьной информации


Ввод. Будет рассмотрен в другом разделе.

Вывод. Также излагаются не все возможности. Цель данного раздела – дать средства для формирования пояснительных надписей.

Символы управляющей строки, не входящие в спецификации, выводятся в порядке их следования. Для вывода символа "%" записывают "%%".

Пример.

printf("Число успешных сеансов составляет %d%%\n",kol);

printf("Рост:%.1f[см] Вес:%.3f[кг]\n", height, weight);

На экране получим:

Число успешных сеансов составляет 72%

Рост:181.5[см] Вес:75.600[кг]

Иногда требуется вывести несколько пробелов подряд для того, чтобы выровнять столбцы таблицы и т.п. Для этого можно использовать спецификацию вида: %[W]c, которая описывает 1 символ. Выводимый символ слева дополняется пробелами до W.

Пример. printf("L=%d%5cM=%d\n", l, ' ', m);

На экране получим: L=15 M=12

Пример.

Вычислить и напечатать таблицу: y=exp(-x)cos(π*x) x->[0; 0.75]

Шаг dx=0.05

Макет

X

Y

x.xx

-0.xxxxx

............................................


x.xx

-0.xxxxx

1 часть. Шапка. Располагается до цикла расчета таблицы функции.

printf("+------+----------+\n");

printf("| X | Y |\n");

printf("+------+----------+\n");
2 часть. В теле цикла расчета.

printf("|%5.2f |%9.5f |\n", x, y);
3 часть. После завершения цикла.

printf("+------+----------+\n");

6.1.3. Инструкции printf и scanf. Схема ввода-вывода


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

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

Примеры.

l=scanf("%d%f%d", &a, &x, &b);

n=printf("a=%d x=%.5g b=%d\n", a, x, b); // Между спецификациями 2

// пробела

printf("l=%d n=%d\n", l, n);

На экране отобразится:

12 23.278e-3 45(Enter) Вводятся с клавиатуры

a=12 x=0.023278 b=45 Результаты

l=3 n=23 вывода

printf("Рост:"); scanf("%f", &height); printf("Вес:"); scanf("%f", &weight);

На экране отобразится:

Рост:181.5

Вес:75.6

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

Ввод
Вывод
При вводе это происходит при получении необходимого числа символов для формирования элемента данных, определяемого параметром спецификации W, либо по приходе специального символа – ограничителя, сигнализирующего об окончании ввода символов для текущего элемента данных. Для функции scanf такими ограничителями являются знаки разрядки. Полученная последовательность символов преобразуется во внутреннее представление элемента данных согласно спецификации управляющей строки и отправляется в область памяти соответствующего по списку данных объекта программы. Появление в последовательности символа, который не может быть преобразован в соответствии со спецификацией, также играет роль ограничителя, т.е. прекращает формирование очередного элемента. Следовательно, функция scanf получает на вход символьную строку, а в качестве результата возвращает внутреннее представление объекта из списка данных.

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

Пример.

scanf("%d%f%f%f", &a, &b, &c, &d);

printf("/%d/%g/%g/%g/\n", a, b, c, d);

scanf("%d%f", &e, &f);

printf("/%d/%g/\n", e, f);

На экране имеем:

1 -23.47e-6 -236.485 2e10 4612347(Enter) Это ввод!

/1/-2.347e-05/-236.485/2e+10/

-94.56e-5(Enter)

/4612347/-0.0009456/

При выводе результат появится на экране только при заполнении всего буфера вывода. Последнее содержимое незаполненного буфера вывода отображается при завершении программы. Это иногда приводит к неожиданным последствиям. Если во время работы программы произошла ошибка и в это время буфер был не заполнен, то на экране его содержимое не появится. Это надо иметь в виду при попытке обнаружить место происхождения ошибки в процессе отладки программы.

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

6.1.4. Ввод-вывод массивов


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

printf("Ввод массива\n");

for(i=0; i<10; i++){

for(j=0; j<10; j++){

scanf("%f", &a[ i ][ j ]);

}

}
Вывод

printf("%32cИсходный массив\n", ' ');

for(i=0; i<10; i++){

for(j=0; j<10; j++){

printf("%15.5g", a[ i ][ j ]);

if((j+1)%5==0)printf("\n"); // Перевод строки после вывода каждого

} // 5-го значения, чтобы не выйти за

} //пределы экрана. Его размер 80 позиций

6.1.5. Очистка и останов экрана


Введем 2 полезные функции консольного ввода-вывода.

clrscr( ) – очистка экрана. Полезна:

- при повторном запуске приложения без его завершения, например, при выходе из задачи по нажатию определенной клавиши;

- при вводе неправильных входных значений и его повторе.

getch( ) – ввод одиночного символа без его отображения на экране. Позволяет:

- ввести код символа (клавиши, например Esc) для выхода из задачи;

- остановить экран для прочтения сообщения об ошибке и после ввода любого символа продолжить выполнение.
1   ...   13   14   15   16   17   18   19   20   ...   58


написать администратору сайта