1. Функция вычисляет произведение двух чисел. Исходные данные вводятся с клавиатуры. Какие проверки целесообразно ввести в программе:
а) проверка, что исходные данные являются числами +
б) проверки не нужны, все возможные ошибки отловит компилятор
в) проверка исходных данных на равенство нулю
2. Для чего предназначен оператор namespace:
а) для использования классов, переменных и функций из других модулей программы без использования заголовочных файлов
б) для заключения в группу объявлений классов, переменных и функций в отдельный контекст со своим именем +
в) для заключения в группу объявлений классов, переменных и функций для использования только в текущем модуле
3. Какой из компонентов может входить в интегрированную среду программирования:
а) наладчик
б) доводчик
в) отладчик +
4. Какой из компонентов может входить в интегрированную среду программирования:
а) текстовый редактор +
б) текстовый директор
Язык Си Урок 5. Функция scanf() и ввод с клавиатуры — StudioProWeb
в) текстовый модератор
5. Какой из компонентов может входить в интегрированную среду программирования:
а) регулятор
б) доминатор
в) компилятор +
6. Если определена операция вычитания для двух объектов класса A, а операция преобразования к int не определена, что будет вызвано при:
A a1,a2,a3=5;
a3 = a1 – a2;
а) только операция вычитания
б) произойдет ошибка +
в) преобразование к целому
7. Какой из наборов перечисляемых значений записан правильно:
а) enum < a, b = 3, c = 4, 3 >;
б) enum < a, b, 3, 4 >;
в) enum ; +
8. В чем различие использования следующих выражений #include и #include «…»:
а) различие заключается в методе поиска препроцессором включаемого файла +
б) в различии использования заголовочных и исходных файлов
в) нет различий
9. Чему будет равен результат вычисления выражения: int d=5; bool b = true, c; c = (!b||(d>3)):
а) Ошибка компилятора
б) false
в) true +
10. Если в арифметическом выражении участвуют целый и вещественный операнды, то:
а) ошибка компиляции
б) целый тип приводится к вещественному +
в) вещественный тип приводится к целому
11. Укажите в каком выражении произойдет потеря точности:
а) int i; float x = 2.134, y = 3.14; i = x/y; +
б) short i = 0x3; float x = 2.7, v; v = i + x;
в) float M = 235.2; double Z = 3; Z *= M;
12. Если после выражения стоит точка с запятой, то:
а) выражение вычисляется, а его значение запоминается в специальной переменной, которую можно использовать в следующем операторе
б) это оператор-выражение, действие которого заключается в вычислении выражения +
в) выражение вычисляется только если первой стоит операция присваивания
13. Что из себя представляет динамическое выделение памяти:
а) память под объект (переменную) может выделяться не сразу, а в процессе работы программы, освобождение памяти производится вручную +
C. Урок 7. Команды ввода и вывода
б) память под объект (переменную) может выделяться не сразу, а в процессе работы программы, освобождение памяти производится автоматически после завершения программы
в) память под объект (переменную) выделяется каждый раз при обращении к переменной
14. Отметьте истинное высказывание:
а) переменная инициализируется, потом объявляется
б) переменная объявляется, потом инициализируется и изменяется
в) переменная объявляется, потом изменяется +
15. Какие операции поддаются перегрузке:
а) унарные и бинарные +
б) только бинарные
в) только унарные
16. Переменная типа signed char может принимать значения:
а) только символов английского алфавита, цифр и символа подчеркивания
б) из первой половины кодовой таблицы +
в) только из алфавита языка C++
17. Переменная типа signed char может принимать значения:
а) только из алфавита языка C++
б) только символов английского алфавита, цифр и символа подчеркивания
в) от -128 до 127 +
18. В переменной типа unsigned char можно хранить число:
а) -213
б) 213 +
в) 1213
19. В переменной типа unsigned char можно хранить число:
а) -13
б) 1213
в) 13 +
20. Чему равно числовое значение выражения e/2*a-abs(e)*1e0 при e = 4, a = 2:
а) 3
б) 0 +
в) 1
21. Выберите правильное утверждение:
а) целой переменной можно присвоить вещественную константу +
б) целой константе можно присвоить целую переменную
в) целой константе можно присвоить вещественную переменную
22. Выберите правильное утверждение:
а) целой константе можно присвоить целую переменную
б) целой переменной можно присвоить целую константу +
в) целой константе можно присвоить вещественную переменную
23. Чему равно значение выражения (a ! b || c), где a, b и с -величины типа bool, имеющие значения false, true и true соответственно:
а) false
б) yes
в) true +
24. Какое выражение не содержат синтаксических ошибок:
а) sin(abs(0.6(e*3))
б) ((cos(3*a+1.*abs(x)))) +
в) a*exp(t)(2t)
25. Какое выражение не содержат синтаксических ошибок:
а) a*exp(t)(2t)
б) sin(abs(0.6(e*3))
в) 0XCC00*.34E-4/_do/k-2 +
26. Чему равно числовое значение выражения sqrt(4)+142/20*2:
а) 5
б) 16 +
в) 9
27. Какая из следующих операций языка C выполняется справа налево:
а) = +
б) ->
в) []
28. Какое выражение не содержит синтаксических ошибок:
а) (-0.18)*a)/(r-0.2*t)
б) (-0.18)*a)(r-0.2*t))
в) -0.18*a/r-0.2*t +
29. При использовании в программе функции scanf требуется разделять числовые значения величин при вводе при помощи:
а) нажатия клавиш TAB или ENTER +
б) клавиш курсора
в) пробела или запятой
30. При использовании в программе функции scanf требуется разделять числовые значения величин при вводе при помощи:
а) пробела или запятой
б) по крайней мере одного пробела +
в) клавиш курсора
Источник: liketest.ru
При использовании в программе функции scanf требуется разделять числовые значения
Для ввода данных в консоли может использоваться функция scanf() . Эта функция определена в заголовочном файле stdio.h (там же, где и функция printf) и имеет следующее формальное определение:
scanf(форматная_строка, аргументы)
И форматная_строка, и аргументы для функции scanf обязательны.
Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:
% * ширина_поля модификатор спецификатор
Из этих элементов обязательны только два: знак процента % и спецификатор.
Спецификатор определяет тип вводимых данных:
- %c : считывает один символ
- %d : считывает десятичное целое число
- %i : считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)
- %u : считывает положительное целое число
- %e : считывает число с плавающей точкой в экспоненциальной форме
- %E : считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты
- %f : считывает число с плавающей точкой
- %F : считывает число с плавающей точкой
- %g : считывает число с плавающей точкой
- %G : считывает число с плавающей точкой
- %o : считывает восьмеричное число
- %x : считывает шестнадцатеричное число
- %X : считывает шестнадцатеричное число
- %s : считывает строку
- %% : считывает символ процента
Символ звездочки * в спецификации преобразования позволяет пропустить при вводе водимые символы для типа, указанного через спецификатор.
Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.
Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:
- h : для ввода значений типа short int ( %hd )
- l : для ввода значений типа long int ( %ld ) или double ( %lf , %le )
- L : для ввода значений типа long double ( %Lf , %Le )
В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение. Для получения адреса переменной перед ее именем ставится знак амперсанда age .
Например, введем с консоли числовое значение:
#include int main(void)
Здесь вводится значение для переменной age, которая представляет тип int , поэтому в форматную строку в функции scanf передается спецификатор %d . Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет адрес переменной age — char name[10]; // вводим имя printf(«Enter your name: «); scanf(«%10s», name); printf(«Name: %s n»,name); return 0; >
Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались, в строку форматирования передается ширина поля, которая представляет 10 символов — %10s . Когда функция считает достаточное количетсво символов, она прекратит считывание.
Обратите внимание, что для ввода строки перед названием переменной не указывается символ адреса.
scanf(«%10s», name);
Потому что название массива уже само по себе представляет адрес на первый элемент массива.
Возможный консольный вывод:
Enter your name: Tom Name: Tom
Однако при использовании этой функции мы можем столкнуться с рядом проблем. Прежде всего попробуйте ввести в предыдущем примере составное имя, в которм подстроки разделены пробелами, например, «Tom Smith».
Enter your name: Tom Smith Name: Tom
Для решения этой проблемы можно использовать один хак:
#include int main(void)
Спецификатор %10[^n] указавает, что мы по прежнему считываем неболее 10 символов. Квадратные скобки [] представляют позволяют определить набор символов, которые будут извлекаться из ввода или, наоборот, игнорироваться. Так, выражение [^n] говорит, что надо считать ввод до тех пор пока не встретиться символ перевода строки ‘n’, то есть пока пользователь не нажмет на клавишу Enter.
Источник: metanit.com
Форматированный ввод данных
В то время как функция printf() осуществляет форматированный вывод данных, функция scanf() осуществляет их форматированный ввод. Это значит, что поступающие на ввод данные преобразуются соответственно указанному формату(ам) и записываются по адресу(ам) указанной(ых) переменной(ых):
scanf(строка_формата, адреса_переменных);
Причина, по которой в scanf() передаются адреса, а не значения переменных, очевидна. Функция scanf() должна изменять значения переменных тех функций, из которых вызывается. Единственный способ — это получить адреса областей памяти.
Спецификации формата данных, допустимые в строке формата, для scanf() почти идентичны тем, что были описаны для функции printf() . На этом уроке мы подробно не рассмотрим все возможности форматированного ввода с помощью scanf() , зато разберем ряд конкретных примеров.
Ввод чисел, символов и строк
Пример ввода-вывода целого и вещественного чисел, символа и строки:
int a; float b; char ch, str[30]; scanf(«%d%f%c%s», b, printf(«%d %.3f %c %sn», a, b, ch, str);
45 34.3456y hello 45 34.346 y hello
Здесь при выполнении программы все данные были введены в одну строку. Разделителем между числами и строками является пробел, а также любой другой символ пустого пространства (например, ‘n’). Однако при считывании символа, пробел учитывается как символ; чтобы этого не произошло, в примере букву записали сразу после числа. Данные можно было бы ввести, разделяя их переходом на новую строку (опять же при этом надо иметь ввиду, как считывается символ).
В строке формата функции scanf() между спецификациями вполне допустимо поставить пробелы: %d %f %c %s . Они никакой роли не сыграют. Понятно, что данные можно было получить и так:
scanf(«%d», scanf(«%f», scanf(«%c», scanf(«%s», str);
Обратите внимание, перед переменной str отсутствует знак амперсанда. Это не опечатка. В последующих уроках вы узнаете, что имя массива уже само по себе является ссылкой на массив (другими словами, str содержит адрес начала массива).
В функции scanf() в спецификации формата вещественных чисел не указывается точность представления числа. Запись типа %.3f или %.10lf приведет к невозможности получить вещественное число. Чтобы получить число типа double используют формат %lf, для long double — %Lf.
Для целых чисел: длинное целое — %ld, короткое целое — %hd. Кроме того, существуют спецификации для ввода восьмеричных и шестнадцатеричных чисел.
Функция scanf() возвращает количество удачно считанных данных; т.е. значение, возвращаемое функцией, можно проанализировать и таким образом узнать, корректно ли были введены данные. Например:
int a; double b; char ch, str[30]; ch = scanf(«%d %lf %s», b, str); if (ch == 3) printf(«%d %.3lf %sn», a, b, str); else printf(«Error inputn»);
Обычные символы в строке формата
В строке формата scanf() допустимо использование обычных символов. В этом случае при вводе данных также должны вводится и эти символы:
int a, b, c; scanf(«%d + %d = %d», b, printf(«Your answer is %dn», c); printf(«The correct is %dn», a+b);
В данном случае, когда программа выполняется, ввод должен выглядеть примерно так: 342+1024 = 1366. Знаки «+» и » c» style=»font-family:monospace;»> float arr [ 3 ] ; int i ; for ( i = 0 ; i < 3 ; i ++ ) scanf ( «%*s %f» , printf ( «Sum: %.2f n » , arr [ 0 ] + arr [ 1 ] + arr [ 2 ] ) ;
Здесь предполагается, что перед каждым числом будет вводится строка, которую следует проигнорировать, например:
First: 23.356 Second: 17.285 Third: 32.457 Sum: 73.098
Использование «шаблонов»
Для функции scanf() есть пара спецификаций формата, отдаленно напоминающих шаблоны командной оболочки и др. Формат […] позволяет получить строку, содержащую любые символы, указанные в квадратных скобках. Как только на ввод поступает символ, не входящий в указанный набор, считывание данных прекращается.
Формат [^…], наоборот, помещает в строку символы, не входящие в указанный набор, до тех пор пока не встретит любой из указанных.
В примере ниже как только поступает не цифра, считывание ввода завершается. При этом если первый символ — не цифра, то в str вообще ничего не записывается:
char str[30]=»»; scanf(«%[0-9]», str); printf(«%sn», str);
А в этом случае строке будет присвоена последовательность символов до любого из указанных знаков препинания:
scanf(«%[^;. ]», str); printf(«%sn», str);
Hello, World! Hello
Некоторые особенности и ограничения функции scanf()
Как только поступают некорректные данные, функция scanf() завершает свою работу. В примере:
scanf(«%d%f», b);
если переменной a попытаться присвоить символ или строку, что невозможно, то переменная bуже обрабатываться не будет. Можно предположить, что так будет надежнее:
scanf(«%d», scanf(«%f»,
Вроде бы неудачное считывание a не должно оказывать никакого влияния на b, т.к. это уже иной вызов scanf() . Но не все так просто: при некорректном вводе данные остаются в буфере и пытаются «навязать» себя последующим вызовам scanf() . Поэтому при использовании scanf() надо думать о том, как в случае некорректного ввода очистить буфер. Например, это можно сделать так, как показано ниже, или путем использования специальных функций (здесь не рассматриваются):
// если данные не удалось присвоить, if (scanf(«%d», %*s»); scanf(«%f»,
Разделителем данных для scanf() являются символы пустого пространства. Это означает отсутствие возможности записать строку, содержащую неизвестное количество пробелов, в одну переменную, используя только scanf() . Придется использовать либо другую функцию (например, getchar() ), либо создать циклическую конструкцию, считывающую по одному слову и добавляющую его к общей строке.
Таким образом, не смотря на достаточно большие возможности scanf() , эта функция хранит в себе ряд неудобств и опасностей.
- На прошлом занятии вы написали программу, содержащую функции, вычисляющие факториал числа и заданный элемент ряда Фибоначчи. Измените эту программу таким образом, чтобы она запрашивала у пользователя, что он хочет вычислить: факториал или число Фибоначчи. Затем программа запрашивала бы у пользователя либо число для вычисления факториала, либо номер элемента ряда Фибоначчи.
- Напишите программу, которая запрашивает у пользователя две даты в формате дд.мм.гггг. Дни, месяцы и года следует присвоить целочисленным переменным. Программа должна выводить на экран информацию о том, какая дата более ранняя, а какая более поздняя.
- Используя цикл, напишите код, в котором пользователю предлагается вводить данные до тех пор, пока он не сделает это корректно, т.е. пока все указанные в scanf() переменные не получат свои значения. Протестируйте программу.
Источник: younglinux.info