Напишите программу, определяющую, является ли целое число, введенное с клавиатуры, двузначным целым числом

Обновлено: 21.11.2024

Мы уже видели несколько примеров того, как Python может выполнять числовые вычисления. Python фактически использует два разных типа данных для хранения числовых значений. Тип данных int используется для хранения целых чисел, а тип данных float — для хранения нецелых чисел с плавающей запятой.

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

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

Python также включает пару специальных операторов для использования с данными типа int: оператор целочисленного деления // и оператор целочисленного остатка % . Оператор целочисленного деления возвращает частное, которое получается при делении одного целого числа на другое.

Операция целочисленного остатка возвращает остаток, оставшийся после деления одного целого числа на другое целое число.

Преобразование чисел в текст и текста в числа

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

Вы также можете получить текст с помощью команды input(), которая предлагает пользователю ввести текст.

Текст, который появляется в input(), представляет собой подсказку, сообщающую пользователю, какую информацию он должен ввести. Когда ваша программа дойдет до команды ввода, она отобразит приглашение и будет ждать, пока пользователь введет какой-либо ввод. Как только пользователь нажмет Enter, его текст будет сохранен в переменной, которой вы присвоили результат ввода.

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

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

Важной операцией, поддерживаемой строковым типом данных, является конкатенация, которая склеивает строки вместе, образуя более крупные строки.

Конкатенация работает только с двумя строковыми операндами. Если вы хотите использовать конкатенацию с другими типами данных, вам придется преобразовать эти данные в строку с помощью команды str().

Инструкция if-else

Основной конструкцией Python для принятия решений и действий в различных случаях является оператор if-else. Основная форма оператора if-else такова:

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

Самый распространенный способ формирования тестов для оператора if-else — использование операторов сравнения. Вот таблица доступных операторов сравнения.

операторзначение
==равно
!= не равно
больше, чем
= больше или равно

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

Вот два примера использования оператора if-else.

Обратите внимание, что размещение одного оператора if-else внутри другого вполне допустимо. Это называется вложенным if-else.

Составные тесты

Полезной альтернативой размещению одного оператора if-else внутри другого является возможность формирования составного теста. Составной тест — это тест, состоящий из двух или более обычных тестов, соединенных между собой логическими соединителями и или или .

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

Варианты форм

Python также позволяет использовать оператор if-else в различных формах.Первый вариант заключается в том, что вы можете построить оператор if только с ветвью if и без ветви else.

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

Такая задача категоризации встречается на практике так часто, что в Python есть специальный вариант if-else, в котором используется ветвь else-if, помеченная elif .

Пример программы — внесение изменений

Следующая программа демонстрирует использование целочисленной арифметики и операторов if-else. Программа предлагает пользователю ввести сумму в копейках для внесения сдачи. Затем программа использует алгоритм, чтобы вычислить, сколько четвертаков, десятицентовиков, пятицентовых монет и пенни нужно отсчитать, чтобы получить сдачу на эту сумму.

Программа использует следующую логику для вычисления количества каждой используемой монеты:

Вот пример того, как это работает. Предположим, мы ввели 87 центов.

  1. 87//25 равно 3, поэтому мы раздаем 3 четверти.
  2. После раздачи четвертаков у нас осталось 87 - 3*25 = 12 или 87%25 = 12 центов для раздачи.
  3. 12//10 равно 1, поэтому мы раздаем 1 цент.
  4. После раздачи десятицентовика у нас осталось 12 - 1*10 = 2 или 12%10 = 2 цента для раздачи.
  5. 2//5 равно 0, поэтому мы раздаем 0 никелевых монет.
  6. 2%5 – это 2, поэтому у нас еще есть 2 цента, которые можно раздать.
  7. Наконец, мы раздаем 2 цента как 2 пенни.

Чтобы обеспечить правильное форматирование вывода с правильным использованием форм множественного и единственного числа, мы используем набор операторов if-else, которые помогают решить, как печатать вывод. Вы видите, как логика обрабатывает случай с 0 монетами?

Загвоздка в том, что я не могу использовать atoi или любую другую подобную функцию (я почти уверен, что мы должны полагаться на математические операции).

но ничего из этого не сработало.

Какой тип ввода "целочисленный"? Один, состоящий только из цифр? Разрешен ли знак минуса впереди?

Вы указываете два условия и оператор if. Я предполагаю, что вы не включили оператор if в оператор if, поэтому я не знаю, что вы там сделали. (Вы только что заменили оператор if или это было более важно?) Вы также не даете никаких указаний на режим сбоя, кроме «ничего из этого не сработало». Не скомпилировал? Ошибка выполнения? Не сработало так, как вы ожидали (и если да, то чего вы ожидали?)?

Я знаю, что опаздываю на вечеринку, но я полагаю, что вы "не можете" (имеется в виду: вам не разрешено) использовать atoi(), потому что идея состоит в том, что вы выполняете проверку "вручную", проходя по символам и проверяя находятся ли они в диапазоне 0-9. Поэтому, вероятно, также не следует использовать scanf().

15 ответов 15

num всегда будет содержать целое число, потому что это int. Настоящая проблема с вашим кодом заключается в том, что вы не проверяете возвращаемое значение scanf. scanf возвращает количество успешно прочитанных элементов, поэтому в этом случае он должен возвращать 1 для допустимых значений. В противном случае было введено недопустимое целочисленное значение, и переменная num, вероятно, не изменилась (т. е. по-прежнему имеет произвольное значение, поскольку вы не инициализировали ее).

Что касается вашего комментария, вы хотите разрешить пользователю вводить целое число, за которым следует клавиша ввода. К сожалению, это не может быть достигнуто с помощью scanf("%d\n") , но вот как это сделать:

@sombe: когда scanf считывает число и обнаруживает нецифровой символ, он просто останавливается на этом и оставляет его потоку (и в этом случае просто «возвращает» 2)

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

@sombe Вам нужно это сделать, но после проверки правильности вам нужно будет добавить sscanf(s, "%d", num); что сделает из него целое число.

@sombe, не могли бы вы рассказать нам о реальных требованиях? Я предполагаю, что вы также должны обрабатывать преобразование строки-> десятичной дроби (именно так я бы написал задание)

При использовании scanf со спецификатором преобразования %d для этого возникает несколько проблем:

Если входная строка начинается с допустимого целого числа (например, "12abc"), то "12" будет считано из входного потока, преобразовано и присвоено num , а scanf вернет 1, поэтому вы укажете успех, когда вы (вероятно) не должны;

Если входная строка не начинается с цифры, то scanf не будет считывать какие-либо символы из входного потока, число не изменится, а возвращаемое значение значение будет 0;

Вы не указываете, нужно ли обрабатывать недесятичные форматы, но это не сработает, если вам нужно обрабатывать целые значения в восьмеричном или шестнадцатеричном формате (0x1a). Спецификатор преобразования %i работает с десятичными, восьмеричными и шестнадцатеричными форматами, но первые две проблемы остаются.

Во-первых, вам нужно прочитать ввод в виде строки (желательно с помощью fgets ).Если вам не разрешено использовать atoi , вероятно, вам также не разрешено использовать strtol. Поэтому вам нужно будет проверить каждый символ в строке. Безопасный способ проверки цифровых значений — использование библиотечной функции isdigit (есть также функции isodigit и isxdigit для проверки восьмеричных и шестнадцатеричных цифр соответственно), например

(если вам даже не разрешено использовать isdigit , isodigit или isxdigit , дайте пощечину своему учителю/профессору за то, что он усложнил задание, чем оно действительно должно быть).

Если вам нужно иметь возможность работать с восьмеричными или шестнадцатеричными форматами, это становится немного сложнее. Соглашение C заключается в том, что восьмеричные форматы имеют начальный 0, а шестнадцатеричные форматы имеют начальный 0x. Таким образом, если первым непробельным символом является 0, вам нужно проверить следующий символ, прежде чем вы сможете узнать, какой недесятичный формат использовать.

Если значение n больше 1, заменить целое число половиной его значения (n/2), если целое число четное. В противном случае замените целое число числом, умноженным на три, плюс 1 (3*n + 1).

2 комментария

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Как я понял из вопроса, вы хотите ввести целое число, скажем, 10, и хотите создать последовательность. Последовательность должна учитывать от 1 до 10 чисел для указанной выше арифметики. Тогда в этом случае для данного целого числа, скажем, 10, последовательность содержит 10 элементов? это то, что вы хотите сделать?

Ответы (4)

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

1 комментарий

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

"это заняло около 1 минуты, так что не должно быть слишком сложно решить самостоятельно" , поэтому было бы лучше не выдавать все решение, не увидев хотя бы какую-то попытку со стороны OP.

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

5 комментариев

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я все еще сомневаюсь, что вы ищете что-то подобное. Если не указать, какой у вас ввод и ожидаемый результат, четко

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я не думаю, что вы правильно ответили на задачу (мне кажется, что это нужно для проверки понимания учащимся циклов while), но если бы вы делали это так, лучше использовать векторизованные операции:

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

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я не думаю, что это то, что требуется, поскольку вы заранее не знаете, сколько элементов будет включать решение

итак, семнадцать элементов, следовательно, требуется цикл while, чтобы проверить, больше ли результирующее целое число, чем единица

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я думаю, что то, как задан вопрос, несколько сбивает меня с толку. Глядя на пример, если ввод равен 10, то как он может иметь последовательность no.. Согласно вашему коду, это должно быть одно значение 5. Но было указано, что последовательность ожидается.

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я думал, что это было довольно ясно. Первый элемент последовательности — это введенное число, следующий элемент — либо:

  • половина предыдущего элемента, если он четный
  • 1 плюс 3-кратный предыдущий элемент, если он нечетный и больше единицы
  • конец последовательности, если он равен 1.

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Основная задача этого вопроса — создать специальную квадратную матрицу. Размер этой матрицы задается пользователем.

  • Просит пользователя ввести размер (n) специальной квадратной матрицы.
  • Создает специальную матрицу размера (n), аналогичную следующей, используя цикл for.
1 комментарий

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

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

1 комментарий

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

См. также

Категории

Охота за сокровищами сообщества

Найдите сокровища в MATLAB Central и узнайте, как сообщество может вам помочь!

Произошла ошибка

Не удалось выполнить действие из-за изменений, внесенных на страницу. Перезагрузите страницу, чтобы увидеть ее обновленное состояние.

Выберите веб-сайт

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

Вы также можете выбрать веб-сайт из следующего списка:

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

Выберите китайский сайт (на китайском или английском языке) для лучшей производительности сайта. Сайты других стран MathWorks не оптимизированы для посещений из вашего местоположения.

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

Простейшее приложение scanf выглядит так:

Программа считывает целочисленное значение, которое пользователь вводит с клавиатуры (%d предназначен для целых чисел, как и printf, поэтому b должно быть объявлено как int) и помещает это значение в b.

Функция scanf использует те же заполнители, что и printf:

Вы должны поставить & перед переменной, используемой в scanf. Причина станет ясна, когда вы узнаете об указателях. Знак & легко забыть, и если вы его забудете, ваша программа почти всегда будет аварийно завершать работу при ее запуске.

В общем, лучше всего использовать scanf, как показано здесь, — для чтения одного значения с клавиатуры. Используйте несколько вызовов scanf для чтения нескольких значений. В любой реальной программе вы будете использовать функции gets или fgets вместо того, чтобы читать текст построчно. Затем вы «разберете» строку, чтобы прочитать ее значения. Причина, по которой вы это делаете, заключается в том, что вы можете обнаруживать ошибки во входных данных и обрабатывать их по своему усмотрению.

Для полного понимания функций printf и scanf потребуется немного практики, но после освоения они становятся чрезвычайно полезными.

Попробуйте!

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

Вы также можете удалить переменную b в первой строке приведенной выше программы и посмотреть, что делает компилятор, когда вы забываете объявить переменную. Удалите точку с запятой и посмотрите, что произойдет. Опустите одну из фигурных скобок. Удалите одну из скобок рядом с основной функцией. Сделайте каждую ошибку отдельно, а затем запустите программу через компилятор, чтобы посмотреть, что произойдет. Имитируя такие ошибки, вы можете узнать о различных ошибках компилятора, и это облегчит поиск ваших опечаток, когда вы сделаете их на самом деле.

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

Читайте также: