Какая из указанных строк считывает целое число в переменную n
Перейти к содержимому

Какая из указанных строк считывает целое число в переменную n

  • автор:

Форматированный ввод данных в Си — функция scanf

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

scanf(строка_формата, адреса_переменных);

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

Спецификации, допустимые в строке формата, для scanf() почти идентичны тем, что были описаны для функции printf() .

Ввод чисел, символов и строк

Пример ввода-вывода целого и вещественного чисел, символа и строки:

int a; float b; char ch, str[30]; scanf("%d%f%c%s", &a, &b, &ch, str); printf("%d %.3f %c %s\n", a, b, ch, str);
45 34.3456y hello 45 34.346 y hello

Здесь при выполнении программы все данные были введены в одну строку. Разделителем между числами и строками является пробел, а также любой другой символ пустого пространства (например, ‘\n’). Однако при считывании символа, пробел учитывается как символ; чтобы этого не произошло, в примере букву записали сразу после числа. Данные можно было бы ввести, разделяя их переходом на новую строку (опять же при этом надо иметь ввиду, как считывается символ).

В строке формата функции scanf() между спецификациями вполне допустимо поставить пробелы: %d %f %c %s . Они никакой роли не сыграют. Понятно, что данные можно было получить и так:

scanf("%d", &a); scanf("%f", &b); scanf("%c", &ch); 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", &a, &b, str); if (ch == 3) printf("%d %.3lf %s\n", a, b, str); else printf("Error input\n");

Обычные символы в строке формата

В строке формата scanf() допустимо использование обычных символов. В этом случае при вводе данных также должны вводиться и эти символы:

int a, b, c; scanf("%d + %d = %d", &a, &b, &c); printf("Your answer is %d\n", c); printf("The correct is %d\n", a+b);

В данном случае, когда программа выполняется, ввод должен выглядеть примерно так: 342+1024 = 1366. Знаки «+» и » lang»>% , но перед буквой формата звездочку * . В таком случае данные считываются, но никакой переменной не присваиваются. Это можно использовать, например, когда нет определенной уверенности в том, что поступит на ввод, с одной стороны, и нужды сохранять эти данные, с другой:

float arr[3]; int i; for(i = 0; i  3; i++) scanf("%*s %f", &arr[i]); 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("%s\n", str);

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

scanf("%[^;. ]", str); printf("%s\n", str);
one two three four five! one two three four five

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

scanf("%[^'\n']", str);

Здесь в строку считываются все символы, кроме перехода на новую строку. Как только встречается этот символ ‒ ‘\n’ , запись данных в переменную прекращается.

Некоторые особенности и ограничения функции scanf

Как только поступают некорректные данные, функция scanf() завершает свою работу. В примере:

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

если переменной a попытаться присвоить символ или строку, что невозможно, то в переменную b потом уже не получится записать число. Можно предположить, что так будет надежнее:

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

Вроде бы неудачное считывание a не должно оказывать никакого влияния на b , т.к. это уже иной вызов scanf() . Но не все так просто: при некорректном вводе данные остаются в буфере и пытаются «навязать» себя последующим вызовам scanf() . Поэтому при использовании scanf() надо думать о том, как в случае некорректного ввода очистить буфер. Например, это можно сделать так, как показано ниже, или путем использования специальных функций (здесь не рассматриваются):

// если данные не удалось присвоить, if (scanf("%d", &a) != 1) // то выбросить их в виде строки scanf("%*s"); scanf("%f", &b);
  1. На прошлом занятии вы написали программу, содержащую функции, вычисляющие факториал числа и заданный элемент ряда Фибоначчи. Измените эту программу таким образом, чтобы она запрашивала у пользователя, что он хочет вычислить: факториал или число Фибоначчи. Затем программа запрашивала бы у пользователя либо число для вычисления факториала, либо номер элемента ряда Фибоначчи.
  2. Напишите программу, которая запрашивает у пользователя две даты в формате дд.мм.гггг. Дни, месяцы и года следует присвоить целочисленным переменным. Программа должна выводить на экран информацию о том, какая дата более ранняя, а какая более поздняя.
  3. Используя цикл, напишите код, в котором пользователю предлагается вводить данные до тех пор, пока он не сделает это корректно, т.е. пока все указанные в scanf() переменные не получат свои значения. Протестируйте программу.

Курс с решением задач:
pdf-версия

Теоретический материал (Паскаль)

В большинстве применений компьютера алфавитно-цифровая информация используется наряду с числовой. Прежде чем мы сможем написать программу, которая манипулирует алфавитно-цифровыми знаками (литерами), нам потребуется тип данных для их представления. Для этих целей в языке Паскаль предусмотрен тип данных char. Так же, как переменная типа integer может хранить одно целое число, переменная типа char может хранить один символ. Например,

Var
Alpha : char;
Begin
Alpha :=’p’;
Alpha :=’+’;
Alpha :=’3′;
Alpha :=’ ‘;
Alpha :=»»;

Первый оператор присваивания записывает в переменную Alpha литеру р. Второй делает Alpha равной литере плюса (+). Третий делает Alpha равной символу 3. Заметим, что символ 3 отличается от целого числа 3 тем, что символ не может быть использован в арифметических операциях. Четвертый оператор присваивания делает Alpha равной литере пробела. Хотя литера пробела при печати не изображается, она является обыкновенным значением типа char. Последний оператор присваивания делает Alpha равной литере апострофа, это специальный случай, так как знак апострофа используется для ограничения значения типа char. Мы будем пользоваться множеством литер, находящимся в таблице кодов, называемой ASCII — американский стандартный код обмена информацией. Все символы упорядочены, т.к. имеют свой личный номер. Важно, что соблюдаются следующие отношения: ‘A’ < 'B' < 'C' < . < 'X' < 'Y' < 'Z' '0' < '1' < '2' < . < '7' < '8' < '9'Для проверки равенства или неравенства переменных типа char могут использоваться операторы сравнения. Задача. Написать программу, которая считывает две литеры и печатает больше, равна или меньше первая литера второй.

Program Sravnenie;
Var
First, Second : char;
Begin
write (‘Введите две литеры: ‘);
readln (First, Second);
write (‘Первая литера ‘);
if First > Second
then
write (‘больше второй. ‘)
else
if First = Second
then
write (‘равна второй. ‘)
else
write (‘меньше второй. ‘);
Еnd.

Так как char — порядковый тип, то к его значениям применимы следующие функции.

Succ — возвращает следующий символ литерного множества; Pred — возвращает предыдущий символ литерного множества; Ord — возвращает значение кода литеры; Chr — возвращает значение литеры по ее коду, является обратной по отношению к функции Ord.

Например, Succ(‘0′)=’1’ — символ, следующий за символом 0, равен символу 1. Pred(‘3′)=’2′ — символ, предшествующий символу 3, равен 2; Chr(65)=’A’ — символ, соответствующий коду 65, равен А; Ord(‘A’)=65 — код символа А равен 65.

Строка. Тип данных string. Строковые переменные, их описание. Длина строки. Операции над строками

Строка (string) — это последовательность литер. Литерные строки уже использовались нами в качестве аргументов операторa write при изучении темы «Ввод-вывод». Теперь познакомимся с ними подробнее. Тип данных (string) определяет строки с максимальной длиной 255 символов. Переменная этого типа может принимать значения переменной длины. Например,

MaxLine : string;
City : string[30]

Строковая переменная может иметь атрибут длины, определяющий ее максимальную длину. Текущая длина строковой переменной может быть определена с помощью встроенной функции Length. Для заданного значения типа string эта функция возвращает целое значение, показывающее количество литер в строке. Выражения, в которых операндами служат строки, называются строковыми выражениями. Над строками определены следующие операции: 1. Операция конкатенации (+) применяется для сцепления нескольких строк в одну. Например,
SumStr := ‘Турбо ‘+’Паскаль ‘+’7.0’ 2. Операции отношения (=, <>, >, =, <=) проводят посимвольное сравнение двух строк слева направо до первого несовпадающего символа. Большей считается та строка, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией. Результат выполнения операций отношения над строками всегда имеет булевский тип. Например, выражение 'MS-DOS'<'MS-Dos' имеет значение True Если строки имеют различную длину, но в их общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки считаются равными, если они совпадают по длине и содержат одни и те же символы на соответствующих местах в строке. Для присваивания строковой переменной результата строкового выражения используется оператор присваивания. Если значение переменной после выполнения оператора присваивания превышает по длине максимально допустимую при описании величину, то все лишние символы справа отбрасываются. Допускается смешение в одном выражении операндов строкового и символьного типа. К отдельным символам строки можно обратиться по номеру (индексу) данного символа в строке. Например, чтобы обратиться к третьему символу строки SumStr надо записать SumStr[3]. Запись SumStr[0] дает значение текущей длины строки. Для эффективного программирования алгоритмов обработки текстов необходимо хорошо понимать внутреннюю структуру представления строк в памяти. Строки реализованы достаточно просто. Для хранения строковых переменных выделяется количество байтов памяти, на единицу большее максимальной длины строки. Начальный байт этой памяти отводится для хранения текущей длины строки, следующие байты - для символов самой строки. Так как элементы строк стандартно нумеруются целыми числами, начиная с единицы, байт с длиной строки можно считать нулевым ее элементом. Такая структура памяти допускает прямой доступ к ее элементам. Важно отметить, что имеется возможность динамически управлять текущей длиной строки. Следующая программа показывает автоматическое изменение длины строки после тех или иных операций с нею. Обратите внимание, что общий (определяемый с помощью стандартной функции SizeOf) размер памяти, отведенной для хранения строки все время остается неизменным.

Program StringLength;
Var
S : string;
Begin
S:=»;
writeln (S,’ ‘,SizeOf(S),’ ‘,Length(S));
S:=’Пример длинной строки’;
writeln (S,’ ‘,SizeOf(S),’ ‘,Length(S));
Delete(S,7,8);
writeln (S,’ ‘,SizeOf(S),’ ‘,Length(S));
S:=S+’ символов’;
writeln (S,’ ‘,SizeOf(S),’ ‘,Length(S));
End.

Внимание! При решении задач со строковыми переменными Вы можете столкнуться с распространенной трудно обнаруживаемой ошибкой, когда после присваивания некоторым элементам строки символов ни содержимое, ни длина строки не изменяются. Разберемся, с чем это связано. Очень важно понимать, что при доступе к некоторому элементу строки значение ее текущей длины не проверяется. Это иллюстрирует следующая программа:

Program StringElements;
Var
S : string;
Begin
S:=’ABCD’;
writeln (S,’ ‘,Length(S));
S[5] := ‘E’;
writeln (S,’ ‘,Length(S));
End.

Присваивание пятому элементу строки некоторого значения не изменяет длину строки, что подтверждает вывод на экран ее содержимого и длины (конечно само присваивание реально произошло, но на значение текущей длины строки в нулевом байте это никакого влияния не оказало). Работа с элементами строки без учета ее текущей длины и является ошибкой программиста. Посмотрите следующую программу:

Program StringElements2;
Var
Str : string[26];
i : integer;
Begin
Str:=’A’;
for i := 1 to 26 do
Str[i] := Chr (Ord(‘A’)+i-1);
writeln(Str);
End.

Предполагается, что данная программа должна сформировать строку из 26 символов, содержимым которой является последовательность заглавных букв латинского алфавита. Однако вызов процедуры writeln показывает, что содержимым переменной Str будет строка из одного символа ‘А’. Природа совершенной ошибки заключается в том, что присваивание значений элементам строки не влияет на текущую длину, которая была установлена равной 1 при первом присваивании. Поэтому правильной будет следующая программа:

Program stringElements3;
Var
Str : string[26];
i : char;
Begin
Str:=»;
for i := ‘A’ to ‘Z’ do
Str := Str + i;
writeln(Str);
End.
  1. Delete (Str, Poz, N) — удаление N символов строки Str, начиная с позиции Poz.

Решение всего 3 модуля «Поколение Python: курс для начинающих»

В этой статье будет решение для 3.1 и 3.2 (экзаменов). Эти уроки – самые первые и самые легкие экзамены на всем курсе. Первая часть (3.1) вся состоит из вопросов, в то же время, как вторая задача, на 100% состоит из задач на программирование.

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

Ответ: print()

2. Выберите верные строки кода.

Верные решения:

  1. print(«3.1415»)
  2. print(«I’m a math teacher and a programmer!»)
  3. print(‘Поэма «Мёртвые души» одна из самых интересных’)
  4. print()

3. Необходимо выбрать корректную строчку кода

Ответ: print(‘Python’, ‘is the best’, ‘!!’)

4. Что выведет следующий код print(‘1’, ‘2’, ‘3’, ‘4’, sep=’*’) ?

Решение: 1*2*3*4

5. Выберите верные строчки кода.

Верные:

  1. print(«The world’s a little blurry», «Or maybe it’s my eyes», end=’. ‘, sep=’ 🙂 ‘)
  2. print(«Told you not to worry», «But maybe that’s a lie», sep=’ 🙂 ‘)
  3. print(«Honey, what’s your hurry», end=’?’)

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

Правильный вариант ответа: input()

7. Какая из указанных строк считывает целое число в переменную n ?

Решение: n = int(input())

8. Выберите верные утверждения.

Ответ:

  • Имя переменной не может начинаться с цифры
  • Имя переменной не может совпадать с ключевым (зарезервированным) словом
  • Имя переменной может начинаться с символа подчёркивания (_)

9. Какое число выведет следующий код?

s = 13 k = -5 d = s + 2 s = d k = 2 * s print(s + k + d)
Результат: 60

10. Какое число выведет следующий код?

a = 17 // (23 % 7) b = 34 % a * 5 - 29 % 4 * 3 print(a * b)

Звездный прямоугольник

Напишите программу, которая выводит прямоугольник, по периметру состоящий из звездочек (*).

Примечание. Высота и ширина прямоугольника равны 44 и 1717 звёздочкам соответственно.

print('*****************') print('* *') print('* *') print('*****************')

Сумма квадратов VS квадрат суммы

Напишите программу, которая считывает два целых числа aa и bb и выводит на экран квадрат суммы (a+b)^2(a+b)2 и сумму квадратов a^2+b^2a2+b2 этих чисел.

Формат входных данных
На вход программе подаётся два целых числа, каждое на отдельной строке.

Формат выходных данных
Программа должна вывести текст в соответствии с условием.

a = int(input()) b = int(input()) print(f'Квадрат суммы и равен <(a + b) ** 2>') print(f'Сумма квадратов и равна ')

Большое число

Как известно, целые числа в языке Python не имеют ограничений, которые встречаются в других языках программирования. Напишите программу, которая считывает четыре целых положительных числа a, \, b, \, ca,b,c и dd и выводит на экран значение выражения a^b + c^dab+cd.

Формат входных данных
На вход программе подаётся четыре целых положительных числа a, \, b, \, ca,b,c и dd , каждое на отдельной строке в указанном порядке.

Формат выходных данных
Программа должна вывести значение a^b + c^dab+cd.

a = int(input()) b = int(input()) c = int(input()) d = int(input()) print(a ** b + c ** d)

Размножение n-ок

Напишите программу, которая считывает целое положительное число n, \, n \in [1; \, 9]n,n∈[1;9] и выводит значение числа n+\overline+\overlinen+nn+nnn.

Формат входных данных
На вход программе подаётся одно целое положительное число n, \, n \in [1; \, 9]n,n∈[1;9].

Формат выходных данных
Программа должна вывести число n+\overline+\overlinen+nn+nnn.

Примечание. Для первого теста 1 + 11 + 111 = 1231+11+111=123.

n = int(input()) nn = n * 10 + n nnn = n * 100 + n * 10 + n print(n + nn + nnn) 

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

Какая из указанных строк считывает целое число в переменную n

Для целых чисел определены операции + , — , * и ** . Операция деления / для целых чисел возвращает вещественное число (значение типа float ). Также функция возведения в степень возвращает значение типа float , если показатель степени — отрицательное число.

Но есть и специальная операция целочисленного деления, выполняющегося с отбрасыванием дробной части, которая обозначается // (она соответствует операции div в Паскале). Она возвращает целое число: целую часть частного. Другая близкая ей операция − это операция взятия остатка от деления, обозначаемая % (она соответствует операции mod в Паскале). Например:

print(17 / 3) # выведет 5.66666666667 print(17 // 3) # выведет 5 print(17 % 3) # выведет 2

2. Действительные числа

В этом разделе речь пойдет о действительных числах, имеющих тип float .

Обратите внимание, что если вы хотите считать с клавиатуры действительное число, то результат, возращаемый функцией input() необходимо преобразовывать к типу float :

1.492
x = float(input()) print(x)

Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как принято при записи десятичных дробей в русских текстах). Для записи очень больших или очень маленьких по модулю чисел используется так называемая запись «с плавающей точкой» (также называемая «научная» запись). В этом случае число представляется в виде некоторой десятичной дроби, называемой мантиссой, умноженной на целочисленную степень десяти (порядок). Например, расстояние от Земли до Солнца равно 1.496·10 11 , а масса молекулы воды 2.99·10 -23 .

Числа с плавающей точкой в программах на языке Питон, а также при вводе и выводе записываются так: сначала пишется мантисса, затем пишется буква e , затем пишется порядок. Пробелы внутри этой записи не ставятся. Например, указанные выше константы можно записать в виде 1.496e11 и 2.99e-23 . Перед самим числом также может стоять знак минус.

Напомним, что результатом операции деления / всегда является действительное число ( float ), в то время как результатом операции // является целое число ( int ).

Преобразование действительных чисел к целому производится с округлением в сторону нуля, то есть int(1.7) == 1 , int(-1.7) == -1 .

3. Библиотека math

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

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

import math

Например, пусть мы хотим округлять вещественные числа до ближайшего целого числа вверх. Соответствующая функция ceil от одного аргумента вызывается, например, так: math.ceil(x) (то есть явно указывается, что из модуля math используется функция ceil ). Вместо числа x может быть любое число, переменная или выражение. Функция возращает значение, которое можно вывести на экран, присвоить другой переменной или использовать в выражении:

import math x = math.ceil(4.2) y = math.ceil(4.8) print(x) print(y)

Другой способ использовать функции из библиотеки math , при котором не нужно будет при каждом использовании функции из модуля math указывать название этого модуля, выглядит так:

from math import ceil x = 7 / 2 y = ceil(x) print(y)
from math import * x = 7 / 2 y = ceil(x) print(y)

Ниже приведен список основных функций модуля math . Более подробное описание этих функций можно найти на сайте с документацией языка Питон.

Некоторые из перечисленных функций ( int , round , abs ) являются стандартными и не требуют подключения модуля math для использования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *