Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Русский_Проект: Изучение Visual Basic


Служба Рассылок Subscribe.Ru
Русский_Проект: Рассылка Разбор задачи

Разбор задачи

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

Замечание

Практически все прислали правильные ответы. Но какое разнообразие ответов! Правильные решения приведу чуть позже, а пока несколько замечаний. Некоторые прислали словесно-теоритическое решение задачи. Но у нас с вами не урок информатики, а изучение бейсика. Простейшая реализация задачи предполагает текстовое поле, гда вводится число, и кнопка, выводящая результат. Код данной кнопки и является требуемым решением. Естественно, для простоты, ограничение на ввод в поле только чисел и не больше двух не требуется учитывать.

Решение

Для решения используем операцию деления по модулю (MOD) и операцию деления нацело. Так как, операция x MOD y дает остаток от деления числа x на y, то разделив двухзначное число на 10 (x MOD 10), мы получаем вторую цифру числа. Соответственно, применяя деление нацело, мы получим первую цифру числа. Зная теперь две цифры, мы легко меняем их местами и получаем разность с помощью функции ABS. Вот так может выглядеть код
x=chislo MOD 10 ' вторая цифра цисла
y=chislo \ 10        ' первая цифра числа
chislo2=10*x + y     ' получим новое требуемое число
Print ABS(chislo-chislo2) ' выводим разность
chislo - это наше заданное число, которое можно получить преобразованием типов CInt(Text1.Text).
Одним из первых, кто прислал подобное решение был Артем (cls@tele...)

Игорь Егоров (zloigenii@...) для выделения первой цифры использовал функцию Round

dim a,b as Integer
a = Round(CInt(Text1.Text)/10)
b = CInt(Text1.Text) - a*10
If a<=b Then
 Text1.Text = CStr(9*(b-a))
Else
 Text1.Text = CStr(9*(a-b))
End If
Ход его мыслей понятен, но есть одна ошибочка. Функция Round не отбрасывает число, а округляет. Поэтому Round(15 / 10) даст число 2 вместо единицы. Для исправления ошибки достаточно применить вместо Round функцию Fix

Другие решения

Вышеприведенные решения корректны с точки зрения информатики. Но мы с вами изучаем великий и могучий Visual Basic. Я очень надеялся, что найдутся люди, которую смогут использовать всю мощь нашего бейсика на полную катушку. И мои ожидания оправдались! И в самом деле, VB имеет в своем распоряжении мощные строковые функции. И что мешает нам преобразовать число в строку и менять буквы-цифры по своему усмотрению. Изменим порядок букв на обратный и решим задачу
Dim a, b
a = StrReverse(Text1.Text)
b = CInt(Text1.Text) - a
Print Abs(b)
Приблизительно по этому пути пошли Витек (cryptoxxx@...) и А.Глебов (alex@st...), применившие функцию Mid, что позволит работать коду и в 5 версии

А некто DZ_Zero-Q прислал решение на C (даже не на C++)! Большое спасибо! Но мне будет трудно анализировать ваши решения, если они будут на Delphi, ASM и т.д. Давайте все же придерживаться общих правил. Кстати, он предложил одну задачку. Боюсь, она пока будет сложновата для нас. Поэтому мы сначала порешаем пока простенькие задачки. Можете присылать и свои задачи. Следующее задание будет предложено в следующей рассылке. Удачного всем программирования!

Не стесняйтесь, высылайте ваши предложения по адресу vbasic@rambler.ru
Посетите сайт Русский_Проект, где вы найдете другую интересную информацию
Давайте делать рассылку вместе! Удачи!



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное